PortletDataProvider now serves individual content items

git-svn-id: https://svn.libreccm.org/ccm/trunk@2525 8810af33-2d31-482b-a856-94f89814c4df
master
jensp 2014-02-16 18:15:03 +00:00
parent ddff90e199
commit 648076f171
10 changed files with 314 additions and 10 deletions

View File

@ -13,6 +13,8 @@
</ccm:dependencies> </ccm:dependencies>
<ccm:directories> <ccm:directories>
<ccm:directory name="pdl"/>
<ccm:directory name="sql"/>
<ccm:directory name="src"/> <ccm:directory name="src"/>
</ccm:directories> </ccm:directories>
<ccm:contacts> <ccm:contacts>

View File

@ -0,0 +1,25 @@
//
// Copyright (C) 2014 Jens Pelzetter
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public License
// as published by the Free Software Foundation; either version 2.1 of
// the License, or (at your option) any later version.
//
// This library 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
// Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
//
//
model com.arsdigita.cms.portletdataprovider;
import com.arsdigita.web.Application;
object type PortletDataProvider extends Application {
reference key (cms_portletdataprovider.application_id);
}

View File

@ -0,0 +1,3 @@
@ ddl/oracle-se/create.sql
@ ddl/oracle-se/deferred.sql

View File

@ -0,0 +1,4 @@
begin;
\i ddl/postgres/create.sql
\i ddl/postgres/deferred.sql
end;

View File

@ -7,6 +7,11 @@
<initalizer class="com.arsdigita.navigation.Initalizer"/> <initalizer class="com.arsdigita.navigation.Initalizer"/>
</requires> </requires>
<provides> <provides>
<initalizer class="com.arsdigita.cms.portletdataprovider.Initializer"/> <table name="cms_portletdataprovider"/>
</provides> <initializer class="com.arsdigita.cms.portletdataprovider.Initializer"/>
</provides>
<scripts>
<schema directory="ccm-cms-portletdataprovider"/>
<data class="com.arsdigita.cms.portletdataprovider.Loader"/>
</scripts>
</load> </load>

View File

@ -18,6 +18,10 @@
*/package com.arsdigita.cms.portletdataprovider; */package com.arsdigita.cms.portletdataprovider;
import com.arsdigita.db.DbHelper; import com.arsdigita.db.DbHelper;
import com.arsdigita.domain.DomainObject;
import com.arsdigita.domain.DomainObjectFactory;
import com.arsdigita.kernel.ACSObjectInstantiator;
import com.arsdigita.persistence.DataObject;
import com.arsdigita.persistence.pdl.ManifestSource; import com.arsdigita.persistence.pdl.ManifestSource;
import com.arsdigita.persistence.pdl.NameFilter; import com.arsdigita.persistence.pdl.NameFilter;
import com.arsdigita.runtime.CompoundInitializer; import com.arsdigita.runtime.CompoundInitializer;
@ -30,20 +34,31 @@ import com.arsdigita.runtime.RuntimeConfig;
* @author Jens Pelzetter <jens@jp-digital.de> * @author Jens Pelzetter <jens@jp-digital.de>
* @version $Id$ * @version $Id$
*/ */
public class Initalizer extends CompoundInitializer { public class Initializer extends CompoundInitializer {
public Initalizer() { public Initializer(){
super();
final String jdbcUrl = RuntimeConfig.getConfig().getJDBCURL(); final String jdbcUrl = RuntimeConfig.getConfig().getJDBCURL();
final int database = DbHelper.getDatabaseFromURL(jdbcUrl); final int database = DbHelper.getDatabaseFromURL(jdbcUrl);
add(new PDLInitializer(new ManifestSource("empty.pdl.mf", add(new PDLInitializer(new ManifestSource("ccm-cms-portletdataprovider.pdl.mf",
new NameFilter(DbHelper. new NameFilter(DbHelper.
getDatabaseSuffix(database), "pdl")))); getDatabaseSuffix(database), "pdl"))));
} }
@Override @Override
public void init(final DomainInitEvent event) { public void init(final DomainInitEvent event) {
super.init(event); super.init(event);
DomainObjectFactory.registerInstantiator(
PortletDataProvider.BASE_DATA_OBJECT_TYPE,
new ACSObjectInstantiator() {
@Override
public DomainObject doNewInstance(final DataObject dataObject) {
return new PortletDataProvider(dataObject);
}
});
} }
} }

View File

@ -18,8 +18,12 @@
*/ */
package com.arsdigita.cms.portletdataprovider; package com.arsdigita.cms.portletdataprovider;
import com.arsdigita.kernel.Kernel;
import com.arsdigita.kernel.KernelExcursion;
import com.arsdigita.loader.PackageLoader; import com.arsdigita.loader.PackageLoader;
import com.arsdigita.runtime.ScriptContext; import com.arsdigita.runtime.ScriptContext;
import com.arsdigita.web.Application;
import com.arsdigita.web.ApplicationType;
/** /**
* *
@ -30,7 +34,24 @@ public class Loader extends PackageLoader {
@Override @Override
public void run(final ScriptContext ctx) { public void run(final ScriptContext ctx) {
//Nothing to do. new KernelExcursion() {
@Override
protected void excurse() {
setEffectiveParty(Kernel.getSystemParty());
final ApplicationType type = new ApplicationType(
"PortletDataProvider", PortletDataProvider.BASE_DATA_OBJECT_TYPE);
type.setSingleton(true);
type.setDescription("DataProvider for JSR-286 portlets and other applications");
Application.createApplication(PortletDataProvider.BASE_DATA_OBJECT_TYPE,
"portletdataprovider",
"PortletDataProvider",
null);
}
}.run();
} }
} }

View File

@ -0,0 +1,53 @@
/*
* Copyright (c) 2014 Jens Pelzetter
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public License
* as published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This library 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
package com.arsdigita.cms.portletdataprovider;
import com.arsdigita.domain.DataObjectNotFoundException;
import com.arsdigita.persistence.DataObject;
import com.arsdigita.persistence.OID;
import com.arsdigita.web.Application;
import java.math.BigDecimal;
/**
*
* @author Jens Pelzetter <jens@jp-digital.de>
* @version $Id$
*/
public class PortletDataProvider extends Application {
public static final String BASE_DATA_OBJECT_TYPE = "com.arsdigita.cms.portletdataprovider.PortletDataProvider";
public PortletDataProvider(final DataObject dobj) {
super(dobj);
}
public PortletDataProvider(final OID oid) throws DataObjectNotFoundException{
super(oid);
}
public PortletDataProvider(final BigDecimal key) throws DataObjectNotFoundException {
this(new OID(BASE_DATA_OBJECT_TYPE, key));
}
@Override
public String getServletPath() {
return "/portletdataprovider/";
}
}

View File

@ -0,0 +1,157 @@
/*
* Copyright (c) 2013 Jens Pelzetter,
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public License
* as published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This library 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
package com.arsdigita.cms.portletdataprovider;
import com.arsdigita.bebop.Page;
import com.arsdigita.bebop.PageFactory;
import com.arsdigita.bebop.PageState;
import com.arsdigita.bebop.SimpleComponent;
import com.arsdigita.cms.CMS;
import com.arsdigita.cms.ContentItem;
import com.arsdigita.cms.dispatcher.SimpleXMLGenerator;
import com.arsdigita.domain.DataObjectNotFoundException;
import com.arsdigita.templating.PresentationManager;
import com.arsdigita.templating.Templating;
import com.arsdigita.web.Application;
import com.arsdigita.web.BaseApplicationServlet;
import com.arsdigita.xml.Document;
import com.arsdigita.xml.Element;
import java.io.IOException;
import java.math.BigDecimal;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
*
* @author Jens Pelzetter <jens@jp-digital.de>
* @version $Id$
*/
public class PortletDataProviderServlet extends BaseApplicationServlet {
private static final long serialVersionUID = 60123844988240232L;
private static final String ITEMS = "items";
private static final String CATEGORIES = "categories";
@Override
protected void doService(final HttpServletRequest request,
final HttpServletResponse response,
final Application app) throws ServletException, IOException {
String path = request.getPathInfo();
if (path.startsWith("/")) {
path = path.substring(1);
}
final String[] pathTokens = path.split("/");
if (pathTokens.length == 0) {
response.sendError(HttpServletResponse.SC_NOT_FOUND);
return;
}
if (ITEMS.equals(pathTokens[0])) {
serveContentItem(pathTokens, request, response);
} else if (CATEGORIES.equals(pathTokens[0])) {
throw new UnsupportedOperationException("Not implemtend yet");
} else {
response.sendError(HttpServletResponse.SC_NOT_FOUND);
}
}
protected void serveContentItem(final String[] pathTokens,
final HttpServletRequest request,
final HttpServletResponse response) throws IOException,
ServletException {
final String itemIdString = pathTokens[1];
final BigDecimal itemId;
try {
itemId = new BigDecimal(itemIdString);
} catch (NumberFormatException ex) {
response.sendError(HttpServletResponse.SC_BAD_REQUEST,
String.format("'%s' is not a valid item id", itemIdString));
return;
}
ContentItem item = null;
try {
final ContentItem tmpItem = new ContentItem(itemId);
if (tmpItem.isLiveVersion()) {
item = tmpItem;
} else {
if (tmpItem.isLive()) {
item = tmpItem.getLiveVersion();
} else {
response.sendError(HttpServletResponse.SC_NOT_FOUND,
String.format("Item with ID %d is not published.",
itemIdString));
}
}
} catch (DataObjectNotFoundException ex) {
response.sendError(HttpServletResponse.SC_NOT_FOUND,
String.format("Item with ID %d not found.", itemIdString));
return;
}
final Page page = PageFactory.buildPage(
"PortletDataProvider",
String.format("ContentItem %s", item.getOID().toString()));
final PortletDataItemPanel panel = new PortletDataItemPanel(item);
page.add(panel);
page.lock();
final Document document = page.buildDocument(request, response);
final PresentationManager presenter = Templating.getPresentationManager();
presenter.servePage(document, request, response);
}
private class PortletDataItemPanel extends SimpleComponent {
private final XMLGenerator xmlGenerator;
public PortletDataItemPanel(final ContentItem item) {
this.xmlGenerator = new XMLGenerator(item);
}
@Override
public void generateXML(final PageState state, final Element parent) {
final Element content = parent.newChildElement("cms:contentPanel",
CMS.CMS_XML_NS);
xmlGenerator.generateXML(state, content, "");
}
}
private class XMLGenerator extends SimpleXMLGenerator {
private final ContentItem item;
public XMLGenerator(final ContentItem item) {
super();
this.item = item;
}
@Override
protected ContentItem getContentItem(final PageState state) {
return item;
}
}
}

View File

@ -0,0 +1,19 @@
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
version="2.4">
<!-- Servlets for the ccm-cms-portletdataprovider application -->
<servlet>
<servlet-name>PortletDataProviderServlet</servlet-name>
<servlet-class>com.arsdigita.cms.portletdataprovider.PortletDataProviderServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>PortletDataProviderServlet</servlet-name>
<url-pattern>/portletdataprovider/*</url-pattern>
</servlet-mapping>
</web-app>