View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one   *
3    * or more contributor license agreements.  See the NOTICE file *
4    * distributed with this work for additional information        *
5    * regarding copyright ownership.  The ASF licenses this file   *
6    * to you under the Apache License, Version 2.0 (the            *
7    * "License"); you may not use this file except in compliance   *
8    * with the License.  You may obtain a copy of the License at   *
9    *                                                              *
10   *   http://www.apache.org/licenses/LICENSE-2.0                 *
11   *                                                              *
12   * Unless required by applicable law or agreed to in writing,   *
13   * software distributed under the License is distributed on an  *
14   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
15   * KIND, either express or implied.  See the License for the    *
16   * specific language governing permissions and limitations      *
17   * under the License.                                           *
18   */
19  package org.apache.rat.api;
20  
21  import java.util.ArrayList;
22  import java.util.Collection;
23  import java.util.Collections;
24  import java.util.Iterator;
25  import java.util.List;
26  
27  import org.apache.commons.lang3.StringUtils;
28  import org.apache.rat.license.ILicense;
29  
30  /**
31   * Data about the document under test..
32   */
33  public class MetaData {
34  
35      public static final String RAT_BASE_URL = "http://org/apache/rat/meta-data";
36      
37      // Document Categories
38      public static final String RAT_URL_DOCUMENT_CATEGORY = RAT_BASE_URL + "#FileCategory";
39      public static final String RAT_DOCUMENT_CATEGORY_VALUE_GENERATED = "GEN  ";
40      public static final String RAT_DOCUMENT_CATEGORY_VALUE_UNKNOWN = "?????";
41      public static final String RAT_DOCUMENT_CATEGORY_VALUE_ARCHIVE = "archive";
42      public static final String RAT_DOCUMENT_CATEGORY_VALUE_NOTICE = "notice";
43      public static final String RAT_DOCUMENT_CATEGORY_VALUE_BINARY = "binary";
44      public static final String RAT_DOCUMENT_CATEGORY_VALUE_STANDARD = "standard";
45      public static final Datum RAT_DOCUMENT_CATEGORY_DATUM_GENERATED = new Datum(RAT_URL_DOCUMENT_CATEGORY, RAT_DOCUMENT_CATEGORY_VALUE_GENERATED);
46      public static final Datum RAT_DOCUMENT_CATEGORY_DATUM_UNKNOWN = new Datum(RAT_URL_DOCUMENT_CATEGORY, RAT_DOCUMENT_CATEGORY_VALUE_UNKNOWN);
47      public static final Datum RAT_DOCUMENT_CATEGORY_DATUM_ARCHIVE = new Datum(RAT_URL_DOCUMENT_CATEGORY, RAT_DOCUMENT_CATEGORY_VALUE_ARCHIVE);
48      public static final Datum RAT_DOCUMENT_CATEGORY_DATUM_NOTICE = new Datum(RAT_URL_DOCUMENT_CATEGORY, RAT_DOCUMENT_CATEGORY_VALUE_NOTICE);
49      public static final Datum RAT_DOCUMENT_CATEGORY_DATUM_BINARY = new Datum(RAT_URL_DOCUMENT_CATEGORY, RAT_DOCUMENT_CATEGORY_VALUE_BINARY);
50      public static final Datum RAT_DOCUMENT_CATEGORY_DATUM_STANDARD = new Datum(RAT_URL_DOCUMENT_CATEGORY, RAT_DOCUMENT_CATEGORY_VALUE_STANDARD);
51      
52      // Header Categories
53      public static final String RAT_URL_HEADER_CATEGORY = RAT_BASE_URL + "#HeaderCategory";
54      
55      // License Family Categories
56      public static final String RAT_URL_LICENSE_FAMILY_CATEGORY= RAT_BASE_URL + "#LicenseFamilyCategory";
57      // Shortcuts used in report output, must be exactly 5 characters
58      public static final String RAT_LICENSE_FAMILY_CATEGORY_VALUE_GEN = "GEN  ";
59      public static final String RAT_LICENSE_FAMILY_CATEGORY_VALUE_UNKNOWN = "?????";
60      @Deprecated
61      public static final String RAT_LICENSE_FAMILY_CATEGORY_VALUE_ASL = "AL   ";
62      @Deprecated
63      public static final String RAT_LICENSE_FAMILY_CATEGORY_VALUE_OASIS = "OASIS";
64      @Deprecated
65      public static final String RAT_LICENSE_FAMILY_CATEGORY_VALUE_W3CD = "W3CD ";
66      @Deprecated
67      public static final String RAT_LICENSE_FAMILY_CATEGORY_VALUE_W3C = "W3C  ";
68      @Deprecated
69      public static final String RAT_LICENSE_FAMILY_CATEGORY_VALUE_DOJO = "DOJO ";
70      @Deprecated
71      public static final String RAT_LICENSE_FAMILY_CATEGORY_VALUE_TMF = "TMF  ";
72      @Deprecated
73      public static final String RAT_LICENSE_FAMILY_CATEGORY_VALUE_GPL1 ="GPL1 ";
74      @Deprecated
75      public static final String RAT_LICENSE_FAMILY_CATEGORY_VALUE_GPL2 ="GPL2 ";
76      @Deprecated
77      public static final String RAT_LICENSE_FAMILY_CATEGORY_VALUE_GPL3 = "GPL3 ";
78      @Deprecated
79      public static final String RAT_LICENSE_FAMILY_CATEGORY_VALUE_MIT = "MIT  ";
80      @Deprecated
81      public static final String RAT_LICENSE_FAMILY_CATEGORY_VALUE_CDDL1 = "CDDL1";
82  
83      public static final Datum RAT_LICENSE_FAMILY_CATEGORY_DATUM_GEN = new Datum(RAT_URL_LICENSE_FAMILY_CATEGORY, RAT_LICENSE_FAMILY_CATEGORY_VALUE_GEN);
84      public static final Datum RAT_LICENSE_FAMILY_CATEGORY_DATUM_UNKNOWN = new Datum(RAT_URL_LICENSE_FAMILY_CATEGORY, RAT_LICENSE_FAMILY_CATEGORY_VALUE_UNKNOWN);
85      @Deprecated
86      public static final Datum RAT_LICENSE_FAMILY_CATEGORY_DATUM_ASL = new Datum(RAT_URL_LICENSE_FAMILY_CATEGORY, RAT_LICENSE_FAMILY_CATEGORY_VALUE_ASL);
87      @Deprecated
88      public static final Datum RAT_LICENSE_FAMILY_CATEGORY_DATUM_OASIS = new Datum(RAT_URL_LICENSE_FAMILY_CATEGORY, RAT_LICENSE_FAMILY_CATEGORY_VALUE_OASIS);
89      @Deprecated
90      public static final Datum RAT_LICENSE_FAMILY_CATEGORY_DATUM_W3CD = new Datum(RAT_URL_LICENSE_FAMILY_CATEGORY, RAT_LICENSE_FAMILY_CATEGORY_VALUE_W3CD);
91      @Deprecated
92      public static final Datum RAT_LICENSE_FAMILY_CATEGORY_DATUM_W3C = new Datum(RAT_URL_LICENSE_FAMILY_CATEGORY, RAT_LICENSE_FAMILY_CATEGORY_VALUE_W3C);
93      @Deprecated
94      public static final Datum RAT_LICENSE_FAMILY_CATEGORY_DATUM_DOJO = new Datum(RAT_URL_LICENSE_FAMILY_CATEGORY, RAT_LICENSE_FAMILY_CATEGORY_VALUE_DOJO);
95      @Deprecated
96      public static final Datum RAT_LICENSE_FAMILY_CATEGORY_DATUM_TMF = new Datum(RAT_URL_LICENSE_FAMILY_CATEGORY, RAT_LICENSE_FAMILY_CATEGORY_VALUE_TMF);
97      @Deprecated
98      public static final Datum RAT_LICENSE_FAMILY_CATEGORY_DATUM_GPL1 = new Datum(RAT_URL_LICENSE_FAMILY_CATEGORY,RAT_LICENSE_FAMILY_CATEGORY_VALUE_GPL1);
99      @Deprecated
100     public static final Datum RAT_LICENSE_FAMILY_CATEGORY_DATUM_GPL2 = new Datum(RAT_URL_LICENSE_FAMILY_CATEGORY,RAT_LICENSE_FAMILY_CATEGORY_VALUE_GPL2);
101     @Deprecated
102     public static final Datum RAT_LICENSE_FAMILY_CATEGORY_DATUM_GPL3 = new Datum(RAT_URL_LICENSE_FAMILY_CATEGORY,RAT_LICENSE_FAMILY_CATEGORY_VALUE_GPL3);
103     @Deprecated
104     public static final Datum RAT_LICENSE_FAMILY_CATEGORY_DATUM_MIT = new Datum(RAT_URL_LICENSE_FAMILY_CATEGORY,RAT_LICENSE_FAMILY_CATEGORY_VALUE_MIT);
105     @Deprecated
106     public static final Datum RAT_LICENSE_FAMILY_CATEGORY_DATUM_CDLL1 = new Datum(RAT_URL_LICENSE_FAMILY_CATEGORY,RAT_LICENSE_FAMILY_CATEGORY_VALUE_CDDL1);
107 
108     // License Family Standard Names
109     public static final String RAT_URL_LICENSE_FAMILY_NAME= RAT_BASE_URL + "#LicenseFamilyName";
110     @Deprecated
111     public static final String RAT_LICENSE_FAMILY_NAME_VALUE_W3C_SOFTWARE_COPYRIGHT = "W3C Software Copyright";
112     @Deprecated
113     public static final String RAT_LICENSE_FAMILY_NAME_VALUE_W3C_DOCUMENT_COPYRIGHT = "W3C Document Copyright";
114     @Deprecated
115     public static final String RAT_LICENSE_FAMILY_NAME_VALUE_OASIS_OPEN_LICENSE = "OASIS Open License";
116     @Deprecated
117     public static final String RAT_LICENSE_FAMILY_NAME_VALUE_MODIFIED_BSD_LICENSE = "Modified BSD License";
118     @Deprecated
119     public static final String RAT_LICENSE_FAMILY_NAME_VALUE_APACHE_LICENSE_VERSION_2_0 = "Apache License Version 2.0";
120     @Deprecated
121     public static final String RAT_LICENSE_FAMILY_NAME_VALUE_GPL_VERSION_1 =
122             "GNU General Public License, version 1";
123     @Deprecated
124     public static final String RAT_LICENSE_FAMILY_NAME_VALUE_GPL_VERSION_2 =
125             "GNU General Public License, version 2";
126     @Deprecated
127     public static final String RAT_LICENSE_FAMILY_NAME_VALUE_GPL_VERSION_3 =
128             "GNU General Public License, version 3";
129     @Deprecated
130     public static final String RAT_LICENSE_FAMILY_NAME_VALUE_MIT =
131             "The MIT License";
132     @Deprecated
133     public static final String RAT_LICENSE_FAMILY_NAME_VALUE_CDDL1 =
134             "COMMON DEVELOPMENT AND DISTRIBUTION LICENSE Version 1.0";
135     @Deprecated
136     public static final String RAT_LICENSE_FAMILY_NAME_VALUE_ACADEMIC_FREE_LICENSE_VERSION_2_1 = "Academic Free License, Version 2.1";
137 
138     public static final String RAT_LICENSE_FAMILY_NAME_VALUE_UNKNOWN = "?????";
139     @Deprecated
140     public static final Datum RAT_LICENSE_FAMILY_NAME_DATUM_W3C_SOFTWARE_COPYRIGHT 
141         = new Datum(RAT_URL_LICENSE_FAMILY_NAME, RAT_LICENSE_FAMILY_NAME_VALUE_W3C_SOFTWARE_COPYRIGHT);
142     @Deprecated
143     public static final Datum RAT_LICENSE_FAMILY_NAME_DATUM_W3C_DOCUMENT_COPYRIGHT 
144         = new Datum(RAT_URL_LICENSE_FAMILY_NAME, RAT_LICENSE_FAMILY_NAME_VALUE_W3C_DOCUMENT_COPYRIGHT);
145     @Deprecated
146     public static final Datum RAT_LICENSE_FAMILY_NAME_DATUM_OASIS_OPEN_LICENSE 
147         = new Datum(RAT_URL_LICENSE_FAMILY_NAME, RAT_LICENSE_FAMILY_NAME_VALUE_OASIS_OPEN_LICENSE);
148     @Deprecated
149     public static final Datum RAT_LICENSE_FAMILY_NAME_DATUM_MODIFIED_BSD_LICENSE 
150         = new Datum(RAT_URL_LICENSE_FAMILY_NAME, RAT_LICENSE_FAMILY_NAME_VALUE_MODIFIED_BSD_LICENSE);
151     @Deprecated
152     public static final Datum RAT_LICENSE_FAMILY_NAME_DATUM_APACHE_LICENSE_VERSION_2_0
153         = new Datum(RAT_URL_LICENSE_FAMILY_NAME, RAT_LICENSE_FAMILY_NAME_VALUE_APACHE_LICENSE_VERSION_2_0);
154     @Deprecated
155     public static final Datum
156             RAT_LICENSE_FAMILY_NAME_DATUM_GPL_VERSION_1 = new Datum(RAT_URL_LICENSE_FAMILY_NAME, RAT_LICENSE_FAMILY_NAME_VALUE_GPL_VERSION_1);
157     @Deprecated
158     public static final Datum
159             RAT_LICENSE_FAMILY_NAME_DATUM_GPL_VERSION_2 = new Datum(RAT_URL_LICENSE_FAMILY_NAME, RAT_LICENSE_FAMILY_NAME_VALUE_GPL_VERSION_2);
160     @Deprecated
161     public static final Datum
162             RAT_LICENSE_FAMILY_NAME_DATUM_GPL_VERSION_3 = new Datum(RAT_URL_LICENSE_FAMILY_NAME, RAT_LICENSE_FAMILY_NAME_VALUE_GPL_VERSION_3);
163     @Deprecated
164     public static final Datum
165             RAT_LICENSE_FAMILY_NAME_DATUM_MIT = new Datum(RAT_URL_LICENSE_FAMILY_NAME, RAT_LICENSE_FAMILY_NAME_VALUE_MIT);
166     @Deprecated
167     public static final Datum
168             RAT_LICENSE_FAMILY_NAME_DATUM_CDDL1 = new Datum(RAT_URL_LICENSE_FAMILY_NAME, RAT_LICENSE_FAMILY_NAME_VALUE_CDDL1);
169     @Deprecated
170     public static final Datum RAT_LICENSE_FAMILY_NAME_DATUM_ACADEMIC_FREE_LICENSE_VERSION_2_1
171         = new Datum(RAT_URL_LICENSE_FAMILY_NAME, RAT_LICENSE_FAMILY_NAME_VALUE_ACADEMIC_FREE_LICENSE_VERSION_2_1);
172 
173     public static final Datum RAT_LICENSE_FAMILY_NAME_DATUM_UNKNOWN
174         = new Datum(RAT_URL_LICENSE_FAMILY_NAME, RAT_LICENSE_FAMILY_NAME_VALUE_UNKNOWN); 
175     
176     // Header sample
177     public static final String RAT_URL_HEADER_SAMPLE = RAT_BASE_URL + "#HeaderSample";
178     
179     // License Approval
180     public static final String RAT_URL_APPROVED_LICENSE = RAT_BASE_URL + "#ApprovedLicense";
181     public static final String RAT_APPROVED_LICENSE_VALUE_TRUE = Boolean.TRUE.toString();
182     public static final String RAT_APPROVED_LICENSE_VALUE_FALSE = Boolean.FALSE.toString();
183     public static final Datum RAT_APPROVED_LICENSE_DATUM_TRUE = new Datum(RAT_URL_APPROVED_LICENSE, RAT_APPROVED_LICENSE_VALUE_TRUE);
184     public static final Datum RAT_APPROVED_LICENSE_DATUM_FALSE = new Datum(RAT_URL_APPROVED_LICENSE, RAT_APPROVED_LICENSE_VALUE_FALSE);
185     @Deprecated
186     public static final Datum RAT_APPROVED_LICENSE_DATIM_TRUE = RAT_APPROVED_LICENSE_DATUM_TRUE;
187     @Deprecated
188     public static final Datum RAT_APPROVED_LICENSE_DATIM_FALSE = RAT_APPROVED_LICENSE_DATUM_FALSE;
189 
190     /** 
191      * Only likely to be a small quantity of data 
192      * so trade some performance for simplicity.
193      */
194     private final List<Datum> data;
195 
196     /**
197      * Create metadata without a content type.
198      */
199     public MetaData() {
200         this.data = new ArrayList<>(16);
201     }
202     
203     /**
204      * Add the license information to the metadata.
205      * @param license the license to add metadata for.
206      */
207     public void reportOnLicense(ILicense license) {
208         
209         if (StringUtils.isNotBlank(license.getNotes())) {
210             set(new MetaData.Datum(MetaData.RAT_URL_HEADER_SAMPLE, license.getNotes()));
211         }
212         set(new MetaData.Datum(MetaData.RAT_URL_HEADER_CATEGORY, license.getLicenseFamily().getFamilyCategory()));
213         set(new MetaData.Datum(MetaData.RAT_URL_LICENSE_FAMILY_CATEGORY, license.getLicenseFamily().getFamilyCategory()));
214         set(new MetaData.Datum(MetaData.RAT_URL_LICENSE_FAMILY_NAME, license.getLicenseFamily().getFamilyName()));
215     }
216 
217     
218     /**
219      * Gets all data.
220      * @return unmodifiable view of the meta data.
221      */
222     public Collection<Datum> getData() {
223         return Collections.unmodifiableCollection(data);
224     }
225     
226     /**
227      * Adds a new datum.
228      * Existing data with the same name are not replaced.
229      * @param datum datum to add.
230      * @see #set(org.apache.rat.api.MetaData.Datum)
231      */
232     public void add(final Datum datum) {
233        data.add(datum); 
234     }
235     
236     /**
237      * Puts in a new datum replacing any existing data.
238      * Any current data matching the name are removed.
239      * @param datum not null
240      * @see #add(org.apache.rat.api.MetaData.Datum)
241      */
242     public void set(final Datum datum) {
243        clear(datum.getName()); 
244        add(datum);
245     }
246     
247     /**
248      * Gets the first datum matching the given name.
249      * @param name not null
250      * @return the matching datum first added when there is any matching data,
251      * null otherwise
252      */
253     public Datum get(final String name) {
254         Datum result = null;
255         for (Datum next : data) {
256             if (name.equals(next.getName())) {
257                 result = next;
258                 break;
259             }
260         }
261         return result;
262     }
263     
264     /**
265      * Gets the value of the first datum matching the given name.
266      * @param name not null
267      * @return the value of the matchin datum first added when there is any matching data,
268      * null otherwise
269      */
270     public String value(final String name) {
271         final Datum datum = get(name);
272         final String result;
273         if (datum == null) {
274             result = null;
275         } else {
276             result = datum.getValue();
277         }
278         return result;
279     }
280     
281     /**
282      * Removes all data matching the given name.
283      * @param name not null
284      * @return true if any data match, false otherwise
285      */
286     public boolean clear(final String name) {
287         boolean dataRemoved = false;
288         for (final Iterator<Datum> it = data.iterator();it.hasNext();) {
289             final Datum datum = it.next();
290             if (datum.getName().equals(name)) {
291                 it.remove();
292                 dataRemoved = true;
293             }
294         }
295         return dataRemoved;
296     }
297     
298     /**
299      * Clears all data.
300      */
301     public void clear() {
302         data.clear();
303     }
304     
305     /**
306      * A datum.
307      */
308     public static final class Datum {
309         private final String name;
310         private final String value;
311         
312         /**
313          * Constructs a datum.
314          * @param name not null
315          * @param value not null
316          */
317         public Datum(final String name, final String value) {
318             super();
319             this.name = name;
320             this.value = value;
321         }
322         
323         /**
324          * Gets the name of the data type.
325          * To avoid collisions, it is recommended that URLs are used.
326          * @return not null
327          */
328         public String getName() {
329             return name;
330         }
331      
332         /**
333          * Data type value.
334          * @return not null
335          */
336         public String getValue() {
337             return value;
338         }
339 
340         /**
341          * Constructs a <code>String</code> with all attributes
342          * in name = value format.
343          *
344          * @return a <code>String</code> representation 
345          * of this object.
346          */
347         @Override
348         public String toString()
349         {
350             return "Datum [ "
351                 + "name ='" + this.name + "',"
352                 + "value ='" + this.value + " "
353                 + "']";
354         }
355     }
356 }
357