/******************************************************************************* * Copyright (c) 2003, 2004 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are 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: * IBM Corporation - initial API and implementation *******************************************************************************/ package org.eclipse.jst.common.internal.annotations.controller; import java.util.List; import org.eclipse.core.resources.IProject; import org.eclipse.emf.ecore.EObject; import org.eclipse.jdt.core.ICompilationUnit; import org.eclipse.jdt.core.IJavaProject; import org.eclipse.jdt.core.IType; import org.eclipse.jdt.core.JavaModelException; import org.eclipse.jem.util.emf.workbench.ProjectUtilities; import org.eclipse.jem.util.logger.proxy.Logger; import org.eclipse.jem.workbench.utility.JemProjectUtilities; import org.eclipse.jst.common.internal.annotations.core.AnnotationsAdapter; import org.eclipse.jst.common.internal.annotations.core.AnnotationsProviderManager; import org.eclipse.jst.common.internal.annotations.core.IAnnotationsProvider; /** * @author mdelder * */ public class AnnotationsControllerHelper { public static final AnnotationsControllerHelper INSTANCE = new AnnotationsControllerHelper(); protected AnnotationsControllerHelper() { super(); } /** * * @param eObject the annotated model object * @return true only if the object has annotations */ public boolean isAnnotated(EObject eObject) { if (AnnotationsAdapter.getAnnotations(eObject, AnnotationsAdapter.GENERATED) != null) return true; List annotationsProviders = AnnotationsProviderManager.INSTANCE.getAnnotationsProviders(); for (int i=0; i<annotationsProviders.size(); i++) { IAnnotationsProvider provider = (IAnnotationsProvider) annotationsProviders.get(i); if (provider!=null && provider.isAnnotated(eObject)) return true; } return false; } /** * A convenience method to tag a model object as annotated * * @param eObject * @param value */ public void setAnnotated(EObject eObject, String value) { AnnotationsAdapter.addAnnotations(eObject, AnnotationsAdapter.GENERATED, value); } /** * A convenience method to tag a model object as annotated Annotations Adapters can hold extra * information. * * @param eObject * @param name * A string key * @param value * A String value */ public void addAnnotations(EObject eObject, String name, Object value) { AnnotationsAdapter.addAnnotations(eObject, name, value); } /** * A convenience method to tag a model object as annotated Annotations Adapters can hold extra * information. * * @param eObject * @param name * A string key * @param value * A String value */ public Object getAnnotations(EObject eObject, String name) { return AnnotationsAdapter.getAnnotations(eObject, name); } /** * Acquires the generated annotation comment and parses the Fragment URL of the following form * to return the tagset name: * * com.acme.ejbs.MyEJB# <tagset>/ <fragment>. <fragment-pointer> * * @param eObject * The annotated object * @return the value of <tagset>in the URL example */ public String getTagset(EObject eObject) { String tagset = getTagsetFromProviders(eObject); if (tagset == null) { tagset = getTagsetFromFragment(eObject); } return tagset; } /** * Acquires the generated annotation comment and parses the Fragment URL of the following form * to return the tagset name: * * com.acme.ejbs.MyEJB# <tagset>/ <fragment>. <fragment-pointer> * * @param eObject * The annotated object * @return the value of <tagset>in the URL example */ private String getTagsetFromFragment(EObject eObject) { String generatedComment = (String) AnnotationsAdapter.getAnnotations(eObject, AnnotationsAdapter.GENERATED); if (generatedComment == null || generatedComment.length() == 0) return null; int poundit = generatedComment.indexOf('#'); int slash = generatedComment.indexOf('/'); if (poundit < 0 || slash < 0 || poundit >= slash) return null; return generatedComment.substring(poundit + 1, slash); } /** * Detect the primary tagset used to create an eObject using the providers. * * @since 1.0.2 * @param eObject - An {@link EObject} that may be annotated. * @return a String array of the used tagset names. */ private String getTagsetFromProviders(EObject eObject) { String tagset = null; List annotationProviders = AnnotationsProviderManager.INSTANCE.getAnnotationsProviders(); int size = annotationProviders.size(); for (int i=0; i < size && tagset == null; i++) { IAnnotationsProvider provider = (IAnnotationsProvider) annotationProviders.get(i); tagset = provider != null ? provider.getPrimaryTagset(eObject) : null; } return tagset; } /** * Returns the CompilationUnit associated with the given model object * * @param eObject * an Annotated model Object * @return The compilation unit which was responsible for the generation of the model object */ public ICompilationUnit getAnnotatedCU(EObject eObject) { ICompilationUnit cu = getAnnotatedCUFromProvider(eObject); if (cu == null) { cu = getAnnotatedCUFromFragment(eObject); } return cu; } /** * Returns the CompilationUnit associated with the given model object * * @param eObject * an Annotated model Object * @return The compilation unit which was responsible for the generation of the model object */ private ICompilationUnit getAnnotatedCUFromFragment(EObject eObject) { String fragmentString = (String) AnnotationsAdapter.getAnnotations(eObject, AnnotationsAdapter.GENERATED); if (fragmentString == null) return null; String typeString = fragmentString; if (fragmentString.indexOf('#')>0) typeString = fragmentString.substring(0, fragmentString.indexOf('#')); IType itype; if (typeString != null && (itype = findType(typeString, eObject)) != null) { return itype.getCompilationUnit(); } return null; } /** * Need to delegate the retrieval of the annotated {@link ICompilationUnit} for * the passed eObject. There could be multiple but in this case the first will be returned. * * <p> * This API would need to be revisited in the future if there is a requirement to show * all {@link ICompilationUnit} elements that contribute to the eObject via annotations. * </p> * * @param eObject - an instance of an {@link EObject} that may be annotated. * @since 1.0.2 */ private ICompilationUnit getAnnotatedCUFromProvider(EObject eObject) { ICompilationUnit primaryCU = null; List annotationProviders = AnnotationsProviderManager.INSTANCE.getAnnotationsProviders(); int size = annotationProviders.size(); for (int i=0; i < size && primaryCU == null; i++) { IAnnotationsProvider provider = (IAnnotationsProvider) annotationProviders.get(i); primaryCU = provider != null ? provider.getPrimaryAnnotatedCompilationUnit(eObject) : null; } return primaryCU; } protected IType findType(String type, EObject eObject) { IType result = null; IProject project = ProjectUtilities.getProject(eObject); IJavaProject javaProject = JemProjectUtilities.getJavaProject(project); if (javaProject != null) try { result = javaProject.findType(type); } catch (JavaModelException e) { Logger.getLogger().logError(e); } return result; } /** * Return true if <code>project</code> has annotation support enabled on it. * * @return */ public boolean hasAnnotationSupport(IProject project) { return AnnotationsControllerManager.INSTANCE.hasAnnotationsBuilder(project); } }