/** * */ package org.gcube.portlets.user.uriresolvermanager.readers; import static org.gcube.resources.discovery.icclient.ICFactory.clientFor; import static org.gcube.resources.discovery.icclient.ICFactory.queryFor; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import org.gcube.common.resources.gcore.ServiceEndpoint; import org.gcube.common.resources.gcore.ServiceEndpoint.AccessPoint; import org.gcube.common.resources.gcore.ServiceEndpoint.Property; import org.gcube.common.resources.gcore.utils.Group; import org.gcube.common.scope.api.ScopeProvider; import org.gcube.portlets.user.uriresolvermanager.entity.ServiceAccessPoint; import org.gcube.portlets.user.uriresolvermanager.entity.ServiceParameter; import org.gcube.resources.discovery.client.api.DiscoveryClient; import org.gcube.resources.discovery.client.queries.api.SimpleQuery; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * The Class RuntimeResourceReader. * * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it Apr 30, 2015 */ public class RuntimeResourceReader { public static final Logger logger = LoggerFactory.getLogger(RuntimeResourceReader.class); public List serviceAccessPoints; private String resourceName; private String entryName; /** * Instantiates a new runtime resource reader. * * @param resourceName the resource name * @throws Exception the exception */ public RuntimeResourceReader(String resourceName) throws Exception { this.resourceName = resourceName; readResource(resourceName); } /** * Read resource. * * @param scope the scope * @param resourceName the resource name * @return the application URI * @throws Exception the exception */ private void readResource(String resourceName) throws Exception { try { String scope = ScopeProvider.instance.get(); logger.info("Trying to read resource: " + resourceName + ", in the scope: " + scope); this.resourceName = resourceName; SimpleQuery query = queryFor(ServiceEndpoint.class); query.addCondition("$resource/Profile/Name/string() eq '" + resourceName + "'"); DiscoveryClient client = clientFor(ServiceEndpoint.class); List r = client.submit(query); if (r == null || r.isEmpty()) throw new Exception( "Cannot retrieve the runtime resource with name: " + resourceName + " in the scope: " + scope); ServiceEndpoint se = r.get(0); if (se.profile() == null) { String msg = "Runtime reosource with resource name: " + resourceName + " is null in the scope: " + scope; logger.error(msg); throw new Exception(msg); } Group accessPoints = se.profile().accessPoints(); if (accessPoints.size() == 0) throw new Exception("Accesspoint in resource " + resourceName + " not found"); Iterator acIt = accessPoints.iterator(); serviceAccessPoints = new ArrayList(accessPoints.size()); while (acIt.hasNext()) { AccessPoint ap = acIt.next(); Group properties = ap.properties(); if (properties.size() == 0) { logger.warn("Properties in resource " + resourceName + " not found"); } else { List serviceParameters = new ArrayList(properties.size()); Iterator iter = properties.iterator(); while (iter.hasNext()) { Property prop = iter.next(); serviceParameters.add(new ServiceParameter(prop.value(), true)); } serviceAccessPoints.add(new ServiceAccessPoint(ap.name(), ap.address(), serviceParameters)); } } logger.debug("Found properties: " + serviceAccessPoints); // parameters.setUser(ap.username()); //username // String decryptedPassword = // StringEncrypter.getEncrypter().decrypt(ap.password()); // parameters.setPassword(decryptedPassword); //password // Group properties = ap.properties(); } catch (Exception e) { logger.error("Sorry, an error occurred on reading the resource " + resourceName + " Runtime Resource", e); throw new Exception( "Sorry, an error occurred on reading the resource " + resourceName + " Runtime Reosurce"); } } /** * Gets the service access point for entry name. * * @param entryName the entry name * @return the service access point for entry name */ public ServiceAccessPoint getServiceAccessPointForEntryName(String entryName) { for (ServiceAccessPoint serviceAccessPoint : serviceAccessPoints) { if (serviceAccessPoint.getEntryName().equals(entryName)) return serviceAccessPoint; } return null; } /** * Gets the resource name. * * @return the resource name */ public String getResourceName() { return resourceName; } /** * Gets the entry name. * * @return the entryName */ public String getEntryName() { return entryName; } /** * Gets the service access points. * * @return the serviceAccessPoints */ public List getServiceAccessPoints() { return serviceAccessPoints; } /* * (non-Javadoc) * * @see java.lang.Object#toString() */ @Override public String toString() { StringBuilder builder = new StringBuilder(); builder.append("RuntimeResourceReader [serviceAccessPoints="); builder.append(serviceAccessPoints); builder.append(", resourceName="); builder.append(resourceName); builder.append(", entryName="); builder.append(entryName); builder.append("]"); return builder.toString(); } // public static void main(String[] args) { // try { // RuntimeResourceReader rr = new RuntimeResourceReader("/gcube", "Gis-Resolver"); // System.out.println(rr); // // System.out.println(rr.getServiceAccessPointForEntryName("gis")); // } catch (Exception e) { // // TODO Auto-generated catch block // e.printStackTrace(); // } // } }