Author: scabanovich
Date: 2011-05-03 16:16:26 -0400 (Tue, 03 May 2011)
New Revision: 31043
Added:
trunk/cdi/plugins/org.jboss.tools.cdi.core/src/org/jboss/tools/cdi/internal/core/impl/definition/Dependencies.java
Modified:
trunk/cdi/plugins/org.jboss.tools.cdi.core/src/org/jboss/tools/cdi/core/CDICoreBuilder.java
trunk/cdi/plugins/org.jboss.tools.cdi.core/src/org/jboss/tools/cdi/core/IRootDefinitionContext.java
trunk/cdi/plugins/org.jboss.tools.cdi.core/src/org/jboss/tools/cdi/internal/core/impl/BeanMember.java
trunk/cdi/plugins/org.jboss.tools.cdi.core/src/org/jboss/tools/cdi/internal/core/impl/definition/AbstractMemberDefinition.java
trunk/cdi/plugins/org.jboss.tools.cdi.core/src/org/jboss/tools/cdi/internal/core/impl/definition/DefinitionContext.java
trunk/cdi/plugins/org.jboss.tools.cdi.core/src/org/jboss/tools/cdi/internal/core/validation/CDICoreValidator.java
Log:
JBIDE-3120
https://issues.jboss.org/browse/JBIDE-3120
Modified:
trunk/cdi/plugins/org.jboss.tools.cdi.core/src/org/jboss/tools/cdi/core/CDICoreBuilder.java
===================================================================
---
trunk/cdi/plugins/org.jboss.tools.cdi.core/src/org/jboss/tools/cdi/core/CDICoreBuilder.java 2011-05-03
18:36:30 UTC (rev 31042)
+++
trunk/cdi/plugins/org.jboss.tools.cdi.core/src/org/jboss/tools/cdi/core/CDICoreBuilder.java 2011-05-03
20:16:26 UTC (rev 31043)
@@ -25,7 +25,9 @@
import org.eclipse.core.resources.IResourceDelta;
import org.eclipse.core.resources.IResourceDeltaVisitor;
import org.eclipse.core.resources.IResourceVisitor;
+import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.resources.IncrementalProjectBuilder;
+import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
@@ -42,6 +44,7 @@
import org.jboss.tools.cdi.core.extension.IDefinitionContextExtension;
import org.jboss.tools.cdi.core.extension.feature.IBuildParticipantFeature;
import org.jboss.tools.cdi.internal.core.impl.definition.AnnotationHelper;
+import org.jboss.tools.cdi.internal.core.impl.definition.Dependencies;
import org.jboss.tools.cdi.internal.core.scanner.CDIBuilderDelegate;
import org.jboss.tools.cdi.internal.core.scanner.FileSet;
import org.jboss.tools.common.EclipseUtil;
@@ -304,6 +307,29 @@
if(n != null) n.clean();
}
+ /**
+ * Returns files directly dependent on path which are not included into visited set.
+ *
+ * @param path
+ * @param visited
+ * @return
+ */
+ Set<IFile> getDependentFiles(IPath path, Set<IPath> visited) {
+ IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
+ Dependencies d =
getCDICoreNature().getDefinitions().getWorkingCopy().getDependencies();
+ Set<IFile> result = new HashSet<IFile>();
+
+ // we do not need to recurse: that will be done by visitor.
+ Set<IPath> ps = d.getDirectDependencies(path);
+ if(ps != null) for (IPath p: ps) {
+ if(visited.contains(p)) continue;
+ IFile f = root.getFile(p);
+ if(f != null && f.exists()) result.add(f);
+ }
+
+ return result;
+ }
+
class SampleDeltaVisitor implements IResourceDeltaVisitor {
/*
* @see
org.eclipse.core.resources.IResourceDeltaVisitor#visit(org.eclipse.core.resources.IResourceDelta)
@@ -408,6 +434,8 @@
addBeansXML(f, fileSet);
}
for (IBuildParticipantFeature p: buildParticipants) p.visit(f, srcs[i], null);
+ Set<IFile> ds = getDependentFiles(path, visited);
+ if(ds != null) for (IFile d: ds) visit(d);
return false;
}
}
@@ -417,6 +445,9 @@
}
for (IBuildParticipantFeature p: buildParticipants) p.visit(f, null, webinf);
}
+
+ Set<IFile> ds = getDependentFiles(path, visited);
+ if(ds != null) for (IFile d: ds) visit(d);
}
if(resource instanceof IFolder) {
Modified:
trunk/cdi/plugins/org.jboss.tools.cdi.core/src/org/jboss/tools/cdi/core/IRootDefinitionContext.java
===================================================================
---
trunk/cdi/plugins/org.jboss.tools.cdi.core/src/org/jboss/tools/cdi/core/IRootDefinitionContext.java 2011-05-03
18:36:30 UTC (rev 31042)
+++
trunk/cdi/plugins/org.jboss.tools.cdi.core/src/org/jboss/tools/cdi/core/IRootDefinitionContext.java 2011-05-03
20:16:26 UTC (rev 31043)
@@ -53,4 +53,6 @@
public Set<IDefinitionContextExtension> getExtensions();
+ public void addDependency(IPath source, IPath target);
+
}
Modified:
trunk/cdi/plugins/org.jboss.tools.cdi.core/src/org/jboss/tools/cdi/internal/core/impl/BeanMember.java
===================================================================
---
trunk/cdi/plugins/org.jboss.tools.cdi.core/src/org/jboss/tools/cdi/internal/core/impl/BeanMember.java 2011-05-03
18:36:30 UTC (rev 31042)
+++
trunk/cdi/plugins/org.jboss.tools.cdi.core/src/org/jboss/tools/cdi/internal/core/impl/BeanMember.java 2011-05-03
20:16:26 UTC (rev 31043)
@@ -10,6 +10,7 @@
******************************************************************************/
package org.jboss.tools.cdi.internal.core.impl;
+import org.eclipse.core.resources.IResource;
import org.eclipse.jdt.core.IField;
import org.eclipse.jdt.core.IMember;
import org.eclipse.jdt.core.IMethod;
@@ -97,7 +98,17 @@
return typeDeclaration;
}
+ public IResource getResource() {
+ if(definition.getOriginalDefinition() != null) {
+ return definition.getOriginalDefinition().getResource();
+ }
+ return super.getResource();
+ }
+
public int getLength() {
+ if(definition.getOriginalDefinition() != null) {
+ return definition.getOriginalDefinition().getLength();
+ }
ISourceRange r = null;
try {
getSourceMember().getSourceRange();
@@ -108,6 +119,9 @@
}
public int getStartPosition() {
+ if(definition.getOriginalDefinition() != null) {
+ return definition.getOriginalDefinition().getStartPosition();
+ }
ISourceRange r = null;
try {
getSourceMember().getSourceRange();
Modified:
trunk/cdi/plugins/org.jboss.tools.cdi.core/src/org/jboss/tools/cdi/internal/core/impl/definition/AbstractMemberDefinition.java
===================================================================
---
trunk/cdi/plugins/org.jboss.tools.cdi.core/src/org/jboss/tools/cdi/internal/core/impl/definition/AbstractMemberDefinition.java 2011-05-03
18:36:30 UTC (rev 31042)
+++
trunk/cdi/plugins/org.jboss.tools.cdi.core/src/org/jboss/tools/cdi/internal/core/impl/definition/AbstractMemberDefinition.java 2011-05-03
20:16:26 UTC (rev 31043)
@@ -16,11 +16,13 @@
import java.util.List;
import java.util.Map;
+import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.jdt.core.IAnnotatable;
import org.eclipse.jdt.core.IAnnotation;
import org.eclipse.jdt.core.IJavaElement;
+import org.eclipse.jdt.core.IMember;
import org.eclipse.jdt.core.IType;
import org.jboss.tools.cdi.core.CDIConstants;
import org.jboss.tools.cdi.core.CDICoreNature;
@@ -51,6 +53,8 @@
protected IAnnotatable member;
protected Map<String, AnnotationDeclaration> annotationsByType = new
HashMap<String, AnnotationDeclaration>();
protected IResource resource;
+
+ protected ITextSourceReference originalDefinition = null;
public AbstractMemberDefinition() {}
@@ -63,6 +67,10 @@
}
}
+ public void setOriginalDefinition(ITextSourceReference def) {
+ originalDefinition = def;
+ }
+
public IAnnotatable getMember() {
return member;
}
@@ -98,8 +106,19 @@
a.setProject(context.getProject());
a.setDeclaration(ja);
addAnnotation(a, context);
+ addDependency(ja.getType(), context);
}
+ protected void addDependency(IMember reference, IRootDefinitionContext context) {
+ if(reference == null || reference.isBinary()) return;
+ if(!(resource instanceof IFile)) return;
+ IFile target = (IFile)resource;
+ IFile source = (IFile)reference.getResource();
+ if(target.exists() && source != null && source.exists()) {
+ context.addDependency(source.getFullPath(), target.getFullPath());
+ }
+ }
+
private void addAnnotation(AnnotationDeclaration a, IRootDefinitionContext context) {
AnnotationDeclaration b = null;
int kind = context.getAnnotationKind(a.getType());
@@ -204,4 +223,8 @@
public IResource getResource() {
return resource;
}
+
+ public ITextSourceReference getOriginalDefinition() {
+ return originalDefinition;
+ }
}
\ No newline at end of file
Modified:
trunk/cdi/plugins/org.jboss.tools.cdi.core/src/org/jboss/tools/cdi/internal/core/impl/definition/DefinitionContext.java
===================================================================
---
trunk/cdi/plugins/org.jboss.tools.cdi.core/src/org/jboss/tools/cdi/internal/core/impl/definition/DefinitionContext.java 2011-05-03
18:36:30 UTC (rev 31042)
+++
trunk/cdi/plugins/org.jboss.tools.cdi.core/src/org/jboss/tools/cdi/internal/core/impl/definition/DefinitionContext.java 2011-05-03
20:16:26 UTC (rev 31043)
@@ -48,6 +48,8 @@
Set<IDefinitionContextExtension> extensions = new
HashSet<IDefinitionContextExtension>();
+ private Dependencies dependencies = new Dependencies();
+
private DefinitionContext workingCopy;
private DefinitionContext original;
@@ -99,6 +101,7 @@
}
}
copy.beanXMLs.putAll(beanXMLs);
+ copy.dependencies = dependencies;
}
return copy;
@@ -208,6 +211,7 @@
}
for (IDefinitionContextExtension e: extensions) e.clean();
+ dependencies.clean();
}
public void clean(IPath path) {
@@ -230,6 +234,7 @@
}
for (IDefinitionContextExtension e: extensions) e.clean(path);
+ dependencies.clean(path);
}
public void clean(String typeName) {
@@ -357,6 +362,7 @@
packages = workingCopy.packages;
packageDefinitions = workingCopy.packageDefinitions;
beanXMLs = workingCopy.beanXMLs;
+ dependencies = workingCopy.dependencies;
Set<IProcessAnnotatedTypeFeature> fs =
project.getExtensionManager().getProcessAnnotatedTypeFeature();
if(fs != null && !fs.isEmpty()) {
@@ -458,6 +464,14 @@
TypeDefinition d = typeDefinitions.get(type.getFullyQualifiedName());
if(d != null) d.unveto();
}
+
+ public void addDependency(IPath source, IPath target) {
+ dependencies.addDependency(source, target);
+ }
+
+ public Dependencies getDependencies() {
+ return dependencies;
+ }
}
Added:
trunk/cdi/plugins/org.jboss.tools.cdi.core/src/org/jboss/tools/cdi/internal/core/impl/definition/Dependencies.java
===================================================================
---
trunk/cdi/plugins/org.jboss.tools.cdi.core/src/org/jboss/tools/cdi/internal/core/impl/definition/Dependencies.java
(rev 0)
+++
trunk/cdi/plugins/org.jboss.tools.cdi.core/src/org/jboss/tools/cdi/internal/core/impl/definition/Dependencies.java 2011-05-03
20:16:26 UTC (rev 31043)
@@ -0,0 +1,51 @@
+package org.jboss.tools.cdi.internal.core.impl.definition;
+
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+import org.eclipse.core.runtime.IPath;
+
+public class Dependencies {
+ protected Map<IPath, Set<IPath>> direct = new HashMap<IPath,
Set<IPath>>();
+ protected Map<IPath, Set<IPath>> reverse = new HashMap<IPath,
Set<IPath>>();
+
+ public Dependencies() {}
+
+ public void addDependency(IPath source, IPath target) {
+ Set<IPath> ps = direct.get(source);
+ if(ps == null) {
+ ps = new HashSet<IPath>();
+ direct.put(source, ps);
+ }
+ ps.add(target);
+
+ ps = reverse.get(target);
+ if(ps == null) {
+ ps = new HashSet<IPath>();
+ reverse.put(target, ps);
+ }
+ ps.add(source);
+ }
+
+ public void clean() {
+ direct.clear();
+ reverse.clear();
+ }
+
+ public void clean(IPath path) {
+ Set<IPath> ps = reverse.remove(path);
+ if(ps != null) {
+ for (IPath p: ps) {
+ Set<IPath> ps1 = direct.get(p);
+ if(ps1 != null) ps1.remove(path);
+ }
+ }
+ }
+
+ public Set<IPath> getDirectDependencies(IPath path) {
+ return direct.get(path);
+ }
+
+}
Property changes on:
trunk/cdi/plugins/org.jboss.tools.cdi.core/src/org/jboss/tools/cdi/internal/core/impl/definition/Dependencies.java
___________________________________________________________________
Added: svn:mime-type
+ text/plain
Modified:
trunk/cdi/plugins/org.jboss.tools.cdi.core/src/org/jboss/tools/cdi/internal/core/validation/CDICoreValidator.java
===================================================================
---
trunk/cdi/plugins/org.jboss.tools.cdi.core/src/org/jboss/tools/cdi/internal/core/validation/CDICoreValidator.java 2011-05-03
18:36:30 UTC (rev 31042)
+++
trunk/cdi/plugins/org.jboss.tools.cdi.core/src/org/jboss/tools/cdi/internal/core/validation/CDICoreValidator.java 2011-05-03
20:16:26 UTC (rev 31043)
@@ -90,6 +90,7 @@
import org.jboss.tools.cdi.internal.core.impl.ParametedType;
import org.jboss.tools.cdi.internal.core.impl.Parameter;
import org.jboss.tools.cdi.internal.core.impl.SessionBean;
+import org.jboss.tools.cdi.internal.core.impl.definition.Dependencies;
import org.jboss.tools.common.model.util.EclipseJavaUtil;
import org.jboss.tools.common.model.util.EclipseResourceUtil;
import org.jboss.tools.common.text.ITextSourceReference;
@@ -270,6 +271,26 @@
// linked again during validation.
getValidationContext().removeLinkedCoreResources(SHORT_ID, resources);
+ Dependencies ds = cdiProject.getNature().getDefinitions().getDependencies();
+ Set<IFile> dependentFiles = new HashSet<IFile>();
+ for(IFile file: filesToValidate) {
+ Set<IPath> dd = ds.getDirectDependencies(file.getFullPath());
+ if(dd != null && !dd.isEmpty()) {
+ for (IPath p: dd) {
+ IFile f = cdiProject.getNature().getProject().getParent().getFile(p);
+ if(f != null && f.exists() && !filesToValidate.contains(f))
dependentFiles.add(f);
+ }
+ }
+ }
+ if(!dependentFiles.isEmpty()) {
+ System.out.println("Dependencies=" + dependentFiles.size());
+ filesToValidate.addAll(dependentFiles);
+ }
+
+ // We should remove markers from the source files at first
+ for(IFile file: filesToValidate) {
+ removeAllMessagesFromResource(file);
+ }
// Then we can validate them
for (IFile file : filesToValidate) {
validateResource(file);
@@ -340,6 +361,10 @@
}
}
+ // We should remove markers from the source files at first
+ for(IFile file: filesToValidate) {
+ removeAllMessagesFromResource(file);
+ }
for (IFile file : filesToValidate) {
validateResource(file);
}
@@ -359,9 +384,6 @@
displaySubtask(CDIValidationMessages.VALIDATING_RESOURCE, new String[]
{file.getProject().getName(), file.getName()});
coreHelper.getValidationContextManager().addValidatedProject(this, file.getProject());
- // We should remove markers from the source file at first
- removeAllMessagesFromResource(file);
-
if("beans.xml".equalsIgnoreCase(file.getName()) &&
CDIPreferences.shouldValidateBeansXml(file.getProject())) {
// TODO should we check the path of the beans.xml? Or it's better to check the
every beans.xml even if it is not in META-INF or WEB-INF.
beansXmlValidator.validateBeansXml(file);