ManageViewServiceImpl.java
/*
* 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.services.cms.views.impl;
import java.io.ByteArrayInputStream;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import javax.jcr.AccessDeniedException;
import javax.jcr.Node;
import javax.jcr.NodeIterator;
import javax.jcr.Session;
import org.exoplatform.services.cms.BasePath;
import org.exoplatform.services.cms.impl.DMSConfiguration;
import org.exoplatform.services.cms.impl.DMSRepositoryConfiguration;
import org.exoplatform.services.cms.templates.TemplateService;
import org.exoplatform.services.cms.views.ManageViewService;
import org.exoplatform.services.cms.views.ViewConfig;
import org.exoplatform.services.cms.views.ViewConfig.Tab;
import org.exoplatform.services.jcr.RepositoryService;
import org.exoplatform.services.jcr.core.ManageableRepository;
import org.exoplatform.services.jcr.ext.common.SessionProvider;
import org.exoplatform.services.jcr.ext.hierarchy.NodeHierarchyCreator;
import org.exoplatform.services.jcr.util.Text;
import org.exoplatform.services.log.ExoLogger;
import org.exoplatform.services.log.Log;
import org.exoplatform.services.wcm.utils.WCMCoreUtils;
import org.exoplatform.webui.ext.UIExtension;
import org.exoplatform.webui.ext.UIExtensionManager;
import org.picocontainer.Startable;
public class ManageViewServiceImpl implements ManageViewService, Startable {
/**
* Logger.
*/
private static final Log LOG = ExoLogger.getLogger(ManageViewServiceImpl.class.getName());
protected final static String EXO_TEMPLATE = "exo:template" ;
protected final static String ADMIN_VIEW = "admin" ;
protected final static String DEFAULT_VIEW = "default" ;
protected final static String EXO_PERMISSIONS = "exo:accessPermissions" ;
protected final static String EXO_HIDE_EXPLORER_PANEL = "exo:hideExplorerPanel";
protected final static String BUTTON_PROP = "exo:buttons" ;
private final List<ManageViewPlugin> plugins_ = new ArrayList<ManageViewPlugin> ();
private List<?> buttons_ ;
private final RepositoryService repositoryService_ ;
private String baseViewPath_ ;
private final NodeHierarchyCreator nodeHierarchyCreator_ ;
private final DMSConfiguration dmsConfiguration_;
private final UIExtensionManager extensionManager_;
private TemplateService templateService;
private Set<String> configuredTemplates_;
private Set<String> configuredViews_;
/**
* Constructor
* @param jcrService : Manage repository
* @param nodeHierarchyCreator : Manage alias path
* @param dmsConfiguration : Manage dms-system workspace
* @param extensionManager : Manage UIComponent in each view
* @throws Exception
*/
public ManageViewServiceImpl(RepositoryService jcrService,
NodeHierarchyCreator nodeHierarchyCreator, DMSConfiguration dmsConfiguration,
UIExtensionManager extensionManager) throws Exception{
repositoryService_ = jcrService ;
nodeHierarchyCreator_ = nodeHierarchyCreator ;
baseViewPath_ = nodeHierarchyCreator_.getJcrPath(BasePath.CMS_VIEWS_PATH) ;
dmsConfiguration_ = dmsConfiguration;
extensionManager_ = extensionManager;
templateService = WCMCoreUtils.getService(TemplateService.class);
}
/**
* Add buttons defined in configuration file
*/
private void initButtons() {
List<UIExtension> extensions = extensionManager_.getUIExtensions(EXTENSION_TYPE);
List<String> actions = new ArrayList<String>();
if (extensions != null) {
for (UIExtension extension : extensions) {
actions.add(extension.getName());
}
}
// prevent from any undesired modification
buttons_ = Collections.unmodifiableList(actions);
}
//Start initiating from configuration file
public void start() {
configuredTemplates_ = new HashSet<String>();
configuredViews_ = new HashSet<String>();
try {
initButtons();
for(ManageViewPlugin plugin : plugins_) {
plugin.init();
configuredTemplates_.addAll(plugin.getConfiguredTemplates());
configuredViews_.addAll(plugin.getConfiguredViews());
}
} catch(Exception e) {
if (LOG.isErrorEnabled()) {
LOG.error("an error occured while starting the component", e);
}
}
}
/**
* {@inheritDoc}
*/
public void stop() { }
/**
* {@inheritDoc}
*/
public void init() throws Exception {
configuredTemplates_ = new HashSet<String>();
configuredViews_ = new HashSet<String>();
for(ManageViewPlugin plugin : plugins_) {
plugin.init() ;
configuredTemplates_.addAll(plugin.getConfiguredTemplates());
configuredViews_.addAll(plugin.getConfiguredViews());
}
}
/**
* {@inheritDoc}
*/
public void setManageViewPlugin(ManageViewPlugin viewPlugin) {
plugins_.add(viewPlugin) ;
}
/**
* {@inheritDoc}
*/
public List<?> getButtons(){
return buttons_ ;
}
/**
* {@inheritDoc}
*/
public Node getViewHome() throws Exception {
String viewsPath = nodeHierarchyCreator_.getJcrPath(BasePath.CMS_VIEWS_PATH);
return (Node) getSession().getItem(viewsPath);
}
/**
* {@inheritDoc}
*/
public List<ViewConfig> getAllViews() throws Exception {
List<ViewConfig> viewList = new ArrayList<ViewConfig>() ;
ViewConfig view = null;
Node viewNode = null ;
String viewsPath = nodeHierarchyCreator_.getJcrPath(BasePath.CMS_VIEWS_PATH);
Session session = getSession();
try {
Node viewHome = (Node)session.getItem(viewsPath) ;
for(NodeIterator iter = viewHome.getNodes(); iter.hasNext();) {
view = new ViewConfig() ;
viewNode = iter.nextNode() ;
view.setName(viewNode.getName()) ;
view.setPermissions(viewNode.getProperty(EXO_PERMISSIONS).getString()) ;
view.setTemplate(viewNode.getProperty(EXO_TEMPLATE).getString()) ;
List<Tab> tabList = new ArrayList<Tab>() ;
for(NodeIterator tabsIterator = viewNode.getNodes(); tabsIterator.hasNext(); ) {
Tab tab = new Tab();
tab.setTabName(tabsIterator.nextNode().getName());
tabList.add(tab) ;
}
view.setTabList(tabList) ;
viewList.add(view) ;
}
} catch(AccessDeniedException ace) {
return new ArrayList<ViewConfig>() ;
} finally {
if(session != null) session.logout();
}
return viewList ;
}
/**
* {@inheritDoc}
*/
public boolean hasView(String name) throws Exception {
Session session = getSession();
Node viewHome = (Node) session.getItem(baseViewPath_);
boolean b = viewHome.hasNode(name);
session.logout();
return b;
}
/**
* {@inheritDoc}
*/
public Node getViewByName(String name, SessionProvider provider) throws Exception {
Session session = getSession(provider);
try {
return (Node) session.getItem(baseViewPath_ + "/" + name);
} catch (AccessDeniedException ace) {
return null;
}
}
/**
* {@inheritDoc}
*/
public void addView(String name, String permissions, String template, List<?> tabs) throws Exception {
addView(name, permissions, false, template, tabs);
}
/**
* {@inheritDoc}
*/
public void addView(String name, String permissions, boolean hideExplorerPanel, String template, List<?> tabs)
throws Exception {
Session session = getSession();
Node viewHome = (Node) session.getItem(baseViewPath_);
Node view;
if (viewHome.hasNode(name)) {
view = viewHome.getNode(name);
if (!view.isCheckedOut())
view.checkout();
view.setProperty(EXO_PERMISSIONS, permissions);
view.setProperty(EXO_TEMPLATE, template);
view.setProperty(EXO_HIDE_EXPLORER_PANEL, hideExplorerPanel);
} else {
view = addView(viewHome, name, hideExplorerPanel, permissions, template);
}
String tabName;
String buttons;
for (int i = 0; i < tabs.size(); i++) {
try {
Node tab = (Node) tabs.get(i);
tabName = tab.getName();
buttons = tab.getProperty(BUTTON_PROP).getString();
} catch (Exception e) {
Tab tab = (Tab) tabs.get(i);
tabName = Text.escapeIllegalJcrChars(tab.getTabName());
buttons = tab.getButtons();
}
addTab(view, tabName, buttons);
}
viewHome.save();
session.save();
session.logout();
}
/**
* {@inheritDoc}
*/
public void removeView(String viewName) throws Exception {
Session session = getSession() ;
Node viewHome = (Node)session.getItem(baseViewPath_) ;
if(viewHome.hasNode(viewName)){
Node view = viewHome.getNode(viewName) ;
view.remove() ;
viewHome.save() ;
session.save();
}
session.logout();
}
/**
* {@inheritDoc}
*/
public void addTab(Node view, String name, String buttons) throws Exception {
Node tab ;
if(view.hasNode(name)){
tab = view.getNode(name) ;
}else {
tab = view.addNode(name, "exo:tab");
}
tab.setProperty("exo:buttons", buttons);
view.save() ;
}
/**
* {@inheritDoc}
*/
public Node getTemplateHome(String homeAlias, SessionProvider provider) throws Exception{
String homePath = getJCRPath(homeAlias) ;
Session session = getSession(provider) ;
try {
return (Node)session.getItem(homePath);
} catch(AccessDeniedException ace) {
return null ;
}
}
/**
* Get path by alias
* @param jcrAlias
* @return
* @throws Exception
*/
private String getJCRPath(String jcrAlias) throws Exception{
return nodeHierarchyCreator_.getJcrPath(jcrAlias) ;
}
/**
* Get session by repository
*
* @return
* @throws Exception
*/
private Session getSession() throws Exception {
ManageableRepository manageableRepository = repositoryService_.getCurrentRepository() ;
DMSRepositoryConfiguration dmsRepoConfig = dmsConfiguration_.getConfig();
return manageableRepository.getSystemSession(dmsRepoConfig.getSystemWorkspace()) ;
}
/**
* Get session by SessionProvider
* @param sessionProvider
* @return
* @throws Exception
*/
private Session getSession(SessionProvider sessionProvider) throws Exception{
ManageableRepository manageableRepository = repositoryService_.getCurrentRepository() ;
DMSRepositoryConfiguration dmsRepoConfig = dmsConfiguration_.getConfig();
return sessionProvider.getSession(dmsRepoConfig.getSystemWorkspace(), manageableRepository) ;
}
/**
* {@inheritDoc}
*/
public List<Node> getAllTemplates(String homeAlias, SessionProvider provider) throws Exception {
Node templateHomNode = getTemplateHome(homeAlias, provider);
List<Node> list = new ArrayList<Node>();
if (templateHomNode == null)
return list;
for (NodeIterator iter = templateHomNode.getNodes(); iter.hasNext();) {
list.add(iter.nextNode());
}
return list;
}
/**
* {@inheritDoc}
*/
public Node getTemplate(String path, SessionProvider provider) throws Exception{
return (Node)getSession(provider).getItem(path) ;
}
/**
* {@inheritDoc}
*/
public String addTemplate(String name, String content, String homeTemplate) throws Exception {
Session session = getSession() ;
Node templateHome = (Node)session.getItem(homeTemplate) ;
String templatePath = templateService.createTemplate(templateHome,
name, name,
new ByteArrayInputStream(content.getBytes()),
new String[] { "*" });
session.save();
return templatePath;
}
/**
* {@inheritDoc}
*/
public String addTemplate(String name,
String content,
String homeTemplate,
SessionProvider provider) throws Exception {
Session session = getSession(provider);
Node templateHome = (Node) session.getItem(homeTemplate);
String templatePath = templateService.createTemplate(templateHome,
name, name,
new ByteArrayInputStream(content.getBytes()),
new String[] { "*" });
session.save();
return templatePath;
}
/**
* {@inheritDoc}
*/
public String updateTemplate(String name, String content, String homeTemplate) throws Exception {
Session session = getSession() ;
Node templateHome = (Node)session.getItem(homeTemplate) ;
String templatePath = templateService.updateTemplate(templateHome.getNode(name),
new ByteArrayInputStream(content.getBytes()),
new String[] { "*" });
session.save();
return templatePath;
}
/**
* {@inheritDoc}
*/
public String updateTemplate(String name,
String content,
String homeTemplate,
SessionProvider provider) throws Exception {
Session session = getSession(provider);
Node templateHome = (Node) session.getItem(homeTemplate);
String templatePath = templateService.updateTemplate(templateHome.getNode(name),
new ByteArrayInputStream(content.getBytes()),
new String[] { "*" });
session.save();
return templatePath;
}
/**
* {@inheritDoc}
*/
public void removeTemplate(String templatePath) throws Exception {
Node selectedTemplate = (Node) getSession().getItem(templatePath);
Node parent = selectedTemplate.getParent();
selectedTemplate.remove();
parent.save();
parent.getSession().save();
}
/**
* {@inheritDoc}
*/
public void removeTemplate(String templatePath, SessionProvider provider) throws Exception {
Node selectedTemplate = (Node) getSession(provider).getItem(templatePath);
Node parent = selectedTemplate.getParent();
selectedTemplate.remove();
parent.save();
parent.getSession().save();
}
/**
* Add view node into one node with given name, permssion and template
* @param viewManager
* @param name
* @param permissions
* @param template
* @return
* @throws Exception
*/
private Node addView(Node viewManager, String name, boolean hideExplorerPanel, String permissions, String template)
throws Exception {
Node contentNode = viewManager.addNode(name, "exo:view");
contentNode.setProperty("exo:accessPermissions", permissions);
contentNode.setProperty("exo:template", template);
contentNode.setProperty(EXO_HIDE_EXPLORER_PANEL, hideExplorerPanel);
viewManager.save();
return contentNode;
}
@Override
public Set<String> getConfiguredTemplates() {
return configuredTemplates_;
}
@Override
public Set<String> getConfiguredViews() {
return configuredViews_;
}
}