Lines 46-56
Link Here
|
46 |
|
46 |
|
47 |
import java.io.File; |
47 |
import java.io.File; |
48 |
import java.io.IOException; |
48 |
import java.io.IOException; |
|
|
49 |
import java.lang.ref.Reference; |
50 |
import java.lang.ref.WeakReference; |
49 |
import java.net.URI; |
51 |
import java.net.URI; |
50 |
import java.net.URL; |
52 |
import java.net.URL; |
51 |
import java.util.ArrayList; |
53 |
import java.util.ArrayList; |
|
|
54 |
import java.util.Arrays; |
55 |
import java.util.Collections; |
52 |
import java.util.HashSet; |
56 |
import java.util.HashSet; |
53 |
import java.util.LinkedHashSet; |
57 |
import java.util.LinkedHashSet; |
|
|
58 |
import java.util.LinkedList; |
54 |
import java.util.List; |
59 |
import java.util.List; |
55 |
import java.util.Map; |
60 |
import java.util.Map; |
56 |
import java.util.Set; |
61 |
import java.util.Set; |
Lines 60-67
Link Here
|
60 |
import java.util.regex.Matcher; |
65 |
import java.util.regex.Matcher; |
61 |
import java.util.regex.Pattern; |
66 |
import java.util.regex.Pattern; |
62 |
import javax.swing.AbstractListModel; |
67 |
import javax.swing.AbstractListModel; |
|
|
68 |
import javax.swing.event.ChangeEvent; |
69 |
import javax.swing.event.ChangeListener; |
70 |
import org.netbeans.api.annotations.common.NonNull; |
63 |
import org.netbeans.api.java.platform.JavaPlatform; |
71 |
import org.netbeans.api.java.platform.JavaPlatform; |
64 |
import org.netbeans.api.java.platform.JavaPlatformManager; |
72 |
import org.netbeans.api.java.platform.JavaPlatformManager; |
|
|
73 |
import org.netbeans.api.project.FileOwnerQuery; |
65 |
import org.netbeans.api.project.Project; |
74 |
import org.netbeans.api.project.Project; |
66 |
import org.netbeans.api.project.ProjectManager; |
75 |
import org.netbeans.api.project.ProjectManager; |
67 |
import org.netbeans.api.project.libraries.Library; |
76 |
import org.netbeans.api.project.libraries.Library; |
Lines 74-79
Link Here
|
74 |
import org.netbeans.spi.project.support.ant.PropertyUtils; |
83 |
import org.netbeans.spi.project.support.ant.PropertyUtils; |
75 |
import org.netbeans.spi.project.support.ant.ReferenceHelper; |
84 |
import org.netbeans.spi.project.support.ant.ReferenceHelper; |
76 |
import org.openide.filesystems.FileObject; |
85 |
import org.openide.filesystems.FileObject; |
|
|
86 |
import org.openide.util.ChangeSupport; |
77 |
import org.openide.util.Exceptions; |
87 |
import org.openide.util.Exceptions; |
78 |
import org.openide.util.Lookup; |
88 |
import org.openide.util.Lookup; |
79 |
import static org.netbeans.modules.java.project.Bundle.*; |
89 |
import static org.netbeans.modules.java.project.Bundle.*; |
Lines 83-110
Link Here
|
83 |
|
93 |
|
84 |
private static final Logger LOG = Logger.getLogger(BrokenReferencesModel.class.getName()); |
94 |
private static final Logger LOG = Logger.getLogger(BrokenReferencesModel.class.getName()); |
85 |
|
95 |
|
86 |
private String[] props; |
96 |
final Context ctx; |
87 |
private String[] platformsProps; |
|
|
88 |
private AntProjectHelper helper; |
89 |
private ReferenceHelper resolver; |
90 |
private List<OneReference> references; |
97 |
private List<OneReference> references; |
91 |
|
98 |
|
92 |
public BrokenReferencesModel(AntProjectHelper helper, |
99 |
public BrokenReferencesModel(AntProjectHelper helper, |
93 |
ReferenceHelper resolver, String[] props, String[] platformsProps) { |
100 |
ReferenceHelper resolver, String[] props, String[] platformsProps) { |
94 |
this.props = props.clone(); |
101 |
this(new Context(new BrokenProject(helper, resolver, helper.getStandardPropertyEvaluator(), props, platformsProps))); |
95 |
this.platformsProps = platformsProps.clone(); |
102 |
} |
96 |
this.resolver = resolver; |
103 |
|
97 |
this.helper = helper; |
104 |
public BrokenReferencesModel(final @NonNull Context ctx) { |
|
|
105 |
assert ctx != null; |
106 |
this.ctx = ctx; |
98 |
references = new ArrayList<OneReference>(); |
107 |
references = new ArrayList<OneReference>(); |
99 |
refresh(); |
108 |
refresh(); |
|
|
109 |
ctx.addChangeListener(new ChangeListener() { |
110 |
@Override |
111 |
public void stateChanged(ChangeEvent e) { |
112 |
refresh(); |
113 |
} |
114 |
}); |
100 |
} |
115 |
} |
101 |
|
116 |
|
102 |
public void refresh() { |
117 |
public void refresh() { |
103 |
Set<OneReference> all = new LinkedHashSet<OneReference>(); |
118 |
Set<OneReference> all = new LinkedHashSet<OneReference>(); |
104 |
Set<OneReference> s = getReferences(helper, resolver, helper.getStandardPropertyEvaluator(), props, false); |
119 |
for (BrokenProject bprj : ctx.getBrokenProjects()) { |
105 |
all.addAll(s); |
120 |
Set<OneReference> s = getReferences(bprj, false); |
106 |
s = getPlatforms(helper.getStandardPropertyEvaluator(), platformsProps, false); |
121 |
all.addAll(s); |
107 |
all.addAll(s); |
122 |
s = getPlatforms(bprj, false); |
|
|
123 |
all.addAll(s); |
124 |
} |
108 |
updateReferencesList(references, all); |
125 |
updateReferencesList(references, all); |
109 |
this.fireContentsChanged(this, 0, getSize()); |
126 |
this.fireContentsChanged(this, 0, getSize()); |
110 |
} |
127 |
} |
Lines 158-176
Link Here
|
158 |
} |
175 |
} |
159 |
|
176 |
|
160 |
public static boolean isBroken(AntProjectHelper helper, ReferenceHelper refHelper, PropertyEvaluator evaluator, String[] props, String[] platformsProps) { |
177 |
public static boolean isBroken(AntProjectHelper helper, ReferenceHelper refHelper, PropertyEvaluator evaluator, String[] props, String[] platformsProps) { |
161 |
Set<OneReference> s = getReferences(helper, refHelper, evaluator, props, true); |
178 |
final BrokenProject bprj = new BrokenProject(helper, refHelper, evaluator, props, platformsProps); |
|
|
179 |
Set<OneReference> s = getReferences(bprj, true); |
162 |
if (s.size() > 0) { |
180 |
if (s.size() > 0) { |
163 |
return true; |
181 |
return true; |
164 |
} |
182 |
} |
165 |
s = getPlatforms(evaluator, platformsProps, true); |
183 |
s = getPlatforms(bprj, true); |
166 |
return s.size() > 0; |
184 |
return s.size() > 0; |
167 |
} |
185 |
} |
168 |
|
186 |
|
169 |
private static Set<OneReference> getReferences(AntProjectHelper helper, ReferenceHelper refHelper, PropertyEvaluator evaluator, String[] ps, boolean abortAfterFirstProblem) { |
187 |
private static Set<OneReference> getReferences(final BrokenProject bprj, final boolean abortAfterFirstProblem) { |
170 |
Set<OneReference> set = new LinkedHashSet<OneReference>(); |
188 |
Set<OneReference> set = new LinkedHashSet<OneReference>(); |
171 |
StringBuilder all = new StringBuilder(); |
189 |
StringBuilder all = new StringBuilder(); |
172 |
// this call waits for list of libraries to be refreshhed |
190 |
// this call waits for list of libraries to be refreshhed |
173 |
LibraryManager.getDefault().getLibraries(); |
191 |
LibraryManager.getDefault().getLibraries(); |
|
|
192 |
final AntProjectHelper helper = bprj.getAntProjectHelper(); |
193 |
final PropertyEvaluator evaluator = bprj.getEvaluator(); |
194 |
final ReferenceHelper refHelper = bprj.getReferenceHelper(); |
195 |
if (helper == null || evaluator == null || refHelper == null) { |
196 |
return set; |
197 |
} |
198 |
final String[] ps = bprj.getProperties(); |
174 |
EditableProperties ep = helper.getProperties(AntProjectHelper.PROJECT_PROPERTIES_PATH); |
199 |
EditableProperties ep = helper.getProperties(AntProjectHelper.PROJECT_PROPERTIES_PATH); |
175 |
for (String p : ps) { |
200 |
for (String p : ps) { |
176 |
// evaluate given property and tokenize it |
201 |
// evaluate given property and tokenize it |
Lines 193-199
Link Here
|
193 |
if (v.startsWith("${project.")) { // NOI18N |
218 |
if (v.startsWith("${project.")) { // NOI18N |
194 |
// something in the form: "${project.<projID>}/dist/foo.jar" |
219 |
// something in the form: "${project.<projID>}/dist/foo.jar" |
195 |
String val = v.substring(2, v.indexOf('}')); // NOI18N |
220 |
String val = v.substring(2, v.indexOf('}')); // NOI18N |
196 |
set.add(new OneReference(RefType.PROJECT, val, true)); |
221 |
set.add(new OneReference(bprj, RefType.PROJECT, val, true)); |
197 |
} else { |
222 |
} else { |
198 |
RefType type = RefType.LIBRARY; |
223 |
RefType type = RefType.LIBRARY; |
199 |
if (v.startsWith("${file.reference")) { // NOI18N |
224 |
if (v.startsWith("${file.reference")) { // NOI18N |
Lines 202-208
Link Here
|
202 |
type = RefType.VARIABLE; |
227 |
type = RefType.VARIABLE; |
203 |
} |
228 |
} |
204 |
String val = v.substring(2, v.length() - 1); |
229 |
String val = v.substring(2, v.length() - 1); |
205 |
set.add(new OneReference(type, val, true)); |
230 |
set.add(new OneReference(bprj, type, val, true)); |
206 |
} |
231 |
} |
207 |
if (abortAfterFirstProblem) { |
232 |
if (abortAfterFirstProblem) { |
208 |
break; |
233 |
break; |
Lines 229-235
Link Here
|
229 |
if (f.exists()) { |
254 |
if (f.exists()) { |
230 |
continue; |
255 |
continue; |
231 |
} |
256 |
} |
232 |
set.add(new OneReference(RefType.VARIABLE_CONTENT, v, true)); |
257 |
set.add(new OneReference(bprj, RefType.VARIABLE_CONTENT, v, true)); |
233 |
} |
258 |
} |
234 |
} |
259 |
} |
235 |
} |
260 |
} |
Lines 260-266
Link Here
|
260 |
if (all.indexOf(value) == -1) { |
285 |
if (all.indexOf(value) == -1) { |
261 |
continue; |
286 |
continue; |
262 |
} |
287 |
} |
263 |
set.add(new OneReference(RefType.PROJECT, key, true)); |
288 |
set.add(new OneReference(bprj, RefType.PROJECT, key, true)); |
264 |
} |
289 |
} |
265 |
else if (key.startsWith("file.reference")) { //NOI18N |
290 |
else if (key.startsWith("file.reference")) { //NOI18N |
266 |
File f = getFile(helper, evaluator, value); |
291 |
File f = getFile(helper, evaluator, value); |
Lines 269-275
Link Here
|
269 |
if (f.exists() || all.indexOf(value) == -1 || alreadyChecked) { // NOI18N |
294 |
if (f.exists() || all.indexOf(value) == -1 || alreadyChecked) { // NOI18N |
270 |
continue; |
295 |
continue; |
271 |
} |
296 |
} |
272 |
set.add(new OneReference(RefType.FILE, key, true)); |
297 |
set.add(new OneReference(bprj, RefType.FILE, key, true)); |
273 |
} |
298 |
} |
274 |
} |
299 |
} |
275 |
|
300 |
|
Lines 292-298
Link Here
|
292 |
Library lib = refHelper.findLibrary(libraryName); |
317 |
Library lib = refHelper.findLibrary(libraryName); |
293 |
if (lib == null) { |
318 |
if (lib == null) { |
294 |
// Should already have been caught before? |
319 |
// Should already have been caught before? |
295 |
set.add(new OneReference(RefType.LIBRARY, libraryRef, true)); |
320 |
set.add(new OneReference(bprj, RefType.LIBRARY, libraryRef, true)); |
296 |
} |
321 |
} |
297 |
else { |
322 |
else { |
298 |
//XXX: Should check all the volumes (sources, javadoc, ...)? |
323 |
//XXX: Should check all the volumes (sources, javadoc, ...)? |
Lines 303-309
Link Here
|
303 |
} |
328 |
} |
304 |
FileObject fo = LibrariesSupport.resolveLibraryEntryFileObject(lib.getManager().getLocation(), uri2); |
329 |
FileObject fo = LibrariesSupport.resolveLibraryEntryFileObject(lib.getManager().getLocation(), uri2); |
305 |
if (null == fo && !canResolveEvaluatedUri(helper.getStandardPropertyEvaluator(), lib.getManager().getLocation(), uri2)) { |
330 |
if (null == fo && !canResolveEvaluatedUri(helper.getStandardPropertyEvaluator(), lib.getManager().getLocation(), uri2)) { |
306 |
set.add(new OneReference(RefType.LIBRARY_CONTENT, libraryRef, true)); |
331 |
set.add(new OneReference(bprj, RefType.LIBRARY_CONTENT, libraryRef, true)); |
307 |
break; |
332 |
break; |
308 |
} |
333 |
} |
309 |
} |
334 |
} |
Lines 344-352
Link Here
|
344 |
} |
369 |
} |
345 |
} |
370 |
} |
346 |
|
371 |
|
347 |
private static Set<OneReference> getPlatforms(PropertyEvaluator evaluator, String[] platformsProps, boolean abortAfterFirstProblem) { |
372 |
private static Set<OneReference> getPlatforms(final BrokenProject bprj, boolean abortAfterFirstProblem) { |
348 |
Set<OneReference> set = new LinkedHashSet<OneReference>(); |
373 |
final Set<OneReference> set = new LinkedHashSet<OneReference>(); |
349 |
for (String pprop : platformsProps) { |
374 |
final PropertyEvaluator evaluator = bprj.getEvaluator(); |
|
|
375 |
if (evaluator == null) { |
376 |
return set; |
377 |
} |
378 |
for (String pprop : bprj.getPlatformProperties()) { |
350 |
String prop = evaluator.getProperty(pprop); |
379 |
String prop = evaluator.getProperty(pprop); |
351 |
if (prop == null) { |
380 |
if (prop == null) { |
352 |
continue; |
381 |
continue; |
Lines 360-366
Link Here
|
360 |
prop = evaluator.getProperty(pprop + ".description"); // NOI18N |
389 |
prop = evaluator.getProperty(pprop + ".description"); // NOI18N |
361 |
} |
390 |
} |
362 |
|
391 |
|
363 |
set.add(new OneReference(RefType.PLATFORM, prop, true)); |
392 |
set.add(new OneReference(bprj, RefType.PLATFORM, prop, true)); |
364 |
} |
393 |
} |
365 |
if (set.size() > 0 && abortAfterFirstProblem) { |
394 |
if (set.size() > 0 && abortAfterFirstProblem) { |
366 |
break; |
395 |
break; |
Lines 425-431
Link Here
|
425 |
} |
454 |
} |
426 |
|
455 |
|
427 |
private void updateReference0(int index, File file) { |
456 |
private void updateReference0(int index, File file) { |
428 |
final String reference = getOneReference(index).ID; |
457 |
final OneReference ref = getOneReference(index); |
|
|
458 |
final String reference = ref.ID; |
459 |
final AntProjectHelper helper = ref.bprj.getAntProjectHelper(); |
460 |
if (helper == null) { |
461 |
//Closed and freed project, ignore |
462 |
return; |
463 |
} |
429 |
FileObject myProjDirFO = helper.getProjectDirectory(); |
464 |
FileObject myProjDirFO = helper.getProjectDirectory(); |
430 |
final String propertiesFile = AntProjectHelper.PRIVATE_PROPERTIES_PATH; |
465 |
final String propertiesFile = AntProjectHelper.PRIVATE_PROPERTIES_PATH; |
431 |
final String path = file.getAbsolutePath(); |
466 |
final String path = file.getAbsolutePath(); |
Lines 457-465
Link Here
|
457 |
} |
492 |
} |
458 |
|
493 |
|
459 |
/** @return non-null library manager */ |
494 |
/** @return non-null library manager */ |
460 |
LibraryManager getProjectLibraryManager() { |
495 |
LibraryManager getProjectLibraryManager(@NonNull final OneReference or) { |
461 |
return resolver.getProjectLibraryManager() != null ? |
496 |
assert or != null; |
462 |
resolver.getProjectLibraryManager() : LibraryManager.getDefault(); |
497 |
final ReferenceHelper resolver = or.bprj.getReferenceHelper(); |
|
|
498 |
return resolver == null ? null : |
499 |
resolver.getProjectLibraryManager() != null ? |
500 |
resolver.getProjectLibraryManager() : LibraryManager.getDefault(); |
463 |
} |
501 |
} |
464 |
|
502 |
|
465 |
enum RefType { |
503 |
enum RefType { |
Lines 474-486
Link Here
|
474 |
} |
512 |
} |
475 |
|
513 |
|
476 |
public static final class OneReference { |
514 |
public static final class OneReference { |
477 |
|
515 |
|
|
|
516 |
private final BrokenProject bprj; |
478 |
private final RefType type; |
517 |
private final RefType type; |
479 |
private boolean broken; |
518 |
private boolean broken; |
480 |
private final String ID; |
519 |
private final String ID; |
481 |
private final Callable<Library> definer; |
520 |
private final Callable<Library> definer; |
482 |
|
521 |
|
483 |
public OneReference(RefType type, String ID, boolean broken) { |
522 |
OneReference( |
|
|
523 |
@NonNull final BrokenProject bprj, |
524 |
@NonNull RefType type, |
525 |
@NonNull final String ID, |
526 |
final boolean broken) { |
527 |
assert bprj != null; |
484 |
Callable<Library> _definer = null; |
528 |
Callable<Library> _definer = null; |
485 |
if (type == RefType.LIBRARY) { |
529 |
if (type == RefType.LIBRARY) { |
486 |
String name = ID.substring(5, ID.length() - 10); |
530 |
String name = ID.substring(5, ID.length() - 10); |
Lines 492-497
Link Here
|
492 |
} |
536 |
} |
493 |
} |
537 |
} |
494 |
} |
538 |
} |
|
|
539 |
this.bprj = bprj; |
495 |
this.type = type; |
540 |
this.type = type; |
496 |
this.ID = ID; |
541 |
this.ID = ID; |
497 |
this.broken = broken; |
542 |
this.broken = broken; |
Lines 560-564
Link Here
|
560 |
} |
605 |
} |
561 |
|
606 |
|
562 |
} |
607 |
} |
|
|
608 |
|
609 |
public static final class BrokenProject { |
610 |
private final Reference<AntProjectHelper> helper; |
611 |
private final Reference<ReferenceHelper> referenceHelper; |
612 |
private final Reference<PropertyEvaluator> evaluator; |
613 |
private final String[] properties; |
614 |
private final String[] platformProperties; |
615 |
|
616 |
public BrokenProject( |
617 |
@NonNull final AntProjectHelper helper, |
618 |
@NonNull final ReferenceHelper referenceHelper, |
619 |
@NonNull final PropertyEvaluator evaluator, |
620 |
@NonNull final String[] properties, |
621 |
@NonNull final String[] platformProperties) { |
622 |
assert helper != null; |
623 |
assert referenceHelper != null; |
624 |
assert properties != null; |
625 |
assert platformProperties != null; |
626 |
this.helper = new WeakReference<AntProjectHelper>(helper); |
627 |
this.referenceHelper = new WeakReference<ReferenceHelper>(referenceHelper); |
628 |
this.evaluator = new WeakReference<PropertyEvaluator>(evaluator); |
629 |
this.properties = Arrays.copyOf(properties, properties.length); |
630 |
this.platformProperties = Arrays.copyOf(platformProperties, platformProperties.length); |
631 |
} |
632 |
|
633 |
AntProjectHelper getAntProjectHelper() { |
634 |
return helper.get(); |
635 |
} |
636 |
|
637 |
ReferenceHelper getReferenceHelper() { |
638 |
return referenceHelper.get(); |
639 |
} |
640 |
|
641 |
PropertyEvaluator getEvaluator() { |
642 |
return evaluator.get(); |
643 |
} |
644 |
|
645 |
String[] getProperties() { |
646 |
return this.properties; |
647 |
} |
648 |
|
649 |
String[] getPlatformProperties() { |
650 |
return this.platformProperties; |
651 |
} |
652 |
} |
653 |
|
654 |
public static final class Context { |
655 |
private final List<BrokenProject> toResolve; |
656 |
private final ChangeSupport support; |
657 |
|
658 |
public Context() { |
659 |
toResolve = Collections.synchronizedList(new LinkedList<BrokenProject>()); |
660 |
support = new ChangeSupport(this); |
661 |
} |
662 |
|
663 |
private Context(final @NonNull BrokenProject broken) { |
664 |
this(); |
665 |
this.offer(broken); |
666 |
} |
667 |
|
668 |
public void offer(final BrokenProject broken) { |
669 |
assert broken != null; |
670 |
this.toResolve.add(broken); |
671 |
support.fireChange(); |
672 |
} |
673 |
|
674 |
public boolean isEmpty() { |
675 |
return this.toResolve.isEmpty(); |
676 |
} |
677 |
|
678 |
public BrokenProject[] getBrokenProjects() { |
679 |
synchronized (toResolve) { |
680 |
return toResolve.toArray(new BrokenProject[toResolve.size()]); |
681 |
} |
682 |
} |
683 |
|
684 |
public void addChangeListener(final @NonNull ChangeListener listener) { |
685 |
assert listener != null; |
686 |
support.addChangeListener(listener); |
687 |
} |
688 |
|
689 |
public void removeChangeListener(final @NonNull ChangeListener listener) { |
690 |
assert listener != null; |
691 |
support.removeChangeListener(listener); |
692 |
} |
693 |
} |
563 |
|
694 |
|
564 |
} |
695 |
} |