001 /**
002 * Copyright 2010 The Kuali Foundation Licensed under the
003 * Educational Community License, Version 2.0 (the "License"); you may
004 * not use this file except in compliance with the License. You may
005 * obtain a copy of the License at
006 *
007 * http://www.osedu.org/licenses/ECL-2.0
008 *
009 * Unless required by applicable law or agreed to in writing,
010 * software distributed under the License is distributed on an "AS IS"
011 * BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
012 * or implied. See the License for the specific language governing
013 * permissions and limitations under the License.
014 */
015 package org.kuali.student.lum.ui;
016
017 import java.io.File;
018 import java.io.FileNotFoundException;
019 import java.io.FileOutputStream;
020 import java.io.OutputStream;
021 import java.io.PrintStream;
022 import java.util.ArrayList;
023 import java.util.Date;
024 import java.util.HashSet;
025 import java.util.LinkedHashMap;
026 import java.util.LinkedHashSet;
027 import java.util.List;
028 import java.util.Map;
029 import java.util.Set;
030
031 import org.junit.Test;
032 import static org.junit.Assert.*;
033
034 import org.kuali.student.common.assembly.data.Metadata;
035 import org.kuali.student.common.assembly.dictionary.MetadataFormatter;
036 import org.kuali.student.common.assembly.dictionary.MetadataServiceImpl;
037 import org.kuali.student.common.dictionary.service.DictionaryService;
038 import org.kuali.student.common.dictionary.service.impl.DictionaryServiceImpl;
039 import org.kuali.student.core.proposal.dto.ProposalInfo;
040 import org.kuali.student.core.statement.dto.ReqCompFieldInfo;
041 import org.kuali.student.core.statement.dto.ReqComponentInfo;
042 import org.kuali.student.core.statement.dto.StatementInfo;
043 import org.kuali.student.lum.course.dto.CourseInfo;
044 import org.kuali.student.lum.program.dto.MajorDisciplineInfo;
045 import org.kuali.student.lum.program.dto.ProgramRequirementInfo;
046
047 public class TestMetadataServiceDictionary {
048
049 @Test
050 public void testMetadataService() {
051 Set<String> startingClasses = new LinkedHashSet<String>();
052 Map<String, Set<String>> types = new LinkedHashMap<String, Set<String>>();
053 startingClasses.add(CourseInfo.class.getName());
054 startingClasses.add(MajorDisciplineInfo.class.getName());
055 startingClasses.add(ProgramRequirementInfo.class.getName());
056 startingClasses.add(ProposalInfo.class.getName());
057 startingClasses.add(StatementInfo.class.getName());
058 startingClasses.add(ReqComponentInfo.class.getName());
059 startingClasses.add(ReqCompFieldInfo.class.getName());
060 startingClasses.add("cluset");
061 startingClasses.add("courseSet");
062 startingClasses.add("programSet");
063 startingClasses.add("testSet");
064 startingClasses.add("search");
065 startingClasses.add("browse");
066
067 // startingClasses.add (StatementTreeViewInfo.class);
068
069 Set<String> typesForClass = new LinkedHashSet<String>();
070 types.put(ReqCompFieldInfo.class.getName(), typesForClass);
071 typesForClass.add("kuali.reqComponent.field.type.gpa");
072 typesForClass.add("kuali.reqComponent.field.type.operator");
073 typesForClass.add("kuali.reqComponent.field.type.clu.id");
074 typesForClass.add("kuali.reqComponent.field.type.course.clu.id");
075 typesForClass.add("kuali.reqComponent.field.type.program.clu.id");
076 typesForClass.add("kuali.reqComponent.field.type.test.clu.id");
077 typesForClass.add("kuali.reqComponent.field.type.test.score");
078 typesForClass.add("kuali.reqComponent.field.type.cluSet.id");
079 typesForClass.add("kuali.reqComponent.field.type.course.cluSet.id");
080 typesForClass.add("kuali.reqComponent.field.type.program.cluSet.id");
081 typesForClass.add("kuali.reqComponent.field.type.test.cluSet.id");
082 typesForClass.add("kuali.reqComponent.field.type.person.id");
083 typesForClass.add("kuali.reqComponent.field.type.org.id");
084 typesForClass
085 .add("kuali.reqComponent.field.type.value.positive.integer");
086 typesForClass.add("kuali.reqComponent.field.type.gradeType.id");
087 typesForClass.add("kuali.reqComponent.field.type.grade.id");
088 typesForClass.add("kuali.reqComponent.field.type.durationType.id");
089 typesForClass.add("kuali.reqComponent.field.type.duration");
090
091 DictionaryService courseDictService = new DictionaryServiceImpl(
092 "classpath:ks-courseInfo-dictionary-context.xml");
093 DictionaryService progDictService = new DictionaryServiceImpl(
094 "classpath:ks-programInfo-dictionary-context.xml");
095 DictionaryService cluSetDictService = new DictionaryServiceImpl(
096 "classpath:ks-cluSetInfo-dictionary-context.xml");
097
098 for (String objType : cluSetDictService.getObjectTypes()) {
099 System.out.println("Cluset has object type=" + objType);
100 }
101
102 DictionaryService proposalDictService = new DictionaryServiceImpl(
103 "classpath:ks-proposalInfo-dictionary-context.xml");
104 DictionaryService statementDictService = new DictionaryServiceImpl(
105 "classpath:ks-statement-dictionary-context.xml");
106 MetadataServiceImpl metadataService = new MetadataServiceImpl(
107 courseDictService, progDictService, cluSetDictService,
108 proposalDictService, statementDictService);
109 metadataService
110 .setUiLookupContext("classpath:lum-ui-lookup-context.xml");
111
112 List<String> errors = new ArrayList<String>();
113 for (String className : startingClasses) {
114 String outFile = "target/metadata-for-" + className + ".txt";
115 File file = new File(outFile);
116 file.getParentFile().mkdirs();
117 OutputStream outputStream = null;
118 try {
119 outputStream = new FileOutputStream(file, false);
120 } catch (FileNotFoundException ex) {
121 throw new RuntimeException(ex);
122 }
123 PrintStream out = new PrintStream(outputStream);
124 out.println("(!) This page was automatically generated on " + new Date());
125 out.println("DO NOT UPDATE MANUALLY!");
126 out.println("");
127 out.println("This page represents a formatted view of the lum ui dictionary for " + className);
128 out.println("");
129 out.println("----");
130 out.println("{toc}");
131 out.println("----");
132 // out.println ("getting meta data for " + className);
133 Metadata metadata = metadataService.getMetadata(className);
134 assertNotNull(metadata);
135 errors.addAll(this.validateMetadata(metadata, className, null));
136 MetadataFormatter formatter = new MetadataFormatter(className,
137 metadata, null, null, new HashSet<Metadata>(), 1);
138 out.println(formatter.formatForWiki());
139 if (types.get(className) == null) {
140 continue;
141 }
142 for (String type : types.get(className)) {
143 System.out.println("*** Generating formatted version for " + type);
144 metadata = metadataService.getMetadata(className, type,
145 (String) null);
146 assertNotNull(metadata);
147 errors.addAll(this.validateMetadata(metadata, className, type));
148 formatter = new MetadataFormatter(className, metadata, type,
149 null, new HashSet<Metadata>(), 1);
150 out.println(formatter.formatForWiki());
151 }
152 out.close();
153 }
154 if (errors.size() > 0) {
155 for (String error : errors) {
156 System.out.println("error: " + error);
157 }
158 System.out.println(errors.size() + " errors found when validating metadata");
159
160 // These first 6 are because the recursion stops but the final field still is flagged as DATA even though it cannot have sub fields
161
162 //error: org.kuali.student.lum.course.dto.CourseInfo.courseSpecificLOs.*.loDisplayInfoList.*.loDisplayInfoList.*.loDisplayInfoList.* is of type DATA but it has no properties
163 //error: org.kuali.student.lum.program.dto.MajorDisciplineInfo.variations.*.learningObjectives.*.loDisplayInfoList.*.loDisplayInfoList.*.loDisplayInfoList.* is of type DATA but it has no properties
164 //error: org.kuali.student.lum.program.dto.MajorDisciplineInfo.orgCoreProgram.learningObjectives.*.loDisplayInfoList.*.loDisplayInfoList.*.loDisplayInfoList.* is of type DATA but it has no properties
165 //error: org.kuali.student.lum.program.dto.MajorDisciplineInfo.learningObjectives.*.loDisplayInfoList.*.loDisplayInfoList.*.loDisplayInfoList.* is of type DATA but it has no properties
166 //error: org.kuali.student.lum.program.dto.ProgramRequirementInfo.statement.statements.*.statements.*.statements.* is of type DATA but it has no properties
167 //error: org.kuali.student.lum.program.dto.ProgramRequirementInfo.learningObjectives.*.loDisplayInfoList.*.loDisplayInfoList.*.loDisplayInfoList.* is of type DATA but it has no properties
168
169
170 // 33 errors found when validating metadata
171 if (errors.size() != 33) {
172 fail(errors.size() + " errors found when validating metadata");
173 }
174 }
175 }
176
177 private MetadataServiceDictionaryValidator validator = null;
178
179 private MetadataServiceDictionaryValidator getValidator() {
180 if (validator == null) {
181 validator = new MetadataServiceDictionaryValidator();
182 }
183 return validator;
184 }
185
186 private List<String> validateMetadata(Metadata md, String name, String type) {
187 return getValidator().validateMetadata(md, name, type);
188 }
189 }