View Javadoc
1   /*
2    * #%L
3    * wcm.io
4    * %%
5    * Copyright (C) 2018 wcm.io
6    * %%
7    * Licensed under the Apache License, Version 2.0 (the "License");
8    * you may not use this file except in compliance with the License.
9    * You may obtain a copy of the License at
10   *
11   *      http://www.apache.org/licenses/LICENSE-2.0
12   *
13   * Unless required by applicable law or agreed to in writing, software
14   * distributed under the License is distributed on an "AS IS" BASIS,
15   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16   * See the License for the specific language governing permissions and
17   * limitations under the License.
18   * #L%
19   */
20  package io.wcm.qa.glnm.differences.specialized;
21  
22  import java.util.Iterator;
23  
24  import io.wcm.qa.glnm.differences.base.Difference;
25  import io.wcm.qa.glnm.differences.base.Differences;
26  import io.wcm.qa.glnm.differences.generic.MutableDifferences;
27  
28  /**
29   * Class and package name differences constructed from class object.
30   *
31   * @since 1.0.0
32   */
33  public class ClassDifferences implements Differences {
34  
35    private ClassNameDifference classDifference;
36    private PackageDifferences packageDifferences;
37  
38    /**
39     * <p>Constructor for ClassDifferences.</p>
40     *
41     * @param clazz to extract class and package name from
42     * @since 2.0.0
43     */
44    public ClassDifferences(Class clazz) {
45      setClass(clazz);
46    }
47  
48    /** {@inheritDoc} */
49    @Override
50    public String getKey() {
51      return getDifferences().getKey();
52    }
53  
54    /**
55     * <p>getRootPackage.</p>
56     *
57     * @return a {@link java.lang.String} object.
58     * @since 2.0.0
59     */
60    public String getRootPackage() {
61      return getPackageDifferences().getRootPackage();
62    }
63  
64    /** {@inheritDoc} */
65    @Override
66    public Iterator<Difference> iterator() {
67      return getDifferences().iterator();
68    }
69  
70    /**
71     * <p>setClass.</p>
72     *
73     * @param clazz to extract class and package name from
74     * @since 2.0.0
75     */
76    public void setClass(Class clazz) {
77      setClassDifference(new ClassNameDifference(clazz));
78      setPackage(clazz.getPackage());
79    }
80  
81    /**
82     * Set maximum length of class name in rendered keys.
83     *
84     * @param maxLength when to start shortening class name differnce key
85     * @since 2.0.0
86     */
87    public void setClassNameMaxLength(int maxLength) {
88      getClassDifference().setMaxTagLength(maxLength);
89    }
90  
91    /**
92     * <p>setPackage.</p>
93     *
94     * @param p to extract package name from
95     * @since 2.0.0
96     */
97    public void setPackage(Package p) {
98      setPackageDifferences(new PackageDifferences(p));
99    }
100 
101   /**
102    * <p>setRootPackage.</p>
103    *
104    * @param rootPackage will be removed from beginning of package name
105    * @since 2.0.0
106    */
107   public void setRootPackage(String rootPackage) {
108     getPackageDifferences().setRootPackage(rootPackage);
109   }
110 
111   /** {@inheritDoc} */
112   @Override
113   public String toString() {
114     StringBuilder stringBuilder = new StringBuilder();
115     stringBuilder.append("Class(package=");
116     stringBuilder.append(getPackageDifferences().toString());
117     stringBuilder.append("|class=");
118     stringBuilder.append(getClassDifference().toString());
119     stringBuilder.append(")");
120     return stringBuilder.toString();
121   }
122 
123   private ClassNameDifference getClassDifference() {
124     if (classDifference == null) {
125       useDefaultClass();
126     }
127     return classDifference;
128   }
129 
130   private Differences getDifferences() {
131     MutableDifferences differences = new MutableDifferences();
132     differences.addAll(getPackageDifferences());
133     differences.add(getClassDifference());
134     return differences;
135   }
136 
137   private PackageDifferences getPackageDifferences() {
138     if (packageDifferences == null) {
139       useDefaultClass();
140     }
141     return packageDifferences;
142   }
143 
144   protected void useDefaultClass() {
145     setClass(Object.class);
146   }
147 
148   private void setClassDifference(ClassNameDifference classDifference) {
149     this.classDifference = classDifference;
150   }
151 
152   private void setPackageDifferences(PackageDifferences packageDifferences) {
153     this.packageDifferences = packageDifferences;
154   }
155 }