001 /** 002 * Copyright 2005-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.opensource.org/licenses/ecl2.php 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.rice.kew.batch; 017 018 019 import static org.junit.Assert.assertFalse; 020 import static org.junit.Assert.assertTrue; 021 022 import java.io.File; 023 import java.io.IOException; 024 import java.util.ArrayList; 025 import java.util.Collection; 026 import java.util.Iterator; 027 import java.util.LinkedList; 028 import java.util.List; 029 import java.util.Map; 030 import java.util.Properties; 031 032 import org.apache.commons.io.FileUtils; 033 import org.junit.Assert; 034 import org.junit.Ignore; 035 import org.junit.Test; 036 import org.kuali.rice.core.api.CoreApiServiceLocator; 037 import org.kuali.rice.core.api.impex.xml.FileXmlDocCollection; 038 import org.kuali.rice.core.api.impex.xml.XmlDocCollection; 039 import org.kuali.rice.edl.impl.bo.EDocLiteAssociation; 040 import org.kuali.rice.edl.impl.service.EdlServiceLocator; 041 import org.kuali.rice.edl.impl.xml.export.EdlExportDataSet; 042 import org.kuali.rice.kew.test.KEWTestCase; 043 import org.springframework.core.io.Resource; 044 import org.springframework.core.io.support.PathMatchingResourcePatternResolver; 045 import org.springframework.core.io.support.ResourcePatternResolver; 046 import org.springframework.util.FileCopyUtils; 047 048 /** 049 * Tests XML "ingestion" pipeline 050 * 051 * @author Kuali Rice Team (rice.collab@kuali.org) 052 */ 053 public class XmlIngestionTest extends KEWTestCase { 054 055 private static final org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(XmlIngestionTest.class); 056 057 private static final File TMP_DIR = new File(System.getProperty("java.io.tmpdir"), "XmlIngestionTest_dir"); 058 private static final File PENDING_DIR = new File(TMP_DIR, "pending"); 059 private static final File LOADED_DIR = new File(TMP_DIR, "loaded"); 060 private static final File PROBLEM_DIR = new File(TMP_DIR, "problem"); 061 062 public void setUp() throws Exception { 063 super.setUp(); 064 deleteDirectories(); 065 TMP_DIR.mkdirs(); 066 PENDING_DIR.mkdirs(); 067 LOADED_DIR.mkdirs(); 068 PROBLEM_DIR.mkdirs(); 069 } 070 071 private void deleteContentsOfDir(File dir, int depth) { 072 File[] files = dir.listFiles(); 073 if (files == null) return; 074 for (File file : files) { 075 if (file.isDirectory() && depth > 0) { 076 // decrement depth 077 // to avoid the possibility of inadvertent 078 // recursive delete! 079 deleteContentsOfDir(file, depth - 1); 080 } 081 boolean success = file.delete(); 082 LOG.info("deleting: " + file + "..." + (success ? "succeeded" : "failed")); 083 } 084 } 085 086 public void tearDown() throws Exception { 087 try { 088 deleteDirectories(); 089 } finally { 090 super.tearDown(); 091 } 092 } 093 094 protected void deleteDirectories() { 095 deleteContentsOfDir(PENDING_DIR, 0); 096 deleteContentsOfDir(LOADED_DIR, 2); 097 deleteContentsOfDir(PROBLEM_DIR, 2); 098 deleteContentsOfDir(TMP_DIR, 0); 099 TMP_DIR.delete(); 100 } 101 102 protected boolean verifyFileExists(File dir, File file) throws IOException { 103 ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(); 104 Resource[] resources = resolver.getResources(dir.toURL() + "/**/" + file.getName()); 105 if (resources == null) { 106 return false; 107 } 108 for (int i = 0; i < resources.length; i++) { 109 if (resources[i].exists()) { 110 return true; 111 } 112 } 113 return false; 114 } 115 116 117 @Ignore 118 public void testXmlReIngestion() throws Exception { 119 120 // Define the path for the test environment 121 String relativeFolder = "/src/test/resources/org/kuali/rice/kew/batch/data/"; 122 String filePath = getBaseDir() + relativeFolder + "widgetsTest.xml"; 123 File ingestedFile = new File(filePath); 124 List<XmlDocCollection> collections = new ArrayList<XmlDocCollection>(); 125 XmlDocCollection fileDoc = new FileXmlDocCollection(ingestedFile); 126 collections.add(fileDoc); 127 // ingest the collection and save it to the database 128 Collection<XmlDocCollection> ingestedXmlFile = null; 129 try { 130 ingestedXmlFile = CoreApiServiceLocator.getXmlIngesterService().ingest(collections); 131 } catch (Exception e) { 132 LOG.error("Error ingesting data", e); 133 //throw new RuntimeException(e); 134 } 135 136 EdlExportDataSet dataSet = new EdlExportDataSet(); 137 138 //Cast this for now 139 List<EDocLiteAssociation> edla = EdlServiceLocator.getEDocLiteService().getEDocLiteAssociations(); 140 String style = null; 141 for (EDocLiteAssociation edl : edla) { 142 if (edl != null) { 143 style = edl.getStyle(); 144 if ("widgetsTest".equals(style)) { 145 dataSet.getEdocLites().add(edl); 146 } 147 } 148 } 149 150 byte[] xmlBytes = CoreApiServiceLocator.getXmlExporterService().export(dataSet.createExportDataSet()); 151 // now export that xml into a file 152 File reingestFile = File.createTempFile("widgetsTestOutput", ".xml"); 153 FileUtils.writeByteArrayToFile(reingestFile, xmlBytes); 154 String ingestedString = FileUtils.readFileToString(ingestedFile); 155 String reingestedString = FileUtils.readFileToString(reingestFile); 156 //assertTrue(FileUtils.contentEquals(ingestedFile, reingestFile)); 157 } 158 159 160 /** 161 * TODO: beef this up 162 * need a reliable way to test if the file arrived in the right date-stamped 163 * subdirectory (maybe just pick the last, or first directory?) 164 * 165 * @throws java.io.IOException 166 */ 167 @Test 168 public void testXmlIngestion() throws IOException { 169 XmlPollerServiceImpl poller = new XmlPollerServiceImpl(); 170 poller.setPollIntervalSecs(1); 171 poller.setXmlParentDirectory(TMP_DIR.toString()); 172 poller.setXmlPendingLocation(PENDING_DIR.toString()); 173 poller.setXmlCompletedLocation(LOADED_DIR.toString()); 174 poller.setXmlProblemLocation(PROBLEM_DIR.toString()); 175 176 Properties filesToIngest = new Properties(); 177 filesToIngest.load(getClass().getResourceAsStream("XmlIngestionTest.txt")); 178 List<File> pendingFiles = new LinkedList<File>(); 179 List<File> shouldPass = new LinkedList<File>(); 180 List<File> shouldFail = new LinkedList<File>(); 181 Iterator<Map.Entry<Object, Object>> entries = filesToIngest.entrySet().iterator(); 182 int i = 0; 183 while (entries.hasNext()) { 184 Map.Entry<?, ?> entry = entries.next(); 185 String filePath = entry.getKey().toString(); 186 filePath = filePath.replace("${basedir}", getBaseDir()); 187 File testFile = new File(filePath); 188 File pendingDir = new File(PENDING_DIR + "/TestDoc-" + i); 189 Assert.assertTrue(pendingDir.mkdirs()); 190 assertTrue(pendingDir.isDirectory()); 191 File pending = new File(pendingDir, testFile.getName()); 192 pendingFiles.add(pending); 193 if (Boolean.valueOf(entry.getValue().toString())) { 194 shouldPass.add(pending); 195 } else { 196 shouldFail.add(pending); 197 } 198 FileCopyUtils.copy(testFile, pending); 199 LOG.info("created: " + pending); 200 i++; 201 } 202 203 // poller should not throw exceptions 204 poller.run(); 205 206 // check that all files have been processed 207 Iterator<File> it = pendingFiles.iterator(); 208 while (it.hasNext()) { 209 File pending = it.next(); 210 assertTrue(!pending.isFile()); 211 } 212 213 // check that they landed in the appropriate location 214 215 // loaded files should be in the loaded dir... 216 it = shouldPass.iterator(); 217 while (it.hasNext()) { 218 File file = it.next(); 219 assertTrue("Loaded file " + file + " was not moved to loaded directory " + LOADED_DIR, verifyFileExists(LOADED_DIR, file)); 220 assertFalse("Loaded file " + file + " was moved to problem directory " + PROBLEM_DIR, verifyFileExists(PROBLEM_DIR, file)); 221 } 222 // and problem files should be in the problem dir... 223 it = shouldFail.iterator(); 224 while (it.hasNext()) { 225 File file = it.next(); 226 assertTrue("Problem file " + file + " was not moved to problem directory" + PROBLEM_DIR, verifyFileExists(PROBLEM_DIR, file)); 227 assertFalse("Problem file " + file + " was moved to loaded directory" + LOADED_DIR, verifyFileExists(LOADED_DIR, file)); 228 } 229 } 230 }