This project has retired. For details please refer to its Attic page.
Source code
001package org.apache.archiva.repository.content.maven2;
002
003/*
004 * Licensed to the Apache Software Foundation (ASF) under one
005 * or more contributor license agreements.  See the NOTICE file
006 * distributed with this work for additional information
007 * regarding copyright ownership.  The ASF licenses this file
008 * to you under the Apache License, Version 2.0 (the
009 * "License"); you may not use this file except in compliance
010 * with the License.  You may obtain a copy of the License at
011 *
012 *  http://www.apache.org/licenses/LICENSE-2.0
013 *
014 * Unless required by applicable law or agreed to in writing,
015 * software distributed under the License is distributed on an
016 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
017 * KIND, either express or implied.  See the License for the
018 * specific language governing permissions and limitations
019 * under the License.
020 */
021
022import org.apache.archiva.common.utils.VersionUtil;
023import org.apache.archiva.metadata.repository.storage.RepositoryPathTranslator;
024import org.apache.archiva.metadata.repository.storage.maven2.ArtifactMappingProvider;
025import org.apache.archiva.metadata.repository.storage.maven2.Maven2RepositoryPathTranslator;
026import org.apache.archiva.model.ArchivaArtifact;
027import org.apache.archiva.model.ArtifactReference;
028import org.apache.archiva.model.ProjectReference;
029import org.apache.archiva.model.VersionedReference;
030import org.apache.archiva.repository.LayoutException;
031import org.apache.archiva.repository.RepositoryContent;
032import org.apache.archiva.repository.content.PathParser;
033import org.apache.commons.lang3.StringUtils;
034import org.slf4j.Logger;
035import org.slf4j.LoggerFactory;
036
037import java.util.List;
038
039/**
040 * AbstractDefaultRepositoryContent - common methods for working with default (maven 2) layout.
041 */
042public abstract class AbstractDefaultRepositoryContent implements RepositoryContent
043{
044
045
046    protected Logger log = LoggerFactory.getLogger( getClass() );
047
048    public static final String MAVEN_METADATA = "maven-metadata.xml";
049
050    protected static final char PATH_SEPARATOR = '/';
051
052    protected static final char GROUP_SEPARATOR = '.';
053
054    protected static final char ARTIFACT_SEPARATOR = '-';
055
056    private RepositoryPathTranslator pathTranslator = new Maven2RepositoryPathTranslator();
057
058    private PathParser defaultPathParser = new DefaultPathParser();
059
060
061
062    /**
063     *
064     */
065    protected List<? extends ArtifactMappingProvider> artifactMappingProviders;
066
067    AbstractDefaultRepositoryContent(List<? extends ArtifactMappingProvider> artifactMappingProviders) {
068        this.artifactMappingProviders = artifactMappingProviders;
069    }
070
071    public void setArtifactMappingProviders(List<? extends ArtifactMappingProvider> artifactMappingProviders) {
072        this.artifactMappingProviders = artifactMappingProviders;
073    }
074
075    @Override
076    public ArtifactReference toArtifactReference( String path )
077        throws LayoutException
078    {
079        return defaultPathParser.toArtifactReference( path );
080    }
081
082    public String toMetadataPath( ProjectReference reference )
083    {
084        StringBuilder path = new StringBuilder();
085
086        path.append( formatAsDirectory( reference.getGroupId() ) ).append( PATH_SEPARATOR );
087        path.append( reference.getArtifactId() ).append( PATH_SEPARATOR );
088        path.append( MAVEN_METADATA );
089
090        return path.toString();
091    }
092
093    public String toMetadataPath( VersionedReference reference )
094    {
095        StringBuilder path = new StringBuilder();
096
097        path.append( formatAsDirectory( reference.getGroupId() ) ).append( PATH_SEPARATOR );
098        path.append( reference.getArtifactId() ).append( PATH_SEPARATOR );
099        if ( reference.getVersion() != null )
100        {
101            // add the version only if it is present
102            path.append( VersionUtil.getBaseVersion( reference.getVersion() ) ).append( PATH_SEPARATOR );
103        }
104        path.append( MAVEN_METADATA );
105
106        return path.toString();
107    }
108
109    public String toPath( ArchivaArtifact reference )
110    {
111        if ( reference == null )
112        {
113            throw new IllegalArgumentException( "ArchivaArtifact cannot be null" );
114        }
115
116        String baseVersion = VersionUtil.getBaseVersion( reference.getVersion() );
117        return toPath( reference.getGroupId(), reference.getArtifactId(), baseVersion, reference.getVersion(),
118                       reference.getClassifier(), reference.getType() );
119    }
120
121    public String toPath( ArtifactReference reference )
122    {
123        if ( reference == null )
124        {
125            throw new IllegalArgumentException( "Artifact reference cannot be null" );
126        }
127        if ( reference.getVersion() != null )
128        {
129            String baseVersion = VersionUtil.getBaseVersion( reference.getVersion() );
130            return toPath( reference.getGroupId(), reference.getArtifactId(), baseVersion, reference.getVersion(),
131                           reference.getClassifier(), reference.getType() );
132        }
133        return toPath( reference.getGroupId(), reference.getArtifactId(), null, null,
134                       reference.getClassifier(), reference.getType() );
135    }
136
137    private String formatAsDirectory( String directory )
138    {
139        return directory.replace( GROUP_SEPARATOR, PATH_SEPARATOR );
140    }
141
142    private String toPath( String groupId, String artifactId, String baseVersion, String version, String classifier,
143                           String type )
144    {
145        if ( baseVersion != null )
146        {
147            return pathTranslator.toPath( groupId, artifactId, baseVersion,
148                                          constructId( artifactId, version, classifier, type ) );
149        }
150        else
151        {
152            return pathTranslator.toPath( groupId, artifactId );
153        }
154    }
155
156    // TODO: move into the Maven Artifact facet when refactoring away the caller - the caller will need to have access
157    //       to the facet or filename (for the original ID)
158    private String constructId( String artifactId, String version, String classifier, String type )
159    {
160        String ext = null;
161        for ( ArtifactMappingProvider provider : artifactMappingProviders )
162        {
163            ext = provider.mapTypeToExtension( type );
164            if ( ext != null )
165            {
166                break;
167            }
168        }
169        if ( ext == null )
170        {
171            ext = type;
172        }
173
174        StringBuilder id = new StringBuilder();
175        if ( ( version != null ) && ( type != null ) )
176        {
177            id.append( artifactId ).append( ARTIFACT_SEPARATOR ).append( version );
178
179            if ( StringUtils.isNotBlank( classifier ) )
180            {
181                id.append( ARTIFACT_SEPARATOR ).append( classifier );
182            }
183
184            id.append( "." ).append( ext );
185        }
186        return id.toString();
187    }
188}