# HG changeset patch # User alexvsimon@netbeans.org # Date 1222156097 -14400 # Node ID 1c04e785a309620d8aad3589bcfea3f08de70d3c # Parent 496407f0c39a873bcd0f6225cbe7e451a47d0e1e fixed: IZ#146696:expensive use of EDT for reading XML configuration data diff -r 496407f0c39a -r 1c04e785a309 cnd.makeproject/src/org/netbeans/modules/cnd/makeproject/NativeProjectProvider.java --- a/cnd.makeproject/src/org/netbeans/modules/cnd/makeproject/NativeProjectProvider.java Tue Sep 23 10:48:28 2008 +0400 +++ b/cnd.makeproject/src/org/netbeans/modules/cnd/makeproject/NativeProjectProvider.java Tue Sep 23 11:48:17 2008 +0400 @@ -92,8 +92,11 @@ public void runOnCodeModelReadiness(Runnable task) { if (getMakeConfigurationDescriptor() != null) { - DevelopmentHostConfiguration host = ((MakeConfiguration)getMakeConfigurationDescriptor().getConfs().getActive()).getDevelopmentHost(); - CompilerSetManagerEvents.get(host.getName()).runOnCodeModelReadiness(task); + MakeConfiguration active = (MakeConfiguration)getMakeConfigurationDescriptor().getConfs().getActive(); + if (active != null) { + DevelopmentHostConfiguration host = active.getDevelopmentHost(); + CompilerSetManagerEvents.get(host.getName()).runOnCodeModelReadiness(task); + } } } diff -r 496407f0c39a -r 1c04e785a309 cnd.makeproject/src/org/netbeans/modules/cnd/makeproject/api/configurations/ConfigurationDescriptor.java --- a/cnd.makeproject/src/org/netbeans/modules/cnd/makeproject/api/configurations/ConfigurationDescriptor.java Tue Sep 23 10:48:28 2008 +0400 +++ b/cnd.makeproject/src/org/netbeans/modules/cnd/makeproject/api/configurations/ConfigurationDescriptor.java Tue Sep 23 11:48:17 2008 +0400 @@ -44,7 +44,7 @@ import javax.swing.Icon; public abstract class ConfigurationDescriptor { - private Configurations confs; + private Configurations confs = new Configurations(); int version = -1; public ConfigurationDescriptor() { @@ -104,4 +104,4 @@ public abstract boolean getModified(); public abstract void setModified(); public abstract void closed(); - } +} diff -r 496407f0c39a -r 1c04e785a309 cnd.makeproject/src/org/netbeans/modules/cnd/makeproject/api/configurations/ConfigurationDescriptorProvider.java --- a/cnd.makeproject/src/org/netbeans/modules/cnd/makeproject/api/configurations/ConfigurationDescriptorProvider.java Tue Sep 23 10:48:28 2008 +0400 +++ b/cnd.makeproject/src/org/netbeans/modules/cnd/makeproject/api/configurations/ConfigurationDescriptorProvider.java Tue Sep 23 11:48:17 2008 +0400 @@ -110,16 +110,7 @@ } } ConfigurationXMLReader reader = new ConfigurationXMLReader(projectDirectory); - ConfigurationDescriptor newDescriptor = null; - if (SwingUtilities.isEventDispatchThread()) { - new Exception("Not allowed to use EDT for reading XML descriptor of project!").printStackTrace(System.err); // NOI18N - // PLEASE DO NOT ADD HACKS like Task.waitFinished() - // CHANGE YOUR LOGIC INSTEAD - - // FIXUP for IZ#146696: cannot open projects: Not allowed to use EDT... - // return null; - } try { projectDescriptor = reader.read(relativeOffset); } catch (java.io.IOException x) { @@ -127,7 +118,6 @@ } hasTried = true; - recordMetrics(USG_PROJECT_OPEN_CND, projectDescriptor); } } } @@ -163,6 +153,9 @@ Logger logger = Logger.getLogger("org.netbeans.ui.metrics.cnd"); // NOI18N if (logger.isLoggable(Level.INFO)) { LogRecord rec = new LogRecord(Level.INFO, msg); + if (descr.getConfs() == null || descr.getConfs().getActive() == null){ + return; + } MakeConfiguration makeConfiguration = (MakeConfiguration) descr.getConfs().getActive(); String type; switch (makeConfiguration.getConfigurationType().getValue()) { diff -r 496407f0c39a -r 1c04e785a309 cnd.makeproject/src/org/netbeans/modules/cnd/makeproject/api/configurations/Configurations.java --- a/cnd.makeproject/src/org/netbeans/modules/cnd/makeproject/api/configurations/Configurations.java Tue Sep 23 10:48:28 2008 +0400 +++ b/cnd.makeproject/src/org/netbeans/modules/cnd/makeproject/api/configurations/Configurations.java Tue Sep 23 11:48:17 2008 +0400 @@ -55,7 +55,7 @@ public static final String PROP_ACTIVE_CONFIGURATION = "activeconfiguration"; // NOI18N private PropertyChangeSupport pcs; - private List configurations; + private List configurations = new ArrayList(); public Configurations() { pcs = new PropertyChangeSupport(this); @@ -100,7 +100,7 @@ } */ public Configurations init(Configuration[] confs, int defaultConf) { - configurations = new ArrayList(); + configurations.clear(); for (int i = 0; i < confs.length; i ++) configurations.add(confs[i]); if (defaultConf >= 0 && confs != null && confs.length > 0) @@ -279,8 +279,8 @@ */ private void checkValidIndex(int index) { if (index < 0 || index >= size()) { - ;// Error ??? - ;// FIXUP ??? + // Error ??? + // FIXUP ??? } } diff -r 496407f0c39a -r 1c04e785a309 cnd.makeproject/src/org/netbeans/modules/cnd/makeproject/configurations/ConfigurationXMLReader.java --- a/cnd.makeproject/src/org/netbeans/modules/cnd/makeproject/configurations/ConfigurationXMLReader.java Tue Sep 23 10:48:28 2008 +0400 +++ b/cnd.makeproject/src/org/netbeans/modules/cnd/makeproject/configurations/ConfigurationXMLReader.java Tue Sep 23 11:48:17 2008 +0400 @@ -49,11 +49,13 @@ import org.netbeans.modules.cnd.makeproject.api.configurations.MakeConfigurationDescriptor; import org.netbeans.modules.cnd.api.xml.XMLDecoder; import org.netbeans.modules.cnd.api.xml.XMLDocReader; +import org.netbeans.modules.cnd.makeproject.api.configurations.ConfigurationDescriptorProvider; import org.openide.DialogDisplayer; import org.openide.NotifyDescriptor; import org.openide.filesystems.FileObject; import org.openide.filesystems.FileUtil; import org.openide.util.NbBundle; +import org.openide.util.RequestProcessor; import org.xml.sax.Attributes; /** @@ -76,28 +78,57 @@ * was: readFromDisk */ - public ConfigurationDescriptor read(String relativeOffset) throws IOException { - - String tag = null; - + public ConfigurationDescriptor read(final String relativeOffset) throws IOException { + final String tag; + final FileObject xml; // Try first new style file - tag = CommonConfigurationXMLCodec.CONFIGURATION_DESCRIPTOR_ELEMENT; - FileObject xml = projectDirectory.getFileObject("nbproject/configurations.xml"); // NOI18N - if (xml == null) { + FileObject fo = projectDirectory.getFileObject("nbproject/configurations.xml"); // NOI18N + if (fo == null){ // then try old style file.... tag = CommonConfigurationXMLCodec.PROJECT_DESCRIPTOR_ELEMENT; xml = projectDirectory.getFileObject("nbproject/projectDescriptor.xml"); // NOI18N + } else { + tag = CommonConfigurationXMLCodec.CONFIGURATION_DESCRIPTOR_ELEMENT; + xml = fo; } if (xml == null) { displayErrorDialog(); return null; } + String path = FileUtil.toFile(projectDirectory).getPath(); + final MakeConfigurationDescriptor configurationDescriptor = new MakeConfigurationDescriptor(path); + boolean pospone = SwingUtilities.isEventDispatchThread() && xml.getSize() > 8*1024; + if (pospone){ + RequestProcessor.getDefault().post(new Runnable() { + public void run() { + try { + //System.out.println("Read "+xml.getPath()+" in request processor thread"); + //try { + // // To emulate long work + // Thread.sleep(10000); + //} catch (InterruptedException ex) { + // Exceptions.printStackTrace(ex); + //} + if (_read(relativeOffset, tag, xml, configurationDescriptor) == null){ + // TODO configurationDescriptor is broken + } + } catch (IOException ex) { + // TODO configurationDescriptor is broken + } + } + }); + } else { + return _read(relativeOffset, tag, xml, configurationDescriptor); + } + return configurationDescriptor; + } + + public ConfigurationDescriptor _read(String relativeOffset, + String tag, FileObject xml, final MakeConfigurationDescriptor configurationDescriptor) throws IOException { boolean success; - String path = FileUtil.toFile(projectDirectory).getPath(); - final MakeConfigurationDescriptor configurationDescriptor = new MakeConfigurationDescriptor(path); XMLDecoder decoder = new ConfigurationXMLCodec(tag, projectDirectory, @@ -162,7 +193,7 @@ // Project is modified and will be saved with current version. This includes samples. configurationDescriptor.setVersion(CommonConfigurationXMLCodec.CURRENT_VERSION); } - + ConfigurationDescriptorProvider.recordMetrics(ConfigurationDescriptorProvider.USG_PROJECT_OPEN_CND, configurationDescriptor); return configurationDescriptor; }