package org.exoplatform.applicationregistry.webui.component; import org.exoplatform.application.registry.Application; import org.exoplatform.application.registry.ApplicationCategory; import org.exoplatform.application.registry.ApplicationRegistryService; import org.exoplatform.applicationregistry.webui.Util; import org.exoplatform.commons.serialization.api.annotations.Serialized; import org.exoplatform.commons.utils.HTMLEntityEncoder; import org.exoplatform.commons.utils.SerializablePageList; import org.exoplatform.webui.config.annotation.ComponentConfig; import org.exoplatform.webui.config.annotation.EventConfig; import org.exoplatform.webui.core.UIContainer; import org.exoplatform.webui.core.lifecycle.UIFormLifecycle; import org.exoplatform.webui.event.Event; import org.exoplatform.webui.event.Event.Phase; import org.exoplatform.webui.event.EventListener; import org.exoplatform.webui.form.UIForm; import org.exoplatform.webui.form.UIFormInputInfo; import org.exoplatform.webui.form.UIFormInputSet; import org.exoplatform.webui.form.UIFormPageIterator; import org.exoplatform.webui.form.input.UICheckBoxInput; import java.util.ArrayList; import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Set; /** * Created by The eXo Platform SAS Author : LiemNC Email:ncliam@gmail.com November 09, 2009 */ @ComponentConfig(template = "system:/groovy/webui/form/UIForm.gtmpl", lifecycle = UIFormLifecycle.class, events = { @EventConfig(listeners = UICategorySelector.SaveActionListener.class), @EventConfig(listeners = UICategorySelector.ShowPageActionListener.class), @EventConfig(listeners = UICategorySelector.CancelActionListener.class, phase = Phase.DECODE), @EventConfig(listeners = UICategorySelector.SelectBoxActionListener.class, phase = Phase.DECODE) }) @Serialized public class UICategorySelector extends UIForm { private Application application; private static final String[] ACTIONS = new String[] { "Save", "Cancel" }; private static final String[] TABLE_COLUMNS = { "choose", "categoryName" }; private Set<String> selectedCategories = new HashSet<String>(); public UICategorySelector() throws Exception { init(); } public List<ApplicationCategory> getAllCategories() { try { ApplicationRegistryService appRegService = getApplicationComponent(ApplicationRegistryService.class); List<ApplicationCategory> categories = appRegService.getApplicationCategories(new Util.CategoryComparator()); categories = categories != null ? categories : new ArrayList<ApplicationCategory>(); return categories; } catch (Exception e) { throw new RuntimeException(e); } } @Override public boolean isRendered() { return (getAllCategories().size() > 0 && super.isRendered()); } public void init() throws Exception { UIFormTableIteratorInputSet uiTableInputSet = createUIComponent(UIFormTableIteratorInputSet.class, null, null); uiTableInputSet.setName(getClass().getSimpleName()); uiTableInputSet.setId(getClass().getSimpleName()); uiTableInputSet.setColumns(TABLE_COLUMNS); addChild(uiTableInputSet); UIFormInputSet uiInputSet; UICheckBoxInput checkBoxInput; UIFormInputInfo uiInfo; HTMLEntityEncoder encoder = HTMLEntityEncoder.getInstance(); // ApplicationRegistryService appRegService = getApplicationComponent(ApplicationRegistryService.class); List<ApplicationCategory> categories = getAllCategories(); List<UIFormInputSet> uiInputSetList = new ArrayList<UIFormInputSet>(); for (ApplicationCategory category : categories) { uiInputSet = new UIFormInputSet(category.getName()); boolean defaultValue = false; if (application != null) { String definitionName = application.getDisplayName().replace(' ', '_'); defaultValue = appRegService.getApplication(category.getName(), definitionName) != null; } checkBoxInput = new UICheckBoxInput("category_" + category.getName(), null, defaultValue); checkBoxInput.setOnChange("SelectBox"); uiInfo = new UIFormInputInfo("categoryName", null, encoder.encode(category.getDisplayName(true))); uiInputSet.addChild(checkBoxInput); uiInputSet.addChild(uiInfo); uiTableInputSet.addChild(uiInputSet); uiInputSetList.add(uiInputSet); } UIFormPageIterator uiIterator = uiTableInputSet.getChild(UIFormPageIterator.class); SerializablePageList<UIFormInputSet> pageList = new SerializablePageList<UIFormInputSet>(UIFormInputSet.class, uiInputSetList, 10); uiIterator.setPageList(pageList); } public String[] getActions() { return ACTIONS; } public void setApplication(Application app) { this.application = app; } public Application getApplication() { return this.application; } private void clearSelectedCategories() { selectedCategories.clear(); } private void addSelectedCategory(String category) { selectedCategories.add(category); } private Set<String> getSelectedCategories() { return Collections.unmodifiableSet(selectedCategories); } public static class SaveActionListener extends EventListener<UICategorySelector> { public void execute(Event<UICategorySelector> event) throws Exception { UICategorySelector selector = event.getSource(); ApplicationRegistryService appRegService = selector.getApplicationComponent(ApplicationRegistryService.class); List<ApplicationCategory> categories = appRegService.getApplicationCategories(); categories = categories != null ? categories : new ArrayList<ApplicationCategory>(); for (ApplicationCategory category : categories) { if (selector.getSelectedCategories().contains("category_" + category.getName())) { Application newApp = cloneApplication(selector.getApplication()); UIApplicationRegistryPortlet.setPermissionToAdminGroup(newApp); appRegService.save(category, newApp); } } selector.clearSelectedCategories(); UIContainer appInfo = selector.getParent(); appInfo.getChild(UICategorySelector.class).setRendered(false); UIApplicationRegistryPortlet uiPortlet = appInfo.getAncestorOfType(UIApplicationRegistryPortlet.class); UIApplicationOrganizer uiOrganizer = uiPortlet.getChild(UIApplicationOrganizer.class); UIGadgetManagement uiGadgetManagement = uiPortlet.getChild(UIGadgetManagement.class); uiOrganizer.reload(); if (uiGadgetManagement != null) { uiGadgetManagement.setSelectedGadget(selector.getApplication().getApplicationName()); } event.getRequestContext().addUIComponentToUpdateByAjax(appInfo); } private Application cloneApplication(Application app) { Application newApp = new Application(); newApp.setApplicationName(app.getApplicationName()); newApp.setDisplayName(app.getDisplayName()); newApp.setType(app.getType()); newApp.setDescription(app.getDescription()); newApp.setAccessPermissions(app.getAccessPermissions()); newApp.setContentId(app.getContentId()); return newApp; } } public static class CancelActionListener extends EventListener<UICategorySelector> { public void execute(Event<UICategorySelector> event) throws Exception { UICategorySelector selector = event.getSource(); selector.clearSelectedCategories(); UIContainer appInfo = selector.getParent(); appInfo.getChild(UICategorySelector.class).setRendered(false); event.getRequestContext().addUIComponentToUpdateByAjax(appInfo); } } public static class SelectBoxActionListener extends EventListener<UICategorySelector> { @Override public void execute(Event<UICategorySelector> event) throws Exception { UICategorySelector selector = event.getSource(); ApplicationRegistryService appRegService = selector.getApplicationComponent(ApplicationRegistryService.class); List<ApplicationCategory> categories = appRegService.getApplicationCategories(); UICheckBoxInput chkInput; for (ApplicationCategory category : categories) { chkInput = selector.getUIInput("category_" + category.getName()); if (chkInput != null && chkInput.isChecked()) { selector.addSelectedCategory("category_" + category.getName()); } } } } public static class ShowPageActionListener extends EventListener<UICategorySelector> { public void execute(Event<UICategorySelector> event) throws Exception { UICategorySelector selector = event.getSource(); UICheckBoxInput chkInput; for (String category : selector.getSelectedCategories()) { chkInput = selector.getUIInput(category); chkInput.setChecked(true); } event.getRequestContext().addUIComponentToUpdateByAjax(selector); } } }