/*******************************************************************************
* Copyright (c) 2006, 2008 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.ui.navigator.model;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.eclipse.core.resources.IResource;
import org.eclipse.jdt.core.IType;
import org.eclipse.swt.graphics.Image;
import org.springframework.ide.eclipse.aop.core.Activator;
import org.springframework.ide.eclipse.aop.core.model.IAopReference;
import org.springframework.ide.eclipse.aop.core.util.AopReferenceModelUtils;
import org.springframework.ide.eclipse.beans.core.internal.model.BeansModelUtils;
import org.springframework.ide.eclipse.beans.core.model.IBean;
import org.springframework.ide.eclipse.beans.ui.BeansUIImages;
import org.springframework.ide.eclipse.beans.ui.BeansUIPlugin;
import org.springframework.ide.eclipse.beans.ui.BeansUIUtils;
/**
* @author Christian Dupuis
* @author Torsten Juergeleit
* @since 2.0
*/
public class BeanReferenceNode implements IReferenceNode,
IRevealableReferenceNode {
private String beanId;
private boolean showChildren = true;
private List<IAopReference> aspectReferences = new ArrayList<IAopReference>();
private List<IAopReference> adviseReferences = new ArrayList<IAopReference>();
private List<IAopReference> declareParentReferences = new ArrayList<IAopReference>();
private List<IAopReference> declaredOnReferences = new ArrayList<IAopReference>();
private List<IReferenceNode> innerBeanNodes = new ArrayList<IReferenceNode>();
public BeanReferenceNode(String beanId, boolean showChildren) {
this.beanId = beanId;
this.showChildren = showChildren;
IBean bean = AopReferenceModelUtils.getBeanFromElementId(beanId);
IType type = BeansModelUtils.getBeanType(bean, null);
if (type != null) {
List<IAopReference> references = Activator.getModel()
.getAllReferences();
Set<IBean> innerBeans = BeansModelUtils.getInnerBeans(bean);
Map<String, BeanReferenceNode> refs = new HashMap<String, BeanReferenceNode>();
for (IBean innerBean : innerBeans) {
BeanReferenceNode n = new BeanReferenceNode(innerBean
.getElementID(), true);
refs.put(innerBean.getElementID(), n);
for (IAopReference r : references) {
if (innerBean.getElementID().equals(r.getTargetBeanId())) {
refs.get(r.getTargetBeanId()).getAdviseReferences()
.add(r);
}
}
}
for (Map.Entry<String, BeanReferenceNode> e : refs.entrySet()) {
innerBeanNodes.add(e.getValue());
}
}
}
public BeanReferenceNode(String bean) {
this(bean, true);
}
public int getLineNumber() {
IBean bean = AopReferenceModelUtils.getBeanFromElementId(this.beanId);
if (bean != null) {
return bean.getElementStartLine();
}
else {
return -1;
}
}
public IResource getResource() {
IBean bean = AopReferenceModelUtils.getBeanFromElementId(this.beanId);
if (bean != null) {
return bean.getElementResource();
}
else {
return null;
}
}
public void openAndReveal() {
IBean bean = AopReferenceModelUtils.getBeanFromElementId(this.beanId);
if (bean != null) {
BeansUIUtils.openInEditor(bean);
}
}
public IReferenceNode[] getChildren() {
IBean bean = AopReferenceModelUtils.getBeanFromElementId(this.beanId);
if (bean != null && BeansModelUtils.getBeanClass(bean, null) != null
&& this.showChildren) {
List<IReferenceNode> children = new ArrayList<IReferenceNode>();
children.add(new BeanClassReferenceNode(
new BeanClassTargetReferenceNode(BeansModelUtils
.getBeanType(bean, null), this)));
if (this.innerBeanNodes.size() > 0) {
children.add(new InnerBeansReferenceNode(this.innerBeanNodes));
}
return children.toArray(new IReferenceNode[children.size()]);
}
else {
return new IReferenceNode[0];
}
}
public Image getImage() {
IBean bean = getBean();
if (bean != null) {
return BeansUIPlugin.getLabelProvider().getImage(bean);
}
else {
return BeansUIImages.getImage(BeansUIImages.IMG_OBJS_ERROR);
}
}
public String getText() {
IBean bean = getBean();
if (bean != null) {
return BeansUIPlugin.getLabelProvider().getText(bean) + " - "
+ ModelUtils.getFilePath(bean.getElementResource());
}
else {
return "<bean cannot be found>";
}
}
public boolean hasChildren() {
return getChildren() != null && getChildren().length > 0;
}
public IBean getBean() {
return AopReferenceModelUtils.getBeanFromElementId(this.beanId);
}
public List<IAopReference> getAdviseReferences() {
return adviseReferences;
}
public List<IAopReference> getAspectReferences() {
return aspectReferences;
}
public List<IAopReference> getDeclaredOnReferences() {
return declaredOnReferences;
}
public List<IAopReference> getDeclareParentReferences() {
return declareParentReferences;
}
public Object getReferenceParticipant() {
return getBean();
}
}