/*
* Copyright 2001-2008 Geert Bevin <gbevin[remove] at uwyn dot com>
* Licensed under the Apache License, Version 2.0 (the "License")
* $Id: WebservicesHessianDeployer.java 3933 2008-04-25 20:41:45Z gbevin $
*/
package com.uwyn.rife.engine.elements;
import com.caucho.hessian.io.SerializerFactory;
import com.caucho.hessian.server.HessianSkeleton;
import com.caucho.services.server.GenericService;
import com.caucho.services.server.Service;
import com.uwyn.rife.engine.ElementDeployer;
import com.uwyn.rife.engine.exceptions.EngineException;
import com.uwyn.rife.engine.exceptions.PropertyRequiredException;
import com.uwyn.rife.tools.IteratorEnumeration;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import java.util.Enumeration;
public class WebservicesHessianDeployer extends ElementDeployer
{
private Class mHomeAPI;
private Object mHomeImpl;
private Class mObjectAPI;
private Object mObjectImpl;
private HessianSkeleton mHomeSkeleton;
private HessianSkeleton mObjectSkeleton;
private SerializerFactory mSerializerFactory;
/**
* Initialize the service, including the service object.
*/
public void deploy()
throws EngineException
{
try
{
if (mHomeImpl != null)
{
}
else
{
if (getElementInfo().containsProperty("home-class"))
{
String className = getElementInfo().getPropertyString("home-class");
Class homeClass = loadClass(className);
mHomeImpl = homeClass.newInstance();
init(mHomeImpl);
}
else
{
if (getElementInfo().containsProperty("service-class"))
{
String className = getElementInfo().getPropertyString("service-class");
Class homeClass = loadClass(className);
mHomeImpl = homeClass.newInstance();
init(mHomeImpl);
}
else
{
if (!getElementInfo().containsProperty("service-class"))
{
throw new PropertyRequiredException(getElementInfo().getDeclarationName(), "service-class");
}
}
}
}
if (mHomeAPI != null)
{
}
else
{
if (getElementInfo().containsProperty("home-api"))
{
String className = getElementInfo().getPropertyString("home-api");
mHomeAPI = loadClass(className);
}
else
{
if (getElementInfo().containsProperty("api-class"))
{
String className = getElementInfo().getPropertyString("api-class");
mHomeAPI = loadClass(className);
}
else
{
if (mHomeImpl != null)
{
mHomeAPI = findRemoteAPI(mHomeImpl.getClass());
if (mHomeAPI == null)
{
mHomeAPI = mHomeImpl.getClass();
}
}
}
}
}
if (mObjectImpl != null)
{
}
else
{
if (getElementInfo().containsProperty("object-class"))
{
String className = getElementInfo().getPropertyString("object-class");
Class objectClass = loadClass(className);
mObjectImpl = objectClass.newInstance();
init(mObjectImpl);
}
}
if (mObjectAPI != null)
{
}
else
{
if (getElementInfo().containsProperty("object-api"))
{
String className = getElementInfo().getPropertyString("object-api");
mObjectAPI = loadClass(className);
}
else
{
if (mObjectImpl != null)
{
mObjectAPI = mObjectImpl.getClass();
}
}
}
mHomeSkeleton = new HessianSkeleton(mHomeImpl, mHomeAPI);
if (mObjectAPI != null)
{
mHomeSkeleton.setObjectClass(mObjectAPI);
}
if (mObjectImpl != null)
{
mObjectSkeleton = new HessianSkeleton(mObjectImpl, mObjectAPI);
mObjectSkeleton.setHomeClass(mHomeAPI);
}
else
{
mObjectSkeleton = mHomeSkeleton;
}
if ("false".equals(getElementInfo().getPropertyString("send-collection-type", "false")))
{
setSendCollectionType(false);
}
}
catch (Exception e)
{
throw new EngineException(e);
}
}
private Class findRemoteAPI(Class implClass)
{
if (implClass == null || implClass.equals(GenericService.class))
{
return null;
}
Class[] interfaces = implClass.getInterfaces();
if (interfaces.length == 1)
{
return interfaces[0];
}
return findRemoteAPI(implClass.getSuperclass());
}
private Class loadClass(String className)
throws ClassNotFoundException
{
ClassLoader loader = Thread.currentThread().getContextClassLoader();
if (loader != null)
{
return Class.forName(className, false, loader);
}
else
{
return Class.forName(className);
}
}
private void init(Object service)
throws ServletException
{
if (service instanceof Service)
{
((Service)service).init(new ServletConfig() {
public String getServletName()
{
return getElementInfo().getDeclarationName();
}
public ServletContext getServletContext()
{
return null;
}
public String getInitParameter(String key)
{
return getElementInfo().getPropertyString(key);
}
public Enumeration getInitParameterNames()
{
return new IteratorEnumeration(getElementInfo().getPropertyNames().iterator());
}
});
}
}
/**
* Gets the home skeleton.
*/
public HessianSkeleton getHomeSkeleton()
{
return mHomeSkeleton;
}
/**
* Gets the object skeleton.
*/
public HessianSkeleton getObjectSkeleton()
{
return mObjectSkeleton;
}
/**
* Sets the home api.
*/
public void setHomeAPI(Class api)
{
mHomeAPI = api;
}
/**
* Sets the home implementation
*/
public void setHome(Object home)
{
mHomeImpl = home;
}
/**
* Gets the home implementation
*/
Object getHome()
{
return mHomeImpl;
}
/**
* Sets the object api.
*/
public void setObjectAPI(Class api)
{
mObjectAPI = api;
}
/**
* Sets the object implementation
*/
public void setObject(Object object)
{
mObjectImpl = object;
}
/**
* Gets the object implementation
*/
Object getObject()
{
return mObjectImpl;
}
/**
* Sets the service class.
*/
public void setService(Object service)
{
setHome(service);
}
/**
* Sets the api-class.
*/
public void setAPIClass(Class api)
{
setHomeAPI(api);
}
/**
* Gets the api-class.
*/
public Class getAPIClass()
{
return mHomeAPI;
}
/**
* Sets the serializer factory.
*/
public void setSerializerFactory(SerializerFactory factory)
{
mSerializerFactory = factory;
}
/**
* Gets the serializer factory.
*/
public SerializerFactory getSerializerFactory()
{
if (mSerializerFactory == null)
{
mSerializerFactory = new SerializerFactory();
}
return mSerializerFactory;
}
/**
* Sets the serializer send collection java type.
*/
public void setSendCollectionType(boolean sendType)
{
getSerializerFactory().setSendCollectionType(sendType);
}
}