/******************************************************************************* * Copyright (c) 2006, 2010 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.internal.model; import java.util.ArrayList; import java.util.Collection; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IResourceChangeListener; import org.eclipse.core.resources.IWorkspace; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.jdt.core.IJavaElement; import org.eclipse.jdt.core.IJavaProject; import org.springframework.ide.eclipse.aop.core.model.IAopModelChangedListener; import org.springframework.ide.eclipse.aop.core.model.IAopProject; import org.springframework.ide.eclipse.aop.core.model.IAopReference; import org.springframework.ide.eclipse.aop.core.model.IAopReferenceModel; import org.springframework.ide.eclipse.aop.core.util.AopReferenceModelUtils; import org.springframework.ide.eclipse.beans.core.model.IBean; import org.springframework.ide.eclipse.core.internal.model.resources.SpringResourceChangeListener; /** * @author Christian Dupuis * @since 2.0 */ public class AopReferenceModel implements IAopReferenceModel { private List<IAopModelChangedListener> listeners = new LinkedList<IAopModelChangedListener>(); private AopReferenceModelPeristence persistence; private Map<IJavaProject, IAopProject> projects = new ConcurrentHashMap<IJavaProject, IAopProject>(); private IResourceChangeListener workspaceListener; // private IModelChangeListener modelChangeListener; public void addProject(IJavaProject project, IAopProject aopProject) { this.projects.put(project, aopProject); } public void fireModelChanged() { for (IAopModelChangedListener listener : listeners) { listener.changed(); } } public List<IAopReference> getAdviceDefinition(IJavaElement je) { List<IAopReference> advices = new LinkedList<IAopReference>(); for (IAopReference reference : getAllReferences()) { if (reference.getSource() != null && reference.getSource().equals(je)) { advices.add(reference); } } return advices; } public List<IAopReference> getAllReferences() { List<IAopReference> refs = new ArrayList<IAopReference>(); for (Map.Entry<IJavaProject, IAopProject> e : projects.entrySet()) { refs.addAll(e.getValue().getAllReferences()); } return refs; } public List<IAopReference> getAllReferencesForResource(IResource resource) { List<IAopReference> references = new ArrayList<IAopReference>(); for (IAopReference ref : getAllReferences()) { if ((ref.getResource() != null && ref.getResource().equals(resource)) || (AopReferenceModelUtils.getBeanFromElementId(ref.getTargetBeanId()) != null && resource .equals(AopReferenceModelUtils.getBeanFromElementId(ref.getTargetBeanId()) .getElementResource())) || (ref.getSource() != null && resource.equals(ref.getSource().getResource())) || (ref.getTarget() != null && resource.equals(ref.getTarget().getResource())) || (ref.getDefinition().getResource().equals(resource))) { references.add(ref); } } return references; } public IAopProject getProject(IJavaProject project) { return getProjectWithInitialization(project); } public Collection<IAopProject> getProjects() { return this.projects.values(); } public IAopProject getProjectWithInitialization(IJavaProject project) { if (this.projects.containsKey(project)) { return this.projects.get(project); } else { IAopProject aopProject = new AopProject(project); addProject(project, aopProject); return aopProject; } } public boolean isAdvice(IJavaElement je) { return getAdviceDefinition(je).size() > 0; } public boolean isAdvised(IJavaElement je) { if (je != null) { List<IAopReference> references = getAllReferences(); for (IAopReference reference : references) { if (reference.getTarget().equals(je)) { return true; } } } return false; } public boolean isAdvised(IBean bean) { if (bean != null) { String beanId = bean.getElementID(); List<IAopReference> references = getAllReferences(); for (IAopReference reference : references) { if (reference.getTargetBeanId().equals(beanId)) { return true; } } } return false; } public void registerAopModelChangedListener(IAopModelChangedListener listener) { this.listeners.add(listener); } public synchronized void removeProject(IJavaProject project) { for (IJavaProject jp : projects.keySet()) { if (jp.equals(project)) { projects.remove(jp); fireModelChanged(); break; } } } public synchronized void clearProjects() { this.projects.clear(); } public void shutdown() { // Remove the ResourceChangeListener from the Eclipse Workspace IWorkspace workspace = ResourcesPlugin.getWorkspace(); workspace.removeResourceChangeListener(workspaceListener); workspaceListener = null; // Persist model persistence.saveReferenceModel(); // Remove all projects projects.clear(); // BeansCorePlugin.getModel().removeChangeListener(modelChangeListener); } public void start() { // Add a ResourceChangeListener to the Eclipse Workspace workspaceListener = new SpringResourceChangeListener(new AopResourceChangeEvents()); IWorkspace workspace = ResourcesPlugin.getWorkspace(); workspace.addResourceChangeListener(workspaceListener, SpringResourceChangeListener.LISTENER_FLAGS); persistence = new AopReferenceModelPeristence(); persistence.loadReferenceModel(); // modelChangeListener = new AopBeansModelListener(); // BeansCorePlugin.getModel().addChangeListener(modelChangeListener); } public void unregisterAopModelChangedListener(IAopModelChangedListener listener) { this.listeners.remove(listener); } /* * private class AopBeansModelListener implements IModelChangeListener { * * public void elementChanged(ModelChangeEvent event) { if (event.getType() == ModelChangeEvent.Type.REMOVED && * event.getSource() instanceof IResource) { IResource resource = (IResource) event.getSource(); IJavaProject jp = * JdtUtils.getJavaProject(resource.getProject()); if (jp != null) { IAopProject ap = getProject(jp); if (ap != * null) { ap.clearReferencesForResource(resource); AopReferenceModelMarkerUtils.deleteProblemMarkers(resource); } } * } } } */ }