]> source.dussan.org Git - archiva.git/commitdiff
[MRM-1848] download links for files multi-dot extensions incorrect in Browse view 10/head
authorCarlos Sanchez <carlos@apache.org>
Wed, 19 Nov 2014 21:32:12 +0000 (22:32 +0100)
committerCarlos Sanchez <carlos@apache.org>
Thu, 20 Nov 2014 09:26:37 +0000 (10:26 +0100)
archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/java/org/apache/archiva/rest/services/utils/ArtifactBuilder.java
archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/test/java/org/apache/archiva/rest/services/utils/ArtifactBuilderTest.java [new file with mode: 0644]

index 423d27a554a5f766a87b8fd4cda5e7f9244160d8..b01bacf8dede9943634515e07d9dbb56f2eeab85 100644 (file)
@@ -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 (file)
index 0000000..8b67c43
--- /dev/null
@@ -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" );
+    }
+}