001 /*
002 * Copyright 2009 The Kuali Foundation
003 *
004 * Licensed under the Educational Community License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 * http://www.osedu.org/licenses/ECL-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 */
016 package org.kuali.student.contract.writer.service;
017
018 import java.util.*;
019 import org.kuali.student.contract.model.*;
020 import org.kuali.student.contract.model.util.ModelFinder;
021 import org.kuali.student.contract.writer.JavaClassWriter;
022
023 /**
024 *
025 * @author nwright
026 */
027 public class MockImplServiceWriter extends JavaClassWriter {
028
029 private ServiceContractModel model;
030 private ModelFinder finder;
031 private String directory;
032 private String rootPackage;
033 private String servKey;
034 private List<ServiceMethod> methods;
035 private boolean isR1;
036
037 public MockImplServiceWriter(ServiceContractModel model,
038 String directory,
039 String rootPackage,
040 String servKey,
041 List<ServiceMethod> methods,
042 boolean isR1) {
043 super(directory, calcPackage(servKey, rootPackage), calcClassName(servKey));
044 this.model = model;
045 this.finder = new ModelFinder(model);
046 this.directory = directory;
047 this.rootPackage = rootPackage;
048 this.servKey = servKey;
049 this.methods = methods;
050 this.isR1 = isR1;
051 }
052
053 public static String calcPackage(String servKey, String rootPackage) {
054 String pack = rootPackage + ".";
055 // String pack = rootPackage + "." + servKey.toLowerCase() + ".";
056 // StringBuffer buf = new StringBuffer (service.getVersion ().length ());
057 // for (int i = 0; i < service.getVersion ().length (); i ++)
058 // {
059 // char c = service.getVersion ().charAt (i);
060 // c = Character.toLowerCase (c);
061 // if (Character.isLetter (c))
062 // {
063 // buf.append (c);
064 // continue;
065 // }
066 // if (Character.isDigit (c))
067 // {
068 // buf.append (c);
069 // }
070 // }
071 // pack = pack + buf.toString ();
072 pack = pack + "service.impl.mock";
073 return pack;
074 }
075
076 public static String calcClassName(String servKey) {
077 return GetterSetterNameCalculator.calcInitUpper(servKey + "ServiceMockImpl");
078 }
079
080 public static String calcServiceInterfaceClassName(String servKey) {
081 return GetterSetterNameCalculator.calcInitUpper(servKey + "Service");
082 }
083
084 private static enum MethodType {
085
086 VALIDATE,
087 CREATE,
088 CREATE_BULK,
089 ADD,
090 UPDATE,
091 UPDATE_OTHER,
092 DELETE,
093 REMOVE,
094 DELETE_OTHER,
095 GET_CREATE,
096 GET_BY_ID,
097 GET_BY_IDS,
098 GET_IDS_BY_TYPE,
099 GET_IDS_BY_OTHER,
100 GET_INFOS_BY_OTHER,
101 GET_TYPE,
102 GET_TYPES,
103 UNKNOWN
104 };
105
106 private MethodType calcMethodType(ServiceMethod method) {
107 if (method.getName().startsWith("validate")) {
108 return MethodType.VALIDATE;
109 }
110 if (method.getName().startsWith("create")) {
111 if (this.findInfoParameter(method) != null) {
112 return MethodType.CREATE;
113 }
114 return MethodType.CREATE_BULK;
115 }
116 if (method.getName().startsWith("add")) {
117 return MethodType.ADD;
118 }
119 if (method.getName().startsWith("update")) {
120 if (this.findInfoParameter(method) != null) {
121 return MethodType.UPDATE;
122 }
123 return MethodType.UPDATE_OTHER;
124 }
125 if (method.getName().startsWith("delete")) {
126 if (method.getName().contains("By")) {
127 if (!method.getName().startsWith("deleteBy")) {
128 return MethodType.DELETE_OTHER;
129 }
130 }
131 if (method.getName().contains("For")) {
132 if (!method.getName().startsWith("deleteFor")) {
133 return MethodType.DELETE_OTHER;
134 }
135 }
136 return MethodType.DELETE;
137 }
138 if (method.getName().startsWith("remove")) {
139 return MethodType.REMOVE;
140 }
141
142 if (method.getName().startsWith("getCreate")) {
143 return MethodType.GET_CREATE;
144 }
145 if (method.getName().startsWith("get")) {
146 if (method.getName().endsWith("ByIds")) {
147 return MethodType.GET_BY_IDS;
148 }
149 if (method.getName().endsWith("ByType")) {
150 return MethodType.GET_IDS_BY_TYPE;
151 }
152 if (method.getReturnValue().getType().endsWith("TypeInfo")) {
153 return MethodType.GET_TYPE;
154 }
155 if (method.getReturnValue().getType().endsWith("TypeInfoList")) {
156 return MethodType.GET_TYPES;
157 }
158 if (method.getName().endsWith("ByType")) {
159 return MethodType.GET_IDS_BY_TYPE;
160 }
161 if (method.getParameters().size() >= 1 && method.getParameters().size() <= 2) {
162 if (!method.getReturnValue().getType().endsWith("List")) {
163 if (method.getParameters().get(0).getName().endsWith("Id")) {
164 return MethodType.GET_BY_ID;
165 }
166 }
167 }
168 if (method.getName().contains("By")) {
169 if (method.getReturnValue().getType().equals("StringList")) {
170 return MethodType.GET_IDS_BY_OTHER;
171 }
172 if (method.getReturnValue().getType().endsWith("InfoList")) {
173 return MethodType.GET_INFOS_BY_OTHER;
174 }
175 }
176 }
177
178 return MethodType.UNKNOWN;
179 }
180
181 /**
182 * Write out the entire file
183 *
184 * @param out
185 */
186 public void write() {
187 indentPrint("public class " + calcClassName(servKey));
188 println(" implements " + calcServiceInterfaceClassName(servKey));
189 Service serv = finder.findService(servKey);
190 importsAdd(serv.getImplProject() + "." + serv.getName());
191 openBrace();
192 for (ServiceMethod method : methods) {
193 MethodType methodType = calcMethodType(method);
194 switch (methodType) {
195 case CREATE:
196 case ADD:
197 case GET_TYPE:
198 writeCacheVariable(method);
199 }
200 indentPrintln("");
201 // indentPrintln("/**");
202 // indentPrintWrappedComment(method.getDescription());
203 // indentPrintln("* ");
204 // for (ServiceMethodParameter param : method.getParameters()) {
205 // indentPrintWrappedComment("@param " + param.getName() + " - "
206 // + param.getType() + " - "
207 // + param.getDescription());
208 // }
209 // indentPrintWrappedComment("@return " + method.getReturnValue().
210 // getDescription());
211 // indentPrintln("*/");
212 indentPrintln("@Override");
213 String type = method.getReturnValue().getType();
214 String realType = stripList(type);
215 indentPrint("public " + calcType(type, realType) + " " + method.getName()
216 + "(");
217 // now do parameters
218 String comma = "";
219 for (ServiceMethodParameter param : method.getParameters()) {
220 type = param.getType();
221 realType = stripList(type);
222 print(comma);
223 print(calcType(type, realType));
224 print(" ");
225 print(param.getName());
226 comma = ", ";
227 }
228 println(")");
229 // now do exceptions
230 comma = "throws ";
231 incrementIndent();
232 for (ServiceMethodError error : method.getErrors()) {
233 indentPrint(comma);
234 String exceptionClassName = calcExceptionClassName(error);
235 String exceptionPackageName = this.calcExceptionPackageName(error);
236 println(exceptionClassName);
237 this.importsAdd(exceptionPackageName + "." + exceptionClassName);
238 comma = " ,";
239 }
240 decrementIndent();
241 openBrace();
242 switch (methodType) {
243 case VALIDATE:
244 writeValidate(method);
245 break;
246 case CREATE:
247 writeCreate(method);
248 break;
249 case ADD:
250 writeAdd(method);
251 break;
252 case UPDATE:
253 writeUpdate(method);
254 break;
255 case DELETE:
256 writeDelete(method);
257 break;
258 case REMOVE:
259 writeRemove(method);
260 break;
261 case GET_BY_ID:
262 writeGetById(method);
263 break;
264 case GET_BY_IDS:
265 writeGetByIds(method);
266 break;
267 case GET_IDS_BY_TYPE:
268 writeGetIdsByType(method);
269 break;
270 case GET_IDS_BY_OTHER:
271 writeGetIdsByOther(method);
272 break;
273 case GET_INFOS_BY_OTHER:
274 writeGetInfosByOther(method);
275 break;
276 case GET_TYPE:
277 writeGetType(method);
278 break;
279 case GET_TYPES:
280 writeGetTypes(method);
281 break;
282 default:
283 writeThrowsNotImplemented(method);
284 }
285 closeBrace();
286 }
287
288 writeBoilerPlate();
289 closeBrace();
290
291 this.writeJavaClassAndImportsOutToFile();
292 this.getOut().close();
293 }
294
295 private void writeThrowsNotImplemented(ServiceMethod method) {
296 indentPrintln("throw new OperationFailedException (\"" + method.getName() + " has not been implemented\");");
297 }
298
299 private String initLower(String str) {
300 return str.substring(0, 1).toLowerCase() + str.substring(1);
301 }
302
303 private void writeBoilerPlate() {
304 indentPrintln("");
305 indentPrintln("private StatusInfo newStatus() {");
306 indentPrintln(" StatusInfo status = new StatusInfo();");
307 indentPrintln(" status.setSuccess(Boolean.TRUE);");
308 indentPrintln(" return status;");
309 indentPrintln("}");
310 if (isR1) {
311 this.writeBoilerPlateR1();
312 } else {
313 this.writeBoilerPlateR2();
314 }
315
316 }
317
318 private void writeBoilerPlateR1() {
319 importsAdd("org.kuali.student.common.dto.MetaInfo");
320 indentPrintln("");
321
322 indentPrintln("private MetaInfo newMeta() {");
323 indentPrintln(" MetaInfo meta = new MetaInfo();");
324 indentPrintln(" meta.setCreateId(\"MOCKUSER\");");
325 importsAdd(Date.class.getName());
326 indentPrintln(" meta.setCreateTime(new Date());");
327 indentPrintln(" meta.setUpdateId(\"MOCKUSER\");");
328 indentPrintln(" meta.setUpdateTime(meta.getCreateTime());");
329 indentPrintln(" meta.setVersionInd(\"0\");");
330 indentPrintln(" return meta;");
331 indentPrintln("}");
332 indentPrintln("");
333 indentPrintln("private MetaInfo updateMeta(MetaInfo meta) {");
334 indentPrintln(" meta.setUpdateId(\"MOCKUSER\");");
335 indentPrintln(" meta.setUpdateTime(new Date());");
336 indentPrintln(" meta.setVersionInd((Integer.parseInt(meta.getVersionInd()) + 1) + \"\");");
337 indentPrintln(" return meta;");
338 indentPrintln("}");
339 indentPrintln("");
340
341 }
342
343 private void writeBoilerPlateR2() {
344 importsAdd("org.kuali.student.r2.common.dto.MetaInfo");
345 indentPrintln("");
346
347 indentPrintln("private MetaInfo newMeta(ContextInfo context) {");
348 indentPrintln(" MetaInfo meta = new MetaInfo();");
349 indentPrintln(" meta.setCreateId(context.getPrincipalId());");
350 importsAdd(Date.class.getName());
351 indentPrintln(" meta.setCreateTime(new Date());");
352 indentPrintln(" meta.setUpdateId(context.getPrincipalId());");
353 indentPrintln(" meta.setUpdateTime(meta.getCreateTime());");
354 indentPrintln(" meta.setVersionInd(\"0\");");
355 indentPrintln(" return meta;");
356 indentPrintln("}");
357 indentPrintln("");
358 indentPrintln("private MetaInfo updateMeta(MetaInfo old, ContextInfo context) {");
359 indentPrintln(" MetaInfo meta = new MetaInfo(old);");
360 indentPrintln(" meta.setUpdateId(context.getPrincipalId());");
361 indentPrintln(" meta.setUpdateTime(new Date());");
362 indentPrintln(" meta.setVersionInd((Integer.parseInt(meta.getVersionInd()) + 1) + \"\");");
363 indentPrintln(" return meta;");
364 indentPrintln("}");
365 indentPrintln("");
366
367 }
368
369 private void writeValidate(ServiceMethod method) {
370 indentPrintln("// validate");
371 indentPrintln("return new ArrayList<ValidationResultInfo> ();");
372
373
374 this.importsAdd(ArrayList.class.getName());
375 }
376
377 private void writeCacheVariable(ServiceMethod method) {
378 indentPrintln("// cache variable ");
379 String objectName = calcObjectName(method);
380 String mapName = calcMapName(method);
381 indentPrintln("// The LinkedHashMap is just so the values come back in a predictable order");
382 indentPrintln("private Map<String, " + objectName + "Info> " + mapName + " = new LinkedHashMap<String, " + objectName + "Info>();");
383 importsAdd(Map.class.getName());
384 importsAdd(LinkedHashMap.class.getName());
385 }
386
387 private void writeCreate(ServiceMethod method) {
388 indentPrintln("// create ");
389 ServiceMethodParameter typeParam = this.findTypeParameter(method);
390 ServiceMethodParameter infoParam = this.findInfoParameter(method);
391 ServiceMethodParameter contextParam = this.findContextParameter(method);
392 String objectName = calcObjectName(method);
393 String infoName = objectName + "Info";
394 String mapName = calcMapName(method);
395
396 if (typeParam != null) {
397 indentPrintln("if (!" + typeParam.getName() + ".equals (" + infoParam.getName() + ".getTypeKey())) {");
398 indentPrintln(" throw new InvalidParameterException (\"The type parameter does not match the type on the info object\");");
399 indentPrintln("}");
400 }
401 if (method.getParameters().size() > 3) {
402 indentPrintln("// TODO: check the rest of the readonly fields that are specified on the create to make sure they match the info object");
403 }
404 if (isR1) {
405 indentPrintln("// don't have deep copy in R1 contracts so just use the object");
406 indentPrintln(infoName + " copy = " + infoParam.getName() + ";");
407 } else {
408 indentPrintln(infoName + " copy = new " + infoName + "(" + infoParam.getName() + ");");
409 }
410 indentPrintln("if (copy.getId() == null) {");
411 indentPrintln(" copy.setId(" + mapName + ".size() + \"\");");
412 indentPrintln("}");
413 if (contextParam != null) {
414 indentPrintln("copy.setMeta(newMeta(" + contextParam.getName() + "));");
415 }
416 indentPrintln(mapName + ".put(copy.getId(), copy);");
417 if (isR1) {
418 indentPrintln("return copy;");
419 } else {
420 indentPrintln("return new " + infoName + "(copy);");
421 }
422 }
423
424 private void writeAdd(ServiceMethod method) {
425 indentPrintln("// Add ");
426 ServiceMethodParameter typeParam = this.findTypeParameter(method);
427 ServiceMethodParameter infoParam = this.findInfoParameter(method);
428 ServiceMethodParameter contextParam = this.findContextParameter(method);
429 String objectName = calcObjectName(method);
430 String infoName = objectName + "Info";
431 String mapName = calcMapName(method);
432
433 if (typeParam != null) {
434 indentPrintln("if (!" + typeParam.getName() + ".equals (" + infoParam.getName() + ".getTypeKey())) {");
435 indentPrintln(" throw new InvalidParameterException (\"The type parameter does not match the type on the info object\");");
436 indentPrintln("}");
437 }
438 if (method.getParameters().size() > 3) {
439 indentPrintln("// TODO: check the rest of the readonly fields that are specified on the create to make sure they match the info object");
440 }
441 if (isR1) {
442 indentPrintln("// don't have deep copy in R1 contracts so just use the object");
443 indentPrintln(infoName + " copy = " + infoParam.getName() + ";");
444 } else {
445 indentPrintln(infoName + " copy = new " + infoName + "(" + infoParam.getName() + ");");
446 }
447 indentPrintln("if (copy.getId() == null) {");
448 indentPrintln(" copy.setId(" + mapName + ".size() + \"\");");
449 indentPrintln("}");
450 if (contextParam != null) {
451 indentPrintln("copy.setMeta(newMeta(" + contextParam.getName() + "));");
452 }
453 indentPrintln(mapName + ".put(copy.getId(), copy);");
454 if (isR1) {
455 indentPrintln("return copy;");
456 } else {
457 indentPrintln("return new " + infoName + "(copy);");
458 }
459 }
460
461 private ServiceMethodParameter findIdParameter(ServiceMethod method) {
462 String idFieldName = calcObjectName(method) + "Id";
463 for (ServiceMethodParameter parameter : method.getParameters()) {
464 if (parameter.getType().equals("String")) {
465 if (parameter.getName().equals(idFieldName)) {
466 return parameter;
467 }
468 }
469 }
470
471 // if only one parameter and it is a string then grab that
472 if (method.getParameters().size() == 1) {
473 for (ServiceMethodParameter parameter : method.getParameters()) {
474 if (parameter.getType().equals("String")) {
475 return parameter;
476 }
477 }
478 }
479 // can't find name exactly
480 for (ServiceMethodParameter parameter : method.getParameters()) {
481 if (parameter.getType().equals("String")) {
482 if (parameter.getName().endsWith("Id")) {
483 return parameter;
484 }
485 }
486 }
487 // can't find name exactly try key
488 for (ServiceMethodParameter parameter : method.getParameters()) {
489 if (parameter.getType().equals("String")) {
490 if (!parameter.getName().endsWith("TypeKey")) {
491 if (parameter.getName().endsWith("Key")) {
492 return parameter;
493 }
494 }
495 }
496 }
497 System.out.println ("Could not find the Id paramter for " + method.getService() + "." + method.getName() + " so returning the first one");
498 return method.getParameters().get(0);
499 }
500
501 private ServiceMethodParameter findContextParameter(ServiceMethod method) {
502 for (ServiceMethodParameter parameter : method.getParameters()) {
503 if (parameter.getType().equals("ContextInfo")) {
504 return parameter;
505 }
506 }
507 return null;
508 }
509
510 private ServiceMethodParameter findInfoParameter(ServiceMethod method) {
511 String objectName = calcObjectName(method) + "Info";
512 for (ServiceMethodParameter parameter : method.getParameters()) {
513 if (parameter.getType().equals(objectName)) {
514 return parameter;
515 }
516 }
517 if (method.getParameters().size() >= 1) {
518 return method.getParameters().get(0);
519 }
520 return null;
521 }
522
523 private ServiceMethodParameter findTypeParameter(ServiceMethod method) {
524 for (ServiceMethodParameter parameter : method.getParameters()) {
525 if (parameter.getType().equals("String")) {
526 if (parameter.getName().endsWith("TypeKey")) {
527 return parameter;
528 }
529 if (parameter.getName().endsWith("Type")) {
530 return parameter;
531 }
532 }
533 }
534 return null;
535 }
536
537 private String calcMapName(ServiceMethod method) {
538 String mapName = this.calcObjectName(method);
539 mapName = this.initLower(mapName) + "Map";
540 return mapName;
541 }
542
543 private String calcObjectName(ServiceMethod method) {
544 if (method.getName().startsWith("create")) {
545 return method.getName().substring("create".length());
546 }
547 if (method.getName().startsWith("update")) {
548 return method.getName().substring("update".length());
549 }
550 if (method.getName().startsWith("validate")) {
551 return method.getName().substring("validate".length());
552 }
553 if (method.getName().startsWith("delete")) {
554 return method.getName().substring("delete".length());
555 }
556 if (method.getName().startsWith("get")) {
557 if (method.getReturnValue().getType().equals("StringList")) {
558 if (method.getName().contains("IdsBy")) {
559 return method.getName().substring("get".length(),
560 method.getName().indexOf("IdsBy"));
561 }
562 if (method.getName().contains("IdsFor")) {
563 return method.getName().substring("get".length(),
564 method.getName().indexOf("IdsFor"));
565 }
566 return method.getName().substring("get".length());
567 }
568 String name = method.getReturnValue().getType();
569 if (name.endsWith("List")) {
570 name = name.substring(0, name.length() - "List".length());
571 }
572 if (name.endsWith("Info")) {
573 name = name.substring(0, name.length() - "Info".length());
574 }
575 return name;
576 }
577 if (method.getName().startsWith("add")) {
578 return method.getName().substring("add".length());
579 }
580 if (method.getName().startsWith("remove")) {
581 return method.getName().substring("remove".length());
582 }
583
584 throw new IllegalArgumentException(method.getName());
585 }
586
587 private void writeUpdate(ServiceMethod method) {
588 indentPrintln("// update");
589 ServiceMethodParameter idParam = this.findIdParameter(method);
590 ServiceMethodParameter infoParam = this.findInfoParameter(method);
591 ServiceMethodParameter contextParam = this.findContextParameter(method);
592 if (infoParam == null) {
593 throw new NullPointerException(method.getName());
594 }
595 String objectName = calcObjectName(method);
596 String infoName = objectName + "Info";
597 String mapName = calcMapName(method);
598 if (idParam != null) {
599 indentPrintln("if (!" + idParam.getName() + ".equals (" + infoParam.getName() + ".getId())) {");
600 indentPrintln(" throw new InvalidParameterException (\"The id parameter does not match the id on the info object\");");
601 indentPrintln("}");
602 }
603 if (isR1) {
604 indentPrintln("// don't have deep copy in R1 contracts so just use the object");
605 indentPrintln(infoName + " copy = " + infoParam.getName() + ";");
606 } else {
607 indentPrintln(infoName + " copy = new " + infoName + "(" + infoParam.getName() + ");");
608 }
609 if (contextParam != null) {
610 indentPrintln(infoName + " old = this.get" + objectName + "(" + infoParam.getName() + ".getId(), " + contextParam.getName() + ");");
611 } else {
612 indentPrintln(infoName + " old = this.get" + objectName + "(" + infoParam.getName() + ".getId());");
613 }
614 if (isR1) {
615 indentPrintln("if (!old.getMetaInfo().getVersionInd().equals(copy.getMetaInfo().getVersionInd())) {");
616 indentPrintln(" throw new VersionMismatchException(old.getMetaInfo().getVersionInd());");
617 indentPrintln("}");
618 if (contextParam != null) {
619 indentPrintln("copy.setMeta(updateMeta(copy.getMetaInfo()));");
620 }
621 } else {
622 indentPrintln("if (!old.getMeta().getVersionInd().equals(copy.getMeta().getVersionInd())) {");
623 indentPrintln(" throw new VersionMismatchException(old.getMeta().getVersionInd());");
624 indentPrintln("}");
625 if (contextParam != null) {
626 indentPrintln("copy.setMeta(updateMeta(copy.getMeta(), " + contextParam.getName() + "));");
627 }
628 }
629 indentPrintln("this." + mapName + " .put(" + infoParam.getName() + ".getId(), copy);");
630 if (isR1) {
631 indentPrintln("return copy;");
632 } else {
633 indentPrintln("return new " + infoName + "(copy);");
634 }
635
636 }
637
638 private void writeDelete(ServiceMethod method) {
639 ServiceMethodParameter idParam = this.findIdParameter(method);
640 String mapName = calcMapName(method);
641 indentPrintln("if (this." + mapName + ".remove(" + idParam.getName() + ") == null) {");
642 indentPrintln(" throw new DoesNotExistException(" + idParam.getName() + ");");
643 indentPrintln("}");
644 indentPrintln("return newStatus();");
645 }
646
647 private void writeRemove(ServiceMethod method) {
648 ServiceMethodParameter idParam = this.findIdParameter(method);
649 String mapName = calcMapName(method);
650 indentPrintln("if (this." + mapName + ".remove(" + idParam.getName() + ") == null) {");
651 indentPrintln(" throw new DoesNotExistException(" + idParam.getName() + ");");
652 indentPrintln("}");
653 indentPrintln("return newStatus();");
654 }
655
656 private void writeGetById(ServiceMethod method) {
657 ServiceMethodParameter idParam = this.findIdParameter(method);
658 String mapName = calcMapName(method);
659 indentPrintln("if (!this." + mapName + ".containsKey(" + idParam.getName() + ")) {");
660 indentPrintln(" throw new DoesNotExistException(" + idParam.getName() + ");");
661 indentPrintln("}");
662 String objectName = calcObjectName(method);
663 String infoName = objectName + "Info";
664 if (isR1) {
665 indentPrintln("return this." + mapName + ".get (" + idParam.getName() + ");");
666 } else {
667 indentPrintln("return new " + infoName + "(this." + mapName + ".get (" + idParam.getName() + "));");
668 }
669
670 }
671
672 private void writeGetByIds(ServiceMethod method) {
673 String objectName = this.calcObjectName(method);
674 String infoName = objectName + "Info";
675 ServiceMethodParameter idListParam = this.findIdListParameter(method);
676 ServiceMethodParameter contextParam = this.findContextParameter(method);
677 indentPrintln("List<" + infoName + "> list = new ArrayList<" + infoName + "> ();");
678 indentPrintln("for (String id: " + idListParam.getName() + ") {");
679 indentPrintln(" list.add (this.get" + objectName + "(id, " + contextParam.getName() + "));");
680 indentPrintln("}");
681 indentPrintln("return list;");
682 }
683
684 private void writeGetIdsByOther(ServiceMethod method) {
685 String objectName = this.calcObjectName(method);
686 String infoName = objectName + "Info";
687 String mapName = calcMapName(method);
688 indentPrintln("List<String> list = new ArrayList<String> ();");
689 indentPrintln("for (" + infoName + " info: " + mapName + ".values ()) {");
690 for (ServiceMethodParameter parameter : method.getParameters()) {
691 if (parameter.getType().equals("ContextInfo")) {
692 continue;
693 }
694 incrementIndent();
695 indentPrintln("if (" + parameter.getName() + ".equals(info.get" + initUpper(parameter.getName()) + "())) {");
696 }
697 indentPrintln(" list.add (info.getId ());");
698 for (ServiceMethodParameter parameter : method.getParameters()) {
699 if (parameter.getType().equals("ContextInfo")) {
700 continue;
701 }
702 indentPrintln("}");
703 decrementIndent();
704 }
705 indentPrintln("}");
706 indentPrintln("return list;");
707 }
708
709 private void writeGetIdsByType(ServiceMethod method) {
710 String objectName = this.calcObjectName(method);
711 String infoName = objectName + "Info";
712 String mapName = calcMapName(method);
713 indentPrintln("List<String> list = new ArrayList<String> ();");
714 indentPrintln("for (" + infoName + " info: " + mapName + ".values ()) {");
715 for (ServiceMethodParameter parameter : method.getParameters()) {
716 if (parameter.getType().equals("ContextInfo")) {
717 continue;
718 }
719 incrementIndent();
720 indentPrintln("if (" + parameter.getName() + ".equals(info.getTypeKey())) {");
721 }
722 indentPrintln(" list.add (info.getId ());");
723 for (ServiceMethodParameter parameter : method.getParameters()) {
724 if (parameter.getType().equals("ContextInfo")) {
725 continue;
726 }
727 indentPrintln("}");
728 decrementIndent();
729 }
730 indentPrintln("}");
731 indentPrintln("return list;");
732 }
733
734 private void writeGetInfosByOther(ServiceMethod method) {
735 String objectName = this.calcObjectName(method);
736 String infoName = objectName + "Info";
737 String mapName = calcMapName(method);
738 indentPrintln("List<" + infoName + "> list = new ArrayList<" + infoName + "> ();");
739 indentPrintln("for (" + infoName + " info: " + mapName + ".values ()) {");
740 for (ServiceMethodParameter parameter : method.getParameters()) {
741 if (parameter.getType().equals("ContextInfo")) {
742 continue;
743 }
744 incrementIndent();
745 indentPrintln("if (" + parameter.getName() + ".equals(info.get" + initUpper(parameter.getName()) + "())) {");
746 }
747 indentPrintln(" list.add (info);");
748 for (ServiceMethodParameter parameter : method.getParameters()) {
749 if (parameter.getType().equals("ContextInfo")) {
750 continue;
751 }
752 indentPrintln("}");
753 decrementIndent();
754 }
755 indentPrintln("}");
756 indentPrintln("return list;");
757 }
758
759 private void writeGetType(ServiceMethod method) {
760 ServiceMethodParameter idParam = this.findIdParameter(method);
761 String mapName = calcMapName(method);
762 indentPrintln("if (!this." + mapName + ".containsKey(" + idParam.getName() + ")) {");
763 indentPrintln(" throw new DoesNotExistException(" + idParam.getName() + ");");
764 indentPrintln("}");
765 indentPrintln("return this." + mapName + ".get (" + idParam.getName() + ");");
766 }
767
768 private void writeGetTypes(ServiceMethod method) {
769 ServiceMethodParameter idParam = this.findIdParameter(method);
770 String mapName = calcMapName(method);
771 String objectName = this.calcObjectName(method);
772 String infoName = objectName + "Info";
773 indentPrintln("return new ArrayList<" + infoName + ">(" + mapName + ".values ());");
774 }
775
776 private String initUpper(String str) {
777 return str.substring(0, 1).toUpperCase() + str.substring(1);
778 }
779
780 private ServiceMethodParameter findIdListParameter(ServiceMethod method) {
781 String idFieldName = calcObjectName(method) + "Ids";
782 for (ServiceMethodParameter parameter : method.getParameters()) {
783 if (parameter.getType().equals("StringList")) {
784 if (parameter.getName().equals(idFieldName)) {
785 return parameter;
786 }
787 }
788 }
789 // can't find name exactly
790 for (ServiceMethodParameter parameter : method.getParameters()) {
791 if (parameter.getType().equals("StringList")) {
792 if (parameter.getName().endsWith("Ids")) {
793 return parameter;
794 }
795 }
796 }
797 // can't find name exactly try key
798 for (ServiceMethodParameter parameter : method.getParameters()) {
799 if (parameter.getType().equals("StringList")) {
800 if (parameter.getName().endsWith("Keys")) {
801 return parameter;
802 }
803 }
804 }
805 return null;
806 }
807
808 private String stripList(String str) {
809 return GetterSetterNameCalculator.stripList(str);
810 }
811
812 private String calcExceptionClassName(ServiceMethodError error) {
813 if (error.getClassName() == null) {
814 return ServiceExceptionWriter.calcClassName(error.getType());
815 }
816 return error.getClassName();
817 }
818
819 private String calcExceptionPackageName(ServiceMethodError error) {
820 if (error.getClassName() == null) {
821 return ServiceExceptionWriter.calcPackage(rootPackage);
822 }
823 return error.getPackageName();
824 }
825
826 private String calcType(String type, String realType) {
827 XmlType t = finder.findXmlType(this.stripList(type));
828 return MessageStructureTypeCalculator.calculate(this, model, type, realType,
829 t.getJavaPackage());
830 }
831 }