/******************************************************************************* * Copyright (c) 2007 Red Hat, Inc. * Distributed under license by Red Hat, Inc. All rights reserved. * This program is made available under the terms of the * Eclipse Public License v1.0 which accompanies this distribution, * and is available at http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Red Hat, Inc. - initial API and implementation ******************************************************************************/ package org.jboss.tools.cdi.core; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import org.eclipse.core.resources.IContainer; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IFolder; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; 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; import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.core.runtime.OperationCanceledException; import org.eclipse.core.runtime.Path; import org.eclipse.jdt.core.IClassFile; import org.eclipse.jdt.core.IClasspathEntry; import org.eclipse.jdt.core.ICompilationUnit; import org.eclipse.jdt.core.IJavaElement; import org.eclipse.jdt.core.IJavaProject; import org.eclipse.jdt.core.IPackageDeclaration; import org.eclipse.jdt.core.IPackageFragment; import org.eclipse.jdt.core.IPackageFragmentRoot; import org.eclipse.jdt.core.IType; import org.eclipse.jdt.internal.core.JavaModelManager; import org.jboss.tools.cdi.core.extension.IDefinitionContextExtension; import org.jboss.tools.cdi.core.extension.feature.IBuildParticipant2Feature; import org.jboss.tools.cdi.core.extension.feature.IBuildParticipantFeature; import org.jboss.tools.cdi.internal.core.impl.CDIDisposedException; import org.jboss.tools.cdi.internal.core.impl.definition.AnnotationHelper; import org.jboss.tools.cdi.internal.core.impl.definition.DefinitionContext; import org.jboss.tools.cdi.internal.core.impl.definition.Dependencies; import org.jboss.tools.cdi.internal.core.impl.definition.PackageDefinition; import org.jboss.tools.cdi.internal.core.impl.definition.TypeDefinition; import org.jboss.tools.cdi.internal.core.scanner.CDIBuilderDelegate; import org.jboss.tools.cdi.internal.core.scanner.FileSet; import org.jboss.tools.cdi.internal.core.scanner.lib.BeanArchiveDetector; import org.jboss.tools.cdi.internal.core.scanner.lib.JarSet; import org.jboss.tools.common.EclipseUtil; import org.jboss.tools.common.model.XModelObject; import org.jboss.tools.common.model.util.EclipseJavaUtil; import org.jboss.tools.common.model.util.EclipseResourceUtil; import org.jboss.tools.common.util.UniquePaths; import org.jboss.tools.common.web.WebUtils; import org.jboss.tools.jst.web.kb.internal.KbBuilder; public class CDICoreBuilder extends IncrementalProjectBuilder { public static String BUILDER_ID = "org.jboss.tools.cdi.core.cdibuilder"; public static final String PACKAGE_INFO = "package-info.java"; static Set<ICDIBuilderDelegate> delegates = null; static Set<ICDIBuilderDelegate> getDelegates() { if(delegates == null) { delegates = new HashSet<ICDIBuilderDelegate>(); //TODO populate; extension point will be used delegates.add(new CDIBuilderDelegate()); //default } return delegates; } ICDIBuilderDelegate builderDelegate; CDIResourceVisitor resourceVisitor = null; Set<IBuildParticipantFeature> buildParticipants = null; Set<IBuildParticipant2Feature> buildParticipants2 = null; /** * Set only for instance created to initially load cdi model. */ CDICoreNature cdi; public CDICoreBuilder() {} public CDICoreBuilder(CDICoreNature cdi) throws CoreException { this.cdi = cdi; build(IncrementalProjectBuilder.FULL_BUILD, null, new NullProgressMonitor()); } CDICoreNature getCDICoreNature() { if(cdi != null) { return cdi; } IProject p = getProject(); if(p == null) return null; return CDICorePlugin.getCDI(p, false); } IProject getCurrentProject() { return cdi != null ? cdi.getProject() : getProject(); } CDIResourceVisitor getResourceVisitor() { if(resourceVisitor == null) { resourceVisitor = new CDIResourceVisitor(); } return resourceVisitor; } private void findDelegate() { Set<ICDIBuilderDelegate> ds = getDelegates(); int relevance = 0; for (ICDIBuilderDelegate d: ds) { int r = d.computeRelevance(getCurrentProject()); if(r > relevance) { builderDelegate = d; relevance = r; } } } public ICDIBuilderDelegate getDelegate() { return builderDelegate; } protected IProject[] build(int kind, Map args, IProgressMonitor monitor) throws CoreException { resourceVisitor = null; findDelegate(); if(getDelegate() == null) { return null; } CDICoreNature n = getCDICoreNature(); if(n == null) { return null; } if(n.updateVersion() || n.hasNoStorage()) { kind = FULL_BUILD; } n.postponeFiring(); long begin = System.currentTimeMillis(); boolean classPathShouldBeReset = false; try { n.resolveStorage(kind != FULL_BUILD); if(!n.requestForBuild()) { return null; } JavaModelManager manager = JavaModelManager.getJavaModelManager(); try { manager.cacheZipFiles(this); if(n.getDelegate() == null || n.getDelegate().getClass() != getDelegate().getProjectImplementationClass()) { if(n.getDelegate() != null) { n.clean(); n.postponeFiring(); } kind = FULL_BUILD; try { ICDIProject delegate = (ICDIProject)getDelegate().getProjectImplementationClass().newInstance(); n.setCDIProject(delegate); } catch (IllegalAccessException e1) { CDICorePlugin.getDefault().logError(e1); } catch (InstantiationException e2) { CDICorePlugin.getDefault().logError(e2); } } IncrementCheck increment = null; IResourceDelta delta = null; if(kind != FULL_BUILD) { delta = getDelta(getCurrentProject()); if(delta != null) { increment = new IncrementCheck(delta, n); if(!increment.isIncremental || increment.file == null) { increment = null; } } } if(increment == null) { n.cleanTypeFactory(); } if(kind == FULL_BUILD) n.getClassPath().reset(); //1. Check class path. boolean isClassPathUpdated = n.getClassPath().update(); JarSet newJars = new JarSet(); if(isClassPathUpdated || kind == FULL_BUILD) { classPathShouldBeReset = true; //2. Update class path. Removed paths will be cached to be applied to working copy of context. n.getClassPath().setSrcs(getResourceVisitor().srcs); newJars = n.getClassPath().process(); } if(isClassPathUpdated || buildParticipants == null) { //3. Install extensions. That should be done before constructing working copy of context. buildParticipants = n.getExtensionManager().getBuildParticipantFeatures(); buildParticipants2 = new HashSet<IBuildParticipant2Feature>(); Set<IDefinitionContextExtension> es = new HashSet<IDefinitionContextExtension>(); for (IBuildParticipantFeature p: buildParticipants) { IDefinitionContextExtension e = p.getContext(); if(e != null) es.add(e); if(p instanceof IBuildParticipant2Feature) { buildParticipants2.add((IBuildParticipant2Feature)p); } } n.getDefinitions().setExtensions(es); } //4. Create working copy of context. n.getDefinitions().newWorkingCopy(kind == FULL_BUILD); //5. Modify working copy of context. //5.1 Apply Removed paths. if(isClassPathUpdated) { n.getClassPath().applyRemovedPaths(); } for (IBuildParticipantFeature p: buildParticipants) p.beginVisiting(); //5.2 Discover sources and build definitions. if(isClassPathUpdated || kind == FULL_BUILD) { buildJars(newJars, monitor); n.getClassPath().validateProjectDependencies(); kind = FULL_BUILD; } else if(n.getClassPath().hasToUpdateProjectDependencies()) { n.getClassPath().validateProjectDependencies(); } //5.2.a Update bean discovery mode. if(updateBeanDiscoveryMode()) { kind = FULL_BUILD; if(this.cdi == null) { //excluding initial model loading getCDICoreNature().getValidationContext().setFullValidationRequired(true); } } if (kind == FULL_BUILD || delta == null) { increment = null; fullBuild(monitor); } else if(increment != null) { incrementalBuild(increment, monitor); } else { incrementalBuild(delta, monitor); } for (IBuildParticipantFeature p: buildParticipants) p.buildDefinitions(); // 6. Save created definitions to project context and build beans. if(increment != null) { getCDICoreNature().getDefinitions().applyIncrementalWorkingCopy(); } else { getCDICoreNature().getDefinitions().applyWorkingCopy(); } long end = System.currentTimeMillis(); n.fullBuildTime += end - begin; try { n.store(); } catch (IOException e) { CDICorePlugin.getDefault().logError(e); //$NON-NLS-1$ } // n.postBuild(); } catch (CDIDisposedException e) { //Do nothing, the nature or project is disposed. } catch (OperationCanceledException e) { //Recover partially built model. if(classPathShouldBeReset) { //we interrupt building jars in unknown state. //At the next build, jars should be completely rebuild. getCDICoreNature().getClassPath().clean(); } getCDICoreNature().getDefinitions().dropWorkingCopy(); throw e; } finally { manager.flushZipFiles(this); n.releaseBuild(); } } finally { n.fireChanges(); } resourceVisitor = null; return null; } private boolean updateBeanDiscoveryMode() { int oldValue = getCDICoreNature().getBeanDiscoveryMode(); int newValue = BeanArchiveDetector.ALL; if(getCDICoreNature().getVersion() != CDIVersion.CDI_1_0) { newValue = getBeanDiscoveryMode(getPrimaryBeanXML()); } getCDICoreNature().setBeanDiscoveryMode(newValue); return oldValue != newValue; } private int getBeanDiscoveryMode(XModelObject beansXML) { if(getCDICoreNature().getVersion() == CDIVersion.CDI_1_0) { return BeanArchiveDetector.ALL; } else if(beansXML == null) { return BeanArchiveDetector.ANNOTATED; } String bdm = beansXML.getAttributeValue("bean-discovery-mode"); if("annotated".equals(bdm)) { return BeanArchiveDetector.ANNOTATED; } else if("none".equals(bdm)) { return BeanArchiveDetector.NONE; } return BeanArchiveDetector.ALL; } private XModelObject getPrimaryBeanXML() { IWorkspaceRoot root = getCurrentProject().getWorkspace().getRoot(); CDIResourceVisitor visitor = getResourceVisitor(); for (IPath p: visitor.webinfs) { IFile f = root.getFile(p.append("beans.xml")); if(f.exists()) { XModelObject o = EclipseResourceUtil.getObjectByResource(f); if(o == null) { o = EclipseResourceUtil.createObjectForResource(f); } if(o != null) { return o; } } } for (IPath p: visitor.srcs) { IFile f = root.getFile(p.append("META-INF/beans.xml")); if(f.exists()) { XModelObject o = EclipseResourceUtil.getObjectByResource(f); if(o == null) { o = EclipseResourceUtil.createObjectForResource(f); } if(o != null) { return o; } } } return null; } protected void fullBuild(final IProgressMonitor monitor) throws CoreException { try { CDIResourceVisitor rv = getResourceVisitor(); rv.setProgressMonitor(monitor); rv.incremental = false; getCurrentProject().accept(rv); FileSet fs = rv.fileSet; if(getCDICoreNature().getBeanDiscoveryMode() == BeanArchiveDetector.NONE) { for (IPath path: fs.getClasses().keySet()) { getCDICoreNature().getDefinitions().getWorkingCopy().clean(path); } fs = new FileSet(); } invokeBuilderDelegates(fs, getCDICoreNature(), monitor); } catch (CoreException e) { CDICorePlugin.getDefault().logError(e); } } protected void incrementalBuild(IResourceDelta delta, IProgressMonitor monitor) throws CoreException { if(getCDICoreNature().getBeanDiscoveryMode() == BeanArchiveDetector.NONE) { return; } CDIResourceVisitor rv = getResourceVisitor(); rv.setProgressMonitor(monitor); rv.incremental = true; delta.accept(new SampleDeltaVisitor()); FileSet fs = rv.fileSet; invokeBuilderDelegates(fs, getCDICoreNature(), monitor); } protected void incrementalBuild(IncrementCheck increment, IProgressMonitor monitor) throws CoreException { if(getCDICoreNature().getBeanDiscoveryMode() == BeanArchiveDetector.NONE) { return; } CDIResourceVisitor rv = getResourceVisitor(); rv.incremental = true; rv.visit(increment.file); FileSet fs = rv.fileSet; invokeBuilderDelegates(fs, getCDICoreNature(), monitor); } protected void buildJars(JarSet newJars, IProgressMonitor monitor) throws CoreException { IJavaProject jp = EclipseResourceUtil.getJavaProject(getCDICoreNature().getProject()); if(jp == null) return; FileSet fileSet = new FileSet(); fileSet.setCheckVetoed(getCDICoreNature().getVersion() != CDIVersion.CDI_1_0); for (String jar: newJars.getBeanModules().keySet()) { Path path = new Path(jar); IPackageFragmentRoot root = BeanArchiveDetector.findPackageFragmentRoot(jar, jp); if (root == null || !root.exists()) { continue; } XModelObject beansXML = newJars.getBeanModules().get(jar); int bdm = getBeanDiscoveryMode(beansXML); if(bdm == BeanArchiveDetector.NONE) { continue; } boolean annotatedOnly = bdm == BeanArchiveDetector.ANNOTATED; IJavaElement[] es = root.getChildren(); for (IJavaElement e : es) { if (e instanceof IPackageFragment) { IPackageFragment pf = (IPackageFragment) e; IClassFile[] cs = pf.getClassFiles(); IType packageInfo = BeanArchiveDetector.findPackageInfo(cs); if(packageInfo != null && BeanArchiveDetector.isVetoed(packageInfo)) { continue; } for (IClassFile c : cs) { KbBuilder.checkCanceled(monitor); IType t = c.getType(); if(!annotatedOnly || BeanArchiveDetector.isAnnotatedBean(t, getCDICoreNature())) { fileSet.add(path, c.getType()); } } } } if(beansXML != null) { fileSet.setBeanXML(path, beansXML); } for (IBuildParticipantFeature p: buildParticipants) p.visitJar(path, root, beansXML); } if(!buildParticipants2.isEmpty()) { for (String jar: newJars.getFileSystems().keySet()) { Path path = new Path(jar); XModelObject fs = newJars.getFileSystems().get(jar); for (IBuildParticipant2Feature p: buildParticipants2) p.visitJar(path, fs); } } addBasicTypes(fileSet); invokeBuilderDelegates(fileSet, getCDICoreNature(), monitor); } void invokeBuilderDelegates(FileSet fileSet, CDICoreNature n, IProgressMonitor monitor) { builderDelegate.build(fileSet, n, monitor); for (IBuildParticipantFeature p: buildParticipants) { KbBuilder.checkCanceled(monitor); p.buildDefinitions(fileSet); } } void addBasicTypes(FileSet fs) throws CoreException { IJavaProject jp = EclipseResourceUtil.getJavaProject(getCurrentProject()); if(jp == null) return; for (String s: AnnotationHelper.SCOPE_ANNOTATION_TYPES) { IType type = EclipseJavaUtil.findType(jp, s); if(type != null) fs.add(type.getPath(), type); } for (String s: AnnotationHelper.QUALIFIER_ANNOTATION_TYPES) { IType type = EclipseJavaUtil.findType(jp, s); if(type != null) fs.add(type.getPath(), type); } for (String s: AnnotationHelper.STEREOTYPE_ANNOTATION_TYPES) { IType type = EclipseJavaUtil.findType(jp, s); if(type != null) fs.add(type.getPath(), type); } } protected void clean(IProgressMonitor monitor) throws CoreException { CDICoreNature n = getCDICoreNature(); 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.exists()) { result.add(f); } } return result; } /** * Check delta for incremental build to find that * 1) A single resource is changed, and * 2) It is a java source file, and * 3) It contains no annotations, no file level or inner static interfaces; and * 4) Each type was previously processed and TypeDefinition object is cached for it, * 5) Changes does not involve imports and super types. * * If all this checks pass isIncremental remains set to true, and is changed to false otherwise. * * This flag is used by build method to apply changes to model without * resetting all references to Java model objects in class beans that * may not be affected. * */ class IncrementCheck implements IResourceDeltaVisitor { IFile file = null; CDICoreNature n; boolean isIncremental = true; IncrementCheck(IResourceDelta delta, CDICoreNature n) throws CoreException { this.n = n; isIncremental = true; delta.accept(this); if(!isIncremental) { return; } isIncremental = false; if(file == null) { return; } IPath path = file.getFullPath(); CDIResourceVisitor v = new CDIResourceVisitor(); for (int i = 0; i < v.outs.length; i++) { if(v.outs[i].isPrefixOf(path)) { return; } } boolean foundInSrc = false; for (int i = 0; i < v.srcs.length && !foundInSrc; i++) { if(v.srcs[i].isPrefixOf(path)) { foundInSrc = true; } } if(!foundInSrc) { return; } ICompilationUnit unit = EclipseUtil.getCompilationUnit(file); if(unit == null) { return; } IType[] ts = unit.getTypes(); if(ts == null) { return; } FileSet fs = new FileSet(); fs.add(path, ts); if(!fs.getAnnotations().isEmpty() || !fs.getInterfaces().isEmpty() || !fs.getClasses().containsKey(path)) { return; } List<IType> types = fs.getClasses().get(path); for (IType t: types) { TypeDefinition oldDefinition = n.getDefinitions().getTypeDefinition(t.getFullyQualifiedName()); if(oldDefinition == null) { return; } TypeDefinition newDefinition = new TypeDefinition(); newDefinition.setType(t, n.getDefinitions(), 0); if(oldDefinition.getParametedType().getInheritanceCode() != newDefinition.getParametedType().getInheritanceCode()) { return; } } isIncremental = true; } public boolean visit(IResourceDelta delta) throws CoreException { if(!isIncremental) return false; IResource resource = delta.getResource(); switch (delta.getKind()) { case IResourceDelta.REMOVED: case IResourceDelta.ADDED: isIncremental = false; return false; case IResourceDelta.CHANGED: if(resource instanceof IFile) { IFile f = (IFile)resource; if(f.getName().toLowerCase().endsWith(".class")) { return false; } if(file != null || !f.getName().toLowerCase().endsWith(".java") || isPackageInfo(f)) { isIncremental = false; return false; } else { file = f; } } } return true; } } class SampleDeltaVisitor implements IResourceDeltaVisitor { /* * @see org.eclipse.core.resources.IResourceDeltaVisitor#visit(org.eclipse.core.resources.IResourceDelta) */ public boolean visit(IResourceDelta delta) throws CoreException { IResource resource = delta.getResource(); switch (delta.getKind()) { case IResourceDelta.ADDED: return getResourceVisitor().visit(resource); case IResourceDelta.REMOVED: CDICoreNature p = getCDICoreNature(); CDIResourceVisitor v = getResourceVisitor(); Set<IFile> fs = getDependentFiles(resource.getFullPath(), v.visited); for (IFile f: fs) { v.visit(f); } if(p != null) { p.getDefinitions().getWorkingCopy().clean(resource.getFullPath()); } break; case IResourceDelta.CHANGED: return getResourceVisitor().visit(resource); } //return true to continue visiting children. return true; } } class CDIResourceVisitor implements IResourceVisitor { boolean incremental = false; FileSet fileSet = new FileSet(); IPath[] outs = new IPath[0]; IPath[] srcs = new IPath[0]; IPath[] webinfs = new IPath[0]; Set<IPath> visited = new HashSet<IPath>(); Map<IPath, PackageInfo> checkedPackages = new HashMap<IPath, PackageInfo>(); IProgressMonitor monitor = null; CDIResourceVisitor() { fileSet.setCheckVetoed(getCDICoreNature().getVersion() != CDIVersion.CDI_1_0); webinfs = WebUtils.getWebInfPaths(getCurrentProject()); getJavaSourceRoots(getCurrentProject()); } public void setProgressMonitor(IProgressMonitor monitor) { this.monitor = monitor; } void getJavaSourceRoots(IProject project) { IJavaProject javaProject = EclipseResourceUtil.getJavaProject(project); if(javaProject == null) return; List<IPath> ps = new ArrayList<IPath>(); List<IPath> os = new ArrayList<IPath>(); try { IPath output = javaProject.getOutputLocation(); if(output != null) os.add(output); IClasspathEntry[] es = javaProject.getResolvedClasspath(true); for (int i = 0; i < es.length; i++) { if(es[i].getEntryKind() == IClasspathEntry.CPE_SOURCE) { IResource findMember = ResourcesPlugin.getWorkspace().getRoot().findMember(es[i].getPath()); if(findMember != null && findMember.exists()) { ps.add(findMember.getFullPath()); } IPath out = es[i].getOutputLocation(); if(out != null && !os.contains(out)) { os.add(out); } } } srcs = ps.toArray(new IPath[ps.size()]); outs = os.toArray(new IPath[os.size()]); } catch(CoreException ce) { CDICorePlugin.getDefault().logError("Error while locating java source roots for " + project, ce); } } public boolean visit(IResource resource) throws CoreException { KbBuilder.checkCanceled(monitor); IPath path = resource.getFullPath(); path = UniquePaths.getInstance().intern(path); if(resource instanceof IFile) { if(visited.contains(path)) { return false; } visited.add(path); IFile f = (IFile)resource; for (int i = 0; i < outs.length; i++) { if(outs[i].isPrefixOf(path)) { return false; } } for (int i = 0; i < srcs.length; i++) { if(srcs[i].isPrefixOf(path)) { if(f.getName().endsWith(".java")) { ICompilationUnit unit = EclipseUtil.getCompilationUnit(f); if(unit!=null) { if(isPackageInfo(f)) { IPackageDeclaration[] pkg = unit.getPackageDeclarations(); if(pkg != null && pkg.length > 0) { fileSet.add(f.getFullPath(), pkg[0]); if(incremental) { IResource[] ms = resource.getParent().members(); for (IResource m: ms) { if(m instanceof IFile && !isPackageInfo((IFile)m)) { visit(m); } } } } } else { IType[] ts = isInVetoedPackage(f) ? new IType[0] : unit.getTypes(); //do not filter vetoed types now, do it in FileSet to process nested types. if(ts.length > 0 && getCDICoreNature().getBeanDiscoveryMode() == BeanArchiveDetector.ANNOTATED) { ts = BeanArchiveDetector.getAnnotatedTypes(ts, getCDICoreNature()); } fileSet.add(f.getFullPath(), ts); } } } else if(path.segmentCount() == srcs[i].segmentCount() + 2 && "META-INF".equals(path.segments()[path.segmentCount() - 2])) { 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; } } for (IPath webinf: webinfs) { if(webinf.isPrefixOf(path)) { if(webinf.segmentCount() == path.segmentCount() - 1) { addBeansXML(f, fileSet); } 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) { for (IPath out: outs) { if(out.isPrefixOf(path)) { return false; } } for (IPath src: srcs) { if(src.isPrefixOf(path) || path.isPrefixOf(src)) { return true; } } for (IPath webinf: webinfs) { if(webinf.isPrefixOf(path) || path.isPrefixOf(webinf)) { return true; } } if(resource == resource.getProject()) { return true; } return false; } //return true to continue visiting children. return true; } private boolean isInVetoedPackage(IFile f) throws CoreException { if(getCDICoreNature().getVersion() == CDIVersion.CDI_1_0) { return false; } IContainer c = f.getParent(); PackageInfo b = checkedPackages.get(c.getFullPath()); if(b == null) { b = new PackageInfo(c); checkedPackages.put(c.getFullPath(), b); } return b.exists && b.isVetoed; } } private class PackageInfo { IPath path = null; boolean exists = false; boolean isVetoed = false; PackageInfo(IContainer c) throws CoreException { IFile f = c.getFile(new Path(PACKAGE_INFO)); path = f.getFullPath(); exists = f.exists(); if(exists) { DefinitionContext context = getCDICoreNature().getDefinitions().getWorkingCopy(); ICompilationUnit unit = EclipseUtil.getCompilationUnit(f); IPackageDeclaration[] pkg = unit.getPackageDeclarations(); if(pkg != null && pkg.length > 0) { PackageDefinition def = null; //we cannot be sure that copy in context is up to date. //context.getPackageDefinition(pkg[0].getElementName()); if(def == null) { def = new PackageDefinition(); def.setPackage(pkg[0], context); //Add to context now? } isVetoed = def.isVetoed(); } } } } private void addBeansXML(IFile f, FileSet fileSet) { if(f.getName().equals("beans.xml")) { XModelObject beansXML = EclipseResourceUtil.getObjectByResource(f); if(beansXML == null) { beansXML = EclipseResourceUtil.createObjectForResource(f); } if(beansXML != null) { fileSet.setBeanXML(f.getFullPath(), beansXML); } } } public static boolean isPackageInfo(IResource f) { return f instanceof IFile && f.getName().equals(PACKAGE_INFO); } }