| /* |
| * Copyright 2007 Alin Dreghiciu. |
| * Copyright 2010,2011 Toni Menzel. |
| * |
| * 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.apache.karaf.util.maven; |
| |
| import java.net.MalformedURLException; |
| |
| /** |
| * Parser for mvn: protocol.<br/> |
| * |
| * @author Alin Dreghiciu |
| * @author Toni Menzel |
| * |
| * @since August 10, 2007 |
| */ |
| public class Parser |
| { |
| |
| /** |
| * Default version if none present in the url. |
| */ |
| public static final String VERSION_LATEST = "LATEST"; |
| |
| /** |
| * Syntax for the url; to be shown on exception messages. |
| */ |
| private static final String SYNTAX = "mvn:[repository_url!]groupId/artifactId[/[version]/[type]]"; |
| |
| /** |
| * Separator between repository and artifact definition. |
| */ |
| private static final String REPOSITORY_SEPARATOR = "!"; |
| /** |
| * Artifact definition segments separator. |
| */ |
| private static final String ARTIFACT_SEPARATOR = "/"; |
| |
| /** |
| * Snapshot version |
| */ |
| private static final String VERSION_SNAPSHOT = "SNAPSHOT"; |
| /** |
| * Default type if not present in the url. |
| */ |
| private static final String TYPE_JAR = "jar"; |
| |
| /** |
| * Final artifact path separator. |
| */ |
| public static final String FILE_SEPARATOR = "/"; |
| /** |
| * Group id path separator. |
| */ |
| private static final String GROUP_SEPARATOR = "\\."; |
| /** |
| * Separator used to constructs the artifact file name. |
| */ |
| private static final String VERSION_SEPARATOR = "-"; |
| /** |
| * Artifact extension(type) separator. |
| */ |
| private static final String TYPE_SEPARATOR = "."; |
| /** |
| * Separator used to separate classifier in artifact name. |
| */ |
| private static final String CLASSIFIER_SEPARATOR = "-"; |
| /** |
| * Maven metadata file. |
| */ |
| private static final String METADATA_FILE = "maven-metadata.xml"; |
| /** |
| * Maven local metadata file. |
| */ |
| private static final String METADATA_FILE_LOCAL = "maven-metadata-local.xml"; |
| |
| /** |
| * Repository URL. Null if not present. |
| */ |
| private String m_repositoryURL; |
| /** |
| * Artifact group id. |
| */ |
| private String m_group; |
| /** |
| * Artifact id. |
| */ |
| private String m_artifact; |
| /** |
| * Artifact version. |
| */ |
| private String m_version; |
| /** |
| * Artifact type. |
| */ |
| private String m_type; |
| /** |
| * Artifact classifier. |
| */ |
| private String m_classifier; |
| /** |
| * Artifact classifier to use to build artifact name. |
| */ |
| private String m_fullClassifier; |
| |
| /** |
| * Creates a new protocol parser. |
| * |
| * @param path the path part of the url (without starting mvn:) |
| * |
| * @throws MalformedURLException if provided path does not comply to expected syntax or an malformed repository URL |
| */ |
| public Parser( final String path ) |
| throws MalformedURLException |
| { |
| if( path == null ) |
| { |
| throw new MalformedURLException( "Path cannot be null. Syntax " + SYNTAX ); |
| } |
| if( path.startsWith( REPOSITORY_SEPARATOR ) || path.endsWith( REPOSITORY_SEPARATOR ) ) |
| { |
| throw new MalformedURLException( |
| "Path cannot start or end with " + REPOSITORY_SEPARATOR + ". Syntax " + SYNTAX |
| ); |
| } |
| if( path.contains( REPOSITORY_SEPARATOR ) ) |
| { |
| int pos = path.lastIndexOf( REPOSITORY_SEPARATOR ); |
| parseArtifactPart( path.substring( pos + 1 ) ); |
| m_repositoryURL = path.substring( 0, pos ) + "@snapshots"; |
| } |
| else |
| { |
| parseArtifactPart( path ); |
| } |
| } |
| |
| /** |
| * Parses the artifact part of the url ( without the repository). |
| * |
| * @param part url part without protocol and repository. |
| * |
| * @throws MalformedURLException if provided path does not comply to syntax. |
| */ |
| private void parseArtifactPart( final String part ) |
| throws MalformedURLException |
| { |
| String[] segments = part.split( ARTIFACT_SEPARATOR ); |
| if( segments.length < 2 ) |
| { |
| throw new MalformedURLException( "Invalid path. Syntax " + SYNTAX ); |
| } |
| // we must have a valid group |
| m_group = segments[ 0 ]; |
| if( m_group.trim().length() == 0 ) |
| { |
| throw new MalformedURLException( "Invalid groupId. Syntax " + SYNTAX ); |
| } |
| // valid artifact |
| m_artifact = segments[ 1 ]; |
| if( m_artifact.trim().length() == 0 ) |
| { |
| throw new MalformedURLException( "Invalid artifactId. Syntax " + SYNTAX ); |
| } |
| // version is optional but we have a default value |
| m_version = VERSION_LATEST; |
| if( segments.length >= 3 && segments[ 2 ].trim().length() > 0 ) |
| { |
| m_version = segments[ 2 ]; |
| } |
| // type is optional but we have a default value |
| m_type = TYPE_JAR; |
| if( segments.length >= 4 && segments[ 3 ].trim().length() > 0 ) |
| { |
| m_type = segments[ 3 ]; |
| } |
| // classifier is optional (if not present or empty we will have a null classifier |
| m_fullClassifier = ""; |
| if( segments.length >= 5 && segments[ 4 ].trim().length() > 0 ) |
| { |
| m_classifier = segments[ 4 ]; |
| m_fullClassifier = CLASSIFIER_SEPARATOR + m_classifier; |
| } |
| } |
| |
| /** |
| * Returns the repository URL if present, null otherwise |
| * |
| * @return repository URL |
| */ |
| public String getRepositoryURL() |
| { |
| return m_repositoryURL; |
| } |
| |
| /** |
| * Returns the group id of the artifact. |
| * |
| * @return group Id |
| */ |
| public String getGroup() |
| { |
| return m_group; |
| } |
| |
| /** |
| * Returns the artifact id. |
| * |
| * @return artifact id |
| */ |
| public String getArtifact() |
| { |
| return m_artifact; |
| } |
| |
| /** |
| * Returns the artifact version. |
| * |
| * @return version |
| */ |
| public String getVersion() |
| { |
| return m_version; |
| } |
| |
| /** |
| * Returns the artifact type. |
| * |
| * @return type |
| */ |
| public String getType() |
| { |
| return m_type; |
| } |
| |
| /** |
| * Returns the artifact classifier. |
| * |
| * @return classifier |
| */ |
| public String getClassifier() |
| { |
| return m_classifier; |
| } |
| |
| /** |
| * Returns the complete path to artifact as stated by Maven 2 repository layout. |
| * |
| * @return artifact path |
| */ |
| public String getArtifactPath() |
| { |
| return getArtifactPath( m_version ); |
| } |
| |
| /** |
| * Returns the complete path to artifact as stated by Maven 2 repository layout. |
| * |
| * @param version The version of the artifact. |
| * |
| * @return artifact path |
| */ |
| public String getArtifactPath( final String version ) |
| { |
| return new StringBuilder() |
| .append( m_group.replaceAll( GROUP_SEPARATOR, FILE_SEPARATOR ) ) |
| .append( FILE_SEPARATOR ) |
| .append( m_artifact ) |
| .append( FILE_SEPARATOR ) |
| .append( version ) |
| .append( FILE_SEPARATOR ) |
| .append( m_artifact ) |
| .append( VERSION_SEPARATOR ) |
| .append( version ) |
| .append( m_fullClassifier ) |
| .append( TYPE_SEPARATOR ) |
| .append( m_type ) |
| .toString(); |
| } |
| |
| /** |
| * Returns the version for an artifact for a snapshot version. |
| * |
| * @param version The version of the snapshot. |
| * @param timestamp The timestamp of the snapshot. |
| * @param buildnumber The buildnumber of the snapshot. |
| * |
| * @return artifact path |
| */ |
| public String getSnapshotVersion( final String version, final String timestamp, final String buildnumber ) |
| { |
| return version.replace( VERSION_SNAPSHOT, timestamp ) + VERSION_SEPARATOR + buildnumber; |
| } |
| |
| /** |
| * Returns the complete path to artifact for a snapshot file. |
| * |
| * @param version The version of the snapshot. |
| * @param timestamp The timestamp of the snapshot. |
| * @param buildnumber The buildnumber of the snapshot. |
| * |
| * @return artifact path |
| */ |
| public String getSnapshotPath( final String version, final String timestamp, final String buildnumber ) |
| { |
| return new StringBuilder() |
| .append( m_group.replaceAll( GROUP_SEPARATOR, FILE_SEPARATOR ) ) |
| .append( FILE_SEPARATOR ) |
| .append( m_artifact ) |
| .append( FILE_SEPARATOR ) |
| .append( version ) |
| .append( FILE_SEPARATOR ) |
| .append( m_artifact ) |
| .append( VERSION_SEPARATOR ) |
| .append( getSnapshotVersion( version, timestamp, buildnumber ) ) |
| .append( m_fullClassifier ) |
| .append( TYPE_SEPARATOR ) |
| .append( m_type ) |
| .toString(); |
| } |
| |
| /** |
| * Returns the path to metdata file corresponding to this artifact version. |
| * |
| * @param version The version of the the metadata. |
| * |
| * @return metadata file path |
| */ |
| public String getVersionMetadataPath( final String version ) |
| { |
| return new StringBuilder() |
| .append( m_group.replaceAll( GROUP_SEPARATOR, FILE_SEPARATOR ) ) |
| .append( FILE_SEPARATOR ) |
| .append( m_artifact ) |
| .append( FILE_SEPARATOR ) |
| .append( version ) |
| .append( FILE_SEPARATOR ) |
| .append( METADATA_FILE ) |
| .toString(); |
| } |
| |
| /** |
| * Returns the path to local metdata file corresponding to this artifact version. |
| * |
| * @param version The version of the the metadata. |
| * |
| * @return metadata file path |
| */ |
| public String getVersionLocalMetadataPath( final String version ) |
| { |
| return new StringBuilder() |
| .append( m_group.replaceAll( GROUP_SEPARATOR, FILE_SEPARATOR ) ) |
| .append( FILE_SEPARATOR ) |
| .append( m_artifact ) |
| .append( FILE_SEPARATOR ) |
| .append( version ) |
| .append( FILE_SEPARATOR ) |
| .append( METADATA_FILE_LOCAL ) |
| .toString(); |
| } |
| |
| /** |
| * Returns the complete path to artifact local metadata file. |
| * |
| * @return artifact path |
| */ |
| public String getArtifactLocalMetdataPath() |
| { |
| return new StringBuilder() |
| .append( m_group.replaceAll( GROUP_SEPARATOR, FILE_SEPARATOR ) ) |
| .append( FILE_SEPARATOR ) |
| .append( m_artifact ) |
| .append( FILE_SEPARATOR ) |
| .append( METADATA_FILE_LOCAL ) |
| .toString(); |
| } |
| |
| /** |
| * Returns the complete path to artifact metadata file. |
| * |
| * @return artifact path |
| */ |
| public String getArtifactMetdataPath() |
| { |
| return new StringBuilder() |
| .append( m_group.replaceAll( GROUP_SEPARATOR, FILE_SEPARATOR ) ) |
| .append( FILE_SEPARATOR ) |
| .append( m_artifact ) |
| .append( FILE_SEPARATOR ) |
| .append( METADATA_FILE ) |
| .toString(); |
| } |
| |
| } |