]> source.dussan.org Git - archiva.git/blob
46ffbd60d2462663afde41774b6b34166d43c466
[archiva.git] /
1 package org.apache.archiva.rest.services.utils;
2 /*
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  */
20
21 import org.apache.archiva.maven2.model.Artifact;
22 import org.apache.archiva.metadata.model.ArtifactMetadata;
23 import org.apache.archiva.metadata.maven.model.MavenArtifactFacet;
24 import org.apache.archiva.repository.content.BaseRepositoryContentLayout;
25 import org.apache.archiva.repository.ManagedRepositoryContent;
26 import org.apache.archiva.repository.content.LayoutException;
27 import org.apache.archiva.repository.content.base.ArchivaItemSelector;
28 import org.apache.archiva.repository.storage.StorageAsset;
29 import org.apache.archiva.repository.storage.util.StorageUtil;
30 import org.apache.commons.lang3.StringUtils;
31
32 import java.text.DecimalFormat;
33 import java.text.DecimalFormatSymbols;
34 import java.util.Locale;
35 import java.util.regex.Matcher;
36 import java.util.regex.Pattern;
37
38 /**
39  * @author Olivier Lamy
40  * @since 1.4-M3
41  */
42 public class ArtifactBuilder
43 {
44
45     private ManagedRepositoryContent managedRepositoryContent;
46
47     private ArtifactMetadata artifactMetadata;
48
49     public ArtifactBuilder()
50     {
51         // no op
52     }
53
54
55     public ArtifactBuilder withManagedRepositoryContent( ManagedRepositoryContent managedRepositoryContent )
56     {
57         this.managedRepositoryContent = managedRepositoryContent;
58         return this;
59     }
60
61     public ArtifactBuilder forArtifactMetadata( ArtifactMetadata artifactMetadata )
62     {
63         this.artifactMetadata = artifactMetadata;
64         return this;
65     }
66
67     public Artifact build()
68     {
69         String type = null, classifier = null;
70
71         MavenArtifactFacet facet = (MavenArtifactFacet) artifactMetadata.getFacet( MavenArtifactFacet.FACET_ID );
72         if ( facet != null )
73         {
74             type = facet.getType();
75             classifier = facet.getClassifier();
76         }
77
78         ArchivaItemSelector.Builder selectorBuilder = ArchivaItemSelector.builder( )
79             .withNamespace( artifactMetadata.getNamespace( ) )
80             .withProjectId( artifactMetadata.getProject( ) )
81             .withVersion( artifactMetadata.getProjectVersion( ) )
82             .withArtifactId( artifactMetadata.getProject( ) )
83             .withArtifactVersion( artifactMetadata.getVersion( ) );
84         if (StringUtils.isNotEmpty( type ) ) {
85             selectorBuilder.withType( type );
86         }
87         if (StringUtils.isNotEmpty( classifier )) {
88             selectorBuilder.withClassifier( classifier );
89         }
90
91
92         BaseRepositoryContentLayout layout;
93         try
94         {
95              layout = managedRepositoryContent.getLayout( BaseRepositoryContentLayout.class );
96         }
97         catch ( LayoutException e )
98         {
99             throw new RuntimeException( "Could not convert to layout " + e.getMessage( ) );
100         }
101         org.apache.archiva.repository.content.Artifact repoArtifact = layout.getArtifact( selectorBuilder.build( ) );
102
103         String extension = repoArtifact.getExtension();
104
105         Artifact artifact = new Artifact( repoArtifact.getVersion( ).getProject( ).getNamespace( ).getId( ), repoArtifact.getId( ), repoArtifact.getArtifactVersion( ) );
106         artifact.setRepositoryId( artifactMetadata.getRepositoryId() );
107         artifact.setClassifier( classifier );
108         artifact.setPackaging( type );
109         artifact.setType( type );
110         artifact.setFileExtension( extension );
111         artifact.setPath( managedRepositoryContent.toPath( repoArtifact ) );
112         // TODO: find a reusable formatter for this
113         double s = this.artifactMetadata.getSize();
114         String symbol = "b";
115         if ( s > 1024 )
116         {
117             symbol = "K";
118             s /= 1024;
119
120             if ( s > 1024 )
121             {
122                 symbol = "M";
123                 s /= 1024;
124
125                 if ( s > 1024 )
126                 {
127                     symbol = "G";
128                     s /= 1024;
129                 }
130             }
131         }
132         artifact.setContext( managedRepositoryContent.getId() );
133         DecimalFormat df = new DecimalFormat( "#,###.##", new DecimalFormatSymbols( Locale.US ) );
134         artifact.setSize( df.format( s ) + " " + symbol );
135
136         artifact.setId( repoArtifact.getId() + "-" + repoArtifact.getArtifactVersion() + "." + repoArtifact.getType() );
137
138         return artifact;
139
140     }
141
142
143     /**
144      * Extract file extension
145      */
146     String getExtensionFromFile( StorageAsset file )
147     {
148         // we are just interested in the section after the last -
149         String[] parts = file.getName().split( "-" );
150         if ( parts.length > 0 )
151         {
152             // get anything after a dot followed by a letter a-z, including other dots
153             Pattern p = Pattern.compile( "\\.([a-z]+[a-z0-9\\.]*)" );
154             Matcher m = p.matcher( parts[parts.length - 1] );
155             if ( m.find() )
156             {
157                 return m.group( 1 );
158             }
159         }
160         // just in case
161         return StorageUtil.getExtension( file );
162     }
163
164 }