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  
28  
29  /**
30   * Data about the subject.
31   */
32  public class MetaData {
33  
34      public static final String RAT_BASE_URL = "http://org/apache/rat/meta-data";
35      
36      // Document Categories
37      public static final String RAT_URL_DOCUMENT_CATEGORY = RAT_BASE_URL + "#FileCategory";
38      public static final String RAT_DOCUMENT_CATEGORY_VALUE_GENERATED = "GEN  ";
39      public static final String RAT_DOCUMENT_CATEGORY_VALUE_UNKNOWN = "?????";
40      public static final String RAT_DOCUMENT_CATEGORY_VALUE_ARCHIVE = "archive";
41      public static final String RAT_DOCUMENT_CATEGORY_VALUE_NOTICE = "notice";
42      public static final String RAT_DOCUMENT_CATEGORY_VALUE_BINARY = "binary";
43      public static final String RAT_DOCUMENT_CATEGORY_VALUE_STANDARD = "standard";
44      public static final Datum RAT_DOCUMENT_CATEGORY_DATUM_GENERATED = new Datum(RAT_URL_DOCUMENT_CATEGORY, RAT_DOCUMENT_CATEGORY_VALUE_GENERATED);
45      public static final Datum RAT_DOCUMENT_CATEGORY_DATUM_UNKNOWN = new Datum(RAT_URL_DOCUMENT_CATEGORY, RAT_DOCUMENT_CATEGORY_VALUE_UNKNOWN);
46      public static final Datum RAT_DOCUMENT_CATEGORY_DATUM_ARCHIVE = new Datum(RAT_URL_DOCUMENT_CATEGORY, RAT_DOCUMENT_CATEGORY_VALUE_ARCHIVE);
47      public static final Datum RAT_DOCUMENT_CATEGORY_DATUM_NOTICE = new Datum(RAT_URL_DOCUMENT_CATEGORY, RAT_DOCUMENT_CATEGORY_VALUE_NOTICE);
48      public static final Datum RAT_DOCUMENT_CATEGORY_DATUM_BINARY = new Datum(RAT_URL_DOCUMENT_CATEGORY, RAT_DOCUMENT_CATEGORY_VALUE_BINARY);
49      public static final Datum RAT_DOCUMENT_CATEGORY_DATUM_STANDARD = new Datum(RAT_URL_DOCUMENT_CATEGORY, RAT_DOCUMENT_CATEGORY_VALUE_STANDARD);
50      
51      // Header Categories
52      public static final String RAT_URL_HEADER_CATEGORY = RAT_BASE_URL + "#HeaderCategory";
53      
54      // License Family Categories
55      public static final String RAT_URL_LICENSE_FAMILY_CATEGORY= RAT_BASE_URL + "#LicenseFamilyCategory";
56      public static final String RAT_LICENSE_FAMILY_CATEGORY_VALUE_GEN = "GEN  ";
57      public static final String RAT_LICENSE_FAMILY_CATEGORY_VALUE_UNKNOWN = "?????";
58      public static final String RAT_LICENSE_FAMILY_CATEGORY_VALUE_ASL = "AL   ";
59      public static final String RAT_LICENSE_FAMILY_CATEGORY_VALUE_OASIS = "OASIS";
60      public static final String RAT_LICENSE_FAMILY_CATEGORY_VALUE_W3CD = "W3CD ";
61      public static final String RAT_LICENSE_FAMILY_CATEGORY_VALUE_W3C = "W3C  ";
62      public static final String RAT_LICENSE_FAMILY_CATEGORY_VALUE_DOJO = "DOJO ";
63      public static final String RAT_LICENSE_FAMILY_CATEGORY_VALUE_TMF = "TMF  ";
64      public static final Datum RAT_LICENSE_FAMILY_CATEGORY_DATUM_GEN = new Datum(RAT_URL_LICENSE_FAMILY_CATEGORY, RAT_LICENSE_FAMILY_CATEGORY_VALUE_GEN);
65      public static final Datum RAT_LICENSE_FAMILY_CATEGORY_DATUM_UNKNOWN = new Datum(RAT_URL_LICENSE_FAMILY_CATEGORY, RAT_LICENSE_FAMILY_CATEGORY_VALUE_UNKNOWN);
66      public static final Datum RAT_LICENSE_FAMILY_CATEGORY_DATUM_ASL = new Datum(RAT_URL_LICENSE_FAMILY_CATEGORY, RAT_LICENSE_FAMILY_CATEGORY_VALUE_ASL);
67      public static final Datum RAT_LICENSE_FAMILY_CATEGORY_DATUM_OASIS = new Datum(RAT_URL_LICENSE_FAMILY_CATEGORY, RAT_LICENSE_FAMILY_CATEGORY_VALUE_OASIS);
68      public static final Datum RAT_LICENSE_FAMILY_CATEGORY_DATUM_W3CD = new Datum(RAT_URL_LICENSE_FAMILY_CATEGORY, RAT_LICENSE_FAMILY_CATEGORY_VALUE_W3CD);
69      public static final Datum RAT_LICENSE_FAMILY_CATEGORY_DATUM_W3C = new Datum(RAT_URL_LICENSE_FAMILY_CATEGORY, RAT_LICENSE_FAMILY_CATEGORY_VALUE_W3C);
70      public static final Datum RAT_LICENSE_FAMILY_CATEGORY_DATUM_DOJO = new Datum(RAT_URL_LICENSE_FAMILY_CATEGORY, RAT_LICENSE_FAMILY_CATEGORY_VALUE_DOJO);
71      public static final Datum RAT_LICENSE_FAMILY_CATEGORY_DATUM_TMF = new Datum(RAT_URL_LICENSE_FAMILY_CATEGORY, RAT_LICENSE_FAMILY_CATEGORY_VALUE_TMF);
72  
73      // License Family Standard Names
74      public static final String RAT_URL_LICENSE_FAMILY_NAME= RAT_BASE_URL + "#LicenseFamilyName";
75      public static final String RAT_LICENSE_FAMILY_NAME_VALUE_W3C_SOFTWARE_COPYRIGHT = "W3C Software Copyright";
76      public static final String RAT_LICENSE_FAMILY_NAME_VALUE_W3C_DOCUMENT_COPYRIGHT = "W3C Document Copyright";
77      public static final String RAT_LICENSE_FAMILY_NAME_VALUE_OASIS_OPEN_LICENSE = "OASIS Open License";
78      public static final String RAT_LICENSE_FAMILY_NAME_VALUE_MODIFIED_BSD_LICENSE = "Modified BSD License";
79      public static final String RAT_LICENSE_FAMILY_NAME_VALUE_APACHE_LICENSE_VERSION_2_0 = "Apache License Version 2.0";
80      public static final String RAT_LICENSE_FAMILY_NAME_VALUE_ACADEMIC_FREE_LICENSE_VERSION_2_1 = "Academic Free License, Version 2.1";
81      public static final String RAT_LICENSE_FAMILY_NAME_VALUE_UNKNOWN = "?????";
82      public static final Datum RAT_LICENSE_FAMILY_NAME_DATUM_W3C_SOFTWARE_COPYRIGHT 
83          = new Datum(RAT_URL_LICENSE_FAMILY_NAME, RAT_LICENSE_FAMILY_NAME_VALUE_W3C_SOFTWARE_COPYRIGHT);
84      public static final Datum RAT_LICENSE_FAMILY_NAME_DATUM_W3C_DOCUMENT_COPYRIGHT 
85          = new Datum(RAT_URL_LICENSE_FAMILY_NAME, RAT_LICENSE_FAMILY_NAME_VALUE_W3C_DOCUMENT_COPYRIGHT);
86      public static final Datum RAT_LICENSE_FAMILY_NAME_DATUM_OASIS_OPEN_LICENSE 
87          = new Datum(RAT_URL_LICENSE_FAMILY_NAME, RAT_LICENSE_FAMILY_NAME_VALUE_OASIS_OPEN_LICENSE);
88      public static final Datum RAT_LICENSE_FAMILY_NAME_DATUM_MODIFIED_BSD_LICENSE 
89          = new Datum(RAT_URL_LICENSE_FAMILY_NAME, RAT_LICENSE_FAMILY_NAME_VALUE_MODIFIED_BSD_LICENSE);
90      public static final Datum RAT_LICENSE_FAMILY_NAME_DATUM_APACHE_LICENSE_VERSION_2_0
91          = new Datum(RAT_URL_LICENSE_FAMILY_NAME, RAT_LICENSE_FAMILY_NAME_VALUE_APACHE_LICENSE_VERSION_2_0);
92      public static final Datum RAT_LICENSE_FAMILY_NAME_DATUM_ACADEMIC_FREE_LICENSE_VERSION_2_1
93          = new Datum(RAT_URL_LICENSE_FAMILY_NAME, RAT_LICENSE_FAMILY_NAME_VALUE_ACADEMIC_FREE_LICENSE_VERSION_2_1);
94      public static final Datum RAT_LICENSE_FAMILY_NAME_DATUM_UNKNOWN
95          = new Datum(RAT_URL_LICENSE_FAMILY_NAME, RAT_LICENSE_FAMILY_NAME_VALUE_UNKNOWN); 
96      
97      // Header sample
98      public static final String RAT_URL_HEADER_SAMPLE = RAT_BASE_URL + "#HeaderSample";
99      
100     // License Approval
101     public static final String RAT_URL_APPROVED_LICENSE = RAT_BASE_URL + "#ApprovedLicense";
102     public static final String RAT_APPROVED_LICENSE_VALUE_TRUE = Boolean.TRUE.toString();
103     public static final String RAT_APPROVED_LICENSE_VALUE_FALSE = Boolean.FALSE.toString();
104     public static final Datum RAT_APPROVED_LICENSE_DATIM_TRUE = new Datum(RAT_URL_APPROVED_LICENSE, RAT_APPROVED_LICENSE_VALUE_TRUE);
105     public static final Datum RAT_APPROVED_LICENSE_DATIM_FALSE = new Datum(RAT_URL_APPROVED_LICENSE, RAT_APPROVED_LICENSE_VALUE_FALSE);
106     
107     private ContentType contentType;
108     /** 
109      * Only likely to be a small quantity of data 
110      * so trade some performance for simplicity.
111      */
112     private final List/*<Datum>*/ data;
113 
114     public MetaData() {
115         this(null);
116     }
117     
118     public MetaData(final ContentType contentType) {
119         this.contentType = contentType;
120         this.data = new ArrayList/*<Datum>*/(16);
121     }
122     
123     /**
124      * Gets the content type for the subject.
125      * @return or null when the type is unknown
126      */
127     public ContentType getContentType() {
128         return contentType;
129     }
130     
131     /**
132      * Sets the content type for this subject.
133      * @param contentType <code>ContentType</code>,
134      * or null when the content type is unknown
135      */
136     public void setContentType(final ContentType contentType) {
137         this.contentType = contentType;
138     }
139     
140     /**
141      * Gets all data.
142      * @return unmodifiable view of the meta data.
143      */
144     public Collection getData() {
145         return Collections.unmodifiableCollection(data);
146     }
147     
148     /**
149      * Adds a new datum.
150      * Existing data with the same name are not replaced.
151      * @param datum
152      * @see #set(org.apache.rat.api.MetaData.Datum)
153      */
154     public void add(final Datum datum) {
155        data.add(datum); 
156     }
157     
158     /**
159      * Puts in a new datum replacing any existing data.
160      * Any current data matching the name are removed.
161      * @param datum not null
162      * @see #add(org.apache.rat.api.MetaData.Datum)
163      */
164     public void set(final Datum datum) {
165        clear(datum.getName()); 
166        add(datum);
167     }
168     
169     /**
170      * Gets the first datum matching the given name.
171      * @param name not null
172      * @return the matching datum first added when there is any matching data,
173      * null otherwise
174      */
175     public Datum get(final String name) {
176         Datum result = null;
177         for (final Iterator/*<Datum>*/ it=data.iterator();it.hasNext();) {
178             final Datum next = (Datum) it.next();
179             if (name.equals(next.getName())) {
180                 result = next;
181                 break;
182             }
183         }
184         return result;
185     }
186     
187     /**
188      * Gets the value of the first datum matching the given name.
189      * @param name not null
190      * @return the value of the matchin datum first added when there is any matching data,
191      * null otherwise
192      */
193     public String value(final String name) {
194         final Datum datum = get(name);
195         final String result;
196         if (datum == null) {
197             result = null;
198         } else {
199             result = datum.getValue();
200         }
201         return result;
202     }
203     
204     /**
205      * Removes all data matching the given name.
206      * @param name not null
207      * @return true if any data match, false otherwise
208      */
209     public boolean clear(final String name) {
210         boolean dataRemoved = false;
211         for (final Iterator it=data.iterator();it.hasNext();) {
212             final Datum datum = (Datum) it.next();
213             if (datum.getName().equals(name)) {
214                 it.remove();
215                 dataRemoved = true;
216             }
217         }
218         return dataRemoved;
219     }
220     
221     /**
222      * Clears all data.
223      */
224     public void clear() {
225         data.clear();
226         this.contentType = null;
227     }
228     
229     /**
230      * A datum.
231      */
232     public static final class Datum {
233         private final String name;
234         private final String value;
235         
236         /**
237          * Constructs a datum.
238          * @param name not null
239          * @param value not null
240          */
241         public Datum(final String name, final String value) {
242             super();
243             this.name = name;
244             this.value = value;
245         }
246         
247         /**
248          * Gets the name of the data type.
249          * To avoid collisions, it is recommended that URLs are used.
250          * @return not null
251          */
252         public String getName() {
253             return name;
254         }
255      
256         /**
257          * Data type value.
258          * @return not null
259          */
260         public String getValue() {
261             return value;
262         }
263 
264         /**
265          * Constructs a <code>String</code> with all attributes
266          * in name = value format.
267          *
268          * @return a <code>String</code> representation 
269          * of this object.
270          */
271         public String toString()
272         {
273             return "Datum [ "
274                 + "name ='" + this.name + "',"
275                 + "value ='" + this.value + " "
276                 + "']";
277         }
278     }
279 }
280