/* * 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(); } } } }