/*******************************************************************************
* Copyright (c) 2010, 2015 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.internal.core.scanner;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jdt.core.IPackageDeclaration;
import org.eclipse.jdt.core.IType;
import org.jboss.tools.cdi.core.CDICoreBuilder;
import org.jboss.tools.cdi.core.CDICoreNature;
import org.jboss.tools.cdi.core.CDICorePlugin;
import org.jboss.tools.cdi.core.ICDIBuilderDelegate;
import org.jboss.tools.cdi.core.ICDIProject;
import org.jboss.tools.cdi.internal.core.impl.CDIProject;
import org.jboss.tools.cdi.internal.core.impl.definition.BeansXMLDefinition;
import org.jboss.tools.cdi.internal.core.impl.definition.DefinitionContext;
import org.jboss.tools.cdi.internal.core.impl.definition.PackageDefinition;
import org.jboss.tools.cdi.internal.core.impl.definition.TypeDefinition;
import org.jboss.tools.common.model.XModelObject;
import org.jboss.tools.jst.web.kb.internal.KbBuilder;
/**
*
* @author Viacheslav Kabanovich
*
*/
public class CDIBuilderDelegate implements ICDIBuilderDelegate {
public int computeRelevance(IProject project) {
//nothing to compute, builder works only if cdi nature is present
return 1;
}
public String getID() {
return getClass().getName();
}
public Class<? extends ICDIProject> getProjectImplementationClass() {
return CDIProject.class;
}
public void build(IFileSet fileSet, CDICoreNature projectNature) {
build(fileSet, projectNature, null);
}
public void build(IFileSet fileSet, CDICoreNature projectNature, IProgressMonitor monitor) {
DefinitionContext context = projectNature.getDefinitions().getWorkingCopy();
build(fileSet, context, monitor);
}
public void build(IFileSet fileSet, DefinitionContext context) {
build(fileSet, context, null);
}
public void build(IFileSet fileSet, DefinitionContext context, IProgressMonitor monitor) {
Set<IPath> ps = fileSet.getAllPaths();
for (IPath p: ps) context.clean(p);
Map<IPath, List<IType>> as = fileSet.getAnnotations();
for (IPath f: as.keySet()) {
for (IType type: as.get(f)) {
//this builds annotation definition
context.getAnnotationKind(type);
}
}
Map<IPath, List<IType>> is = fileSet.getInterfaces();
for (IPath f: is.keySet()) {
for (IType type: is.get(f)) {
// Jars present package-info as binary interface
// whereas sources present it as compilation unit with package declaration.
if(type.getElementName().equals("package-info")) {
KbBuilder.checkCanceled(monitor);
PackageDefinition def = new PackageDefinition();
def.setBinaryType(type, context);
context.addPackage(f, def.getQualifiedName(), def);
}
}
}
Map<IPath, List<IType>> cs = fileSet.getClasses();
for (IPath f: cs.keySet()) {
for (IType type: cs.get(f)) {
KbBuilder.checkCanceled(monitor);
TypeDefinition def = new TypeDefinition();
def.setType(type, context, 0);
context.addType(f, type.getFullyQualifiedName(), def);
}
}
Map<IPath, IPackageDeclaration> pkgs = fileSet.getPackages();
for (IPath f: pkgs.keySet()) {
KbBuilder.checkCanceled(monitor);
IPackageDeclaration pkg = pkgs.get(f);
PackageDefinition def = new PackageDefinition();
def.setPackage(pkg, context);
context.addPackage(f, def.getQualifiedName(), def);
IResource res = pkg.getResource();
if(CDICoreBuilder.isPackageInfo(res)) {
IResource[] ms = new IResource[0];
try {
ms = res.getParent().members();
} catch (CoreException e) {
CDICorePlugin.getDefault().logError(e);
}
for (IResource m: ms) {
if(m instanceof IFile && !m.getName().equals(CDICoreBuilder.PACKAGE_INFO)) {
context.addDependency(f, m.getFullPath());
}
}
}
}
for (IPath f: ps) {
XModelObject beansXML = fileSet.getBeanXML(f);
if(beansXML == null) continue;
BeansXMLDefinition def = new BeansXMLDefinition();
def.setPath(f);
def.setBeansXML(beansXML);
context.addBeanXML(f, def);
}
}
}