blob: b19990d5e8ff23b55bfd3326b5312509beea847c [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.cocoon.portal.coplets.basket;
import java.io.IOException;
import java.util.Iterator;
import java.util.List;
import org.apache.avalon.framework.configuration.Configuration;
import org.apache.avalon.framework.configuration.ConfigurationException;
import org.apache.avalon.framework.service.ServiceException;
import org.apache.cocoon.ProcessingException;
import org.apache.cocoon.portal.PortalService;
import org.apache.cocoon.portal.coplet.CopletInstanceData;
import org.apache.cocoon.portal.coplets.basket.BasketManager.ActionInfo;
import org.apache.cocoon.portal.coplets.basket.events.AddItemEvent;
import org.apache.cocoon.portal.event.Event;
import org.apache.cocoon.xml.AttributesImpl;
import org.apache.cocoon.xml.XMLUtils;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
/**
* This transformer supports the basket and briefcase feature. It can generate links to
* add content into a content store.
*
* @version CVS $Id$
*/
public class BasketTransformer
extends AbstractBasketTransformer {
/** Element to add a link */
protected static final String ADD_ITEM_ELEMENT = "add-item";
/** Element to show all actions */
protected static final String SHOW_ACTIONS_ELEMENT = "show-actions";
/** The default store: briefcase or basket */
protected String defaultStoreName = "basket";
/** The default link element name */
protected String defaultLinkElement = "a";
/** The default namespace for the link element */
protected String defaultLinkElementNS = "";
/* (non-Javadoc)
* @see org.apache.avalon.framework.configuration.Configurable#configure(org.apache.avalon.framework.configuration.Configuration)
*/
public void configure(Configuration configuration)
throws ConfigurationException {
super.configure(configuration);
this.defaultStoreName = configuration.getChild("default-store").getValue(this.defaultStoreName);
this.defaultLinkElement = configuration.getChild("default-link-element").getValue(this.defaultLinkElement);
this.defaultLinkElementNS = configuration.getChild("default-link-element-ns").getValue(this.defaultLinkElementNS);
}
/* (non-Javadoc)
* @see org.apache.cocoon.transformation.AbstractSAXTransformer#endTransformingElement(java.lang.String, java.lang.String, java.lang.String)
*/
public void endTransformingElement(String uri, String name, String raw)
throws ProcessingException, IOException, SAXException {
if ( ADD_ITEM_ELEMENT.equals(name) ) {
final String linkElementName = this.parameters.getParameter("link-element", this.defaultLinkElement);
final String linkElementNS = this.parameters.getParameter("link-element-ns", this.defaultLinkElementNS);
XMLUtils.endElement(this.contentHandler, linkElementNS, linkElementName);
} else if ( SHOW_ACTIONS_ELEMENT.equals(name) ) {
// nothing to do here
}
}
/* (non-Javadoc)
* @see org.apache.cocoon.transformation.AbstractSAXTransformer#startTransformingElement(java.lang.String, java.lang.String, java.lang.String, org.xml.sax.Attributes)
*/
public void startTransformingElement(String uri, String name,
String raw, Attributes attr)
throws ProcessingException, IOException, SAXException {
if ( ADD_ITEM_ELEMENT.equals(name) ) {
PortalService service = null;
try {
service = (PortalService)this.manager.lookup(PortalService.ROLE);
// do we want to add content or a link?
boolean addContent = false;
final String value = attr.getValue("content");
if ( value != null ) {
addContent = new Boolean(value).booleanValue();
}
// do we want to add a url or a coplet?
final ContentItem ci;
final String href = attr.getValue("href");
if ( href != null ) {
ci = new ContentItem(href, addContent);
} else {
final String copletId = attr.getValue("coplet");
final CopletInstanceData cid = service.getComponentManager().getProfileManager().getCopletInstanceData(copletId);
ci = new ContentItem(cid, addContent);
}
// if a title is present set the title
final String title = attr.getValue("title");
if(title!=null) {
ci.setTitle(title);
}
// do we want to add the content to the basket or to the briefcase
final ContentStore store;
final String storeName = (attr.getValue("store") == null ? this.defaultStoreName : attr.getValue("store"));
if ("basket".equalsIgnoreCase(storeName) ) {
store = this.basketManager.getBasket();
} else {
store = this.basketManager.getBriefcase();
}
final Event e = new AddItemEvent(store, ci);
final AttributesImpl ai = new AttributesImpl();
String newLink = service.getComponentManager().getLinkService().getLinkURI(e);
// check for bockmark
final String bookmark = attr.getValue("bookmark");
if ( bookmark != null && bookmark.length() > 0) {
int pos = newLink.indexOf('?') + 1;
final char separator;
if ( bookmark.indexOf('?') == -1 ) {
separator = '?';
} else {
separator = '&';
}
newLink = bookmark + separator + newLink.substring(pos);
}
ai.addCDATAAttribute("href", newLink);
final String linkElementName = this.parameters.getParameter("link-element", this.defaultLinkElement);
final String linkElementNS = this.parameters.getParameter("link-element-ns", this.defaultLinkElementNS);
XMLUtils.startElement(this.contentHandler, linkElementNS, linkElementName, ai);
} catch (ServiceException se) {
throw new SAXException("Unable to lookup portal service.", se);
} finally {
this.manager.release(service);
}
} else if ( SHOW_ACTIONS_ELEMENT.equals(name) ) {
// basket or briefcase
final List actions;
final String storeName = (attr.getValue("store") == null ? this.defaultStoreName : attr.getValue("store"));
if ("basket".equalsIgnoreCase(storeName) ) {
actions = this.basketManager.getBasketActions();
} else {
actions = this.basketManager.getBriefcaseActions();
}
final String checkedAction = attr.getValue("checked");
final Iterator i = actions.iterator();
AttributesImpl a = new AttributesImpl();
while ( i.hasNext() ) {
final BasketManager.ActionInfo current = (ActionInfo) i.next();
a.addCDATAAttribute("name", current.name);
if ( current.name.equals(checkedAction) ) {
a.addCDATAAttribute("checked", "true");
}
XMLUtils.createElement(this.xmlConsumer, "action", a);
a.clear();
}
}
}
}