package org.exoplatform.forum.webui.popup;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import org.exoplatform.download.DownloadService;
import org.exoplatform.download.InputStreamDownloadResource;
import org.exoplatform.forum.ForumUtils;
import org.exoplatform.forum.service.Category;
import org.exoplatform.forum.service.Forum;
import org.exoplatform.forum.webui.BaseForumForm;
import org.exoplatform.forum.webui.UIForumPortlet;
import org.exoplatform.ks.common.webui.UIPopupAction;
import org.exoplatform.services.compress.CompressData;
import org.exoplatform.services.log.ExoLogger;
import org.exoplatform.services.log.Log;
import org.exoplatform.webui.config.annotation.ComponentConfig;
import org.exoplatform.webui.config.annotation.EventConfig;
import org.exoplatform.webui.core.UIComponent;
import org.exoplatform.webui.core.UIPopupComponent;
import org.exoplatform.webui.core.lifecycle.UIFormLifecycle;
import org.exoplatform.webui.core.model.SelectItemOption;
import org.exoplatform.webui.event.Event;
import org.exoplatform.webui.event.EventListener;
import org.exoplatform.webui.form.UIFormCheckBoxInput;
import org.exoplatform.webui.form.UIFormInputWithActions;
import org.exoplatform.webui.form.UIFormRadioBoxInput;
import org.exoplatform.webui.form.UIFormStringInput;
@ComponentConfig(
lifecycle = UIFormLifecycle.class ,
template = "app:/templates/forum/webui/popup/UIExportForm.gtmpl",
events = {
@EventConfig(listeners = UIExportForm.SaveActionListener.class),
@EventConfig(listeners = UIExportForm.CancelActionListener.class)
}
)
public class UIExportForm extends BaseForumForm implements UIPopupComponent {
public static final Log log = ExoLogger.getLogger(UIExportForm.class);
private boolean isExportAll = false;
private final static String LIST_CATEGORIES = "listCategories";
private final static String CREATE_ZIP = "createZip";
private final static String FILE_NAME = "FileName";
private final static String EXPORT_MODE = "ExportMode";
private final static String EXPORT_ALL = "ExportAll";
private final static String EXPORT_CATEGORIES = "ExportCategories";
List<Object> listObjects = new ArrayList<Object>();
private Object object_ = ForumUtils.EMPTY_STR;
public UIExportForm() {
}
public void activate() throws Exception {
}
public void deActivate() throws Exception {
}
public void setObjectId(Object object) {
this.object_ = object;
this.setActions(new String[] { "Save", "Cancel" });
if (object == null || object instanceof Category) {
Category cat = (Category) object;
UIFormCheckBoxInput<Boolean> checkBoxInput = null;
try {
UIFormInputWithActions formInputWithActions = new UIFormInputWithActions(LIST_CATEGORIES);
if (cat == null) {
for (Category category : getForumService().getCategories()) {
listObjects.add(category);
checkBoxInput = new UIFormCheckBoxInput<Boolean>(category.getId(), category.getId(), true);
checkBoxInput.setChecked(true);
formInputWithActions.addChild(checkBoxInput);
}
} else {
for (Forum forum : getForumService().getForums(cat.getId(), null)) {
listObjects.add(forum);
checkBoxInput = new UIFormCheckBoxInput<Boolean>(forum.getId(), forum.getId(), true);
checkBoxInput.setChecked(true);
formInputWithActions.addChild(checkBoxInput);
}
}
addChild(formInputWithActions);
} catch (Exception e) {
log.warn("failed to list forum categories", e);
}
UIFormStringInput stringInput = new UIFormStringInput(FILE_NAME, null);
stringInput.setValue(getLabel("DefaultFileName"));
checkBoxInput = new UIFormCheckBoxInput<Boolean>(CREATE_ZIP, CREATE_ZIP, false);
checkBoxInput.setChecked(true).setEnable(false);
addChild(stringInput);
addChild(checkBoxInput);
if (object == null) {
List<SelectItemOption<String>> list = new ArrayList<SelectItemOption<String>>();
list.add(new SelectItemOption<String>(getLabel(EXPORT_ALL), EXPORT_ALL));
list.add(new SelectItemOption<String>(getLabel(EXPORT_CATEGORIES), EXPORT_CATEGORIES));
UIFormRadioBoxInput exportMode = new UIFormRadioBoxInput(EXPORT_MODE, EXPORT_MODE, list);
exportMode.setValue(EXPORT_CATEGORIES);
addChild(exportMode);
}
} else {
UIFormStringInput stringInput = new UIFormStringInput(FILE_NAME, null);
stringInput.setValue(getLabel("DefaultFileName"));
addChild(stringInput);
addChild(new UIFormCheckBoxInput<Boolean>(CREATE_ZIP, CREATE_ZIP, false));
}
}
private List<String> getListSelected() {
List<String> listId = new ArrayList<String>();
List<UIComponent> children = ((UIFormInputWithActions) this.getChildById(LIST_CATEGORIES)).getChildren();
for (UIComponent child : children) {
if (child instanceof UIFormCheckBoxInput) {
if (((UIFormCheckBoxInput) child).isChecked()) {
listId.add(child.getName());
}
}
}
return listId;
}
static public class SaveActionListener extends EventListener<UIExportForm> {
public void execute(Event<UIExportForm> event) throws Exception {
UIExportForm exportForm = event.getSource();
String fileName = ((UIFormStringInput) exportForm.getChildById(FILE_NAME)).getValue();
UIForumPortlet portlet = exportForm.getAncestorOfType(UIForumPortlet.class);
if (fileName == null || fileName.trim().length() < 1) {
exportForm.warning("UIExportForm.msg.nameFileExport");
event.getRequestContext().addUIComponentToUpdateByAjax(portlet);
return;
}
UIFormRadioBoxInput radioBoxInput = exportForm.getChildById(EXPORT_MODE);
if (radioBoxInput != null) {
String value = radioBoxInput.getValue();
if (value.equals(EXPORT_CATEGORIES)) {
exportForm.isExportAll = false;
} else {
exportForm.isExportAll = true;
}
}
String nodePath = ForumUtils.EMPTY_STR;
String categoryId = null;
String forumId = null;
if (exportForm.object_ instanceof Forum) {
Forum forum = (Forum) exportForm.object_;
nodePath = forum.getPath();
categoryId = forum.getPath().split(ForumUtils.SLASH)[3];
forumId = forum.getId();
} else if (exportForm.object_ instanceof Category) {
Category category = (Category) exportForm.object_;
nodePath = category.getPath();
categoryId = category.getId();
}
DownloadService dservice = exportForm.getApplicationComponent(DownloadService.class);
InputStreamDownloadResource dresource;
ByteArrayOutputStream bos = new ByteArrayOutputStream();
CompressData zipService = new CompressData();
File file = null;
try {
List<String> listId = new ArrayList<String>();
if (!exportForm.isExportAll) {
if (forumId == null || forumId.trim().length() < 1)
listId.addAll(exportForm.getListSelected());
}
file = (File) exportForm.getForumService().exportXML(categoryId, forumId, listId, nodePath, bos, exportForm.isExportAll);
} catch (Exception e) {
log.error("export failed: ", e);
exportForm.warning("UIImportForm.msg.ObjectIsNoLonagerExist");
return;
}
InputStream inputStream = null;
if (file == null) {
boolean isCreateZipFile = exportForm.getUIFormCheckBoxInput(CREATE_ZIP).isChecked();
inputStream = new ByteArrayInputStream(bos.toByteArray());
if (!isCreateZipFile) {
// create file xml to dowload
dresource = new InputStreamDownloadResource(inputStream, "text/xml");
dresource.setDownloadName(fileName + ".xml");
} else {
// create zip file
zipService.addInputStream("System.xml", inputStream);
bos = new ByteArrayOutputStream();
zipService.createZip(bos);
ByteArrayInputStream zipInput = new ByteArrayInputStream(bos.toByteArray());
dresource = new InputStreamDownloadResource(zipInput, "application/zip");
dresource.setDownloadName(fileName + ".zip");
}
} else {
inputStream = new FileInputStream(file);
dresource = new InputStreamDownloadResource(inputStream, "text/xml");
dresource.setDownloadName(fileName + ".zip");
}
String downloadLink = dservice.getDownloadLink(dservice.addDownloadResource(dresource));
event.getRequestContext().getJavascriptManager().addJavascript("ajaxRedirect('" + downloadLink + "');");
UIPopupAction popupAction = portlet.getChild(UIPopupAction.class);
popupAction.deActivate();
event.getRequestContext().addUIComponentToUpdateByAjax(popupAction);
}
}
static public class CancelActionListener extends EventListener<UIExportForm> {
public void execute(Event<UIExportForm> event) throws Exception {
UIExportForm exportForm = event.getSource();
UIForumPortlet portlet = exportForm.getAncestorOfType(UIForumPortlet.class);
UIPopupAction popupAction = portlet.getChild(UIPopupAction.class);
popupAction.deActivate();
event.getRequestContext().addUIComponentToUpdateByAjax(popupAction);
}
}
}