View Javadoc
1   /*
2    * Copyright  2001,2004 The Apache Software Foundation
3    *
4    *  Licensed under the Apache License, Version 2.0 (the "License");
5    *  you may not use this file except in compliance with the License.
6    *  You may obtain a copy of the License at
7    *
8    *      http://www.apache.org/licenses/LICENSE-2.0
9    *
10   *  Unless required by applicable law or agreed to in writing, software
11   *  distributed under the License is distributed on an "AS IS" BASIS,
12   *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   *  See the License for the specific language governing permissions and
14   *  limitations under the License.
15   *
16   */
17  package org.codehaus.plexus.archiver.manager;
18  
19  import javax.annotation.Nonnull;
20  import javax.inject.Inject;
21  import javax.inject.Named;
22  import javax.inject.Provider;
23  import javax.inject.Singleton;
24  
25  import java.io.File;
26  import java.util.Collection;
27  import java.util.Locale;
28  import java.util.Map;
29  
30  import org.codehaus.plexus.archiver.Archiver;
31  import org.codehaus.plexus.archiver.UnArchiver;
32  import org.codehaus.plexus.components.io.resources.PlexusIoResourceCollection;
33  import org.codehaus.plexus.util.StringUtils;
34  
35  import static java.util.Objects.requireNonNull;
36  
37  /**
38   * @author dantran
39   */
40  @Singleton
41  @Named
42  public class DefaultArchiverManager implements ArchiverManager {
43  
44      private final Map<String, Provider<Archiver>> archivers;
45  
46      private final Map<String, Provider<UnArchiver>> unArchivers;
47  
48      private final Map<String, Provider<PlexusIoResourceCollection>> plexusIoResourceCollections;
49  
50      @Inject
51      public DefaultArchiverManager(
52              Map<String, Provider<Archiver>> archivers,
53              Map<String, Provider<UnArchiver>> unArchivers,
54              Map<String, Provider<PlexusIoResourceCollection>> plexusIoResourceCollections) {
55          this.archivers = requireNonNull(archivers);
56          this.unArchivers = requireNonNull(unArchivers);
57          this.plexusIoResourceCollections = requireNonNull(plexusIoResourceCollections);
58      }
59  
60      @Override
61      @Nonnull
62      public Archiver getArchiver(@Nonnull String archiverName) throws NoSuchArchiverException {
63          requireNonNull(archiverName);
64          Provider<Archiver> archiver = archivers.get(archiverName);
65          if (archiver == null) {
66              throw new NoSuchArchiverException(archiverName);
67          }
68          return archiver.get();
69      }
70  
71      @Override
72      @Nonnull
73      public UnArchiver getUnArchiver(@Nonnull String unArchiverName) throws NoSuchArchiverException {
74          requireNonNull(unArchiverName);
75          Provider<UnArchiver> unArchiver = unArchivers.get(unArchiverName);
76          if (unArchiver == null) {
77              throw new NoSuchArchiverException(unArchiverName);
78          }
79          return unArchiver.get();
80      }
81  
82      @Override
83      public @Nonnull PlexusIoResourceCollection getResourceCollection(String resourceCollectionName)
84              throws NoSuchArchiverException {
85          requireNonNull(resourceCollectionName);
86          Provider<PlexusIoResourceCollection> resourceCollection =
87                  plexusIoResourceCollections.get(resourceCollectionName);
88          if (resourceCollection == null) {
89              throw new NoSuchArchiverException(resourceCollectionName);
90          }
91          return resourceCollection.get();
92      }
93  
94      private static @Nonnull String getFileExtension(@Nonnull File file) {
95  
96          String fileName = file.getName().toLowerCase(Locale.ROOT);
97          String[] tokens = StringUtils.split(fileName, ".");
98  
99          String archiveExt = "";
100 
101         if (tokens.length == 2) {
102             archiveExt = tokens[1];
103         } else if (tokens.length > 2 && "tar".equals(tokens[tokens.length - 2])) {
104             archiveExt = "tar." + tokens[tokens.length - 1];
105         } else if (tokens.length > 2) {
106             archiveExt = tokens[tokens.length - 1];
107         }
108 
109         return archiveExt;
110     }
111 
112     @Override
113     @Nonnull
114     public Archiver getArchiver(@Nonnull File file) throws NoSuchArchiverException {
115         return getArchiver(getFileExtension(file));
116     }
117 
118     @Override
119     public Collection<String> getAvailableArchivers() {
120         return archivers.keySet();
121     }
122 
123     @Override
124     @Nonnull
125     public UnArchiver getUnArchiver(@Nonnull File file) throws NoSuchArchiverException {
126         return getUnArchiver(getFileExtension(file));
127     }
128 
129     @Nonnull
130     @Override
131     public Collection<String> getAvailableUnArchivers() {
132         return unArchivers.keySet();
133     }
134 
135     @Override
136     @Nonnull
137     public PlexusIoResourceCollection getResourceCollection(@Nonnull File file) throws NoSuchArchiverException {
138         return getResourceCollection(getFileExtension(file));
139     }
140 
141     @Nonnull
142     @Override
143     public Collection<String> getAvailableResourceCollections() {
144         return plexusIoResourceCollections.keySet();
145     }
146 }