/******************************************************************************* * Copyright (c) 2012-2017 Codenvy, S.A. * 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: * Codenvy, S.A. - initial API and implementation *******************************************************************************/ package org.eclipse.che.plugin.maven.server.core.classpath; import org.eclipse.che.maven.data.MavenArtifactKey; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.Path; import org.eclipse.jdt.core.IAccessRule; import org.eclipse.jdt.core.IClasspathAttribute; import org.eclipse.jdt.core.IClasspathEntry; import org.eclipse.jdt.core.JavaCore; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; /** * Helps to create and manage {@link org.eclipse.jdt.core.IClasspathEntry}. * Inspired by org.eclipse.m2e.jdt.internal.ClasspathEntryDescriptor * @author Evgen Vidolob */ public class ClasspathEntryHelper { private IPath path; private IPath sourcePath; private IPath sourceRootPath; private IPath outputLocation; private boolean exported; private boolean combineAccessRules; private int kind; private List<IAccessRule> accessRules = new ArrayList<>(); private Map<String, String> attributes = new HashMap<>(); private Set<IPath> inclusionPatterns; private Set<IPath> exclusionPatterns; private MavenArtifactKey artifactKey; private Path sources; public ClasspathEntryHelper(IPath path, int kind) { this.path = path; this.kind = kind; } public ClasspathEntryHelper(IClasspathEntry classpathEntry) { setClasspathEntry(classpathEntry); } //Copied from org.eclipse.m2e.jdt.internal.ClasspathEntryDescriptor public IClasspathEntry toClasspathEntry() { Map<String, String> attributes = new HashMap<String, String>(this.attributes); if (artifactKey != null) { attributes.put(ClasspathManager.GROUP_ID_ATTRIBUTE, artifactKey.getGroupId()); attributes.put(ClasspathManager.ARTIFACT_ID_ATTRIBUTE, artifactKey.getArtifactId()); attributes.put(ClasspathManager.VERSION_ATTRIBUTE, artifactKey.getVersion()); attributes.put(ClasspathManager.PACKAGING_ATTRIBUTE, artifactKey.getPackaging()); if(artifactKey.getClassifier() != null) { attributes.put(ClasspathManager.CLASSIFIER_ATTRIBUTE, artifactKey.getClassifier()); } } IClasspathAttribute[] attributesArray = new IClasspathAttribute[attributes.size()]; int attributeIndex = 0; for (Map.Entry<String, String> attribute : attributes.entrySet()) { attributesArray[attributeIndex++] = JavaCore.newClasspathAttribute(attribute.getKey(), attribute.getValue()); } IAccessRule[] accessRulesArray = accessRules.toArray(new IAccessRule[accessRules.size()]); IClasspathEntry entry; switch (kind) { case IClasspathEntry.CPE_CONTAINER: entry = JavaCore.newContainerEntry(path, // accessRulesArray, // attributesArray, // exported); break; case IClasspathEntry.CPE_LIBRARY: entry = JavaCore.newLibraryEntry(path, // sourcePath, // sourceRootPath, // accessRulesArray, // attributesArray, // exported); break; case IClasspathEntry.CPE_SOURCE: entry = JavaCore.newSourceEntry(path, // getInclusionPatterns(), // getExclusionPatterns(), // outputLocation, // attributesArray); break; case IClasspathEntry.CPE_PROJECT: entry = JavaCore.newProjectEntry(path, // accessRulesArray, // combineAccessRules, // attributesArray, // exported); break; case IClasspathEntry.CPE_VARIABLE: entry = JavaCore.newVariableEntry(path, // sourcePath, // sourceRootPath, // accessRulesArray, // attributesArray, // exported); break; default: throw new IllegalArgumentException("Unsupported IClasspathEntry kind=" + kind); //$NON-NLS-1$ } return entry; } private IPath[] getExclusionPatterns() { if (exclusionPatterns != null) { return exclusionPatterns.toArray(new IPath[exclusionPatterns.size()]); } return null; } private IPath[] getInclusionPatterns() { if (inclusionPatterns != null) { return inclusionPatterns.toArray(new IPath[inclusionPatterns.size()]); } return null; } //Copied from org.eclipse.m2e.jdt.internal.ClasspathEntryDescriptor private void setClasspathEntry(IClasspathEntry entry) { this.kind = entry.getEntryKind(); this.path = entry.getPath(); this.exported = entry.isExported(); this.outputLocation = entry.getOutputLocation(); this.accessRules = new ArrayList<>(); for (IAccessRule rule : entry.getAccessRules()) { this.accessRules.add(rule); } this.attributes = new HashMap<>(); for (IClasspathAttribute attribute : entry.getExtraAttributes()) { attributes.put(attribute.getName(), attribute.getValue()); } this.sourcePath = entry.getSourceAttachmentPath(); this.sourceRootPath = entry.getSourceAttachmentRootPath(); setInclusionPatterns(entry.getInclusionPatterns()); setExclusionPatterns(entry.getExclusionPatterns()); this.combineAccessRules = entry.combineAccessRules(); String groupId = attributes.get(ClasspathManager.GROUP_ID_ATTRIBUTE); String artifactId = attributes.get(ClasspathManager.ARTIFACT_ID_ATTRIBUTE); String version = attributes.get(ClasspathManager.VERSION_ATTRIBUTE); String packaging = attributes.get(ClasspathManager.PACKAGING_ATTRIBUTE); String classifier = attributes.get(ClasspathManager.CLASSIFIER_ATTRIBUTE); if (groupId != null && artifactId != null && version != null) { this.artifactKey = new MavenArtifactKey(groupId, artifactId, version, packaging, classifier); } } private void setInclusionPatterns(IPath[] inclusionPatterns) { if (inclusionPatterns == null) { this.inclusionPatterns = null; } else { this.inclusionPatterns = new HashSet<>(Arrays.asList(inclusionPatterns)); } } public void setExclusionPatterns(IPath[] exclusionPatterns) { if (exclusionPatterns == null) { this.exclusionPatterns = null; } else { this.exclusionPatterns = new HashSet<>(Arrays.asList(exclusionPatterns)); } } public IPath getPath() { return path; } public Map<String, String> getClasspathAttribute() { return attributes; } public void setClasspathAttribute(String key, String value) { attributes.put(key, value); } public void setArtifactKey(MavenArtifactKey artifactKey) { this.artifactKey = artifactKey; } public MavenArtifactKey getArtifactKey() { return artifactKey; } public void setSourcePath(Path sources) { this.sourcePath = sources; } }