package org.gcube.informationsystem.resourceregistry.publisher.proxy; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URI; import java.net.URL; import java.util.List; import java.util.Map; import java.util.Random; import org.gcube.common.authorization.client.Constants; import org.gcube.common.authorization.library.AuthorizationEntry; import org.gcube.common.authorization.library.provider.SecurityTokenProvider; import org.gcube.common.resources.gcore.GCoreEndpoint; import org.gcube.common.resources.gcore.GCoreEndpoint.Profile.Endpoint; import org.gcube.common.scope.api.ScopeProvider; import org.gcube.informationsystem.impl.utils.Entities; import org.gcube.informationsystem.model.embedded.Embedded; import org.gcube.informationsystem.model.entity.Facet; import org.gcube.informationsystem.model.entity.Resource; import org.gcube.informationsystem.model.relation.ConsistsOf; import org.gcube.informationsystem.model.relation.IsRelatedTo; import org.gcube.informationsystem.resourceregistry.api.rest.EntityPath; import org.gcube.resources.discovery.client.api.DiscoveryClient; import org.gcube.resources.discovery.client.queries.api.SimpleQuery; import org.gcube.resources.discovery.icclient.ICFactory; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class ResourceRegistryPublisherImpl implements ResourceRegistryPublisher { private static final Logger logger = LoggerFactory.getLogger(ResourceRegistryPublisher.class); private static final Random random; protected final List endpoints; static { random = new Random(); } protected static List getServiceEndpoint(){ SimpleQuery query = ICFactory.queryFor(GCoreEndpoint.class); query.addCondition(String.format("$resource/Profile/ServiceClass/text() eq '%s'", org.gcube.informationsystem.resourceregistry.Constants.SERVICE_CLASS)); query.addCondition(String.format("$resource/Profile/ServiceName/text() eq '%s'", org.gcube.informationsystem.resourceregistry.Constants.SERVICE_NAME)); query.setResult("$resource"); DiscoveryClient client = ICFactory.clientFor(GCoreEndpoint.class); return client.submit(query); } protected ResourceRegistryPublisherImpl(){ this.endpoints = getServiceEndpoint(); }; private static int randInt(int min, int max) { int randomNum = random.nextInt((max - min) + 1) + min; return randomNum; } protected URL getBaseURL() throws MalformedURLException { GCoreEndpoint gCoreEndpoint = endpoints.get(randInt(0, endpoints.size()-1)); Endpoint endpoint = gCoreEndpoint.profile().endpointMap().get(org.gcube.informationsystem.resourceregistry.Constants.SERVICE_ENTRY_NAME); return endpoint.uri().toURL(); } protected AuthorizationEntry getAuthorizationEntry() { try{ AuthorizationEntry info = Constants.authorizationService().get(SecurityTokenProvider.instance.get()); logger.info("Context is {} ",info.getContext()); return info; }catch(Exception e){ String error = "Error retreiving security token"; logger.warn(error,e); throw new RuntimeException(error,e); } } private HttpURLConnection makeRequest(URL url, String method) throws Exception{ HttpURLConnection connection = (HttpURLConnection) url.openConnection(); if (SecurityTokenProvider.instance.get()==null) { if(ScopeProvider.instance.get()==null){ throw new RuntimeException("Null Token and Scope. Please set your token first."); } connection.setRequestProperty("gcube-scope", ScopeProvider.instance.get()); }else{ connection.setRequestProperty(Constants.TOKEN_HEADER_ENTRY, SecurityTokenProvider.instance.get()); } connection.setRequestMethod(method); connection.setDoOutput(true); return connection; } protected HttpURLConnection getHttpURLConnection(String path, String method, Map paramenter) throws Exception { URL url = new URL(getBaseURL(), path); HttpURLConnection connection = makeRequest(url, method); return connection; } @Override public E createEmbedded(E embedded) { return null; } @Override public E updateEmbedded(E embedded) { // TODO Auto-generated method stub return null; } @Override public E deleteEmbedded(E embedded) { // TODO Auto-generated method stub return null; } @Override public F createFacet(F facet) { String marshalledFacet = Entities.marshal(facet); String path = EntityPath.ENTITY_PATH_PART + "/" + EntityPath.FACET_PATH_PART + "/" + facet.NAME + "?" + EntityPath.DEFINITION_PARAM + "=" + marshalledFacet; HttpURLConnection connection = getHttpURLConnection(path,); // TODO Auto-generated method stub return null; } @Override public F updateFacet(F facet) { // TODO Auto-generated method stub return null; } @Override public F deleteFacet(F facet) { // TODO Auto-generated method stub return null; } @Override public R createResource(R resource) { // TODO Auto-generated method stub return null; } @Override public R deleteResource(R resource) { // TODO Auto-generated method stub return null; } @Override public > C createConsistsOf( C consistsOf) { // TODO Auto-generated method stub return null; } @Override public > C updateConsistsOf( C consistsOf) { // TODO Auto-generated method stub return null; } @Override public > C deleteConsistsOf( C consistsOf) { // TODO Auto-generated method stub return null; } @Override public > I create(I isRelatedTo) { // TODO Auto-generated method stub return null; } @Override public > I update(I isRelatedTo) { // TODO Auto-generated method stub return null; } @Override public > I delete(I isRelatedTo) { // TODO Auto-generated method stub return null; } }