package sushi.application.pages.input;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.form.upload.FileUpload;
import org.apache.wicket.markup.html.form.upload.FileUploadField;
import org.apache.wicket.request.mapper.parameter.PageParameters;
import sushi.application.pages.AbstractSushiPage;
import sushi.csv.importer.CSVImporter;
import sushi.edifact.importer.EdifactImporter;
import sushi.esper.SushiStreamProcessingAdapter;
import sushi.event.SushiEvent;
import sushi.event.SushiEventType;
import sushi.eventhandling.Broker;
import sushi.excel.importer.ExcelImporter;
import sushi.excel.importer.FileNormalizer;
import sushi.xml.importer.XMLParser;
import sushi.xml.importer.XMLParsingException;
public class FileUploader extends AbstractSushiPage {
private static final long serialVersionUID = 1L;
private SushiStreamProcessingAdapter sushiEsper = SushiStreamProcessingAdapter.getInstance();
private FileUploadField fileUpload;
public FileUploader() {
super();
Form<Void> uploadForm = new Form<Void>("uploadForm") {
private static final long serialVersionUID = 1L;
@Override
protected void onSubmit() {
final FileUpload uploadedFile = fileUpload.getFileUpload();
if (uploadedFile != null) {
String uploadFolder;
if (System.getProperty("os.name").contains("Windows")) {
uploadFolder = "C:\\temp\\";
}
else {
uploadFolder = "/tmp/";
}
String fileName = uploadedFile.getClientFileName();
File newFile = new File(uploadFolder + fileName);
if (newFile.exists()) {
newFile.delete();
}
try {
newFile.createNewFile();
uploadedFile.writeTo(newFile);
} catch (IOException e) {
error("Error: File could not be saved.");
}
int index = fileName.lastIndexOf('.');
String fileExtension = fileName.substring(index + 1, fileName.length());
//create Excel- or CSV-Events
if (fileExtension.toLowerCase().contains("xls") || fileExtension.toLowerCase().contains("csv")) {
PageParameters pageParameters = new PageParameters();
pageParameters.add("filePath", newFile.getAbsolutePath());
if (noEventTypesFound(pageParameters)) {
setResponsePage(ExcelEventTypeCreator.class, pageParameters);
} else {
setResponsePage(ExcelEventTypeMatcher.class, pageParameters);
}
//create event type from xsd
} else if(fileExtension.toLowerCase().contains("xsd")){
PageParameters pageParameters = new PageParameters();
pageParameters.add("filePath", newFile.getAbsolutePath());
setResponsePage(XSDEventTypeCreator.class, pageParameters);
//create XML-Event
} else if(fileExtension.toLowerCase().contains("xml")){
SushiEvent uploadedEvent;
try {
uploadedEvent = XMLParser.generateEventFromXML(newFile.getAbsolutePath());
Broker.send(uploadedEvent);
info("Saved event from : " + fileName);
} catch (XMLParsingException e) {
error(e.getMessage());
}
// create Edifact-Event
} else if(fileExtension.toLowerCase().contains("txt") || fileExtension.toLowerCase().contains("edi")){
SushiEvent uploadedEvent;
try {
uploadedEvent = EdifactImporter.getInstance().generateEventFromEdifact(newFile.getAbsolutePath());
if (!sushiEsper.isEventType(uploadedEvent.getEventType())) {
Broker.send(uploadedEvent.getEventType());
}
Broker.send(uploadedEvent);
info("Saved event from : " + fileName);
} catch (XMLParsingException e) {
error(e.getMessage());
} catch (Exception e) {
error(e.getMessage());
}
}
} else {
error("File not found");
}
}
};
uploadForm.setMultiPart(true);
uploadForm.add(fileUpload = new FileUploadField("fileUpload"));
add(uploadForm);
}
public static boolean noEventTypesFound(PageParameters pageParameters) {
FileNormalizer fileNormalizer;
String fileName = pageParameters.get("filePath").toString();
int index = fileName.lastIndexOf('.');
String fileExtension = fileName.substring(index + 1, fileName.length());
fileNormalizer = (fileExtension.toLowerCase().contains("xls")) ? new ExcelImporter() : new CSVImporter();
List<String> attributeNames = fileNormalizer.getColumnTitlesFromFile(pageParameters.get("filePath").toString());
List<String> trimmedAttributeNames = new ArrayList<String>();
for (String attributeName : attributeNames) {
trimmedAttributeNames.add(attributeName.replace(" +", "_"));
}
return SushiEventType.findMatchingEventTypes(trimmedAttributeNames, ExcelEventTypeCreator.GENERATED_TIMESTAMP_COLUMN_NAME).isEmpty();
}
}