package org.apache.archiva.rest.services.utils; /* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you 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. */ import org.apache.archiva.metadata.model.ArtifactMetadata; import org.apache.archiva.metadata.model.maven2.MavenArtifactFacet; import org.apache.archiva.model.ArtifactReference; import org.apache.archiva.repository.ManagedRepositoryContent; import org.apache.archiva.maven2.model.Artifact; import org.apache.commons.io.FilenameUtils; import java.io.File; import java.text.DecimalFormat; import java.text.DecimalFormatSymbols; import java.util.Locale; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * @author Olivier Lamy * @since 1.4-M3 */ public class ArtifactBuilder { private ManagedRepositoryContent managedRepositoryContent; private ArtifactMetadata artifactMetadata; public ArtifactBuilder() { // no op } public ArtifactBuilder withManagedRepositoryContent( ManagedRepositoryContent managedRepositoryContent ) { this.managedRepositoryContent = managedRepositoryContent; return this; } public ArtifactBuilder forArtifactMetadata( ArtifactMetadata artifactMetadata ) { this.artifactMetadata = artifactMetadata; return this; } public Artifact build() { ArtifactReference ref = new ArtifactReference(); ref.setArtifactId( artifactMetadata.getProject() ); ref.setGroupId( artifactMetadata.getNamespace() ); ref.setVersion( artifactMetadata.getVersion() ); String type = null, classifier = null; MavenArtifactFacet facet = (MavenArtifactFacet) artifactMetadata.getFacet( MavenArtifactFacet.FACET_ID ); if ( facet != null ) { type = facet.getType(); classifier = facet.getClassifier(); } ref.setClassifier( classifier ); ref.setType( type ); File file = managedRepositoryContent.toFile( ref ); String extension = getExtensionFromFile(file); Artifact artifact = new Artifact( ref.getGroupId(), ref.getArtifactId(), ref.getVersion() ); artifact.setRepositoryId( artifactMetadata.getRepositoryId() ); artifact.setClassifier( classifier ); artifact.setPackaging( type ); artifact.setType( type ); artifact.setFileExtension( extension ); artifact.setPath( managedRepositoryContent.toPath( ref ) ); // TODO: find a reusable formatter for this double s = this.artifactMetadata.getSize(); String symbol = "b"; if ( s > 1024 ) { symbol = "K"; s /= 1024; if ( s > 1024 ) { symbol = "M"; s /= 1024; if ( s > 1024 ) { symbol = "G"; s /= 1024; } } } artifact.setContext( managedRepositoryContent.getId() ); DecimalFormat df = new DecimalFormat( "#,###.##", new DecimalFormatSymbols( Locale.US ) ); artifact.setSize( df.format( s ) + " " + symbol ); artifact.setId( ref.getArtifactId() + "-" + ref.getVersion() + "." + ref.getType() ); return artifact; } /** * Extract file extension */ String getExtensionFromFile( File file ) { // we are just interested in the section after the last - String[] parts = file.getName().split( "-" ); if ( parts.length > 0 ) { // get anything after a dot followed by a letter a-z, including other dots Pattern p = Pattern.compile( "\\.([a-z]+[a-z0-9\\.]*)" ); Matcher m = p.matcher( parts[parts.length - 1] ); if ( m.find() ) { return m.group( 1 ); } } // just in case return FilenameUtils.getExtension( file.getName() ); } }