package org.exoplatform.forum.webui.popup;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import javax.jcr.AccessDeniedException;
import javax.jcr.ImportUUIDBehavior;
import javax.jcr.ItemExistsException;
import javax.jcr.PathNotFoundException;
import javax.jcr.nodetype.ConstraintViolationException;
import org.exoplatform.commons.utils.MimeTypeResolver;
import org.exoplatform.container.ExoContainerContext;
import org.exoplatform.forum.ForumUtils;
import org.exoplatform.forum.service.ForumService;
import org.exoplatform.forum.webui.UICategory;
import org.exoplatform.forum.webui.UIForumPortlet;
import org.exoplatform.ks.common.webui.BaseUIForm;
import org.exoplatform.ks.common.webui.UIPopupAction;
import org.exoplatform.upload.UploadService;
import org.exoplatform.webui.config.annotation.ComponentConfig;
import org.exoplatform.webui.config.annotation.EventConfig;
import org.exoplatform.webui.core.UIPopupComponent;
import org.exoplatform.webui.core.lifecycle.UIFormLifecycle;
import org.exoplatform.webui.event.Event;
import org.exoplatform.webui.event.EventListener;
import org.exoplatform.webui.form.UIFormUploadInput;
@ComponentConfig(
lifecycle = UIFormLifecycle.class ,
template = "app:/templates/forum/webui/popup/UIImportForm.gtmpl",
events = {
@EventConfig(listeners = UIImportForm.SaveActionListener.class),
@EventConfig(listeners = UIImportForm.CancelActionListener.class)
}
)
public class UIImportForm extends BaseUIForm implements UIPopupComponent {
private final String FILE_UPLOAD = "FileUpload";
private String categoryPath = null;
public void activate() throws Exception {
}
public void deActivate() throws Exception {
}
public UIImportForm() {
this.addChild(new UIFormUploadInput(FILE_UPLOAD, FILE_UPLOAD, true));
categoryPath = null;
}
public void setPath(String categoryPath) {
this.categoryPath = categoryPath;
}
private void extractFromZipFile(ZipInputStream zipStream, String nodePath, ForumService service) throws Exception {
try {
ByteArrayOutputStream out;
byte[] data = new byte[5120];
ZipEntry entry = zipStream.getNextEntry();
ByteArrayInputStream inputStream = null;
while (entry != null) {
out = new ByteArrayOutputStream();
int available = -1;
while ((available = zipStream.read(data, 0, 1024)) > -1) {
out.write(data, 0, available);
}
zipStream.closeEntry();
inputStream = new ByteArrayInputStream(out.toByteArray());
out.close();
service.importXML(nodePath, inputStream, ImportUUIDBehavior.IMPORT_UUID_CREATE_NEW);
entry = zipStream.getNextEntry();
}
} finally {
if (zipStream != null)
zipStream.close();
}
}
@SuppressWarnings( { "deprecation" })
static public class SaveActionListener extends EventListener<UIImportForm> {
public void execute(Event<UIImportForm> event) throws Exception {
UIImportForm importForm = event.getSource();
UIForumPortlet forumPortlet = importForm.getAncestorOfType(UIForumPortlet.class);
UIFormUploadInput uploadInput = (UIFormUploadInput) importForm.getChildById(importForm.FILE_UPLOAD);
if (uploadInput.getUploadResource() == null) {
importForm.warning("UIImportForm.msg.file-not-found");
return;
}
String fileName = uploadInput.getUploadResource().getFileName();
MimeTypeResolver mimeTypeResolver = new MimeTypeResolver();
String mimeType = mimeTypeResolver.getMimeType(fileName);
ByteArrayInputStream xmlInputStream = null;
String nodePath = null;
ForumService service = (ForumService) ExoContainerContext.getCurrentContainer().getComponentInstanceOfType(ForumService.class);
if (ForumUtils.isEmpty(importForm.categoryPath)) {
nodePath = service.getForumHomePath();
} else {
nodePath = importForm.categoryPath;
}
UIPopupAction popupAction = forumPortlet.getChild(UIPopupAction.class);
boolean isUdateForm = false;
boolean isErr = false;
try {
if ("text/xml".equals(mimeType)) {
xmlInputStream = new ByteArrayInputStream(uploadInput.getUploadData());
service.importXML(nodePath, xmlInputStream, ImportUUIDBehavior.IMPORT_UUID_CREATE_NEW);
} else if ("application/zip".equals(mimeType)) {
ZipInputStream zipInputStream = new ZipInputStream(uploadInput.getUploadDataAsStream());
importForm.extractFromZipFile(zipInputStream, nodePath, service);
} else {
importForm.warning("UIImportForm.msg.mimetype-invalid");
return;
}
// service.updateForum(nodePath);
importForm.info("UIImportForm.msg.import-successful");
isUdateForm = true;
popupAction.deActivate();
event.getRequestContext().addUIComponentToUpdateByAjax(popupAction);
if (!ForumUtils.isEmpty(importForm.categoryPath)) {
UICategory category = forumPortlet.findFirstComponentOfType(UICategory.class);
category.setIsEditForum(true);
event.getRequestContext().addUIComponentToUpdateByAjax(category);
} else {
event.getRequestContext().addUIComponentToUpdateByAjax(forumPortlet);
}
} catch (PathNotFoundException pnf) {
importForm.warning("UIImportForm.msg.CategoryNoLongerExist");
isErr = true;
} catch (AccessDeniedException ace) {
importForm.warning("UIImportForm.msg.access-denied");
isErr = true;
} catch (ConstraintViolationException con) {
if (ForumUtils.isEmpty(importForm.categoryPath)) {
importForm.warning("UIImportForm.msg.constraint-violation-exception-category");
} else {
importForm.warning("UIImportForm.msg.constraint-violation-exception-forum");
}
isErr = true;
} catch (ItemExistsException ie) {
importForm.warning("UIImportForm.msg.ObjectIsExist");
} catch (Exception ise) {
importForm.warning("UIImportForm.msg.filetype-error");
return;
}
// remove temp file in upload service and server
UploadService uploadService = importForm.getApplicationComponent(UploadService.class);
uploadService.removeUploadResource(uploadInput.getUploadId());
if (!isUdateForm) {
popupAction.deActivate();
event.getRequestContext().addUIComponentToUpdateByAjax(popupAction);
}
if (isErr) {
forumPortlet.rederForumHome();
event.getRequestContext().addUIComponentToUpdateByAjax(forumPortlet);
}
}
}
static public class CancelActionListener extends EventListener<UIImportForm> {
public void execute(Event<UIImportForm> event) throws Exception {
UIImportForm importForm = event.getSource();
// remove temp file in upload service and server
UIFormUploadInput uploadInput = (UIFormUploadInput) importForm.getChildById(importForm.FILE_UPLOAD);
UploadService uploadService = importForm.getApplicationComponent(UploadService.class);
uploadService.removeUploadResource(uploadInput.getUploadId());
UIForumPortlet portlet = importForm.getAncestorOfType(UIForumPortlet.class);
UIPopupAction popupAction = portlet.getChild(UIPopupAction.class);
popupAction.deActivate();
event.getRequestContext().addUIComponentToUpdateByAjax(popupAction);
}
}
}