View Javadoc

1   /*
2    * Copyright 2012-2013 smartics, Kronseder & Reiner GmbH
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  package de.smartics.properties.resource.domain;
17  
18  import java.io.Serializable;
19  import java.net.URL;
20  import java.util.ArrayList;
21  import java.util.Collections;
22  import java.util.HashMap;
23  import java.util.List;
24  import java.util.Map;
25  
26  import javax.annotation.CheckForNull;
27  import javax.annotation.concurrent.NotThreadSafe;
28  
29  import org.slf4j.Logger;
30  import org.slf4j.LoggerFactory;
31  
32  import de.smartics.util.lang.Arg;
33  
34  /**
35   * Defines the environment of class path resources to access.
36   */
37  @NotThreadSafe
38  public final class ClassPathEnvironment implements Serializable
39  {
40    // ********************************* Fields *********************************
41  
42    // --- constants ------------------------------------------------------------
43  
44    /**
45     * The class version identifier.
46     */
47    private static final long serialVersionUID = 1L;
48  
49    /**
50     * Reference to the logger for this class.
51     */
52    private static final Logger LOG = LoggerFactory
53        .getLogger(ClassPathEnvironment.class);
54  
55    // --- members --------------------------------------------------------------
56  
57    /**
58     * The map of artifact IDs (GAV concatenated and separated by colons) to the
59     * artifact references.
60     */
61    private final Map<String, ArtifactRef> index =
62        new HashMap<String, ArtifactRef>();
63  
64    /**
65     * The list of artifact references found on this class path.
66     *
67     * @serial
68     */
69    private final List<ArtifactRef> artifactRefs = new ArrayList<ArtifactRef>();
70  
71    // ****************************** Initializer *******************************
72  
73    // ****************************** Constructors ******************************
74  
75    /**
76     * Default constructor.
77     */
78    public ClassPathEnvironment()
79    {
80    }
81  
82    /**
83     * Convenience constructor that allows to add artifact references to create an
84     * initial list.
85     *
86     * @param artifactRefs the initial collection of artifact references to add as
87     *          roots.
88     */
89    public ClassPathEnvironment(final ArtifactRef... artifactRefs)
90    {
91      this();
92  
93      for (final ArtifactRef artifactRef : artifactRefs)
94      {
95        addArchiveArtifactRef(artifactRef);
96      }
97    }
98  
99    /**
100    * Convenience constructor that allows to add artifact references to create an
101    * initial list.
102    *
103    * @param artifactRefs the initial collection of artifact references to add as
104    *          roots.
105    */
106   public ClassPathEnvironment(final List<ArtifactRef> artifactRefs)
107   {
108     for (final ArtifactRef artifactRef : artifactRefs)
109     {
110       addArchiveArtifactRef(artifactRef);
111     }
112   }
113 
114   // ****************************** Inner Classes *****************************
115 
116   // ********************************* Methods ********************************
117 
118   // --- init -----------------------------------------------------------------
119 
120   // --- get&set --------------------------------------------------------------
121 
122   // --- business -------------------------------------------------------------
123   /**
124    * Returns a list of artifact references.
125    *
126    * @return an unmodifiable list of artifact references registered in this
127    *         environment.
128    */
129   public List<ArtifactRef> getArtifactRefs()
130   {
131     return Collections.unmodifiableList(artifactRefs);
132   }
133 
134   /**
135    * Returns a list of URLs that point to the physical locations of the
136    * artifacts.
137    *
138    * @return a list of URLs that point to the physical locations of the
139    *         artifacts.
140    */
141   public List<URL> getUrls()
142   {
143     final List<URL> urls = new ArrayList<URL>(artifactRefs.size());
144     for (final ArtifactRef ref : artifactRefs)
145     {
146       final URL url = ref.getUrl();
147       urls.add(url);
148     }
149 
150     return urls;
151   }
152 
153   /**
154    * Returns the artifact reference by its short ID.
155    *
156    * @param artifactId the GAV concatenated and separated by colons.
157    * @return the associated artifact reference or <code>null</code> if there is
158    *         no artifact reference with the given {@code artifactId} registered.
159    * @throws NullPointerException if {@code artifactId} is <code>null</code>.
160    */
161   @CheckForNull
162   public ArtifactRef getArtifactRef(final String artifactId)
163     throws NullPointerException
164   {
165     Arg.checkNotNull("artifactId", artifactId);
166 
167     return index.get(artifactId);
168   }
169 
170   /**
171    * Adds the given artifact reference to the list of artifact references. All
172    * references are considered to be roots to search for class path resources.
173    * <p>
174    * If {@code archiveArtifactRef} is not an {@link ArtifactRef#isArchive()
175    * archive}, it will <strong>not be added</strong>.
176    * </p>
177    *
178    * @param archiveArtifactRef the artifact reference to add.
179    * @throws NullPointerException if {@code archiveArtifactRef} is
180    *           <code>null</code>.
181    */
182   public void addArchiveArtifactRef(final ArtifactRef archiveArtifactRef)
183     throws NullPointerException
184   {
185     Arg.checkNotNull("archiveArtifactRef", archiveArtifactRef);
186 
187     if (!archiveArtifactRef.isArchive())
188     {
189       LOG.debug("Dropping '" + archiveArtifactRef
190                 + "' since it is not an archive.");
191       return;
192     }
193 
194     artifactRefs.add(archiveArtifactRef);
195     final String artifactId = archiveArtifactRef.getId().toShortString();
196     index.put(artifactId, archiveArtifactRef);
197   }
198 
199   /**
200    * Adds the given artifact reference to the list of artifact references. All
201    * references are considered to be roots to search for class path resources.
202    *
203    * @param artifactRef the artifact reference to add.
204    * @throws NullPointerException if {@code artifactRef} is <code>null</code>.
205    */
206   public void addAnyArtifactRef(final ArtifactRef artifactRef)
207     throws NullPointerException
208   {
209     Arg.checkNotNull("artifactRef", artifactRef);
210 
211     artifactRefs.add(artifactRef);
212     final String artifactId = artifactRef.getId().toShortString();
213     index.put(artifactId, artifactRef);
214   }
215 
216   // --- object basics --------------------------------------------------------
217 
218   /**
219    * Returns the string representation of the object.
220    *
221    * @return the string representation of the object.
222    */
223   @Override
224   public String toString()
225   {
226     final StringBuilder buffer = new StringBuilder();
227 
228     buffer.append("Class path roots:");
229 
230     for (final ArtifactRef artifactRef : artifactRefs)
231     {
232       buffer.append(' ').append(artifactRef);
233     }
234 
235     return buffer.toString();
236   }
237 }