/******************************************************************************* * Copyright (c) 2004, 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.beans.ui.graph.editor; import org.eclipse.core.resources.IResource; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.ui.IEditorInput; import org.eclipse.ui.IMemento; import org.eclipse.ui.IPersistableElement; import org.springframework.ide.eclipse.beans.core.BeansCorePlugin; import org.springframework.ide.eclipse.beans.core.model.IBean; import org.springframework.ide.eclipse.beans.core.model.IBeanConstructorArgument; import org.springframework.ide.eclipse.beans.core.model.IBeanProperty; import org.springframework.ide.eclipse.beans.core.model.IBeansComponent; import org.springframework.ide.eclipse.beans.core.model.IBeansConfig; import org.springframework.ide.eclipse.beans.core.model.IBeansConfigSet; import org.springframework.ide.eclipse.beans.ui.BeansUIImages; import org.springframework.ide.eclipse.beans.ui.graph.BeansGraphPlugin; import org.springframework.ide.eclipse.core.io.ZipEntryStorage; import org.springframework.ide.eclipse.core.model.IModelElement; import org.springframework.util.ObjectUtils; /** * This editor input is used to specify the list of {@link IBean}s which should be displayed in the beans graph editor. * Therefore a source model model element ( * {@link IBean}>, {@link IBeanConfig} or {@link IBeanConfigSet}) has to be * specified. For a given bean it's parent bean (for child beans only), constructor argument values and property values * are checked. {@link IBean} look-up is done from the specified context ( * {@link IBeanConfig} or {@link IBeanConfigSet}). This list of beans is accessible via {@link #getBeans()}. This context used for bean look-up is accessible via * {@link #getContext()}. * @author Torsten Juergeleit * @author Christian Dupuis */ public class GraphEditorInput implements IEditorInput, IPersistableElement { private String elementId; private String contextId; private String name = "Spring Dependency Graph"; private String toolTip = " "; private boolean hasError; /** * Creates a list with all beans which are referenced from the model element defined by given ID. * @param elementID the model element's ID * @throws IllegalArgumentException if unsupported model element is specified */ public GraphEditorInput(String elementId) { this(elementId, getContext(elementId)); } /** * Creates a list with all beans which are referenced from the model element defined by given ID. * @param elementId the model element's ID * @param contextId the context's ID * @throws IllegalArgumentException if unsupported model element or context is specified */ public GraphEditorInput(String elementId, String contextId) { this.elementId = elementId; this.contextId = contextId; } protected void init() { IModelElement element = BeansCorePlugin.getModel().getElement(elementId); IModelElement context = BeansCorePlugin.getModel().getElement(contextId); // Prepare name and tooltip for given element and context if (element instanceof IBeansConfig) { String toolTipPrefix = BeansGraphPlugin.getResourceString("ShowGraphAction.name.config"); IBeansConfig config = (IBeansConfig) element; IResource resource = config.getElementResource(); if (resource != null) { if (config.isElementArchived()) { ZipEntryStorage storage = new ZipEntryStorage(config); name = storage.getName(); toolTip = toolTipPrefix + storage.getFile().getProjectRelativePath().toString() + " - " + storage.getFullPath().toString(); } else { name = resource.getName(); toolTip = toolTipPrefix + resource.getFullPath().toString(); } } else { name = BeansGraphPlugin.getResourceString("ShowGraphAction.name.undefined"); toolTip = BeansGraphPlugin.getResourceString("ShowGraphAction.name.config") + name; } } else if (element instanceof IBeansConfigSet) { IModelElement parent = ((IBeansConfigSet) element).getElementParent(); name = element.getElementName(); toolTip = BeansGraphPlugin.getResourceString("ShowGraphAction.name.configSet") + parent.getElementName() + '/' + element.getElementName(); } else if (element instanceof IBeansComponent || element instanceof IBean) { name = element.getElementName(); StringBuffer buffer = new StringBuffer(); if (element instanceof IBeansComponent) { buffer.append(BeansGraphPlugin.getResourceString("ShowGraphAction.name.component")); } else { buffer.append(BeansGraphPlugin.getResourceString("ShowGraphAction.name.bean")); } if (context instanceof IBeansConfig) { buffer.append(BeansGraphPlugin.getResourceString("ShowGraphAction.name.config")); buffer.append(context.getElementName()); buffer.append(": "); } else if (context instanceof IBeansConfigSet) { buffer.append(BeansGraphPlugin.getResourceString("ShowGraphAction.name.configSet")); buffer.append(context.getElementParent().getElementName()); buffer.append('/'); buffer.append(context.getElementName()); buffer.append(": "); } buffer.append(element.getElementName()); toolTip = buffer.toString(); } // else { // throw new IllegalArgumentException("Unsupported model element " + element); // } } private IModelElement getElement(String elementId) { return BeansCorePlugin.getModel().getElement(elementId); } public String getName() { return name; } public String getElementId() { return elementId; } public String getContextId() { return contextId; } public void setHasError(boolean hasError) { this.hasError = hasError; } public Object getAdapter(Class adapter) { if (adapter == IModelElement.class) { return getElement(elementId); } return null; } public boolean exists() { return true; } public ImageDescriptor getImageDescriptor() { return BeansUIImages.DESC_OBJS_SPRING; } public IPersistableElement getPersistable() { return (hasError ? null : this); } public String getToolTipText() { return toolTip; } public String getFactoryId() { return GraphEditorInputFactory.getFactoryId(); } public void saveState(IMemento memento) { GraphEditorInputFactory.saveState(memento, this); } @Override public boolean equals(Object other) { if (this == other) { return true; } if (!(other instanceof GraphEditorInput)) { return false; } GraphEditorInput that = (GraphEditorInput) other; if (!ObjectUtils.nullSafeEquals(this.elementId, that.elementId)) return false; return ObjectUtils.nullSafeEquals(this.contextId, that.contextId); } @Override public int hashCode() { int hashCode = ObjectUtils.nullSafeHashCode(elementId); return 29 * hashCode + ObjectUtils.nullSafeHashCode(contextId); } private static IModelElement getContext(IModelElement element) { if (element instanceof IBean) { return element.getElementParent(); } else if (element instanceof IBeanConstructorArgument || element instanceof IBeanProperty) { return element.getElementParent().getElementParent(); } return element; } private static String getContext(String elementId) { IModelElement element = BeansCorePlugin.getModel().getElement(elementId); return getContext(element).getElementID(); } }