blob: d9e44b14798a91f91816ee9c4e6bdca957711e57 [file] [log] [blame]
/*******************************************************************************
* 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);
}
}