Search in sources :

Example 1 with CompiledClassPropertiesProvider

use of com.intellij.uiDesigner.lw.CompiledClassPropertiesProvider in project intellij-community by JetBrains.

the class GuiEditor method readFromFile.

/**
   * Creates and sets new <code>RadRootContainer</code>
   *
   * @param keepSelection if true, the GUI designer tries to preserve the selection state after reload.
   */
public void readFromFile(final boolean keepSelection) {
    try {
        ComponentPtr[] selection = null;
        Map<String, String> tabbedPaneSelectedTabs = null;
        if (keepSelection) {
            selection = SelectionState.getSelection(this);
            tabbedPaneSelectedTabs = saveTabbedPaneSelectedTabs();
        }
        Locale oldLocale = null;
        if (myRootContainer != null) {
            oldLocale = myRootContainer.getStringDescriptorLocale();
        }
        final String text = myDocument.getText();
        final ClassLoader classLoader = LoaderFactory.getInstance(getProject()).getLoader(myFile);
        final LwRootContainer rootContainer = Utils.getRootContainer(text, new CompiledClassPropertiesProvider(classLoader));
        final RadRootContainer container = XmlReader.createRoot(this, rootContainer, classLoader, oldLocale);
        setRootContainer(container);
        if (keepSelection) {
            SelectionState.restoreSelection(this, selection);
            restoreTabbedPaneSelectedTabs(tabbedPaneSelectedTabs);
        }
        myInvalid = false;
        myCardLayout.show(myCardPanel, CARD_VALID);
        refresh();
    } catch (Exception exc) {
        Throwable original = exc;
        while (original instanceof InvocationTargetException) {
            original = original.getCause();
        }
        showInvalidCard(original);
    } catch (final LinkageError exc) {
        showInvalidCard(exc);
    }
}
Also used : Locale(java.util.Locale) CompiledClassPropertiesProvider(com.intellij.uiDesigner.lw.CompiledClassPropertiesProvider) RadRootContainer(com.intellij.uiDesigner.radComponents.RadRootContainer) LwRootContainer(com.intellij.uiDesigner.lw.LwRootContainer) InvocationTargetException(java.lang.reflect.InvocationTargetException) InvocationTargetException(java.lang.reflect.InvocationTargetException) ComponentPtr(com.intellij.uiDesigner.componentTree.ComponentPtr)

Example 2 with CompiledClassPropertiesProvider

use of com.intellij.uiDesigner.lw.CompiledClassPropertiesProvider in project intellij-community by JetBrains.

the class FormsInstrumenter method instrumentForms.

private Map<File, Collection<File>> instrumentForms(CompileContext context, ModuleChunk chunk, final Map<File, String> chunkSourcePath, final InstrumentationClassFinder finder, Collection<File> forms, OutputConsumer outConsumer) throws ProjectBuildException {
    final Map<File, Collection<File>> instrumented = new THashMap<>(FileUtil.FILE_HASHING_STRATEGY);
    final Map<String, File> class2form = new HashMap<>();
    final MyNestedFormLoader nestedFormsLoader = new MyNestedFormLoader(chunkSourcePath, ProjectPaths.getOutputPathsWithDependents(chunk), finder);
    for (File formFile : forms) {
        final LwRootContainer rootContainer;
        try {
            rootContainer = Utils.getRootContainer(formFile.toURI().toURL(), new CompiledClassPropertiesProvider(finder.getLoader()));
        } catch (AlienFormFileException e) {
            // ignore non-IDEA forms
            continue;
        } catch (UnexpectedFormElementException e) {
            context.processMessage(new CompilerMessage(getPresentableName(), BuildMessage.Kind.ERROR, e.getMessage(), formFile.getPath()));
            LOG.info(e);
            continue;
        } catch (UIDesignerException e) {
            context.processMessage(new CompilerMessage(getPresentableName(), BuildMessage.Kind.ERROR, e.getMessage(), formFile.getPath()));
            LOG.info(e);
            continue;
        } catch (Exception e) {
            throw new ProjectBuildException("Cannot process form file " + formFile.getAbsolutePath(), e);
        }
        final String classToBind = rootContainer.getClassToBind();
        if (classToBind == null) {
            continue;
        }
        final CompiledClass compiled = findClassFile(outConsumer, classToBind);
        if (compiled == null) {
            context.processMessage(new CompilerMessage(getPresentableName(), BuildMessage.Kind.WARNING, "Class to bind does not exist: " + classToBind, formFile.getAbsolutePath()));
            continue;
        }
        final File alreadyProcessedForm = class2form.get(classToBind);
        if (alreadyProcessedForm != null) {
            context.processMessage(new CompilerMessage(getPresentableName(), BuildMessage.Kind.WARNING, formFile.getAbsolutePath() + ": The form is bound to the class " + classToBind + ".\nAnother form " + alreadyProcessedForm.getAbsolutePath() + " is also bound to this class", formFile.getAbsolutePath()));
            continue;
        }
        class2form.put(classToBind, formFile);
        for (File file : compiled.getSourceFiles()) {
            addBinding(file, formFile, instrumented);
        }
        try {
            context.processMessage(new ProgressMessage("Instrumenting forms... [" + chunk.getPresentableShortName() + "]"));
            final BinaryContent originalContent = compiled.getContent();
            final ClassReader classReader = new FailSafeClassReader(originalContent.getBuffer(), originalContent.getOffset(), originalContent.getLength());
            final int version = ClassProcessingBuilder.getClassFileVersion(classReader);
            final InstrumenterClassWriter classWriter = new InstrumenterClassWriter(classReader, ClassProcessingBuilder.getAsmClassWriterFlags(version), finder);
            final AsmCodeGenerator codeGenerator = new AsmCodeGenerator(rootContainer, finder, nestedFormsLoader, false, classWriter);
            final byte[] patchedBytes = codeGenerator.patchClass(classReader);
            if (patchedBytes != null) {
                compiled.setContent(new BinaryContent(patchedBytes));
            }
            final FormErrorInfo[] warnings = codeGenerator.getWarnings();
            for (final FormErrorInfo warning : warnings) {
                context.processMessage(new CompilerMessage(getPresentableName(), BuildMessage.Kind.WARNING, warning.getErrorMessage(), formFile.getAbsolutePath()));
            }
            final FormErrorInfo[] errors = codeGenerator.getErrors();
            if (errors.length > 0) {
                StringBuilder message = new StringBuilder();
                for (final FormErrorInfo error : errors) {
                    if (message.length() > 0) {
                        message.append("\n");
                    }
                    message.append(formFile.getAbsolutePath()).append(": ").append(error.getErrorMessage());
                }
                context.processMessage(new CompilerMessage(getPresentableName(), BuildMessage.Kind.ERROR, message.toString()));
            }
        } catch (Exception e) {
            context.processMessage(new CompilerMessage(getPresentableName(), BuildMessage.Kind.ERROR, "Forms instrumentation failed" + e.getMessage(), formFile.getAbsolutePath()));
        }
    }
    return instrumented;
}
Also used : ProgressMessage(org.jetbrains.jps.incremental.messages.ProgressMessage) CompilerMessage(org.jetbrains.jps.incremental.messages.CompilerMessage) THashMap(gnu.trove.THashMap) LwRootContainer(com.intellij.uiDesigner.lw.LwRootContainer) THashMap(gnu.trove.THashMap) InstrumenterClassWriter(com.intellij.compiler.instrumentation.InstrumenterClassWriter) CompiledClassPropertiesProvider(com.intellij.uiDesigner.lw.CompiledClassPropertiesProvider) FailSafeClassReader(com.intellij.compiler.instrumentation.FailSafeClassReader) ClassReader(org.jetbrains.org.objectweb.asm.ClassReader) FailSafeClassReader(com.intellij.compiler.instrumentation.FailSafeClassReader)

Example 3 with CompiledClassPropertiesProvider

use of com.intellij.uiDesigner.lw.CompiledClassPropertiesProvider in project intellij-community by JetBrains.

the class Javac2 method instrumentForms.

/**
   * Instrument forms
   *
   * @param finder a classloader to use
   */
private void instrumentForms(final InstrumentationClassFinder finder) {
    // we instrument every file, because we cannot find which files should not be instrumented without dependency storage
    final ArrayList formsToInstrument = myFormFiles;
    if (formsToInstrument.size() == 0) {
        log("No forms to instrument found", Project.MSG_VERBOSE);
        return;
    }
    final HashMap class2form = new HashMap();
    for (int i = 0; i < formsToInstrument.size(); i++) {
        final File formFile = (File) formsToInstrument.get(i);
        log("compiling form " + formFile.getAbsolutePath(), Project.MSG_VERBOSE);
        final LwRootContainer rootContainer;
        try {
            rootContainer = Utils.getRootContainer(formFile.toURI().toURL(), new CompiledClassPropertiesProvider(finder.getLoader()));
        } catch (AlienFormFileException e) {
            // ignore non-IDEA forms
            continue;
        } catch (Exception e) {
            fireError("Cannot process form file " + formFile.getAbsolutePath() + ". Reason: " + e);
            continue;
        }
        final String classToBind = rootContainer.getClassToBind();
        if (classToBind == null) {
            continue;
        }
        String name = classToBind.replace('.', '/');
        File classFile = getClassFile(name);
        if (classFile == null) {
            log(formFile.getAbsolutePath() + ": Class to bind does not exist: " + classToBind, Project.MSG_WARN);
            continue;
        }
        final File alreadyProcessedForm = (File) class2form.get(classToBind);
        if (alreadyProcessedForm != null) {
            fireError(formFile.getAbsolutePath() + ": " + "The form is bound to the class " + classToBind + ".\n" + "Another form " + alreadyProcessedForm.getAbsolutePath() + " is also bound to this class.");
            continue;
        }
        class2form.put(classToBind, formFile);
        try {
            int version;
            InputStream stream = new FileInputStream(classFile);
            try {
                version = getClassFileVersion(new ClassReader(stream));
            } finally {
                stream.close();
            }
            AntNestedFormLoader formLoader = new AntNestedFormLoader(finder.getLoader(), myNestedFormPathList);
            InstrumenterClassWriter classWriter = new InstrumenterClassWriter(getAsmClassWriterFlags(version), finder);
            final AsmCodeGenerator codeGenerator = new AsmCodeGenerator(rootContainer, finder, formLoader, false, classWriter);
            codeGenerator.patchFile(classFile);
            final FormErrorInfo[] warnings = codeGenerator.getWarnings();
            for (int j = 0; j < warnings.length; j++) {
                log(formFile.getAbsolutePath() + ": " + warnings[j].getErrorMessage(), Project.MSG_WARN);
            }
            final FormErrorInfo[] errors = codeGenerator.getErrors();
            if (errors.length > 0) {
                StringBuffer message = new StringBuffer();
                for (int j = 0; j < errors.length; j++) {
                    if (message.length() > 0) {
                        message.append("\n");
                    }
                    message.append(formFile.getAbsolutePath()).append(": ").append(errors[j].getErrorMessage());
                }
                fireError(message.toString());
            }
        } catch (Exception e) {
            fireError("Forms instrumentation failed for " + formFile.getAbsolutePath() + ": " + e.toString());
        }
    }
}
Also used : CompiledClassPropertiesProvider(com.intellij.uiDesigner.lw.CompiledClassPropertiesProvider) LwRootContainer(com.intellij.uiDesigner.lw.LwRootContainer) MalformedURLException(java.net.MalformedURLException) BuildException(org.apache.tools.ant.BuildException) FailSafeClassReader(com.intellij.compiler.instrumentation.FailSafeClassReader) InstrumenterClassWriter(com.intellij.compiler.instrumentation.InstrumenterClassWriter)

Example 4 with CompiledClassPropertiesProvider

use of com.intellij.uiDesigner.lw.CompiledClassPropertiesProvider in project intellij-community by JetBrains.

the class AsmCodeGeneratorTest method loadFormData.

private LwRootContainer loadFormData(final String formPath) throws Exception {
    String formData = FileUtil.loadFile(new File(formPath));
    final CompiledClassPropertiesProvider provider = new CompiledClassPropertiesProvider(getClass().getClassLoader());
    return Utils.getRootContainer(formData, provider);
}
Also used : CompiledClassPropertiesProvider(com.intellij.uiDesigner.lw.CompiledClassPropertiesProvider)

Aggregations

CompiledClassPropertiesProvider (com.intellij.uiDesigner.lw.CompiledClassPropertiesProvider)4 LwRootContainer (com.intellij.uiDesigner.lw.LwRootContainer)3 FailSafeClassReader (com.intellij.compiler.instrumentation.FailSafeClassReader)2 InstrumenterClassWriter (com.intellij.compiler.instrumentation.InstrumenterClassWriter)2 ComponentPtr (com.intellij.uiDesigner.componentTree.ComponentPtr)1 RadRootContainer (com.intellij.uiDesigner.radComponents.RadRootContainer)1 THashMap (gnu.trove.THashMap)1 InvocationTargetException (java.lang.reflect.InvocationTargetException)1 MalformedURLException (java.net.MalformedURLException)1 Locale (java.util.Locale)1 BuildException (org.apache.tools.ant.BuildException)1 CompilerMessage (org.jetbrains.jps.incremental.messages.CompilerMessage)1 ProgressMessage (org.jetbrains.jps.incremental.messages.ProgressMessage)1 ClassReader (org.jetbrains.org.objectweb.asm.ClassReader)1