Using ContextCache to get context representation

This commit is contained in:
Luca Frosini 2020-11-04 16:23:06 +01:00
parent 3ea46fbac1
commit d651f8251e
2 changed files with 66 additions and 33 deletions

View File

@ -6,6 +6,7 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Random; import java.util.Random;
import org.gcube.common.authorization.library.AuthorizationEntry;
import org.gcube.common.authorization.library.provider.SecurityTokenProvider; import org.gcube.common.authorization.library.provider.SecurityTokenProvider;
import org.gcube.common.resources.gcore.GCoreEndpoint; import org.gcube.common.resources.gcore.GCoreEndpoint;
import org.gcube.common.resources.gcore.ServiceEndpoint; import org.gcube.common.resources.gcore.ServiceEndpoint;
@ -25,6 +26,7 @@ public class ResourceRegistryClientFactory {
protected static Map<String, ResourceRegistryClient> clients; protected static Map<String, ResourceRegistryClient> clients;
protected static List<String> addresses;
protected static boolean hierarchicalMode; protected static boolean hierarchicalMode;
public static boolean isHierarchicalMode() { public static boolean isHierarchicalMode() {
@ -46,8 +48,6 @@ public class ResourceRegistryClientFactory {
hierarchicalMode = false; hierarchicalMode = false;
} }
private static String classFormat = "$resource/Profile/ServiceClass/text() eq '%1s'"; private static String classFormat = "$resource/Profile/ServiceClass/text() eq '%1s'";
private static String nameFormat = "$resource/Profile/ServiceName/text() eq '%1s'"; private static String nameFormat = "$resource/Profile/ServiceName/text() eq '%1s'";
private static String statusFormat = "$resource/Profile/DeploymentData/Status/text() eq 'ready'"; private static String statusFormat = "$resource/Profile/DeploymentData/Status/text() eq 'ready'";
@ -58,7 +58,16 @@ public class ResourceRegistryClientFactory {
private static String serviceEndpointNameFormat = "$resource/Profile/Name/text() eq '%1s'"; private static String serviceEndpointNameFormat = "$resource/Profile/Name/text() eq '%1s'";
private static String serviceEndpointstatusFormat = "$resource/Profile/RunTime/Status/text() eq 'READY'"; private static String serviceEndpointstatusFormat = "$resource/Profile/RunTime/Status/text() eq 'READY'";
public static String getCurrentContextFullName() {
String token = SecurityTokenProvider.instance.get();
AuthorizationEntry authorizationEntry = null;
try {
authorizationEntry = org.gcube.common.authorization.client.Constants.authorizationService().get(token);
} catch(Exception e) {
return ScopeProvider.instance.get();
}
return authorizationEntry.getContext();
}
private static SimpleQuery queryForService(){ private static SimpleQuery queryForService(){
return ICFactory.queryFor(GCoreEndpoint.class) return ICFactory.queryFor(GCoreEndpoint.class)
@ -100,41 +109,29 @@ public class ResourceRegistryClientFactory {
} }
public static ResourceRegistryClient create() { public static ResourceRegistryClient create() {
String address = null;
if(FORCED_URL!=null){ if(FORCED_URL!=null){
return new ResourceRegistryClientImpl(FORCED_URL); address = FORCED_URL;
}
String key = null;
if (SecurityTokenProvider.instance.get() == null) {
if (ScopeProvider.instance.get() == null) {
throw new RuntimeException(
"Null Token and Scope. Please set your token first.");
}
key = ScopeProvider.instance.get();
}else { }else {
key = SecurityTokenProvider.instance.get();
if(addresses==null) {
addresses = getAddresses();
} }
ResourceRegistryClient client = clients.get(key);
if(client==null){
List<String> addresses = getAddresses();
if(addresses==null || addresses.isEmpty()){ if(addresses==null || addresses.isEmpty()){
String error = String.format("No %s:%s found in the current context", Constants.SERVICE_CLASS, Constants.SERVICE_NAME); String error = String.format("No %s:%s found in the current context %s", Constants.SERVICE_CLASS, Constants.SERVICE_NAME, getCurrentContextFullName());
throw new RuntimeException(error); throw new RuntimeException(error);
} }
Random random = new Random(); Random random = new Random();
int index = random.nextInt(addresses.size()); int index = random.nextInt(addresses.size());
address = addresses.get(index);
client = new ResourceRegistryClientImpl(addresses.get(index));
} }
return client; return new ResourceRegistryClientImpl(address);
} }
} }

View File

@ -18,6 +18,8 @@ import org.gcube.informationsystem.model.reference.entities.Resource;
import org.gcube.informationsystem.model.reference.relations.ConsistsOf; import org.gcube.informationsystem.model.reference.relations.ConsistsOf;
import org.gcube.informationsystem.model.reference.relations.IsRelatedTo; import org.gcube.informationsystem.model.reference.relations.IsRelatedTo;
import org.gcube.informationsystem.model.reference.relations.Relation; import org.gcube.informationsystem.model.reference.relations.Relation;
import org.gcube.informationsystem.resourceregistry.api.contexts.ContextCache;
import org.gcube.informationsystem.resourceregistry.api.contexts.ContextCacheRenewal;
import org.gcube.informationsystem.resourceregistry.api.exceptions.AvailableInAnotherContextException; import org.gcube.informationsystem.resourceregistry.api.exceptions.AvailableInAnotherContextException;
import org.gcube.informationsystem.resourceregistry.api.exceptions.NotFoundException; import org.gcube.informationsystem.resourceregistry.api.exceptions.NotFoundException;
import org.gcube.informationsystem.resourceregistry.api.exceptions.ResourceRegistryException; import org.gcube.informationsystem.resourceregistry.api.exceptions.ResourceRegistryException;
@ -60,8 +62,7 @@ public class ResourceRegistryClientImpl implements ResourceRegistryClient {
gxHTTPStringRequest.queryParams(queryParams); gxHTTPStringRequest.queryParams(queryParams);
} }
@Override public List<Context> getAllContextFromServer() throws ResourceRegistryException {
public List<Context> getAllContext() throws ContextNotFoundException, ResourceRegistryException {
try { try {
logger.info("Going to read all {}s", Context.NAME); logger.info("Going to read all {}s", Context.NAME);
GXHTTPStringRequest gxHTTPStringRequest = GXHTTPStringRequest.newRequest(address); GXHTTPStringRequest gxHTTPStringRequest = GXHTTPStringRequest.newRequest(address);
@ -75,6 +76,7 @@ public class ResourceRegistryClientImpl implements ResourceRegistryClient {
logger.debug("Got Contexts are {}", ret); logger.debug("Got Contexts are {}", ret);
return ElementMapper.unmarshalList(Context.class, ret); return ElementMapper.unmarshalList(Context.class, ret);
} catch(ResourceRegistryException e) { } catch(ResourceRegistryException e) {
// logger.trace("Error while getting {} schema for {}", polymorphic ? // logger.trace("Error while getting {} schema for {}", polymorphic ?
// AccessPath.POLYMORPHIC_PARAM + " " : "", // AccessPath.POLYMORPHIC_PARAM + " " : "",
@ -88,8 +90,25 @@ public class ResourceRegistryClientImpl implements ResourceRegistryClient {
} }
} }
protected Context getContext(String id) throws ContextNotFoundException, ResourceRegistryException { @Override
public List<Context> getAllContext() throws ResourceRegistryException {
ContextCacheRenewal contextCacheRenewal = new ContextCacheRenewal() {
@Override
public List<Context> renew() throws ResourceRegistryException {
return getAllContextFromServer();
}
};
ContextCache contextCache = ContextCache.getInstance();
contextCache.setContextCacheRenewal(contextCacheRenewal);
return contextCache.getContexts();
}
protected Context getContextFromServer(String id) throws ContextNotFoundException, ResourceRegistryException {
try { try {
// TODO use cache
logger.info("Going to get current {} ", Context.NAME); logger.info("Going to get current {} ", Context.NAME);
GXHTTPStringRequest gxHTTPStringRequest = GXHTTPStringRequest.newRequest(address); GXHTTPStringRequest gxHTTPStringRequest = GXHTTPStringRequest.newRequest(address);
gxHTTPStringRequest.from(ResourceRegistryClient.class.getSimpleName()); gxHTTPStringRequest.from(ResourceRegistryClient.class.getSimpleName());
@ -118,12 +137,29 @@ public class ResourceRegistryClientImpl implements ResourceRegistryClient {
@Override @Override
public Context getContext(UUID uuid) throws ContextNotFoundException, ResourceRegistryException { public Context getContext(UUID uuid) throws ContextNotFoundException, ResourceRegistryException {
return getContext(uuid.toString()); return ContextCache.getInstance().getContextByUUID(uuid);
} }
@Override @Override
public Context getCurrentContext() throws ContextNotFoundException, ResourceRegistryException { public Context getCurrentContext() throws ContextNotFoundException, ResourceRegistryException {
return getContext(AccessPath.CURRENT_CONTEXT); String contextFullName = ResourceRegistryClientFactory.getCurrentContextFullName();
ContextCache contextCache = ContextCache.getInstance();
UUID uuid = contextCache.getUUIDByFullName(contextFullName);
Context context = null;
if(uuid == null) {
context = getContextFromServer(AccessPath.CURRENT_CONTEXT);
contextCache.cleanCache();
contextCache.refreshContextsIfNeeded();
Context c = contextCache.getContextByUUID(context.getHeader().getUUID());
if(c!=null){
context = c;
}else {
logger.error("Current Context is {}. It is possibile to get it from the server but not from the cache. This is very strange and should not occur.", contextFullName);
}
}else {
context = contextCache.getContextByUUID(uuid);
}
return context;
} }
@Override @Override