Please wait. This can take some minutes ...
Many resources are needed to download a project. Please understand that we have to compensate our server costs. Thank you in advance.
Project price only 1 $
You can buy this project and download/modify it how often you want.
org.kuali.student.datadictionary.util.DictionaryFormatter Maven / Gradle / Ivy
/*
* Copyright 2011 The Kuali Foundation
*
* Licensed under the Educational Community License, Version 1.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.opensource.org/licenses/ecl1.php
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.kuali.student.datadictionary.util;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.io.PrintStream;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Stack;
import org.kuali.rice.krad.datadictionary.AttributeDefinition;
import org.kuali.rice.krad.datadictionary.AttributeDefinitionBase;
import org.kuali.rice.krad.datadictionary.CollectionDefinition;
import org.kuali.rice.krad.datadictionary.ComplexAttributeDefinition;
import org.kuali.rice.krad.datadictionary.DataObjectEntry;
import org.kuali.rice.krad.datadictionary.validation.constraint.BaseConstraint;
import org.kuali.rice.krad.datadictionary.validation.constraint.CaseConstraint;
import org.kuali.rice.krad.datadictionary.validation.constraint.CommonLookupParam;
import org.kuali.rice.krad.datadictionary.validation.constraint.LookupConstraint;
import org.kuali.rice.krad.datadictionary.validation.constraint.ValidCharactersConstraint;
import org.kuali.rice.krad.datadictionary.validation.constraint.WhenConstraint;
import org.kuali.rice.krad.uif.control.Control;
import org.kuali.rice.krad.uif.control.TextControl;
import org.kuali.student.contract.model.util.VersionLinesUtility;
public class DictionaryFormatter {
private DataObjectEntry doe;
private Map beansOfType;
private String beanId;
private String outputFileName;
public DictionaryFormatter(DataObjectEntry doe, Map beansOfType, String beanId, String outputFileName) {
this.doe = doe;
this.beansOfType = beansOfType;
this.beanId = beanId;
this.outputFileName = outputFileName;
}
public void formatForHtml(String projectVersion, String formattedDate) {
File file = new File(this.outputFileName);
OutputStream outputStream;
try {
outputStream = new FileOutputStream(file, false);
} catch (FileNotFoundException ex) {
throw new IllegalArgumentException(this.outputFileName, ex);
}
PrintStream out = new PrintStream(outputStream);
writeHeader(out, beanId);
writeBody(out, projectVersion, formattedDate);
writeFooter(out);
out.close();
}
public static void writeHeader(PrintStream out, String title) {
out.println("");
out.println("");
writeTag(out, "title", title);
out.println ("");
out.println("");
out.println("");
}
public static void writeFooter(PrintStream out) {
out.println("");
out.println("");
}
private String initUpper(String str) {
if (str == null) {
return null;
}
if (str.length() == 0) {
return str;
}
if (str.length() == 1) {
return str.toUpperCase();
}
return str.substring(0, 1).toUpperCase() + str.substring(1);
}
private void writeBody(PrintStream out, String projectVersion, String formattedDate) {
VersionLinesUtility.writeVersionTag(out, "home ", "contract doc ", projectVersion, formattedDate);
// builder.append ("======= start dump of object structure definition ========");
out.println("" + this.beanId + " ");
out.println(" ");
out.println("");
out.println("");
out.println("");
out.println("Name");
out.println(" ");
out.println("");
out.println(doe.getName());
out.println(" ");
out.println(" ");
out.println("");
out.println("");
out.println("Label");
out.println(" ");
out.println("");
out.println(doe.getObjectLabel());
out.println(" ");
out.println(" ");
out.println("");
out.println("");
out.println("JSTL Key");
out.println(" ");
out.println("");
out.println(doe.getJstlKey());
out.println(" ");
out.println(" ");
out.println("");
out.println("");
out.println("Java Class");
out.println(" ");
out.println("");
out.println(doe.getFullClassName());
out.println(" ");
out.println(" ");
out.println("");
if (!doe.getDataObjectClass().getName().equals(doe.getFullClassName())) {
out.println(" ");
out.println("");
out.println("Object Class");
out.println(" ");
out.println("");
out.println(doe.getDataObjectClass().getName());
out.println(" ");
out.println(" ");
out.println("");
}
if (!doe.getEntryClass().getName().equals(doe.getFullClassName())) {
out.println(" ");
out.println("");
out.println("Entry Class");
out.println(" ");
out.println("");
out.println(doe.getEntryClass().getName());
out.println(" ");
out.println(" ");
out.println("");
}
out.println(" ");
out.println("");
out.println("Description");
out.println(" ");
out.println("");
out.println(doe.getObjectDescription());
out.println(" ");
out.println(" ");
out.println("");
out.println("");
out.println("Primary Key(s)");
out.println(" ");
out.println("");
StringBuilder bldr = new StringBuilder();
String comma = "";
if (doe.getPrimaryKeys() != null) {
for (String pk : doe.getPrimaryKeys()) {
bldr.append(comma);
comma = ", ";
bldr.append(pk);
}
}
out.println(bldr.toString());
out.println(" ");
out.println(" ");
out.println("");
out.println("");
out.println("Field to use as the title (or name)");
out.println(" ");
out.println("");
out.println(doe.getTitleAttribute());
out.println(" ");
out.println(" ");
out.println("
");
// out.println(" ");
// fields
out.println("Field Definitions ");
// check for discrepancies first
List discrepancies = new Dictionary2BeanComparer(doe.getFullClassName(), doe).compare();
if (discrepancies.isEmpty()) {
out.println("No discrepancies were found between the dictionary definition and the java object -- ");
out.println("WARNING: take this with a grain of salt - the comparison does not dig into complex sub-objects nor collections so...");
} else {
out.println("" + discrepancies.size() + " discrepancie(s) were found between the dictionary definition and the java object" + " ");
out.println("");
for (String discrepancy : discrepancies) {
out.println("" + discrepancy);
}
out.println(" ");
}
// field table
out.println("");
out.println("");
out.println("");
out.println("Field");
out.println(" ");
out.println("");
out.println("Required?");
out.println(" ");
out.println("");
out.println("DataType");
out.println(" ");
out.println("");
out.println("Length");
out.println(" ");
out.println("");
out.println("Short Label");
out.println(" ");
out.println("");
out.println("Summary");
out.println(" ");
out.println("");
out.println("Label");
out.println(" ");
out.println("");
out.println("Description");
out.println(" ");
out.println("");
out.println("Read Only, Dynamic, or Hidden");
out.println(" ");
out.println("");
out.println("Default");
out.println(" ");
out.println("");
out.println("Repeats?");
out.println(" ");
out.println("");
out.println("Valid Characters");
out.println(" ");
out.println("");
out.println("Lookup");
out.println(" ");
out.println("");
out.println("Cross Field");
out.println(" ");
out.println("");
out.println("Default Control");
out.println(" ");
out.println(" ");
this.writeAttributes(out, doe, new Stack(), new Stack());
out.println("
");
return;
}
private void writeAttributes(PrintStream out, DataObjectEntry ode, Stack parentNames, Stack parents) {
// stop recursion
if (parents.contains(ode)) {
return;
}
// for (AttributeDefinition ad : getSortedFields()) {
if (ode.getAttributes() != null) {
for (AttributeDefinition ad : ode.getAttributes()) {
out.println("");
out.println("");
out.println(nbsp(calcName(ad.getName(), parentNames)));
out.println(" ");
out.println("");
out.println(nbsp(calcRequired(ad)));
out.println(" ");
out.println("");
out.println(nbsp(calcDataType(ad)));
out.println(" ");
out.println("");
out.println(nbsp(calcLength(ad)));
out.println(" ");
out.println("");
out.println(nbsp(calcShortLabel(ad)));
out.println(" ");
out.println("");
out.println(nbsp(calcSummary(ad)));
out.println(" ");
out.println("");
out.println(nbsp(calcLabel(ad)));
out.println(" ");
out.println("");
out.println(nbsp(calcDescription(ad)));
out.println(" ");
out.println("");
out.println(nbsp(calcDynamicHiddenReadOnly(ad)));
out.println(" ");
out.println("");
out.println(nbsp(calcDefaultValue(ad)));
out.println(" ");
out.println("");
out.println(nbsp(null));
out.println(" ");
out.println("");
out.println(nbsp(calcForceUpperValidCharsMinMax(ad)));
out.println(" ");
out.println("");
out.println(nbsp(calcLookup(ad)));
out.println(" ");
out.println("");
out.println(nbsp(calcCrossField(ad)));
out.println(" ");
out.println("");
out.println(nbsp(calcControl(ad)));
out.println(" ");
out.println(" ");
}
}
if (ode.getComplexAttributes() != null) {
for (ComplexAttributeDefinition cad : ode.getComplexAttributes()) {
out.println("");
out.println("");
out.println(nbsp(calcName(cad.getName(), parentNames)));
out.println(" ");
out.println("");
out.println(nbsp(calcRequired(cad)));
out.println(" ");
out.println("");
out.println("Complex");
out.println(" ");
out.println("");
out.println(nbsp(null));
out.println(" ");
out.println("");
out.println(nbsp(calcShortLabel(cad)));
out.println(" ");
out.println("");
out.println(nbsp(calcSummary(cad)));
out.println(" ");
out.println("");
out.println(nbsp(calcLabel(cad)));
out.println(" ");
out.println("");
out.println(nbsp(calcDescription(cad)));
out.println(" ");
out.println("");
out.println(nbsp(null));
out.println(" ");
out.println("");
out.println(nbsp(null));
out.println(" ");
out.println("");
out.println(nbsp(null));
out.println(" ");
out.println("");
out.println(nbsp(null));
out.println(" ");
out.println("");
out.println(nbsp(null));
out.println(" ");
out.println("");
out.println(nbsp(null));
out.println(" ");
out.println("");
out.println(nbsp(null));
out.println(" ");
out.println(" ");
parentNames.push(cad.getName());
parents.push(ode);
this.writeAttributes(out, (DataObjectEntry) cad.getDataObjectEntry(), parentNames, parents);
parentNames.pop();
parents.pop();
}
}
if (ode.getCollections() != null) {
for (CollectionDefinition cd : ode.getCollections()) {
out.println("");
out.println("");
out.println(nbsp(calcName(cd.getName(), parentNames)));
out.println(" ");
out.println("");
out.println(nbsp(calcRequired(cd)));
out.println(" ");
out.println("");
out.println("Complex");
out.println(" ");
out.println("");
out.println(nbsp(null));
out.println(" ");
out.println("");
out.println(nbsp(calcShortLabel(cd)));
out.println(" ");
out.println("");
out.println(nbsp(calcSummary(cd)));
out.println(" ");
out.println("");
out.println(nbsp(calcLabel(cd)));
out.println(" ");
out.println("");
out.println(nbsp(calcDescription(cd)));
out.println(" ");
out.println("");
out.println(nbsp(null));
out.println(" ");
out.println("");
out.println(nbsp(null));
out.println(" ");
out.println("");
out.println(nbsp("Repeating"));
out.println(" ");
out.println("");
out.println(nbsp(null));
out.println(" ");
out.println("");
out.println(nbsp(null));
out.println(" ");
out.println("");
out.println(nbsp(null));
out.println(" ");
out.println("");
out.println(nbsp(null));
out.println(" ");
out.println(" ");
DataObjectEntry childDoe = this.getDataOjbectEntry(cd.getDataObjectClass());
if (childDoe == null) {
// TODO: uncomment this but right now there are xml files that don't have one defined and it seems to work so...
// throw new NullPointerException ("Could not find a data object entry, " + cd.getDataObjectClass() + " for field " + calcName(cd.getName(), parents));
System.out.println("Could not find a data object entry, " + cd.getDataObjectClass() + " for field " + calcName(cd.getName(), parentNames));
} else {
parentNames.push(cd.getName());
parents.push(ode);
this.writeAttributes(out, (DataObjectEntry) childDoe, parentNames, parents);
parentNames.pop();
parents.pop();
}
}
}
}
private DataObjectEntry getDataOjbectEntry(String className) {
for (DataObjectEntry doe : this.beansOfType.values()) {
if (doe.getDataObjectClass().getName().equals(className)) {
return doe;
}
}
return null;
}
private String calcName(String name, Stack parents) {
StringBuilder sb = new StringBuilder();
for (String parent : parents) {
sb.append(parent);
sb.append(".");
}
sb.append(name);
return sb.toString();
}
private String calcShortLabel(CollectionDefinition cd) {
return cd.getShortLabel();
}
private String calcShortLabel(AttributeDefinitionBase ad) {
return ad.getShortLabel();
}
private String calcLabel(CollectionDefinition cd) {
return cd.getLabel();
}
private String calcLabel(AttributeDefinitionBase ad) {
return ad.getLabel();
}
private String calcSummary(CollectionDefinition ad) {
return ad.getSummary();
}
private String calcSummary(AttributeDefinitionBase ad) {
return ad.getSummary();
}
private String calcDescription(CollectionDefinition cd) {
return cd.getDescription();
}
private String calcDescription(AttributeDefinitionBase ad) {
return ad.getDescription();
}
private List getSortedFields() {
List fields = doe.getAttributes();
Collections.sort(fields, new AttributeDefinitionNameComparator());
return fields;
}
private static class AttributeDefinitionNameComparator implements Comparator {
@Override
public int compare(AttributeDefinition o1, AttributeDefinition o2) {
return o1.getName().toLowerCase().compareTo(o2.getName().toLowerCase());
}
}
private String formatAsString(List discrepancies) {
int i = 0;
StringBuilder builder = new StringBuilder();
for (String discrep : discrepancies) {
i++;
builder.append(i + ". " + discrep + "\n");
}
return builder.toString();
}
private String calcDataType(AttributeDefinition ad) {
// if (ad.getDataType().equals(DataType.COMPLEX)) {
// if (ad.getDataObjectStructure() == null) {
// throw new IllegalArgumentException(
// ad.getName() + " is complex but does not have a sub-structure defined");
// }
// Class subClazz = this.getClass(ad.getDataObjectStructure().getName());
// String subStrucName = calcComplexSubStructureName(ad);
// // process if explicity asking for substructures OR the field is a freestanding field
// // so it won't be processed by just processing all of the DTO's and their sub-objects
// if (this.processSubstructures || subClazz == null) {
// if (!this.subStructuresAlreadyProcessed.contains(
// ad.getDataObjectStructure())) {
//// System.out.println ("Adding " + subStrucName + " to set to be processed");
// this.subStructuresToProcess.put(subStrucName, ad.getDataObjectStructure());
// }
// }
// return "[" + calcNotSoSimpleName(subStrucName) + "|#" + subStrucName + "]";
// }
return ad.getDataType().toString();
}
private String calcDefaultValue(AttributeDefinition ad) {
// if (ad.getDefaultValue() != null) {
// return ad.getDefaultValue().toString();
// }
return " ";
}
private String calcDynamicHiddenReadOnly(AttributeDefinition ad) {
StringBuilder sb = new StringBuilder();
String comma = "";
comma = this.appendIfNotNull(sb, this.calcDynamic(ad), comma);
comma = this.appendIfNotNull(sb, this.calcHidden(ad), comma);
comma = this.appendIfNotNull(sb, this.calcReadOnly(ad), comma);
return sb.toString();
}
private String appendIfNotNull(StringBuilder sb, String value, String comma) {
if (value == null) {
return comma;
}
sb.append(comma);
sb.append(value);
return ", ";
}
private String calcDynamic(AttributeDefinition ad) {
// TODO: implement once KRAD team implements
// if (ad.isDynamic()) {
// return "dynamic";
// }
return null;
}
private String calcHidden(AttributeDefinition ad) {
if (ad.getAttributeSecurity() == null) {
return null;
}
if (ad.getAttributeSecurity().isHide()) {
return "Hidden";
}
return null;
}
private String calcReadOnly(AttributeDefinition ad) {
if (ad.getAttributeSecurity() == null) {
return null;
}
if (ad.getAttributeSecurity().isReadOnly()) {
return "Read only";
}
return null;
}
private String calcComplexSubStructureName(AttributeDefinition ad) {
// if (this.processSubstructures) {
// return name + "." + ad.getName() + "." + calcSimpleName(
// ad.getDataObjectStructure().getName());
// }
// return calcSimpleName(ad.getDataObjectStructure().getName());
return " ";
}
private String calcSimpleName(String simpleName) {
if (simpleName.lastIndexOf(".") != -1) {
simpleName = simpleName.substring(simpleName.lastIndexOf(".") + 1);
}
return simpleName;
}
private String calcNotSoSimpleName(String name) {
if (name.lastIndexOf(".") == -1) {
return name;
}
String simpleName = calcSimpleName(name);
String fieldName = calcSimpleName(name.substring(0, name.length()
- simpleName.length()
- 1));
return fieldName + "." + simpleName;
}
private String calcRequired(CollectionDefinition cd) {
if (cd.getMinOccurs() != null) {
if (cd.getMinOccurs() >= 1) {
return "required";
}
}
// TODO: Deal with collections
// if (ad.getMaximumNumberOfElements() != null) {
// if (ad.getMaximumNumberOfElements().intValue() == 0) {
// return "Not allowed";
// }
// }
//
// if (ad.getMinimumNumberOfElements() != null) {
// if (ad.getMinimumNumberOfElements().intValue() >= 1) {
// return "required";
// }
// }
return " ";
// return "optional";
}
private String calcRequired(AttributeDefinitionBase ad) {
if (ad.isRequired() != null) {
if (ad.isRequired()) {
return "required";
}
}
// TODO: Deal with collections
// if (ad.getMaximumNumberOfElements() != null) {
// if (ad.getMaximumNumberOfElements().intValue() == 0) {
// return "Not allowed";
// }
// }
//
// if (ad.getMinimumNumberOfElements() != null) {
// if (ad.getMinimumNumberOfElements().intValue() >= 1) {
// return "required";
// }
// }
return " ";
// return "optional";
}
private String calcForceUpperCase(AttributeDefinition ad) {
if (ad.getForceUppercase() != null && ad.getForceUppercase()) {
return "FORCE UPPER CASE";
}
return " ";
}
private String calcValidChars(AttributeDefinition ad) {
if (ad.getValidCharactersConstraint() == null) {
return " ";
}
return calcValidChars(ad.getValidCharactersConstraint());
}
private String calcValidChars(ValidCharactersConstraint cons) {
String messageKey = cons.getMessageKey();
if (messageKey == null) {
messageKey = "validation.validChars";
}
String validChars = escapeXML(cons.getValue());
String descr = messageKey + " " + validChars;
return descr;
}
private String calcLookup(AttributeDefinition ad) {
if (ad.getLookupDefinition() == null) {
return " ";
}
return calcLookup(ad.getLookupDefinition());
}
private String calcLookup(LookupConstraint lc) {
StringBuilder bldr = new StringBuilder();
bldr.append(lc.getId());
// this is the search description not the lookup description
// builder.append (" - ");
// builder.append (lc.getDesc ());
String and = "";
bldr.append(" ");
bldr.append("\n");
bldr.append("Implemented using search: ");
String searchPage = calcWikiSearchPage(lc.getSearchTypeId());
bldr.append("[" + lc.getSearchTypeId() + "|" + searchPage + "#"
+ lc.getSearchTypeId() + "]");
List configuredParameters = filterConfiguredParams(
lc.getParams());
if (configuredParameters.size() > 0) {
bldr.append(" ");
bldr.append("\n");
bldr.append(" where ");
and = "";
for (CommonLookupParam param : configuredParameters) {
bldr.append(and);
and = " and ";
bldr.append(param.getName());
bldr.append("=");
if (param.getDefaultValueString() != null) {
bldr.append(param.getDefaultValueString());
continue;
}
if (param.getDefaultValueList() != null) {
String comma = "";
for (String defValue : param.getDefaultValueList()) {
bldr.append(comma);
comma = ", ";
bldr.append(defValue);
}
}
}
}
return bldr.toString();
}
private String calcForceUpperValidCharsMinMax(AttributeDefinition ad) {
StringBuilder bldr = new StringBuilder();
String brk = "";
String forceUpper = calcForceUpperCase(ad);
if (!forceUpper.trim().isEmpty()) {
bldr.append(forceUpper);
brk = " ";
}
String validChars = calcValidChars(ad);
if (!validChars.trim().isEmpty()) {
bldr.append(brk);
brk = " ";
bldr.append(validChars);
}
String minMax = calcMinMax(ad);
if (!minMax.trim().isEmpty()) {
bldr.append(brk);
brk = " ";
bldr.append(minMax);
}
return bldr.toString();
}
private String calcMinMax(AttributeDefinition ad) {
if (ad.getExclusiveMin() == null) {
if (ad.getInclusiveMax() == null) {
return " ";
}
return "Must be <= " + ad.getInclusiveMax();
}
if (ad.getInclusiveMax() == null) {
return "Must be > " + ad.getExclusiveMin();
}
return "Must be > " + ad.getExclusiveMin() + " and < "
+ ad.getInclusiveMax();
}
private static final String PAGE_PREFIX = "Formatted View of ";
private static final String PAGE_SUFFIX = " Searches";
private String calcWikiSearchPage(String searchType) {
return PAGE_PREFIX + calcWikigPageAbbrev(searchType) + PAGE_SUFFIX;
}
private String calcWikigPageAbbrev(String searchType) {
if (searchType == null) {
return null;
}
if (searchType.equals("enumeration.management.search")) {
return "EM";
}
if (searchType.startsWith("lu.")) {
return "LU";
}
if (searchType.startsWith("cluset.")) {
return "LU";
}
if (searchType.startsWith("lo.")) {
return "LO";
}
if (searchType.startsWith("lrc.")) {
return "LRC";
}
if (searchType.startsWith("comment.")) {
return "Comment";
}
if (searchType.startsWith("org.")) {
return "Organization";
}
if (searchType.startsWith("atp.")) {
return "ATP";
}
throw new IllegalArgumentException("Unknown type of search: " + searchType);
}
private List filterConfiguredParams(
List params) {
List list = new ArrayList();
if (params == null) {
return list;
}
if (params.size() == 0) {
return list;
}
for (CommonLookupParam param : params) {
if (param.getDefaultValueString() != null) {
list.add(param);
continue;
}
if (param.getDefaultValueList() != null) {
list.add(param);
}
}
return list;
}
private String calcLength(AttributeDefinition ad) {
if (ad.getMaxLength() != null) {
if (ad.getMinLength() != null && ad.getMinLength() != 0) {
if (ad.getMaxLength() == ad.getMinLength()) {
return ("must be " + ad.getMaxLength());
}
return ad.getMinLength() + " to " + ad.getMaxLength();
}
return "up to " + ad.getMaxLength();
}
if (ad.getMinLength() != null) {
return "at least " + ad.getMinLength();
}
return " ";
}
private String calcControl(AttributeDefinition ad) {
Control control = ad.getControlField();
if (control == null) {
return " ";
}
if (control instanceof TextControl) {
TextControl textControl = (TextControl) control;
if (textControl.getDatePicker() != null) {
return "DateControl";
}
if (!textControl.getStyleClassesAsString().isEmpty()) {
if (textControl.getStyleClassesAsString().contains("amount")) {
return "CurrencyControl";
}
}
}
return control.getClass().getSimpleName();
}
private String calcCrossField(AttributeDefinition ad) {
StringBuilder b = new StringBuilder();
String semicolon = "";
String cfr = calcCrossFieldRequire(ad);
if (cfr != null) {
b.append(semicolon);
semicolon = "; ";
b.append(cfr);
}
String cfw = calcCrossFieldWhen(ad);
if (cfw != null) {
b.append(semicolon);
semicolon = "; ";
b.append(cfw);
}
if (b.length() == 0) {
return " ";
}
return b.toString();
}
private String calcCrossFieldRequire(AttributeDefinitionBase ad) {
// if (ad.getRequireConstraint() == null) {
// return null;
// }
// if (ad.getRequireConstraint().size() == 0) {
// return null;
// }
StringBuilder b = new StringBuilder();
// String comma = "";
// b.append("if not empty then ");
// for (RequiredConstraint rc : ad.getRequireConstraint()) {
// b.append(comma);
// comma = ", ";
// b.append(rc.getPropertyName());
// }
// if (ad.getRequireConstraint().size() == 1) {
// b.append(" is");
// } else {
// b.append(" are");
// }
// b.append(" also required");
return b.toString();
}
private String calcCrossFieldWhen(AttributeDefinition ad) {
if (ad.getCaseConstraint() == null) {
return null;
}
StringBuilder b = new StringBuilder();
CaseConstraint cc = ad.getCaseConstraint();
for (WhenConstraint wc : cc.getWhenConstraint()) {
b.append("\\\\");
b.append("\n");
b.append("when ");
b.append(cc.getPropertyName());
b.append(" ");
if (!cc.isCaseSensitive()) {
b.append("ignoring case ");
}
b.append(cc.getOperator());
b.append(" ");
b.append("\\\\");
b.append("\n");
String comma = "";
for (Object value : wc.getValues()) {
b.append(comma);
comma = " or ";
b.append(asString(value));
}
b.append("\\\\");
b.append("\n");
b.append("then override constraint:"
+ calcOverride(ad, (BaseConstraint) wc.getConstraint()));
}
return b.toString();
}
private String calcOverride(AttributeDefinition ad, BaseConstraint cons) {
StringBuilder b = new StringBuilder();
// b.append(calcOverride("serviceSide", ad.(),
// cons.getApplyClientSide()));
// b.append(calcOverride("exclusiveMin", ad.getExclusiveMin(),
// cons.getExclusiveMin()));
// b.append(calcOverride("inclusiveMax", ad.getInclusiveMax(),
// cons.getInclusiveMax()));
// String minOccursMessage = calcOverride("minOccurs", ad.getMinimumNumberOfElements(),
// cons.getMinimumNumberOfElements());
// if (!minOccursMessage.trim().equals("")) {
// if (cons.getMinimumNumberOfElements() != null && cons.getMinimumNumberOfElements() == 1) {
// minOccursMessage = " REQUIRED";
// }
// }
// b.append(minOccursMessage);
// b.append(calcOverride("validchars", ad.getValidCharactersConstraint(),
// cons.getValidCharactersConstraint()));
// b.append(calcOverride("lookup", ad.getLookupDefinition(),
// cons.getLookupDefinition()));
//TODO: other more complex constraints
return b.toString();
}
private String calcOverride(String attribute, LookupConstraint val1,
LookupConstraint val2) {
if (val1 == val2) {
return "";
}
if (val1 == null && val2 != null) {
return " add lookup " + this.calcLookup(val2);
}
if (val1 != null && val2 == null) {
return " remove lookup constraint";
}
return " change lookup to " + calcLookup(val2);
}
private String calcOverride(String attribute, ValidCharactersConstraint val1,
ValidCharactersConstraint val2) {
if (val1 == val2) {
return "";
}
if (val1 == null && val2 != null) {
return " add validchars " + calcValidChars(val2);
}
if (val1 != null && val2 == null) {
return " remove validchars constraint";
}
return " change validchars to " + calcValidChars(val2);
}
private String calcOverride(String attribute, boolean val1, boolean val2) {
if (val1 == val2) {
return "";
}
return " " + attribute + "=" + val2;
}
private String calcOverride(String attribute, String val1, String val2) {
if (val1 == null && val2 == null) {
return "";
}
if (val1 == val2) {
return "";
}
if (val1 == null) {
return " " + attribute + "=" + val2;
}
if (val1.equals(val2)) {
return "";
}
return " " + attribute + "=" + val2;
}
private String calcOverride(String attribute, Object val1, Object val2) {
if (val1 == null && val2 == null) {
return "";
}
if (val1 == val2) {
return "";
}
if (val1 == null) {
return " " + attribute + "=" + val2;
}
if (val1.equals(val2)) {
return "";
}
return " " + attribute + "=" + asString(val2);
}
private String asString(Object value) {
if (value == null) {
return "null";
}
if (value instanceof String) {
return (String) value;
}
return value.toString();
}
private String nbsp(String str) {
if (str == null) {
return " ";
}
if (str.trim().isEmpty()) {
return " ";
}
return str;
}
public static void writeTag(PrintStream out, String tag, String value) {
writeTag(out, tag, null, value);
}
public static void writeTag(PrintStream out, String tag, String modifiers, String value) {
if (value == null) {
return;
}
if (value.equals("")) {
return;
}
out.print("<" + tag);
if (modifiers != null && !modifiers.isEmpty()) {
out.print(" " + modifiers);
}
out.print(">");
out.print(escapeXML(value));
out.print("" + tag + ">");
out.println("");
}
public static String escapeXML(String s) {
StringBuffer sb = new StringBuffer();
int n = s.length();
for (int i = 0; i < n; i++) {
// http://www.hdfgroup.org/HDF5/XML/xml_escape_chars.htm
char c = s.charAt(i);
switch (c) {
case '"':
sb.append(""");
break;
case '\'':
sb.append("'");
break;
case '&':
sb.append("&");
break;
case '<':
sb.append("<");
break;
case '>':
sb.append(">");
break;
//case ' ': sb.append(" ");break;\
default:
sb.append(c);
break;
}
}
return sb.toString();
}
private void writeLink(PrintStream out, String url, String value) {
out.print("" + value + " ");
}
}