001 /*
002 * Copyright 2011 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.model.impl;
017
018 import java.io.File;
019 import java.io.FileNotFoundException;
020 import java.io.PrintStream;
021 import java.util.ArrayList;
022 import java.util.Collection;
023 import java.util.List;
024 import java.util.Set;
025 import java.util.Stack;
026
027 import org.junit.After;
028 import org.junit.AfterClass;
029 import org.junit.Before;
030 import org.junit.BeforeClass;
031 import org.junit.Test;
032
033 import static org.junit.Assert.*;
034
035 import org.kuali.student.contract.model.MessageStructure;
036 import org.kuali.student.contract.model.Service;
037 import org.kuali.student.contract.model.ServiceContractModel;
038 import org.kuali.student.contract.model.ServiceMethod;
039 import org.kuali.student.contract.model.ServiceMethodParameter;
040 import org.kuali.student.contract.model.XmlType;
041 import org.kuali.student.contract.model.util.HtmlContractServiceWriter;
042 import org.kuali.student.contract.model.util.MessageStructureHierarchyDumper;
043 import org.kuali.student.contract.model.util.ModelFinder;
044 import org.kuali.student.contract.model.validation.ServiceContractModelValidator;
045 import org.kuali.student.validation.decorator.mojo.ValidationDecoratorWriterForOneService;
046 import org.slf4j.Logger;
047 import org.slf4j.LoggerFactory;
048
049 /**
050 *
051 * @author nwright
052 */
053 public class ServiceContractModelQDoxLoaderTest {
054
055 private static Logger log = LoggerFactory.getLogger(ServiceContractModelQDoxLoaderTest.class);
056
057
058 public ServiceContractModelQDoxLoaderTest() {
059 }
060
061 @BeforeClass
062 public static void setUpClass() throws Exception {
063 }
064
065 @AfterClass
066 public static void tearDownClass() throws Exception {
067 }
068
069 @Before
070 public void setUp() {
071 }
072
073 @After
074 public void tearDown() {
075 }
076
077 private static final String RESOURCES_DIRECTORY = "src/test/resources";
078 private static final String TEST_SOURCE_DIRECTORY =
079 "src/test/java/org/kuali/student/contract/model/test/source";
080 private static final String ENROLL_PROJECT_SRC_MAIN = "C:/svn/ks-1.3/ks-enroll/ks-enroll-api/src/main";
081 private static final String ENROLL_PROJECT_JAVA_DIRECTORY = ENROLL_PROJECT_SRC_MAIN + "/java";
082 private static final String RICE_CORE_API_DIRECTORY = "C:/svn/rice/trunk/core/api/src/main/java";
083 private static final String RICE_KIM_API_DIRECTORY = "C:/svn/rice/trunk/kim/kim-api/src/main/java";
084 private static final String RICE_LOCATION_API_DIRECTORY = "C:/svn/rice/trunk/location/api/src/main/java";
085 private static final String RICE_KEW_API_DIRECTORY = "C:/svn/rice/trunk/kew/api/src/main/java";
086 private static final String RICE_KEN_API_DIRECTORY = "C:/svn/rice/trunk/ken/api/src/main/java";
087 private static final String RICE_KSB_API_DIRECTORY = "C:/svn/rice/trunk/ksb/api/src/main/java";
088 private static final String RICE_KRMS_API_DIRECTORY = "C:/svn/rice/trunk/krms/api/src/main/java";
089 private static ServiceContractModel model = null;
090 private ServiceContractModel getModel() {
091 if (model != null) {
092 return model;
093 }
094 List<String> srcDirs = new ArrayList();
095 log.info("User directory=" + System.getProperty("user.dir"));
096 log.info("Current directory=" + new File(".").getAbsolutePath());
097 // srcDirs.add (ENROLL_PROJECT_JAVA_DIRECTORY);
098 srcDirs.add(TEST_SOURCE_DIRECTORY);
099 // srcDirs.add(RICE_CORE_API_DIRECTORY);
100 // srcDirs.add(RICE_KIM_API_DIRECTORY);
101 // srcDirs.add(RICE_LOCATION_API_DIRECTORY);
102 // srcDirs.add(RICE_KEW_API_DIRECTORY);
103 // srcDirs.add(RICE_KEN_API_DIRECTORY);
104 // srcDirs.add(RICE_KSB_API_DIRECTORY);
105 // srcDirs.add(RICE_KRMS_API_DIRECTORY);
106 boolean validateKualiStudent = false;
107 ServiceContractModel instance = new ServiceContractModelQDoxLoader(srcDirs, validateKualiStudent);
108
109 instance = new ServiceContractModelCache(instance);
110 validate(instance);
111 model = instance;
112 return instance;
113 }
114
115 private String dump(ServiceMethod method) {
116 StringBuilder bldr = new StringBuilder();
117 bldr.append(method.getName());
118 String comma = "";
119 bldr.append("(");
120 for (ServiceMethodParameter param : method.getParameters()) {
121 bldr.append(comma);
122 comma = ", ";
123 bldr.append(param.getType());
124 bldr.append(" ");
125 bldr.append(param.getName());
126 }
127 bldr.append(")");
128 return bldr.toString();
129 }
130
131 private void validate(ServiceContractModel model) {
132 Collection<String> errors =
133 new ServiceContractModelValidator(model).validate();
134 if (errors.size() > 0) {
135 StringBuilder buf = new StringBuilder();
136 buf.append(errors.size()).append(" errors found while validating the data.");
137 int cnt = 0;
138 for (String msg : errors) {
139 cnt++;
140 buf.append("\n");
141 buf.append("*error*").append(cnt).append(":").append(msg);
142 }
143
144 fail(buf.toString());
145 }
146 }
147
148 /**
149 * Test of getServiceMethods method, of class ServiceContractModelQDoxLoader.
150 */
151 @Test
152 public void testGetServiceMethods() {
153 log.info("getServiceMethods");
154 ServiceContractModel model = getModel();
155 List<ServiceMethod> result = model.getServiceMethods();
156 log.info("Number of methods=" + result.size());
157 boolean getAtpFound = false;
158 for (ServiceMethod method : result) {
159 log.info(dump(method));
160 if (method.getName().equals("getAtp")) {
161 getAtpFound = true;
162 assertEquals ("this is an implementation note\nthis is another", method.getImplNotes());
163 }
164 }
165 assertTrue (getAtpFound);
166 if (result.size() < 10) {
167 fail("too few: " + result.size());
168 }
169
170 }
171
172
173 /**
174 * Test of getSourceNames method, of class ServiceContractModelQDoxLoader.
175 */
176 // @Test
177 public void testGetSourceNames() {
178 log.info("getSourceNames");
179 ServiceContractModel model = getModel();
180 List<String> expResult = new ArrayList();
181 expResult.add(TEST_SOURCE_DIRECTORY);
182 List result = model.getSourceNames();
183 assertEquals(expResult, result);
184 }
185
186 /**
187 * Test of getServices method, of class ServiceContractModelQDoxLoader.
188 */
189 // @Test
190 public void testGetServices() {
191 log.info("getServices");
192 ServiceContractModel model = getModel();
193 List<Service> result = model.getServices();
194 for (Service service : result) {
195 log.info(service.getKey() + " " + service.getName() + " "
196 + service.getVersion() + " " + service.getStatus());
197 }
198 assertEquals(4, result.size());
199 }
200
201 /**
202 * Test of getXmlTypes method, of class ServiceContractModelQDoxLoader.
203 */
204 // @Test
205 public void testGetXmlTypes() {
206 log.info("getXmlTypes");
207 ServiceContractModel model = getModel();
208 List<XmlType> result = model.getXmlTypes();
209 for (XmlType xmlType : result) {
210 log.info("XmlType=" + xmlType.getName() + " "
211 + xmlType.getPrimitive());
212 }
213 if (result.size() < 10) {
214 fail("too few: " + result.size());
215 }
216 }
217
218 /**
219 * Test of getMessageStructures method, of class ServiceContractModelQDoxLoader.
220 */
221 // @Test
222 public void testGetMessageStructures() throws FileNotFoundException {
223 log.info("getMessageStructures");
224 ServiceContractModel model = getModel();
225 List<MessageStructure> result = model.getMessageStructures();
226 for (MessageStructure ms : result) {
227 if (ms.getId().equalsIgnoreCase("academicCalendarInfo.typeKey")) {
228 log.info("MessageStructure=" + ms.getId() + " " + ms.getType() + "required=["+ ms.getRequired() + "]");
229 }
230 }
231 if (result.size() < 10) {
232 fail("too few: " + result.size());
233 }
234 String outputFileName = "target/messageStructures.txt";
235 File file = new File(outputFileName);
236 PrintStream out = new PrintStream(file);
237 new MessageStructureHierarchyDumper(out, model).writeTabbedHeader();
238 Set<XmlType> rootTypes = HtmlContractServiceWriter.calcMainMessageStructures(
239 model, null);
240 ModelFinder finder = new ModelFinder(model);
241 for (XmlType rootType : rootTypes) {
242 Stack<String> stack = new Stack();
243 stack.push(rootType.getName());
244 for (MessageStructure ms : finder.findMessageStructures(rootType.getName())) {
245 new MessageStructureHierarchyDumper(out, model).writeTabbedData(ms, stack);
246 }
247 }
248 }
249 }