/*
* Copyright (C) 2003-2008 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.wcm.webui.scv;
import java.util.Collection;
import java.util.Date;
import javax.jcr.Node;
import javax.portlet.MimeResponse;
import javax.portlet.PortletMode;
import javax.portlet.PortletPreferences;
import javax.portlet.RenderResponse;
import javax.portlet.ResourceRequest;
import javax.portlet.ResourceURL;
import org.exoplatform.portal.mop.navigation.Scope;
import org.exoplatform.portal.mop.Visibility;
import org.exoplatform.portal.mop.user.UserNavigation;
import org.exoplatform.portal.mop.user.UserNode;
import org.exoplatform.portal.mop.user.UserNodeFilterConfig;
import org.exoplatform.portal.mop.user.UserPortal;
import org.exoplatform.portal.webui.util.Util;
import org.exoplatform.services.cms.templates.TemplateService;
import org.exoplatform.services.security.ConversationRegistry;
import org.exoplatform.services.security.ConversationState;
import org.exoplatform.services.wcm.core.WCMService;
import org.exoplatform.services.wcm.navigation.NavigationUtils;
import org.exoplatform.services.wcm.publication.WCMComposer;
import org.exoplatform.wcm.webui.Utils;
import org.exoplatform.web.application.RequireJS;
import org.exoplatform.webui.application.WebuiApplication;
import org.exoplatform.webui.application.WebuiRequestContext;
import org.exoplatform.webui.application.portlet.PortletRequestContext;
import org.exoplatform.webui.config.annotation.ComponentConfig;
import org.exoplatform.webui.core.UIPopupContainer;
import org.exoplatform.webui.core.UIPortletApplication;
import org.exoplatform.webui.core.lifecycle.UIApplicationLifecycle;
import org.gatein.portal.controller.resource.ResourceScope;
import org.json.JSONArray;
import org.json.JSONObject;
import org.w3c.dom.Element;
/**
* Created by The eXo Platform SAS
* Author : DANG TAN DUNG
* dzungdev@gmail.com
* Jun 9, 2008
*/
@ComponentConfig(
lifecycle = UIApplicationLifecycle.class,
template = "system:/groovy/SingleContentViewer/UISingleContentView.gtmpl"
)
public class UISingleContentViewerPortlet extends UIPortletApplication {
/** The REPOSITORY. */
public static String REPOSITORY = "repository" ;
/** The WORKSPACE. */
public static String WORKSPACE = "workspace" ;
/** The IDENTIFIER. */
public static String IDENTIFIER = "nodeIdentifier" ;
/** The DRIVE. */
public static String DRIVE = "nodeDrive";
/** The Parameterized String **/
public static String PARAMETER = "ParameterName";
/** The ShowDate **/
public static String SHOW_DATE = "ShowDate";
/** The ShowTitle **/
public static String SHOW_TITLE = "ShowTitle";
/** The ShowOptionBar **/
public static String SHOW_OPTIONBAR = "ShowOptionBar";
/** The is ContextualMode **/
public static String CONTEXTUAL_MODE= "ContextEnable";
/** The Parameterized String for printing**/
public static String PRINT_PARAMETER= "PrintParameterName";
/** The Page that show the print viewer **/
public static String PRINT_PAGE = "PrintPage";
/** The mode_. */
/** The Constant PREFERENCE_TARGET_PAGE. */
public final static String PREFERENCE_TARGET_PAGE = "basePath";
/** The Constant PREFERENCE_SHOW_SCL_WITH. */
public final static String PREFERENCE_SHOW_SCV_WITH = "showScvWith";
public static final String DEFAULT_SHOW_SCV_WITH = "content-id";
/** The Cache */
public static final String ENABLE_CACHE = "sharedCache";
public static final String NAVIGATION_SCOPE = "NavigationScope";
public static final String NAVIGATION_SCOPE_SINGLE = "single";
public static final String NAVIGATION_SCOPE_CHILDREN = "children";
public static final String NAVIGATION_SCOPE_GRAND_CHILDREN = "grandChildren";
public static final String NAVIGATION_SCOPE_ALL = "all";
private PortletMode mode = null;//PortletMode.VIEW ;
public static final String UIPreferencesPopupID = "UIPreferencesPopupWindows";
private UISCVPreferences popPreferences;
private UIPresentationContainer uiPresentation;
PortletPreferences preferences;
/**
* Instantiates a new uI single content viewer portlet.
*
* @throws Exception the exception
*/
public UISingleContentViewerPortlet() throws Exception {
addChild(UIPopupContainer.class, null, "UIPopupContainer-" + new Date().getTime());
PortletRequestContext portletRequestContext = WebuiRequestContext.getCurrentInstance();
preferences = portletRequestContext.getRequest().getPreferences();
}
/**
* Activate mode.
*
* @param newMode the mode
*
* @throws Exception the exception
*/
public void activateMode(PortletMode newMode) throws Exception{
if (getChild(UIPresentationContainer.class) !=null) {
removeChild(UIPresentationContainer.class);
}
if (getChild(UISCVPreferences.class) != null) {
removeChild(UISCVPreferences.class);
}
if(PortletMode.VIEW.equals(newMode)) {
PortletRequestContext pContext = (PortletRequestContext) WebuiRequestContext.getCurrentInstance();
uiPresentation = addChild(UIPresentationContainer.class, null, UIPresentationContainer.class.getSimpleName()
+ pContext.getWindowId());
} else if (PortletMode.EDIT.equals(newMode)) {
popPreferences = addChild(UISCVPreferences.class, null, null);
popPreferences.setInternalPreferencesMode(true);
}
}
/*
* (non-Javadoc)
* @see
* org.exoplatform.webui.core.UIPortletApplication#processRender(org.exoplatform
* .webui.application.WebuiApplication,
* org.exoplatform.webui.application.WebuiRequestContext)
*/
public void processRender(WebuiApplication app, WebuiRequestContext context) throws Exception {
PortletRequestContext pContext = (PortletRequestContext) context ;
PortletMode newMode = pContext.getApplicationMode() ;
PortletPreferences preferences = pContext.getRequest().getPreferences();
Boolean sharedCache = "true".equals(preferences.getValue(ENABLE_CACHE, "true"));
if ((context.getRemoteUser() == null && !Boolean.parseBoolean(preferences.getValue(UISingleContentViewerPortlet.CONTEXTUAL_MODE, "false")))
|| (Utils.isLiveMode() && sharedCache && !Utils.isPortalEditMode() && Utils.isPortletViewMode(pContext))) {
WCMService wcmService = getApplicationComponent(WCMService.class);
pContext.getResponse().setProperty(MimeResponse.EXPIRATION_CACHE, ""+wcmService.getPortletExpirationCache());
if (log.isTraceEnabled())
log.trace("SCV rendering : cache set to "+wcmService.getPortletExpirationCache());
}
if(!newMode.equals(mode)) {
activateMode(newMode) ;
mode = newMode ;
}
Node nodeView = null;
if (uiPresentation!=null) {
nodeView = uiPresentation.getNodeView();
if (nodeView != null) {
TemplateService templateService = getApplicationComponent(TemplateService.class);
uiPresentation.getChild(UIPresentation.class).setTemplatePath(templateService.getTemplatePath(nodeView, false));
}
}
// if (uiPresentation!=null && uiPresentation.isContextual() && nodeView!=null) {
// RenderResponse response = context.getResponse();
// Element title = response.createElement("title");
// title.setTextContent(uiPresentation.getTitle(nodeView));
// response.addProperty(MimeResponse.MARKUP_HEAD_ELEMENT, title);
// }
if (context.getRemoteUser() != null && WCMComposer.MODE_EDIT.equals(Utils.getCurrentMode())) {
pContext.getJavascriptManager().loadScriptResource(ResourceScope.SHARED, "content-selector");
pContext.getJavascriptManager().loadScriptResource(ResourceScope.SHARED, "quick-edit");
}
setId(UISingleContentViewerPortlet.class.getSimpleName() + pContext.getWindowId());
super.processRender(app, context) ;
}
public void changeToViewMode() throws Exception{
PortletRequestContext portletRequestContext = WebuiRequestContext.getCurrentInstance();
portletRequestContext.setApplicationMode(PortletMode.VIEW);
}
@Override
public void serveResource(WebuiRequestContext context) throws Exception {
super.serveResource(context);
ResourceRequest req = context.getRequest();
String nodeURI = req.getResourceID();
JSONArray jsChilds = getChildrenAsJSON(nodeURI);
if (jsChilds == null) {
return;
}
MimeResponse res = context.getResponse();
res.setContentType("text/json");
res.getWriter().write(jsChilds.toString());
}
public JSONArray getChildrenAsJSON(String nodeURI) throws Exception {
WebuiRequestContext context = WebuiRequestContext.getCurrentInstance();
Collection<UserNode> children = null;
UserPortal userPortal = Util.getPortalRequestContext().getUserPortalConfig().getUserPortal();
// make filter
UserNodeFilterConfig.Builder filterConfigBuilder = UserNodeFilterConfig.builder();
filterConfigBuilder.withReadWriteCheck().withVisibility(Visibility.DISPLAYED, Visibility.TEMPORAL);
filterConfigBuilder.withTemporalCheck();
UserNodeFilterConfig filterConfig = filterConfigBuilder.build();
// get user node & update children
UserNavigation userNav = userPortal.getNavigation(Util.getUIPortal().getSiteKey());
UserNode userNode = userPortal.resolvePath(userNav, filterConfig, nodeURI);
if (userNode != null) {
userPortal.updateNode(userNode, NavigationUtils.ECMS_NAVIGATION_SCOPE, null);
children = userNode.getChildren();
}
// build JSON result
JSONArray jsChildren = new JSONArray();
if (children == null) {
return null;
}
MimeResponse res = context.getResponse();
for (UserNode child : children) {
jsChildren.put(toJSON(child, res));
}
return jsChildren;
}
private JSONObject toJSON(UserNode node, MimeResponse res) throws Exception {
JSONObject json = new JSONObject();
String nodeId = node.getId();
json.put("label", node.getEncodedResolvedLabel());
json.put("hasChild", node.getChildrenCount() > 0);
UserNode selectedNode = Util.getUIPortal().getNavPath();
json.put("isSelected", nodeId.equals(selectedNode.getId()));
json.put("icon", node.getIcon());
String nodeURI = "";
if(node.getPageRef() != null){
nodeURI = node.getURI();
}
json.put("uri", nodeURI);
ResourceURL rsURL = res.createResourceURL();
rsURL.setResourceID(res.encodeURL(node.getURI()));
json.put("getNodeURL", rsURL.toString());
JSONArray jsonChildren = new JSONArray();
for (UserNode child : node.getChildren()) {
jsonChildren.put(toJSON(child, res));
}
json.put("childs", jsonChildren);
return json;
}
public String getNavigationScope() throws Exception {
PortletPreferences preferences = ((PortletRequestContext)WebuiRequestContext.getCurrentInstance()).
getRequest().getPreferences();
String navigationScope = preferences.getValue(NAVIGATION_SCOPE, NAVIGATION_SCOPE_CHILDREN);
return navigationScope;
}
public String getNavigation() throws Exception {
String userName = ConversationState.getCurrent().getIdentity().getUserId();
String portalName = Util.getPortalRequestContext().getPortalOwner();
PortletPreferences preferences = ((PortletRequestContext)WebuiRequestContext.getCurrentInstance()).
getRequest().getPreferences();
String navigationScope = preferences.getValue(NAVIGATION_SCOPE, NAVIGATION_SCOPE_CHILDREN);
Scope scope = Scope.CHILDREN;
switch (navigationScope) {
case NAVIGATION_SCOPE_SINGLE: scope = Scope.SINGLE; break;
case NAVIGATION_SCOPE_CHILDREN: scope = Scope.CHILDREN; break;
case NAVIGATION_SCOPE_GRAND_CHILDREN: scope = Scope.GRANDCHILDREN; break;
case NAVIGATION_SCOPE_ALL: scope = Scope.ALL; break;
}
return NavigationUtils.getNavigationAsJSON(portalName, userName, scope, navigationScope);
}
}