/* * JBoss, Home of Professional Open Source * Copyright 2012, Red Hat Middleware LLC, and individual contributors * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * http://www.apache.org/licenses/LICENSE-2.0 * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.jboss.shrinkwrap.resolver.api.maven; import java.util.concurrent.ConcurrentHashMap; import org.jboss.shrinkwrap.resolver.api.maven.coordinate.MavenCoordinate; /** * Represents the valid values for the "packaging" portion of a {@link MavenCoordinate} * * @author <a href="mailto:alr@jboss.org">Andrew Lee Rubinger</a> * @author <a href="mailto:ggastald@redhat.com">George Gastaldi</a> */ public class PackagingType { private static final ConcurrentHashMap<String, PackagingType> cache = new ConcurrentHashMap<String, PackagingType>(); public static final PackagingType POM = new PackagingType("pom"); public static final PackagingType JAR = new PackagingType("jar"); public static final PackagingType TEST_JAR = new PackagingType("test-jar", "jar", "tests"); public static final PackagingType MAVEN_PLUGIN = new PackagingType("maven-plugin", "jar", ""); public static final PackagingType EJB_CLIENT = new PackagingType("ejb-client", "jar", "client"); public static final PackagingType EJB = new PackagingType("ejb", "jar", ""); public static final PackagingType WAR = new PackagingType("war"); public static final PackagingType EAR = new PackagingType("ear"); public static final PackagingType RAR = new PackagingType("rar"); public static final PackagingType PAR = new PackagingType("par"); public static final PackagingType JAVADOC = new PackagingType("javadoc", "jar", "javadoc"); public static final PackagingType JAVA_SOURCE = new PackagingType("java-source", "jar", "sources"); private final String id; private final String extension; private final String classifier; private PackagingType(final String id, final String extension, final String classifier) { this.id = id; this.extension = extension; this.classifier = classifier; cache.putIfAbsent(id, this); } private PackagingType(final String id) { this(id, id, ""); } /** * Returns type of the packaging. Might be the same as extension. * * @return Type of the packaging. */ public String getId() { return id; } /** * Returns extension for packaging. Might be the same as id; * * @return Extension for packaging. */ public String getExtension() { return extension; } /** * Returns classifier for packaging. Might be empty string. * * @return Classifier for packaging. */ public String getClassifier() { return classifier; } /** * Returns the canonical {@link String} value of this {@link PackagingType} * */ @Override public String toString() { return this.id; } /** * Builds a {@link PackagingType} object. * If an appropriate object is not found in a cache, then a new one is created and registered into the cache. * @see #fromCache(String) * * @param typeName * String name of the packaging type * @return Corresponding PackagingType object * @throws IllegalArgumentException * Thrown if typeName is {@code null} or empty */ public static PackagingType of(String typeName) throws IllegalArgumentException { PackagingType packagingType = fromCache(typeName); if (packagingType != null){ return packagingType; } // this will cause packaging object to register into cache return new PackagingType(typeName); } /** * Returns a {@link PackagingType} object from cache. Objects registered into cache by default are: * <pre><code> * PackagingType POM = new PackagingType("pom"); * PackagingType JAR = new PackagingType("jar"); * PackagingType TEST_JAR = new PackagingType("test-jar", "jar", "tests"); * PackagingType MAVEN_PLUGIN = new PackagingType("maven-plugin", "jar", ""); * PackagingType EJB_CLIENT = new PackagingType("ejb-client", "jar", "client"); * PackagingType EJB = new PackagingType("ejb", "jar", ""); * PackagingType WAR = new PackagingType("war"); * PackagingType EAR = new PackagingType("ear"); * PackagingType RAR = new PackagingType("rar"); * PackagingType PAR = new PackagingType("par"); * PackagingType JAVADOC = new PackagingType("javadoc", "jar", "javadoc"); * PackagingType JAVA_SOURCE = new PackagingType("java-source", "jar", "sources"); * </code></pre> * * @param typeName * String name of the packaging type * @return Corresponding PackagingType object retrieved from cache, otherwise null * @throws IllegalArgumentException * Thrown if typeName is {@code null} or empty */ public static PackagingType fromCache(String typeName) throws IllegalArgumentException { if (typeName == null || typeName.length() == 0) { throw new IllegalArgumentException("Packaging type must not be null nor empty."); } // return from cache if available if(cache.containsKey(typeName)) { return cache.get(typeName); } return null; } // we are using only id for hashCode() and equals(Object) @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((id == null) ? 0 : id.hashCode()); return result; } // we are using only id for hashCode() and equals(Object) @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; PackagingType other = (PackagingType) obj; if (id == null) { if (other.id != null) return false; } else if (!id.equals(other.id)) return false; return true; } }