[hg] main-silver: JDK 8 Profiles Conformance Analyzer.

  • From: Tomas Zezula < >
  • To: , , ,
  • Subject: [hg] main-silver: JDK 8 Profiles Conformance Analyzer.
  • Date: Fri, 26 Apr 2013 11:10:40 -0700

changeset 57ba27656a0f in main-silver (jdk_profiles)
details: http://hg.netbeans.org/main-silver/rev/57ba27656a0f
description:
        JDK 8 Profiles Conformance Analyzer.

diffstat:

 code.analysis/manifest.mf                                                    
             |    2 +-
 code.analysis/nbproject/project.properties                                   
             |    2 +-
 code.analysis/nbproject/project.xml                                          
             |    1 +
 code.analysis/src/org/netbeans/modules/analysis/AnalysisResult.java          
             |    5 +-
 code.analysis/src/org/netbeans/modules/analysis/RunAnalysis.java             
             |   13 +-
 code.analysis/src/org/netbeans/modules/analysis/SPIAccessor.java             
             |    8 +
 code.analysis/src/org/netbeans/modules/analysis/spi/Analyzer.java            
             |   68 +
 
code.analysis/src/org/netbeans/modules/analysis/ui/AnalysisResultTopComponent.java
        |    4 +-
 code.analysis/src/org/netbeans/modules/analysis/ui/Nodes.java                
             |   67 +-
 
java.api.common/src/org/netbeans/modules/java/api/common/project/ui/ActionFilterNode.java
 |    3 +
 
java.api.common/src/org/netbeans/modules/java/api/common/project/ui/ProjectNode.java
      |   16 +-
 java.j2seprofiles/build.xml                                                  
             |    5 +
 java.j2seprofiles/manifest.mf                                                
             |    5 +
 java.j2seprofiles/nbproject/project.properties                               
             |    2 +
 java.j2seprofiles/nbproject/project.xml                                      
             |  131 ++
 
java.j2seprofiles/src/org/netbeans/modules/java/j2seprofiles/Bundle.properties
            |    1 +
 parsing.api/src/org/netbeans/modules/parsing/impl/indexing/Pair.java         
             |    8 +-
 
java.j2seprofiles/src/org/netbeans/modules/java/j2seprofiles/ProfilesAnalyzer.java
        |  586 ++++++++++
 javawebstart/src/org/netbeans/modules/javawebstart/resources/jnlp.gif        
             |    0 
 java.source/src/org/netbeans/api/java/source/support/ProfileSupport.java     
             |   42 +-
 java.source/src/org/netbeans/modules/java/source/parsing/JavacParser.java    
             |    3 +-
 lib.nbjavac/nbproject/project.properties                                     
             |    2 +-
 lib.nbjavac/src/org/netbeans/lib/nbjavac/services/NBClassWriter.java         
             |   11 +
 lib.nbjavac/src/org/netbeans/lib/nbjavac/services/NBMessager.java            
             |  128 ++
 nbbuild/cluster.properties                                                   
             |    1 +
 25 files changed, 1082 insertions(+), 32 deletions(-)

diffs (1579 lines):

diff --git a/code.analysis/manifest.mf b/code.analysis/manifest.mf
--- a/code.analysis/manifest.mf
+++ b/code.analysis/manifest.mf
@@ -2,5 +2,5 @@
 OpenIDE-Module: org.netbeans.modules.code.analysis/0
 OpenIDE-Module-Localizing-Bundle: 
org/netbeans/modules/analysis/Bundle.properties
 OpenIDE-Module-Requires: org.openide.windows.WindowManager
-OpenIDE-Module-Specification-Version: 1.15
+OpenIDE-Module-Specification-Version: 1.16
 
diff --git a/code.analysis/nbproject/project.properties 
b/code.analysis/nbproject/project.properties
--- a/code.analysis/nbproject/project.properties
+++ b/code.analysis/nbproject/project.properties
@@ -1,4 +1,4 @@
 is.autoload=true
-javac.source=1.6
+javac.source=1.7
 javac.compilerargs=-Xlint -Xlint:-serial
 javadoc.arch=${basedir}/arch.xml
diff --git a/code.analysis/nbproject/project.xml 
b/code.analysis/nbproject/project.xml
--- a/code.analysis/nbproject/project.xml
+++ b/code.analysis/nbproject/project.xml
@@ -218,6 +218,7 @@
                 <friend>org.netbeans.modules.findbugs.installer</friend>
                 <friend>org.netbeans.modules.java.hints</friend>
                 <friend>org.netbeans.modules.java.hints.ui</friend>
+                <friend>org.netbeans.modules.java.j2seprofiles</friend>
                 <friend>org.netbeans.modules.latex.hints</friend>
                 <friend>org.netbeans.modules.php.code.analysis</friend>
                 <friend>org.netbeans.spi.java.hints</friend>
diff --git 
a/code.analysis/src/org/netbeans/modules/analysis/AnalysisResult.java 
b/code.analysis/src/org/netbeans/modules/analysis/AnalysisResult.java
--- a/code.analysis/src/org/netbeans/modules/analysis/AnalysisResult.java
+++ b/code.analysis/src/org/netbeans/modules/analysis/AnalysisResult.java
@@ -44,6 +44,7 @@
 import java.util.Collection;
 import java.util.List;
 import java.util.Map;
+import org.netbeans.api.project.Project;
 import org.netbeans.modules.analysis.RunAnalysisPanel.FutureWarnings;
 import org.netbeans.modules.analysis.spi.Analyzer.AnalyzerFactory;
 import org.netbeans.spi.editor.hints.ErrorDescription;
@@ -56,11 +57,13 @@
 public class AnalysisResult {
 
     public final Map<AnalyzerFactory, List<ErrorDescription>> provider2Hints;
+    public final Map<ErrorDescription, Project> errorsToProjects;
     public final FutureWarnings analyzerId2Description;
     public final Collection<Node> extraNodes;
 
-    public AnalysisResult(Map<AnalyzerFactory, List<ErrorDescription>> 
provider2Hints, FutureWarnings analyzerId2Description, Collection<Node> 
extraNodes) {
+    public AnalysisResult(Map<AnalyzerFactory, List<ErrorDescription>> 
provider2Hints, Map<ErrorDescription, Project> errorsToProjects, 
FutureWarnings analyzerId2Description, Collection<Node> extraNodes) {
         this.provider2Hints = provider2Hints;
+        this.errorsToProjects = errorsToProjects;
         this.analyzerId2Description = analyzerId2Description;
         this.extraNodes = extraNodes;
     }
diff --git a/code.analysis/src/org/netbeans/modules/analysis/RunAnalysis.java 
b/code.analysis/src/org/netbeans/modules/analysis/RunAnalysis.java
--- a/code.analysis/src/org/netbeans/modules/analysis/RunAnalysis.java
+++ b/code.analysis/src/org/netbeans/modules/analysis/RunAnalysis.java
@@ -77,6 +77,7 @@
 import org.netbeans.modules.analysis.spi.Analyzer.AnalyzerFactory;
 import org.netbeans.modules.analysis.spi.Analyzer.Context;
 import org.netbeans.modules.analysis.spi.Analyzer.MissingPlugin;
+import org.netbeans.modules.analysis.spi.Analyzer.Result;
 import org.netbeans.modules.analysis.ui.AnalysisProblemNode;
 import org.netbeans.modules.analysis.ui.AnalysisResultTopComponent;
 import org.netbeans.modules.analysis.ui.RequiredPluginsNode;
@@ -148,6 +149,7 @@
                         progress.switchToDeterminate(MAX_WORK);
 
                         final Map<AnalyzerFactory, List<ErrorDescription>> 
result = new HashMap<AnalyzerFactory, List<ErrorDescription>>();
+                        final Map<ErrorDescription, Project> 
errorsToProjects = new HashMap<>();
                         Collection<MissingPlugin> missingPlugins = new 
ArrayList<MissingPlugin>();
                         Collection<AnalysisProblem> additionalProblems = new 
ArrayList<AnalysisProblem>();
                         
@@ -156,11 +158,11 @@
                             int bucketSize = MAX_WORK / analyzers.size();
                             for (AnalyzerFactory analyzer : analyzers) {
                                 if (doCancel.get()) break;
-                                doRunAnalyzer(analyzer, scope, progress, 
doneSoFar, bucketSize, result, missingPlugins, additionalProblems);
+                                doRunAnalyzer(analyzer, scope, progress, 
doneSoFar, bucketSize, result, errorsToProjects, missingPlugins, 
additionalProblems);
                                 doneSoFar += bucketSize;
                             }
                         } else if (!doCancel.get()) {
-                            doRunAnalyzer(toRun, scope, progress, 0, 
MAX_WORK, result, missingPlugins, additionalProblems);
+                            doRunAnalyzer(toRun, scope, progress, 0, 
MAX_WORK, result, errorsToProjects, missingPlugins, additionalProblems);
                         }
 
                         final Collection<Node> extraNodes = new 
ArrayList<Node>();
@@ -177,7 +179,7 @@
                             @Override public void run() {
                                 if (!doCancel.get()) {
                                     AnalysisResultTopComponent resultWindow 
= AnalysisResultTopComponent.findInstance();
-                                    resultWindow.setData(context, 
dialogState, new AnalysisResult(result, analyzerId2Description, extraNodes));
+                                    resultWindow.setData(context, 
dialogState, new AnalysisResult(result, errorsToProjects, 
analyzerId2Description, extraNodes));
                                     resultWindow.open();
                                     resultWindow.requestActive();
                                 }
@@ -190,16 +192,17 @@
                         });
                     }
 
-                    private void doRunAnalyzer(AnalyzerFactory analyzer, 
Scope scope, ProgressHandle handle, int bucketStart, int bucketSize, final 
Map<AnalyzerFactory, List<ErrorDescription>> result, 
Collection<MissingPlugin> missingPlugins, Collection<AnalysisProblem> 
additionalProblems) {
+                    private void doRunAnalyzer(AnalyzerFactory analyzer, 
Scope scope, ProgressHandle handle, int bucketStart, int bucketSize, final 
Map<AnalyzerFactory, List<ErrorDescription>> result, final 
Map<ErrorDescription, Project> errorsToProjects, Collection<MissingPlugin> 
missingPlugins, Collection<AnalysisProblem> additionalProblems) {
                         List<ErrorDescription> current = new 
ArrayList<ErrorDescription>();
                         Preferences settings = configuration != null ? 
configuration.getPreferences().node(SPIAccessor.ACCESSOR.getAnalyzerId(analyzer))
 : null;
                         Context context = 
SPIAccessor.ACCESSOR.createContext(scope, settings, singleWarningId, handle, 
bucketStart, bucketSize);
+                        Result resCollector = 
SPIAccessor.ACCESSOR.createResult(current, errorsToProjects, 
additionalProblems);
                         Collection<? extends MissingPlugin> requiredPlugins 
= analyzer.requiredPlugins(context);
                         if (!requiredPlugins.isEmpty()) {
                             missingPlugins.addAll(requiredPlugins);
                             return ;
                         }
-                        Analyzer a = analyzer.createAnalyzer(context);
+                        Analyzer a = analyzer.createAnalyzer(context, 
resCollector);                        
                         currentlyRunning.set(a);
                         if (doCancel.get()) return;
                         long s = System.currentTimeMillis();
diff --git a/code.analysis/src/org/netbeans/modules/analysis/SPIAccessor.java 
b/code.analysis/src/org/netbeans/modules/analysis/SPIAccessor.java
--- a/code.analysis/src/org/netbeans/modules/analysis/SPIAccessor.java
+++ b/code.analysis/src/org/netbeans/modules/analysis/SPIAccessor.java
@@ -43,15 +43,21 @@
 
 import java.awt.Image;
 import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
 import java.util.prefs.Preferences;
 import org.netbeans.api.progress.ProgressHandle;
+import org.netbeans.api.project.Project;
 import org.netbeans.modules.analysis.spi.Analyzer;
 import org.netbeans.modules.analysis.spi.Analyzer.AnalyzerFactory;
 import org.netbeans.modules.analysis.spi.Analyzer.Context;
 import org.netbeans.modules.analysis.spi.Analyzer.CustomizerContext;
 import org.netbeans.modules.analysis.spi.Analyzer.MissingPlugin;
+import org.netbeans.modules.analysis.spi.Analyzer.Result;
 import org.netbeans.modules.analysis.spi.Analyzer.WarningDescription;
 import org.netbeans.modules.refactoring.api.Scope;
+import org.netbeans.spi.editor.hints.ErrorDescription;
 import org.openide.util.Exceptions;
 
 /**
@@ -72,6 +78,8 @@
 
     public abstract Context createContext(Scope scope, Preferences settings, 
String singleWarningId, ProgressHandle progress, int bucketStart, int 
bucketSize);
 
+    public abstract Result createResult(List<ErrorDescription> errors, 
Map<ErrorDescription, Project> errorsToProjects, Collection<AnalysisProblem> 
analysisProblems);
+
     public abstract String getDisplayName(MissingPlugin missing);
 
     public abstract String getCNB(MissingPlugin missing);
diff --git 
a/code.analysis/src/org/netbeans/modules/analysis/spi/Analyzer.java 
b/code.analysis/src/org/netbeans/modules/analysis/spi/Analyzer.java
--- a/code.analysis/src/org/netbeans/modules/analysis/spi/Analyzer.java
+++ b/code.analysis/src/org/netbeans/modules/analysis/spi/Analyzer.java
@@ -45,10 +45,14 @@
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
+import java.util.List;
+import java.util.Map;
 import java.util.prefs.Preferences;
 import javax.swing.JComponent;
 import org.netbeans.api.annotations.common.CheckForNull;
+import org.netbeans.api.annotations.common.NonNull;
 import org.netbeans.api.progress.ProgressHandle;
+import org.netbeans.api.project.Project;
 import org.netbeans.modules.analysis.AnalysisProblem;
 import org.netbeans.modules.analysis.SPIAccessor;
 import org.netbeans.modules.refactoring.api.Scope;
@@ -127,10 +131,69 @@
          */
         public abstract Analyzer createAnalyzer(Context context);
 
+        /**
+         * Creates a new {@link Analyzer} with a context and warning 
collector.
+         * @param context the {@link Context} of the analysis
+         * @param result the warning collector
+         * @return the {@link Analyzer}
+         * @since 1.16
+         */
+        public Analyzer createAnalyzer(Context context, Result result) {
+            return createAnalyzer(context);
+        }
+
         //XXX: should be protected
         public void warningOpened(ErrorDescription warning) {}
     }
 
+    /**
+     * Collector of the analysis problems.
+     * The waring added into the {@link Result} are merged with
+     * warnings returned by the {@link Analyzer#analyze()} methods.
+     * @since 1.16
+     */
+    public static final class Result {
+                
+        private final List<ErrorDescription> errors;
+        private final Map<ErrorDescription, Project> errorsToProjects;
+        private final Collection<AnalysisProblem> analysisProblems;
+
+        Result(List<ErrorDescription> errors, Map<ErrorDescription, Project> 
errorsToProjects, Collection<AnalysisProblem> analysisProblems) {
+            this.errors = errors;
+            this.errorsToProjects = errorsToProjects;
+            this.analysisProblems = analysisProblems;
+        }
+
+        /**
+         * Reports an analysis problem.
+         * @param displayName the display name of the problem
+         * @param description the more detailed description of the problem
+         */
+        public void reportAnalysisProblem(String displayName, CharSequence 
description) {
+            analysisProblems.add(new AnalysisProblem(displayName, 
description));
+        }
+
+        /**
+         * Reports a new warning.
+         * @param errorDescription the warning
+         */
+        public void reportError(@NonNull final ErrorDescription 
errorDescription) {
+            errors.add(errorDescription);
+        }
+
+        /**
+         * Reports a new warning related to the given project.
+         * The method should be used only for warning in project dependencies
+         * which are not owned by analyzed project.
+         * @param owner the project to which the problem is related
+         * @param errorDescription the warning
+         */
+        public void reportError(@NonNull final Project owner, @NonNull final 
ErrorDescription errorDescription) {
+            errors.add(errorDescription);            
+            errorsToProjects.put(errorDescription, owner);
+        }
+    }
+
     public static final class Context {
         private final Scope scope;
         private final Preferences settings;
@@ -198,6 +261,11 @@
                 }
 
                 @Override
+                public Result createResult(List<ErrorDescription> errors, 
Map<ErrorDescription, Project> errorsToProjects, Collection<AnalysisProblem> 
analysisProblem) {
+                    return new Result(errors, errorsToProjects, 
analysisProblem);
+                }
+
+                @Override
                 public String getDisplayName(MissingPlugin missing) {
                     return missing.displayName;
                 }
diff --git 
a/code.analysis/src/org/netbeans/modules/analysis/ui/AnalysisResultTopComponent.java
 
b/code.analysis/src/org/netbeans/modules/analysis/ui/AnalysisResultTopComponent.java
--- 
a/code.analysis/src/org/netbeans/modules/analysis/ui/AnalysisResultTopComponent.java
+++ 
b/code.analysis/src/org/netbeans/modules/analysis/ui/AnalysisResultTopComponent.java
@@ -58,6 +58,7 @@
 import javax.swing.event.HyperlinkListener;
 import javax.swing.text.html.HTMLEditorKit;
 import javax.swing.text.html.StyleSheet;
+import org.netbeans.api.project.Project;
 import org.netbeans.api.settings.ConvertAsProperties;
 import org.netbeans.modules.analysis.AnalysisResult;
 import org.netbeans.modules.analysis.DescriptionReader;
@@ -67,7 +68,6 @@
 import org.netbeans.modules.analysis.spi.Analyzer.AnalyzerFactory;
 import org.netbeans.spi.editor.hints.ErrorDescription;
 import org.openide.awt.ActionID;
-import org.openide.awt.ActionReference;
 import org.openide.awt.HtmlBrowser.URLDisplayer;
 import org.openide.explorer.ExplorerManager;
 import org.openide.explorer.view.BeanTreeView;
@@ -125,7 +125,7 @@
         prevAction.addPropertyChangeListener(l);
         nextAction.addPropertyChangeListener(l);
 
-        setData(Lookup.EMPTY, null, new 
AnalysisResult(Collections.<AnalyzerFactory, 
List<ErrorDescription>>emptyMap(), new FutureWarnings(), 
Collections.<Node>emptyList()));
+        setData(Lookup.EMPTY, null, new 
AnalysisResult(Collections.<AnalyzerFactory, 
List<ErrorDescription>>emptyMap(), Collections.<ErrorDescription, 
Project>emptyMap(), new FutureWarnings(), Collections.<Node>emptyList()));
 
         getActionMap().put("jumpNext", nextAction);
         getActionMap().put("jumpPrev", prevAction);
diff --git a/code.analysis/src/org/netbeans/modules/analysis/ui/Nodes.java 
b/code.analysis/src/org/netbeans/modules/analysis/ui/Nodes.java
--- a/code.analysis/src/org/netbeans/modules/analysis/ui/Nodes.java
+++ b/code.analysis/src/org/netbeans/modules/analysis/ui/Nodes.java
@@ -51,6 +51,7 @@
 import java.util.Comparator;
 import java.util.HashMap;
 import java.util.IdentityHashMap;
+import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
@@ -82,6 +83,7 @@
 import org.openide.text.Line;
 import org.openide.text.Line.ShowOpenType;
 import org.openide.text.Line.ShowVisibilityType;
+import org.openide.text.PositionBounds;
 import org.openide.util.Exceptions;
 import org.openide.util.Lookup;
 import org.openide.util.lookup.Lookups;
@@ -112,7 +114,7 @@
         }
         
         if (!byCategory) {
-            toPopulate.addAll(constructSemiLogicalViewNodes(new 
LogicalViewCache(), sortErrors(errors.provider2Hints, BY_FILE)));
+            toPopulate.addAll(constructSemiLogicalViewNodes(new 
LogicalViewCache(), sortErrors(errors.provider2Hints, BY_FILE), 
errors.errorsToProjects));
         } else {
 //            Map<AnalyzerFactory, Map<String, WarningDescription>> 
analyzerId2Description = new HashMap<AnalyzerFactory, Map<String, 
WarningDescription>>();
             Map<String, Map<AnalyzerFactory, List<ErrorDescription>>> 
byCategoryId = sortErrors(errors.provider2Hints, new 
ByCategoryRetriever(errors.analyzerId2Description.get()));
@@ -137,7 +139,7 @@
                     }
 
                     final String typeHtmlDisplayName = (typeDisplayName != 
null ? translate(typeDisplayName) : "Unknown") + " <b>(" + typeWarnings + 
")</b>";
-                    AbstractNode typeNode = new 
AbstractNode(constructSemiLogicalViewChildren(lvc, 
sortErrors(typeEntry.getValue(), BY_FILE))) {
+                    AbstractNode typeNode = new 
AbstractNode(constructSemiLogicalViewChildren(lvc, 
sortErrors(typeEntry.getValue(), BY_FILE), errors.errorsToProjects)) {
                         @Override public Image getIcon(int type) {
                             return icon;
                         }
@@ -266,10 +268,10 @@
         return warnings != null ? warnings.get(id) : null;
     }
 
-    private static Children constructSemiLogicalViewChildren(final 
LogicalViewCache lvc, final Map<FileObject, Map<AnalyzerFactory, 
List<ErrorDescription>>> errors) {
+    private static Children constructSemiLogicalViewChildren(final 
LogicalViewCache lvc, final Map<FileObject, Map<AnalyzerFactory, 
List<ErrorDescription>>> errors, final Map<ErrorDescription,Project> 
errorsToProjects) {
         return Children.create(new ChildFactory<Node>() {
             @Override protected boolean createKeys(List<Node> toPopulate) {
-                toPopulate.addAll(constructSemiLogicalViewNodes(lvc, 
errors));
+                toPopulate.addAll(constructSemiLogicalViewNodes(lvc, errors, 
errorsToProjects));
                 return true;
             }
             @Override protected Node createNodeForKey(Node key) {
@@ -278,12 +280,45 @@
         }, true);
     }
 
-    private static List<Node> constructSemiLogicalViewNodes(LogicalViewCache 
lvc, Map<FileObject, Map<AnalyzerFactory, List<ErrorDescription>>> errors) {
+    private static List<Node> constructSemiLogicalViewNodes(LogicalViewCache 
lvc, Map<FileObject, Map<AnalyzerFactory, List<ErrorDescription>>> errors, 
Map<ErrorDescription, Project> errorsToProjects) {
         Map<Project, Map<FileObject, Map<AnalyzerFactory, 
List<ErrorDescription>>>> projects = new IdentityHashMap<Project, 
Map<FileObject, Map<AnalyzerFactory, List<ErrorDescription>>>>();
         
-        for (FileObject file : errors.keySet()) {
+        for (Map.Entry<FileObject, Map<AnalyzerFactory, 
List<ErrorDescription>>> fileEntry : errors.entrySet()) {
+            if (!errorsToProjects.isEmpty()) {
+                for 
(Iterator<Map.Entry<AnalyzerFactory,List<ErrorDescription>>> analyzerEntryIt 
= fileEntry.getValue().entrySet().iterator(); analyzerEntryIt.hasNext();) {
+                    final Map.Entry<AnalyzerFactory,List<ErrorDescription>> 
analyzerEntry = analyzerEntryIt.next();
+                    for (Iterator<ErrorDescription> errorIt = 
analyzerEntry.getValue().iterator(); errorIt.hasNext();) {
+                        final ErrorDescription error = errorIt.next();
+                        Project project = errorsToProjects.get(error);
+                        if (project != null) {
+                            Map<FileObject, Map<AnalyzerFactory, 
List<ErrorDescription>>> projectErrors = projects.get(project);
+                            if (projectErrors == null) {
+                                projects.put(project, projectErrors = new 
HashMap<>());
+                            }
+                            Map<AnalyzerFactory, List<ErrorDescription>> 
analyzerErrors = projectErrors.get(fileEntry.getKey());
+                            if (analyzerErrors == null) {
+                                analyzerErrors = new HashMap<>();
+                                projectErrors.put(fileEntry.getKey(), 
analyzerErrors);
+                            }
+                            List<ErrorDescription> errorList = 
analyzerErrors.get(analyzerEntry.getKey());
+                            if (errorList == null) {
+                                errorList = new ArrayList<>();
+                                analyzerErrors.put(analyzerEntry.getKey(), 
errorList);
+                            }
+                            errorList.add(error);
+                            errorIt.remove();
+                        }
+                    }
+                    if (analyzerEntry.getValue().isEmpty()) {
+                        analyzerEntryIt.remove();
+                    }
+                }
+            }
+            if (fileEntry.getValue().isEmpty()) {
+                continue;
+            }
+            final FileObject file = fileEntry.getKey();
             Project project = FileOwnerQuery.getOwner(file);
-            
             if (project == null) {
                 Logger.getLogger(Nodes.class.getName()).log(Level.WARNING, 
"Cannot find project for: {0}", FileUtil.getFileDisplayName(file));
             }
@@ -548,7 +583,18 @@
             Collections.sort(eds, new Comparator<ErrorDescription>() {
                 @Override public int compare(ErrorDescription o1, 
ErrorDescription o2) {
                     try {
-                        return o1.getRange().getBegin().getLine() - 
o2.getRange().getBegin().getLine();
+                        final PositionBounds r1 = o1.getRange();
+                        final PositionBounds r2 = o2.getRange();
+                        if (r1 != null) {
+                            return r2 != null ?
+                                r1.getBegin().getLine() - 
r2.getBegin().getLine() :
+                                -1;
+                        } else {
+                            return r2 != null ?
+                                1 :
+                                
o1.getDescription().compareTo(o2.getDescription());
+                        }
+                        
                     } catch (IOException ex) {
                         throw new IllegalStateException(ex); //XXX
                     }
@@ -577,7 +623,10 @@
             }));
             int line = -1;
             try {
-                line = ed.getRange().getBegin().getLine();
+                final PositionBounds range = ed.getRange();
+                if (range != null) {
+                    line = range.getBegin().getLine();
+                }
             } catch (IOException ex) {
                 Exceptions.printStackTrace(ex);
             }
diff --git 
a/java.api.common/src/org/netbeans/modules/java/api/common/project/ui/ActionFilterNode.java
 
b/java.api.common/src/org/netbeans/modules/java/api/common/project/ui/ActionFilterNode.java
--- 
a/java.api.common/src/org/netbeans/modules/java/api/common/project/ui/ActionFilterNode.java
+++ 
b/java.api.common/src/org/netbeans/modules/java/api/common/project/ui/ActionFilterNode.java
@@ -723,6 +723,9 @@
                     }
                 }
             }
+            if (FileUtil.isParentOf(binRoot, sourceTarget) || 
binRoot.equals(sourceTarget))  {
+                return sourceTarget;
+            }
             ignore(sourceTarget.toURI(), binRoot.toURI());
             return null;
         }
diff --git 
a/java.api.common/src/org/netbeans/modules/java/api/common/project/ui/ProjectNode.java
 
b/java.api.common/src/org/netbeans/modules/java/api/common/project/ui/ProjectNode.java
--- 
a/java.api.common/src/org/netbeans/modules/java/api/common/project/ui/ProjectNode.java
+++ 
b/java.api.common/src/org/netbeans/modules/java/api/common/project/ui/ProjectNode.java
@@ -74,6 +74,7 @@
 import org.netbeans.api.java.queries.JavadocForBinaryQuery;
 import org.netbeans.modules.java.api.common.ant.UpdateHelper;
 import org.netbeans.spi.project.support.ant.ReferenceHelper;
+import org.netbeans.spi.project.ui.PathFinder;
 import org.openide.filesystems.FileObject;
 import org.openide.util.Exceptions;
 import org.openide.util.Lookup;
@@ -190,9 +191,10 @@
             content = new Object[1];
         }
         else {
-            content = new Object[3];
+            content = new Object[4];
             content[1] = new JavadocProvider(antArtifact, artifactLocation);
             content[2] = p;
+            content[3] = new PathFinderImpl();  //Needed by Source Inspect 
View to display errors in project reference
         }
         content[0] = new ActionFilterNode.Removable(helper, classPathId, 
entryId, webModuleElementName, cs, rh);
         Lookup lkp = Lookups.fixed(content);
@@ -308,4 +310,16 @@
         }
     }
 
+    private static final class PathFinderImpl implements PathFinder {
+
+        @Override
+        public Node findPath(Node root, Object target) {
+            final Project p = root.getLookup().lookup(Project.class);
+            if (p != null && p.getProjectDirectory().equals(target)) {
+                return root;
 }
+            return null;
+        }
+    }
+
+}
diff --git a/java.j2seprofiles/build.xml b/java.j2seprofiles/build.xml
new file mode 100644
--- /dev/null
+++ b/java.j2seprofiles/build.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project basedir="." default="netbeans" name="java.j2seprofiles">
+    <description>Builds, tests, and runs the project 
org.netbeans.modules.java.j2seprofiles</description>
+    <import file="../nbbuild/templates/projectized.xml"/>
+</project>
diff --git a/java.j2seprofiles/manifest.mf b/java.j2seprofiles/manifest.mf
new file mode 100644
--- /dev/null
+++ b/java.j2seprofiles/manifest.mf
@@ -0,0 +1,5 @@
+Manifest-Version: 1.0
+OpenIDE-Module: org.netbeans.modules.java.j2seprofiles
+OpenIDE-Module-Localizing-Bundle: 
org/netbeans/modules/java/j2seprofiles/Bundle.properties
+OpenIDE-Module-Specification-Version: 1.0
+
diff --git a/java.j2seprofiles/nbproject/project.properties 
b/java.j2seprofiles/nbproject/project.properties
new file mode 100644
--- /dev/null
+++ b/java.j2seprofiles/nbproject/project.properties
@@ -0,0 +1,2 @@
+javac.source=1.7
+javac.compilerargs=-Xlint -Xlint:-serial
diff --git a/java.j2seprofiles/nbproject/project.xml 
b/java.j2seprofiles/nbproject/project.xml
new file mode 100644
--- /dev/null
+++ b/java.j2seprofiles/nbproject/project.xml
@@ -0,0 +1,131 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://www.netbeans.org/ns/project/1";>
+    <type>org.netbeans.modules.apisupport.project</type>
+    <configuration>
+        <data xmlns="http://www.netbeans.org/ns/nb-module-project/3";>
+            
<code-name-base>org.netbeans.modules.java.j2seprofiles</code-name-base>
+            <module-dependencies>
+                <dependency>
+                    
<code-name-base>org.netbeans.api.annotations.common</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <release-version>1</release-version>
+                        <specification-version>1.20</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.netbeans.api.java</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <release-version>1</release-version>
+                        <specification-version>1.47</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    
<code-name-base>org.netbeans.api.java.classpath</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <release-version>1</release-version>
+                        <specification-version>1.38</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    
<code-name-base>org.netbeans.libs.javacapi</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>8.2</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    
<code-name-base>org.netbeans.modules.code.analysis</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <release-version>0-1</release-version>
+                        <specification-version>1.16</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    
<code-name-base>org.netbeans.modules.java.project</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <release-version>1</release-version>
+                        <specification-version>1.54</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    
<code-name-base>org.netbeans.modules.java.source</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>0.119</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    
<code-name-base>org.netbeans.modules.projectapi</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <release-version>1</release-version>
+                        <specification-version>1.53</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    
<code-name-base>org.netbeans.modules.refactoring.api</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>1.35</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    
<code-name-base>org.netbeans.spi.editor.hints</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <release-version>0-1</release-version>
+                        <specification-version>1.30</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.openide.filesystems</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>8.7</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.openide.text</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>6.56</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.openide.util</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>8.31</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.openide.util.lookup</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>8.21</specification-version>
+                    </run-dependency>
+                </dependency>
+            </module-dependencies>
+            <public-packages/>
+        </data>
+    </configuration>
+</project>
diff --git 
a/java.j2seprofiles/src/org/netbeans/modules/java/j2seprofiles/Bundle.properties
 
b/java.j2seprofiles/src/org/netbeans/modules/java/j2seprofiles/Bundle.properties
new file mode 100644
--- /dev/null
+++ 
b/java.j2seprofiles/src/org/netbeans/modules/java/j2seprofiles/Bundle.properties
@@ -0,0 +1,1 @@
+OpenIDE-Module-Name=Java SE Profiles
diff --git 
a/parsing.api/src/org/netbeans/modules/parsing/impl/indexing/Pair.java 
b/java.j2seprofiles/src/org/netbeans/modules/java/j2seprofiles/Pair.java
copy from parsing.api/src/org/netbeans/modules/parsing/impl/indexing/Pair.java
copy to java.j2seprofiles/src/org/netbeans/modules/java/j2seprofiles/Pair.java
--- a/parsing.api/src/org/netbeans/modules/parsing/impl/indexing/Pair.java
+++ b/java.j2seprofiles/src/org/netbeans/modules/java/j2seprofiles/Pair.java
@@ -40,13 +40,13 @@
  * Portions Copyrighted 2009 Sun Microsystems, Inc.
  */
 
-package org.netbeans.modules.parsing.impl.indexing;
+package org.netbeans.modules.java.j2seprofiles;
 
 /**
- *
+ * Just another copy of Pair.
  * @author Tomas Zezula
  */
-public final class Pair<P,K> {
+final class Pair<P,K> {
 
     public final P first;
     public final K second;
@@ -73,7 +73,7 @@
     @Override
     public boolean equals (final Object other) {
         if (other instanceof Pair) {
-            Pair otherPair = (Pair) other;
+            Pair<?,?> otherPair = (Pair<?,?>) other;
             return (this.first == null ? otherPair.first == null : 
this.first.equals(otherPair.first)) &&
                    (this.second == null ? otherPair.second == null : 
this.second.equals(otherPair.second));
         }
diff --git 
a/java.j2seprofiles/src/org/netbeans/modules/java/j2seprofiles/ProfilesAnalyzer.java
 
b/java.j2seprofiles/src/org/netbeans/modules/java/j2seprofiles/ProfilesAnalyzer.java
new file mode 100644
--- /dev/null
+++ 
b/java.j2seprofiles/src/org/netbeans/modules/java/j2seprofiles/ProfilesAnalyzer.java
@@ -0,0 +1,586 @@
+/*
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
+ *
+ * Copyright 2013 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Oracle and Java are registered trademarks of Oracle and/or its affiliates.
+ * Other names may be trademarks of their respective owners.
+ *
+ * The contents of this file are subject to the terms of either the GNU
+ * General Public License Version 2 only ("GPL") or the Common
+ * Development and Distribution License("CDDL") (collectively, the
+ * "License"). You may not use this file except in compliance with the
+ * License. You can obtain a copy of the License at
+ * http://www.netbeans.org/cddl-gplv2.html
+ * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the
+ * specific language governing permissions and limitations under the
+ * License.  When distributing the software, include this License Header
+ * Notice in each file and include the License file at
+ * nbbuild/licenses/CDDL-GPL-2-CP.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the GPL Version 2 section of the License file that
+ * accompanied this code. If applicable, add the following below the
+ * License Header, with the fields enclosed by brackets [] replaced by
+ * your own identifying information:
+ * "Portions Copyrighted [year] [name of copyright owner]"
+ *
+ * If you wish your version of this file to be governed by only the CDDL
+ * or only the GPL Version 2, indicate your decision by adding
+ * "[Contributor] elects to include this software in this distribution
+ * under the [CDDL or GPL Version 2] license." If you do not indicate a
+ * single choice of license, a recipient has the option to distribute
+ * your version of this file under either the CDDL, the GPL Version 2 or
+ * to extend the choice of license to its licensees as provided above.
+ * However, if you add GPL Version 2 code and therefore, elected the GPL
+ * Version 2 license, then the option applies only if the new code is
+ * made subject to such option by the copyright holder.
+ *
+ * Contributor(s):
+ *
+ * Portions Copyrighted 2013 Sun Microsystems, Inc.
+ */
+package org.netbeans.modules.java.j2seprofiles;
+
+import com.sun.source.tree.IdentifierTree;
+import com.sun.source.tree.MemberSelectTree;
+import com.sun.source.util.SourcePositions;
+import com.sun.source.util.TreePath;
+import com.sun.source.util.TreePathScanner;
+import com.sun.source.util.Trees;
+import java.io.IOException;
+import java.net.MalformedURLException;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.net.URL;
+import java.util.ArrayDeque;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.EnumSet;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Queue;
+import java.util.Set;
+import java.util.concurrent.BlockingQueue;
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicBoolean;
+import javax.lang.model.element.Element;
+import javax.lang.model.element.ElementKind;
+import javax.lang.model.element.Name;
+import javax.lang.model.element.TypeElement;
+import javax.lang.model.util.Elements;
+import javax.swing.JComponent;
+import org.netbeans.api.annotations.common.CheckForNull;
+import org.netbeans.api.annotations.common.NonNull;
+import org.netbeans.api.annotations.common.NullAllowed;
+import org.netbeans.api.java.classpath.ClassPath;
+import org.netbeans.api.java.project.JavaProjectConstants;
+import org.netbeans.api.java.queries.SourceForBinaryQuery;
+import org.netbeans.api.java.queries.SourceLevelQuery;
+import org.netbeans.api.java.source.ClasspathInfo;
+import org.netbeans.api.java.source.CompilationController;
+import org.netbeans.api.java.source.ElementHandle;
+import org.netbeans.api.java.source.JavaSource;
+import org.netbeans.api.java.source.Task;
+import org.netbeans.api.java.source.TreeUtilities;
+import org.netbeans.api.java.source.support.ProfileSupport;
+import org.netbeans.api.project.FileOwnerQuery;
+import org.netbeans.api.project.Project;
+import org.netbeans.api.project.ProjectUtils;
+import org.netbeans.api.project.SourceGroup;
+import org.netbeans.modules.analysis.spi.Analyzer;
+import org.openide.util.NbBundle;
+import org.openide.util.Parameters;
+import org.netbeans.modules.refactoring.api.Scope;
+import org.netbeans.spi.editor.hints.ErrorDescription;
+import org.netbeans.spi.editor.hints.ErrorDescriptionFactory;
+import org.netbeans.spi.editor.hints.Fix;
+import org.netbeans.spi.editor.hints.Severity;
+import org.openide.filesystems.FileObject;
+import org.openide.filesystems.FileUtil;
+import org.openide.filesystems.URLMapper;
+import org.openide.util.Exceptions;
+import org.openide.util.lookup.ServiceProvider;
+
+/**
+ *
+ * @author Tomas Zezula
+ */
+public class ProfilesAnalyzer implements Analyzer {
+
+    private static final String ICON = 
"org/netbeans/modules/java/j2seprofiles/resources/profile.gif"; //NOI18N
+    
+    private final Context context;
+    private final Result result;
+    private final AtomicBoolean canceled = new AtomicBoolean();
+
+    private ProfilesAnalyzer(
+            @NonNull final Context context,
+            @NonNull final Result result) {
+        Parameters.notNull("context", context); //NOI18N
+        Parameters.notNull("result", result);   //NOI18N
+        this.context = context;
+        this.result = result;
+    }
+
+    @Override
+    @NonNull
+    @NbBundle.Messages ({
+        "MSG_AnalyzingRoot=Analyzing root {0}",
+        "MSG_ProjectHigherProfile=Project requires profile: {0}",
+        "DESC_ProjectHigherProfile=The project {0} located in {1} requires 
profile: {2}",
+        "MSG_LibraryHigherProfile=Library requires profile: {0}",
+        "DESC_LibraryHigherProfile=The Profile attribute in the manifest of 
the library {0} requires profile: {1}",
+        "MSG_LibraryInvalidProfile=Library has invalid profile",
+        "DESC_LibraryInvalidProfile=The library Manifest of the library {0} 
has invalid value of the Profile attribute",
+        "MSG_ClassFileHigherProfile={0} requires profile: {1}",
+        "DESC_ClassFileHigherProfile=The {0} used in class {1} of library 
{2} requires profile: {3}"
+    })
+    public Iterable<? extends ErrorDescription> analyze() {
+        final Scope scope = context.getScope();
+        final Set<FileObject> roots = scope.getSourceRoots();        
+        final HashMap<URI,Set<Project>> submittedBinaries = new HashMap<>();
+        final Set<URI> submittedSources = new HashSet<>();
+        final CollectorFactory cf = new CollectorFactory();
+        for (FileObject root : roots) {
+            if (canceled.get()) {
+                break;
+            }
+            final SourceLevelQuery.Profile profile = 
SourceLevelQuery.getSourceLevel2(root).getProfile();
+            if (profile != SourceLevelQuery.Profile.DEFAULT) {
+                final ClassPath boot = ClassPath.getClassPath(root, 
ClassPath.BOOT);
+                final ClassPath compile = ClassPath.getClassPath(root, 
ClassPath.COMPILE);
+                if (boot == null || compile == null) {
+                    continue;
+                }
+                final Project owner = FileOwnerQuery.getOwner(root);
+                if (owner == null) {
+                    continue;
+                }
+                submittedSources.add(root.toURI());
+                final Set<Project> projectRefs = new HashSet<>();
+                ProfileSupport.findProfileViolations(
+                    profile,
+                    cpToRootUrls(boot, null, null, null),
+                    cpToRootUrls(compile, owner, submittedBinaries, 
projectRefs),
+                    Collections.singleton(root.toURL()),
+                    EnumSet.of(
+                        ProfileSupport.Validation.BINARIES_BY_MANIFEST,
+                        ProfileSupport.Validation.BINARIES_BY_CLASS_FILES,
+                        ProfileSupport.Validation.SOURCES),
+                    cf);
+                for (Project p : projectRefs) {
+                    final FileObject pHome = p.getProjectDirectory();
+                    final SourceLevelQuery.Profile pProfile = 
SourceLevelQuery.getSourceLevel2(pHome).getProfile();
+                    if (pProfile.compareTo(profile) > 0) {
+                        result.reportError(owner, 
ErrorDescriptionFactory.createErrorDescription(
+                                null,
+                                Severity.ERROR,
+                                
Bundle.MSG_ProjectHigherProfile(pProfile.getDisplayName()),
+                                Bundle.DESC_ProjectHigherProfile(
+                                    
ProjectUtils.getInformation(p).getDisplayName(),
+                                    FileUtil.getFileDisplayName(pHome),
+                                    profile.getDisplayName()),
+                                
ErrorDescriptionFactory.lazyListForFixes(Collections.<Fix>emptyList()),
+                                p.getProjectDirectory(),
+                                null));
+                    }
+                }
+            }            
+        }
+        if (!canceled.get()) {
+            context.start(submittedBinaries.size() + 
submittedSources.size());
+            int count = 0;
+            while (!submittedBinaries.isEmpty() || 
!submittedSources.isEmpty()) {
+                try {
+                    final Pair<URL,Collection<? extends 
ProfileSupport.Violation>> violationsPair = cf.poll(2500);
+                    if (violationsPair == null) {
+                        continue;
+                    }
+                    if (canceled.get()) {
+                        break;
+                    }
+                    final URI rootURI = violationsPair.first.toURI();
+                    final FileObject root = 
URLMapper.findFileObject(rootURI.toURL());
+                    
context.progress(Bundle.MSG_AnalyzingRoot(FileUtil.getFileDisplayName(archiveFileOrFolder(root))),
 count);
+                    final Collection<? extends ProfileSupport.Violation> 
violations = violationsPair.second;
+                    final Set<Project> projects = 
submittedBinaries.remove(rootURI);
+                    final boolean binary = projects != null;
+                    if (!binary) {
+                        submittedSources.remove(rootURI);
+                    }
+                    if (violations.isEmpty()) {
+                        continue;
+                    }
+                    if (binary) {
+                        //Binary roots
+                        for (ProfileSupport.Violation violation : 
violations) {
+                            final URL fileURL = violation.getFile();
+                            FileObject target;
+                            String message;
+                            String description;
+                            final SourceLevelQuery.Profile requiredProfile = 
violation.getRequiredProfile();                            
+                            if (fileURL == null) {
+                                target = root;
+                                if (requiredProfile != null) {
+                                    message = 
Bundle.MSG_LibraryHigherProfile(requiredProfile.getDisplayName());
+                                    description = 
Bundle.DESC_LibraryHigherProfile(
+                                            
FileUtil.getFileDisplayName(archiveFileOrFolder(target)),
+                                            
requiredProfile.getDisplayName());
+                                } else {
+                                    message = 
Bundle.MSG_LibraryInvalidProfile();
+                                    description = 
Bundle.DESC_LibraryInvalidProfile(FileUtil.getFileDisplayName(archiveFileOrFolder(target)));
+                                }
+                            } else {
+                                final ElementHandle<TypeElement> usedType = 
violation.getUsedType();
+                                assert usedType != null;
+                                assert requiredProfile != null;
+                                target = URLMapper.findFileObject(fileURL);
+                                message = Bundle.MSG_ClassFileHigherProfile(
+                                        simpleName(usedType),
+                                        requiredProfile.getDisplayName());
+                                description = 
Bundle.DESC_ClassFileHigherProfile(
+                                        usedType.getQualifiedName(),
+                                        
stripExtension(FileUtil.getRelativePath(root, target)),
+                                        
FileUtil.getFileDisplayName(archiveFileOrFolder(root)),
+                                        requiredProfile.getDisplayName());
+                            }
+                            for (Project p : projects) {
+                                result.reportError(p, 
ErrorDescriptionFactory.createErrorDescription(
+                                    null,
+                                    Severity.ERROR,
+                                    message,
+                                    description,
+                                    
ErrorDescriptionFactory.lazyListForFixes(Collections.<Fix>emptyList()),
+                                    target,
+                                    null));
+                            }
+                        }
+                    } else {
+                        //Source roots
+                        try {                            
+                            if (root != null) {
+                                final ClasspathInfo cpInfo = 
ClasspathInfo.create(root);
+                                final 
Map<FileObject,Collection<ProfileSupport.Violation>> violationsByFiles =
+                                    new HashMap<>();
+                                final JavaSource js = JavaSource.create(
+                                    cpInfo,
+                                    violationsToFileObjects(violations, 
violationsByFiles));
+                                if (js != null) {
+                                    js.runUserActionTask(
+                                        new Task<CompilationController>(){
+                                            @Override
+                                            public void run(@NonNull final 
CompilationController cc) throws Exception {
+                                                
cc.toPhase(JavaSource.Phase.RESOLVED);
+                                                final FileObject currentFile 
= cc.getFileObject();
+                                                final FindPosScanner fps = 
new FindPosScanner(
+                                                        currentFile,
+                                                        cc.getTrees(),
+                                                        cc.getElements(),
+                                                        
cc.getTreeUtilities(),
+                                                        
violationsByFiles.get(currentFile),
+                                                        result);
+                                                
fps.scan(cc.getCompilationUnit(), null);
+
+                                            }
+                                        },
+                                        true);
+                                }
+                            }
+                        } catch (IOException ioe) {
+                            Exceptions.printStackTrace(ioe);
+                        }
+                    }
+                    context.progress(++count);
+                } catch (InterruptedException ex) {
+                    break;
+                } catch (URISyntaxException | MalformedURLException ex) {
+                    Exceptions.printStackTrace(ex);
+                }
+            }
+            context.finish();
+        }
+        return Collections.<ErrorDescription>emptySet();
+    }
+
+    @Override
+    public boolean cancel() {
+        canceled.set(true);
+        return true;
+    }
+
+    @NonNull
+    private static FileObject archiveFileOrFolder(@NonNull final FileObject 
root) {
+        final FileObject archiveFile = FileUtil.getArchiveFile(root);
+        return archiveFile != null ? archiveFile : root;
+    }
+
+    @NonNull
+    private static String stripExtension(@NonNull final String path) {
+        final int index = path.lastIndexOf('.');    //NOI18N
+        return index <= 0 ? path : path.substring(0, index);
+    }
+
+    @NonNull
+    private static String simpleName(@NullAllowed final 
ElementHandle<TypeElement> eh) {
+        if (eh == null) {
+            return "";  //NOI18N
+        }
+        final String qn = eh.getQualifiedName();
+        int index = qn.lastIndexOf('.');    //NOI18N
+        return index < 0 ? qn : qn.substring(index+1);
+    }
+
+    @NonNull
+    private static Iterable<URL> cpToRootUrls(
+            @NonNull final ClassPath cp,
+            @NullAllowed final Project owner,
+            @NullAllowed final Map<URI,Set<Project>> alreadyProcessed,
+            @NullAllowed final Set<? super Project> projectRefs) {
+        assert (owner == null && alreadyProcessed == null && projectRefs == 
null) ||
+               (owner != null && alreadyProcessed != null && projectRefs != 
null);
+        final Queue<URL> res = new ArrayDeque<>();
+nextCpE:for (ClassPath.Entry e : cp.entries()) {
+            final URL url = e.getURL();
+            try {
+                if (projectRefs != null) {
+                    final SourceForBinaryQuery.Result2 sfbqRes = 
SourceForBinaryQuery.findSourceRoots2(url);
+                    if (sfbqRes.preferSources()) {
+                        for (FileObject src : sfbqRes.getRoots()) {
+                            final Project prj = FileOwnerQuery.getOwner(src);
+                            if (prj != null) {
+                                for (SourceGroup sg : 
ProjectUtils.getSources(prj).getSourceGroups(JavaProjectConstants.SOURCES_TYPE_JAVA))
 {
+                                    if (src.equals(sg.getRootFolder())) {
+                                        if (!prj.equals(owner)) {
+                                            projectRefs.add(prj);
+                                        }
+                                        continue nextCpE;
+                                    }
+                                }
+                            }
+                        }
+                    }
+                }
+                
+                if (alreadyProcessed == null) {
+                    res.offer(url);
+                } else {
+                    final URI uri = url.toURI();
+                    Set<Project> projects = alreadyProcessed.get(uri);
+                    if (projects == null) {
+                        projects = new HashSet<>();
+                        alreadyProcessed.put(uri, projects);
+                        res.offer(url);
+                    }                    
+                    projects.add(owner);
+                }               
+            } catch (URISyntaxException ex) {
+                Exceptions.printStackTrace(ex);
+            }
+        }
+        return res;
+    }
+
+    private static FileObject[] violationsToFileObjects(
+            @NonNull final Collection<? extends ProfileSupport.Violation> 
violations,
+            @NullAllowed final 
Map<FileObject,Collection<ProfileSupport.Violation>> violationsByFiles) {
+        final Collection<FileObject> fos = new HashSet<>(violations.size());
+        for (ProfileSupport.Violation v : violations) {
+            final URL fileURL = v.getFile();
+            if (fileURL != null) {
+                final FileObject fo = URLMapper.findFileObject(fileURL);
+                if (fo != null) {
+                    fos.add(fo);
+                    if (violationsByFiles != null) {
+                        Collection<ProfileSupport.Violation> 
violationsInFile = violationsByFiles.get(fo);
+                        if (violationsInFile == null) {
+                            violationsInFile = new ArrayList<>();
+                            violationsByFiles.put(fo, violationsInFile);
+                        }
+                        violationsInFile.add(v);
+                    }
+                }
+            }
+        }
+        return fos.toArray(new FileObject[fos.size()]);
+    }
+
+
+    //@ThreadSafe
+    private final class CollectorFactory implements 
ProfileSupport.ViolationCollectorFactory {
+
+        
+        private final BlockingQueue<Pair<URL,Collection<? extends 
ProfileSupport.Violation>>>
+                allViolations = new LinkedBlockingQueue<>();
+
+        @Override
+        public ProfileSupport.ViolationCollector create(@NonNull final URL 
root) {
+            return new Collector(root);
+        }
+
+        @Override
+        public boolean isCancelled() {
+            return canceled.get();
+        }
+
+        @CheckForNull
+        Pair<URL, Collection<? extends ProfileSupport.Violation>> poll(long 
timeOut) throws InterruptedException {
+            return allViolations.poll(timeOut, TimeUnit.MILLISECONDS);
+        }
+
+        private synchronized void addViolations(
+                @NonNull final URL root,
+                @NonNull final Collection<? extends 
ProfileSupport.Violation> violations) {
+            allViolations.offer(Pair.<URL,Collection<? extends 
ProfileSupport.Violation>>of(root,violations));
+        }
+
+        private final class Collector implements 
ProfileSupport.ViolationCollector {
+
+            private final URL root;
+
+            Collector(@NonNull final URL root) {
+                Parameters.notNull("root", root);   //NOI18N
+                this.root = root;
+            }
+
+            private final Queue<ProfileSupport.Violation> violations = new 
ArrayDeque<>();
+
+            @Override
+            public void reportProfileViolation(@NonNull final 
ProfileSupport.Violation violation) {
+                violations.offer(violation);
+            }
+
+            @Override
+            public void finished() {
+                addViolations(root, violations);
+            }
+
+        }
+
+    }
+
+    //@NonThreadSafe
+    private final class FindPosScanner extends TreePathScanner<Void, Void> {
+
+        private final FileObject target;
+        private final Elements elements;
+        private final TreeUtilities treeUtilities;
+        private final Trees trees;
+        private final Result errors;
+        private final Map<String,ProfileSupport.Violation> 
violationsByBinNames =
+                new HashMap<>();        
+
+        FindPosScanner(
+                @NonNull final FileObject target,
+                @NonNull final Trees trees,
+                @NonNull final Elements elements,
+                @NonNull final TreeUtilities treeUtilities,
+                @NonNull final Collection<? extends 
ProfileSupport.Violation> violations,
+                @NonNull final Result errors) {
+            assert target != null;
+            assert trees != null;
+            assert elements != null;
+            assert treeUtilities != null;
+            assert violations != null;
+            assert errors != null;
+            this.target = target;
+            this.trees = trees;
+            this.elements = elements;
+            this.treeUtilities = treeUtilities;
+            this.errors = errors;
+            for (ProfileSupport.Violation v : violations) {
+                final ElementHandle<TypeElement> eh = v.getUsedType();
+                if (eh != null) {
+                    violationsByBinNames.put(eh.getBinaryName(), v);
+                }
+            }
+        }
+
+        @Override
+        public Void visitIdentifier(IdentifierTree node, Void p) {
+            handleIdentSelect();
+            return super.visitIdentifier(node, p);
+        }
+
+        @Override
+        public Void visitMemberSelect(MemberSelectTree node, Void p) {
+            handleIdentSelect();
+            return super.visitMemberSelect(node, p);
+        }
+
+        @NbBundle.Messages({
+            "MSG_SourceFileHigherProfile={0} requires profile: {1}",
+            "DESC_SourceFileHigherProfile=The {0} requires profile: {1}"
+        })
+        private void handleIdentSelect() {
+            final TreePath tp = getCurrentPath();
+            Element e = trees.getElement(tp);
+            if (e != null) {
+                final ElementKind ek = e.getKind();
+                if (ek == ElementKind.OTHER ||
+                    ek.isField() ||
+                    ek == ElementKind.CONSTRUCTOR ||
+                    ek == ElementKind.METHOD) {
+                        e = e.getEnclosingElement();
+                }
+                if ((e.getKind().isClass() || e.getKind().isInterface()) && 
!treeUtilities.isSynthetic(tp)) {
+                    final Name binName = 
elements.getBinaryName((TypeElement)e);
+                    final ProfileSupport.Violation v = 
violationsByBinNames.get(binName.toString());
+                    if (v != null) {
+                        final SourcePositions sp = 
trees.getSourcePositions();                        
+                        final int start = (int) 
sp.getStartPosition(tp.getCompilationUnit(), tp.getLeaf());
+                        final int end = (int) 
sp.getEndPosition(tp.getCompilationUnit(), tp.getLeaf());
+                        final SourceLevelQuery.Profile requiredProfile = 
v.getRequiredProfile();
+                        assert requiredProfile != null;
+                        
errors.reportError(ErrorDescriptionFactory.createErrorDescription(
+                            null,
+                            Severity.ERROR,
+                            
Bundle.MSG_SourceFileHigherProfile(e.getSimpleName(), 
requiredProfile.getDisplayName()),
+                            
Bundle.DESC_SourceFileHigherProfile(((TypeElement)e).getQualifiedName(), 
requiredProfile.getDisplayName()),
+                            
ErrorDescriptionFactory.lazyListForFixes(Collections.<Fix>emptyList()),
+                            target,
+                            start,
+                            end));
+                    }
+                }
+            }
+        }
+    }
+
+    @NbBundle.Messages({
+        "NAME_JdkProfiles=JRE 8 Profiles Conformance"
+    })
+    @ServiceProvider(service=AnalyzerFactory.class)
+    public static final class Factory extends Analyzer.AnalyzerFactory {
+
+        public Factory() {
+            super("jdk-profiles", Bundle.NAME_JdkProfiles(), ICON);
+        }
+        
+        @Override
+        public Analyzer createAnalyzer(
+                @NonNull final Context context,
+                @NonNull final Result result) {
+            return new ProfilesAnalyzer(context, result);
+        }
+
+        @Override
+        public Analyzer createAnalyzer(@NonNull final Context context) {
+            throw new IllegalStateException();
+        }
+
+        @Override
+        public Iterable<? extends WarningDescription> getWarnings() {
+            return Collections.emptySet();
+        }
+
+        @CheckForNull
+        @Override
+        public <D, C extends JComponent> CustomizerProvider<D, C> 
getCustomizerProvider() {
+            return null;
+        }
+    }
+
+}
diff --git 
a/javawebstart/src/org/netbeans/modules/javawebstart/resources/jnlp.gif 
b/java.j2seprofiles/src/org/netbeans/modules/java/j2seprofiles/resources/profile.gif
copy from 
javawebstart/src/org/netbeans/modules/javawebstart/resources/jnlp.gif
copy to 
java.j2seprofiles/src/org/netbeans/modules/java/j2seprofiles/resources/profile.gif
diff --git 
a/java.source/src/org/netbeans/api/java/source/support/ProfileSupport.java 
b/java.source/src/org/netbeans/api/java/source/support/ProfileSupport.java
--- a/java.source/src/org/netbeans/api/java/source/support/ProfileSupport.java
+++ b/java.source/src/org/netbeans/api/java/source/support/ProfileSupport.java
@@ -44,6 +44,7 @@
 import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
+import java.net.MalformedURLException;
 import java.net.URI;
 import java.net.URL;
 import java.util.ArrayDeque;
@@ -68,8 +69,11 @@
 import org.netbeans.api.annotations.common.CheckForNull;
 import org.netbeans.api.annotations.common.NonNull;
 import org.netbeans.api.annotations.common.NullAllowed;
+import org.netbeans.api.java.classpath.ClassPath;
 import org.netbeans.api.java.queries.SourceLevelQuery.Profile;
+import org.netbeans.api.java.source.ClasspathInfo;
 import org.netbeans.api.java.source.ElementHandle;
+import org.netbeans.api.java.source.SourceUtils;
 import org.netbeans.modules.classfile.Annotation;
 import org.netbeans.modules.classfile.AnnotationComponent;
 import org.netbeans.modules.classfile.CPEntry;
@@ -82,6 +86,7 @@
 import org.netbeans.modules.java.source.parsing.Archive;
 import org.netbeans.modules.java.source.parsing.CachingArchiveProvider;
 import org.netbeans.modules.java.source.parsing.FileObjects;
+import org.netbeans.spi.java.classpath.support.ClassPathSupport;
 import org.openide.filesystems.FileObject;
 import org.openide.filesystems.FileUtil;
 import org.openide.filesystems.URLMapper;
@@ -437,7 +442,7 @@
             }
         }
 
-        @NonNull
+        @CheckForNull
         protected URL map(@NonNull final FileObject fo) {
             return fo.toURL();
         }
@@ -508,12 +513,12 @@
                         collector.reportProfileViolation(new Violation(root, 
null, null, null));
                         return;
                     }
-                    if (res.first().compareTo(context.getRequredProfile()) > 
0) {
+                    current = res.first();
+                    if (current != Profile.DEFAULT && 
current.compareTo(context.getRequredProfile()) > 0) {
                         //Hiher profile in manifest of dependent jar
                         collector.reportProfileViolation(new Violation(root, 
res.first(), null, null));
                         return;
                     }
-                    current = res.first();
                 }
                 if 
(context.shouldValidate(Validation.BINARIES_BY_CLASS_FILES)) {
                     if (current == null || current == Profile.DEFAULT) {
@@ -565,23 +570,48 @@
         }
 
         private final static class SourceValidator extends Validator {
+
+            private final File cacheRoot;
+            private final ClasspathInfo resolveCps;
+
             private SourceValidator(
                @NonNull final URL root,
                @NonNull final Context context) {
                 super(root, context);
+                File f;
+                try {
+                    f = JavaIndex.getClassFolder(root, true);
+                } catch (IOException ioe) {
+                    f = null;
+                }
+                cacheRoot = f;
+                resolveCps = ClasspathInfo.create(
+                    ClassPath.EMPTY,
+                    ClassPath.EMPTY,
+                    ClassPathSupport.createClassPath(root));
             }
 
             @Override
             protected void validate(@NonNull final ViolationCollector 
collector) {
                 try {
-                    final File cacheRoot = JavaIndex.getClassFolder(root, 
true);
                     if (cacheRoot != null) {
                         
validateBinaryRoot(Utilities.toURI(cacheRoot).toURL(), collector);
                     }
-                } catch (IOException e) {
-                    Exceptions.printStackTrace(e);
+                } catch (MalformedURLException ex) {
+                    Exceptions.printStackTrace(ex);
                 }
             }
+
+            @Override
+            @CheckForNull
+            protected URL map(@NonNull final FileObject fo) {
+                final String relative = FileObjects.convertFolder2Package(
+                        
FileObjects.stripExtension(FileObjects.getRelativePath(cacheRoot, 
FileUtil.toFile(fo))));
+                final FileObject sourceFile = SourceUtils.getFile(
+                    
ElementHandleAccessor.getInstance().create(ElementKind.CLASS, relative),
+                    resolveCps);
+                return sourceFile == null ? null : sourceFile.toURL();
+            }            
         }
     }
     
diff --git 
a/java.source/src/org/netbeans/modules/java/source/parsing/JavacParser.java 
b/java.source/src/org/netbeans/modules/java/source/parsing/JavacParser.java
--- 
a/java.source/src/org/netbeans/modules/java/source/parsing/JavacParser.java
+++ 
b/java.source/src/org/netbeans/modules/java/source/parsing/JavacParser.java
@@ -139,6 +139,7 @@
 import org.netbeans.lib.nbjavac.services.NBParserFactory;
 import org.netbeans.lib.nbjavac.services.NBClassWriter;
 import org.netbeans.lib.nbjavac.services.NBJavacTrees;
+import org.netbeans.lib.nbjavac.services.NBMessager;
 import org.netbeans.lib.nbjavac.services.NBTreeMaker;
 import org.netbeans.lib.nbjavac.services.PartialReparser;
 import org.netbeans.modules.java.source.tasklist.CompilerSettings;
@@ -835,7 +836,7 @@
 
         Context context = new Context();
         //need to preregister the Messages here, because the getTask below 
requires Log instance:
-        Messager.preRegister(context, null, DEV_NULL, DEV_NULL, DEV_NULL);
+        NBMessager.preRegister(context, null, DEV_NULL, DEV_NULL, DEV_NULL);
         JavacTaskImpl task = (JavacTaskImpl)JavacTool.create().getTask(null, 
                 
ClasspathInfoAccessor.getINSTANCE().createFileManager(cpInfo),
                 diagnosticListener, options, null, 
Collections.<JavaFileObject>emptySet(),
diff --git a/lib.nbjavac/nbproject/project.properties 
b/lib.nbjavac/nbproject/project.properties
--- a/lib.nbjavac/nbproject/project.properties
+++ b/lib.nbjavac/nbproject/project.properties
@@ -1,5 +1,5 @@
 is.autoload=true
 javac.source=1.7
 javac.compilerargs=-Xlint -Xlint:-serial
-spec.version.base=1.8.0
+spec.version.base=1.9.0
 requires.nb.javac=true
diff --git 
a/lib.nbjavac/src/org/netbeans/lib/nbjavac/services/NBClassWriter.java 
b/lib.nbjavac/src/org/netbeans/lib/nbjavac/services/NBClassWriter.java
--- a/lib.nbjavac/src/org/netbeans/lib/nbjavac/services/NBClassWriter.java
+++ b/lib.nbjavac/src/org/netbeans/lib/nbjavac/services/NBClassWriter.java
@@ -56,6 +56,7 @@
 import com.sun.tools.javac.util.List;
 import com.sun.tools.javac.util.ListBuffer;
 import com.sun.tools.javac.util.Pair;
+import java.util.Collection;
 
 /**
  *
@@ -72,18 +73,28 @@
     }
 
     private final NBNames nbNames;
+    private final NBMessager nbMessager;
     private final Target target;
     private final Types types;
 
     protected NBClassWriter(Context context) {
         super(context);
         nbNames = NBNames.instance(context);
+        nbMessager = NBMessager.instance(context);
         target = Target.instance(context);
         types = Types.instance(context);
     }
     
     @Override
     protected int writeExtraClassAttributes(ClassSymbol c) {
+        if (c.sourcefile != null) {
+            final Collection<? extends ClassSymbol> nip = 
nbMessager.removeNotInProfile(c.sourcefile.toUri());
+            if (nip != null) {
+                for (ClassSymbol s : nip) {
+                    pool.put(s.type);
+                }
+            }
+        }
         if (!target.hasEnclosingMethodAttribute())
             return 
writeEnclosingMethodAttribute(nbNames._org_netbeans_EnclosingMethod, c);
         else
diff --git 
a/lib.nbjavac/src/org/netbeans/lib/nbjavac/services/NBMessager.java 
b/lib.nbjavac/src/org/netbeans/lib/nbjavac/services/NBMessager.java
new file mode 100644
--- /dev/null
+++ b/lib.nbjavac/src/org/netbeans/lib/nbjavac/services/NBMessager.java
@@ -0,0 +1,128 @@
+/*
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
+ *
+ * Copyright 2013 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Oracle and Java are registered trademarks of Oracle and/or its affiliates.
+ * Other names may be trademarks of their respective owners.
+ *
+ * The contents of this file are subject to the terms of either the GNU
+ * General Public License Version 2 only ("GPL") or the Common
+ * Development and Distribution License("CDDL") (collectively, the
+ * "License"). You may not use this file except in compliance with the
+ * License. You can obtain a copy of the License at
+ * http://www.netbeans.org/cddl-gplv2.html
+ * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the
+ * specific language governing permissions and limitations under the
+ * License.  When distributing the software, include this License Header
+ * Notice in each file and include the License file at
+ * nbbuild/licenses/CDDL-GPL-2-CP.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the GPL Version 2 section of the License file that
+ * accompanied this code. If applicable, add the following below the
+ * License Header, with the fields enclosed by brackets [] replaced by
+ * your own identifying information:
+ * "Portions Copyrighted [year] [name of copyright owner]"
+ *
+ * If you wish your version of this file to be governed by only the CDDL
+ * or only the GPL Version 2, indicate your decision by adding
+ * "[Contributor] elects to include this software in this distribution
+ * under the [CDDL or GPL Version 2] license." If you do not indicate a
+ * single choice of license, a recipient has the option to distribute
+ * your version of this file under either the CDDL, the GPL Version 2 or
+ * to extend the choice of license to its licensees as provided above.
+ * However, if you add GPL Version 2 code and therefore, elected the GPL
+ * Version 2 license, then the option applies only if the new code is
+ * made subject to such option by the copyright holder.
+ *
+ * Contributor(s):
+ *
+ * Portions Copyrighted 2013 Sun Microsystems, Inc.
+ */
+package org.netbeans.lib.nbjavac.services;
+
+import com.sun.tools.javac.code.Symbol;
+import com.sun.tools.javac.util.Context;
+import com.sun.tools.javac.util.JCDiagnostic.DiagnosticPosition;
+import com.sun.tools.javac.util.Log;
+import com.sun.tools.javadoc.Messager;
+import java.io.PrintWriter;
+import java.net.URI;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Map;
+import javax.tools.JavaFileObject;
+
+/**
+ *
+ * @author Tomas Zezula
+ */
+public final class NBMessager extends Messager {
+
+    private static final String ERR_NOT_IN_PROFILE = "not.in.profile";  
//NOI18N
+
+    private final Map<URI,Collection<Symbol.ClassSymbol>> notInProfiles =
+            new HashMap<>();
+    
+    private NBMessager(
+            final Context context,
+            final String programName,
+            final PrintWriter errWriter,
+            final PrintWriter warnWriter,
+            final PrintWriter noticeWriter) {
+        super(context, programName, errWriter, warnWriter, noticeWriter);
+    }
+
+    public static NBMessager instance(Context context) {
+        final Log log = Log.instance(context);
+        if (!(log instanceof NBMessager)) {
+            throw new InternalError("No NBMessager instance!"); //NOI18N
+        }
+        return (NBMessager) log;
+    }
+    
+    public static void preRegister(Context context,
+                                   final String programName,
+                                   final PrintWriter errWriter,
+                                   final PrintWriter warnWriter,
+                                   final PrintWriter noticeWriter) {
+        context.put(logKey, new Context.Factory<Log>() {
+            @Override
+            public Log make(Context c) {
+                return new NBMessager(
+                    c,
+                    programName,
+                    errWriter,
+                    warnWriter,
+                    noticeWriter);
+            }
+        });
+    }
+
+    @Override
+    public void error(
+            final DiagnosticPosition pos,
+            final String key,
+            final Object ... args) {
+        if (ERR_NOT_IN_PROFILE.equals(key)) {
+            final JavaFileObject currentFile = currentSourceFile();
+            if (currentFile != null) {
+                final URI uri = currentFile.toUri();
+                Symbol.ClassSymbol type = (Symbol.ClassSymbol) args[0];
+                Collection<Symbol.ClassSymbol> types = 
notInProfiles.get(uri);
+                if (types == null) {
+                    types = new ArrayList<>();
+                    notInProfiles.put(uri,types);
+                }
+                types.add(type);
+            }
+        }
+        super.error(pos, key, args);
+    }
+
+    Collection<? extends Symbol.ClassSymbol> removeNotInProfile(final URI 
uri) {
+        return uri == null ? null : notInProfiles.remove(uri);
+    }
+
+}
diff --git a/nbbuild/cluster.properties b/nbbuild/cluster.properties
--- a/nbbuild/cluster.properties
+++ b/nbbuild/cluster.properties
@@ -513,6 +513,7 @@
         java.hints.test,\
         java.hints.ui,\
         java.j2seplatform,\
+        java.j2seprofiles, \
         java.j2seproject,\
         java.kit,\
         java.lexer,\

[hg] main-silver: JDK 8 Profiles Conformance Analyzer.

Tomas Zezula 04/26/2013

Project Features

About this Project

Editor was started in November 2009, is owned by Martin Ryzl, and has 195 members.
By use of this website, you agree to the NetBeans Policies and Terms of Use (revision 20150626.29986a4). © 2014, Oracle Corporation and/or its affiliates. Sponsored by Oracle logo
 
 
Close
loading
Please Confirm
Close