# This patch file was generated by NetBeans IDE # Following Index: paths are relative to: /home/mkleint/src/hudson/tools/ide/netbeans # This patch can be applied using context Tools: Patch action on respective folder. # It uses platform neutral UTF-8 encoding and \n newlines. # Above lines and this line are ignored by the patching process. Index: nbproject/genfiles.properties --- nbproject/genfiles.properties Base (BASE) +++ nbproject/genfiles.properties Locally Modified (Based On LOCAL) @@ -1,8 +1,8 @@ -build.xml.data.CRC32=c4c79a85 +build.xml.data.CRC32=59dc13a6 build.xml.script.CRC32=9dd38e61 build.xml.stylesheet.CRC32=79c3b980 # This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml. # Do not edit this file. You may delete it but then the IDE will never regenerate such files for you. -nbproject/build-impl.xml.data.CRC32=c4c79a85 +nbproject/build-impl.xml.data.CRC32=59dc13a6 nbproject/build-impl.xml.script.CRC32=2bdea740 nbproject/build-impl.xml.stylesheet.CRC32=deb65f65 Index: nbproject/project.xml --- nbproject/project.xml Base (BASE) +++ nbproject/project.xml Locally Modified (Based On LOCAL) @@ -43,6 +43,15 @@ + org.netbeans.modules.projectapi + + + + 1 + 1.19 + + + org.netbeans.modules.projectuiapi @@ -118,6 +127,7 @@ org.netbeans.modules.hudson.api + org.netbeans.modules.hudson.spi Index: src/org/netbeans/modules/hudson/api/HudsonInstance.java --- src/org/netbeans/modules/hudson/api/HudsonInstance.java Base (BASE) +++ src/org/netbeans/modules/hudson/api/HudsonInstance.java Locally Modified (Based On LOCAL) @@ -83,4 +83,10 @@ * @param l HudsonChangeListener */ public void removeHudsonChangeListener(HudsonChangeListener l); + + /** + * + * @return + */ + boolean isPersisted(); \ No newline at end of file } Index: src/org/netbeans/modules/hudson/impl/HudsonInstanceImpl.java --- src/org/netbeans/modules/hudson/impl/HudsonInstanceImpl.java Base (BASE) +++ src/org/netbeans/modules/hudson/impl/HudsonInstanceImpl.java Locally Modified (Based On LOCAL) @@ -64,7 +64,7 @@ private Collection jobs = new ArrayList(); private Collection views = new ArrayList(); - private Collection listeners = new ArrayList(); + private final Collection listeners = new ArrayList(); private HudsonInstanceImpl(String name, String url) { this(new HudsonInstanceProperties(name, url)); @@ -138,6 +138,10 @@ }); } + public boolean isPersisted() { + return !(properties instanceof ProjectHIP); + } + \ No newline at end of file /** * * @param name Index: src/org/netbeans/modules/hudson/impl/HudsonInstanceProperties.java --- src/org/netbeans/modules/hudson/impl/HudsonInstanceProperties.java Base (BASE) +++ src/org/netbeans/modules/hudson/impl/HudsonInstanceProperties.java Locally Modified (Based On LOCAL) @@ -42,7 +42,7 @@ private Sheet.Set set; - private List listeners = new ArrayList(); \ No newline at end of file + private final List listeners = new ArrayList(); \ No newline at end of file public HudsonInstanceProperties(String name, String url) { this(name, url, "0"); Index: src/org/netbeans/modules/hudson/impl/HudsonManagerImpl.java --- src/org/netbeans/modules/hudson/impl/HudsonManagerImpl.java Base (BASE) +++ src/org/netbeans/modules/hudson/impl/HudsonManagerImpl.java Locally Modified (Based On LOCAL) @@ -29,13 +29,19 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.Future; +import org.netbeans.api.project.Project; +import org.netbeans.api.project.ui.OpenProjects; import org.netbeans.modules.hudson.api.HudsonChangeListener; import org.netbeans.modules.hudson.api.HudsonInstance; import org.netbeans.modules.hudson.api.HudsonManager; +import org.netbeans.modules.hudson.spi.ProjectHudsonProvider; import org.openide.ErrorManager; import org.openide.filesystems.FileObject; import org.openide.filesystems.FileUtil; import org.openide.filesystems.Repository; +import org.openide.util.Exceptions; import org.openide.util.Lookup; import org.openide.util.NbPreferences; import org.openide.util.RequestProcessor; @@ -60,7 +66,10 @@ private static HudsonManagerImpl defaultInstance; private Map instances; - private List listeners = new ArrayList(); + private final List listeners = new ArrayList(); + private PropertyChangeListener projectsListener; + private Map projectInstances = new HashMap(); + private Map> projectLookupInstances = new HashMap>(); public HudsonManagerImpl() { synchronized(LOCK_INIT) { @@ -70,8 +79,20 @@ defaultInstance = this; } + projectsListener = new PropertyChangeListener() { + public void propertyChange(PropertyChangeEvent evt) { + if (OpenProjects.PROPERTY_OPEN_PROJECTS.equals(evt.getPropertyName())) { + RequestProcessor.getDefault().post(new Runnable() { + public void run() { + checkOpenProjects(); } + }); + } + } + }; + } + /** * Singleton accessor * @@ -182,18 +203,21 @@ public void terminate() { // Clear default instance defaultInstance = null; - + OpenProjects.getDefault().removePropertyChangeListener(projectsListener); + projectInstances.clear(); // Terminate instances for (HudsonInstance instance : getInstances()) ((HudsonInstanceImpl) instance).terminate(); } private void storeInstanceFile(HudsonInstanceImpl instance) { + if (!instance.isPersisted()) { + return; + } Repository repository = Lookup.getDefault().lookup(Repository.class); FileObject directory = repository.getDefaultFileSystem().findResource(DIR_INSTANCES); String fileName = instance.getName().replace(" ", "_").toLowerCase() + ".xml"; - try { FileObject file = directory.getFileObject(fileName); @@ -251,11 +275,67 @@ } finally { // Deactivate startup flag NbPreferences.forModule(HudsonManager.class).putBoolean(STARTUP_PROP, false); - + checkOpenProjects(); + OpenProjects.getDefault().addPropertyChangeListener(projectsListener); // Fire changes fireChangeListeners(); } } }); } + + + private void checkOpenProjects() { + try { + Future fut = OpenProjects.getDefault().openProjects(); + Project[] prjs = fut.get(); + for (Project project : prjs) { + boolean exists = false; + if (projectInstances.containsKey(project)) { + exists = true; } + ProjectHudsonProvider prov = project.getLookup().lookup(ProjectHudsonProvider.class); + if (prov != null && !exists) { + String url = prov.getServerUrl(); + HudsonInstance in = getInstance(url); + if (in != null && !in.isPersisted()) { + ProjectHIP props = (ProjectHIP)((HudsonInstanceImpl)in).getProperties(); + props.addProvider(project); + projectInstances.put(project, (HudsonInstanceImpl)in); + } else if (in == null) { + ProjectHIP props = new ProjectHIP(); + props.addProvider(project); + addInstance(HudsonInstanceImpl.createHudsonInstance(props)); + HudsonInstanceImpl impl = (HudsonInstanceImpl) getInstance(props.getProperty(HudsonInstanceProperties.HUDSON_INSTANCE_URL)); + projectInstances.put(project, impl); + } + } else if (prov == null && exists) { + HudsonInstanceImpl remove = projectInstances.remove(project); + if (remove != null) { + ProjectHIP props = (ProjectHIP)remove.getProperties(); + props.removeProvider(project); + if (props.getProviders().isEmpty()) { + removeInstance(remove); + } + } + } + } + ArrayList newprjs = new ArrayList(projectInstances.keySet()); + newprjs.removeAll(Arrays.asList(prjs)); + for (Project project : newprjs) { + HudsonInstanceImpl remove = projectInstances.remove(project); + if (remove != null) { + ProjectHIP props = (ProjectHIP)remove.getProperties(); + props.removeProvider(project); + if (props.getProviders().isEmpty()) { + removeInstance(remove); + } + } + } + } catch (InterruptedException ex) { + Exceptions.printStackTrace(ex); + } catch (ExecutionException ex) { + Exceptions.printStackTrace(ex); + } + } +} \ No newline at end of file Index: src/org/netbeans/modules/hudson/impl/ProjectHIP.java --- src/org/netbeans/modules/hudson/impl/ProjectHIP.java Locally New +++ src/org/netbeans/modules/hudson/impl/ProjectHIP.java Locally New @@ -0,0 +1,77 @@ +/* + * To change this template, choose Tools | Templates + * and open the template in the editor. + */ + +package org.netbeans.modules.hudson.impl; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.HashSet; +import java.util.InvalidPropertiesFormatException; +import java.util.Set; +import org.netbeans.api.project.Project; +import org.netbeans.modules.hudson.spi.ProjectHudsonProvider; + +/** + * + * @author mkleint + */ +class ProjectHIP extends HudsonInstanceProperties { + + private final Set providers = new HashSet(); + public ProjectHIP() { + super("", ""); + } + + public void addProvider(Project prov) { + synchronized (providers) { + providers.add(prov); + } + ProjectHudsonProvider p = prov.getLookup().lookup(ProjectHudsonProvider.class); + if (p != null) { + setProperty(HUDSON_INSTANCE_URL, p.getServerUrl()); + setProperty(HUDSON_INSTANCE_NAME, p.getName()); + } + } + + public void removeProvider(Project prov) { + synchronized (providers) { + providers.remove(prov); + } + } + + public Set getProviders() { + synchronized (providers) { + return new HashSet(providers); + } + } + + + @Override + public synchronized void load(InputStream inStream) throws IOException { + } + + @Override + public synchronized void loadFromXML(InputStream in) throws IOException, InvalidPropertiesFormatException { + } + + @Override + public synchronized void save(OutputStream out, String comments) { + } + + @Override + public synchronized void store(OutputStream out, String comments) throws IOException { + } + + @Override + public synchronized void storeToXML(OutputStream os, String comment) throws IOException { + } + + @Override + public synchronized void storeToXML(OutputStream os, String comment, String encoding) throws IOException { + } + + +} Index: src/org/netbeans/modules/hudson/spi/ProjectHudsonProvider.java --- src/org/netbeans/modules/hudson/spi/ProjectHudsonProvider.java Locally New +++ src/org/netbeans/modules/hudson/spi/ProjectHudsonProvider.java Locally New @@ -0,0 +1,23 @@ +/* + * To change this template, choose Tools | Templates + * and open the template in the editor. + */ + +package org.netbeans.modules.hudson.spi; + +import javax.swing.event.ChangeListener; + +/** + * + * @author mkleint + */ +public interface ProjectHudsonProvider { + + String getServerUrl(); + String getName(); + String getJobName(); + + void addChangeListener(ChangeListener listener); + void removeChangeListener(ChangeListener listener); + +} Index: src/org/netbeans/modules/hudson/ui/actions/RemoveInstanceAction.java --- src/org/netbeans/modules/hudson/ui/actions/RemoveInstanceAction.java Base (BASE) +++ src/org/netbeans/modules/hudson/ui/actions/RemoveInstanceAction.java Locally Modified (Based On LOCAL) @@ -56,7 +56,7 @@ for (Node node : nodes) { HudsonInstanceImpl instance = node.getLookup().lookup(HudsonInstanceImpl.class); - if (null != instance) + if (null != instance && instance.isPersisted()) return true; } @@ -71,6 +71,7 @@ return HelpCtx.DEFAULT_HELP; } + @Override \ No newline at end of file public boolean asynchronous() { return false; } Index: src/org/netbeans/modules/hudson/ui/nodes/HudsonInstanceNode.java --- src/org/netbeans/modules/hudson/ui/nodes/HudsonInstanceNode.java Base (BASE) +++ src/org/netbeans/modules/hudson/ui/nodes/HudsonInstanceNode.java Locally Modified (Based On LOCAL) @@ -95,12 +95,14 @@ @Override public String getHtmlDisplayName() { + boolean pers = instance.isPersisted(); return (run ? "" : "") + (warn ? "" : "") + instance.getName() + (warn ? "" : "") + (run ? "" : "") + (alive ? (version ? "" : " " + NbBundle.getMessage(HudsonInstanceNode.class, "MSG_WrongVersion", HudsonVersion.SUPPORTED_VERSION) + "") : " " + - NbBundle.getMessage(HudsonInstanceNode.class, "MSG_Disconnected") + ""); \ No newline at end of file + NbBundle.getMessage(HudsonInstanceNode.class, "MSG_Disconnected") + "") + + (!pers ? "" : "") + "(Project based)" + (!pers ? "" : ""); \ No newline at end of file } @Override Index: src/org/netbeans/modules/hudson/ui/wizard/InstanceWizard.java --- src/org/netbeans/modules/hudson/ui/wizard/InstanceWizard.java Base (BASE) +++ src/org/netbeans/modules/hudson/ui/wizard/InstanceWizard.java Locally Modified (Based On LOCAL) @@ -28,7 +28,8 @@ * * @author Michal Mocnak */ -public class InstanceWizard extends WizardDescriptor implements InstanceWizardConstants { \ No newline at end of file +public class InstanceWizard extends WizardDescriptor //implements InstanceWizardConstants +{ \ No newline at end of file public InstanceWizard() { super(new InstanceWizardIterator());