| /******************************************************************************* |
| * Copyright (c) 2008-2010 Sonatype, Inc. |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License 2.0 |
| * which accompanies this distribution, and is available at |
| * https://www.eclipse.org/legal/epl-2.0/ |
| * |
| * SPDX-License-Identifier: EPL-2.0 |
| * |
| * Contributors: |
| * Sonatype, Inc. - initial API and implementation |
| *******************************************************************************/ |
| |
| package org.eclipse.m2e.editor.xml; |
| |
| import org.w3c.dom.Element; |
| import org.w3c.dom.Node; |
| import org.w3c.dom.NodeList; |
| |
| import org.eclipse.jface.action.IContributionItem; |
| import org.eclipse.jface.dialogs.Dialog; |
| import org.eclipse.jface.viewers.ILabelProvider; |
| import org.eclipse.jface.viewers.ILabelProviderListener; |
| import org.eclipse.jface.viewers.TreeViewer; |
| import org.eclipse.swt.graphics.Image; |
| import org.eclipse.wst.xml.ui.views.contentoutline.XMLContentOutlineConfiguration; |
| |
| import org.eclipse.m2e.core.ui.internal.util.XmlUtils; |
| |
| |
| /** |
| * @author Eugene Kuleshov |
| */ |
| public class PomContentOutlineConfiguration extends XMLContentOutlineConfiguration { |
| |
| public ILabelProvider getLabelProvider(TreeViewer viewer) { |
| return new PomLabelProvider(super.getLabelProvider(viewer)); |
| } |
| |
| /** |
| * POM label provider |
| */ |
| private final class PomLabelProvider implements ILabelProvider { |
| |
| private static final String TARGET_PATH = "targetPath"; //$NON-NLS-1$ |
| |
| private static final String DIRECTORY = "directory"; //$NON-NLS-1$ |
| |
| private static final String REPORT_SET = "reportSet"; //$NON-NLS-1$ |
| |
| private static final String PROPERTIES = "properties"; //$NON-NLS-1$ |
| |
| private static final String REPORTING = "reporting"; //$NON-NLS-1$ |
| |
| private static final String BUILD = "build"; //$NON-NLS-1$ |
| |
| private static final String EXCLUDE = "exclude"; //$NON-NLS-1$ |
| |
| private static final String INCLUDE = "include"; //$NON-NLS-1$ |
| |
| private static final String FILTER = "filter"; //$NON-NLS-1$ |
| |
| private static final String TEST_RESOURCE = "testResource"; //$NON-NLS-1$ |
| |
| private static final String RESOURCE = "resource"; //$NON-NLS-1$ |
| |
| private static final String TEST_RESOURCES = "testResources"; //$NON-NLS-1$ |
| |
| private static final String RESOURCES = "resources"; //$NON-NLS-1$ |
| |
| private static final String GOAL = "goal"; //$NON-NLS-1$ |
| |
| private static final String EXECUTION = "execution"; //$NON-NLS-1$ |
| |
| private static final String PLUGIN = "plugin"; //$NON-NLS-1$ |
| |
| private static final String PLUGINS = "plugins"; //$NON-NLS-1$ |
| |
| private static final String SNAPSHOT_REPOSITORY = "snapshotRepository"; //$NON-NLS-1$ |
| |
| private static final String PLUGIN_REPOSITORY = "pluginRepository"; //$NON-NLS-1$ |
| |
| private static final String REPOSITORY = "repository"; //$NON-NLS-1$ |
| |
| private static final String SITE = "site"; //$NON-NLS-1$ |
| |
| private static final String CONTRIBUTOR = "contributor"; //$NON-NLS-1$ |
| |
| private static final String DEVELOPER = "developer"; //$NON-NLS-1$ |
| |
| private static final String PROFILE = "profile"; //$NON-NLS-1$ |
| |
| private static final String PROFILES = "profiles"; //$NON-NLS-1$ |
| |
| private static final String MODULE = "module"; //$NON-NLS-1$ |
| |
| private static final String EXTENSION = "extension"; //$NON-NLS-1$ |
| |
| private static final String EXCLUSION = "exclusion"; //$NON-NLS-1$ |
| |
| private static final String MODULES = "modules"; //$NON-NLS-1$ |
| |
| private static final String EXTENSIONS = "extensions"; //$NON-NLS-1$ |
| |
| private static final String EXCLUSIONS = "exclusions"; //$NON-NLS-1$ |
| |
| private static final String DEPENDENCIES = "dependencies"; //$NON-NLS-1$ |
| |
| private static final String PARENT = "parent"; //$NON-NLS-1$ |
| |
| private static final String SCOPE = "scope"; //$NON-NLS-1$ |
| |
| private static final String TYPE = "type"; //$NON-NLS-1$ |
| |
| private static final String CLASSIFIER = "classifier"; //$NON-NLS-1$ |
| |
| private static final String DEPENDENCY = "dependency"; //$NON-NLS-1$ |
| |
| private static final String ID = "id"; //$NON-NLS-1$ |
| |
| private static final String EMAIL = "email"; //$NON-NLS-1$ |
| |
| private static final String NAME = "name"; //$NON-NLS-1$ |
| |
| private static final String VERSION = "version"; //$NON-NLS-1$ |
| |
| private static final String GROUP_ID = "groupId"; //$NON-NLS-1$ |
| |
| private static final String ARTIFACT_ID = "artifactId"; //$NON-NLS-1$ |
| |
| private static final String NAMESPACE_POM = "http://maven.apache.org/POM/4.0.0"; //$NON-NLS-1$ |
| |
| private static final int MAX_LABEL_LENGTH = 120; |
| |
| private final ILabelProvider labelProvider; |
| |
| private PomLabelProvider(ILabelProvider labelProvider) { |
| this.labelProvider = labelProvider; |
| } |
| |
| public Image getImage(Object element) { |
| Node node = (Node) element; |
| String namespace = node.getNamespaceURI(); |
| String nodeName = node.getNodeName(); |
| |
| if(node.getNodeType() == Node.COMMENT_NODE) { |
| return labelProvider.getImage(element); |
| } |
| |
| if(NAMESPACE_POM.equals(namespace)) { |
| if(PARENT.equals(nodeName)) { |
| return MvnImages.IMG_JAR; |
| |
| } else if(DEPENDENCIES.equals(nodeName) // |
| || EXCLUSIONS.equals(nodeName) // |
| || EXTENSIONS.equals(nodeName) // |
| || MODULES.equals(nodeName)) { |
| return MvnImages.IMG_JARS; |
| |
| } else if(DEPENDENCY.equals(nodeName) // |
| || EXCLUSION.equals(nodeName) // |
| || EXTENSION.equals(nodeName) // |
| || MODULE.equals(nodeName)) { |
| // TODO show folder if module is in the workspace |
| return MvnImages.IMG_JAR; |
| |
| } else if(REPOSITORY.equals(nodeName) || PLUGIN_REPOSITORY.equals(nodeName) |
| || SNAPSHOT_REPOSITORY.equals(nodeName) || SITE.equals(nodeName)) { |
| return MvnImages.IMG_REPOSITORY; |
| |
| } else if(PROFILES.equals(nodeName)) { |
| return MvnImages.IMG_PROFILES; |
| |
| } else if(PROFILE.equals(nodeName)) { |
| return MvnImages.IMG_PROFILE; |
| |
| } else if(DEVELOPER.equals(nodeName) || CONTRIBUTOR.equals(nodeName)) { |
| return MvnImages.IMG_PERSON; |
| |
| } else if(PLUGINS.equals(nodeName)) { |
| return MvnImages.IMG_PLUGINS; |
| |
| } else if(PLUGIN.equals(nodeName)) { |
| return MvnImages.IMG_PLUGIN; |
| |
| } else if(EXECUTION.equals(nodeName)) { |
| return MvnImages.IMG_EXECUTION; |
| |
| } else if(GOAL.equals(nodeName)) { |
| return MvnImages.IMG_GOAL; |
| |
| } else if(RESOURCES.equals(nodeName) // |
| || TEST_RESOURCES.equals(nodeName)) { |
| return MvnImages.IMG_RESOURCES; |
| |
| } else if(RESOURCE.equals(nodeName) // |
| || TEST_RESOURCE.equals(nodeName)) { |
| return MvnImages.IMG_RESOURCE; |
| |
| } else if(FILTER.equals(nodeName)) { |
| return MvnImages.IMG_FILTER; |
| |
| } else if(INCLUDE.equals(nodeName)) { |
| return MvnImages.IMG_INCLUDE; |
| |
| } else if(EXCLUDE.equals(nodeName)) { |
| return MvnImages.IMG_EXCLUDE; |
| |
| } else if(BUILD.equals(nodeName)) { |
| return MvnImages.IMG_BUILD; |
| |
| } else if(REPORTING.equals(nodeName)) { |
| return MvnImages.IMG_REPORT; |
| |
| } else if(PROPERTIES.equals(nodeName)) { |
| return MvnImages.IMG_PROPERTIES; |
| |
| } else if(PROPERTIES.equals(node.getParentNode().getNodeName())) { |
| return MvnImages.IMG_PROPERTY; |
| |
| // } else if("mailingList".equals(nodeName)) { |
| // return MvnImages.IMG_MAIL; |
| |
| } |
| |
| return MvnImages.IMG_ELEMENT; |
| } |
| |
| return labelProvider.getImage(element); |
| } |
| |
| public String getText(Object element) { |
| String text = labelProvider.getText(element); |
| |
| Node node = (Node) element; |
| String namespace = node.getNamespaceURI(); |
| String nodeName = node.getNodeName(); |
| |
| if(node.getNodeType() == Node.COMMENT_NODE) { |
| return cleanText(node); |
| } |
| |
| if(NAMESPACE_POM.equals(namespace)) { |
| if(PARENT.equals(nodeName)) { |
| return getLabel(text, node, GROUP_ID, ARTIFACT_ID, VERSION); |
| |
| } else if(DEPENDENCY.equals(nodeName)) { |
| return getLabel(text, node, GROUP_ID, ARTIFACT_ID, VERSION, CLASSIFIER, TYPE, SCOPE); |
| |
| } else if(EXCLUSION.equals(nodeName)) { |
| return getLabel(text, node, GROUP_ID, ARTIFACT_ID); |
| |
| } else if(EXTENSION.equals(nodeName)) { |
| return getLabel(text, node, GROUP_ID, ARTIFACT_ID, VERSION); |
| |
| } else if(REPOSITORY.equals(nodeName) || PLUGIN_REPOSITORY.equals(nodeName) |
| || SNAPSHOT_REPOSITORY.equals(nodeName) || SITE.equals(nodeName) || PROFILE.equals(nodeName) |
| || EXECUTION.equals(nodeName)) { |
| return getLabel(text, node, ID); |
| |
| } else if("mailingList".equals(nodeName)) { //$NON-NLS-1$ |
| return getLabel(text, node, NAME); |
| |
| } else if(DEVELOPER.equals(nodeName)) { |
| return getLabel(text, node, ID, NAME, EMAIL); |
| |
| } else if(CONTRIBUTOR.equals(nodeName)) { |
| return getLabel(text, node, NAME, EMAIL); |
| |
| } else if(PLUGIN.equals(nodeName)) { |
| return getLabel(text, node, GROUP_ID, ARTIFACT_ID, VERSION); |
| |
| } else if(RESOURCE.equals(nodeName) || TEST_RESOURCE.equals(nodeName)) { |
| return getLabel(text, node, DIRECTORY, TARGET_PATH); |
| |
| } else if(REPORT_SET.equals(nodeName)) { |
| return getLabel(text, node, ID); |
| |
| } else if(EXECUTION.equals(nodeName)) { |
| return getLabel(text, node, ID); |
| |
| } |
| |
| NodeList childNodes = node.getChildNodes(); |
| if(childNodes.getLength() == 1) { |
| Node item = childNodes.item(0); |
| short nodeType = item.getNodeType(); |
| if(nodeType == Node.TEXT_NODE || nodeType == Node.COMMENT_NODE) { |
| String nodeText = item.getNodeValue(); |
| if(nodeText.length() > 0) { |
| return text + " " + cleanText(item); //$NON-NLS-1$ |
| } |
| } |
| } |
| } |
| |
| return text; |
| } |
| |
| public boolean isLabelProperty(Object element, String name) { |
| return labelProvider.isLabelProperty(element, name); |
| } |
| |
| public void addListener(ILabelProviderListener listener) { |
| labelProvider.addListener(listener); |
| } |
| |
| public void removeListener(ILabelProviderListener listener) { |
| labelProvider.removeListener(listener); |
| } |
| |
| public void dispose() { |
| labelProvider.dispose(); |
| } |
| |
| private String getLabel(String text, Node node, String... names) { |
| StringBuilder sb = new StringBuilder(text).append(" "); //$NON-NLS-1$ |
| String sep = ""; //$NON-NLS-1$ |
| for(String name : names) { |
| String value = getValue(node, name); |
| if(value != null) { |
| sb.append(sep).append(value); |
| sep = " : "; //$NON-NLS-1$ |
| } |
| } |
| |
| return sb.toString(); |
| } |
| |
| private String getValue(Node node, String name) { |
| String val = XmlUtils.getTextValue(XmlUtils.findChild((Element) node, name)); |
| if(val != null && val.trim().length() == 0) { |
| //keep the previous contract of the getValue method. |
| val = null; |
| } |
| return val; |
| } |
| |
| private String cleanText(Node node) { |
| String value = node.getNodeValue(); |
| if(value == null) { |
| return ""; //$NON-NLS-1$ |
| } |
| |
| value = value.replaceAll("\\s", " ").replaceAll("(\\s){2,}", " ").trim(); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ |
| if(value.length() > MAX_LABEL_LENGTH) { |
| value = value.substring(0, 120) + Dialog.ELLIPSIS; |
| } |
| |
| return value; |
| } |
| } |
| |
| @Override |
| protected IContributionItem[] createMenuContributions(TreeViewer viewer) { |
| if(viewer == null || viewer.getTree().isDisposed()) { |
| return new IContributionItem[0]; |
| } |
| return super.createMenuContributions(viewer); |
| } |
| } |