From 5d29c9ff1d5985db1a8b293ae7a4fb29452041f7 Mon Sep 17 00:00:00 2001 From: Carlos Sanchez Date: Wed, 19 Nov 2014 22:32:12 +0100 Subject: [PATCH] [MRM-1848] download links for files multi-dot extensions incorrect in Browse view --- .../rest/services/utils/ArtifactBuilder.java | 49 +++++++------ .../services/utils/ArtifactBuilderTest.java | 68 +++++++++++++++++++ 2 files changed, 92 insertions(+), 25 deletions(-) create mode 100644 archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/test/java/org/apache/archiva/rest/services/utils/ArtifactBuilderTest.java diff --git a/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/java/org/apache/archiva/rest/services/utils/ArtifactBuilder.java b/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/java/org/apache/archiva/rest/services/utils/ArtifactBuilder.java index 423d27a55..b01bacf8d 100644 --- a/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/java/org/apache/archiva/rest/services/utils/ArtifactBuilder.java +++ b/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/java/org/apache/archiva/rest/services/utils/ArtifactBuilder.java @@ -29,6 +29,8 @@ 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 @@ -59,25 +61,6 @@ public class ArtifactBuilder return this; } - /** - * - * @param filename - * @return - */ - private static String specialExtensions( String filename ) - { - String[] special = { - "tar.gz" - }; - for ( String extension : special ) - { - if ( filename.endsWith( extension ) ) - { - return extension; - } - } - return null; - } public Artifact build() { ArtifactReference ref = new ArtifactReference(); @@ -98,12 +81,7 @@ public class ArtifactBuilder ref.setType( type ); File file = managedRepositoryContent.toFile( ref ); - String extension = FilenameUtils.getExtension( file.getName() ); - // handle more than one point extension we know. - if ( specialExtensions( file.getName() ) != null ) - { - extension = specialExtensions( file.getName() ); - } + String extension = getExtensionFromFile(file); Artifact artifact = new Artifact( ref.getGroupId(), ref.getArtifactId(), ref.getVersion() ); artifact.setRepositoryId( artifactMetadata.getRepositoryId() ); @@ -143,4 +121,25 @@ public class ArtifactBuilder } + /** + * 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() ); + } + } diff --git a/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/test/java/org/apache/archiva/rest/services/utils/ArtifactBuilderTest.java b/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/test/java/org/apache/archiva/rest/services/utils/ArtifactBuilderTest.java new file mode 100644 index 000000000..8b67c43c6 --- /dev/null +++ b/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/test/java/org/apache/archiva/rest/services/utils/ArtifactBuilderTest.java @@ -0,0 +1,68 @@ +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 static org.assertj.core.api.Assertions.*; + +import java.io.File; + +import org.easymock.TestSubject; +import org.junit.Test; + +public class ArtifactBuilderTest +{ + @TestSubject + private ArtifactBuilder builder = new ArtifactBuilder(); + + @Test + public void testBuildSnapshot() + { + assertThat( builder.getExtensionFromFile( new File( "/tmp/foo-2.3-20141119.064321-40.jar" ) ) ).isEqualTo( "jar" ); + } + + @Test + public void testBuildPom() + { + assertThat( builder.getExtensionFromFile( new File( "/tmp/foo-1.0.pom" ) ) ).isEqualTo( "pom" ); + } + + @Test + public void testBuildJar() + { + assertThat( builder.getExtensionFromFile( new File( "/tmp/foo-1.0-sources.jar" ) ) ).isEqualTo( "jar" ); + } + + @Test + public void testBuildTarGz() + { + assertThat( builder.getExtensionFromFile( new File( "/tmp/foo-1.0.tar.gz" ) ) ).isEqualTo( "tar.gz" ); + } + + @Test + public void testBuildPomZip() + { + assertThat( builder.getExtensionFromFile( new File( "/tmp/foo-1.0.pom.zip" ) ) ).isEqualTo( "pom.zip" ); + } + + @Test + public void testBuildR00() + { + assertThat( builder.getExtensionFromFile( new File( "/tmp/foo-1.0.r00" ) ) ).isEqualTo( "r00" ); + } +} -- 2.39.5