View Javadoc
1   package org.nuiton.eugene.models.object.xml;
2   
3   /*
4    * #%L
5    * EUGene :: EUGene
6    * %%
7    * Copyright (C) 2004 - 2014 CodeLutin
8    * %%
9    * This program is free software: you can redistribute it and/or modify
10   * it under the terms of the GNU Lesser General Public License as
11   * published by the Free Software Foundation, either version 3 of the
12   * License, or (at your option) any later version.
13   * 
14   * This program is distributed in the hope that it will be useful,
15   * but WITHOUT ANY WARRANTY; without even the implied warranty of
16   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17   * GNU General Lesser Public License for more details.
18   * 
19   * You should have received a copy of the GNU General Lesser Public
20   * License along with this program.  If not, see
21   * <http://www.gnu.org/licenses/lgpl-3.0.html>.
22   * #L%
23   */
24  
25  import com.google.common.base.Predicate;
26  import com.google.common.base.Predicates;
27  import com.google.common.collect.Iterables;
28  import org.apache.commons.lang3.StringUtils;
29  import org.apache.commons.logging.Log;
30  import org.apache.commons.logging.LogFactory;
31  import org.nuiton.eugene.models.object.ObjectModelClass;
32  import org.nuiton.eugene.models.object.ObjectModelClassifier;
33  import org.nuiton.eugene.models.object.ObjectModelEnumeration;
34  import org.nuiton.eugene.models.object.ObjectModelInterface;
35  import org.nuiton.eugene.models.object.ObjectModelPackage;
36  
37  import java.util.ArrayList;
38  import java.util.HashMap;
39  import java.util.HashSet;
40  import java.util.List;
41  import java.util.Map;
42  import java.util.Set;
43  
44  /**
45   * Created on 7/6/14.
46   *
47   * @author Tony Chemit - chemit@codelutin.com
48   * @since XXX
49   */
50  public class ObjectModelPackageImpl implements ObjectModelPackage {
51  
52      /** Logger. */
53      private static final Log log = LogFactory.getLog(ObjectModelPackageImpl.class);
54  
55      protected ObjectModelImpl objectModelImpl;
56  
57      protected boolean extern;
58  
59      protected String name;
60  
61      protected int numberOfSubPackages;
62  
63      protected ObjectModelPackage parentPackage;
64  
65      protected String documentation;
66  
67      protected Set<String> stereotypes = new HashSet<>();
68  
69      protected Map<String, String> tagValues = new HashMap<>();
70  
71      protected List<String> comments = new ArrayList<>();
72  
73      @Override
74      public String getName() {
75          return name;
76      }
77  
78      @Override
79      public int getNumberOfSubPackages() {
80          return numberOfSubPackages;
81      }
82  
83      @Override
84      public ObjectModelPackage getParentPackage() {
85          return parentPackage;
86      }
87  
88      @Override
89      public String getDescription() {
90          return getDocumentation().substring(0, getDocumentation().indexOf("--"));
91      }
92  
93      @Override
94      public String getSourceDocumentation() {
95          return getDocumentation().substring(getDocumentation().indexOf("--") + 2);
96      }
97  
98      @Override
99      public Set<String> getStereotypes() {
100         return stereotypes;
101     }
102 
103     @Override
104     public boolean hasStereotype(String stereotypeName) {
105         return stereotypes.contains(stereotypeName);
106     }
107 
108     @Override
109     public void addStereotype(String stereotype) {
110         stereotypes.add(stereotype);
111     }
112 
113     @Override
114     public void removeStereotype(String stereotype) {
115         stereotypes.remove(stereotype);
116     }
117 
118     @Override
119     public Map<String, String> getTagValues() {
120         return tagValues;
121     }
122 
123     @Override
124     public String getTagValue(String tagValue) {
125         return tagValue == null ? null : tagValues.get(tagValue);
126     }
127 
128     @Override
129     public boolean hasTagValue(String tagValue) {
130         return tagValues.containsKey(tagValue);
131     }
132 
133     @Override
134     public void addTagValue(String tagValue, String value) {
135         String oldValue = getTagValue(tagValue);
136         if (StringUtils.isNotEmpty(oldValue)) {
137             if (oldValue.equals(value)) {
138                 // same tag value do not replace it
139                 return;
140             }
141             log.warn("Replace tagValue '" + tagValue + "' (old:" + oldValue + ", new: " + value + ")");
142         }
143         tagValues.put(tagValue, value);
144     }
145 
146     @Override
147     public void removeTagValue(String tagvalue) {
148         tagValues.remove(tagvalue);
149     }
150 
151     @Override
152     public List<String> getComments() {
153         return comments;
154     }
155 
156     @Override
157     public String getDocumentation() {
158         return documentation;
159     }
160 
161     @Override
162     public Iterable<ObjectModelPackage> getPackages() {
163         return Iterables.filter(objectModelImpl.getPackages(), IS_PACKAGE_NAME_STARTS_WITH_PREDICATE);
164     }
165 
166     @Override
167     public boolean hasPackage(String packageName) {
168         ObjectModelPackage aPackage = objectModelImpl.getPackage(packageName);
169         return aPackage != null && IS_PACKAGE_NAME_STARTS_WITH_PREDICATE.apply(aPackage);
170     }
171 
172     @Override
173     public Iterable<ObjectModelClassifier> getClassifiers() {
174         return Iterables.filter(objectModelImpl.getClassifiers(), IS_PACKAGE_NAME_EQUALS_PREDICATE);
175     }
176 
177     @Override
178     public ObjectModelClassifier getClassifier(String simpleName) {
179         Predicate<ObjectModelClassifier> predicate = newClassifierNameEquals(simpleName);
180         Iterable<ObjectModelClassifier> filter = Iterables.filter(objectModelImpl.getClassifiers(), predicate);
181         return Iterables.getFirst(filter, null);
182     }
183 
184     @Override
185     public Iterable<ObjectModelClass> getClasses() {
186         return Iterables.filter(objectModelImpl.getClasses(), IS_PACKAGE_NAME_EQUALS_PREDICATE);
187     }
188 
189     @Override
190     public ObjectModelClass getClass(String simpleName) {
191         Predicate<ObjectModelClassifier> predicate = newClassifierNameEquals(simpleName);
192         Iterable<ObjectModelClass> filter = Iterables.filter(objectModelImpl.getClasses(), predicate);
193         return Iterables.getFirst(filter, null);
194     }
195 
196     @Override
197     public boolean hasClass(String simpleName) {
198         return false;
199     }
200 
201     @Override
202     public Iterable<ObjectModelInterface> getInterfaces() {
203         return Iterables.filter(objectModelImpl.getInterfaces(), IS_PACKAGE_NAME_EQUALS_PREDICATE);
204     }
205 
206     @Override
207     public ObjectModelInterface getInterface(String simpleName) {
208         Predicate<ObjectModelClassifier> predicate = newClassifierNameEquals(simpleName);
209         Iterable<ObjectModelInterface> filter = Iterables.filter(objectModelImpl.getInterfaces(), predicate);
210         return Iterables.getFirst(filter, null);
211     }
212 
213     @Override
214     public Iterable<ObjectModelEnumeration> getEnumerations() {
215         return Iterables.filter(objectModelImpl.getEnumerations(), IS_PACKAGE_NAME_EQUALS_PREDICATE);
216     }
217 
218     @Override
219     public ObjectModelEnumeration getEnumeration(String simpleName) {
220         Predicate<ObjectModelClassifier> predicate = newClassifierNameEquals(simpleName);
221         Iterable<ObjectModelEnumeration> filter = Iterables.filter(objectModelImpl.getEnumerations(), predicate);
222         return Iterables.getFirst(filter, null);
223     }
224 
225     public boolean isExtern() {
226         return extern;
227     }
228 
229     public void setExtern(boolean extern) {
230         this.extern = extern;
231     }
232 
233     public void setDocumentation(String documentation) {
234         this.documentation = documentation;
235     }
236 
237     public void addComment(String comment) {
238         comments.add(comment);
239     }
240 
241     public ObjectModelImplRef addStereotype(ObjectModelImplRef stereotype) {
242         if (stereotype == null) {
243             return new ObjectModelImplRef();
244         }
245         stereotypes.add(stereotype.getName());
246         return stereotype;
247     }
248 
249     public ObjectModelImplTagValue addTagValue(ObjectModelImplTagValue tagValue) {
250         if (tagValue == null) {
251             return new ObjectModelImplTagValue();
252         }
253         addTagValue(tagValue.getName(), tagValue.getValue());
254         return tagValue;
255     }
256 
257     public void setObjectModelImpl(ObjectModelImpl objectModelImpl) {
258         this.objectModelImpl = objectModelImpl;
259     }
260 
261     public void setName(String name) {
262         this.name = name;
263     }
264 
265     public void setParentPackage(ObjectModelPackage parentPackage) {
266         this.parentPackage = parentPackage;
267     }
268 
269     public void postInit() {
270         numberOfSubPackages = name.split("\\.").length;
271     }
272 
273     protected final Predicate<ObjectModelClassifier> IS_PACKAGE_NAME_EQUALS_PREDICATE = new PackageNameEqualsPredicate(name);
274 
275     protected final Predicate<ObjectModelPackage> IS_PACKAGE_NAME_STARTS_WITH_PREDICATE = new PackageNameStartsWithPredicate(name + ".");
276 
277     protected Predicate<ObjectModelClassifier> newClassifierNameEquals(String simpleName) {
278         Predicate<ObjectModelClassifier> predicate = Predicates.and(IS_PACKAGE_NAME_EQUALS_PREDICATE, new SimpleNameEqualsPredicate(simpleName));
279         return predicate;
280     }
281 
282     protected static class SimpleNameEqualsPredicate implements Predicate<ObjectModelClassifier> {
283 
284         protected final String name;
285 
286         public SimpleNameEqualsPredicate(String name) {
287             this.name = name;
288         }
289 
290         @Override
291         public boolean apply(ObjectModelClassifier input) {
292             return input.getName().equals(name);
293         }
294     }
295 
296     protected static class PackageNameEqualsPredicate implements Predicate<ObjectModelClassifier> {
297 
298         protected final String name;
299 
300         public PackageNameEqualsPredicate(String name) {
301             this.name = name;
302         }
303 
304         @Override
305         public boolean apply(ObjectModelClassifier input) {
306             return input.getPackageName().equals(name);
307         }
308     }
309 
310     protected static class PackageNameStartsWithPredicate implements Predicate<ObjectModelPackage> {
311 
312         protected final String name;
313 
314         public PackageNameStartsWithPredicate(String name) {
315             this.name = name;
316         }
317 
318         @Override
319         public boolean apply(ObjectModelPackage input) {
320             return input.getName().startsWith(name);
321         }
322     }
323 }