# HG changeset patch # User alexvsimon@netbeans.org # Date 1222197104 -14400 # Node ID 46130998cdf71d89292f7517c16664fe13739af9 # Parent 496407f0c39a873bcd0f6225cbe7e451a47d0e1e fixed: IZ#146696:expensive use of EDT for reading XML configuration data diff -r 496407f0c39a -r 46130998cdf7 cnd.makeproject/src/org/netbeans/modules/cnd/makeproject/MakeActionProvider.java --- a/cnd.makeproject/src/org/netbeans/modules/cnd/makeproject/MakeActionProvider.java Tue Sep 23 10:48:28 2008 +0400 +++ b/cnd.makeproject/src/org/netbeans/modules/cnd/makeproject/MakeActionProvider.java Tue Sep 23 23:11:44 2008 +0400 @@ -203,7 +203,7 @@ private MakeConfigurationDescriptor getProjectDescriptor() { if (projectDescriptor == null) { ConfigurationDescriptorProvider pdp = project.getLookup().lookup(ConfigurationDescriptorProvider.class); - projectDescriptor = pdp.getConfigurationDescriptor(); + projectDescriptor = pdp.getConfigurationDescriptor(false); } return (MakeConfigurationDescriptor)projectDescriptor; } diff -r 496407f0c39a -r 46130998cdf7 cnd.makeproject/src/org/netbeans/modules/cnd/makeproject/MakeProjectConfigurationProvider.java --- a/cnd.makeproject/src/org/netbeans/modules/cnd/makeproject/MakeProjectConfigurationProvider.java Tue Sep 23 10:48:28 2008 +0400 +++ b/cnd.makeproject/src/org/netbeans/modules/cnd/makeproject/MakeProjectConfigurationProvider.java Tue Sep 23 23:11:44 2008 +0400 @@ -64,17 +64,17 @@ } public Collection getConfigurations() { - if (projectDescriptorProvider.getConfigurationDescriptor() == null) { + if (projectDescriptorProvider.getConfigurationDescriptor(false) == null) { return Collections.EMPTY_SET; } - return projectDescriptorProvider.getConfigurationDescriptor().getConfs().getConfsAsCollection(); + return projectDescriptorProvider.getConfigurationDescriptor(false).getConfs().getConfsAsCollection(); } public ProjectConfiguration getActiveConfiguration() { - if (projectDescriptorProvider.getConfigurationDescriptor() == null) { + if (projectDescriptorProvider.getConfigurationDescriptor(false) == null) { return null; } - return projectDescriptorProvider.getConfigurationDescriptor().getConfs().getActive(); + return projectDescriptorProvider.getConfigurationDescriptor(false).getConfs().getActive(); } public void setActiveConfiguration(ProjectConfiguration configuration) throws IllegalArgumentException, IOException { @@ -84,15 +84,15 @@ public void addPropertyChangeListener(PropertyChangeListener lst) { pcs.addPropertyChangeListener(lst); - if (projectDescriptorProvider != null && projectDescriptorProvider.getConfigurationDescriptor() != null) { // IZ 122372 - projectDescriptorProvider.getConfigurationDescriptor().getConfs().addPropertyChangeListener(this); + if (projectDescriptorProvider != null && projectDescriptorProvider.getConfigurationDescriptor(false) != null) { // IZ 122372 + projectDescriptorProvider.getConfigurationDescriptor(false).getConfs().addPropertyChangeListener(this); } } public void removePropertyChangeListener(PropertyChangeListener lst) { pcs.removePropertyChangeListener(lst); - if (projectDescriptorProvider != null && projectDescriptorProvider.getConfigurationDescriptor() != null) { - projectDescriptorProvider.getConfigurationDescriptor().getConfs().removePropertyChangeListener(this); + if (projectDescriptorProvider != null && projectDescriptorProvider.getConfigurationDescriptor(false) != null) { + projectDescriptorProvider.getConfigurationDescriptor(false).getConfs().removePropertyChangeListener(this); } } diff -r 496407f0c39a -r 46130998cdf7 cnd.makeproject/src/org/netbeans/modules/cnd/makeproject/MakeSources.java --- a/cnd.makeproject/src/org/netbeans/modules/cnd/makeproject/MakeSources.java Tue Sep 23 10:48:28 2008 +0400 +++ b/cnd.makeproject/src/org/netbeans/modules/cnd/makeproject/MakeSources.java Tue Sep 23 23:11:44 2008 +0400 @@ -97,7 +97,7 @@ private Sources initSources() { final SourcesHelper h = new SourcesHelper(helper, project.evaluator()); ConfigurationDescriptorProvider pdp = project.getLookup().lookup(ConfigurationDescriptorProvider.class); - ConfigurationDescriptor pd = pdp.getConfigurationDescriptor(); + ConfigurationDescriptor pd = pdp.getConfigurationDescriptor(false); if (pd != null) { MakeConfigurationDescriptor epd = (MakeConfigurationDescriptor) pd; Set set = new LinkedHashSet(); diff -r 496407f0c39a -r 46130998cdf7 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 23:11:44 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 46130998cdf7 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 23:11:44 2008 +0400 @@ -44,8 +44,9 @@ import javax.swing.Icon; public abstract class ConfigurationDescriptor { - private Configurations confs; + private Configurations confs = new Configurations(); int version = -1; + private State state = State.READING; public ConfigurationDescriptor() { } @@ -81,6 +82,13 @@ this.version = version; } + public void setState(State state){ + this.state = state; + } + public State getState(){ + return state; + } + public abstract Icon getIcon(); public abstract String getBaseDir(); @@ -97,6 +105,7 @@ // projectType is already cloned clone.setConfs(confs.cloneConfs()); clone.setVersion(getVersion()); + clone.setState(this.getState()); } public abstract boolean save(); @@ -104,4 +113,9 @@ public abstract boolean getModified(); public abstract void setModified(); public abstract void closed(); - } + public enum State { + READING, + READY, + BROKEN + } +} diff -r 496407f0c39a -r 46130998cdf7 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 23:11:44 2008 +0400 @@ -49,9 +49,9 @@ import java.util.logging.Level; import java.util.logging.LogRecord; import java.util.logging.Logger; -import javax.swing.SwingUtilities; import org.netbeans.modules.cnd.api.compilers.CompilerSet; import org.netbeans.modules.cnd.api.compilers.Tool; +import org.netbeans.modules.cnd.makeproject.api.configurations.ConfigurationDescriptor.State; import org.netbeans.modules.cnd.makeproject.api.platforms.Platforms; import org.netbeans.modules.cnd.makeproject.configurations.ConfigurationXMLReader; import org.openide.filesystems.FileAttributeEvent; @@ -82,6 +82,9 @@ private final Object readLock = new Object(); public ConfigurationDescriptor getConfigurationDescriptor() { + return getConfigurationDescriptor(true); + } + public ConfigurationDescriptor getConfigurationDescriptor(boolean waitReading) { if (projectDescriptor == null || needReload) { // attempt to read configuration descriptor if (!hasTried) { @@ -110,16 +113,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,16 +121,18 @@ } hasTried = true; - recordMetrics(USG_PROJECT_OPEN_CND, projectDescriptor); } } } + } + if (waitReading && projectDescriptor instanceof MakeConfigurationDescriptor) { + ((MakeConfigurationDescriptor)projectDescriptor).waitInitTask(); } return projectDescriptor; } public boolean gotDescriptor() { - return projectDescriptor != null; + return projectDescriptor != null && projectDescriptor.getState() != State.READING; } public static ConfigurationAuxObjectProvider[] getAuxObjectProviders() { @@ -163,6 +159,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 46130998cdf7 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 23:11:44 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 46130998cdf7 cnd.makeproject/src/org/netbeans/modules/cnd/makeproject/api/configurations/MakeConfiguration.java --- a/cnd.makeproject/src/org/netbeans/modules/cnd/makeproject/api/configurations/MakeConfiguration.java Tue Sep 23 10:48:28 2008 +0400 +++ b/cnd.makeproject/src/org/netbeans/modules/cnd/makeproject/api/configurations/MakeConfiguration.java Tue Sep 23 23:11:44 2008 +0400 @@ -502,7 +502,9 @@ // Base it on actual files added to project for (int x = 0; x < items.length; x++) { ItemConfiguration itemConfiguration = items[x].getItemConfiguration(this); - if (itemConfiguration.getExcluded().getValue()) { + if (itemConfiguration == null || + itemConfiguration.getExcluded() == null || + itemConfiguration.getExcluded().getValue()) { continue; } if (itemConfiguration.getTool() == Tool.CCompiler) { diff -r 496407f0c39a -r 46130998cdf7 cnd.makeproject/src/org/netbeans/modules/cnd/makeproject/api/configurations/MakeConfigurationDescriptor.java --- a/cnd.makeproject/src/org/netbeans/modules/cnd/makeproject/api/configurations/MakeConfigurationDescriptor.java Tue Sep 23 10:48:28 2008 +0400 +++ b/cnd.makeproject/src/org/netbeans/modules/cnd/makeproject/api/configurations/MakeConfigurationDescriptor.java Tue Sep 23 23:11:44 2008 +0400 @@ -53,6 +53,7 @@ import java.util.Vector; import javax.swing.Icon; import javax.swing.ImageIcon; +import javax.swing.SwingUtilities; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import javax.swing.filechooser.FileFilter; @@ -85,6 +86,7 @@ import org.openide.filesystems.FileUtil; import org.openide.util.NbBundle; import org.openide.util.RequestProcessor; +import org.openide.util.RequestProcessor.Task; import org.openide.util.Utilities; import org.w3c.dom.Document; import org.w3c.dom.Element; @@ -111,6 +113,7 @@ private NativeProject nativeProject = null; public static String DEFAULT_PROJECT_MAKFILE_NAME = "Makefile"; // NOI18N private String projectMakefileName = DEFAULT_PROJECT_MAKFILE_NAME; + private Task initTask = null; public MakeConfigurationDescriptor(String baseDir) { super(); @@ -178,6 +181,20 @@ setModified(true); } + public void setInitTask(Task task){ + initTask = task; + } + + public synchronized void waitInitTask(){ + new Exception("Avoid waiting reading in EDT").printStackTrace(); + if (initTask == null){ + return; + } + System.out.println("Waiting for finish loading"+baseDir); + initTask.waitFinished(); + initTask = null; + } + public void initLogicalFolders(Iterator sourceFileFolders, boolean createLogicalFolders, Iterator importantItems) { if (createLogicalFolders) { rootFolder.addNewFolder(SOURCE_FILES_FOLDER, getString("SourceFilesTxt"), true); diff -r 496407f0c39a -r 46130998cdf7 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 23:11:44 2008 +0400 @@ -49,11 +49,15 @@ 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.ConfigurationDescriptor.State; +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.openide.util.RequestProcessor.Task; import org.xml.sax.Attributes; /** @@ -76,28 +80,52 @@ * 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); + Task task = RequestProcessor.getDefault().post(new Runnable() { + public void run() { + try { + try { + // To emulate long work + Thread.sleep(10000); + } catch (InterruptedException ex) { + } + if (_read(relativeOffset, tag, xml, configurationDescriptor) == null){ + // TODO configurationDescriptor is broken + configurationDescriptor.setState(State.BROKEN); + } + } catch (IOException ex) { + configurationDescriptor.setState(State.BROKEN); + } + } + }); + configurationDescriptor.setInitTask(task); + 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, @@ -133,7 +161,8 @@ return configurationDescriptor; } } - + configurationDescriptor.setState(State.READY); + // Some samples are generated without generated makefile. Don't mark these 'not modified'. Then // the makefiles will be generated before the project is being built FileObject makeImpl = projectDirectory.getFileObject("nbproject/Makefile-impl.mk"); // NOI18N @@ -162,7 +191,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; } diff -r 496407f0c39a -r 46130998cdf7 cnd.makeproject/src/org/netbeans/modules/cnd/makeproject/ui/MakeLogicalViewProvider.java --- a/cnd.makeproject/src/org/netbeans/modules/cnd/makeproject/ui/MakeLogicalViewProvider.java Tue Sep 23 10:48:28 2008 +0400 +++ b/cnd.makeproject/src/org/netbeans/modules/cnd/makeproject/ui/MakeLogicalViewProvider.java Tue Sep 23 23:11:44 2008 +0400 @@ -748,7 +748,15 @@ protected Collection getKeys() { Collection collection = getFolder().getElements(); - + switch (getFolder().getConfigurationDescriptor().getState()){ + case READING: + if(collection.size() == 0) { + collection = Collections.singletonList(new LoadingNode()); + } + break; + case BROKEN: + // TODO show broken node + } if ("root".equals(getFolder().getName())) { // NOI18N LogicalViewNodeProvider[] providers = LogicalViewNodeProviders.getInstance().getProvidersAsArray(); if (providers.length > 0) { @@ -766,7 +774,7 @@ private MakeConfigurationDescriptor getMakeConfigurationDescriptor() { ConfigurationDescriptorProvider pdp = (ConfigurationDescriptorProvider)project.getLookup().lookup(ConfigurationDescriptorProvider.class ); - MakeConfigurationDescriptor makeConfigurationDescriptor = (MakeConfigurationDescriptor)pdp.getConfigurationDescriptor(); + MakeConfigurationDescriptor makeConfigurationDescriptor = (MakeConfigurationDescriptor)pdp.getConfigurationDescriptor(false); return makeConfigurationDescriptor; } diff -r 496407f0c39a -r 46130998cdf7 cnd.makeproject/src/org/netbeans/modules/cnd/makeproject/ui/SetConfigurationAction.java --- a/cnd.makeproject/src/org/netbeans/modules/cnd/makeproject/ui/SetConfigurationAction.java Tue Sep 23 10:48:28 2008 +0400 +++ b/cnd.makeproject/src/org/netbeans/modules/cnd/makeproject/ui/SetConfigurationAction.java Tue Sep 23 23:11:44 2008 +0400 @@ -105,7 +105,7 @@ if (pdp == null) return; - ConfigurationDescriptor projectDescriptor = pdp.getConfigurationDescriptor(); + ConfigurationDescriptor projectDescriptor = pdp.getConfigurationDescriptor(false); Configuration[] confs = projectDescriptor.getConfs().getConfs(); // Fill menu with items for ( int i = 0; i < confs.length; i++ ) {