001package org.apache.maven.artifact.repository.metadata;
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 java.io.File;
023import java.util.Collections;
024import java.util.Map;
025
026import org.apache.maven.artifact.metadata.ArtifactMetadata;
027import org.apache.maven.artifact.repository.ArtifactRepository;
028import org.apache.maven.artifact.repository.DefaultArtifactRepository;
029import org.codehaus.plexus.util.FileUtils;
030import org.eclipse.aether.RepositoryException;
031import org.eclipse.aether.metadata.AbstractMetadata;
032import org.eclipse.aether.metadata.MergeableMetadata;
033import org.eclipse.aether.metadata.Metadata;
034
035/**
036 * <strong>Warning:</strong> This is an internal utility class that is only public for technical reasons, it is not part
037 * of the public API. In particular, this class can be changed or deleted without prior notice.
038 * 
039 * @author Benjamin Bentmann
040 */
041public final class MetadataBridge
042    extends AbstractMetadata
043    implements MergeableMetadata
044{
045
046    private ArtifactMetadata metadata;
047
048    private boolean merged;
049
050    public MetadataBridge( ArtifactMetadata metadata )
051    {
052        this.metadata = metadata;
053    }
054
055    public void merge( File current, File result )
056        throws RepositoryException
057    {
058        try
059        {
060            if ( current.exists() )
061            {
062                FileUtils.copyFile( current, result );
063            }
064            ArtifactRepository localRepo = new MetadataRepository( result );
065            metadata.storeInLocalRepository( localRepo, localRepo );
066            merged = true;
067        }
068        catch ( Exception e )
069        {
070            throw new RepositoryException( e.getMessage(), e );
071        }
072    }
073
074    public boolean isMerged()
075    {
076        return merged;
077    }
078
079    public String getGroupId()
080    {
081        return emptify( metadata.getGroupId() );
082    }
083
084    public String getArtifactId()
085    {
086        return metadata.storedInGroupDirectory() ? "" : emptify( metadata.getArtifactId() );
087    }
088
089    public String getVersion()
090    {
091        return metadata.storedInArtifactVersionDirectory() ? emptify( metadata.getBaseVersion() ) : "";
092    }
093
094    public String getType()
095    {
096        return metadata.getRemoteFilename();
097    }
098
099    private String emptify( String string )
100    {
101        return ( string != null ) ? string : "";
102    }
103
104    public File getFile()
105    {
106        return null;
107    }
108
109    public MetadataBridge setFile( File file )
110    {
111        return this;
112    }
113
114    public Nature getNature()
115    {
116        if ( metadata instanceof RepositoryMetadata )
117        {
118            switch ( ( (RepositoryMetadata) metadata ).getNature() )
119            {
120                case RepositoryMetadata.RELEASE_OR_SNAPSHOT:
121                    return Nature.RELEASE_OR_SNAPSHOT;
122                case RepositoryMetadata.SNAPSHOT:
123                    return Nature.SNAPSHOT;
124                default:
125                    return Nature.RELEASE;
126            }
127        }
128        else
129        {
130            return Nature.RELEASE;
131        }
132    }
133
134    public Map<String, String> getProperties()
135    {
136        return Collections.emptyMap();
137    }
138
139    @Override
140    public Metadata setProperties( Map<String, String> properties )
141    {
142        return this;
143    }
144
145    @SuppressWarnings( "deprecation" )
146    static class MetadataRepository
147        extends DefaultArtifactRepository
148    {
149
150        private File metadataFile;
151
152        public MetadataRepository( File metadataFile )
153        {
154            super( "local", "", null );
155            this.metadataFile = metadataFile;
156        }
157
158        @Override
159        public String getBasedir()
160        {
161            return metadataFile.getParent();
162        }
163
164        @Override
165        public String pathOfLocalRepositoryMetadata( ArtifactMetadata metadata, ArtifactRepository repository )
166        {
167            return metadataFile.getName();
168        }
169
170    }
171
172}