Clover Coverage Report - KS Contract Documentation Generator 0.0.1-SNAPSHOT
Coverage timestamp: Wed Dec 31 1969 19:00:00 EST
../../../../../img/srcFileCovDistChart0.png 0% of files have more coverage
658   1,131   161   11.15
174   927   0.24   29.5
59     2.73  
2    
 
  DictionaryFormatter       Line # 44 657 0% 160 889 0% 0.0
  DictionaryFormatter.AttributeDefinitionNameComparator       Line # 514 1 0% 1 2 0% 0.0
 
No Tests
 
1    /*
2    * Copyright 2011 The Kuali Foundation
3    *
4    * Licensed under the Educational Community License, Version 1.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    *
8    * http://www.opensource.org/licenses/ecl1.php
9    *
10    * Unless required by applicable law or agreed to in writing, software
11    * distributed under the License is distributed on an "AS IS" BASIS,
12    * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13    * See the License for the specific language governing permissions and
14    * limitations under the License.
15    */
16    package org.kuali.student.datadictionary.util;
17   
18    import java.io.File;
19    import java.io.FileNotFoundException;
20    import java.io.FileOutputStream;
21    import java.io.OutputStream;
22    import java.io.PrintStream;
23    import java.util.ArrayList;
24    import java.util.Collections;
25    import java.util.Comparator;
26    import java.util.Date;
27    import java.util.List;
28    import java.util.Map;
29    import java.util.Stack;
30    import org.kuali.rice.krad.datadictionary.AttributeDefinition;
31    import org.kuali.rice.krad.datadictionary.AttributeDefinitionBase;
32    import org.kuali.rice.krad.datadictionary.CollectionDefinition;
33    import org.kuali.rice.krad.datadictionary.ComplexAttributeDefinition;
34    import org.kuali.rice.krad.datadictionary.DataObjectEntry;
35    import org.kuali.rice.krad.datadictionary.validation.constraint.BaseConstraint;
36    import org.kuali.rice.krad.datadictionary.validation.constraint.CaseConstraint;
37    import org.kuali.rice.krad.datadictionary.validation.constraint.CommonLookupParam;
38    import org.kuali.rice.krad.datadictionary.validation.constraint.LookupConstraint;
39    import org.kuali.rice.krad.datadictionary.validation.constraint.ValidCharactersConstraint;
40    import org.kuali.rice.krad.datadictionary.validation.constraint.WhenConstraint;
41    import org.kuali.rice.krad.uif.control.Control;
42    import org.kuali.rice.krad.uif.control.TextControl;
43   
 
44    public class DictionaryFormatter {
45   
46    private DataObjectEntry doe;
47    private Map<String, DataObjectEntry> beansOfType;
48    private String beanId;
49    private String outputFileName;
50   
 
51  0 toggle public DictionaryFormatter(DataObjectEntry doe, Map<String, DataObjectEntry> beansOfType, String beanId, String outputFileName) {
52  0 this.doe = doe;
53  0 this.beansOfType = beansOfType;
54  0 this.beanId = beanId;
55  0 this.outputFileName = outputFileName;
56    }
57   
 
58  0 toggle public void formatForHtml() {
59  0 File file = new File(this.outputFileName);
60  0 OutputStream outputStream;
61  0 try {
62  0 outputStream = new FileOutputStream(file, false);
63    } catch (FileNotFoundException ex) {
64  0 throw new IllegalArgumentException(this.outputFileName, ex);
65    }
66  0 PrintStream out = new PrintStream(outputStream);
67  0 writeHeader(out, beanId);
68  0 writeBody(out);
69  0 writeFooter(out);
70  0 out.close();
71    }
72   
 
73  0 toggle public static void writeHeader(PrintStream out, String title) {
74  0 out.println("<html>");
75  0 out.println("<head>");
76  0 writeTag(out, "title", title);
77  0 out.println("</head>");
78  0 out.println("<body bgcolor=\"#ffffff\" topmargin=0 marginheight=0>");
79    }
80   
 
81  0 toggle public static void writeFooter(PrintStream out) {
82  0 out.println("</body>");
83  0 out.println("</html>");
84    }
85   
 
86  0 toggle private String initUpper(String str) {
87  0 if (str == null) {
88  0 return null;
89    }
90  0 if (str.length() == 0) {
91  0 return str;
92    }
93  0 if (str.length() == 1) {
94  0 return str.toUpperCase();
95    }
96  0 return str.substring(0, 1).toUpperCase() + str.substring(1);
97    }
98   
 
99  0 toggle private void writeBody(PrintStream out) {
100  0 out.println("<a href=\"index.html\">home</a>");
101  0 out.println("<a href=\"../contractdocs/" + initUpper(doe.getName()) + ".html\">contract doc</a>");
102  0 out.println("<br>");
103  0 out.println("(!) This page was automatically generated on " + new Date());
104    // builder.append ("======= start dump of object structure definition ========");
105  0 out.println("<h1>" + this.beanId + "</h1>");
106   
107  0 out.println("<br>");
108  0 out.println("<table border=1>");
109   
110  0 out.println("<tr>");
111  0 out.println("<th bgcolor=lightblue>");
112  0 out.println("Name");
113  0 out.println("</th>");
114  0 out.println("<td>");
115  0 out.println(doe.getName());
116  0 out.println("</td>");
117  0 out.println("</tr>");
118   
119  0 out.println("<tr>");
120  0 out.println("<th bgcolor=lightblue>");
121  0 out.println("Label");
122  0 out.println("</th>");
123  0 out.println("<td>");
124  0 out.println(doe.getObjectLabel());
125  0 out.println("</td>");
126  0 out.println("</tr>");
127   
128  0 out.println("<tr>");
129  0 out.println("<th bgcolor=lightblue>");
130  0 out.println("JSTL Key");
131  0 out.println("</th>");
132  0 out.println("<td>");
133  0 out.println(doe.getJstlKey());
134  0 out.println("</td>");
135  0 out.println("</tr>");
136   
137  0 out.println("<tr>");
138  0 out.println("<th bgcolor=lightblue>");
139  0 out.println("Java Class");
140  0 out.println("</th>");
141  0 out.println("<td>");
142  0 out.println(doe.getFullClassName());
143  0 out.println("</td>");
144  0 out.println("</tr>");
145  0 out.println("<tr>");
146   
147  0 if (!doe.getDataObjectClass().getName().equals(doe.getFullClassName())) {
148  0 out.println("<tr>");
149  0 out.println("<th bgcolor=lightblue>");
150  0 out.println("Object Class");
151  0 out.println("</th>");
152  0 out.println("<td>");
153  0 out.println(doe.getDataObjectClass().getName());
154  0 out.println("</td>");
155  0 out.println("</tr>");
156  0 out.println("<tr>");
157    }
158   
159  0 if (!doe.getEntryClass().getName().equals(doe.getFullClassName())) {
160  0 out.println("<tr>");
161  0 out.println("<th bgcolor=lightblue>");
162  0 out.println("Entry Class");
163  0 out.println("</th>");
164  0 out.println("<td>");
165  0 out.println(doe.getEntryClass().getName());
166  0 out.println("</td>");
167  0 out.println("</tr>");
168  0 out.println("<tr>");
169    }
170   
171  0 out.println("<tr>");
172  0 out.println("<th bgcolor=lightblue>");
173  0 out.println("Description");
174  0 out.println("</th>");
175  0 out.println("<td>");
176  0 out.println(doe.getObjectDescription());
177  0 out.println("</td>");
178  0 out.println("</tr>");
179   
180  0 out.println("<tr>");
181  0 out.println("<th bgcolor=lightblue>");
182  0 out.println("Primary Key(s)");
183  0 out.println("</th>");
184  0 out.println("<td>");
185  0 StringBuilder bldr = new StringBuilder();
186  0 String comma = "";
187  0 if (doe.getPrimaryKeys() != null) {
188  0 for (String pk : doe.getPrimaryKeys()) {
189  0 bldr.append(comma);
190  0 comma = ", ";
191  0 bldr.append(pk);
192    }
193    }
194  0 out.println(bldr.toString());
195  0 out.println("</td>");
196  0 out.println("</tr>");
197   
198  0 out.println("<tr>");
199  0 out.println("<th bgcolor=lightblue>");
200  0 out.println("Field to use as the title (or name)");
201  0 out.println("</th>");
202  0 out.println("<td>");
203  0 out.println(doe.getTitleAttribute());
204  0 out.println("</td>");
205  0 out.println("</tr>");
206   
207  0 out.println("</table>");
208    // out.println("<br>");
209   
210    // fields
211  0 out.println("<h1>Field Definitions</h1>");
212    // check for discrepancies first
213  0 List<String> discrepancies = new Dictionary2BeanComparer(doe.getFullClassName(), doe).compare();
214  0 if (discrepancies.isEmpty()) {
215  0 out.println("No discrepancies were found between the dictionary definition and the java object -- ");
216  0 out.println("WARNING: take this with a grain of salt - the comparison does not dig into complex sub-objects nor collections so...");
217    } else {
218  0 out.println("<b>" + discrepancies.size() + " discrepancie(s) were found between the dictionary definition and the java object" + "</b>");
219  0 out.println("<ol>");
220  0 for (String discrepancy : discrepancies) {
221  0 out.println("<li>" + discrepancy);
222    }
223  0 out.println("</ol>");
224    }
225    // field table
226  0 out.println("<table border=1>");
227  0 out.println("<tr bgcolor=lightblue>");
228  0 out.println("<th>");
229  0 out.println("Field");
230  0 out.println("</th>");
231  0 out.println("<th>");
232  0 out.println("Required?");
233  0 out.println("</th>");
234  0 out.println("<th>");
235  0 out.println("DataType");
236  0 out.println("</th>");
237  0 out.println("<th>");
238  0 out.println("Length");
239  0 out.println("</th>");
240  0 out.println("<th>");
241  0 out.println("Short Label");
242  0 out.println("</th>");
243  0 out.println("<th>");
244  0 out.println("Summary");
245  0 out.println("</th>");
246  0 out.println("<th>");
247  0 out.println("Label");
248  0 out.println("</th>");
249  0 out.println("<th>");
250  0 out.println("Description");
251  0 out.println("</th>");
252  0 out.println("<th>");
253  0 out.println("Read Only, Dynamic, or Hidden");
254  0 out.println("</th>");
255  0 out.println("<th>");
256  0 out.println("Default");
257  0 out.println("</th>");
258  0 out.println("<th>");
259  0 out.println("Repeats?");
260  0 out.println("</th>");
261  0 out.println("<th>");
262  0 out.println("Valid Characters");
263  0 out.println("</th>");
264  0 out.println("<th>");
265  0 out.println("Lookup");
266  0 out.println("</th>");
267  0 out.println("<th>");
268  0 out.println("Cross Field");
269  0 out.println("</th>");
270  0 out.println("<th>");
271  0 out.println("Default Control");
272  0 out.println("</th>");
273  0 out.println("</tr>");
274  0 this.writeAttributes(out, doe, new Stack<String>(), new Stack<DataObjectEntry>());
275  0 out.println("</table>");
276  0 return;
277    }
278   
 
279  0 toggle private void writeAttributes(PrintStream out, DataObjectEntry ode, Stack<String> parentNames, Stack<DataObjectEntry> parents) {
280    // stop recursion
281  0 if (parents.contains(ode)) {
282  0 return;
283    }
284    // for (AttributeDefinition ad : getSortedFields()) {
285  0 if (ode.getAttributes() != null) {
286  0 for (AttributeDefinition ad : ode.getAttributes()) {
287  0 out.println("<tr>");
288  0 out.println("<td>");
289  0 out.println(nbsp(calcName(ad.getName(), parentNames)));
290  0 out.println("</td>");
291  0 out.println("<td>");
292  0 out.println(nbsp(calcRequired(ad)));
293  0 out.println("</td>");
294  0 out.println("<td>");
295  0 out.println(nbsp(calcDataType(ad)));
296  0 out.println("</td>");
297  0 out.println("<td>");
298  0 out.println(nbsp(calcLength(ad)));
299  0 out.println("</td>");
300  0 out.println("<td>");
301  0 out.println(nbsp(calcShortLabel(ad)));
302  0 out.println("</td>");
303  0 out.println("<td>");
304  0 out.println(nbsp(calcSummary(ad)));
305  0 out.println("</td>");
306  0 out.println("<td>");
307  0 out.println(nbsp(calcLabel(ad)));
308  0 out.println("</td>");
309  0 out.println("<td>");
310  0 out.println(nbsp(calcDescription(ad)));
311  0 out.println("</td>");
312  0 out.println("<td>");
313  0 out.println(nbsp(calcDynamicHiddenReadOnly(ad)));
314  0 out.println("</td>");
315  0 out.println("<td>");
316  0 out.println(nbsp(calcDefaultValue(ad)));
317  0 out.println("</td>");
318  0 out.println("<td>");
319  0 out.println(nbsp(null));
320  0 out.println("</td>");
321  0 out.println("<td>");
322  0 out.println(nbsp(calcForceUpperValidCharsMinMax(ad)));
323  0 out.println("</td>");
324  0 out.println("<td>");
325  0 out.println(nbsp(calcLookup(ad)));
326  0 out.println("</td>");
327  0 out.println("<td>");
328  0 out.println(nbsp(calcCrossField(ad)));
329  0 out.println("</td>");
330  0 out.println("<td>");
331  0 out.println(nbsp(calcControl(ad)));
332  0 out.println("</td>");
333  0 out.println("</tr>");
334    }
335    }
336  0 if (ode.getComplexAttributes() != null) {
337  0 for (ComplexAttributeDefinition cad : ode.getComplexAttributes()) {
338  0 out.println("<tr>");
339  0 out.println("<td>");
340  0 out.println(nbsp(calcName(cad.getName(), parentNames)));
341  0 out.println("</td>");
342  0 out.println("<td>");
343  0 out.println(nbsp(calcRequired(cad)));
344  0 out.println("</td>");
345  0 out.println("<td>");
346  0 out.println("Complex");
347  0 out.println("</td>");
348  0 out.println("<td>");
349  0 out.println(nbsp(null));
350  0 out.println("</td>");
351  0 out.println("<td>");
352  0 out.println(nbsp(calcShortLabel(cad)));
353  0 out.println("</td>");
354  0 out.println("<td>");
355  0 out.println(nbsp(calcSummary(cad)));
356  0 out.println("</td>");
357  0 out.println("<td>");
358  0 out.println(nbsp(calcLabel(cad)));
359  0 out.println("</td>");
360  0 out.println("<td>");
361  0 out.println(nbsp(calcDescription(cad)));
362  0 out.println("</td>");
363  0 out.println("<td>");
364  0 out.println(nbsp(null));
365  0 out.println("</td>");
366  0 out.println("<td>");
367  0 out.println(nbsp(null));
368  0 out.println("</td>");
369  0 out.println("<td>");
370  0 out.println(nbsp(null));
371  0 out.println("</td>");
372  0 out.println("<td>");
373  0 out.println(nbsp(null));
374  0 out.println("</td>");
375  0 out.println("<td>");
376  0 out.println(nbsp(null));
377  0 out.println("</td>");
378  0 out.println("<td>");
379  0 out.println(nbsp(null));
380  0 out.println("</td>");
381  0 out.println("<td>");
382  0 out.println(nbsp(null));
383  0 out.println("</td>");
384  0 out.println("</tr>");
385  0 parentNames.push(cad.getName());
386  0 parents.push(ode);
387  0 this.writeAttributes(out, (DataObjectEntry) cad.getDataObjectEntry(), parentNames, parents);
388  0 parentNames.pop();
389  0 parents.pop();
390    }
391    }
392  0 if (ode.getCollections() != null) {
393  0 for (CollectionDefinition cd : ode.getCollections()) {
394  0 out.println("<tr>");
395  0 out.println("<td>");
396  0 out.println(nbsp(calcName(cd.getName(), parentNames)));
397  0 out.println("</td>");
398  0 out.println("<td>");
399  0 out.println(nbsp(calcRequired(cd)));
400  0 out.println("</td>");
401  0 out.println("<td>");
402  0 out.println("Complex");
403  0 out.println("</td>");
404  0 out.println("<td>");
405  0 out.println(nbsp(null));
406  0 out.println("</td>");
407  0 out.println("<td>");
408  0 out.println(nbsp(calcShortLabel(cd)));
409  0 out.println("</td>");
410  0 out.println("<td>");
411  0 out.println(nbsp(calcSummary(cd)));
412  0 out.println("</td>");
413  0 out.println("<td>");
414  0 out.println(nbsp(calcLabel(cd)));
415  0 out.println("</td>");
416  0 out.println("<td>");
417  0 out.println(nbsp(calcDescription(cd)));
418  0 out.println("</td>");
419  0 out.println("<td>");
420  0 out.println(nbsp(null));
421  0 out.println("</td>");
422  0 out.println("<td>");
423  0 out.println(nbsp(null));
424  0 out.println("</td>");
425  0 out.println("<td>");
426  0 out.println(nbsp("Repeating"));
427  0 out.println("</td>");
428  0 out.println("<td>");
429  0 out.println(nbsp(null));
430  0 out.println("</td>");
431  0 out.println("<td>");
432  0 out.println(nbsp(null));
433  0 out.println("</td>");
434  0 out.println("<td>");
435  0 out.println(nbsp(null));
436  0 out.println("</td>");
437  0 out.println("<td>");
438  0 out.println(nbsp(null));
439  0 out.println("</td>");
440  0 out.println("</tr>");
441  0 DataObjectEntry childDoe = this.getDataOjbectEntry(cd.getDataObjectClass());
442  0 if (childDoe == null) {
443    // TODO: uncomment this but right now there are xml files that don't have one defined and it seems to work so...
444    // throw new NullPointerException ("Could not find a data object entry, " + cd.getDataObjectClass() + " for field " + calcName(cd.getName(), parents));
445  0 System.out.println("Could not find a data object entry, " + cd.getDataObjectClass() + " for field " + calcName(cd.getName(), parentNames));
446    } else {
447  0 parentNames.push(cd.getName());
448  0 parents.push(ode);
449  0 this.writeAttributes(out, (DataObjectEntry) childDoe, parentNames, parents);
450  0 parentNames.pop();
451  0 parents.pop();
452    }
453    }
454    }
455    }
456   
 
457  0 toggle private DataObjectEntry getDataOjbectEntry(String className) {
458  0 for (DataObjectEntry doe : this.beansOfType.values()) {
459  0 if (doe.getDataObjectClass().getName().equals(className)) {
460  0 return doe;
461    }
462    }
463  0 return null;
464    }
465   
 
466  0 toggle private String calcName(String name, Stack<String> parents) {
467  0 StringBuilder sb = new StringBuilder();
468  0 for (String parent : parents) {
469  0 sb.append(parent);
470  0 sb.append(".");
471    }
472  0 sb.append(name);
473  0 return sb.toString();
474    }
475   
 
476  0 toggle private String calcShortLabel(CollectionDefinition cd) {
477  0 return cd.getShortLabel();
478    }
479   
 
480  0 toggle private String calcShortLabel(AttributeDefinitionBase ad) {
481  0 return ad.getShortLabel();
482    }
483   
 
484  0 toggle private String calcLabel(CollectionDefinition cd) {
485  0 return cd.getLabel();
486    }
487   
 
488  0 toggle private String calcLabel(AttributeDefinitionBase ad) {
489  0 return ad.getLabel();
490    }
491   
 
492  0 toggle private String calcSummary(CollectionDefinition ad) {
493  0 return ad.getSummary();
494    }
495   
 
496  0 toggle private String calcSummary(AttributeDefinitionBase ad) {
497  0 return ad.getSummary();
498    }
499   
 
500  0 toggle private String calcDescription(CollectionDefinition cd) {
501  0 return cd.getDescription();
502    }
503   
 
504  0 toggle private String calcDescription(AttributeDefinitionBase ad) {
505  0 return ad.getDescription();
506    }
507   
 
508  0 toggle private List<AttributeDefinition> getSortedFields() {
509  0 List<AttributeDefinition> fields = doe.getAttributes();
510  0 Collections.sort(fields, new AttributeDefinitionNameComparator());
511  0 return fields;
512    }
513   
 
514    private static class AttributeDefinitionNameComparator implements Comparator<AttributeDefinition> {
515   
 
516  0 toggle @Override
517    public int compare(AttributeDefinition o1, AttributeDefinition o2) {
518  0 return o1.getName().toLowerCase().compareTo(o2.getName().toLowerCase());
519    }
520    }
521   
 
522  0 toggle private String formatAsString(List<String> discrepancies) {
523  0 int i = 0;
524  0 StringBuilder builder = new StringBuilder();
525  0 for (String discrep : discrepancies) {
526  0 i++;
527  0 builder.append(i + ". " + discrep + "\n");
528    }
529  0 return builder.toString();
530    }
531   
 
532  0 toggle private String calcDataType(AttributeDefinition ad) {
533    // if (ad.getDataType().equals(DataType.COMPLEX)) {
534    // if (ad.getDataObjectStructure() == null) {
535    // throw new IllegalArgumentException(
536    // ad.getName() + " is complex but does not have a sub-structure defined");
537    // }
538    // Class subClazz = this.getClass(ad.getDataObjectStructure().getName());
539    // String subStrucName = calcComplexSubStructureName(ad);
540    // // process if explicity asking for substructures OR the field is a freestanding field
541    // // so it won't be processed by just processing all of the DTO's and their sub-objects
542    // if (this.processSubstructures || subClazz == null) {
543    // if (!this.subStructuresAlreadyProcessed.contains(
544    // ad.getDataObjectStructure())) {
545    //// System.out.println ("Adding " + subStrucName + " to set to be processed");
546    // this.subStructuresToProcess.put(subStrucName, ad.getDataObjectStructure());
547    // }
548    // }
549    // return "[" + calcNotSoSimpleName(subStrucName) + "|#" + subStrucName + "]";
550    // }
551  0 return ad.getDataType().toString();
552    }
553   
 
554  0 toggle private String calcDefaultValue(AttributeDefinition ad) {
555    // if (ad.getDefaultValue() != null) {
556    // return ad.getDefaultValue().toString();
557    // }
558  0 return " ";
559    }
560   
 
561  0 toggle private String calcDynamicHiddenReadOnly(AttributeDefinition ad) {
562  0 StringBuilder sb = new StringBuilder();
563  0 String comma = "";
564  0 comma = this.appendIfNotNull(sb, this.calcDynamic(ad), comma);
565  0 comma = this.appendIfNotNull(sb, this.calcHidden(ad), comma);
566  0 comma = this.appendIfNotNull(sb, this.calcReadOnly(ad), comma);
567  0 return sb.toString();
568    }
569   
 
570  0 toggle private String appendIfNotNull(StringBuilder sb, String value, String comma) {
571  0 if (value == null) {
572  0 return comma;
573    }
574  0 sb.append(comma);
575  0 sb.append(value);
576  0 return ", ";
577    }
578   
 
579  0 toggle private String calcDynamic(AttributeDefinition ad) {
580    // TODO: implement once KRAD team implements
581    // if (ad.isDynamic()) {
582    // return "dynamic";
583    // }
584  0 return null;
585    }
586   
 
587  0 toggle private String calcHidden(AttributeDefinition ad) {
588  0 if (ad.getAttributeSecurity() == null) {
589  0 return null;
590    }
591  0 if (ad.getAttributeSecurity().isHide()) {
592  0 return "Hidden";
593    }
594  0 return null;
595   
596    }
597   
 
598  0 toggle private String calcReadOnly(AttributeDefinition ad) {
599  0 if (ad.getAttributeSecurity() == null) {
600  0 return null;
601    }
602  0 if (ad.getAttributeSecurity().isReadOnly()) {
603  0 return "Read only";
604    }
605  0 return null;
606   
607    }
608   
 
609  0 toggle private String calcComplexSubStructureName(AttributeDefinition ad) {
610    // if (this.processSubstructures) {
611    // return name + "." + ad.getName() + "." + calcSimpleName(
612    // ad.getDataObjectStructure().getName());
613    // }
614    // return calcSimpleName(ad.getDataObjectStructure().getName());
615  0 return " ";
616    }
617   
 
618  0 toggle private String calcSimpleName(String simpleName) {
619  0 if (simpleName.lastIndexOf(".") != -1) {
620  0 simpleName = simpleName.substring(simpleName.lastIndexOf(".") + 1);
621    }
622  0 return simpleName;
623    }
624   
 
625  0 toggle private String calcNotSoSimpleName(String name) {
626  0 if (name.lastIndexOf(".") == -1) {
627  0 return name;
628    }
629  0 String simpleName = calcSimpleName(name);
630  0 String fieldName = calcSimpleName(name.substring(0, name.length()
631    - simpleName.length()
632    - 1));
633  0 return fieldName + "." + simpleName;
634    }
635   
 
636  0 toggle private String calcRequired(CollectionDefinition cd) {
637  0 if (cd.getMinOccurs() != null) {
638  0 if (cd.getMinOccurs() >= 1) {
639  0 return "required";
640    }
641    }
642    // TODO: Deal with collections
643    // if (ad.getMaximumNumberOfElements() != null) {
644    // if (ad.getMaximumNumberOfElements().intValue() == 0) {
645    // return "Not allowed";
646    // }
647    // }
648    //
649    // if (ad.getMinimumNumberOfElements() != null) {
650    // if (ad.getMinimumNumberOfElements().intValue() >= 1) {
651    // return "required";
652    // }
653    // }
654  0 return " ";
655    // return "optional";
656    }
657   
 
658  0 toggle private String calcRequired(AttributeDefinitionBase ad) {
659  0 if (ad.isRequired() != null) {
660  0 if (ad.isRequired()) {
661  0 return "required";
662    }
663    }
664    // TODO: Deal with collections
665    // if (ad.getMaximumNumberOfElements() != null) {
666    // if (ad.getMaximumNumberOfElements().intValue() == 0) {
667    // return "Not allowed";
668    // }
669    // }
670    //
671    // if (ad.getMinimumNumberOfElements() != null) {
672    // if (ad.getMinimumNumberOfElements().intValue() >= 1) {
673    // return "required";
674    // }
675    // }
676  0 return " ";
677    // return "optional";
678    }
679   
 
680  0 toggle private String calcForceUpperCase(AttributeDefinition ad) {
681  0 if (ad.getForceUppercase() != null && ad.getForceUppercase()) {
682  0 return "FORCE UPPER CASE";
683    }
684  0 return " ";
685    }
686   
 
687  0 toggle private String calcValidChars(AttributeDefinition ad) {
688  0 if (ad.getValidCharactersConstraint() == null) {
689  0 return " ";
690    }
691  0 return calcValidChars(ad.getValidCharactersConstraint());
692    }
693   
 
694  0 toggle private String calcValidChars(ValidCharactersConstraint cons) {
695  0 String labelKey = cons.getLabelKey();
696  0 if (labelKey == null) {
697  0 labelKey = "validation.validChars";
698    }
699  0 String validChars = escapeXML(cons.getValue());
700  0 String descr = labelKey + "<br>" + validChars;
701  0 return descr;
702    }
703   
 
704  0 toggle private String calcLookup(AttributeDefinition ad) {
705  0 if (ad.getLookupDefinition() == null) {
706  0 return " ";
707    }
708  0 return calcLookup(ad.getLookupDefinition());
709    }
710   
 
711  0 toggle private String calcLookup(LookupConstraint lc) {
712  0 StringBuilder bldr = new StringBuilder();
713  0 bldr.append(lc.getId());
714    // this is the search description not the lookup description
715    // builder.append (" - ");
716    // builder.append (lc.getDesc ());
717  0 String and = "";
718  0 bldr.append("<br>");
719  0 bldr.append("\n");
720  0 bldr.append("Implemented using search: ");
721  0 String searchPage = calcWikiSearchPage(lc.getSearchTypeId());
722  0 bldr.append("[" + lc.getSearchTypeId() + "|" + searchPage + "#"
723    + lc.getSearchTypeId() + "]");
724  0 List<CommonLookupParam> configuredParameters = filterConfiguredParams(
725    lc.getParams());
726  0 if (configuredParameters.size() > 0) {
727  0 bldr.append("<br>");
728  0 bldr.append("\n");
729  0 bldr.append(" where ");
730  0 and = "";
731  0 for (CommonLookupParam param : configuredParameters) {
732  0 bldr.append(and);
733  0 and = " and ";
734  0 bldr.append(param.getName());
735  0 bldr.append("=");
736  0 if (param.getDefaultValueString() != null) {
737  0 bldr.append(param.getDefaultValueString());
738  0 continue;
739    }
740  0 if (param.getDefaultValueList() != null) {
741  0 String comma = "";
742  0 for (String defValue : param.getDefaultValueList()) {
743  0 bldr.append(comma);
744  0 comma = ", ";
745  0 bldr.append(defValue);
746    }
747    }
748    }
749    }
750  0 return bldr.toString();
751    }
752   
 
753  0 toggle private String calcForceUpperValidCharsMinMax(AttributeDefinition ad) {
754  0 StringBuilder bldr = new StringBuilder();
755  0 String brk = "";
756  0 String forceUpper = calcForceUpperCase(ad);
757  0 if (!forceUpper.trim().isEmpty()) {
758  0 bldr.append(forceUpper);
759  0 brk = "<BR>";
760    }
761   
762  0 String validChars = calcValidChars(ad);
763  0 if (!validChars.trim().isEmpty()) {
764  0 bldr.append(brk);
765  0 brk = "<BR>";
766  0 bldr.append(validChars);
767    }
768   
769  0 String minMax = calcMinMax(ad);
770  0 if (!minMax.trim().isEmpty()) {
771  0 bldr.append(brk);
772  0 brk = "<BR>";
773  0 bldr.append(minMax);
774    }
775   
776  0 return bldr.toString();
777    }
778   
 
779  0 toggle private String calcMinMax(AttributeDefinition ad) {
780  0 if (ad.getExclusiveMin() == null) {
781  0 if (ad.getInclusiveMax() == null) {
782  0 return " ";
783    }
784  0 return "Must be <= " + ad.getInclusiveMax();
785    }
786  0 if (ad.getInclusiveMax() == null) {
787  0 return "Must be > " + ad.getExclusiveMin();
788    }
789  0 return "Must be > " + ad.getExclusiveMin() + " and < "
790    + ad.getInclusiveMax();
791    }
792    private static final String PAGE_PREFIX = "Formatted View of ";
793    private static final String PAGE_SUFFIX = " Searches";
794   
 
795  0 toggle private String calcWikiSearchPage(String searchType) {
796  0 return PAGE_PREFIX + calcWikigPageAbbrev(searchType) + PAGE_SUFFIX;
797    }
798   
 
799  0 toggle private String calcWikigPageAbbrev(String searchType) {
800  0 if (searchType == null) {
801  0 return null;
802    }
803  0 if (searchType.equals("enumeration.management.search")) {
804  0 return "EM";
805    }
806  0 if (searchType.startsWith("lu.")) {
807  0 return "LU";
808    }
809  0 if (searchType.startsWith("cluset.")) {
810  0 return "LU";
811    }
812  0 if (searchType.startsWith("lo.")) {
813  0 return "LO";
814    }
815  0 if (searchType.startsWith("lrc.")) {
816  0 return "LRC";
817    }
818  0 if (searchType.startsWith("comment.")) {
819  0 return "Comment";
820    }
821  0 if (searchType.startsWith("org.")) {
822  0 return "Organization";
823    }
824  0 if (searchType.startsWith("atp.")) {
825  0 return "ATP";
826    }
827  0 throw new IllegalArgumentException("Unknown type of search: " + searchType);
828    }
829   
 
830  0 toggle private List<CommonLookupParam> filterConfiguredParams(
831    List<CommonLookupParam> params) {
832  0 List list = new ArrayList();
833  0 if (params == null) {
834  0 return list;
835    }
836  0 if (params.size() == 0) {
837  0 return list;
838    }
839  0 for (CommonLookupParam param : params) {
840  0 if (param.getDefaultValueString() != null) {
841  0 list.add(param);
842  0 continue;
843    }
844  0 if (param.getDefaultValueList() != null) {
845  0 list.add(param);
846    }
847    }
848  0 return list;
849    }
850   
 
851  0 toggle private String calcLength(AttributeDefinition ad) {
852  0 if (ad.getMaxLength() != null) {
853  0 if (ad.getMinLength() != null && ad.getMinLength() != 0) {
854  0 if (ad.getMaxLength() == ad.getMinLength()) {
855  0 return ("must be " + ad.getMaxLength());
856    }
857  0 return ad.getMinLength() + " to " + ad.getMaxLength();
858    }
859  0 return "up to " + ad.getMaxLength();
860    }
861  0 if (ad.getMinLength() != null) {
862  0 return "at least " + ad.getMinLength();
863    }
864  0 return " ";
865    }
866   
 
867  0 toggle private String calcControl(AttributeDefinition ad) {
868  0 Control control = ad.getControlField();
869  0 if (control == null) {
870  0 return " ";
871    }
872  0 if (control instanceof TextControl) {
873  0 TextControl textControl = (TextControl) control;
874  0 if (textControl.getDatePicker() != null) {
875  0 return "DateControl";
876    }
877  0 if (textControl.getStyleClasses() != null) {
878  0 if (textControl.getStyleClasses().contains("amount")) {
879  0 return "CurrencyControl";
880    }
881    }
882    }
883  0 return control.getClass().getSimpleName();
884    }
885   
 
886  0 toggle private String calcCrossField(AttributeDefinition ad) {
887  0 StringBuilder b = new StringBuilder();
888  0 String semicolon = "";
889  0 String cfr = calcCrossFieldRequire(ad);
890  0 if (cfr != null) {
891  0 b.append(semicolon);
892  0 semicolon = "; ";
893  0 b.append(cfr);
894    }
895  0 String cfw = calcCrossFieldWhen(ad);
896  0 if (cfw != null) {
897  0 b.append(semicolon);
898  0 semicolon = "; ";
899  0 b.append(cfw);
900    }
901  0 if (b.length() == 0) {
902  0 return " ";
903    }
904  0 return b.toString();
905    }
906   
 
907  0 toggle private String calcCrossFieldRequire(AttributeDefinitionBase ad) {
908    // if (ad.getRequireConstraint() == null) {
909    // return null;
910    // }
911    // if (ad.getRequireConstraint().size() == 0) {
912    // return null;
913    // }
914  0 StringBuilder b = new StringBuilder();
915    // String comma = "";
916    // b.append("if not empty then ");
917    // for (RequiredConstraint rc : ad.getRequireConstraint()) {
918    // b.append(comma);
919    // comma = ", ";
920    // b.append(rc.getPropertyName());
921    // }
922    // if (ad.getRequireConstraint().size() == 1) {
923    // b.append(" is");
924    // } else {
925    // b.append(" are");
926    // }
927    // b.append(" also required");
928  0 return b.toString();
929    }
930   
 
931  0 toggle private String calcCrossFieldWhen(AttributeDefinition ad) {
932  0 if (ad.getCaseConstraint() == null) {
933  0 return null;
934    }
935  0 StringBuilder b = new StringBuilder();
936  0 CaseConstraint cc = ad.getCaseConstraint();
937  0 for (WhenConstraint wc : cc.getWhenConstraint()) {
938  0 b.append("\\\\");
939  0 b.append("\n");
940  0 b.append("when ");
941  0 b.append(cc.getPropertyName());
942  0 b.append(" ");
943  0 if (!cc.isCaseSensitive()) {
944  0 b.append("ignoring case ");
945    }
946  0 b.append(cc.getOperator());
947  0 b.append(" ");
948   
949  0 b.append("\\\\");
950  0 b.append("\n");
951  0 String comma = "";
952  0 for (Object value : wc.getValues()) {
953  0 b.append(comma);
954  0 comma = " or ";
955  0 b.append(asString(value));
956    }
957  0 b.append("\\\\");
958  0 b.append("\n");
959  0 b.append("then override constraint:"
960    + calcOverride(ad, (BaseConstraint) wc.getConstraint()));
961    }
962  0 return b.toString();
963    }
964   
 
965  0 toggle private String calcOverride(AttributeDefinition ad, BaseConstraint cons) {
966  0 StringBuilder b = new StringBuilder();
967    // b.append(calcOverride("serviceSide", ad.(),
968    // cons.getApplyClientSide()));
969    // b.append(calcOverride("exclusiveMin", ad.getExclusiveMin(),
970    // cons.getExclusiveMin()));
971    // b.append(calcOverride("inclusiveMax", ad.getInclusiveMax(),
972    // cons.getInclusiveMax()));
973    // String minOccursMessage = calcOverride("minOccurs", ad.getMinimumNumberOfElements(),
974    // cons.getMinimumNumberOfElements());
975    // if (!minOccursMessage.trim().equals("")) {
976    // if (cons.getMinimumNumberOfElements() != null && cons.getMinimumNumberOfElements() == 1) {
977    // minOccursMessage = " REQUIRED";
978    // }
979    // }
980    // b.append(minOccursMessage);
981    // b.append(calcOverride("validchars", ad.getValidCharactersConstraint(),
982    // cons.getValidCharactersConstraint()));
983    // b.append(calcOverride("lookup", ad.getLookupDefinition(),
984    // cons.getLookupDefinition()));
985    //TODO: other more complex constraints
986  0 return b.toString();
987    }
988   
 
989  0 toggle private String calcOverride(String attribute, LookupConstraint val1,
990    LookupConstraint val2) {
991  0 if (val1 == val2) {
992  0 return "";
993    }
994  0 if (val1 == null && val2 != null) {
995  0 return " add lookup " + this.calcLookup(val2);
996    }
997  0 if (val1 != null && val2 == null) {
998  0 return " remove lookup constraint";
999    }
1000  0 return " change lookup to " + calcLookup(val2);
1001    }
1002   
 
1003  0 toggle private String calcOverride(String attribute, ValidCharactersConstraint val1,
1004    ValidCharactersConstraint val2) {
1005  0 if (val1 == val2) {
1006  0 return "";
1007    }
1008  0 if (val1 == null && val2 != null) {
1009  0 return " add validchars " + calcValidChars(val2);
1010    }
1011  0 if (val1 != null && val2 == null) {
1012  0 return " remove validchars constraint";
1013    }
1014  0 return " change validchars to " + calcValidChars(val2);
1015    }
1016   
 
1017  0 toggle private String calcOverride(String attribute, boolean val1, boolean val2) {
1018  0 if (val1 == val2) {
1019  0 return "";
1020    }
1021  0 return " " + attribute + "=" + val2;
1022    }
1023   
 
1024  0 toggle private String calcOverride(String attribute, String val1, String val2) {
1025  0 if (val1 == null && val2 == null) {
1026  0 return "";
1027    }
1028  0 if (val1 == val2) {
1029  0 return "";
1030    }
1031  0 if (val1 == null) {
1032  0 return " " + attribute + "=" + val2;
1033    }
1034  0 if (val1.equals(val2)) {
1035  0 return "";
1036    }
1037  0 return " " + attribute + "=" + val2;
1038    }
1039   
 
1040  0 toggle private String calcOverride(String attribute, Object val1, Object val2) {
1041  0 if (val1 == null && val2 == null) {
1042  0 return "";
1043    }
1044  0 if (val1 == val2) {
1045  0 return "";
1046    }
1047  0 if (val1 == null) {
1048  0 return " " + attribute + "=" + val2;
1049    }
1050  0 if (val1.equals(val2)) {
1051  0 return "";
1052    }
1053  0 return " " + attribute + "=" + asString(val2);
1054    }
1055   
 
1056  0 toggle private String asString(Object value) {
1057  0 if (value == null) {
1058  0 return "null";
1059    }
1060  0 if (value instanceof String) {
1061  0 return (String) value;
1062    }
1063  0 return value.toString();
1064    }
1065   
 
1066  0 toggle private String nbsp(String str) {
1067  0 if (str == null) {
1068  0 return "&nbsp;";
1069    }
1070  0 if (str.trim().isEmpty()) {
1071  0 return "&nbsp;";
1072    }
1073  0 return str;
1074    }
1075   
 
1076  0 toggle public static void writeTag(PrintStream out, String tag, String value) {
1077  0 writeTag(out, tag, null, value);
1078    }
1079   
 
1080  0 toggle public static void writeTag(PrintStream out, String tag, String modifiers, String value) {
1081  0 if (value == null) {
1082  0 return;
1083    }
1084  0 if (value.equals("")) {
1085  0 return;
1086    }
1087  0 out.print("<" + tag);
1088  0 if (modifiers != null && !modifiers.isEmpty()) {
1089  0 out.print(" " + modifiers);
1090    }
1091  0 out.print(">");
1092  0 out.print(escapeXML(value));
1093  0 out.print("</" + tag + ">");
1094  0 out.println("");
1095    }
1096   
 
1097  0 toggle public static String escapeXML(String s) {
1098  0 StringBuffer sb = new StringBuffer();
1099  0 int n = s.length();
1100  0 for (int i = 0; i < n; i++) {
1101    // http://www.hdfgroup.org/HDF5/XML/xml_escape_chars.htm
1102  0 char c = s.charAt(i);
1103  0 switch (c) {
1104  0 case '"':
1105  0 sb.append("&quot;");
1106  0 break;
1107  0 case '\'':
1108  0 sb.append("&apos;");
1109  0 break;
1110  0 case '&':
1111  0 sb.append("&amp;");
1112  0 break;
1113  0 case '<':
1114  0 sb.append("&lt;");
1115  0 break;
1116  0 case '>':
1117  0 sb.append("&gt;");
1118  0 break;
1119    //case ' ': sb.append("&nbsp;");break;\
1120  0 default:
1121  0 sb.append(c);
1122  0 break;
1123    }
1124    }
1125  0 return sb.toString();
1126    }
1127   
 
1128  0 toggle private void writeLink(PrintStream out, String url, String value) {
1129  0 out.print("<a href=\"" + url + "\">" + value + "</a>");
1130    }
1131    }