1   
2   
3   
4   
5   
6   
7   
8   
9   
10  
11  
12  
13  
14  
15  
16  package org.kuali.student.contract.writer.service;
17  
18  import java.util.HashSet;
19  import java.util.List;
20  import java.util.Set;
21  
22  import org.kuali.student.contract.model.MessageStructure;
23  import org.kuali.student.contract.model.ServiceContractModel;
24  import org.kuali.student.contract.model.ServiceMethod;
25  import org.kuali.student.contract.model.ServiceMethodParameter;
26  import org.kuali.student.contract.model.ServiceMethodReturnValue;
27  import org.kuali.student.contract.model.XmlType;
28  import org.kuali.student.contract.model.impl.ServiceContractModelPescXsdLoader;
29  import org.kuali.student.contract.model.util.ModelFinder;
30  import org.kuali.student.contract.model.validation.DictionaryValidationException;
31  import org.slf4j.Logger;
32  import org.slf4j.LoggerFactory;
33  
34  
35  
36  
37  
38  public class PureJavaInfcWriterForOneService {
39      
40      private static Logger log = LoggerFactory.getLogger(PureJavaInfcWriterForOneService.class);
41  
42      private ServiceContractModel model;
43      private ModelFinder finder;
44      private String directory;
45      private String rootPackage;
46      private String servKey;
47  
48      public PureJavaInfcWriterForOneService(ServiceContractModel model,
49              String directory,
50              String rootPackage,
51              String servKey) {
52          this.model = model;
53          this.finder = new ModelFinder(model);
54          this.directory = directory;
55          this.rootPackage = rootPackage;
56          this.servKey = servKey;
57      }
58  
59      
60  
61  
62  
63      public void write() {
64          List<ServiceMethod> methods = finder.getServiceMethodsInService(servKey);
65          if (methods.size() == 0) {
66              log.warn("No methods defined for servKey: " + servKey);
67              return;
68          }
69  
70          
71          log.info("Generating servKeys API's for " + servKey);
72          new PureJavaInfcServiceWriter(model, directory, rootPackage, servKey, methods).write();
73  
74          
75          log.info("Generating info interfaces");
76          for (XmlType xmlType : getXmlTypesUsedJustByService()) {
77              log.info("Generating Beans for " + xmlType.getName());
78              new PureJavaInfcBeanWriter(model, directory, rootPackage, servKey, xmlType).write();
79          }
80  
81          
82          log.info("Generating Info interfaces");
83          for (XmlType xmlType : getXmlTypesUsedJustByService()) {
84              log.info("Generating info interface for " + xmlType.getName());
85              new PureJavaInfcInfcWriter(model, directory, rootPackage, servKey, xmlType).write();
86          }
87      }
88  
89      private Set<XmlType> getXmlTypesUsedJustByService() {
90          Set<XmlType> set = new HashSet();
91          for (XmlType type : model.getXmlTypes()) {
92              if (type.getService().equalsIgnoreCase(servKey)) {
93                  if (type.getPrimitive().equalsIgnoreCase(XmlType.COMPLEX)) {
94                      set.add(type);
95                  }
96              }
97          }
98          return set;
99      }
100 
101     private Set<XmlType> getXmlTypesUsedByService(List<ServiceMethod> methods) {
102         Set<XmlType> set = new HashSet();
103         for (ServiceMethod method : methods) {
104             if (method.getReturnValue() != null) {
105                 ServiceMethodReturnValue ret = method.getReturnValue();
106                 XmlType xmlType = finder.findXmlType(stripListFromType(ret.getType()));
107                 if (xmlType == null) {
108                     throw new DictionaryValidationException("Method " + method.getService()
109                             + "." + method.getName()
110                             + "returns an unknown type, "
111                             + ret.getType());
112                 }
113                 addTypeAndAllSubTypes(set, xmlType);
114             }
115             for (ServiceMethodParameter param : method.getParameters()) {
116                 XmlType xmlType = finder.findXmlType(stripListFromType(param.getType()));
117                 if (xmlType == null) {
118                     throw new DictionaryValidationException("Parameter "
119                             + method.getService() + "."
120                             + method.getName() + "."
121                             + param.getName()
122                             + "has an unknown type, "
123                             + param.getType());
124                 }
125                 addTypeAndAllSubTypes(set, xmlType);
126             }
127         }
128         return set;
129     }
130 
131     private void addTypeAndAllSubTypes(Set<XmlType> set, XmlType xmlType) {
132         if (xmlType.getPrimitive().equalsIgnoreCase(XmlType.COMPLEX)) {
133             if (set.add(xmlType)) {
134                 addXmlTypesUsedByMessageStructure(set, xmlType);
135             }
136         }
137     }
138 
139     private String stripListFromType(String type) {
140         if (type.endsWith("List")) {
141             type = type.substring(0, type.length() - "List".length());
142         }
143         return type;
144     }
145 
146     private void addXmlTypesUsedByMessageStructure(Set<XmlType> set,
147             XmlType xmlType) {
148         ModelFinder finder = new ModelFinder(model);
149         for (MessageStructure ms : finder.findMessageStructures(xmlType.getName())) {
150             XmlType subType = finder.findXmlType(stripListFromType(ms.getType()));
151             if (subType == null) {
152                 throw new DictionaryValidationException("MessageStructure field "
153                         + ms.getId()
154                         + " has an unknown type, "
155                         + ms.getType());
156             }
157             addTypeAndAllSubTypes(set, subType);
158         }
159     }
160 }