1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package org.kuali.rice.krad.labs.fileUploads;
17
18 import org.apache.commons.lang.StringUtils;
19 import org.apache.commons.lang.exception.ExceptionUtils;
20 import org.kuali.rice.core.api.CoreApiServiceLocator;
21 import org.kuali.rice.core.api.impex.xml.CompositeXmlDocCollection;
22 import org.kuali.rice.core.api.impex.xml.FileXmlDocCollection;
23 import org.kuali.rice.core.api.impex.xml.XmlDoc;
24 import org.kuali.rice.core.api.impex.xml.XmlDocCollection;
25 import org.kuali.rice.core.api.impex.xml.ZipXmlDocCollection;
26 import org.kuali.rice.krad.util.GlobalVariables;
27 import org.kuali.rice.krad.web.controller.UifControllerBase;
28 import org.kuali.rice.krad.web.form.UifFormBase;
29 import org.springframework.stereotype.Controller;
30 import org.springframework.validation.BindingResult;
31 import org.springframework.web.bind.annotation.ModelAttribute;
32 import org.springframework.web.bind.annotation.RequestMapping;
33 import org.springframework.web.bind.annotation.RequestMethod;
34 import org.springframework.web.multipart.MultipartFile;
35 import org.springframework.web.servlet.ModelAndView;
36
37 import javax.servlet.http.HttpServletRequest;
38 import javax.servlet.http.HttpServletResponse;
39 import java.io.File;
40 import java.io.FileOutputStream;
41 import java.io.IOException;
42 import java.util.ArrayList;
43 import java.util.Collection;
44 import java.util.List;
45
46
47
48
49
50
51
52
53
54
55
56 @Controller
57 @RequestMapping(value = "/ingester")
58 public class XmlIngesterController extends UifControllerBase {
59
60
61
62
63 @Override
64 protected XmlIngesterForm createInitialForm() {
65 return new XmlIngesterForm();
66 }
67
68 @Override
69 @RequestMapping(params = "methodToCall=start")
70 public ModelAndView start(UifFormBase form) {
71 XmlIngesterForm ingesterForm = (XmlIngesterForm)form;
72
73 return super.start(ingesterForm);
74 }
75
76 @RequestMapping(method = RequestMethod.POST, params = "methodToCall=upload")
77 public ModelAndView upload(@ModelAttribute("KualiForm") XmlIngesterForm ingesterForm, BindingResult result,
78 HttpServletRequest request, HttpServletResponse response) {
79 List<File> tempFiles = new ArrayList<File>();
80 List<XmlDocCollection> collections = copyInputFiles(ingesterForm.getFiles(), tempFiles);
81 try {
82 if (collections.size() == 0) {
83 String message = "No valid files to ingest";
84 GlobalVariables.getMessageMap().putErrorForSectionId(XmlIngesterConstants.INGESTER_SECTION_ID, XmlIngesterConstants.ERROR_INGESTER_NO_VALID_FILES);
85 } else {
86 if (ingestFiles(collections) == 0) {
87
88 GlobalVariables.getMessageMap().putErrorForSectionId(XmlIngesterConstants.INGESTER_SECTION_ID, XmlIngesterConstants.ERROR_INGESTER_NO_XMLS);
89 }
90 }
91 } finally {
92 if (tempFiles.size() > 0) {
93 for (File tempFile : tempFiles)
94 {
95 if (!tempFile.delete())
96 {
97
98 }
99 }
100 }
101 }
102 return getModelAndView(ingesterForm);
103 }
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119 protected List<XmlDocCollection> copyInputFiles(List<MultipartFile> fileList, List<File> tempFiles){
120 List<XmlDocCollection> collections = new ArrayList<XmlDocCollection>();
121 for (MultipartFile file : fileList) {
122 if (file == null || StringUtils.isBlank(file.getOriginalFilename())) {
123 continue;
124 }
125
126
127
128 FileOutputStream fos = null;
129 File temp = null;
130 try{
131 temp = File.createTempFile("ingester", null);
132 tempFiles.add(temp);
133 fos = new FileOutputStream(temp);
134 fos.write(file.getBytes());
135 } catch (IOException ioe) {
136 GlobalVariables.getMessageMap().putErrorForSectionId(XmlIngesterConstants.INGESTER_SECTION_ID,
137 XmlIngesterConstants.ERROR_INGESTER_COPY_FILE , file.getOriginalFilename(), ExceptionUtils.getFullStackTrace(ioe));
138 continue;
139 } finally{
140 if (fos != null) {
141 try{
142 fos.close();
143 } catch (IOException ioe){
144
145 }
146 }
147 }
148
149
150 if (file.getOriginalFilename().toLowerCase().endsWith(".zip"))
151 {
152 try {
153 collections.add(new ZipXmlDocCollection(temp));
154 } catch (IOException ioe) {
155 GlobalVariables.getMessageMap().putErrorForSectionId(XmlIngesterConstants.INGESTER_SECTION_ID, XmlIngesterConstants.ERROR_INGESTER_LOAD_FILE, file.getOriginalFilename());
156 }
157 } else if (file.getOriginalFilename().endsWith(".xml")) {
158 collections.add(new FileXmlDocCollection(temp, file.getOriginalFilename()));
159 } else {
160 GlobalVariables.getMessageMap().putErrorForSectionId(XmlIngesterConstants.INGESTER_SECTION_ID, XmlIngesterConstants.ERROR_INGESTER_EXTRANEOUS_FILE, file.getOriginalFilename());
161 }
162 }
163
164 return collections;
165 }
166
167
168
169
170
171
172
173 protected int ingestFiles(List<XmlDocCollection> collections){
174
175 CompositeXmlDocCollection compositeCollection = new CompositeXmlDocCollection(collections);
176 int totalProcessed = 0;
177 List<XmlDocCollection> c = new ArrayList<XmlDocCollection>(1);
178 c.add(compositeCollection);
179 try {
180
181 Collection<XmlDocCollection> failed = CoreApiServiceLocator.getXmlIngesterService().ingest(c, GlobalVariables.getUserSession().getPrincipalId());
182 boolean txFailed = failed.size() > 0;
183 if (txFailed) {
184 GlobalVariables.getMessageMap().putErrorForSectionId(XmlIngesterConstants.INGESTER_SECTION_ID, XmlIngesterConstants.ERROR_INGESTER_FAILED);
185 }
186
187
188 collectIngestionMessages(collections, txFailed);
189 } catch (Exception e) {
190 GlobalVariables.getMessageMap().putErrorForSectionId(XmlIngesterConstants.INGESTER_SECTION_ID, XmlIngesterConstants.ERROR_INGESTER_DURING_INJECT, ExceptionUtils.getFullStackTrace(e));
191 }
192
193 return totalProcessed;
194 }
195
196
197
198
199
200
201
202
203
204
205
206
207
208 protected int collectIngestionMessages(List<XmlDocCollection> collections, boolean txFailed){
209 int totalProcessed = 0;
210 for (XmlDocCollection collection1 : collections)
211 {
212 List<? extends XmlDoc> docs = collection1.getXmlDocs();
213 for (XmlDoc doc1 : docs)
214 {
215 if (doc1.isProcessed())
216 {
217 if (!txFailed)
218 {
219 totalProcessed++;
220 GlobalVariables.getMessageMap().putInfoForSectionId(XmlIngesterConstants.INGESTER_SECTION_ID, XmlIngesterConstants.INFO_INGESTER_SUCCESS, doc1.getName(),doc1.getProcessingMessage());
221 } else {
222 GlobalVariables.getMessageMap().putErrorForSectionId(XmlIngesterConstants.INGESTER_SECTION_ID, XmlIngesterConstants.ERROR_INGESTER_ROLLEDBACK, doc1.getName(),doc1.getProcessingMessage());
223 }
224 } else
225 {GlobalVariables.getMessageMap().putErrorForSectionId(XmlIngesterConstants.INGESTER_SECTION_ID, XmlIngesterConstants.ERROR_INGESTER_FAILED_XML, doc1.getName(),doc1.getProcessingMessage());
226 }
227 }
228 }
229 return totalProcessed;
230 }
231
232 @RequestMapping(method = RequestMethod.POST, params = "methodToCall=close")
233 public ModelAndView close(@ModelAttribute("KualiForm") XmlIngesterForm ingesterForm, BindingResult result,
234 HttpServletRequest request, HttpServletResponse response) {
235
236 return null;
237 }
238
239 }