/** * */ package org.gcube.datatransfer.resolver.catalogue.resource; import static org.gcube.resources.discovery.icclient.ICFactory.client; import java.io.StringReader; import java.util.List; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import org.gcube.common.resources.gcore.utils.XPathHelper; import org.gcube.common.scope.api.ScopeProvider; import org.gcube.datatransfer.resolver.applicationprofile.ApplicationProfileNotFoundException; import org.gcube.resources.discovery.client.api.DiscoveryClient; import org.gcube.resources.discovery.client.queries.api.Query; import org.gcube.resources.discovery.client.queries.impl.QueryBox; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.w3c.dom.Node; import org.xml.sax.InputSource; /** * The Class CkanPorltetApplicationProfile. * * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it * May 16, 2017 */ public class CkanPorltetApplicationProfile { private static final Logger logger = LoggerFactory.getLogger(CkanPorltetApplicationProfile.class); private final static String APPLICATION_PROFILE_NAME = "CkanPortlet"; /** * Gets the portlet url from infrastrucure. * * @return the portlet url from infrastrucure * @throws Exception the exception */ public static String getPortletUrlFromInfrastrucure() throws Exception { String scope = ScopeProvider.instance.get(); logger.debug("Trying to fetch applicationProfile profile from the infrastructure for " + APPLICATION_PROFILE_NAME + " scope: " + scope); try { Query q = new QueryBox( "for $profile in collection('/db/Profiles/GenericResource')//Resource " + "where $profile/Profile/SecondaryType/string() eq 'ApplicationProfile' and $profile/Profile/Name/string() " + " eq '" + APPLICATION_PROFILE_NAME + "'" + "return $profile"); DiscoveryClient client = client(); List appProfile = client.submit(q); if (appProfile == null || appProfile.size() == 0) throw new ApplicationProfileNotFoundException( "Your applicationProfile is not registered in the infrastructure"); else { String elem = appProfile.get(0); DocumentBuilder docBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder(); Node node = docBuilder.parse(new InputSource(new StringReader(elem))).getDocumentElement(); XPathHelper helper = new XPathHelper(node); List currValue = null; currValue = helper.evaluate("/Resource/Profile/Body/url/text()"); if (currValue != null && currValue.size() > 0) { logger.debug("CKAN Portlet url found is " + currValue.get(0)); return currValue.get(0); } } } catch (Exception e) { throw new Exception("Error while trying to fetch applicationProfile profile for name "+APPLICATION_PROFILE_NAME+"from the infrastructure, using scope: "+scope); } return null; } }