- New component (CustomizableGreetingItem) and renderer (CustomizableContentItemXMLRenderer) to allow customization of the rendering of data assoications from a JSP

- Some changes on the renders to make some parts of the rendering overwritable in a child class
- Added a browse button Xinha




git-svn-id: https://svn.libreccm.org/ccm/trunk@600 8810af33-2d31-482b-a856-94f89814c4df
master
jensp 2010-11-10 20:20:18 +00:00
parent c8b9be8e6a
commit fcebf5c11e
14 changed files with 790 additions and 87 deletions

View File

@ -34,6 +34,7 @@ public class ContentItemXMLRenderer extends DomainObjectXMLRenderer {
// It's purpose is to test for ContentBundle objects and if found, replace // It's purpose is to test for ContentBundle objects and if found, replace
// that object with the negotiated version of the content item. // that object with the negotiated version of the content item.
// Otherwise this methd will do nothing. // Otherwise this methd will do nothing.
@Override
protected void walk(final DomainObjectTraversalAdapter adapter, protected void walk(final DomainObjectTraversalAdapter adapter,
final DomainObject obj, final DomainObject obj,
final String path, final String path,

View File

@ -0,0 +1,347 @@
/*
* Copyright (c) 2010 Jens Pelzetter,
* for the Center of Social Politics of the University of Bremen
*
* 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;
import com.arsdigita.cms.dispatcher.SimpleXMLGenerator;
import com.arsdigita.dispatcher.DispatcherHelper;
import com.arsdigita.domain.DomainObject;
import com.arsdigita.domain.DomainObjectFactory;
import com.arsdigita.domain.DomainObjectTraversal;
import com.arsdigita.domain.DomainObjectTraversalAdapter;
import com.arsdigita.domain.DomainObjectXMLRenderer;
import com.arsdigita.kernel.ACSObject;
import com.arsdigita.persistence.DataAssociation;
import com.arsdigita.persistence.DataAssociationCursor;
import com.arsdigita.persistence.DataObject;
import com.arsdigita.persistence.OID;
import com.arsdigita.persistence.metadata.Property;
import com.arsdigita.web.ParameterMap;
import com.arsdigita.web.URL;
import com.arsdigita.web.Web;
import com.arsdigita.xml.Element;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.apache.log4j.Logger;
/**
* A renderer which allows some customization of the rendering of
* data associations form the using component and therefore from a JSP file.
*
* @author Jens Pelzetter
*/
public class CustomizableContentItemXMLRenderer
extends DomainObjectXMLRenderer {
private static final Logger s_log = Logger.getLogger(
CustomizableContentItemXMLRenderer.class);
private int m_pageSize = 20;
private String m_order;
private List<String> m_filters;
public CustomizableContentItemXMLRenderer(Element root) {
super(root);
m_filters = new ArrayList<String>();
}
public void setPageSize(int pageSize) {
m_pageSize = pageSize;
}
/**
* Set an order for the rendered data association(s).
*
* @param order
*/
public void setOrder(String order) {
m_order = order;
}
/**
* Sets some filters for the rendered data associations.
*
* @param filters
*/
public void setFilters(List<String> filters) {
m_filters = filters;
}
/**
* Adds a filter to use for the rendered data associations.
*
* @param filter
*/
public void addFilter(String filter) {
m_filters.add(filter);
}
/**
* Public variant of the
* {@link DomainObjectTraversal#walk(DomainObject, String, DomainObjectTraversalAdapter)}
* method. This allows it to pass an customized
* {@link DomainObjectTraversalAdapter} to the renderer which is than used
* instead of the registered <code>TraversalAdapter</code>.
*
* @param dobj
* @param context
* @param adapter
*/
@Override
public void walk(final DomainObject dobj,
final String context,
final DomainObjectTraversalAdapter adapter) {
super.walk(dobj, context, adapter);
}
/**
* Copied from {@link ContentItemXMLRenderer}.
*
* @param adapter
* @param obj
* @param path
* @param context
* @param linkObject
*/
@Override
protected void walk(final DomainObjectTraversalAdapter adapter,
final DomainObject obj,
final String path,
final String context,
final DomainObject linkObject) {
DomainObject nObj = obj;
if (nObj instanceof ContentBundle) {
nObj = ((ContentBundle) obj).negotiate(DispatcherHelper.getRequest().
getLocales());
}
super.walk(adapter, nObj, path, context, linkObject);
}
/**
* Renders data associations using the provided page size to create a
* paginator (if the page size is greater than 0, set the page size to 0 or
* less to disable the paginator) and the provided order and filters to
* render data associations.
*
* @param adapter
* @param obj
* @param path
* @param context
* @param prop
* @param propName
* @param propValue
*/
@Override
protected void walkDataAssociations(DomainObjectTraversalAdapter adapter,
DomainObject obj,
String path,
String context,
Property prop,
String propName,
Object propValue) {
s_log.debug(String.format("%s is a DataAssociation", prop.getName()));
if (m_pageSize <= 0) {
s_log.debug("pageSize is 0 or less, not using Paginator.");
super.walkDataAssociations(adapter,
obj,
path,
context,
prop,
propName,
propValue);
} else {
s_log.debug(String.format("Rendering DataAssociation using a "
+ "paginator with a "
+ "page size of %d", m_pageSize));
beginAssociation(obj, path, prop);
DataAssociationCursor daCursor = ((DataAssociation) propValue).
getDataAssociationCursor();
if (daCursor.size() == 0) {
s_log.debug("No items to show, finishing assoication and "
+ "returning.");
endAssociation(obj, path, prop);
return;
}
s_log.debug("Walking daCursor...");
s_log.debug(String.format("daCursor.size() = %d", daCursor.size()));
//Add filters and order
if (m_order != null) {
daCursor.addOrder(m_order);
}
for (String filter : m_filters) {
daCursor.addFilter(filter);
}
//Build paginator
//Get pageNumber from request URL
URL requestUrl = Web.getContext().getRequestURL();
String pageNumberValue = requestUrl.getParameter("pageNumber");
long pageNumber;
if (pageNumberValue == null) {
pageNumber = 1;
} else {
pageNumber = Long.parseLong(pageNumberValue);
}
long objectCount = daCursor.size();
int pageCount = (int) Math.ceil((double) objectCount
/ (double) m_pageSize);
if (pageNumber < 1) {
pageNumber = 1;
}
if (pageNumber > pageCount) {
if (pageCount == 0) {
pageNumber = 1;
} else {
pageNumber = pageCount;
}
}
long begin = ((pageNumber - 1) * m_pageSize);
int count = (int) Math.min(m_pageSize, (objectCount - begin));
long end = begin + count;
s_log.debug("Calculted the following values for the paginator:");
s_log.debug(String.format("pageNumber = %d", pageNumber));
s_log.debug(String.format("objectCount = %d", objectCount));
s_log.debug(String.format("pageCount = %d", pageCount));
s_log.debug(String.format("begin = %d", begin));
s_log.debug(String.format("count = %d", count));
s_log.debug(String.format("end = %d", end));
if (count != 0) {
daCursor.setRange(new Integer((int) begin + 1),
new Integer((int) end + 1));
}
/*Element paginator = newElement(getCurrentElement(),
"nav:paginator");*/
Element paginator =
new Element("nav:paginator",
"http://ccm.redhat.com/london/navigation");
getCurrentElement().addContent(paginator);
ParameterMap map = new ParameterMap();
if (requestUrl.getParameterMap() != null) {
Iterator current = requestUrl.getParameterMap().keySet().
iterator();
while (current.hasNext()) {
String key = (String) current.next();
if (key.equals("pageNumber")) {
continue;
}
map.setParameterValues(key, requestUrl.getParameterValues(
key));
}
}
paginator.addAttribute("pageParam", "pageNumber");
paginator.addAttribute("baseURL",
URL.there(requestUrl.getPathInfo(),
map).toString());
paginator.addAttribute("pageNumber",
new Long(pageNumber).toString());
paginator.addAttribute("pageCount",
new Long(pageCount).toString());
paginator.addAttribute("pageSize", new Long(m_pageSize).toString());
paginator.addAttribute("objectBegin", new Long(begin + 1).toString());
paginator.addAttribute("objectEnd", new Long(end).toString());
paginator.addAttribute("objectCount",
new Long(objectCount).toString());
int index = 0;
while (daCursor.next()) {
DataObject dobj = daCursor.getDataObject();
ACSObject object = null;
object = (ACSObject) DomainObjectFactory.newInstance(dobj);
//Element item = newElement(paginator, "item");
//Element item = newElement(paginator, propName);
//appendToPath(path, "paginator");
//Element itemPath = newElement(item, "path");
//itemPath.setText(getStableURL(dobj, object));
//generateItemXML(item, dobj, object, index);
DataObject link = daCursor.getLink();
DomainObject linkObj = null;
if (link != null) {
linkObj = new LinkDomainObject(link);
}
walk(adapter,
DomainObjectFactory.newInstance(daCursor.getDataObject()),
appendToPath(path, propName),
context,
linkObj);
index++;
}
//endPaginator();
endAssociation(obj, path, prop);
}
}
protected String getStableURL(DataObject dobj, ACSObject obj) {
OID oid = new OID((String) dobj.get(ACSObject.OBJECT_TYPE),
dobj.get(ACSObject.ID));
return String.format("/redirect/?oid=%s", oid.toString());
}
/*protected void generateItemXML(Element item,
DataObject dobj,
ACSObject obj,
int index) {
if (obj != null) {
ContentItemXMLRenderer renderer = new ContentItemXMLRenderer(item);
renderer.setRevisitFullObject(false);
renderer.setWrapAttributes(true);
renderer.setWrapRoot(false);
renderer.setWrapObjects(false);
renderer.walk(obj, SimpleXMLGenerator.ADAPTER_CONTEXT);
}
}*/
/*protected Element beginPaginator() {
Element element = newElement(getCurrentElement(), "nav:paginator");
getElementStack().push(getCurrentElement());
setCurrentElement(element);
return element;
}
protected Element endPaginator() {
setCurrentElement((Element) getElementStack().pop());
return getCurrentElement();
}*/
}

View File

@ -33,11 +33,13 @@ public class GenericOrganizationalUnitPersonCollection extends DomainCollection
public GenericOrganizationalUnitPersonCollection( public GenericOrganizationalUnitPersonCollection(
DataCollection dataCollection) { DataCollection dataCollection) {
super(dataCollection); super(dataCollection);
dataCollection.addOrder(
"surname asc, givenname asc, titlepre asc, titlepost asc");
} }
/** /**
* Gets the name of the role of this orgaunit-person link * Gets the name of the role of this orgaunit-person link
* @return
*/ */
public String getRoleName() { public String getRoleName() {
return (String) m_dataCollection.get(PERSON_ROLE); return (String) m_dataCollection.get(PERSON_ROLE);

View File

@ -44,12 +44,13 @@ public class ContentPanel extends SimpleComponent {
} }
/** /**
* Fetches an XML Generator. This method can be overidden to fetch * Fetches an XML Generator. This method can be overridden to fetch
* any {@link com.arsdigita.cms.dispatcher.XMLGenerator}, but by default, * any {@link com.arsdigita.cms.dispatcher.XMLGenerator}, but by default,
* it fetches the <code>XMLGenerator</code> registered to the current * it fetches the <code>XMLGenerator</code> registered to the current
* {@link com.arsdigita.cms.ContentSection}. * {@link com.arsdigita.cms.ContentSection}.
* *
* @param state The page state * @param state The page state
* @return The XMLGenerator used by this Content Panel
*/ */
protected XMLGenerator getXMLGenerator(PageState state) { protected XMLGenerator getXMLGenerator(PageState state) {
ContentSection section = CMS.getContext().getContentSection(); ContentSection section = CMS.getContext().getContentSection();
@ -64,9 +65,11 @@ public class ContentPanel extends SimpleComponent {
* @param parent The parent DOM element * @param parent The parent DOM element
* @see com.arsdigita.cms.dispatcher.XMLGenerator * @see com.arsdigita.cms.dispatcher.XMLGenerator
*/ */
@Override
public void generateXML(PageState state, Element parent) { public void generateXML(PageState state, Element parent) {
if (isVisible(state)) { if (isVisible(state)) {
Element content = parent.newChildElement("cms:contentPanel", CMS.CMS_XML_NS); Element content = parent.newChildElement("cms:contentPanel",
CMS.CMS_XML_NS);
exportAttributes(content); exportAttributes(content);
// Generate path information about the content item // Generate path information about the content item
@ -86,7 +89,8 @@ public class ContentPanel extends SimpleComponent {
* @param parent the element that will contain the path info * @param parent the element that will contain the path info
*/ */
protected void generatePathInfoXML(PageState state, Element parent) { protected void generatePathInfoXML(PageState state, Element parent) {
Element pathInfo = parent.newChildElement("cms:pathInfo", CMS.CMS_XML_NS); Element pathInfo =
parent.newChildElement("cms:pathInfo", CMS.CMS_XML_NS);
if (CMS.getContext().hasContentSection()) { if (CMS.getContext().hasContentSection()) {
pathInfo.newChildElement("cms:sectionPath", CMS.CMS_XML_NS).setText( pathInfo.newChildElement("cms:sectionPath", CMS.CMS_XML_NS).setText(
@ -94,15 +98,18 @@ public class ContentPanel extends SimpleComponent {
} }
String url = DispatcherHelper.getRequestContext().getRemainingURLPart(); String url = DispatcherHelper.getRequestContext().getRemainingURLPart();
if (url.startsWith(CMSDispatcher.PREVIEW)) { if (url.startsWith(CMSDispatcher.PREVIEW)) {
pathInfo.newChildElement("cms:previewPath", CMS.CMS_XML_NS).setText(ContentSectionServlet.PREVIEW); pathInfo.newChildElement("cms:previewPath", CMS.CMS_XML_NS).setText(
ContentSectionServlet.PREVIEW);
} }
pathInfo.newChildElement("cms:templatePrefix", CMS.CMS_XML_NS).setText( pathInfo.newChildElement("cms:templatePrefix", CMS.CMS_XML_NS).setText(
"/" + AbstractItemResolver.TEMPLATE_CONTEXT_PREFIX); "/" + AbstractItemResolver.TEMPLATE_CONTEXT_PREFIX);
if (CMS.getContext().hasContentItem()) { if (CMS.getContext().hasContentItem()) {
ContentItem item = CMS.getContext().getContentItem(); ContentItem item = CMS.getContext().getContentItem();
ContentItem bundle = (ContentItem) item.getDraftVersion().getParent(); ContentItem bundle =
pathInfo.newChildElement("cms:itemPath", CMS.CMS_XML_NS).setText("/" + bundle.getPath()); (ContentItem) item.getDraftVersion().getParent();
pathInfo.newChildElement("cms:itemPath", CMS.CMS_XML_NS).setText("/" + bundle.
getPath());
} }
} }
} }

View File

@ -102,7 +102,7 @@ public abstract class DomainObjectTraversal {
} }
/** /**
* Unregisteres a traversal adapter for an object type in a * Unregisters a traversal adapter for an object type in a
* given context * given context
* *
* @param type the object type whose items will be traversed * @param type the object type whose items will be traversed
@ -138,7 +138,7 @@ public abstract class DomainObjectTraversal {
} }
/** /**
* Unregisteres a traversal adapter for an object type in a * Unregisters a traversal adapter for an object type in a
* given context * given context
* *
* @param type the object type whose items will be traversed * @param type the object type whose items will be traversed
@ -252,7 +252,8 @@ public abstract class DomainObjectTraversal {
final String path, final String path,
final String context, final String context,
final DomainObject linkObject) { final DomainObject linkObject) {
s_log.debug(String.format("Walking with path %s and context %s...", path, context)); s_log.debug(String.format("Walking with path %s and context %s...", path,
context));
OID oid = obj.getOID(); OID oid = obj.getOID();
OID linkOid = null; OID linkOid = null;
if (linkObject != null) { if (linkObject != null) {
@ -311,8 +312,8 @@ public abstract class DomainObjectTraversal {
if (prop.isAttribute()) { if (prop.isAttribute()) {
handleAttribute(obj, path, prop); handleAttribute(obj, path, prop);
// Property is a DataObject, so start recursion
} else if (propValue instanceof DataObject) { } else if (propValue instanceof DataObject) {
// Property is a DataObject, so start recursion
if (s_log.isDebugEnabled()) { if (s_log.isDebugEnabled()) {
s_log.debug(prop.getName() + " is a DataObject"); s_log.debug(prop.getName() + " is a DataObject");
} }
@ -355,8 +356,9 @@ public abstract class DomainObjectTraversal {
} }
} else { } else {
//2010-11-08: Moved to seperate Methods to allow simple
if (s_log.isDebugEnabled()) { //extending of the handling of data assocications
/*if (s_log.isDebugEnabled()) {
s_log.debug(prop.getName() + " is a DataAssociation"); s_log.debug(prop.getName() + " is a DataAssociation");
} }
beginAssociation(obj, path, prop); beginAssociation(obj, path, prop);
@ -379,7 +381,15 @@ public abstract class DomainObjectTraversal {
context, context,
linkObj); linkObj);
} }
endAssociation(obj, path, prop); endAssociation(obj, path, prop);*/
walkDataAssociations(adapter,
obj,
path,
context,
prop,
propName,
propValue);
} }
} else { } else {
// Unknown property value type - do nothing // Unknown property value type - do nothing
@ -390,6 +400,52 @@ public abstract class DomainObjectTraversal {
endObject(obj, path); endObject(obj, path);
} }
protected void walkDataAssociations(DomainObjectTraversalAdapter adapter,
DomainObject obj,
String path,
String context,
Property prop,
String propName,
Object propValue) {
s_log.debug(String.format("%s is a DataAssociation", prop.getName()));
beginAssociation(obj, path, prop);
DataAssociationCursor daCursor =
((DataAssociation) propValue).
getDataAssociationCursor();
while (daCursor.next()) {
walkDataAssociation(adapter,
obj,
path,
context,
propName,
daCursor);
}
endAssociation(obj, path, prop);
}
protected void walkDataAssociation(DomainObjectTraversalAdapter adapter,
DomainObject obj,
String path,
String context,
String propName,
DataAssociationCursor daCursor) {
s_log.debug("Processing data assoication cursor...");
DataObject link = daCursor.getLink();
DomainObject linkObj = null;
if (link != null) {
linkObj = new LinkDomainObject(link);
}
walk(adapter,
DomainObjectFactory.newInstance(daCursor.getDataObject()),
appendToPath(path, propName),
context,
linkObj);
}
/** /**
* Method called when the processing of an object * Method called when the processing of an object
* starts * starts
@ -534,9 +590,9 @@ public abstract class DomainObjectTraversal {
* this is simply a subclass since DomainObject is abstract * this is simply a subclass since DomainObject is abstract
* but we don't have any other domain object to use. * but we don't have any other domain object to use.
*/ */
private class LinkDomainObject extends DomainObject { protected class LinkDomainObject extends DomainObject {
LinkDomainObject(DataObject object) { public LinkDomainObject(DataObject object) {
super(object); super(object);
} }
} }

View File

@ -419,6 +419,14 @@ public class DomainObjectXMLRenderer extends DomainObjectTraversal {
return m_element; return m_element;
} }
protected void setCurrentElement(Element element) {
m_element = element;
}
protected Stack getElementStack() {
return m_elements;
}
protected Element newElement(Element parent, protected Element newElement(Element parent,
String name) { String name) {
return m_namespaceURI == null ? return m_namespaceURI == null ?

View File

@ -37,8 +37,8 @@ public class SimpleDomainObjectTraversalAdapter
implements DomainObjectTraversalAdapter { implements DomainObjectTraversalAdapter {
private static final Logger s_log = private static final Logger s_log =
Logger.getLogger(SimpleDomainObjectTraversalAdapter.class); Logger.getLogger(
SimpleDomainObjectTraversalAdapter.class);
/** /**
* Rule that indicates the set of properties should be treated * Rule that indicates the set of properties should be treated
* as an inclusion list. ie, don't allow any properties except * as an inclusion list. ie, don't allow any properties except
@ -51,13 +51,10 @@ public class SimpleDomainObjectTraversalAdapter
* except those listed. This is the default for attributes. * except those listed. This is the default for attributes.
*/ */
public final static int RULE_EXCLUDE = 1; public final static int RULE_EXCLUDE = 1;
private HashSet m_attr = new HashSet(); private HashSet m_attr = new HashSet();
private HashSet m_assoc = new HashSet(); private HashSet m_assoc = new HashSet();
private int m_attrRule = RULE_EXCLUDE; private int m_attrRule = RULE_EXCLUDE;
private int m_assocRule = RULE_INCLUDE; private int m_assocRule = RULE_INCLUDE;
private SimpleDomainObjectTraversalAdapter m_parent; private SimpleDomainObjectTraversalAdapter m_parent;
/** /**
@ -78,11 +75,18 @@ public class SimpleDomainObjectTraversalAdapter
* @param parent the parent adapter to delegate to * @param parent the parent adapter to delegate to
*/ */
public SimpleDomainObjectTraversalAdapter( public SimpleDomainObjectTraversalAdapter(
SimpleDomainObjectTraversalAdapter parent SimpleDomainObjectTraversalAdapter parent) {
) {
m_parent = parent; m_parent = parent;
} }
public SimpleDomainObjectTraversalAdapter getParent() {
return m_parent;
}
public int getAttributeRule() {
return m_attrRule;
}
/** /**
* Set the rule for processing attributes * Set the rule for processing attributes
* *
@ -92,6 +96,10 @@ public class SimpleDomainObjectTraversalAdapter
m_attrRule = rule; m_attrRule = rule;
} }
public int getAssociationRule() {
return m_assocRule;
}
/** /**
* Set the rule for processing associations * Set the rule for processing associations
* *
@ -101,6 +109,10 @@ public class SimpleDomainObjectTraversalAdapter
m_assocRule = rule; m_assocRule = rule;
} }
public HashSet getAttributeProperties() {
return m_attr;
}
/** /**
* Add a property to the attribute property set. * Add a property to the attribute property set.
* *
@ -116,9 +128,21 @@ public class SimpleDomainObjectTraversalAdapter
* @param prop full path of the property to remove * @param prop full path of the property to remove
*/ */
public void removeAttributeProperty(String prop) { public void removeAttributeProperty(String prop) {
s_log.debug(String.format("Removing attribute property '%s'", prop));
m_attr.remove(prop); m_attr.remove(prop);
} }
/**
* Clears the property set.
*/
public void clearAttributeProperties() {
m_attr.clear();
}
public HashSet getAssociationProperties() {
return m_assoc;
}
/** /**
* Add a property to the association property set. * Add a property to the association property set.
* *
@ -134,9 +158,17 @@ public class SimpleDomainObjectTraversalAdapter
* @param prop full path of the property to remove * @param prop full path of the property to remove
*/ */
public void removeAssociationProperty(String prop) { public void removeAssociationProperty(String prop) {
s_log.debug(String.format("Removing association property '%s'", prop));
m_assoc.remove(prop); m_assoc.remove(prop);
} }
/**
* Clears the association properties set.
*/
public void clearAssociationProperties() {
m_assoc.clear();
}
/** /**
* Determines whether or not to allow processing * Determines whether or not to allow processing
* of a property, based on the property set and * of a property, based on the property set and
@ -149,8 +181,8 @@ public class SimpleDomainObjectTraversalAdapter
if (prop.isAttribute()) { if (prop.isAttribute()) {
boolean result = m_attr.contains(path); boolean result = m_attr.contains(path);
if (s_log.isDebugEnabled()) { if (s_log.isDebugEnabled()) {
s_log.debug("Check attr " + path + " contains " + s_log.debug("Check attr " + path + " contains " + result + " "
result + " " + m_attrRule); + m_attrRule);
} }
if (!result && m_parent != null) { if (!result && m_parent != null) {
if (s_log.isDebugEnabled()) { if (s_log.isDebugEnabled()) {
@ -162,8 +194,8 @@ public class SimpleDomainObjectTraversalAdapter
} else { } else {
boolean result = m_assoc.contains(path); boolean result = m_assoc.contains(path);
if (s_log.isDebugEnabled()) { if (s_log.isDebugEnabled()) {
s_log.debug("Check assoc " + path + " contains " + s_log.debug("Check assoc " + path + " contains " + result + " "
result + " " + m_assocRule); + m_assocRule);
} }
if (!result && m_parent != null) { if (!result && m_parent != null) {
if (s_log.isDebugEnabled()) { if (s_log.isDebugEnabled()) {

View File

@ -63,3 +63,4 @@ log4j.logger.com.arsdigita.packaging.Loader=INFO
log4j.logger.com.arsdigita.cms.search.ContentPageMetadataProvider=DEBUG log4j.logger.com.arsdigita.cms.search.ContentPageMetadataProvider=DEBUG
log4j.logger.com.arsdigita.london.importer=DEBUG log4j.logger.com.arsdigita.london.importer=DEBUG
log4j.logger.com.arsdigita.london.terms.importer.TermItemBuilder=DEBUG

View File

@ -5,7 +5,8 @@ xinha_init=null;
xinha_config=null; xinha_config=null;
xinha_init=xinha_init?xinha_init:function(){ xinha_init=xinha_init?xinha_init:function(){
xinha_editors=xinha_editors?xinha_editors:["myTextArea","anotherOne"]; xinha_editors=xinha_editors?xinha_editors:["myTextArea","anotherOne"];
xinha_plugins=xinha_plugins?xinha_plugins:["CharacterMap","ContextMenu","SmartReplace","Stylist","Linker","SuperClean","TableOperations"]; //xinha_plugins=xinha_plugins?xinha_plugins:["CharacterMap","ContextMenu","SmartReplace","Stylist","Linker","SuperClean","TableOperations"];
xinha_plugins=xinha_plugins?xinha_plugins:["CharacterMap","ContextMenu","SmartReplace","Stylist","SuperClean","TableOperations"];
if(!Xinha.loadPlugins(xinha_plugins,xinha_init)){ if(!Xinha.loadPlugins(xinha_plugins,xinha_init)){
return; return;
} }

View File

@ -98,6 +98,17 @@ function onCancel() {
return false; return false;
} }
function onBrowse(){
baseURL = opener.location.pathname;
offset = baseURL.lastIndexOf("/");
destURL = baseURL.slice(0, offset+1) + "search.jsp?useURL=true&widget=getElementById('f_href')";
aWindow = window.open(destURL,
"search",
"toolbar=no,width=800,height=600,status=no,scrollbars=yes,resize=yes,menubar=no");
return false;
}
</script> </script>
</head> </head>
@ -108,7 +119,10 @@ function onCancel() {
<table border="0" style="width: 100%;"> <table border="0" style="width: 100%;">
<tr> <tr>
<td class="label">URL:</td> <td class="label">URL:</td>
<td><input type="text" id="f_href" style="width: 100%" /></td> <td><input type="text" id="f_href" style="width: 100%" />
<button name="browse" onclick="return onBrowse();"
title="Browse for a content item">Browse</button>
</td>
</tr> </tr>
<tr> <tr>
<td class="label">Title (tooltip):</td> <td class="label">Title (tooltip):</td>

View File

@ -11,7 +11,9 @@
<table id="[urltable]" width="100%"> <table id="[urltable]" width="100%">
<tr> <tr>
<th><label for="[href]"><l10n>URL:</l10n> </label></th> <th><label for="[href]"><l10n>URL:</l10n> </label></th>
<td><input type="text" name="[href]" style="width:100%" value="http://www.example.com/" onfocus="if (this.value == 'http://www.example.com/') this.value = '';" /></td> <td><input type="text" name="[href]" style="width:100%"
value="http://www.example.com/" onfocus="if (this.value ==
'http://www.example.com/') this.value = '';" /></td>
</tr> </tr>
<tr style="vertical-align: top;"> <tr style="vertical-align: top;">
<th><l10n>Target:</l10n></th> <th><l10n>Target:</l10n></th>

View File

@ -0,0 +1,210 @@
/*
* Copyright (c) 2010 Jens Pelzetter,
* for the Center of Social Politics of the University of Bremen
*
* 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.london.navigation.ui;
import com.arsdigita.cms.ContentItem;
import com.arsdigita.cms.CustomizableContentItemXMLRenderer;
import com.arsdigita.cms.dispatcher.SimpleXMLGenerator;
import com.arsdigita.domain.DomainObjectTraversal;
import com.arsdigita.domain.DomainObjectTraversalAdapter;
import com.arsdigita.domain.SimpleDomainObjectTraversalAdapter;
import com.arsdigita.persistence.SessionManager;
import com.arsdigita.persistence.metadata.ObjectType;
import com.arsdigita.xml.Element;
import java.util.ArrayList;
import java.util.List;
import org.apache.log4j.Logger;
/**
* <p>
* This is a more customizable variant of the {@link GreetingItem} component.
* It uses the {@link CustomizableContentItemXMLRenderer} for rendering the
* item.
* </p>
* <p>
* This component provides an method to access the traversal adapter which is
* used to control which properties of the greeting item are rendered and which
* are not put into the XML output. You can create an completely new
* adapter, or copy the one which is registered for the rendered item.
* </p>
* <p>
* The manipulations are done in a JSP file. An example:
* </p>
* <pre>
* &lt;define:component name="greetingItem"
* classname="com.arsdigita.london.navigation.ui.CustomizableGreetingItem"/&gt;
* &lt;jsp:scriptlet&gt;
* ((com.arsdigita.london.navigation.ui.CustomizableGreetingItem) greetingItem).loadTraversalAdapter("com.arsdigita.cms.contenttypes.SciOrganization",
* SimpleXMLGenerator.ADAPTER_CONTEXT);
* ((com.arsdigita.london.navigation.ui.CustomizableGreetingItem) greetingItem).getTraversalAdapter().clearAssociationProperties();
* ((com.arsdigita.london.navigation.ui.CustomizableGreetingItem) greetingItem).getTraversalAdapter().addAssociationProperty("/object/persons");
* ((com.arsdigita.london.navigation.ui.CustomizableGreetingItem) greetingItem).setOrder("surname asc, givenname asc");
*
* ((com.arsdigita.london.navigation.ui.CustomizableGreetingItem) greetingItem).setPageSize(5);
* &lt;/jsp:scriptlet&gt;
* </pre>
* <p>
* As you might notice, you have to know the type of the greeting item to use
* the {@link #loadTraversalAdapter(String, String)} method if you want to
* copy the traversal adapter.
* </p>
*
* @see SimpleDomainObjectTraversalAdapter
* @see CustomizableContentItemXMLRenderer
*
* @author Jens Pelzetter
*/
public class CustomizableGreetingItem extends GreetingItem {
private static final Logger s_log = Logger.getLogger(
CustomizableGreetingItem.class);
private SimpleDomainObjectTraversalAdapter adapter;
private int m_pageSize = 20;
private String m_order;
private List<String> m_filters;
public CustomizableGreetingItem() {
super();
adapter = new SimpleDomainObjectTraversalAdapter();
m_filters = new ArrayList<String>();
/*adapter.setAssociationRule(
SimpleDomainObjectTraversalAdapter.RULE_INCLUDE);
adapter.setAttributeRule(SimpleDomainObjectTraversalAdapter.RULE_INCLUDE);
adapter.addAttributeProperty("/object/title");
adapter.addAttributeProperty("/object/name");
adapter.addAttributeProperty("/object/addendum");
adapter.addAttributeProperty("/object/organizationShortDescription");
adapter.addAttributeProperty("/object/organizationDescription");
adapter.addAssociationProperty("/object/persons");*/
//loadTraversalAdapter("com.arsdigita.cms.contenttypes.SciOrganization",
// SimpleXMLGenerator.ADAPTER_CONTEXT);
//adapter.removeAssociationProperty("/object/persons");
}
/**
* Set the page size to use for rendering association properties. Set to 0
* or less to deactivated the paginator.
*
* @param pageSize
*/
public void setPageSize(int pageSize) {
m_pageSize = pageSize;
}
/**
* Set an order for the rendered data associations.
*
* @param order
*/
public void setOrder(String order) {
m_order = order;
}
/**
* Add a filter for the rendered data associations.
*
* @param filter
*/
public void addFilter(String filter) {
m_filters.add(filter);
}
/**
* Copies the traversal adapter for <code>type</type> and
* <code>context</code>. Caution: Do not manipulate the parent adapters!
*
* @param type
* @param context
*/
public void loadTraversalAdapter(String type, String context) {
ObjectType objType;
DomainObjectTraversalAdapter dotAdapter;
s_log.debug(String.format("Loading traversal adapter for type '%s' "
+ "and context '%s'",
type,
context));
objType = SessionManager.getMetadataRoot().getObjectType(type);
dotAdapter = DomainObjectTraversal.findAdapter(objType, context);
if (dotAdapter instanceof SimpleDomainObjectTraversalAdapter) {
SimpleDomainObjectTraversalAdapter sourceAdapter;
sourceAdapter = (SimpleDomainObjectTraversalAdapter) dotAdapter;
//adapter = (SimpleDomainObjectTraversalAdapter) dotAdapter;
adapter = new SimpleDomainObjectTraversalAdapter(sourceAdapter.
getParent());
adapter.setAttributeRule(sourceAdapter.getAttributeRule());
adapter.setAssociationRule(sourceAdapter.getAssociationRule());
for (Object prop : sourceAdapter.getAttributeProperties()) {
adapter.addAttributeProperty((String) prop);
}
for (Object prop : sourceAdapter.getAssociationProperties()) {
adapter.addAssociationProperty((String) prop);
}
} else {
s_log.warn(String.format("Registered traversal adapter for type "
+ "'%s' and context '%s' is not an instance "
+ "of SimpleDomainObjectTraversalAdapter "
+ "and therefore not "
+ "usable with this class. ",
type,
context));
}
}
public SimpleDomainObjectTraversalAdapter getTraversalAdapter() {
return adapter;
}
/**
* Creates the XML for the GreetingItem using
* {@link CustomizableContentItemXMLRenderer}. The adapter and the other
* parameters for rendering are passed to the renderer.
*
* @param parent
* @param item
*/
@Override
protected void generateGreetingItemXml(Element parent, ContentItem item) {
CustomizableContentItemXMLRenderer renderer =
new CustomizableContentItemXMLRenderer(
parent);
renderer.setWrapAttributes(true);
renderer.setWrapRoot(false);
renderer.setWrapObjects(false);
renderer.setPageSize(m_pageSize);
renderer.setOrder(m_order);
renderer.setFilters(m_filters);
renderer.walk(item, SimpleXMLGenerator.ADAPTER_CONTEXT, adapter);
//renderer.walk(item, SimpleXMLGenerator.ADAPTER_CONTEXT);
}
}

View File

@ -15,7 +15,6 @@
* License along with this library; if not, write to the Free Software * License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/ */
package com.arsdigita.london.navigation.ui; package com.arsdigita.london.navigation.ui;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
@ -50,6 +49,7 @@ import com.arsdigita.xml.Element;
* @version $Id: GreetingItem.java 1473 2007-03-12 15:16:39Z chrisgilbert23 $ * @version $Id: GreetingItem.java 1473 2007-03-12 15:16:39Z chrisgilbert23 $
*/ */
public class GreetingItem extends AbstractComponent { public class GreetingItem extends AbstractComponent {
private static final Logger s_log = Logger.getLogger(GreetingItem.class); private static final Logger s_log = Logger.getLogger(GreetingItem.class);
public Element generateXML(HttpServletRequest request, public Element generateXML(HttpServletRequest request,
@ -75,11 +75,13 @@ public class GreetingItem extends AbstractComponent {
// Note that the xml that is generated is only of use if you DO NOT CACHE index pages. // Note that the xml that is generated is only of use if you DO NOT CACHE index pages.
// cg. // cg.
PermissionDescriptor edit = new PermissionDescriptor(PrivilegeDescriptor.get(SecurityManager.CMS_EDIT_ITEM), item, currentParty); PermissionDescriptor edit = new PermissionDescriptor(PrivilegeDescriptor.
get(SecurityManager.CMS_EDIT_ITEM), item, currentParty);
if (PermissionService.checkPermission(edit)) { if (PermissionService.checkPermission(edit)) {
content.addAttribute("canEdit", "true"); content.addAttribute("canEdit", "true");
} }
PermissionDescriptor publish = new PermissionDescriptor(PrivilegeDescriptor.get(SecurityManager.CMS_PUBLISH), item, currentParty); PermissionDescriptor publish = new PermissionDescriptor(PrivilegeDescriptor.
get(SecurityManager.CMS_PUBLISH), item, currentParty);
if (PermissionService.checkPermission(publish)) { if (PermissionService.checkPermission(publish)) {
content.addAttribute("canPublish", "true"); content.addAttribute("canPublish", "true");
} }
@ -105,16 +107,34 @@ public class GreetingItem extends AbstractComponent {
Element itemEl = content.newChildElement("cms:item", Element itemEl = content.newChildElement("cms:item",
CMS.CMS_XML_NS); CMS.CMS_XML_NS);
ContentItemXMLRenderer renderer = //Moved to seperate method generateGreetingItemXml to make to
//XML generation extendable (use another renderer etc.)
/*ContentItemXMLRenderer renderer =
new ContentItemXMLRenderer(itemEl); new ContentItemXMLRenderer(itemEl);
renderer.setWrapAttributes(true); renderer.setWrapAttributes(true);
renderer.setWrapRoot(false); renderer.setWrapRoot(false);
renderer.setWrapObjects(false); renderer.setWrapObjects(false);
renderer.walk( baseItem, SimpleXMLGenerator.ADAPTER_CONTEXT ); renderer.walk(baseItem, SimpleXMLGenerator.ADAPTER_CONTEXT);*/
generateGreetingItemXml(itemEl, baseItem);
return content; return content;
} }
/**
* Creates the XML for the greeting item.
*
* @param parent The parent element
* @param item The item to render
*/
protected void generateGreetingItemXml(Element parent, ContentItem item) {
ContentItemXMLRenderer renderer = new ContentItemXMLRenderer(parent);
renderer.setWrapAttributes(true);
renderer.setWrapRoot(false);
renderer.setWrapObjects(false);
renderer.walk(item, SimpleXMLGenerator.ADAPTER_CONTEXT);
}
} }

View File

@ -56,6 +56,8 @@ public class TermItemBuilder {
SiteNode node = null; SiteNode node = null;
try { try {
s_log.debug(String.format("Trying to get SiteNode for path '%s",
path));
node = SiteNode.getSiteNode(path); node = SiteNode.getSiteNode(path);
} catch (DataObjectNotFoundException ex) { } catch (DataObjectNotFoundException ex) {
s_log.error("Couldn't fetch sitenode for " + path); s_log.error("Couldn't fetch sitenode for " + path);