/* * 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.services.wcm.core; import java.util.Calendar; import javax.jcr.Node; import javax.jcr.RepositoryException; import javax.jcr.lock.LockException; import javax.jcr.nodetype.ConstraintViolationException; import javax.jcr.nodetype.NoSuchNodeTypeException; import javax.jcr.version.VersionException; import org.exoplatform.commons.utils.MimeTypeResolver; import org.exoplatform.container.ExoContainer; import org.exoplatform.container.ExoContainerContext; import org.exoplatform.container.component.BaseComponentPlugin; import org.exoplatform.services.jcr.ext.common.SessionProvider; import org.exoplatform.services.wcm.portal.LivePortalManagerService; /** * Created by The eXo Platform SAS. * * @author : Hoa.Pham hoa.pham@exoplatform.com May 28, 2008 */ public abstract class BaseWebSchemaHandler extends BaseComponentPlugin implements WebSchemaHandler { protected final String EXO_OWNABLE = "exo:owneable"; protected final String NT_FOLDER = "nt:folder"; protected final String NT_UNSTRUCTURED = "nt:unstructured"; protected final String NT_FILE = "nt:file" ; /* (non-Javadoc) * @see org.exoplatform.services.wcm.core.WebSchemaHandler#matchHandler(javax.jcr.Node) */ public boolean matchHandler(SessionProvider sessionProvider, Node node) throws Exception { String handlerNodeType = getHandlerNodeType(); String parentNodeType = getParentNodeType(); if(!node.getPrimaryNodeType().getName().equals(handlerNodeType)) return false; if(!node.getParent().isNodeType(parentNodeType)) return false; return true; } /* (non-Javadoc) * @see org.exoplatform.services.wcm.core.WebSchemaHandler#onCreateNode(javax.jcr.Node) */ public void onCreateNode(SessionProvider sessionProvider, Node node) throws Exception { } /* (non-Javadoc) * @see org.exoplatform.services.wcm.core.WebSchemaHandler#onModifyNode(javax.jcr.Node) */ public void onModifyNode(SessionProvider sessionProvider, Node node) throws Exception { } /* (non-Javadoc) * @see org.exoplatform.services.wcm.core.WebSchemaHandler#onRemoveNode(javax.jcr.Node) */ public void onRemoveNode(SessionProvider sessionProvider, Node node) throws Exception { } /** * Gets the handler node type. * * @return the handler node type */ protected abstract String getHandlerNodeType() ; /** * Gets the parent node type. * * @return the parent node type */ protected abstract String getParentNodeType(); /** * Adds the mixin. * * @param node the node * @param mixin the mixin * @throws RepositoryException * @throws LockException * @throws ConstraintViolationException * @throws VersionException * @throws NoSuchNodeTypeException */ protected void addMixin(Node node, String mixin) throws NoSuchNodeTypeException, VersionException, ConstraintViolationException, LockException, RepositoryException { if (!node.isNodeType(mixin)) node.addMixin(mixin); } protected <T> T getService(Class<T> clazz) { ExoContainer container = ExoContainerContext.getCurrentContainer(); return clazz.cast(container.getComponentInstanceOfType(clazz)); } protected Node findPortalNode(SessionProvider sessionProvider, Node child) throws Exception{ LivePortalManagerService livePortalManagerService = getService(LivePortalManagerService.class); String portalName = null; for(String portalPath: livePortalManagerService.getLivePortalsPath()) { if(child.getPath().startsWith(portalPath)) { portalName = livePortalManagerService.getPortalNameByPath(portalPath); break; } } if(portalName == null) return null; return livePortalManagerService.getLivePortal(sessionProvider, portalName); } protected String getFileMimeType(Node file) throws Exception{ String mimeType = null; try { mimeType = file.getNode("jcr:content").getProperty("jcr:mimeType").getString(); } catch (Exception e) { MimeTypeResolver resolver = new MimeTypeResolver(); resolver.setDefaultMimeType("text/plain"); mimeType = resolver.getMimeType(file.getName()); } return mimeType; } protected void createDefautWebData(Node webContent) throws Exception{ //create empty css file: Node defaultCSS = addNodeAsNTFile(webContent.getNode("css"), "default.css", "text/css", ""); addMixin(defaultCSS, "exo:cssFile"); addMixin(defaultCSS,"exo:owneable"); Node defaultJS = addNodeAsNTFile(webContent.getNode("js"), "default.js", "application/x-javascript", ""); addMixin(defaultJS, "exo:jsFile"); addMixin(defaultJS,"exo:owneable"); if(!webContent.hasNode("default.html")){ Node defaultHTML = addNodeAsNTFile(webContent, "default.html", "text/html", ""); addMixin(defaultHTML, "exo:htmlFile"); addMixin(defaultHTML,"exo:owneable"); } Node illustration = addNodeAsNTFile(webContent.getNode("medias/images"), "illustration", "", ""); addMixin(illustration, "exo:owneable"); } private Node addNodeAsNTFile(Node home, String fileName,String mimeType,String data) throws Exception{ Node file = home.addNode(fileName,"nt:file"); Node jcrContent = file.addNode("jcr:content","nt:resource"); jcrContent.addMixin("dc:elementSet"); jcrContent.setProperty("jcr:encoding", "UTF-8"); jcrContent.setProperty("jcr:lastModified", Calendar.getInstance()); jcrContent.setProperty("jcr:mimeType", mimeType); jcrContent.setProperty("jcr:data", data); return file; } }