package rocks.inspectit.ui.rcp.repository.service.cmr;
import org.springframework.remoting.httpinvoker.HttpInvokerProxyFactoryBean;
import rocks.inspectit.shared.all.serializer.provider.SerializationManagerProvider;
import rocks.inspectit.ui.rcp.repository.CmrRepositoryDefinition;
/**
* Abstract class for all {@link CmrRepositoryDefinition} service classes.
*
* @author Ivan Senic
*
*/
public class CmrService implements ICmrService {
/**
* Protocol used.
*/
private static final String PROTOCOL = "http://";
/**
* Remoting path.
*/
private static final String REMOTING = "/remoting/";
/**
* {@link CmrRepositoryDefinition}.
*/
private CmrRepositoryDefinition cmrRepositoryDefinition;
/**
* Real service where calls will be executed.
*/
private Object service;
/**
* Service interface.
*/
private Class<?> serviceInterface;
/**
* Service name.
*/
private String serviceName;
/**
* The serialization manager for kryo.
*/
private SerializationManagerProvider serializationManagerProvider;
/**
* Defines if the default value should be returned when communication errors occurs in the
* invocation of the service.
*/
private boolean defaultValueOnError;
/**
* {@inheritDoc}
*/
@Override
public void initService(CmrRepositoryDefinition cmrRepositoryDefinition) {
this.cmrRepositoryDefinition = cmrRepositoryDefinition;
HttpInvokerProxyFactoryBean httpInvokerProxyFactoryBean = new HttpInvokerProxyFactoryBean();
// we need to set the class loader on our own
// the problems is that the service interface class can not be found
// I am not quite sure why, but this is suggested on several places as a patch
httpInvokerProxyFactoryBean.setBeanClassLoader(getClass().getClassLoader());
// using kryo (de-)serialization for the requests and responses
KryoSimpleHttpInvokerRequestExecutor kryoSimpleHttpInvokerRequestExecutor = new KryoSimpleHttpInvokerRequestExecutor();
kryoSimpleHttpInvokerRequestExecutor.setBeanClassLoader(getClass().getClassLoader());
kryoSimpleHttpInvokerRequestExecutor.setSerializationManagerProvider(serializationManagerProvider);
httpInvokerProxyFactoryBean.setHttpInvokerRequestExecutor(kryoSimpleHttpInvokerRequestExecutor);
httpInvokerProxyFactoryBean.setServiceInterface(serviceInterface);
httpInvokerProxyFactoryBean.setServiceUrl(PROTOCOL + cmrRepositoryDefinition.getIp() + ":" + cmrRepositoryDefinition.getPort() + REMOTING + serviceName);
httpInvokerProxyFactoryBean.afterPropertiesSet();
service = httpInvokerProxyFactoryBean.getObject();
}
/**
* {@inheritDoc}
*/
@Override
public CmrRepositoryDefinition getCmrRepositoryDefinition() {
return cmrRepositoryDefinition;
}
/**
* {@inheritDoc}
*/
@Override
public Object getService() {
return service;
}
/**
* Sets {@link #serviceInterface}.
*
* @param serviceInterface
* New value for {@link #serviceInterface}
*/
public void setServiceInterface(Class<?> serviceInterface) {
this.serviceInterface = serviceInterface;
}
/**
* Gets {@link #serviceInterface}.
*
* @return {@link #serviceInterface}
*/
public Class<?> getServiceInterface() {
return serviceInterface;
}
/**
* Sets {@link #serviceName}.
*
* @param serviceName
* New value for {@link #serviceName}
*/
public void setServiceName(String serviceName) {
this.serviceName = serviceName;
}
/**
* Sets {@link #serializationManagerProvider}.
*
* @param serializationManagerProvider
* New value for {@link #serializationManagerProvider}
*/
public void setSerializationManagerProvider(SerializationManagerProvider serializationManagerProvider) {
this.serializationManagerProvider = serializationManagerProvider;
}
/**
* Gets {@link #defaultValueOnError}.
*
* @return {@link #defaultValueOnError}
*/
@Override
public boolean isDefaultValueOnError() {
return defaultValueOnError;
}
/**
* Sets {@link #defaultValueOnError}.
*
* @param defaultValueOnError
* New value for {@link #defaultValueOnError}
*/
public void setDefaultValueOnError(boolean defaultValueOnError) {
this.defaultValueOnError = defaultValueOnError;
}
}