sdi-service/src/main/java/org/gcube/spatial/data/sdi/engine/impl/cluster/GeoServiceController.java

100 lines
3.4 KiB
Java

package org.gcube.spatial.data.sdi.engine.impl.cluster;
import java.util.Map;
import org.gcube.common.resources.gcore.ServiceEndpoint;
import org.gcube.common.resources.gcore.ServiceEndpoint.AccessPoint;
import org.gcube.common.resources.gcore.ServiceEndpoint.Profile;
import org.gcube.common.resources.gcore.ServiceEndpoint.Property;
import org.gcube.common.resources.gcore.common.Platform;
import org.gcube.spatial.data.sdi.engine.impl.faults.InvalidServiceEndpointException;
import org.gcube.spatial.data.sdi.engine.impl.faults.OutdatedServiceEndpointException;
import org.gcube.spatial.data.sdi.engine.impl.faults.ServiceInteractionException;
import org.gcube.spatial.data.sdi.engine.impl.is.CachedObject;
import org.gcube.spatial.data.sdi.engine.impl.is.ISUtils;
import org.gcube.spatial.data.sdi.model.credentials.AccessType;
import org.gcube.spatial.data.sdi.model.credentials.Credentials;
import org.gcube.spatial.data.sdi.model.service.GeoServiceDescriptor;
import org.gcube.spatial.data.sdi.model.service.Version;
import lombok.extern.slf4j.Slf4j;
@Slf4j
public abstract class GeoServiceController<T extends GeoServiceDescriptor> {
protected ServiceEndpoint serviceEndpoint;
protected AccessPoint accessPoint;
protected Map<String,Property> propertyMap;
protected String baseURL;
protected Credentials adminAccount;
protected Version version;
protected CachedObject<T> cachedDescriptor=null;
public synchronized T getDescriptor() {
if(cachedDescriptor==null||cachedDescriptor.isValid(500)) {
cachedDescriptor=new CachedObject<T>(getLiveDescriptor());
}
return cachedDescriptor.getTheObject();
}
protected abstract T getLiveDescriptor();
protected abstract AccessPoint getTheRightAccessPoint(ServiceEndpoint endpoint);
public GeoServiceController(ServiceEndpoint serviceEndpoint) throws InvalidServiceEndpointException{
super();
log.debug("Instantiating controller for SE {} ",serviceEndpoint);
setServiceEndpoint(serviceEndpoint);
}
public void onUpdateServiceEndpoint() {
setServiceEndpoint(ISUtils.updateAndWait(serviceEndpoint));
cachedDescriptor.invalidate();
}
protected void setServiceEndpoint(ServiceEndpoint toSet) {
this.serviceEndpoint = toSet;
Profile profile=serviceEndpoint.profile();
accessPoint=getTheRightAccessPoint(serviceEndpoint);
if(accessPoint!=null) {
propertyMap=this.accessPoint.propertyMap();
baseURL=accessPoint.address();
adminAccount=new Credentials(accessPoint.username(),ISUtils.decryptString(accessPoint.password()),AccessType.ADMIN);
}
Platform platform=profile.platform();
version=new Version(platform.version(),platform.minorVersion(),platform.revisionVersion());
}
protected abstract void initServiceEndpoint() throws OutdatedServiceEndpointException, ServiceInteractionException;
public void configure() throws ServiceInteractionException {
try {
initServiceEndpoint();
}catch(OutdatedServiceEndpointException e) {
onUpdateServiceEndpoint();
}
}
protected String getSEProperty(String property, boolean mandatory) throws InvalidServiceEndpointException{
if(!propertyMap.containsKey(property))
if(mandatory)throw new InvalidServiceEndpointException("Expected property "+property+" was not found.");
else return null;
else {
Property prop=propertyMap.get(property);
if(prop.isEncrypted()) return ISUtils.decryptString(prop.value());
else return prop.value();
}
}
public ServiceEndpoint getServiceEndpoint() {
return serviceEndpoint;
}
}