2016-09-30 18:36:48 +02:00
|
|
|
package org.gcube.smartgears;
|
|
|
|
|
2017-02-22 11:59:34 +01:00
|
|
|
import java.util.Collections;
|
2016-09-30 18:36:48 +02:00
|
|
|
import java.util.HashMap;
|
|
|
|
import java.util.Map;
|
|
|
|
import java.util.concurrent.Future;
|
|
|
|
|
|
|
|
import org.gcube.smartgears.annotations.ManagedBy;
|
2022-02-07 09:43:30 +01:00
|
|
|
import org.gcube.smartgears.application.manager.AppManagerObserver;
|
|
|
|
import org.gcube.smartgears.application.manager.OfflineProvider;
|
|
|
|
import org.gcube.smartgears.application.manager.OnlineProvider;
|
|
|
|
import org.gcube.smartgears.configuration.Mode;
|
|
|
|
import org.gcube.smartgears.context.application.ApplicationContext;
|
2016-09-30 18:36:48 +02:00
|
|
|
import org.slf4j.Logger;
|
|
|
|
import org.slf4j.LoggerFactory;
|
|
|
|
|
2022-02-07 09:43:30 +01:00
|
|
|
import javassist.util.proxy.MethodHandler;
|
|
|
|
import javassist.util.proxy.ProxyFactory;
|
|
|
|
import javassist.util.proxy.ProxyObject;
|
|
|
|
|
|
|
|
public abstract class ApplicationManagerProvider {
|
2016-09-30 18:36:48 +02:00
|
|
|
|
|
|
|
private static Logger logger = LoggerFactory.getLogger(ApplicationManagerProvider.class);
|
|
|
|
|
2022-02-07 09:43:30 +01:00
|
|
|
private Map<String, Class<?>> proxyClassMap = Collections.synchronizedMap(new HashMap<String, Class<?>>());
|
2017-02-22 11:59:34 +01:00
|
|
|
|
2022-02-07 09:43:30 +01:00
|
|
|
private Map<String, Object> classProxyObjetMap = Collections.synchronizedMap(new HashMap<String, Object>());
|
2016-09-30 18:36:48 +02:00
|
|
|
|
2022-02-07 09:43:30 +01:00
|
|
|
protected static ApplicationManagerProvider instance;
|
|
|
|
|
|
|
|
private static boolean initialized = false;
|
|
|
|
|
|
|
|
protected static synchronized void init(ApplicationContext appcontext) {
|
|
|
|
if (!initialized) {
|
|
|
|
if (appcontext.container().configuration().mode()== Mode.offline)
|
|
|
|
instance = new OfflineProvider();
|
|
|
|
else
|
|
|
|
instance = new OnlineProvider();
|
|
|
|
}
|
2016-09-30 18:36:48 +02:00
|
|
|
|
2022-02-07 09:43:30 +01:00
|
|
|
}
|
|
|
|
|
2016-09-30 18:36:48 +02:00
|
|
|
public static synchronized ApplicationManager get(final Class<? extends ApplicationManager> applicationManagerClass){
|
2022-02-07 09:43:30 +01:00
|
|
|
if (!initialized) throw new RuntimeException("ApplicationManagerProvider not yet initialized");
|
|
|
|
Object obj = instance.getApplicationManagerObject(applicationManagerClass);
|
|
|
|
return applicationManagerClass.cast(obj);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private Object getApplicationManagerObject(Class<? extends ApplicationManager> applicationManagerClass) {
|
2016-09-30 18:36:48 +02:00
|
|
|
Object obj;
|
|
|
|
try {
|
|
|
|
Class<?> _class = getProxyClass(applicationManagerClass);
|
2017-02-22 11:59:34 +01:00
|
|
|
if(classProxyObjetMap.containsKey(_class.getCanonicalName())){
|
|
|
|
obj = classProxyObjetMap.get(_class.getCanonicalName());
|
|
|
|
logger.trace("getting object {} from cache ",_class.getCanonicalName());
|
2022-02-07 09:43:30 +01:00
|
|
|
return obj;
|
2017-02-22 11:59:34 +01:00
|
|
|
} else {
|
|
|
|
obj = _class.newInstance();
|
|
|
|
classProxyObjetMap.put(_class.getCanonicalName(), obj);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2016-09-30 18:36:48 +02:00
|
|
|
} catch (Exception e) {
|
|
|
|
throw new RuntimeException("error creating proxy ", e);
|
|
|
|
}
|
2022-02-07 09:43:30 +01:00
|
|
|
|
|
|
|
((ProxyObject)obj).setHandler(getMethdoHandler(applicationManagerClass));
|
|
|
|
return obj;
|
2016-09-30 18:36:48 +02:00
|
|
|
}
|
|
|
|
|
2022-02-07 09:43:30 +01:00
|
|
|
protected synchronized ApplicationManager get(){
|
|
|
|
final Class<? extends ApplicationManager> applicationManagerClass = retrieveManagerClass();
|
|
|
|
return get(applicationManagerClass);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private Class<?> getProxyClass(Class<? extends ApplicationManager> applicationManagerClass){
|
2017-02-22 11:59:34 +01:00
|
|
|
if (proxyClassMap.containsKey(applicationManagerClass.getCanonicalName())){
|
|
|
|
logger.debug("getting proxy class {} for appManager from cache ",applicationManagerClass.getCanonicalName());
|
|
|
|
return proxyClassMap.get(applicationManagerClass.getCanonicalName());
|
|
|
|
}
|
|
|
|
logger.debug("creating new proxy class for appManager "+applicationManagerClass.getCanonicalName());
|
2016-09-30 18:36:48 +02:00
|
|
|
ProxyFactory proxyfactory = new ProxyFactory();
|
|
|
|
proxyfactory.setSuperclass(applicationManagerClass);
|
|
|
|
Class<?> proxyClass=proxyfactory.createClass();
|
|
|
|
proxyClassMap.put(applicationManagerClass.getCanonicalName(), proxyClass);
|
|
|
|
return proxyClass;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
2022-02-07 09:43:30 +01:00
|
|
|
protected Class<? extends ApplicationManager> retrieveManagerClass(){
|
2016-09-30 18:36:48 +02:00
|
|
|
String classname = Thread.currentThread().getStackTrace()[3].getClassName();
|
|
|
|
logger.trace("managed servlet caller is {}",classname);
|
|
|
|
ManagedBy annotation;
|
|
|
|
try {
|
|
|
|
annotation = Class.forName(classname).getAnnotation(ManagedBy.class);
|
|
|
|
} catch (ClassNotFoundException e) {
|
|
|
|
throw new RuntimeException("error initializing ApplicationManager",e);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (annotation == null){
|
|
|
|
logger.error(" {} is not managed by an ApplicationManager", classname);
|
|
|
|
throw new RuntimeException(classname+" is not managed by an ApplicationManager");
|
|
|
|
}
|
|
|
|
|
|
|
|
return annotation.value();
|
|
|
|
}
|
2022-02-07 09:43:30 +01:00
|
|
|
|
|
|
|
protected abstract Future<ApplicationManager> retrieveFuture(Class<? extends ApplicationManager> applicationManagerClass);
|
|
|
|
protected abstract MethodHandler getMethdoHandler(Class<? extends ApplicationManager> applicationManagerClass);
|
|
|
|
protected abstract AppManagerObserver getObserver();
|
|
|
|
|
2016-09-30 18:36:48 +02:00
|
|
|
}
|