/**
* Copyright 2008 biaoping.yin
*
* 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.frameworkset.spi.remote.hession;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.log4j.Logger;
import org.frameworkset.spi.ApplicationContext;
import org.frameworkset.spi.BaseApplicationContext;
import org.frameworkset.spi.DefaultApplicationContext;
/**
* <p> HessianHandlerFactory.java</p>
* <p> Description: </p>
* <p> bboss workgroup </p>
* <p> Copyright (c) 2009 </p>
*
* @Date 2013-2-21 下午5:26:17
* @author biaoping.yin
* @version 1.0
*/
public class HessianHandlerFactory {
private static Logger log = Logger.getLogger(HessianHandlerFactory.class);
private Map<String,HessianHanderContainer> containers ;
private Method getWebApplicationContext;
public HessianHandlerFactory() {
containers = new HashMap<String,HessianHanderContainer>();
try {
Class WebApplicationContextUtils = Class.forName("org.frameworkset.web.servlet.support.WebApplicationContextUtils");
getWebApplicationContext = WebApplicationContextUtils.getMethod("getWebApplicationContext");
} catch (ClassNotFoundException e) {
log.debug("init mvc hessian container failed:class org.frameworkset.web.servlet.support.WebApplicationContextUtils not founded .check bboss-mvc.jar in your classpath.",e);
} catch (NoSuchMethodException e) {
log.debug("init mvc hessian container failed:NoSuchMethodException getWebApplicationContext in class org.frameworkset.web.servlet.support.WebApplicationContextUtils not founded .",e);
} catch (SecurityException e) {
log.debug("init mvc hessian container with SecurityException in class org.frameworkset.web.servlet.support.WebApplicationContextUtils .",e);
}
catch (RuntimeException e) {
log.debug("init mvc hessian container with RuntimeException in class org.frameworkset.web.servlet.support.WebApplicationContextUtils .",e);
}
catch (Exception e) {
log.debug("init mvc hessian container with SecurityException in class org.frameworkset.web.servlet.support.WebApplicationContextUtils .",e);
}
catch (Throwable e) {
log.debug("init mvc hessian container with SecurityException in class org.frameworkset.web.servlet.support.WebApplicationContextUtils .",e);
}
}
private BaseApplicationContext getMVCBaseApplicationContext()
{
try {
if(getWebApplicationContext != null)
return (BaseApplicationContext)getWebApplicationContext.invoke(null, null);
} catch (SecurityException e) {
log.debug("init mvc hessian container with SecurityException in class org.frameworkset.web.servlet.support.WebApplicationContextUtils .",e);
} catch (IllegalAccessException e) {
log.debug("IllegalAccessException while Invoke getWebApplicationContext method of class org.frameworkset.web.servlet.support.WebApplicationContextUtils failed.",e);
} catch (IllegalArgumentException e) {
log.debug("IllegalArgumentException while Invoke getWebApplicationContext method of class org.frameworkset.web.servlet.support.WebApplicationContextUtils failed.",e);
} catch (InvocationTargetException e) {
log.debug("InvocationTargetException while Invoke getWebApplicationContext method of class org.frameworkset.web.servlet.support.WebApplicationContextUtils failed.",e);
}
return null;
}
protected String getServiceName(HttpServletRequest request,HttpServletResponse response)
{
String service=request.getParameter("service");
return service;
}
/**
* http://localhost/hession?container=xx.xx.xx&service=ss
* @param request
* @param response
* @return
* @throws Exception
*/
public AbstractHessionHandler getHessionHandler(HttpServletRequest request,HttpServletResponse response) throws Throwable
{
String container=request.getParameter("container");
String containtype=request.getParameter("containertype");
String service=getServiceName( request, response);
if(service == null || "".equals(service))
{
throw new HessionException("lookup hession service failed:serviceid is null");
}
HessianHanderContainer hessiancontainer = null;
if(container == null || "".equals(container))
{
container="bboss.hessian.mvc";
containtype = "mvc";
}
else
{
if(containtype == null || containtype.equals(""))
containtype = "simple";
}
if("bboss.hessian.mvc".equals(container) || "mvc".equals(containtype)){
if(getWebApplicationContext != null)
{
hessiancontainer = containers.get("bboss.hessian.mvc");
if(hessiancontainer == null)
{
synchronized(containers)
{
hessiancontainer = containers.get("bboss.hessian.mvc");
if(hessiancontainer == null)
{
BaseApplicationContext mvccontainer = getMVCBaseApplicationContext();
if(mvccontainer != null)
{
hessiancontainer = new HessianHanderContainer(mvccontainer);
containers.put("bboss.hessian.mvc",hessiancontainer);
}
}
}
}
}
}
else if("simple".equals(containtype)){
hessiancontainer = containers.get(container);
if(hessiancontainer == null)
{
synchronized(containers)
{
hessiancontainer = containers.get(container);
if(hessiancontainer == null)
{
hessiancontainer = new HessianHanderContainer(DefaultApplicationContext.getApplicationContext(container));
containers.put(container,hessiancontainer);
}
}
}
}
else {
hessiancontainer = containers.get(container);
if(hessiancontainer == null)
{
synchronized(containers)
{
hessiancontainer = containers.get(container);
if(hessiancontainer == null)
{
hessiancontainer = new HessianHanderContainer(ApplicationContext.getApplicationContext(container));
containers.put(container,hessiancontainer);
}
}
}
}
if(hessiancontainer == null )
{
throw new HessionException("lookup hession service["+service+"] failed:hessian handler container[container="+container+",containtype=" +containtype + "] is null");
}
return hessiancontainer.getHessionHandler(service);
}
}