/*
* JBoss, Home of Professional Open Source.
* Copyright 2008, Red Hat Middleware LLC, and individual contributors
* as indicated by the @author tags. See the copyright.txt file in the
* distribution for a full listing of individual contributors.
*
* This 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 software 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 software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.jboss.test.xml.mbeanserver;
import java.util.Properties;
import javax.xml.namespace.QName;
import javax.xml.namespace.NamespaceContext;
import org.jboss.xb.binding.sunday.unmarshalling.SchemaBindingInitializer;
import org.jboss.xb.binding.sunday.unmarshalling.SchemaBinding;
import org.jboss.xb.binding.sunday.unmarshalling.TypeBinding;
import org.jboss.xb.binding.sunday.unmarshalling.DefaultElementHandler;
import org.jboss.xb.binding.sunday.unmarshalling.ElementBinding;
import org.jboss.xb.binding.sunday.unmarshalling.ParticleBinding;
import org.jboss.xb.binding.sunday.unmarshalling.impl.runtime.RtElementHandler;
import org.jboss.util.propertyeditor.PropertyEditors;
import org.xml.sax.Attributes;
/**
* JavaBeanSchemaInitializer.
*
* @author <a href="adrian@jboss.com">Adrian Brock</a>
* @author Scott.Stark@jboss.org
* @version $Revision: 81036 $
*/
public class JavaBeanSchemaInitializer implements SchemaBindingInitializer
{
/** The namespace */
private static final String JAVABEAN_NS = "urn:jboss:simplejavabean:1.0";
/** The javabean binding */
private static final QName javabeanTypeQName = new QName(JavaBeanSchemaInitializer.JAVABEAN_NS, "javabeanType");
static
{
PropertyEditors.init();
}
public SchemaBinding init(SchemaBinding schema)
{
// javabean binding
TypeBinding beanType = schema.getType(JavaBeanSchemaInitializer.javabeanTypeQName);
/*
beanType.setHandler(new DefaultElementHandler()
{
public Object startElement(Object parent, QName name, ElementBinding element)
{
return new Holder();
}
public void attributes(Object o, QName elementName, ElementBinding element, Attributes attrs, NamespaceContext nsCtx)
{
Holder holder = (Holder) o;
String className = null;
Properties properties = holder.getProperties();
for (int i = 0; i < attrs.getLength(); ++i)
{
String localName = attrs.getLocalName(i);
String value = attrs.getValue(i);
if ("class".equals(localName))
{
className = value;
holder.setType(className);
continue;
}
properties.put(localName, value);
}
if (className == null)
throw new IllegalArgumentException("No class attribute for " + elementName);
}
public Object endElement(Object o, QName qName, ElementBinding element)
{
Holder holder = (Holder) o;
Object bean;
try
{
bean = holder.getBean();
Properties props = holder.getProperties();
System.out.println("Converting properties: "+props);
PropertyEditors.mapJavaBeanProperties(bean, props, true);
}
catch (Exception e)
{
throw new IllegalStateException("Failed to init bean: "+qName+"::"+ e.getMessage());
}
return bean;
}
});
*/
beanType.setHandler(new RtElementHandler()
{
public Object startParticle(Object parent,
QName elementName,
ParticleBinding particle,
Attributes attrs,
NamespaceContext nsCtx)
{
Holder o = new Holder();
attributes(o, elementName, (ElementBinding)particle.getTerm(), attrs, nsCtx);
return o;
}
public void attributes(Object o, QName elementName, ElementBinding element, Attributes attrs, NamespaceContext nsCtx)
{
Holder holder = (Holder) o;
String className = null;
Properties properties = holder.getProperties();
for (int i = 0; i < attrs.getLength(); ++i)
{
String localName = attrs.getLocalName(i);
String value = attrs.getValue(i);
if ("class".equals(localName))
{
className = value;
holder.setType(className);
continue;
}
properties.put(localName, value);
}
if (className == null)
throw new IllegalArgumentException("No class attribute for " + elementName);
}
public Object endParticle(Object o, QName qName, ParticleBinding particle)
{
Holder holder = (Holder) o;
Object bean;
try
{
bean = holder.getBean();
Properties props = holder.getProperties();
//System.out.println("Converting properties: "+props);
PropertyEditors.mapJavaBeanProperties(bean, props, true);
}
catch (Exception e)
{
throw new IllegalStateException("Failed to init bean: "+qName+"::"+ e.getMessage());
}
return bean;
}
});
return schema;
}
public static class Holder
{
private String clazz;
private Object bean;
private Properties properties = new Properties();
public Holder()
{
}
public Object getBean() throws Exception
{
if( bean == null )
{
ClassLoader loader = Thread.currentThread().getContextClassLoader();
Class c = loader.loadClass(clazz);
bean = c.newInstance();
}
return bean;
}
public Properties getProperties()
{
return properties;
}
public String getType()
{
return clazz;
}
public void setType(String clazz)
{
this.clazz = clazz;
}
}
public static class Property
{
private String name;
private String value;
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
public String getValue()
{
return value;
}
public void setValue(String value)
{
this.value = value;
}
}
}