001    package org.apache.maven.project;
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    
022    import java.io.File;
023    
024    import org.eclipse.aether.RepositorySystemSession;
025    import org.eclipse.aether.artifact.Artifact;
026    import org.eclipse.aether.metadata.Metadata;
027    import org.eclipse.aether.repository.LocalArtifactRegistration;
028    import org.eclipse.aether.repository.LocalArtifactRequest;
029    import org.eclipse.aether.repository.LocalArtifactResult;
030    import org.eclipse.aether.repository.LocalMetadataRegistration;
031    import org.eclipse.aether.repository.LocalMetadataRequest;
032    import org.eclipse.aether.repository.LocalMetadataResult;
033    import org.eclipse.aether.repository.LocalRepository;
034    import org.eclipse.aether.repository.LocalRepositoryManager;
035    import org.eclipse.aether.repository.RemoteRepository;
036    
037    /**
038     * @author Benjamin Bentmann
039     */
040    public class LegacyLocalRepositoryManager
041        implements LocalRepositoryManager
042    {
043    
044        private final LocalRepository repository;
045    
046        public LegacyLocalRepositoryManager( File basedir )
047        {
048            this.repository = new LocalRepository( basedir.getAbsoluteFile(), "legacy" );
049        }
050    
051        public LocalRepository getRepository()
052        {
053            return repository;
054        }
055    
056        public String getPathForLocalArtifact( Artifact artifact )
057        {
058            StringBuilder path = new StringBuilder( 128 );
059    
060            path.append( artifact.getGroupId() ).append( '/' );
061    
062            path.append( artifact.getExtension() ).append( 's' ).append( '/' );
063    
064            path.append( artifact.getArtifactId() ).append( '-' ).append( artifact.getVersion() );
065    
066            if ( artifact.getClassifier().length() > 0 )
067            {
068                path.append( '-' ).append( artifact.getClassifier() );
069            }
070    
071            path.append( '.' ).append( artifact.getExtension() );
072    
073            return path.toString();
074        }
075    
076        public String getPathForRemoteArtifact( Artifact artifact, RemoteRepository repository, String context )
077        {
078            return getPathForLocalArtifact( artifact );
079        }
080    
081        public String getPathForLocalMetadata( Metadata metadata )
082        {
083            return getPath( metadata, "local" );
084        }
085    
086        public String getPathForRemoteMetadata( Metadata metadata, RemoteRepository repository, String context )
087        {
088            return getPath( metadata, getRepositoryKey( repository, context ) );
089        }
090    
091        String getRepositoryKey( RemoteRepository repository, String context )
092        {
093            return repository.getId();
094        }
095    
096        private String getPath( Metadata metadata, String repositoryKey )
097        {
098            StringBuilder path = new StringBuilder( 128 );
099    
100            if ( metadata.getGroupId().length() > 0 )
101            {
102                path.append( metadata.getGroupId().replace( '.', '/' ) ).append( '/' );
103    
104                if ( metadata.getArtifactId().length() > 0 )
105                {
106                    path.append( metadata.getArtifactId() ).append( '/' );
107    
108                    if ( metadata.getVersion().length() > 0 )
109                    {
110                        path.append( metadata.getVersion() ).append( '/' );
111                    }
112                }
113            }
114    
115            path.append( insertRepositoryKey( metadata.getType(), repositoryKey ) );
116    
117            return path.toString();
118        }
119    
120        private String insertRepositoryKey( String filename, String repositoryKey )
121        {
122            String result;
123            int idx = filename.indexOf( '.' );
124            if ( idx < 0 )
125            {
126                result = filename + '-' + repositoryKey;
127            }
128            else
129            {
130                result = filename.substring( 0, idx ) + '-' + repositoryKey + filename.substring( idx );
131            }
132            return result;
133        }
134    
135        public LocalArtifactResult find( RepositorySystemSession session, LocalArtifactRequest request )
136        {
137            String path = getPathForLocalArtifact( request.getArtifact() );
138            File file = new File( getRepository().getBasedir(), path );
139    
140            LocalArtifactResult result = new LocalArtifactResult( request );
141            if ( file.isFile() )
142            {
143                result.setFile( file );
144                result.setAvailable( true );
145            }
146    
147            return result;
148        }
149    
150        public void add( RepositorySystemSession session, LocalArtifactRegistration request )
151        {
152            // noop
153        }
154    
155        public LocalMetadataResult find( RepositorySystemSession session, LocalMetadataRequest request )
156        {
157            LocalMetadataResult result = new LocalMetadataResult( request );
158    
159            String path;
160    
161            Metadata metadata = request.getMetadata();
162            String context = request.getContext();
163            RemoteRepository remote = request.getRepository();
164    
165            if ( remote != null )
166            {
167                path = getPathForRemoteMetadata( metadata, remote, context );
168            }
169            else
170            {
171                path = getPathForLocalMetadata( metadata );
172            }
173    
174            File file = new File( getRepository().getBasedir(), path );
175            if ( file.isFile() )
176            {
177                result.setFile( file );
178            }
179    
180            return result;
181        }
182    
183        public void add( RepositorySystemSession session, LocalMetadataRegistration request )
184        {
185            // noop
186        }
187    
188        public String toString()
189        {
190            return String.valueOf( getRepository() );
191        }
192    }