View Javadoc

1   /*
2    * Copyright 2011 The Kuali Foundation
3    *
4    * Licensed under the Educational Community License, Version 2.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.osedu.org/licenses/ECL-2.0
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.contract.model.util;
17  
18  import java.util.LinkedHashSet;
19  import java.util.List;
20  import java.util.Set;
21  
22  import org.kuali.student.contract.model.Service;
23  import org.kuali.student.contract.model.ServiceContractModel;
24  import org.kuali.student.contract.model.ServiceMethod;
25  import org.kuali.student.contract.model.ServiceMethodError;
26  import org.kuali.student.contract.model.ServiceMethodParameter;
27  import org.kuali.student.contract.model.XmlType;
28  import org.kuali.student.contract.writer.HtmlWriter;
29  
30  /**
31   *
32   * @author nwright
33   */
34  public class HtmlContractServiceWriter {
35  
36      private Service service;
37      private HtmlWriter writer;
38      private ServiceContractModel model;
39      private ModelFinder finder;
40  
41      public HtmlContractServiceWriter(Service service, String directory,
42              ServiceContractModel model) {
43          this.service = service;
44          this.writer = new HtmlWriter(directory, service.getName() + ".html",
45                  service.getName());
46          this.model = model;
47          this.finder = new ModelFinder(this.model);
48      }
49  
50      public void write() {
51          writer.print("<a href=\"index.html\">home</a>");
52          this.writeStyleSheet();
53          writer.writeTag("h1", service.getName());
54  
55          writer.indentPrintln("<table id=\"serviceMetaTable\">");
56          writer.indentPrintln("<tr>");
57          writer.writeTag("th", "class=h", "Name");
58          writer.writeTag("td", "id=serviceName colspan=2", service.getKey());
59          writer.indentPrintln("</tr>");
60          writer.indentPrintln("<tr>");
61          writer.writeTag("th", "class=h", "Version");
62          writer.writeTag("td", "id=serviceVersion colspan=2", service.getVersion());
63          writer.indentPrintln("</tr>");
64          writer.indentPrintln("<tr>");
65          writer.writeTag("th", "class=h", "Included Services");
66  
67          writer.writeTag("td", "id=serviceVersion colspan=2", calcIncludedServices(
68                  service.getIncludedServices()));
69          writer.indentPrintln("</tr>");
70  
71          writer.indentPrintln("</table>");
72  
73  //  writer.indentPrintln ("<div class=\"panel\" style=\"border-width: 1px;\">");
74  //  writer.indentPrintln ("<div class=\"panelHeader\" style=\"border-bottom-width: 1px;\">");
75          writer.indentPrintln("<p>");
76  //        writer.indentPrintln("<table id=\"serviceMetaTable\">");
77  //        writer.indentPrintln("<tr>");
78  //        writer.indentPrintln("<td>");
79          writer.indentPrintln(
80                  "<div class=\"panel\" style=\"background-color: rgb(255, 255, 255); border: 1px solid rgb(204, 204, 204);\">");
81            writer.indentPrintln(
82                  "<div class=\"panelHeader\" style=\"border-bottom: 1px solid rgb(204, 204, 204); background-color: rgb(238, 238, 238);\">");
83          writer.indentPrintln(this.addHTMLBreaks(service.getComments()));
84          writer.indentPrintln("</div>");
85          writer.indentPrintln("</div>");
86  //        writer.indentPrintln("</td>");
87  //        writer.indentPrintln("</tr>");
88  //        writer.indentPrintln("</table>");
89  
90  //  writer.indentPrintln ("</div>");
91  //  writer.indentPrintln ("</div>");
92  
93          writer.indentPrintln("<p>");
94          writer.indentPrintln(
95                  "<div class=\"panel\" style=\"background-color: rgb(255, 255, 255); border: 1px solid rgb(204, 204, 204);\">");
96          writer.indentPrintln(
97                  "<div class=\"panelHeader\" style=\"border-bottom: 1px solid rgb(204, 204, 204); background-color: rgb(238, 238, 238);\">");
98          writer.indentPrintln("<b><a name=\"ListOfOperations\"></a>Operations</b>");
99          writer.indentPrintln(
100                 "</div><div class=\"panelContent\" style=\"background-color: rgb(255, 255, 255);\">");
101         writer.indentPrintln("<ul>");
102         for (ServiceMethod method : finder.getServiceMethodsInService(
103                 service.getKey())) {
104             writer.indentPrint("<li>");
105             writer.print("<a href=\"#" + method.getService() + "-" + method.getName()
106                     + "\">" + method.getName() + "</a>");
107             writer.print("</li>");
108         }
109         writer.indentPrintln("</ul>");
110         writer.indentPrintln("</div>");
111         writer.indentPrintln("</div>");
112 
113         // now write out the root message structures
114         writer.indentPrintln(
115                 "<div class=\"panel\" style=\"background-color: rgb(255, 255, 255); border: 1px solid rgb(204, 204, 204);\">");
116         writer.indentPrintln(
117                 "<div class=\"panelHeader\" style=\"border-bottom: 1px solid rgb(204, 204, 204); background-color: rgb(238, 238, 238);\">");
118         writer.indentPrintln(
119                 "<b><a name=\"MainMessageStructures\"></a>Main Message Structures</b>");
120         writer.indentPrintln(
121                 "</div><div class=\"panelContent\" style=\"background-color: rgb(255, 255, 255);\">");
122 
123         writer.indentPrintln("<ul>");
124         for (XmlType type : this.calcMainMessageStructures()) {
125             writer.indentPrint("<li>");
126             writer.print("<a href=\"" + type.getName() + ".html"
127                     + "\">" + type.getName() + "</a>");
128             writer.print("</li>");
129         }
130         writer.indentPrintln("</ul>");
131 
132 
133         for (ServiceMethod method : finder.getServiceMethodsInService(
134                 service.getKey())) {
135             this.writeMethod(method);
136         }
137 
138         writer.writeHeaderBodyAndFooterOutToFile();
139     }
140 
141     private String calcIncludedServices(List<String> includedServices) {
142         if (includedServices == null) {
143             return "&nbsp;";
144         }
145         if (includedServices.isEmpty()) {
146             return "&nbsp;";
147         }
148         StringBuilder bldr = new StringBuilder();
149         String comma = "";
150         for (String includedService : includedServices) {
151             bldr.append(comma);
152             comma = ", ";
153             bldr.append("<a href=\"" + includedService + ".html"
154                     + "\">" + includedService + "</a>");
155         }
156         return bldr.toString();
157     }
158 
159     private Set<XmlType> calcMainMessageStructures() {
160         return calcMainMessageStructures(model, service.getKey());
161     }
162 
163     public static Set<XmlType> calcMainMessageStructures(ServiceContractModel mdl,
164             String serviceOptionaFilter) {
165         ModelFinder fndr = new ModelFinder(mdl);
166         Set<XmlType> types = new LinkedHashSet();
167         for (ServiceMethod method : mdl.getServiceMethods()) {
168             if (serviceOptionaFilter != null) {
169                 if (!method.getService().equalsIgnoreCase(serviceOptionaFilter)) {
170                     continue;
171                 }
172             }
173             XmlType type = fndr.findXmlType(stripListFromType(method.getReturnValue().getType()));
174             if (type != null) {
175                 if (type.getPrimitive().equalsIgnoreCase(XmlType.COMPLEX)) {
176                     types.add(type);
177                 }
178             }
179 
180             for (ServiceMethodParameter param : method.getParameters()) {
181                 type = fndr.findXmlType(stripListFromType(param.getType()));
182                 if (type != null) {
183                     if (type.getPrimitive().equalsIgnoreCase(XmlType.COMPLEX)) {
184                         types.add(type);
185                     }
186                 }
187                 break;
188             }
189         }
190         return types;
191     }
192 
193     private String addHTMLBreaks(String str) {
194         if (str == null) {
195             return "&nbsp;";
196         }
197         return str.replaceAll("(\r\n|\r|\n|\n\r)", "<br>");
198     }
199 
200     public void writeMethod(ServiceMethod method) {
201         writer.indentPrintln("<p>");
202         writer.indentPrintln("<a name=\"" + method.getService() + "-"
203                 + method.getName() + "\"></a>");
204         writer.indentPrintln("<p>");
205         writer.indentPrintln("<table class=\"methodTable\">");
206 
207         writer.indentPrintln("<tr>");
208         writer.writeTag("th", "class=h", "Method");
209         writer.writeTag("th", "class=h colspan=3 class=\"methodName\"",
210                 method.getName());
211         writer.indentPrintln("</tr>");
212 
213         writer.indentPrintln("<tr>");
214         writer.writeTag("th", "class=h", "Description");
215         writer.writeTag("td", "colspan=3 class=\"methodDesc\"",
216                 this.addHTMLBreaks(calcDescription(method)));
217         writer.indentPrintln("</tr>");
218 
219         if (method.getImplNotes() != null && !method.getImplNotes().isEmpty()) {
220             writer.indentPrintln("<tr>");
221             writer.writeTag("th", "class=h", "Implementation Notes");
222             writer.writeTag("td", "colspan=3 class=\"methodDesc\"",
223                     this.addHTMLBreaks(method.getImplNotes()));
224             writer.indentPrintln("</tr>");
225         }
226 
227         if (method.getParameters().isEmpty()) {
228             writer.indentPrintln("<tr>");
229             writer.writeTag("th", "class=h", "Parameters");
230             writer.writeTag("td", "class=\"methodParamType\"", "None");
231             writer.writeTag("td", "class=\"methodParamName\"", "None");
232             writer.writeTag("td", "class=\"methodParamDesc\"", "No Parameters");
233             writer.indentPrintln("</tr>");
234         } else {
235             boolean firstTime = true;
236             for (ServiceMethodParameter param : method.getParameters()) {
237                 writer.indentPrintln("<tr>");
238                 if (firstTime) {
239                     writer.writeTag("th", "class=h rowspan=" + method.getParameters().size(),
240                             "Parameters");
241                     firstTime = false;
242                 }
243                 writer.indentPrint("<td class=\"methodParamType\">");
244                 writer.indentPrintln("<a href=\"" + stripListFromType(param.getType())
245                         + ".html" + "\">"
246                         + param.getType() + "</a>");
247                 writer.indentPrint("</td>");
248                 writer.writeTag("td", "class=\"methodParamName\"", param.getName());
249                 writer.writeTag("td", "class=\"methodParamDesc\"", this.addHTMLBreaks(
250                         param.getDescription()));
251                 writer.indentPrintln("</tr>");
252             }
253         }
254         writer.indentPrintln("<tr>");
255         writer.writeTag("th", "class=h", "Return");
256         writer.indentPrint("<td colspan=2 class=\"methodReturnType\">");
257         writer.indentPrintln("<a href=\"" + stripListFromType(
258                 method.getReturnValue().getType())
259                 + ".html" + "\">"
260                 + method.getReturnValue().getType() + "</a>");
261         writer.indentPrint("</td>");
262         writer.writeTag("td", "class=\"methodReturnDesc\"",
263                 this.addHTMLBreaks(
264                 method.getReturnValue().getDescription()));
265         writer.indentPrintln("</tr>");
266         writer.indentPrintln("</tr>");
267 
268         if (method.getErrors().isEmpty()) {
269             writer.indentPrintln("<tr>");
270             writer.writeTag("th", "class=h", "Errors");
271             writer.writeTag("td", "class=\"methodErrorType\" colspan=2", "NONE");
272             writer.writeTag("td", "class=\"methodErrorDesc\"", "No Errors");
273             writer.indentPrintln("</tr>");
274         } else {
275             boolean firstTime = true;
276             for (ServiceMethodError error : method.getErrors()) {
277                 writer.indentPrintln("<tr>");
278                 if (firstTime) {
279                     writer.writeTag("th", "class=h rowspan=" + method.getErrors().size(),
280                             "Errors");
281                     firstTime = false;
282                 }
283                 writer.writeTag("td", "class=\"methodErrorType\" colspan=2",
284                         error.getType()); // TODO wrap in link to type
285                 writer.writeTag("td", "class=\"methodErrorDesc\"", this.addHTMLBreaks(
286                         error.getDescription()));
287                 writer.indentPrintln("</tr>");
288             }
289         }
290         writer.indentPrintln("</table>");
291         writer.indentPrintln("<p>");
292         writer.indentPrintln("<a href=\"#ListOfOperations\">Back to Operations</a>");
293         writer.indentPrintln("<p>");
294     }
295 
296     private String calcDescription(ServiceMethod method) {
297         StringBuilder sb = new StringBuilder();
298         String newLine = "";
299         if (method.getDescription() != null && !method.getDescription().trim().isEmpty()) {
300             sb.append(newLine);
301             newLine = "\n";
302             sb.append(method.getDescription());
303         }
304         if (method.isDeprecated()) {
305             sb.append(newLine);
306             newLine = "\n";
307             sb.append("============== Deprecated ===============");
308         }
309         return sb.toString();
310     }
311 
312     private static String stripListFromType(String type) {
313         if (type.endsWith("List")) {
314             return type.substring(0, type.length() - "List".length());
315         }
316         return type;
317     }
318 
319     public void writeStyleSheet() {
320         writer.indentPrintln("<style type=\"text/css\">");
321         writer.indentPrintln("");
322         writer.indentPrintln("table#serviceMetaTable {");
323         writer.indentPrintln("border-collapse:collapse;");
324         writer.indentPrintln("border:1px solid #000000;");
325         writer.indentPrintln("width:95%;");
326         writer.indentPrintln("}");
327         writer.indentPrintln("table#serviceMetaTable th.h {");
328         writer.indentPrintln("border:1px solid #000000;");
329         writer.indentPrintln("background-color:#eeeeee;");
330         writer.indentPrintln("width:15%;");
331         writer.indentPrintln("}");
332         writer.indentPrintln("table#serviceMetaTable td#serviceName {");
333         writer.indentPrintln("border:1px solid #000000;");
334         writer.indentPrintln("width:85%;");
335         writer.indentPrintln("}");
336         writer.indentPrintln("table#serviceMetaTable td#serviceVersion {");
337         writer.indentPrintln("border:1px solid #000000;");
338         writer.indentPrintln("width:70%;");
339         writer.indentPrintln("}");
340         writer.indentPrintln("table#serviceMetaTable td#serviceVersionHistory {");
341         writer.indentPrintln("border:1px solid #000000;");
342         writer.indentPrintln("width:15%;");
343         writer.indentPrintln("}");
344         writer.indentPrintln("");
345         writer.indentPrintln("</style>");
346 
347 
348         writer.indentPrintln("<style type=\"text/css\">");
349         writer.indentPrintln("");
350         writer.indentPrintln("table.methodTable {");
351         writer.indentPrintln("border-collapse:collapse;");
352         writer.indentPrintln("border:1px solid #000000;");
353         writer.indentPrintln("width:95%;");
354         writer.indentPrintln("}");
355         writer.indentPrintln("");
356         writer.indentPrintln("table.methodTable td.d {");
357         writer.indentPrintln("border:1px solid #000000;");
358         writer.indentPrintln("}");
359         writer.indentPrintln("");
360         writer.indentPrintln("table.methodTable th.h {");
361         writer.indentPrintln("border:1px solid #000000;");
362         writer.indentPrintln("background-color:#eeeeee;");
363         writer.indentPrintln("width:15%;");
364         writer.indentPrintln("}");
365         writer.indentPrintln("");
366         writer.indentPrintln("table.methodTable td.methodName {");
367         writer.indentPrintln("border:1px solid #000000;");
368         writer.indentPrintln("background-color:#f2f2f2;");
369         writer.indentPrintln("color:#222222;");
370         writer.indentPrintln("text-align:center;");
371         writer.indentPrintln("width:85%;");
372         writer.indentPrintln("font-weight:bold;");
373         writer.indentPrintln("font-style:italic;");
374         writer.indentPrintln("}");
375         writer.indentPrintln("");
376         writer.indentPrintln("table.methodTable td.methodDesc {");
377         writer.indentPrintln("border:1px solid #000000;");
378         writer.indentPrintln("width:85%;");
379         writer.indentPrintln("}");
380         writer.indentPrintln("");
381         writer.indentPrintln("table.methodTable td.methodParamType {");
382         writer.indentPrintln("border:1px solid #000000;");
383         writer.indentPrintln("width:21%;");
384         writer.indentPrintln("font-style:italic;");
385         writer.indentPrintln("}");
386         writer.indentPrintln("table.methodTable td.methodParamName {");
387         writer.indentPrintln("border:1px solid #000000;");
388         writer.indentPrintln("width:21%;");
389         writer.indentPrintln("}");
390         writer.indentPrintln("table.methodTable td.methodParamDesc {");
391         writer.indentPrintln("border:1px solid #000000;");
392         writer.indentPrintln("width:43%;");
393         writer.indentPrintln("}");
394         writer.indentPrintln("table.methodTable td.methodReturnType {");
395         writer.indentPrintln("border:1px solid #000000;");
396         writer.indentPrintln("width:42%;");
397         writer.indentPrintln("font-style:italic;");
398         writer.indentPrintln("}");
399         writer.indentPrintln("");
400         writer.indentPrintln("table.methodTable td.methodReturnDesc {");
401         writer.indentPrintln("border:1px solid #000000;");
402         writer.indentPrintln("width:43%;");
403         writer.indentPrintln("}");
404         writer.indentPrintln("");
405         writer.indentPrintln("table.methodTable td.methodErrors {");
406         writer.indentPrintln("border:1px solid #000000;");
407         writer.indentPrintln("width:85%;");
408         writer.indentPrintln("}");
409         writer.indentPrintln("");
410         writer.indentPrintln("");
411         writer.indentPrintln("table.methodTable td.methodErrorType {");
412         writer.indentPrintln("border:1px solid #000000;");
413         writer.indentPrintln("width:42%;");
414         writer.indentPrintln("font-style:italic;");
415         writer.indentPrintln("}");
416         writer.indentPrintln("table.methodTable td.methodErrorDesc {");
417         writer.indentPrintln("border:1px solid #000000;");
418         writer.indentPrintln("width:43%;");
419         writer.indentPrintln("}");
420         writer.indentPrintln("");
421         writer.indentPrintln("table.methodTable td.capabilityDesc {");
422         writer.indentPrintln("border:1px solid #000000;");
423         writer.indentPrintln("background:#ffffff;");
424         writer.indentPrintln("}");
425         writer.indentPrintln("");
426         writer.indentPrintln("table.methodTable td.usecaseDesc {");
427         writer.indentPrintln("border:1px solid #000000;");
428         writer.indentPrintln("background:#ffffff;");
429         writer.indentPrintln("}");
430         writer.indentPrintln("");
431         writer.indentPrintln("table.methodTable td.commentsDesc {");
432         writer.indentPrintln("border:1px solid #000000;");
433         writer.indentPrintln("background:#ffffff;");
434         writer.indentPrintln("}");
435         writer.indentPrintln("</style>");
436 
437     }
438 }