/*
* Copyright (C) 2003-2007 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.webui.component.explorer.popup.actions;
import java.security.AccessControlException;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.ResourceBundle;
import java.util.TreeMap;
import javax.jcr.Node;
import javax.jcr.PathNotFoundException;
import org.exoplatform.ecm.webui.component.explorer.optionblocks.UIOptionBlockPanel;
import org.exoplatform.portal.webui.util.Util;
import org.exoplatform.services.cms.templates.TemplateService;
import org.exoplatform.services.log.ExoLogger;
import org.exoplatform.services.log.Log;
import org.exoplatform.services.wcm.core.NodeLocation;
import org.exoplatform.web.application.RequestContext;
import org.exoplatform.webui.application.WebuiRequestContext;
import org.exoplatform.webui.config.annotation.ComponentConfig;
import org.exoplatform.webui.core.UIComponent;
import org.exoplatform.webui.core.UIContainer;
import org.exoplatform.webui.core.UIPopupComponent;
import org.exoplatform.webui.core.UIPopupWindow;
import org.exoplatform.webui.ext.UIExtension;
import org.exoplatform.webui.ext.UIExtensionManager;
/**
* Created by The eXo Platform SARL
* Author : Pham Tuan
* phamtuanchip@yahoo.de
* Nov 8, 2006 10:16:18 AM
*/
@ComponentConfig(
template = "app:/groovy/webui/component/explorer/UIDocumentFormController.gtmpl"
)
public class UIDocumentFormController extends UIContainer implements UIPopupComponent {
private static final Log LOG = ExoLogger.getLogger(UIDocumentFormController.class.getName());
private NodeLocation currentNode_ ;
private String repository_ ;
private String OPTION_BLOCK_EXTENSION_TYPE = "org.exoplatform.ecm.dms.UIOptionBlockPanel";
private List<UIComponent> listExtenstion = new ArrayList<UIComponent>();
private boolean isDisplayOptionPanel = false;
public UIDocumentFormController() throws Exception {
addChild(UISelectDocumentForm.class, null, null);
UIDocumentForm uiDocumentForm = createUIComponent(UIDocumentForm.class, null, null) ;
uiDocumentForm.addNew(true);
uiDocumentForm.setShowActionsOnTop(true);
addChild(uiDocumentForm);
uiDocumentForm.setRendered(false);
}
public void setCurrentNode(Node node) {
currentNode_ = NodeLocation.getNodeLocationByNode(node);
}
public void setRepository(String repository) {
repository_ = repository;
}
public void initPopup(UIComponent uiComp) throws Exception {
removeChildById("PopupComponent") ;
UIPopupWindow uiPopup = addChild(UIPopupWindow.class, null, "PopupComponent") ;
uiPopup.setShowMask(true);
uiPopup.setUIComponent(uiComp) ;
uiPopup.setWindowSize(640, 300) ;
uiPopup.setShow(true) ;
uiPopup.setResizable(true) ;
}
public List<String> getListFileType() throws Exception {
TemplateService templateService = getApplicationComponent(TemplateService.class) ;
return templateService.getCreationableContentTypes(NodeLocation.getNodeByLocation(currentNode_));
}
public void bindContentType() throws Exception {
Comparator<String> ascComparator = new Comparator<String>() {
@Override
public int compare(String s1, String s2) {
return s1.compareTo(s2) ;
}
};
Map<String, String> templates = new TreeMap <String, String>(ascComparator);
TemplateService templateService = getApplicationComponent(TemplateService.class) ;
List<String> acceptableContentTypes =
templateService.getCreationableContentTypes(NodeLocation.getNodeByLocation(currentNode_));
if(acceptableContentTypes.size() == 0) return;
String userName = Util.getPortalRequestContext().getRemoteUser();
for(String contentType: acceptableContentTypes) {
try {
String label = templateService.getTemplateLabel(contentType);
String templatePath = templateService.getTemplatePathByUser(true, contentType, userName);
if ((templatePath != null) && (templatePath.length() > 0)) {
templates.put(label, contentType);
}
} catch (AccessControlException e) {
if (LOG.isDebugEnabled()) {
LOG.warn(userName + " do not have sufficient permission to access " + contentType + " template.");
}
} catch (PathNotFoundException e) {
if (LOG.isWarnEnabled()) {
LOG.warn("Node type template %s does not exist!", contentType);
}
} catch (Exception e) {
if (LOG.isWarnEnabled()) {
LOG.warn(e.getMessage());
}
}
}
if(templates.size()>0) {
UISelectDocumentForm uiSelectForm = getChild(UISelectDocumentForm.class) ;
if (templates.size() > 1) {
uiSelectForm.setDocumentTemplates(templates);
} else {
UIDocumentFormController uiDCFormController = uiSelectForm.getParent() ;
UIDocumentForm documentForm = uiDCFormController.getChild(UIDocumentForm.class) ;
documentForm.addNew(true);
documentForm.getChildren().clear() ;
documentForm.resetInterceptors();
documentForm.resetProperties();
documentForm.setContentType(templates.values().iterator().next());
documentForm.setCanChangeType(false);
uiSelectForm.setRendered(false);
documentForm.setRendered(true);
}
}
}
public void init() throws Exception {
getChild(UIDocumentForm.class).setRepositoryName(repository_) ;
getChild(UIDocumentForm.class).setWorkspace(currentNode_.getWorkspace()) ;
getChild(UIDocumentForm.class).setStoredPath(currentNode_.getPath()) ;
getChild(UIDocumentForm.class).resetProperties();
}
public void activate() {
}
/**
* Remove lock if node is locked for editing
*/
public void deActivate() {
try {
UIDocumentForm uiDocumentForm = getChild(UIDocumentForm.class);
if (uiDocumentForm != null) {
uiDocumentForm.releaseLock();
}
} catch (Exception e) {
if (LOG.isErrorEnabled()) {
LOG.error("Unexpected error!", e.getMessage());
}
}
}
@SuppressWarnings("unchecked")
@Override
public <T extends UIComponent> T setRendered(boolean rendered)
{
UIComponent res = super.setRendered(rendered);
if (rendered == false) {
try {
deActivate();
} catch (Exception ex) {
if (LOG.isErrorEnabled()) {
LOG.error("Unknown err:", ex);
}
}
}
return (T)res;
}
@Override
public void processRender(WebuiRequestContext context) throws Exception {
UIPopupWindow uiPopup = getAncestorOfType(UIPopupWindow.class);
if (uiPopup != null && !uiPopup.isShow()) {
uiPopup.setShowMask(true);
deActivate();
}
super.processRender(context);
}
/*
*
* This method get Option Block Panel extenstion and add it into this
*
* */
public void addOptionBlockPanel() throws Exception {
UIExtensionManager manager = getApplicationComponent(UIExtensionManager.class);
List<UIExtension> extensions = manager.getUIExtensions(OPTION_BLOCK_EXTENSION_TYPE);
for (UIExtension extension : extensions) {
UIComponent uicomp = manager.addUIExtension(extension, null, this);
uicomp.setRendered(false);
listExtenstion.add(uicomp);
}
}
/*
* This method checks and returns true if the Option Block Panel is configured to display, else it returns false
* */
public boolean isHasOptionBlockPanel() {
UIExtensionManager manager = getApplicationComponent(UIExtensionManager.class);
List<UIExtension> extensions = manager.getUIExtensions(OPTION_BLOCK_EXTENSION_TYPE);
if(extensions != null) {
return true;
}
return false;
}
public void setDisplayOptionBlockPanel(boolean display) {
for(UIComponent uicomp : listExtenstion) {
uicomp.setRendered(display);
}
isDisplayOptionPanel = display;
}
public boolean isDisplayOptionBlockPanel() {
return isDisplayOptionPanel;
}
public void initOptionBlockPanel() throws Exception {
if(isHasOptionBlockPanel()) {
addOptionBlockPanel();
UIOptionBlockPanel optionBlockPanel = this.getChild(UIOptionBlockPanel.class);
if(optionBlockPanel.isHasOptionBlockExtension()) {
optionBlockPanel.addOptionBlockExtension();
setDisplayOptionBlockPanel(true);
}
}
}
public String getClosingConfirmMsg(String key) {
RequestContext context = RequestContext.getCurrentInstance();
ResourceBundle res = context.getApplicationResourceBundle();
return res.getString(key);
}
}