Lines 41-68
Link Here
|
41 |
*/ |
41 |
*/ |
42 |
package org.netbeans.modules.ide.ergonomics.fod; |
42 |
package org.netbeans.modules.ide.ergonomics.fod; |
43 |
|
43 |
|
44 |
import java.io.IOException; |
|
|
45 |
import java.net.URL; |
44 |
import java.net.URL; |
46 |
import java.util.ArrayList; |
45 |
import java.util.*; |
47 |
import java.util.Arrays; |
|
|
48 |
import java.util.HashSet; |
49 |
import java.util.List; |
50 |
import java.util.Set; |
51 |
import java.util.logging.Level; |
46 |
import java.util.logging.Level; |
52 |
import java.util.logging.Logger; |
47 |
import java.util.logging.Logger; |
53 |
import javax.swing.event.ChangeEvent; |
|
|
54 |
import javax.swing.event.ChangeListener; |
55 |
import org.netbeans.core.startup.layers.LayerCacheManager; |
56 |
import org.netbeans.spi.project.ProjectFactory; |
48 |
import org.netbeans.spi.project.ProjectFactory; |
57 |
import org.netbeans.spi.project.support.ant.AntBasedProjectType; |
49 |
import org.netbeans.spi.project.support.ant.AntBasedProjectType; |
58 |
import org.openide.filesystems.FileObject; |
50 |
import org.openide.filesystems.FileObject; |
59 |
import org.openide.filesystems.FileSystem; |
51 |
import org.openide.filesystems.Repository; |
60 |
import org.openide.filesystems.MultiFileSystem; |
|
|
61 |
import org.openide.util.Lookup; |
52 |
import org.openide.util.Lookup; |
62 |
import org.openide.util.LookupEvent; |
53 |
import org.openide.util.LookupEvent; |
63 |
import org.openide.util.LookupListener; |
54 |
import org.openide.util.LookupListener; |
64 |
import org.openide.util.RequestProcessor; |
55 |
import org.openide.util.RequestProcessor; |
65 |
import org.openide.util.WeakListeners; |
|
|
66 |
import org.openide.util.lookup.ServiceProvider; |
56 |
import org.openide.util.lookup.ServiceProvider; |
67 |
import org.openide.util.lookup.ServiceProviders; |
57 |
import org.openide.util.lookup.ServiceProviders; |
68 |
|
58 |
|
Lines 71-135
Link Here
|
71 |
* @author Jirka Rechtacek |
61 |
* @author Jirka Rechtacek |
72 |
*/ |
62 |
*/ |
73 |
@ServiceProviders({ |
63 |
@ServiceProviders({ |
74 |
@ServiceProvider(service=FileSystem.class), |
64 |
@ServiceProvider(service=Repository.LayersProvider.class), |
75 |
@ServiceProvider(service=FoDFileSystem.class) |
65 |
@ServiceProvider(service=FoDLayersProvider.class) |
76 |
}) |
66 |
}) |
77 |
public final class FoDFileSystem extends MultiFileSystem |
67 |
public final class FoDLayersProvider extends Repository.LayersProvider |
78 |
implements Runnable, ChangeListener, LookupListener { |
68 |
implements LookupListener, Runnable { |
79 |
private static final LayerCacheManager manager = LayerCacheManager.create("all-ergonomics.dat"); // NOI18N |
69 |
final static Logger LOG = Logger.getLogger (FoDLayersProvider.class.getPackage().getName()); |
80 |
final static Logger LOG = Logger.getLogger (FoDFileSystem.class.getPackage().getName()); |
|
|
81 |
private static RequestProcessor RP = new RequestProcessor("Ergonomics"); // NOI18N |
70 |
private static RequestProcessor RP = new RequestProcessor("Ergonomics"); // NOI18N |
82 |
private RequestProcessor.Task refresh = RP.create(this, true); |
71 |
private RequestProcessor.Task refresh = RP.create(this, true); |
83 |
private Lookup.Result<ProjectFactory> factories; |
72 |
private Lookup.Result<ProjectFactory> factories; |
84 |
private Lookup.Result<?> ants; |
73 |
private Lookup.Result<?> ants; |
85 |
private boolean forcedRefresh; |
|
|
86 |
private final ChangeListener weakL; |
87 |
|
74 |
|
88 |
public FoDFileSystem() { |
75 |
public static FoDLayersProvider getInstance() { |
89 |
setPropagateMasks(true); |
76 |
return Lookup.getDefault().lookup(FoDLayersProvider.class); |
90 |
weakL = WeakListeners.change(this, FeatureManager.getInstance()); |
|
|
91 |
FileSystem fs; |
92 |
try { |
93 |
fs = manager.loadCache(); |
94 |
if (fs != null) { |
95 |
LOG.fine("Using cached layer"); // NOI18N |
96 |
setDelegates(fs); |
97 |
return; |
98 |
} |
99 |
} catch (IOException ex) { |
100 |
LOG.log(Level.WARNING, "Cannot read cache", ex); // NOI18N |
101 |
} |
102 |
refresh(); |
103 |
} |
104 |
|
105 |
public static FoDFileSystem getInstance() { |
106 |
return Lookup.getDefault().lookup(FoDFileSystem.class); |
107 |
} |
108 |
|
109 |
public void initListener() { |
110 |
FeatureManager.getInstance().addChangeListener(weakL); |
111 |
} |
112 |
|
113 |
public void refresh() { |
114 |
refresh.schedule(0); |
115 |
refresh.waitFinished(); |
116 |
} |
117 |
public void refreshForce() { |
118 |
forcedRefresh = true; |
119 |
refresh.schedule(0); |
120 |
refresh.waitFinished(); |
121 |
} |
122 |
|
123 |
public void waitFinished() { |
124 |
refresh.waitFinished(); |
125 |
} |
77 |
} |
126 |
|
78 |
|
127 |
@Override |
79 |
@Override |
128 |
public void run() { |
80 |
protected void registerLayers(Collection<? super URL> context) { |
129 |
boolean empty = true; |
81 |
boolean empty = true; |
130 |
LOG.fine("collecting layers"); // NOI18N |
82 |
LOG.fine("collecting layers"); // NOI18N |
131 |
List<URL> urls = new ArrayList<URL>(); |
83 |
List<URL> urls = new ArrayList<URL>(); |
132 |
urls.add(0, FoDFileSystem.class.getResource("common.xml")); // NOI18N |
84 |
urls.add(0, FoDLayersProvider.class.getResource("common.xml")); // NOI18N |
133 |
for (FeatureInfo info : FeatureManager.features()) { |
85 |
for (FeatureInfo info : FeatureManager.features()) { |
134 |
if (!info.isPresent()) { |
86 |
if (!info.isPresent()) { |
135 |
continue; |
87 |
continue; |
Lines 144-169
Link Here
|
144 |
} |
96 |
} |
145 |
if (empty && noAdditionalProjects() && !FoDEditorOpened.anEditorIsOpened) { |
97 |
if (empty && noAdditionalProjects() && !FoDEditorOpened.anEditorIsOpened) { |
146 |
LOG.fine("adding default layer"); // NOI18N |
98 |
LOG.fine("adding default layer"); // NOI18N |
147 |
urls.add(0, FoDFileSystem.class.getResource("default.xml")); // NOI18N |
99 |
urls.add(0, FoDLayersProvider.class.getResource("default.xml")); // NOI18N |
148 |
} |
|
|
149 |
if (forcedRefresh) { |
150 |
forcedRefresh = false; |
151 |
LOG.log(Level.INFO, "Forced refresh. Setting delegates to empty"); // NOI18N |
152 |
setDelegates(); |
153 |
LOG.log(Level.INFO, "New delegates count: {0}", urls.size()); // NOI18N |
154 |
LOG.log(Level.INFO, "{0}", urls); // NOI18N |
155 |
} |
100 |
} |
156 |
LOG.log(Level.FINE, "delegating to {0} layers", urls.size()); // NOI18N |
101 |
LOG.log(Level.FINE, "delegating to {0} layers", urls.size()); // NOI18N |
|
|
102 |
context.addAll(urls); |
157 |
LOG.log(Level.FINEST, "{0}", urls); // NOI18N |
103 |
LOG.log(Level.FINEST, "{0}", urls); // NOI18N |
158 |
|
|
|
159 |
try { |
160 |
FileSystem fs = getDelegates().length == 0 ? |
161 |
manager.createEmptyFileSystem() : getDelegates()[0]; |
162 |
fs = manager.store(fs, urls); |
163 |
setDelegates(fs); |
164 |
} catch (IOException ex) { |
165 |
LOG.log(Level.WARNING, "Cannot save cache", ex); |
166 |
} |
167 |
LOG.fine("done"); |
104 |
LOG.fine("done"); |
168 |
FeatureManager.dumpModules(); |
105 |
FeatureManager.dumpModules(); |
169 |
} |
106 |
} |
Lines 192-204
Link Here
|
192 |
} |
129 |
} |
193 |
|
130 |
|
194 |
@Override |
131 |
@Override |
195 |
public void stateChanged(ChangeEvent e) { |
132 |
public void resultChanged(LookupEvent ev) { |
196 |
refresh.schedule(500); |
133 |
refresh.schedule(500); |
197 |
} |
134 |
} |
198 |
|
135 |
public void refreshForce() { |
|
|
136 |
super.refresh(); |
137 |
} |
199 |
@Override |
138 |
@Override |
200 |
public void resultChanged(LookupEvent ev) { |
139 |
public void run() { |
201 |
refresh.schedule(0); |
140 |
super.refresh(); |
|
|
141 |
} |
142 |
public void waitFinished() { |
143 |
refresh.waitFinished(); |
202 |
} |
144 |
} |
203 |
|
145 |
|
204 |
private boolean noAdditionalProjects() { |
146 |
private boolean noAdditionalProjects() { |