Here goes a small contribution to the cforms block.

It's a selection list builder which returns a custom class selection
list. I use it to build from my DAO methods!

It's syntax its something like :

<fd:selection-list type="java" class="x.p.t.o.MyJavaSelectionList"
nullable="false"/>

-- 
Nuno Santos <[EMAIL PROTECTED]>
/*
 * Copyright 1999-2004 The Apache Software Foundation.
 * 
 * Licensed 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.forms.datatype;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;

import org.apache.avalon.framework.service.ServiceException;
import org.apache.avalon.framework.service.ServiceManager;
import org.apache.avalon.framework.service.Serviceable;
import org.apache.cocoon.forms.Constants;
import org.apache.cocoon.forms.datatype.convertor.Convertor;
import org.apache.cocoon.forms.datatype.convertor.DefaultFormatCache;
import org.apache.cocoon.xml.AttributesImpl;
import org.apache.cocoon.xml.XMLUtils;
import org.xml.sax.ContentHandler;
import org.xml.sax.SAXException;

/**
 * Abstract implementation of a JavaSelectionList
 *
 *  
 */
public abstract class AbstractJavaSelectionList implements JavaSelectionList, Serviceable {	
	private HashMap attributes;

	/* (non-Javadoc)
	 * @see org.apache.cocoon.forms.datatype.JavaSelectionList#getAttribute(java.lang.String)
	 */
	public String getAttribute(String name) {
		if( this.attributes==null){
			return null;
		}
		return (String) this.attributes.get(name);
	}
	/* (non-Javadoc)
	 * @see org.apache.cocoon.forms.datatype.JavaSelectionList#removeAttribute(java.lang.String)
	 */
	public void removeAttribute(String name) {
		if( this.attributes!=null){
			this.attributes.remove(name);
		}

	}
	/* (non-Javadoc)
	 * @see org.apache.cocoon.forms.datatype.JavaSelectionList#setAttribute(java.lang.String, java.lang.String)
	 */
	public void setAttribute(String name, String value) {
		if( this.attributes==null){
			this.attributes=new HashMap();
		}
		this.attributes.put(name, value);

	}
	protected Datatype datatype;
	private List items = new ArrayList();
	private boolean nullable = false;
	protected ServiceManager manager = null;
	private boolean rebuilding = false;

	/* (non-Javadoc)
	 * @see org.apache.avalon.framework.service.Serviceable#service(org.apache.avalon.framework.service.ServiceManager)
	 */
	public void service(ServiceManager manager) throws ServiceException {
		this.manager=manager;
	}
	
	
	
	/* (non-Javadoc)
	 * @see org.apache.cocoon.forms.datatype.JavaSelectionList#isNullable()
	 */
	public boolean isNullable() {		
		return this.nullable;
	}
	/* (non-Javadoc)
	 * @see org.apache.cocoon.forms.datatype.JavaSelectionList#setDatatype(org.apache.cocoon.forms.datatype.Datatype)
	 */
	public void setDatatype(Datatype datatype) {
		this.datatype=datatype;
	}
	/* (non-Javadoc)
	 * @see org.apache.cocoon.forms.datatype.JavaSelectionList#setNullable(boolean)
	 */
	public void setNullable(boolean nullable) {
		this.nullable=nullable;
	}	
	/*
	 * (non-Javadoc)
	 * 
	 * @see org.apache.cocoon.forms.datatype.SelectionList#getDatatype()
	 */
	public Datatype getDatatype() {
		return this.datatype;
	}

	public void rebuild() {
		this.rebuilding = true;
	}
	/*public void prebuild() {
		try {
			this.items.clear();
			this.build();
		} catch (Exception e) {
			e.printStackTrace();
		}
		this.rebuilding = false;
	}*/
	public void generateSaxFragment(ContentHandler contentHandler, Locale locale)
			throws SAXException {
		if (this.rebuilding)
			try {
				this.items.clear();
				this.rebuilding = this.build();
			} catch (Exception e) {
				e.printStackTrace();
			}
		Convertor.FormatCache formatCache = new DefaultFormatCache();
		contentHandler.startElement(Constants.INSTANCE_NS, SELECTION_LIST_EL,
				Constants.INSTANCE_PREFIX_COLON + SELECTION_LIST_EL,
				XMLUtils.EMPTY_ATTRIBUTES);
		if (nullable) {
			AttributesImpl voidAttrs = new AttributesImpl();
			voidAttrs.addCDATAAttribute("value", "");
			contentHandler.startElement(Constants.INSTANCE_NS, ITEM_EL,
					Constants.INSTANCE_PREFIX_COLON + ITEM_EL, voidAttrs);
			contentHandler.endElement(Constants.INSTANCE_NS, ITEM_EL,
					Constants.INSTANCE_PREFIX_COLON + ITEM_EL);
		}
		Iterator itemIt = items.iterator();
		while (itemIt.hasNext()) {
			SelectionListItem item = (SelectionListItem) itemIt.next();
			item.generateSaxFragment(contentHandler, locale, formatCache);
		}
		contentHandler.endElement(Constants.INSTANCE_NS, SELECTION_LIST_EL,
				Constants.INSTANCE_PREFIX_COLON + SELECTION_LIST_EL);
		this.rebuilding = true;
	}

	/**
	 *  
	 */
	protected abstract boolean build() throws Exception;
	/**
	 * Adds a new item to this selection list.
	 * 
	 * @param value
	 *            a value of the correct type (i.e. the type with which this
	 *            selectionlist is associated)
	 * @param label
	 *            a SAX-fragment such as a
	 *            [EMAIL PROTECTED] org.apache.cocoon.xml.SaxBuffer}, can be null
	 */
	protected void addItem(Object value, String label) {
		items.add(new SelectionListItem(value, label));
	}

	protected List getItems() {
		return items;
	}
	public Object getFirst() {
		if (items.isEmpty())
			return null;
		SelectionListItem item = (SelectionListItem) items.get(0);
		return item.value;
	}

	private final class SelectionListItem {
		private final Object value;
		private final String label;

		public SelectionListItem(Object value, String label) {
			this.value = value;
			this.label = label;
		}

		public Object getValue() {
			return value;
		}

		public void generateSaxFragment(ContentHandler contentHandler,
				Locale locale, Convertor.FormatCache formatCache)
				throws SAXException {
			AttributesImpl itemAttrs = new AttributesImpl();
			String stringValue;
			if (this.value == null) {
				stringValue = "";
			} else {
				stringValue = datatype.getConvertor().convertToString(value,
						locale, formatCache);
			}
			itemAttrs.addCDATAAttribute("value", stringValue);
			contentHandler.startElement(Constants.INSTANCE_NS, ITEM_EL,
					Constants.INSTANCE_PREFIX_COLON + ITEM_EL, itemAttrs);
			contentHandler.startElement(Constants.INSTANCE_NS, LABEL_EL,
					Constants.INSTANCE_PREFIX_COLON + LABEL_EL,
					XMLUtils.EMPTY_ATTRIBUTES);
			if (label == null) {
				contentHandler.characters(stringValue.toCharArray(), 0,
						stringValue.length());
			} else {
				contentHandler.characters(label.toCharArray(), 0, label
						.length());
			}
			contentHandler.endElement(Constants.INSTANCE_NS, LABEL_EL,
					Constants.INSTANCE_PREFIX_COLON + LABEL_EL);
			contentHandler.endElement(Constants.INSTANCE_NS, ITEM_EL,
					Constants.INSTANCE_PREFIX_COLON + ITEM_EL);
		}
	}

}
/*
 * Copyright 1999-2004 The Apache Software Foundation.
 * 
 * Licensed 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.forms.datatype;

/**
 * A selection list that takes its values from the custom java class itself.
 *
 *  
 */
public interface JavaSelectionList extends SelectionList{
	
	void setDatatype(Datatype datatype);
	
	boolean isNullable();
	
	void setNullable(boolean nullable);
	
	String getAttribute(String name);
	
	void setAttribute(String name, String value);
	
	void removeAttribute(String name);
}
/*
 * Copyright 1999-2004 The Apache Software Foundation.
 * 
 * Licensed 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.forms.datatype;

import org.apache.avalon.framework.context.Context;
import org.apache.avalon.framework.context.ContextException;
import org.apache.avalon.framework.context.Contextualizable;
import org.apache.avalon.framework.logger.AbstractLogEnabled;
import org.apache.avalon.framework.service.ServiceException;
import org.apache.avalon.framework.service.ServiceManager;
import org.apache.avalon.framework.service.Serviceable;
import org.apache.cocoon.components.LifecycleHelper;
import org.apache.cocoon.forms.util.DomHelper;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;

/**
 * Builds [EMAIL PROTECTED] SelectionList}s from a JavaSelectionList class
 *
 *  
 */
public class JavaSelectionListBuilder extends AbstractLogEnabled
		implements
			SelectionListBuilder,
			Serviceable,
			Contextualizable {

	private ServiceManager manager;
	private Context context;

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.apache.cocoon.forms.datatype.SelectionListBuilder#build(org.w3c.dom.Element,
	 *      org.apache.cocoon.forms.datatype.Datatype)
	 */
	public SelectionList build(Element selectionListElement, Datatype datatype)
			throws Exception {
		String className = DomHelper
				.getAttribute(selectionListElement, "class");
		boolean nullable = DomHelper.getAttributeAsBoolean(
				selectionListElement, "nullable", true);
		
		try {
			Class clasz = Class.forName(className);
			if (JavaSelectionList.class.isAssignableFrom(clasz)) {
				JavaSelectionList list = (JavaSelectionList) clasz.newInstance();
				LifecycleHelper.setupComponent(list,getLogger(),this.context, this.manager,null, null, true);
				list.setDatatype(datatype);
				list.setNullable(nullable);
				NamedNodeMap attrs = selectionListElement.getAttributes();
				int size=attrs.getLength();
				for( int i=0; i< size; i++){
					Node attr = attrs.item(i);
					String name=attr.getNodeName();
					//if( !"class".equals(name) && !"nullable".equals(name)){
						list.setAttribute(name, attr.getNodeValue());
					//}
				}
				return list;
			}
			return new StaticSelectionList(datatype);
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
			throw e;
		} catch (InstantiationException e) {
			e.printStackTrace();
			throw e;
		} catch (IllegalAccessException e) {
			e.printStackTrace();
			throw e;
		}
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.apache.avalon.framework.service.Serviceable#service(org.apache.avalon.framework.service.ServiceManager)
	 */
	public void service(ServiceManager manager) throws ServiceException {
		this.manager = manager;

	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.apache.avalon.framework.context.Contextualizable#contextualize(org.apache.avalon.framework.context.Context)
	 */
	public void contextualize(Context context) throws ContextException {
		this.context = context;

	}

}

Reply via email to