/******************************************************************************* * 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.seam.internal.core.scanner.java; import java.util.ArrayList; import java.util.List; import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.IPath; import org.eclipse.jdt.core.ICompilationUnit; import org.eclipse.jdt.core.dom.ASTRequestor; import org.eclipse.jdt.core.dom.ASTVisitor; import org.eclipse.jdt.core.dom.CompilationUnit; import org.eclipse.jdt.core.dom.IAnnotationBinding; import org.eclipse.jdt.core.dom.NormalAnnotation; import org.eclipse.jdt.core.dom.PackageDeclaration; import org.eclipse.jdt.core.dom.SingleMemberAnnotation; import org.jboss.tools.common.model.project.ext.impl.ValueInfo; import org.jboss.tools.seam.internal.core.SeamImport; import org.jboss.tools.seam.internal.core.SeamNamespace; import org.jboss.tools.seam.internal.core.scanner.LoadedDeclarations; /** * This object collects annotations from package-info.java. * * @author Viacheslav Kabanovich */ public class PackageInfoRequestor extends ASTRequestor { PackageInfoVisitor visitor = new PackageInfoVisitor(); LoadedDeclarations ds = new LoadedDeclarations(); IResource resource; IPath sourcePath; public PackageInfoRequestor(IResource resource) { this.resource = resource; this.sourcePath = resource.getFullPath(); } public LoadedDeclarations getDeclarations() { return ds; } public void acceptAST(ICompilationUnit source, CompilationUnit ast) { ast.accept(visitor); for (SeamNamespace n: visitor.namespaces) { n.setSourcePath(resource.getFullPath()); n.setPackage(visitor.javaPackage); } for (SeamImport i: visitor.imports) { i.setJavaPackage(visitor.javaPackage); } ds.getNamespaces().addAll(visitor.namespaces); ds.getImports().addAll(visitor.imports); } } class PackageInfoVisitor extends ASTVisitor implements SeamAnnotations { List<SeamNamespace> namespaces = new ArrayList<SeamNamespace>(); List<SeamImport> imports = new ArrayList<SeamImport>(); String javaPackage = null; public PackageInfoVisitor() {} public boolean visit(PackageDeclaration node) { if(node.getName() != null) { javaPackage = node.getName().getFullyQualifiedName(); } return true; } public boolean visit(NormalAnnotation node) { IAnnotationBinding b = node.resolveAnnotationBinding(); if(b != null) { String type = b.getAnnotationType().getQualifiedName(); if(NAMESPACE_ANNOTATION_TYPE.equals(type)) { ValueInfo value = ValueInfo.getValueInfo(node, "value"); ValueInfo prefix = ValueInfo.getValueInfo(node, "prefix"); SeamNamespace ns = new SeamNamespace(); if(value != null) { ns.setURI(value.getValue()); } if(prefix != null) { // } namespaces.add(ns); } else if(IMPORT_ANNOTATION_TYPE.equals(type)) { List<String> is = ComponentBuilder.getArrayValue(node); for (String s: is) { SeamImport i = new SeamImport(); i.setSeamPackage(s); imports.add(i); } } } return true; } public boolean visit(SingleMemberAnnotation node) { IAnnotationBinding b = node.resolveAnnotationBinding(); if(b != null) { String type = b.getAnnotationType().getQualifiedName(); if(IMPORT_ANNOTATION_TYPE.equals(type)) { List<String> is = ComponentBuilder.getArrayValue(node); for (String s: is) { SeamImport i = new SeamImport(); i.setSeamPackage(s); imports.add(i); } } } return true; } }