shuber 2005/01/31 10:33:16 CET
Modified files:
core/src/java/org/jahia/params SoapParamBean.java
core/src/webapp/WEB-INF/etc/slide domain.xml
Added files:
core/src/webapp/WEB-INF/etc/slide listener.properties
core/src/java/org/jahia/services/webdav/listeners
CMSSlideContentListener.java
Log:
Add a new CMS Slide content event listener that allows the creation of pages
when directories are created in Slide content.
This implementation is not yet complete, still to do :
- creation of containers when files are uploaded
- renaming of directories and files
- deletion of directories and files
Revision Changes Path
1.4 +10 -0 jahia/core/src/java/org/jahia/params/SoapParamBean.java
http://jahia.mine.nu:8080/cgi-bin/cvsweb.cgi/jahia/core/src/java/org/jahia/params/SoapParamBean.java.diff?r1=1.3&r2=1.4&f=h
1.1 +277 -0
jahia/core/src/java/org/jahia/services/webdav/listeners/CMSSlideContentListener.java
(new)
http://jahia.mine.nu:8080/cgi-bin/cvsweb.cgi/jahia/core/src/java/org/jahia/services/webdav/listeners/CMSSlideContentListener.java?rev=1.1&content-type=text/plain
1.2 +2 -0 jahia/core/src/webapp/WEB-INF/etc/slide/domain.xml
http://jahia.mine.nu:8080/cgi-bin/cvsweb.cgi/jahia/core/src/webapp/WEB-INF/etc/slide/domain.xml.diff?r1=1.1&r2=1.2&f=h
1.1 +5 -0
jahia/core/src/webapp/WEB-INF/etc/slide/listener.properties (new)
http://jahia.mine.nu:8080/cgi-bin/cvsweb.cgi/jahia/core/src/webapp/WEB-INF/etc/slide/listener.properties?rev=1.1&content-type=text/plain
Index: SoapParamBean.java
===================================================================
RCS file:
/home/cvs/repository/jahia/core/src/java/org/jahia/params/SoapParamBean.java,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- SoapParamBean.java 5 Aug 2004 12:34:08 -0000 1.3
+++ SoapParamBean.java 31 Jan 2005 09:33:16 -0000 1.4
@@ -14,6 +14,7 @@
import javax.servlet.http.HttpServletResponse;
import javax.servlet.ServletContext;
import java.util.Locale;
+import org.jahia.services.pages.JahiaPage;
/**
* Created by IntelliJ IDEA.
@@ -24,6 +25,7 @@
*/
public class SoapParamBean extends ParamBean {
+ private JahiaPage page;
public SoapParamBean(JahiaSite site, JahiaUser user)
throws JahiaPageNotFoundException,
JahiaSessionExpirationException, JahiaSiteNotFoundException, JahiaException {
@@ -51,4 +53,12 @@
// we won't change initial user
}
+ public JahiaPage getPage() {
+ return page;
+ }
+
+ public void setPage(JahiaPage page) {
+ this.page = page;
+ }
+
}
Index: listener.properties
====================================================================
sensei.url=http://localhost:8080/sensei
filecreation.filter=/shared/test/
parent.container.name=linkContainer
parent.page.id=2
page.template.name=Simple
Index: domain.xml
===================================================================
RCS file:
/home/cvs/repository/jahia/core/src/webapp/WEB-INF/etc/slide/domain.xml,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- domain.xml 17 Sep 2004 10:14:52 -0000 1.1
+++ domain.xml 31 Jan 2005 09:33:16 -0000 1.2
@@ -11,6 +11,8 @@
<events>
<event classname="org.apache.slide.event.MacroEvent" method="move"
enable="true"></event>
+ <event classname="org.apache.slide.event.ContentEvent"
method="create" enable="true"></event>
<listener classname="org.jahia.services.webdav.JahiaMacroListener"/>
+ <!--listener
classname="org.jahia.services.webdav.listeners.CMSSlideContentListener"/-->
</events>
</slide>
Index: CMSSlideContentListener.java
====================================================================
package org.jahia.services.webdav.listeners;
import java.io.FileInputStream;
import java.io.IOException;
import java.security.Principal;
import java.util.Enumeration;
import java.util.Locale;
import java.util.Properties;
import org.apache.slide.event.ContentEvent;
import org.apache.slide.event.ContentListener;
import org.apache.slide.event.VetoException;
import org.jahia.bin.Jahia;
import org.jahia.data.containers.JahiaContainer;
import org.jahia.data.containers.JahiaContainerDefinition;
import org.jahia.data.containers.JahiaContainerList;
import org.jahia.data.fields.JahiaField;
import org.jahia.data.fields.JahiaPageField;
import org.jahia.data.fields.LoadFlags;
import org.jahia.exceptions.JahiaException;
import org.jahia.params.ParamBean;
import org.jahia.params.SoapParamBean;
import org.jahia.registries.ServicesRegistry;
import org.jahia.services.containers.JahiaContainersService;
import org.jahia.services.pages.JahiaPage;
import org.jahia.services.pages.JahiaPageTemplateBaseService;
import org.jahia.services.sites.JahiaSite;
import org.jahia.services.usermanager.JahiaUser;
import org.jahia.services.version.EntryLoadRequest;
import org.apache.slide.webdav.util.WebdavUtils;
import org.jahia.services.pages.JahiaPageService;
import java.util.StringTokenizer;
import org.jahia.registries.JahiaContainerDefinitionsRegistry;
import org.apache.slide.event.MacroListener;
import org.apache.slide.event.MacroEvent;
/**
* Created by IntelliJ IDEA.
* User: toto
* Date: 2 nov. 2004
* Time: 15:23:17
* <p/>
* $Author: shuber $
* $Date: 2005/01/31 09:33:16 $
* $Id: CMSSlideContentListener.java,v 1.1 2005/01/31 09:33:16 shuber Exp $
* $RCSfile: CMSSlideContentListener.java,v $
* $Revision: 1.1 $
* $Source:
/home/cvs/repository/jahia/core/src/java/org/jahia/services/webdav/listeners/CMSSlideContentListener.java,v
$
* $State: Exp $
*/
public class CMSSlideContentListener implements ContentListener,
MacroListener {
private static org.apache.log4j.Logger logger =
org.apache.log4j.Logger.getLogger(CMSSlideContentListener.class);
private Properties props;
public CMSSlideContentListener () {
try {
props = new Properties();
props.load(new
FileInputStream(Jahia.getSettings().getPathResolver().
resolvePath(
"/WEB-INF/etc/slide/listener.properties")));
} catch (IOException e) {
e.printStackTrace(); //To change body of catch statement use File
| Settings | File Templates.
}
}
public void create (ContentEvent event)
throws VetoException {
if (!Jahia.isInitiated()) {
return;
}
String filename = event.getRevisionDescriptors().getUri();
Principal p = event.getToken().getCredentialsToken().getPrincipal();
if (!filename.startsWith(props.getProperty("filecreation.filter"))) {
return;
}
logger.debug("Content create event called " + event);
try {
JahiaSite site = ServicesRegistry.getInstance().
getJahiaSitesService().getSiteByKey(event.
getNamespace().getName());
JahiaUser user = ServicesRegistry.getInstance().
getJahiaUserManagerService().lookupUser(site.getID(),
p.getName());
if (user == null) {
user = ServicesRegistry.getInstance().
getJahiaUserManagerService().lookupUser(0,
p.getName());
}
logger.debug("Current user is " + user);
String containerName = props.getProperty("parent.container.name");
int pageId =
Integer.parseInt(props.getProperty("parent.page.id"));
String pageTemplate = props.getProperty("page.template.name");
SoapParamBean jParams = new SoapParamBean(Jahia.
getStaticServletConfig().getServletContext(),
Jahia.getSettings(),
System.currentTimeMillis(), site, user);
jParams.setSubstituteEntryLoadRequest(EntryLoadRequest.CURRENT);
Jahia.setThreadParamBean(jParams);
JahiaContainersService jahiaContainersService = ServicesRegistry.
getInstance().getJahiaContainersService();
// first we must find the parent page for the new file being
added.
// this page will have the same name.
JahiaPageService pageService = ServicesRegistry.getInstance().
getJahiaPageService();
JahiaPage curPage = pageService.lookupPage(pageId, jParams);
jParams.setPage(curPage);
String relativeFileName = filename.substring(props.getProperty(
"filecreation.filter").length(), filename.length());
if (relativeFileName.startsWith("/")) {
// this is the case where the user either did or didn't
// specify the trailing / in the filter.
relativeFileName = relativeFileName.substring(1,
relativeFileName.length());
}
StringTokenizer tokenizer = new StringTokenizer(relativeFileName,
"/");
while (tokenizer.hasMoreTokens()) {
String curPageTitle = (String) tokenizer.nextToken();
Enumeration childEnum = curPage.getChilds(jParams.getUser());
boolean foundChild = false;
while (childEnum.hasMoreElements()) {
JahiaPage curJahiaPage = (JahiaPage)
childEnum.nextElement();
logger.debug("Current page title=" +
curJahiaPage.getTitle());
if (curJahiaPage.getTitle().equals(curPageTitle)) {
curPage = curJahiaPage;
foundChild = true;
break;
}
}
}
logger.debug("target page is " + curPage.getID());
if (WebdavUtils.isCollection(event.getRevisionDescriptor())) {
logger.debug("URI is a collection, let's create a page for
it");
createPage(filename, site, containerName, curPage.getID(),
pageTemplate, jParams, jahiaContainersService);
} else {
// add a container on an existing page.
logger.debug(
"URI is a file, let's create a container for it, on the
found parent page");
}
} catch (JahiaException e) {
e.printStackTrace(); //To change body of catch statement use File
| Settings | File Templates.
}
Jahia.setThreadParamBean(null);
}
private void createPage (String filename, JahiaSite site,
String containerName, int pageId,
String pageTemplate, ParamBean jParams,
JahiaContainersService jahiaContainersService)
throws JahiaException {
int demandsContainerListID =
jahiaContainersService.getContainerListID(
containerName, pageId);
int containerPageID = pageId;
int containerListID = 0;
int containerListACLID = 0;
int containerDefID = 0;
if (demandsContainerListID == -1) {
// this can happen if the container list was never created.
// we must then only lookup the definition
JahiaContainerDefinition containerDef =
JahiaContainerDefinitionsRegistry.getInstance().getDefinition(
site.getID(), containerName);
if (containerDef != null) {
containerDefID = containerDef.getID();
} else {
logger.warn("Couldn't find container definition " +
containerName);
}
} else {
JahiaContainerList containerList = jahiaContainersService.
loadContainerList(
demandsContainerListID, LoadFlags.NOTHING,
jParams);
containerPageID = containerList.getPageID();
containerListID = containerList.getID();
containerListACLID = containerList.getAclID();
containerDefID = containerList.getctndefid();
}
JahiaPage parent =
ServicesRegistry.getInstance().getJahiaPageService().
lookupPage(pageId, jParams);
// add a container
JahiaContainer pageContainer = new JahiaContainer(0,
site.getID(),
containerPageID,
containerListID,
0, /* rank */
containerListACLID,
containerDefID,
0, 2);
JahiaContainerDefinition containerDef = pageContainer.getDefinition();
Locale locale = (Locale) site.getLanguageSettingsAsLocales(true).
iterator().next();
jahiaContainersService.
saveContainer(pageContainer, containerListID, jParams);
pageContainer.setLanguageCode(locale.toString());
pageContainer.fieldsStructureCheck(jParams);
// create a new jahia page
Enumeration e = pageContainer.getFields();
JahiaField pageField = null;
while (e.hasMoreElements() && ! (pageField instanceof
JahiaPageField)) {
pageField = (JahiaField) e.nextElement();
}
// get the details templateID
JahiaPageTemplateBaseService templateServ =
JahiaPageTemplateBaseService.getInstance();
int templateId = templateServ.lookupPageTemplateByName(pageTemplate,
jParams.getSite().getID()).getID();
JahiaPage jahiaPage;
String pageTitle = filename.substring(filename.lastIndexOf('/') + 1);
jahiaPage = ServicesRegistry.getInstance().getJahiaPageService().
createPage(
jParams.getSite().getID(),
pageId,
JahiaPage.TYPE_DIRECT,
pageTitle,
templateId,
"",
-1,
jParams.getUser().getUserKey(),
pageField.getAclID(),
jParams);
pageField.setValue(Integer.toString(jahiaPage.getID()));
pageField.setObject(jahiaPage);
pageField.save(jParams);
}
public void fork (ContentEvent event)
throws VetoException {
}
public void merge (ContentEvent event)
throws VetoException {
}
public void remove (ContentEvent event)
throws VetoException {
}
public void retrieve (ContentEvent event)
throws VetoException {
}
public void store (ContentEvent event)
throws VetoException {
logger.debug("Content Store event called" + event);
}
// Macro listener methods :
public void copy (MacroEvent macroEvent)
throws VetoException {
logger.debug("Copy event called " + macroEvent);
}
public void move(MacroEvent macroEvent) throws VetoException {
logger.debug("Move event called " + macroEvent);
}
public void delete(MacroEvent macroEvent) throws VetoException {
logger.debug("Delete event called " + macroEvent);
}
}