1 // Copyright 2000-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
2 package org.jetbrains.jps.incremental.java;
4 import com.intellij.openapi.diagnostic.Logger;
5 import com.intellij.openapi.util.Ref;
6 import com.intellij.openapi.util.text.StringUtil;
7 import com.intellij.uiDesigner.UIFormXmlConstants;
8 import net.n3.nanoxml.*;
9 import org.jetbrains.annotations.Nullable;
12 import java.util.Properties;
15 * @author Eugene Zhuravlev
17 public final class FormsParsing {
18 private static final Logger LOG = Logger.getInstance(FormsParsing.class);
19 private static final String FORM_TAG = "form";
21 private FormsParsing() {
24 public static String readBoundClassName(File formFile) throws IOException {
25 try (BufferedInputStream in = new BufferedInputStream(new FileInputStream(formFile))) {
26 final Ref<String> result = new Ref<>(null);
27 parse(in, new IXMLBuilderAdapter() {
29 public void startElement(final String elemName, final String nsPrefix, final String nsURI, final String systemID, final int lineNr)
31 if (!FORM_TAG.equalsIgnoreCase(elemName)) {
37 public void addAttribute(final String key, final String nsPrefix, final String nsURI, final String value, final String type)
39 if (UIFormXmlConstants.ATTRIBUTE_BIND_TO_CLASS.equals(key)) {
46 public void elementAttributesProcessed(final String name, final String nsPrefix, final String nsURI) throws Exception {
54 public static void parse(final InputStream is, final IXMLBuilder builder) {
56 parse(new MyXMLReader(is), builder);
58 catch(IOException e) {
66 catch (IOException ignore) {
72 public static void parse(final IXMLReader r, final IXMLBuilder builder) {
74 final IXMLParser parser = XMLParserFactory.createDefaultXMLParser();
76 parser.setBuilder(builder);
77 parser.setValidator(new EmptyValidator());
78 parser.setResolver(new EmptyEntityResolver());
82 catch (XMLException e) {
83 if (e.getException() instanceof ParserStoppedException) {
89 catch (ClassNotFoundException | IllegalAccessException | InstantiationException e) {
94 private static class EmptyValidator extends NonValidator {
95 private IXMLEntityResolver myParameterEntityResolver;
98 public void setParameterEntityResolver(IXMLEntityResolver resolver) {
99 myParameterEntityResolver = resolver;
103 public IXMLEntityResolver getParameterEntityResolver() {
104 return myParameterEntityResolver;
108 public void parseDTD(String publicID, IXMLReader reader, IXMLEntityResolver entityResolver, boolean external) throws Exception {
110 //super.parseDTD(publicID, reader, entityResolver, external);
112 for (char ch = reader.read(); !(ch == ']' && --cnt == 0); ch = reader.read()) {
113 if (ch == '[') cnt ++;
117 int origLevel = reader.getStreamLevel();
120 char ch = reader.read();
122 if (reader.getStreamLevel() < origLevel) {
124 return; // end external DTD
131 public void elementStarted(String name, String systemId, int lineNr) {
135 public void elementEnded(String name, String systemId, int lineNr) {
139 public void attributeAdded(String key, String value, String systemId, int lineNr) {
143 public void elementAttributesProcessed(String name, Properties extraAttributes, String systemId, int lineNr) {
147 public void PCDataAdded(String systemId, int lineNr) {
151 private static class EmptyEntityResolver implements IXMLEntityResolver {
153 public void addInternalEntity(String name, String value) {
157 public void addExternalEntity(String name, String publicID, String systemID) {
161 public Reader getEntity(IXMLReader xmlReader, String name) throws XMLParseException {
162 return new StringReader("");
166 public boolean isExternalEntity(String name) {
171 private static class MyXMLReader extends StdXMLReader {
172 private String publicId;
173 private String systemId;
175 MyXMLReader(final Reader documentReader) {
176 super(documentReader);
179 MyXMLReader(InputStream stream) throws IOException {
184 public Reader openStream(String publicId, String systemId) throws IOException {
185 this.publicId = StringUtil.isEmpty(publicId) ? null : publicId;
186 this.systemId = StringUtil.isEmpty(systemId) ? null : systemId;
188 return new StringReader(" ");
192 public static class IXMLBuilderAdapter implements IXMLBuilder {
195 public void startBuilding(final String systemID, final int lineNr) throws Exception {
199 public void newProcessingInstruction(final String target, final Reader reader) throws Exception {
204 public void startElement(final String name, final String nsPrefix, final String nsURI, final String systemID, final int lineNr)
209 public void addAttribute(final String key, final String nsPrefix, final String nsURI, final String value, final String type)
214 public void elementAttributesProcessed(final String name, final String nsPrefix, final String nsURI) throws Exception {
218 public void endElement(final String name, final String nsPrefix, final String nsURI) throws Exception {
222 public void addPCData(final Reader reader, final String systemID, final int lineNr) throws Exception {
227 public Object getResult() throws Exception {
231 protected static void stop() {
232 throw new ParserStoppedException();
236 public static class ParserStoppedException extends RuntimeException {
238 public Throwable fillInStackTrace() {