/*
* Copyright (C) 2003-2008 eXo Platform SAS.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU Affero General Public License
* as published by the Free Software Foundation; either version 3
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, see<http://www.gnu.org/licenses/>.
*/
package org.exoplatform.ecm.connector.fckeditor;
import java.io.ByteArrayInputStream;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.GregorianCalendar;
import javax.jcr.Node;
import javax.servlet.http.HttpServletRequest;
import javax.ws.rs.core.CacheControl;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.exoplatform.common.http.HTTPStatus;
import org.exoplatform.commons.utils.IOUtil;
import org.exoplatform.container.ExoContainer;
import org.exoplatform.services.cms.mimetype.DMSMimeTypeResolver;
import org.exoplatform.services.wcm.utils.WCMCoreUtils;
import org.exoplatform.upload.UploadResource;
import org.exoplatform.upload.UploadService;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
/*
* Created by The eXo Platform SAS
* @author : Hoa.Pham
* hoa.pham@exoplatform.com
* Jun 23, 2008
*/
/**
* The Class FileUploadHandler.
*/
public class FileUploadHandler {
/** The Constant UPLOAD_ACTION. */
public final static String UPLOAD_ACTION = "upload";
/** The Constant PROGRESS_ACTION. */
public final static String PROGRESS_ACTION = "progress";
/** The Constant ABORT_ACTION. */
public final static String ABORT_ACTION = "abort";
/** The Constant DELETE_ACTION. */
public final static String DELETE_ACTION = "delete";
/** The Constant SAVE_ACTION. */
public final static String SAVE_ACTION = "save";
private UploadService uploadService;
private FCKMessage fckMessage;
/**
* Instantiates a new file upload handler.
*
* @param container the container
*/
public FileUploadHandler(ExoContainer container) {
uploadService = WCMCoreUtils.getService(UploadService.class);
fckMessage = new FCKMessage();
}
public Response upload(HttpServletRequest servletRequest) throws Exception {
CacheControl cacheControl = new CacheControl();
cacheControl.setNoCache(true);
uploadService.createUploadResource(servletRequest);
return Response.ok(null, new MediaType("text", "xml")).cacheControl(cacheControl).build();
}
public Response control(String uploadId, String action) throws Exception {
CacheControl cacheControl = new CacheControl();
cacheControl.setNoCache(true);
DateFormat dateFormat = new SimpleDateFormat(FCKUtils.IF_MODIFIED_SINCE_DATE_FORMAT);
if (FileUploadHandler.PROGRESS_ACTION.equals(action)) {
Document currentProgress = getProgress(uploadId);
return Response.ok(currentProgress, new MediaType("text", "xml"))
.cacheControl(cacheControl)
.header(FCKUtils.LAST_MODIFIED_PROPERTY, dateFormat.format(new Date()))
.build();
} else if (FileUploadHandler.ABORT_ACTION.equals(action)) {
uploadService.removeUploadResource(uploadId);
return Response.ok(null, new MediaType("text", "xml"))
.cacheControl(cacheControl)
.header(FCKUtils.LAST_MODIFIED_PROPERTY, dateFormat.format(new Date()))
.build();
} else if (FileUploadHandler.DELETE_ACTION.equals(action)) {
uploadService.removeUploadResource(uploadId);
return Response.ok(null, new MediaType("text", "xml"))
.cacheControl(cacheControl)
.header(FCKUtils.LAST_MODIFIED_PROPERTY, dateFormat.format(new Date()))
.build();
}
return Response.status(HTTPStatus.BAD_REQUEST)
.cacheControl(cacheControl)
.header(FCKUtils.LAST_MODIFIED_PROPERTY, dateFormat.format(new Date()))
.build();
}
public Response saveAsNTFile(Node parent, String uploadId, String fileName, String language) throws Exception {
CacheControl cacheControl = new CacheControl();
cacheControl.setNoCache(true);
UploadResource resource = uploadService.getUploadResource(uploadId);
DateFormat dateFormat = new SimpleDateFormat(FCKUtils.IF_MODIFIED_SINCE_DATE_FORMAT);
if (parent == null) {
Document fileNotUploaded = fckMessage.createMessage(FCKMessage.FILE_NOT_UPLOADED,
FCKMessage.ERROR,
language,
null);
return Response.ok(fileNotUploaded, new MediaType("text", "xml"))
.cacheControl(cacheControl)
.header(FCKUtils.LAST_MODIFIED_PROPERTY, dateFormat.format(new Date()))
.build();
}
if (!FCKUtils.hasAddNodePermission(parent)) {
Object[] args = { parent.getPath() };
Document message = fckMessage.createMessage(FCKMessage.FILE_UPLOAD_RESTRICTION,
FCKMessage.ERROR,
language,
args);
return Response.ok(message, new MediaType("text", "xml"))
.cacheControl(cacheControl)
.header(FCKUtils.LAST_MODIFIED_PROPERTY, dateFormat.format(new Date()))
.build();
}
if ((fileName == null) || (fileName.length() == 0)) {
fileName = resource.getFileName();
}
if (parent.hasNode(fileName)) {
Object args[] = { fileName, parent.getPath() };
Document fileExisted = fckMessage.createMessage(FCKMessage.FILE_EXISTED,
FCKMessage.ERROR,
language,
args);
return Response.ok(fileExisted, new MediaType("text", "xml"))
.cacheControl(cacheControl)
.header(FCKUtils.LAST_MODIFIED_PROPERTY, dateFormat.format(new Date()))
.build();
}
String location = resource.getStoreLocation();
byte[] uploadData = IOUtil.getFileContentAsBytes(location);
Node file = parent.addNode(fileName,FCKUtils.NT_FILE);
Node jcrContent = file.addNode("jcr:content","nt:resource");
String mimetype = DMSMimeTypeResolver.getInstance().getMimeType(resource.getFileName());
jcrContent.setProperty("jcr:data",new ByteArrayInputStream(uploadData));
jcrContent.setProperty("jcr:lastModified",new GregorianCalendar());
jcrContent.setProperty("jcr:mimeType",mimetype);
parent.getSession().save();
uploadService.removeUploadResource(uploadId);
return Response.ok(null, new MediaType("text", "xml"))
.cacheControl(cacheControl)
.header(FCKUtils.LAST_MODIFIED_PROPERTY, dateFormat.format(new Date()))
.build();
}
private Document getProgress(String uploadId) throws Exception {
UploadResource resource = uploadService.getUploadResource(uploadId);
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.newDocument();
if(resource == null) {
return doc;
}
Double percent = 0.0;
if (resource.getStatus() == UploadResource.UPLOADING_STATUS) {
percent = (resource.getUploadedSize() * 100) / resource.getEstimatedSize();
} else {
percent = 100.0;
}
Element rootElement = doc.createElement("UploadProgress");
rootElement.setAttribute("uploadId", uploadId);
rootElement.setAttribute("fileName", resource.getFileName());
rootElement.setAttribute("percent", percent.intValue() + "");
doc.appendChild(rootElement);
return doc;
}
}