2014-10-14 14:35:43 +02:00
|
|
|
/**
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
package org.gcube.portlets.user.uriresolvermanager;
|
|
|
|
|
2014-10-14 18:13:47 +02:00
|
|
|
import java.util.List;
|
2014-10-14 14:35:43 +02:00
|
|
|
import java.util.Map;
|
|
|
|
import java.util.Set;
|
2014-10-21 12:43:00 +02:00
|
|
|
import java.util.Timer;
|
|
|
|
import java.util.TimerTask;
|
2014-10-14 14:35:43 +02:00
|
|
|
|
2014-10-15 11:32:07 +02:00
|
|
|
import org.gcube.common.scope.api.ScopeProvider;
|
2014-10-14 18:13:47 +02:00
|
|
|
import org.gcube.portlets.user.uriresolvermanager.entity.ServiceParameter;
|
2014-10-14 17:04:03 +02:00
|
|
|
import org.gcube.portlets.user.uriresolvermanager.exception.IllegalArgumentException;
|
2014-10-14 17:12:55 +02:00
|
|
|
import org.gcube.portlets.user.uriresolvermanager.exception.UriResolverMapException;
|
2014-10-14 17:27:13 +02:00
|
|
|
import org.gcube.portlets.user.uriresolvermanager.readers.RuntimeResourceReader;
|
2014-10-14 17:17:24 +02:00
|
|
|
import org.gcube.portlets.user.uriresolvermanager.readers.UriResolverMapReader;
|
2014-10-15 11:32:07 +02:00
|
|
|
import org.gcube.portlets.user.uriresolvermanager.util.UrlEncoderUtil;
|
2014-10-15 11:53:16 +02:00
|
|
|
import org.gcube.portlets.user.urlshortener.UrlShortener;
|
2014-10-14 18:13:47 +02:00
|
|
|
import org.slf4j.Logger;
|
|
|
|
import org.slf4j.LoggerFactory;
|
2014-10-14 14:35:43 +02:00
|
|
|
|
|
|
|
/**
|
|
|
|
* @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it
|
|
|
|
* @Oct 14, 2014
|
|
|
|
*
|
|
|
|
*/
|
2014-10-14 17:04:03 +02:00
|
|
|
public class UriResolverManager {
|
2014-10-14 14:35:43 +02:00
|
|
|
|
|
|
|
|
2014-10-21 12:43:00 +02:00
|
|
|
/**
|
2014-10-21 12:56:24 +02:00
|
|
|
* Time to reload Runtime Resource Configuration
|
2014-10-21 12:43:00 +02:00
|
|
|
*/
|
|
|
|
public static int RESET_DELAY = 10*60*1000; //10 MINUTES
|
2014-10-21 12:56:24 +02:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Time to reload Runtime Resource Configuration
|
|
|
|
*/
|
2014-10-21 12:43:00 +02:00
|
|
|
public static int RESET_TIME = RESET_DELAY; //10 MINUTES
|
|
|
|
|
2014-10-14 17:04:03 +02:00
|
|
|
private UriResolverMapReader uriResolverMapReader;
|
2014-10-14 14:35:43 +02:00
|
|
|
private Map<String, String> applicationTypes;
|
2014-10-14 17:27:13 +02:00
|
|
|
private String scope;
|
|
|
|
private String applicationType;
|
2014-10-21 11:18:18 +02:00
|
|
|
private RuntimeResourceReader reader;
|
2014-10-15 11:53:16 +02:00
|
|
|
|
2014-10-21 12:43:00 +02:00
|
|
|
/**
|
|
|
|
* A lock to prevent reader = null;
|
|
|
|
*/
|
|
|
|
private int usingReader = 0;
|
|
|
|
|
|
|
|
public synchronized void lockReader() {
|
|
|
|
usingReader++;
|
|
|
|
}
|
|
|
|
|
|
|
|
public synchronized void releaseReader() {
|
|
|
|
usingReader--;
|
|
|
|
}
|
|
|
|
|
|
|
|
public synchronized int countReaders() {
|
|
|
|
return usingReader;
|
|
|
|
}
|
|
|
|
|
2014-10-14 18:13:47 +02:00
|
|
|
public static final Logger logger = LoggerFactory.getLogger(UriResolverManager.class);
|
2014-10-15 11:53:16 +02:00
|
|
|
|
2014-10-14 14:35:43 +02:00
|
|
|
/**
|
2014-10-15 11:32:07 +02:00
|
|
|
* Instance a UriResolverManager
|
|
|
|
* Precondition: set the scope provider {@link ScopeProvider.instance.get()}
|
|
|
|
* The scope is used to look up the generic resource {@link UriResolverMapReader#URI_RESOLVER_MAP} available in the infrastructure to map ApplicationType with its Resolver
|
2014-10-20 11:24:56 +02:00
|
|
|
* @param applicationType a key Application Type {@link UriResolverManager#getApplicationTypes()}
|
2014-10-14 17:12:55 +02:00
|
|
|
* @throws Exception
|
2014-10-14 14:35:43 +02:00
|
|
|
*/
|
2014-10-15 11:32:07 +02:00
|
|
|
public UriResolverManager(String applicationType) throws UriResolverMapException, IllegalArgumentException{
|
2014-10-14 14:35:43 +02:00
|
|
|
try {
|
|
|
|
|
2014-10-15 11:32:07 +02:00
|
|
|
this.scope = ScopeProvider.instance.get();
|
|
|
|
|
|
|
|
if(this.scope == null)
|
|
|
|
throw new UriResolverMapException("Scope is null, set scope provider!");
|
|
|
|
|
|
|
|
this.uriResolverMapReader = new UriResolverMapReader(this.scope);
|
2014-10-14 17:12:55 +02:00
|
|
|
this.applicationTypes = uriResolverMapReader.getApplicationTypes();
|
2014-10-14 17:04:03 +02:00
|
|
|
|
2014-10-14 17:12:55 +02:00
|
|
|
} catch (Exception e) {
|
|
|
|
throw new UriResolverMapException("Map Application Type - Resources not found in IS");
|
|
|
|
}
|
2014-10-14 14:35:43 +02:00
|
|
|
|
2014-10-14 17:12:55 +02:00
|
|
|
if(!this.applicationTypes.containsKey(applicationType)){
|
|
|
|
throw new IllegalArgumentException("Application type '"+applicationType +"' not found in Application Types: "+getApplicationTypes());
|
2014-10-14 14:35:43 +02:00
|
|
|
}
|
2014-10-14 17:12:55 +02:00
|
|
|
|
2014-10-14 17:27:13 +02:00
|
|
|
this.applicationType = applicationType;
|
2014-10-21 12:43:00 +02:00
|
|
|
this.reloadRuntimeResourceParameter(RESET_DELAY, RESET_TIME);
|
2014-10-14 14:35:43 +02:00
|
|
|
}
|
|
|
|
|
2014-10-15 11:53:16 +02:00
|
|
|
/**
|
|
|
|
*
|
|
|
|
* @param parameters the map of the parameters sent with HTTP request (link) generated
|
|
|
|
* @param shortLink if true the link is shorted otherwise none
|
|
|
|
* @return
|
|
|
|
* @throws IllegalArgumentException
|
|
|
|
* @throws UriResolverMapException
|
|
|
|
*/
|
|
|
|
public String getLink(Map<String, String> parameters, boolean shortLink) throws IllegalArgumentException, UriResolverMapException{
|
2014-10-14 17:04:03 +02:00
|
|
|
|
2014-10-14 17:27:13 +02:00
|
|
|
String resourceName = this.applicationTypes.get(applicationType);
|
2014-10-15 11:53:16 +02:00
|
|
|
String link;
|
2014-10-14 17:27:13 +02:00
|
|
|
|
2014-10-14 18:13:47 +02:00
|
|
|
if(parameters==null){
|
|
|
|
throw new IllegalArgumentException("Input Map parameters is null");
|
|
|
|
}
|
|
|
|
|
2014-10-14 17:27:13 +02:00
|
|
|
try {
|
2014-10-21 11:18:18 +02:00
|
|
|
|
2014-10-21 12:43:00 +02:00
|
|
|
lockReader();
|
|
|
|
|
2014-10-21 11:18:18 +02:00
|
|
|
if(reader==null){
|
|
|
|
logger.info("Runtime Resource Reader is null, istancing...");
|
|
|
|
ScopeProvider.instance.set(this.scope);
|
|
|
|
reader = new RuntimeResourceReader(this.scope, resourceName);
|
|
|
|
}
|
|
|
|
|
2014-10-14 18:13:47 +02:00
|
|
|
List<ServiceParameter> resourceParameters = reader.getServiceParameters();
|
|
|
|
|
|
|
|
//CHECK PARAMETERS
|
|
|
|
for (ServiceParameter serviceParameter : resourceParameters) {
|
|
|
|
if(serviceParameter.isMandatory()){
|
|
|
|
if(!parameters.containsKey(serviceParameter.getKey())){
|
|
|
|
throw new IllegalArgumentException("Mandatory service key (parameter) '"+serviceParameter.getKey() +"' not found into input map");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
String baseURI = reader.getServiceBaseURI();
|
|
|
|
|
2014-10-21 12:43:00 +02:00
|
|
|
releaseReader();
|
|
|
|
|
2014-10-15 11:32:07 +02:00
|
|
|
String params = UrlEncoderUtil.encodeQuery(parameters);
|
2014-10-15 11:53:16 +02:00
|
|
|
link = baseURI+"?"+params;
|
|
|
|
logger.info("Created HTTP URI request (link): "+link);
|
2014-10-14 18:13:47 +02:00
|
|
|
|
2014-10-15 11:53:16 +02:00
|
|
|
if(shortLink){
|
|
|
|
try{
|
|
|
|
logger.info("Shortner start..");
|
|
|
|
UrlShortener shortener = new UrlShortener(this.scope);
|
|
|
|
link = shortener.shorten(link);
|
|
|
|
logger.info("Shorted link is: "+link);
|
|
|
|
}catch(Exception e){
|
|
|
|
logger.warn("An error occurred on shortener the link ",e);
|
|
|
|
}
|
|
|
|
}
|
2014-10-14 18:13:47 +02:00
|
|
|
} catch (IllegalArgumentException e){
|
|
|
|
throw e;
|
2014-10-14 17:27:13 +02:00
|
|
|
} catch (Exception e) {
|
2014-10-14 18:19:15 +02:00
|
|
|
logger.error("Uri Resolver error: ", e);
|
|
|
|
throw new UriResolverMapException("Uri Resolver error: " +e.getMessage());
|
2014-10-14 18:13:47 +02:00
|
|
|
}
|
2014-10-15 11:53:16 +02:00
|
|
|
return link;
|
2014-10-14 17:04:03 +02:00
|
|
|
}
|
|
|
|
|
2014-10-14 14:35:43 +02:00
|
|
|
/**
|
|
|
|
*
|
2014-10-15 11:53:16 +02:00
|
|
|
* @return the Application Types available
|
2014-10-14 14:35:43 +02:00
|
|
|
*/
|
|
|
|
public Set<String> getApplicationTypes(){
|
|
|
|
return this.applicationTypes.keySet();
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
*
|
|
|
|
* @return a map Application Type - Resource Name
|
|
|
|
*/
|
|
|
|
public Map<String, String> getCapabilities(){
|
|
|
|
return this.applicationTypes;
|
|
|
|
}
|
2014-10-21 12:43:00 +02:00
|
|
|
|
|
|
|
/**
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
public void reloadRuntimeResourceParameter(long delay, long period) {
|
|
|
|
Timer timer = new Timer(true);
|
|
|
|
|
|
|
|
timer.schedule(new TimerTask() {
|
|
|
|
@Override
|
|
|
|
public void run() {
|
|
|
|
logger.info("Timer Reset Runtime Resource running..");
|
|
|
|
int counters = countReaders();
|
|
|
|
if(counters==0){
|
|
|
|
logger.info("Reader not locked, resetting");
|
|
|
|
reader = null;
|
|
|
|
}else
|
|
|
|
logger.info("Reader locked, counters is/are:"+counters+", skipping");
|
|
|
|
|
|
|
|
}
|
|
|
|
}, delay, period);
|
|
|
|
}
|
|
|
|
|
2014-10-14 14:35:43 +02:00
|
|
|
}
|