/**
* Copyright 2008-2016 Qualogy Solutions B.V.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.qualogy.qafe.web;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.fileupload.FileItemIterator;
import org.apache.commons.fileupload.FileItemStream;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.lang.StringUtils;
import com.qualogy.qafe.bind.core.application.Configuration;
import com.qualogy.qafe.core.application.ApplicationCluster;
import com.qualogy.qafe.core.datastore.ApplicationLocalStore;
import com.qualogy.qafe.core.datastore.DataStore;
import com.qualogy.qafe.core.id.UniqueIdentifier;
public class UploadService {
public static final String APP_UUID = "APPUUID";
public static final String APP_WINDOWID = "WINDOWID";
public static final String ACTION_REMOVE = "REMOVE";
public static final String ACTION_VIEW = "VIEW";
public static final String FILE_MIME_TYPE = "mime-type";
public static final String FILE_NAME = "filename";
public static final String FILE_CONTENT = "filecontent";
protected static final String UPLOAD_COMPLETE = "UUID";
protected static final String UPLOAD_ERROR = "ERROR";
protected static final String REMOVE_COMPLETE = "OK";
protected static final String REMOVE_ERROR = UPLOAD_ERROR;
protected static final String DEFAULT_MIME_TYPE = "application/octet-stream";
public String uploadFile(HttpServletRequest request) {
ServletFileUpload upload = new ServletFileUpload();
String errorMessage = "";
byte[] filecontent = null;
String appUUID = null;
String windowId = null;
String filename = null;
String mimeType = null;
InputStream inputStream = null;
ByteArrayOutputStream outputStream = null;
try {
FileItemIterator fileItemIterator = upload.getItemIterator(request);
while (fileItemIterator.hasNext()) {
FileItemStream item = fileItemIterator.next();
inputStream = item.openStream();
// Read the file into a byte array.
outputStream = new ByteArrayOutputStream();
byte[] buffer = new byte[8192];
int len = 0;
while (-1 != (len = inputStream.read(buffer))) {
outputStream.write(buffer, 0, len);
}
if (filecontent == null) {
filecontent = outputStream.toByteArray();
filename = item.getName();
mimeType = item.getContentType();
}
if (item.getFieldName().indexOf(APP_UUID) > -1) {
appUUID = item.getFieldName().substring(item.getFieldName().indexOf(APP_UUID)+ APP_UUID.length() + 1);
}
if (item.getFieldName().indexOf(APP_WINDOWID) > -1) {
windowId = item.getFieldName().substring(item.getFieldName().indexOf(APP_WINDOWID)+ APP_WINDOWID.length() + 1);
}
}
if ((appUUID != null) && (windowId != null)) {
if (filecontent != null) {
int maxFileSize = 0;
if (ApplicationCluster.getInstance().getConfigurationItem(Configuration.MAX_UPLOAD_FILESIZE) != null) {
String maxUploadFileSzie = ApplicationCluster.getInstance().getConfigurationItem(Configuration.MAX_UPLOAD_FILESIZE);
if (StringUtils.isNumeric(maxUploadFileSzie)) {
maxFileSize = Integer.parseInt(maxUploadFileSzie);
}
}
if ((maxFileSize == 0) || (filecontent.length <= maxFileSize)) {
Map<String, Object> fileData = new HashMap<String, Object>();
fileData.put(FILE_MIME_TYPE, mimeType);
fileData.put(FILE_NAME, filename);
fileData.put(FILE_CONTENT, filecontent);
String uploadUUID = DataStore.KEY_LOOKUP_DATA + UniqueIdentifier.nextSeed().toString();
appUUID = concat(appUUID, windowId);
ApplicationLocalStore.getInstance().store(appUUID, uploadUUID, fileData);
return filename + "#" + UPLOAD_COMPLETE + "=" + uploadUUID;
} else {
errorMessage = "The maxmimum filesize in bytes is " + maxFileSize;
}
}
} else {
errorMessage = "Application UUID not specified";
}
inputStream.close();
outputStream.close();
} catch (Exception e) {
errorMessage = e.getMessage();
}
return UPLOAD_ERROR + "=" + "File can not be uploaded: " + errorMessage;
}
public Map getUploadedFile(String appUUID, String windowId, String uploadUUID) {
if ((appUUID != null) && (windowId != null)) {
if ((uploadUUID != null) && (uploadUUID.indexOf(DataStore.KEY_LOOKUP_DATA) > -1)) {
appUUID = concat(appUUID, windowId);
if (ApplicationLocalStore.getInstance().contains(appUUID, uploadUUID)) {
Object uploadedFile = ApplicationLocalStore.getInstance().retrieve(appUUID, uploadUUID);
if ((uploadedFile != null) && (uploadedFile instanceof Map)) {
return (Map) uploadedFile;
}
}
}
}
return null;
}
public String removeUploadedFile(String appUUID, String windowId, String uploadUUID) {
String errorMessage = "File can not be found";
if ((appUUID != null) && (windowId != null)) {
if ((uploadUUID != null) && (uploadUUID.indexOf(DataStore.KEY_LOOKUP_DATA) > -1)) {
appUUID = concat(appUUID, windowId);
if (ApplicationLocalStore.getInstance().contains(appUUID, uploadUUID)) {
ApplicationLocalStore.getInstance().delete(appUUID, uploadUUID);
return REMOVE_COMPLETE;
}
}
}
return REMOVE_ERROR + "=" + "Uploaded file can not be removed: " + errorMessage;
}
private String concat(String str1, String str2) {
return str1 + "." + str2;
}
}