/*******************************************************************************
* Copyright (c) 2007, 2013 Spring IDE Developers
* 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:
* Spring IDE Developers - initial API and implementation
*******************************************************************************/
package org.springframework.ide.eclipse.aop.core.util;
import java.util.HashSet;
import java.util.LinkedHashSet;
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.resources.IResourceDelta;
import org.eclipse.core.resources.IncrementalProjectBuilder;
import org.eclipse.jdt.core.IField;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.IMember;
import org.eclipse.jdt.core.IMethod;
import org.eclipse.jdt.core.IType;
import org.eclipse.jdt.core.Signature;
import org.springframework.ide.eclipse.aop.core.model.IAopReference;
import org.springframework.ide.eclipse.beans.core.BeansCorePlugin;
import org.springframework.ide.eclipse.beans.core.BeansCoreUtils;
import org.springframework.ide.eclipse.beans.core.internal.model.BeansModelUtils;
import org.springframework.ide.eclipse.beans.core.internal.model.validation.BeansTypeHierachyState;
import org.springframework.ide.eclipse.beans.core.model.IBean;
import org.springframework.ide.eclipse.beans.core.model.IBeansConfig;
import org.springframework.ide.eclipse.beans.core.model.IBeansConfigSet;
import org.springframework.ide.eclipse.beans.core.model.IBeansImport;
import org.springframework.ide.eclipse.beans.core.model.IBeansModel;
import org.springframework.ide.eclipse.beans.core.model.IBeansProject;
import org.springframework.ide.eclipse.beans.core.model.IImportedBeansConfig;
import org.springframework.ide.eclipse.core.java.ITypeStructureCache;
import org.springframework.ide.eclipse.core.java.JdtUtils;
import org.springframework.ide.eclipse.core.java.TypeStructureState;
import org.springframework.ide.eclipse.core.project.IProjectContributorState;
/**
* Some helper methods.
* @author Christian Dupuis
* @author Torsten Juergeleit
*/
public class AopReferenceModelUtils {
private static final String JAVA_FILE_EXTENSION = ".java";
public static String getJavaElementLinkNameForMarker(IMember je) {
if (je == null) {
return "";
}
// use element name instead, qualified with parent
if (je instanceof IMethod) {
return ((IMethod) je).getDeclaringType().getFullyQualifiedName() + '.' + readableName((IMethod) je);
}
return getJavaElementLinkName(je);
}
public static String getJavaElementLinkName(IJavaElement je) {
if (je == null) {
return "";
}
// use element name instead, qualified with parent
if (je instanceof IMethod) {
// return je.getParent().getElementName() + '.' +
return readableName((IMethod) je);
}
else if (je instanceof IType) {
return je.getElementName();
}
else if (je instanceof IField) {
return je.getElementName() + " - " + ((IType) je.getParent()).getFullyQualifiedName();
}
else if (je.getParent() != null) {
return je.getParent().getElementName() + '.' + je.getElementName();
}
return je.getElementName();
}
public static String getPackageLinkName(IJavaElement je) {
if (je instanceof IMethod) {
return ((IMethod) je).getDeclaringType().getPackageFragment().getElementName();
}
else if (je instanceof IType) {
return ((IType) je).getPackageFragment().getElementName();
}
return je.getElementName();
}
public static String readableName(IMethod method) {
StringBuffer buffer = new StringBuffer(method.getElementName());
buffer.append('(');
String[] parameterTypes = method.getParameterTypes();
int length;
if (parameterTypes != null && (length = parameterTypes.length) > 0) {
for (int i = 0; i < length; i++) {
buffer.append(Signature.toString(parameterTypes[i]));
if (i < length - 1) {
buffer.append(", ");
}
}
}
buffer.append(')');
return buffer.toString();
}
public static String getElementDescription(IAopReference reference) {
StringBuffer buf = new StringBuffer(": <");
buf.append(reference.getDefinition().getAspectName());
buf.append("> [");
buf.append(reference.getDefinition().getResource().getProjectRelativePath().toString());
buf.append("]");
return buf.toString();
}
public static Set<IFile> getAffectedFilesFromBeansProject(IProject file) {
Set<IFile> affectedFiles = new HashSet<IFile>();
IBeansProject bp = BeansCorePlugin.getModel().getProject(file.getProject());
Set<IBeansConfig> configs = bp != null ? bp.getConfigs() : null;
if (configs != null && configs.size() > 0) {
for (IBeansConfig config : configs) {
affectedFiles.add((IFile) config.getElementResource());
}
}
return affectedFiles;
}
public static Set<IResource> getAffectedFiles(int kind, int deltaKind, IResource resource,
IProjectContributorState context) {
Set<IBeansConfig> configs = new HashSet<IBeansConfig>();
if (kind != IncrementalProjectBuilder.FULL_BUILD && resource instanceof IFile
&& resource.getName().endsWith(JAVA_FILE_EXTENSION)) {
// Make sure that the aop model is only reprocessed if a java structural change happens
TypeStructureState structureState = context.get(TypeStructureState.class);
BeansTypeHierachyState hierachyState = context.get(BeansTypeHierachyState.class);
if (structureState == null
|| structureState.hasStructuralChanges(resource, ITypeStructureCache.FLAG_ANNOTATION
| ITypeStructureCache.FLAG_ANNOTATION_VALUE)) {
if (deltaKind == IResourceDelta.REMOVED) {
IBeansProject beansProject = BeansCorePlugin.getModel().getProject(resource.getProject());
if (beansProject != null) {
for (IBeansConfig beansConfig : beansProject.getConfigs()) {
configs.add(beansConfig);
}
}
}
else {
for (IBeansConfig config : hierachyState.getConfigsByContainingTypes(resource)) {
configs.add(config);
}
}
}
}
else if (BeansCoreUtils.isBeansConfig(resource, true)) {
IBeansConfig beansConfig = (IBeansConfig) BeansModelUtils.getResourceModelElement(resource);
if (beansConfig instanceof IImportedBeansConfig) {
beansConfig = BeansModelUtils.getParentOfClass(beansConfig, IBeansConfig.class);
}
configs.add(beansConfig);
// Capture imports from other projects -> add importing config
for (IBeansProject bp : BeansCorePlugin.getModel().getProjects()) {
for (IBeansConfig bc : bp.getConfigs()) {
for (IBeansImport bi : bc.getImports()) {
for (IImportedBeansConfig ibc : bi.getImportedBeansConfigs()) {
if (ibc.getElementResource().equals(resource)) {
configs.add(bc);
}
}
}
}
}
}
// If the .classpath file is updated redo for every beans config
else if (JdtUtils.isClassPathFile(resource)) {
IBeansProject beansProject = BeansCorePlugin.getModel().getProject(resource.getProject());
if (beansProject != null) {
for (IBeansConfig beansConfig : beansProject.getConfigs()) {
configs.add(beansConfig);
}
}
}
Set<IResource> files = new LinkedHashSet<IResource>();
for (IBeansConfig config : configs) {
files.add(config.getElementResource());
}
return files;
}
public static Set<IResource> getAffectedFilesFromBeansConfig(Set<IResource> files) {
Set<IResource> newResources = new LinkedHashSet<IResource>();
for (IResource resource : files) {
// add confis from config set
IBeansProject project = BeansCorePlugin.getModel().getProject(resource.getProject());
IBeansConfig beansConfig = project.getConfig((IFile) resource);
if (project != null) {
Set<IBeansConfigSet> configSets = project.getConfigSets();
for (IBeansConfigSet configSet : configSets) {
if (configSet.getConfigs().contains(beansConfig)) {
Set<IBeansConfig> bcs = configSet.getConfigs();
for (IBeansConfig bc : bcs) {
newResources.add(bc.getElementResource());
}
}
}
}
}
newResources.addAll(files);
return newResources;
}
public static IBean getBeanFromElementId(String elementId) {
IBeansModel model = BeansCorePlugin.getModel();
return (IBean) model.getElement(elementId);
}
}