
org.kuali.student.contract.model.util.HtmlContractMessageStructureWriter Maven / Gradle / Ivy
/*
* Copyright 2011 The Kuali Foundation
*
* Licensed under the Educational Community License, Version 2.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.osedu.org/licenses/ECL-2.0
*
* 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.contract.model.util;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.Set;
import org.kuali.student.contract.model.MessageStructure;
import org.kuali.student.contract.model.ServiceContractModel;
import org.kuali.student.contract.model.ServiceMethod;
import org.kuali.student.contract.model.ServiceMethodParameter;
import org.kuali.student.contract.model.XmlType;
import org.kuali.student.contract.writer.HtmlWriter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
*
* @author nwright
*/
public class HtmlContractMessageStructureWriter {
private static final Logger log = LoggerFactory.getLogger(HtmlContractMessageStructureWriter.class);
private XmlType xmlType;
private HtmlWriter writer;
private ServiceContractModel model;
private ModelFinder finder;
public HtmlContractMessageStructureWriter(XmlType xmlType, String directory,
ServiceContractModel model) {
this.xmlType = xmlType;
this.writer = new HtmlWriter(directory, xmlType.getName() + ".html",
xmlType.getName());
this.model = model;
this.finder = new ModelFinder(this.model);
}
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 boolean isMainMessageStructure(XmlType xmlType) {
if (!HtmlContractMessageStructureWriter.calcOtherXmlTypeUsages(model,
xmlType).isEmpty()) {
return false;
}
return true;
}
public void write(String projectVersion, String formattedDate) {
this.writeStyleSheet();
if (this.isMainMessageStructure(xmlType)) {
VersionLinesUtility.writeVersionTag(writer, "home", "dictionary doc", projectVersion, formattedDate);
}
else
VersionLinesUtility.writeVersionTag(writer, "home", "" ,projectVersion, formattedDate);
writer.writeTag("h1", xmlType.getName());
writer.indentPrintln("");
writer.indentPrintln("");
writer.writeTag("th", "class=h", "Name");
writer.writeTag("td", "id=structureName colspan=2", xmlType.getName());
writer.indentPrintln(" ");
// writer.indentPrintln ("");
// writer.writeTag ("th", "class=h", "Version");
// writer.writeTag ("td", "id=structureVersion colspan=2", xmlType.getVersion ());
// writer.indentPrintln (" ");
writer.indentPrintln("");
writer.writeTag("th", "rowspan=3 class=h", "Usage");
writer.indentPrint("");
for (String servKey : xmlType.getService().split(",")) {
writer.indentPrintln(""
+ servKey + "Service" + "");
}
writer.indentPrint(" ");
writer.indentPrintln(" ");
writer.indentPrintln("");
writer.writeTag("th", "class=h", "");
writer.indentPrint("");
for (ServiceMethod method : this.calcUsageByMethods(xmlType)) {
writer.indentPrintln(""
+ method.getName() + "");
}
writer.indentPrint(" ");
writer.indentPrintln(" ");
writer.indentPrintln("");
writer.writeTag("th", "class=h", "");
writer.indentPrint("");
for (String xmlTypeName : this.calcOtherXmlTypeUsages(xmlType)) {
XmlType usageType = finder.findXmlType(xmlTypeName);
if (usageType == null) {
throw new NullPointerException("Coud not find XmlType with name="
+ xmlTypeName);
}
writer.indentPrintln(""
+ usageType.getName() + "");
}
writer.indentPrint(" ");
writer.indentPrintln(" ");
writer.writeTag("th", "class=h", "Type");
writer.writeTag("td", "id=structureVersion colspan=2",
xmlType.getPrimitive());
writer.indentPrintln("");
writer.indentPrintln("
");
writer.writeTag("h2", "Description");
writer.indentPrintln(this.addHTMLBreaks(calcDescription (xmlType)));
if (!xmlType.getPrimitive().equals(XmlType.COMPLEX)) {
return;
}
writer.indentPrintln(
"Structure Definition
");
writer.indentPrintln("");
writer.indentPrintln("");
writer.indentPrintln("ShortName ");
writer.indentPrintln("Name ");
writer.indentPrintln("Type ");
writer.indentPrintln("Description ");
writer.indentPrintln("Required? ");
writer.indentPrintln("Read only? ");
writer.indentPrintln("Cardinality ");
writer.indentPrintln("XML Attribute? ");
// writer.indentPrintln ("Status ");
writer.indentPrintln("Implementation Notes ");
writer.indentPrintln(" ");
for (MessageStructure ms : finder.findMessageStructures(xmlType.getName())) {
this.writeMessageStructure(ms);
}
writer.indentPrintln("
");
writer.writeHeaderBodyAndFooterOutToFile();
}
private String calcDescription(XmlType xmlType) {
StringBuilder sb = new StringBuilder();
String newLine = "";
if (xmlType.getDesc() != null && !xmlType.getDesc().trim().isEmpty()) {
sb.append(newLine);
newLine = "\n";
sb.append(xmlType.getDesc ());
}
if (xmlType.isDeprecated()) {
sb.append(newLine);
newLine = "\n";
sb.append("============== Deprecated ===============");
}
return sb.toString();
}
private String checkForNbsp(String str) {
if (str == null) {
return " ";
}
if (str.trim().isEmpty()) {
return " ";
}
return str;
}
private String addHTMLBreaks(String str) {
if (str == null) {
return " ";
}
return str.replaceAll("(\r\n|\r|\n|\n\r)", "
");
}
public static Set calcUsageByService(ServiceContractModel mdl, XmlType xmlType) {
Set services = new HashSet();
for (ServiceMethod method : calcUsageByMethods(mdl, xmlType)) {
services.add(method.getService());
}
return services;
}
private Set calcUsageByMethods(XmlType xmlType) {
return calcUsageByMethods(model, xmlType);
}
public static Set calcUsageByMethods(ServiceContractModel mdl, XmlType xmlType) {
Set methods = new LinkedHashSet();
for (ServiceMethod method : mdl.getServiceMethods()) {
if (stripListFromType(method.getReturnValue().getType()).equalsIgnoreCase(xmlType.getName())) {
methods.add(method);
continue;
}
for (ServiceMethodParameter param : method.getParameters()) {
if (stripListFromType(param.getType()).equalsIgnoreCase(xmlType.getName())) {
methods.add(method);
break;
}
}
}
return methods;
}
private Set calcOtherXmlTypeUsages(XmlType xmlType) {
return calcOtherXmlTypeUsages(model, xmlType);
}
public static Set calcOtherXmlTypeUsages(ServiceContractModel mdl,
XmlType xmlType) {
Set xmlTypeNames = new LinkedHashSet();
for (MessageStructure ms : mdl.getMessageStructures()) {
if (ms.getType() == null) {
throw new NullPointerException(ms.getId() + " has no type set");
}
if (stripListFromType(ms.getType()).equalsIgnoreCase(xmlType.getName())) {
xmlTypeNames.add(ms.getXmlObject());
}
}
return xmlTypeNames;
}
private void writeMessageStructure(MessageStructure ms) {
writer.indentPrintln("");
writer.writeTag("td", "class=\"structSName\"", ms.getShortName());
writer.writeTag("td", "class=\"structLName\"", ms.getName());
XmlType subType = finder.findXmlType(this.stripListFromType(ms.getType()));
if (subType == null) {
// for (XmlType xmlt : model.getXmlTypes()) {
// System.out.println(this.getClass().getSimpleName() + ": "
// + xmlt.getName());
// }
// throw new NullPointerException(ms.getXmlObject() + "." + ms.getShortName()
// + " has type " + ms.getType()
// + " was not found in list of known types");
log.error (ms.getXmlObject() + "." + ms.getShortName()
+ " has type " + ms.getType()
+ " was not found in list of known types");
return;
}
if (subType.getPrimitive().equals(XmlType.COMPLEX)) {
writer.indentPrint("");
writer.indentPrintln(""
+ ms.getType() + "");
writer.indentPrint(" ");
} else {
writer.writeTag("td", "class=\"structType\"", ms.getType());
}
writer.writeTag("td", "class=\"structDesc\"", addHTMLBreaks(missingData(
calcDescription(ms))));
writer.writeTag("td", "class=\"structOpt\"", checkForNbsp(ms.getRequired()));
writer.writeTag("td", "class=\"structOpt\"", checkForNbsp(ms.getReadOnly()));
writer.writeTag("td", "class=\"structCard\"", ms.getCardinality());
writer.writeTag("td", "class=\"structAttr\"", ms.getXmlAttribute());
// writer.writeTag ("td", "class=\"structStatus\"", ms.getStatus ());
writer.writeTag("td", "class=\"commentsDesc\"", addHTMLBreaks(this.checkForNbsp(ms.getImplNotes())));
writer.indentPrintln(" ");
// writer.indentPrintln ("");
// writer.indentPrintln ("");
// writer.indentPrintln ("
");
}
private String calcDescription(MessageStructure ms) {
StringBuilder sb = new StringBuilder();
String newLine = "";
if (ms.getDescription() != null && !ms.getDescription().trim().isEmpty()) {
sb.append(newLine);
newLine = "\n";
sb.append(ms.getDescription());
}
if (ms.isDeprecated()) {
sb.append(newLine);
newLine = "\n";
sb.append("============== Deprecated ===============");
}
return sb.toString();
}
private String missingData(String str) {
if (str == null) {
return "???";
}
if (str.trim().isEmpty()) {
return "???";
}
return str;
}
private static String stripListFromType(String type) {
if (type.endsWith("List")) {
return type.substring(0, type.length() - "List".length());
}
return type;
}
public void writeStyleSheet() {
writer.indentPrintln("");
writer.indentPrintln("");
}
}