All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.atomikos.beans.HtmlBeanWizard Maven / Gradle / Ivy

There is a newer version: 6.0.0
Show newest version
/**
 * Copyright (C) 2000-2010 Atomikos 
 *
 * This code ("Atomikos TransactionsEssentials"), by itself,
 * is being distributed under the
 * Apache License, Version 2.0 ("License"), a copy of which may be found at
 * http://www.atomikos.com/licenses/apache-license-2.0.txt .
 * You may not use this file except in compliance with the License.
 *
 * While the License grants certain patent license rights,
 * those patent license rights only extend to the use of
 * Atomikos TransactionsEssentials by itself.
 *
 * This code (Atomikos TransactionsEssentials) contains certain interfaces
 * in package (namespace) com.atomikos.icatch
 * (including com.atomikos.icatch.Participant) which, if implemented, may
 * infringe one or more patents held by Atomikos.
 * It should be appreciated that you may NOT implement such interfaces;
 * licensing to implement these interfaces must be obtained separately from Atomikos.
 *
 * 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.
 */

package com.atomikos.beans;

import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.atomikos.util.ClassLoadingHelper;

/**
 *
 *
 *
 *
 *
 * A wizard class for HTML platforms. An instance can be used to
 * configure a bean in an HTML browser. Indexed properties are
 * NOT supported.
 */

public class HtmlBeanWizard
{

	private static final String PAR_NAME_PREFIX = "com.atomikos.beans.property.";
	//unique prefix to ensure that properties are represented by
	//unique parameter names in HTML requests

	private static final String BOOLEAN_PREFIX = "boolean.";
	//indicates which parameter correspond to boolean properties
	//and are therefore represented by a checkbox in the form

	private static Property[] filterProperties ( Property[] props )
	throws PropertyException
	{
		if ( props == null ) return null;

		ArrayList list = new ArrayList();

		for ( int i = 0 ; i < props.length ; i++ ) {
			if ( ! (  props[i].isHidden() ||
					  props[i].isReadOnly() ||
					  props[i].getEditor() == null ||
					  props[i].getIndexedProperty() != null ) )
				list.add ( props[i] );

		}
		return ( Property[] ) list.toArray ( new Property[0] );
	}


	private BeanInspector inspector;

	private Map parsedProperties;


	public HtmlBeanWizard ()
	{
		parsedProperties = new HashMap();
	}

	/**
	 * Set the class name of the underlying bean.
	 * This method should be called before using the instance.
	 * @param name
	 * @throws ClassNotFoundException If the class is not found.
	 *
	 */

	public void setClassName ( String name )
	throws ClassNotFoundException
	{
		Class clazz = ClassLoadingHelper.loadClass ( name );

		Object bean = null;
		try {
			bean = clazz.newInstance();
		}
		catch ( Exception e ) {
			throw new RuntimeException ( e.getMessage() );
		}
		inspector = new BeanInspector ( bean );

	}

	public String[] getPropertyNames()
	throws PropertyException
	{
		Collection names = new ArrayList();
		String[] template = new String[0];
		//do nothing if not inited
		if ( inspector == null ) return template;

		Property[] props = filterProperties ( inspector.getProperties() );
		for ( int i = 0 ; i < props.length ; i++ ) {
			names.add( props[i].getName() );
		}
		return ( String[] ) names.toArray ( template );
	}

	public Object getPropertyValue ( String propertyName )
	throws PropertyException
	{
		Object ret = null;

		if ( parsedProperties.containsKey ( propertyName ) ) {
			//last parse has priority over what we set before,
			//otherwise we can never set read-only properties
			//in the HTML client (who gets the values this way)
			ret = parsedProperties.get ( propertyName );
		}
		else if ( inspector != null ) {
			Property p = inspector.getProperty ( propertyName );
			try {

				ret = p.getValue();
			}
			catch ( PropertyException readOnly ) {
				//ignore: return null
			}
		}
		return ret;
	}

	/**
	 * Include the description of the properties in the
	 * given response. This should be in an HTML form.
	 * @param response
	 *
	 */

	public void showPropertiesInForm ( HttpServletResponse response )
	{
		if ( inspector == null ) return;
        try
        {
            PrintWriter out = response.getWriter();
            Property[] props = filterProperties ( inspector.getProperties() );
            out.println ( "");
            for ( int i = 0 ; i < props.length ; i++ )
            {
            	out.println ( "");

            	String name = props[i].getName();
            	out.println ( "");
            	out.println ( "");
            	out.println ( "");
            }
            out.println ( "
" + name + "" ); Class clazz = PrimitiveClasses.getWrapperClass ( props[i].getType() ); if ( props[i].getAllowedValues() != null ) { out.println ( ""); //select list } else if ( Boolean.class.equals ( clazz ) ) { //check box out.println ( ""); } else { out.print ( ""); } out.println ( "
"); } catch (Exception e) { e.printStackTrace(); //throw new ServletException ( e ); //IGNORE OR CLIENT JSPs WILL FAIL! } } /** * Parse the name, value pairs from the given * request. This request should be the POST of * a form generated by showProperties. * @param request */ public void parseProperties ( HttpServletRequest request ) throws ServletException, ReadOnlyException { if ( inspector == null ) return; Enumeration pars = request.getParameterNames(); parsedProperties = new HashMap(); while ( pars.hasMoreElements() ) { boolean bool = false; //true if boolean property String name = ( String ) pars.nextElement(); if ( name.startsWith ( PAR_NAME_PREFIX ) ) { String propertyName = name.substring ( PAR_NAME_PREFIX.length() ); try { if ( propertyName.startsWith( BOOLEAN_PREFIX ) ) { bool = true; propertyName = propertyName.substring ( BOOLEAN_PREFIX.length() ); } //Property p = inspector.getProperty ( propertyName ); if ( request.getParameter ( name ) != null && !request.getParameter( name ).equals ("") ) { if ( ! bool ) { setProperty ( propertyName, request.getParameter ( name )); parsedProperties.put ( propertyName, request.getParameter ( name ) ); } else { //boolean, so set to true since the value is not null -> checked in form setProperty ( propertyName, "true" ); parsedProperties.put ( propertyName, new Boolean ( true ) ); } } else if ( bool ) { //null parameter value means unchecked -> set false setProperty ( propertyName, "false" ); parsedProperties.put ( propertyName, new Boolean ( false ) ); } } catch (Exception e1) { //ingore: if class name has changed (due to edits) the //this can happen. DONT crash the UI for this e1.printStackTrace(); } } } } public void setProperty ( String name , String value ) throws ReadOnlyException, PropertyException { if ( inspector == null ) throw new IllegalStateException ( "Not initialized"); Property p = inspector.getProperty ( name ); p.getEditor().setStringValue ( value ); p.setValue(p.getEditor().getEditedObject()); } // // public void setProperty(String property, String value) // throws PropertyException // { // Property p = inspector.getProperty ( property ); // p.getEditor().setStringValue(value); // // } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy