package org.exoplatform.forum.webui.popup;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.exoplatform.download.DownloadService;
import org.exoplatform.download.InputStreamDownloadResource;
import org.exoplatform.forum.ForumUtils;
import org.exoplatform.forum.common.webui.WebUIUtils;
import org.exoplatform.forum.service.Category;
import org.exoplatform.forum.service.Forum;
import org.exoplatform.forum.service.Utils;
import org.exoplatform.forum.service.filter.model.ForumFilter;
import org.exoplatform.forum.webui.BaseForumForm;
import org.exoplatform.forum.webui.UIForumPortlet;
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.UIFormInputWithActions;
import org.exoplatform.webui.form.UIFormRadioBoxInput;
import org.exoplatform.webui.form.UIFormStringInput;
import org.exoplatform.webui.form.input.UICheckBoxInput;
@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";
Map<String, String> mapObject = new HashMap<String, String>();
private Object object_ = ForumUtils.EMPTY_STR;
public UIExportForm() {
this.setActions(new String[] { "Save", "Cancel" });
}
public void activate() {
}
public void deActivate() {
}
private void clearDataForm() throws Exception {
List<UIComponent> components = new ArrayList<UIComponent>(getChildren());
for (UIComponent uiComponent : components) {
removeChild(uiComponent.getClass());
}
mapObject.clear();
}
public void setObjectId(Object object) throws Exception {
this.object_ = object;
clearDataForm();
if (object == null || object instanceof Category) {
Category cat = (Category) object;
UICheckBoxInput checkBoxInput = null;
try {
UIFormInputWithActions formInputWithActions = new UIFormInputWithActions(LIST_CATEGORIES);
if (cat == null) {
for (Category category : getForumService().getCategories()) {
mapObject.put(category.getId(), category.getCategoryName());
checkBoxInput = new UICheckBoxInput(category.getId(), category.getId(), true);
checkBoxInput.setChecked(true);
formInputWithActions.addChild(checkBoxInput);
}
} else {
for (Forum forum : getForumService().getForums(new ForumFilter(cat.getId(), true))) {
mapObject.put(forum.getId(), forum.getForumName());
checkBoxInput = new UICheckBoxInput(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 UICheckBoxInput(CREATE_ZIP, CREATE_ZIP, false);
checkBoxInput.setChecked(true).setDisabled(true);
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 UICheckBoxInput(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 UICheckBoxInput) {
if (((UICheckBoxInput) 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 (ForumUtils.isEmpty(fileName)) {
exportForm.warning("UIExportForm.msg.nameFileExport");
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.getCategoryId();
forumId = forum.getId();
} else if (exportForm.object_ instanceof Category) {
Category category = (Category) exportForm.object_;
nodePath = category.getPath();
categoryId = category.getId();
}
if (ForumUtils.isEmpty(forumId) && exportForm.mapObject.size() == 0) {
exportForm.warning("UICategory.msg.emptyCategoryExport", false);
portlet.cancelAction();
return;
}
ByteArrayOutputStream bos = new ByteArrayOutputStream();
InputStreamDownloadResource dresource = null;
File file = null;
try {
try {
List<String> listId = new ArrayList<String>();
if (!exportForm.isExportAll) {
if (ForumUtils.isEmpty(forumId)) {
String type = Utils.CATEGORY;
String path = ForumUtils.EMPTY_STR;
if (!ForumUtils.isEmpty(categoryId)) {
type = Utils.FORUM;
path = categoryId.concat(ForumUtils.SLASH);
}
for (String str : exportForm.getListSelected()) {
if (exportForm.getForumService().getObjectNameByPath(path.concat(str)) != null) {
listId.add(str);
} else {
String sms = (type.equals(Utils.FORUM)) ? "UIExportForm.msg.ForumIsNoLonagerExist" : "UIExportForm.msg.CategoryIsNoLonagerExist";
exportForm.warning(sms, new String[] { exportForm.mapObject.get(str) }, false);
event.getRequestContext().addUIComponentToUpdateByAjax(portlet);
return;
}
}
if (listId.isEmpty()) {
String sms = (type.equals(Utils.FORUM)) ? "UIExportForm.msg.NotCheckForum" : "UIExportForm.msg.NotCheckCategory";
exportForm.warning(sms);
return;
}
} else {
if (exportForm.getForumService().getObjectNameByPath(categoryId.concat(ForumUtils.SLASH).concat(forumId)) == null) {
exportForm.warning("UIExportForm.msg.ForumIsNoLonagerExist",
new String[] { ((Forum) exportForm.object_).getForumName() }, false);
portlet.cancelAction();
portlet.renderForumHome();
event.getRequestContext().addUIComponentToUpdateByAjax(portlet);
return;
}
}
}
file = (File) exportForm.getForumService().exportXML(categoryId, forumId, listId, nodePath, bos, exportForm.isExportAll);
} catch (Exception e) {
log.error("export failed: ", e);
exportForm.warning("UIExportForm.msg.UnknownException");
return;
}
if (file == null) {
boolean isCreateZipFile = exportForm.getUICheckBoxInput(CREATE_ZIP).isChecked();
if (!isCreateZipFile) {
dresource = new InputStreamDownloadResource(new ByteArrayInputStream(bos.toByteArray()), "text/xml");
dresource.setDownloadName(fileName + ".xml");
} else {
CompressData zipService = new CompressData();
zipService.addInputStream("System.xml", new ByteArrayInputStream(bos.toByteArray()));
bos = new ByteArrayOutputStream();
zipService.createZip(bos);
dresource = new InputStreamDownloadResource(new ByteArrayInputStream(bos.toByteArray()), "application/zip");
dresource.setDownloadName(fileName + ".zip");
}
} else {
dresource = new InputStreamDownloadResource(new FileInputStream(file), "application/zip");
dresource.setDownloadName(fileName + ".zip");
}
DownloadService dservice = exportForm.getApplicationComponent(DownloadService.class);
String downloadLink = dservice.getDownloadLink(dservice.addDownloadResource(dresource)).replaceAll("&", "&");
event.getRequestContext().getJavascriptManager().addJavascript("(function(){ window.location.href = '" + downloadLink + "';})();");
portlet.cancelAction();
} finally {
if (bos != null) {
bos.close();
}
}
}
}
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);
portlet.cancelAction();
}
}
protected void initJavaScripts() {
WebUIUtils.addScripts("ForumCheckBox", "forumCheckBox", "forumCheckBox.init('"+getId()+"');");
}
}