1 /*
2 * $HeadURL: $
3 * $Date: $
4 * $Revision: $
5 * $Author: $
6 *
7 * Copyright (c) 2006 MindTree Consulting Ltd.
8 *
9 * This file is part of Insight.
10 *
11 * Insight is free software: you can redistribute it and/or modify it under the
12 * terms of the GNU General Public License as published by the Free Software
13 * Foundation, either version 3 of the License, or (at your option) any later
14 * version.
15 *
16 * Insight is distributed in the hope that it will be useful, but
17 * WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
19 * Public License for more details.
20 *
21 * You should have received a copy of the GNU General Public License along with
22 * Insight. If not, see <http://www.gnu.org/licenses/>.
23 */
24 package com.mindtree.techworks.insight.reporting.verifiers;
25
26 import java.util.ArrayList;
27 import java.util.Arrays;
28 import java.util.Collection;
29 import java.util.Iterator;
30 import java.util.List;
31 import java.util.Map;
32
33 import com.mindtree.techworks.insight.reporting.SerializationXmlUtils;
34 import com.mindtree.techworks.insight.reporting.jobs.Job;
35 import com.mindtree.techworks.insight.reporting.jobs.JobPersistanceHandler;
36
37 /**
38 * An abstract implementation of the <code>Verifier</code> interface. It
39 * provides common services required by verifiers at a single location. Some
40 * of those include maintaining a registry of <code>Job</code>s currently registered to be
41 * called when this <code>Verifier</code> is triggered.
42 *
43 * @see com.mindtree.techworks.insight.reporting.verifiers.Verifier
44 * @see com.mindtree.techworks.insight.reporting.jobs.Job
45 *
46 * @author <a href="mailto:bindul_bhowmik@mindtree.com">Bindul Bhowmik</a>
47 * @version $Revision: 27 $ $Date: 2007-12-16 04:58:03 -0700 (Sun, 16 Dec 2007) $
48 * @since Insight 1.5
49 */
50 public abstract class AbstractVerifier implements Verifier,
51 DefaultImplDeserializable {
52
53 /**
54 * Used for object serialization
55 */
56 private static final long serialVersionUID = 5690358613929479728L;
57
58 // -------------------------------------------------------------------------
59 // Instance Fields
60 // -------------------------------------------------------------------------
61
62 /**
63 * The lists of jobs to be invoked when the verifier is triggered.
64 */
65 protected List _jobs = null;
66
67 /**
68 * The display name of the <code>Verifier</code>.
69 */
70 private String _displayName = null;
71
72 // -------------------------------------------------------------------------
73 // Constructor(s)
74 // -------------------------------------------------------------------------
75
76 /**
77 * Creates a new <code>AbstractVerifier</code> instance, with the display
78 * name provided.
79 *
80 * @param displayName The display name of the <code>Verifier</code>.
81 */
82 public AbstractVerifier (String displayName) {
83 this._displayName = displayName;
84 }
85
86 /**
87 * Creates a new <code>AbstractVerifier</code> instance.
88 */
89 public AbstractVerifier () {
90 // Default constructor
91 }
92
93 // -------------------------------------------------------------------------
94 // Abstract methods to be implemented by extending types
95 // -------------------------------------------------------------------------
96
97 /**
98 * The implementing verifiers should return a map of the fields that they
99 * require to be serialized as a map. All field values need to have proper
100 * implementation of the <code>toString()</code> method, or they need to be
101 * arrays or <code>Collection</code>s. In the latter case, the values in the
102 * array or <code>Collection</code> need to return serializable data from
103 * the <code>toString()</code> method.
104 *
105 * @return A map containing the name and value pairs of each of the fields.
106 */
107 protected abstract Map getFieldMap();
108
109 /**
110 * Returns <code>true</code> if the <code>Job</code>s registered for
111 * this <code>Verifier</code> are to be serialized.
112 *
113 * @return <code>true</code> if <code>Job</code>s are to be serialized
114 * or <code>false</code>
115 */
116 protected abstract boolean serializeJobs();
117
118 // -------------------------------------------------------------------------
119 // Methods implemented from com.mindtree.techworks.insight.reporting.verifiers.Verifier
120 // -------------------------------------------------------------------------
121
122 /**
123 * Registers a job to be executed when the Verifier is triggered.
124 *
125 * @see com.mindtree.techworks.insight.reporting.verifiers.Verifier#registerJob(com.mindtree.techworks.insight.reporting.jobs.Job)
126 *
127 * @param job The <code>Job</code> to be registered.
128 * @throws IllegalArgumentException If the job passed in is <code>null</code>
129 */
130 public void registerJob (Job job) {
131
132 // Check if the job is not null
133 if (null == job) {
134 throw new IllegalArgumentException ("Job to be registered cannot be null");
135 }
136
137 // If this is the first job to be added, initialize the list.
138 if (null == _jobs) {
139 _jobs = new ArrayList();
140 }
141
142 _jobs.add(job);
143 }
144
145 /**
146 * Generates a default serialized form of the <code>Verifier</code>. Only
147 * fields returned by the {@link #getFieldMap() #getFieldMap()} method are
148 * serialized. <code>Verifiers</code> serialized using this method may be
149 * deserialized using the <code>VerifierDeserializerImpl</code>.
150 * <p>
151 * For a format of the serialized <code>Verifier</code> see
152 * {@link VerifierDeserializer VerifierDeserializer} documentation.
153 * </p>
154 * <p>
155 * <code>Verifiers</code> extending this class may override this method and
156 * provide their own <code>VerifierDeserializer</code> instances.
157 * </p>
158 *
159 * @see com.mindtree.techworks.insight.reporting.verifiers.Verifier#serialize()
160 */
161 public String serialize () {
162
163 StringBuffer serializedForm = new StringBuffer();
164 serializedForm.append("<verifier>");
165
166 // The implementation class
167 serializedForm.append("<class>");
168 serializedForm.append(this.getClass().getName());
169 serializedForm.append("</class>");
170
171 // The type of the verifier
172 serializedForm.append("<name>");
173 serializedForm.append(this.getDisplayName());
174 serializedForm.append("</name>");
175
176 // Verifier fields
177 serializedForm.append("<fields>");
178 Map fields = this.getFieldMap();
179 for (Iterator fieldItr = fields.keySet().iterator(); fieldItr.hasNext();) {
180 String fieldName = (String) fieldItr.next();
181 Object fieldValue = fields.get(fieldName);
182 boolean isArray = false;
183
184 // Check if the field is an array
185 if (fieldValue instanceof Collection || fieldValue.getClass().isArray()) {
186 isArray = true;
187 }
188
189 // Write the field:
190 serializedForm.append("<field>");
191
192 // Name of the field
193 serializedForm.append("<name>");
194 serializedForm.append(fieldName);
195 serializedForm.append("</name>");
196
197 serializedForm.append("<isArray>");
198 serializedForm.append(isArray);
199 serializedForm.append("</isArray>");
200
201 if (!isArray) {
202 serializedForm.append("<value>");
203 serializedForm.append (SerializationXmlUtils
204 .escapeSpecialChars (fieldValue.toString ()));
205 serializedForm.append("<value>");
206 } else {
207 // Field value is an array, so you will have multiple value tags
208 Collection values = null;
209 // If it is an array get the array values in a collection.
210 if (fieldValue.getClass().isArray()) {
211 values = Arrays.asList((Object []) fieldValue);
212 } else {
213 values = (Collection) fieldValue;
214 }
215
216 for (Iterator valItr = values.iterator(); valItr.hasNext(); ) {
217 serializedForm.append("<value>");
218 serializedForm.append (SerializationXmlUtils
219 .escapeSpecialChars (valItr.next ().toString ()));
220 serializedForm.append("<value>");
221 }
222 }
223
224 serializedForm.append("</field>");
225 }
226 serializedForm.append("</fields>");
227
228 // Serialize the jobs - if the extending class wants them to be
229 // serialized.
230 serializedForm.append("<jobs>");
231 if (null != _jobs && serializeJobs()) {
232 for (Iterator jobsItr = _jobs.iterator(); jobsItr.hasNext(); ) {
233 Job job = (Job) jobsItr.next();
234 serializedForm.append(JobPersistanceHandler.serializeJob(job));
235 }
236 }
237 serializedForm.append("</jobs>");
238
239 serializedForm.append("</verifier>");
240
241 return serializedForm.toString();
242 }
243
244 /**
245 * Returns the default implementation of <code>VerifierDeserializer</code>.
246 * Subclasses using a different <code>VerifierDeserializer</code>
247 * implementation should override this method.
248 *
249 * @see com.mindtree.techworks.insight.reporting.verifiers.Verifier#getDeserializer()
250 */
251 public VerifierDeserializer getDeserializer () {
252
253 return new VerifierDeserializerImpl();
254 }
255
256 /**
257 * @see com.mindtree.techworks.insight.reporting.verifiers.Verifier#getDisplayName()
258 */
259 public String getDisplayName() {
260
261 return this._displayName;
262 }
263
264 /**
265 * @see com.mindtree.techworks.insight.reporting.verifiers.Verifier#getUID()
266 */
267 public String getUID() {
268
269 return this.getClass().getName();
270 }
271
272 // -------------------------------------------------------------------------
273 // Accessor methods
274 // -------------------------------------------------------------------------
275
276 /**
277 * Sets the display name of the <code>Verifier</code>. Sub classes, which do
278 * not use the constructor to set the <i>display name</i> of the
279 * <code>Verifier</code>, may use this method to set the display name.
280 *
281 * @param displayName The display name of the <code>Verifier</code>.
282 */
283 protected void setDisplayName (String displayName) {
284 this._displayName = displayName;
285 }
286 }