package eu.dnetlib.enabling.tools; import java.util.List; import java.util.Map; import org.springframework.beans.factory.annotation.Required; import com.google.common.collect.Lists; import eu.dnetlib.enabling.is.lookup.rmi.ISLookUpDocumentNotFoundException; import eu.dnetlib.enabling.is.lookup.rmi.ISLookUpException; import eu.dnetlib.enabling.is.lookup.rmi.ISLookUpService; import eu.dnetlib.enabling.locators.UniqueServiceLocator; import eu.dnetlib.miscutils.collections.PositionalStringMapGenerator; /** * Utility class which interacts with a lookup, performs a query and fills a java domain object splitting the result into constructor * arguments. * * @author marko * */ public class SplittedQueryExecutor { /** * service locator. */ private UniqueServiceLocator serviceLocator; /** * default constructor. lookupLocator has to be injected. */ public SplittedQueryExecutor() { // empty } /** * Commodity constructor for constructor injection. * * @param lookupLocator * lookup locator */ public SplittedQueryExecutor(final UniqueServiceLocator serviceLocator) { super(); this.serviceLocator = serviceLocator; } /** * Performs the query, splits the result at ":-:". * * @param * domain class type * @param clazz * domain class * @param query * xquery * @return iterable of domain class instances */ public Iterable query(final Class clazz, final String query) { return query(clazz, query, ":-:"); } /** * Performs the query, splits the result at separator * * @param * domain class type * @param clazz * domain class * @param query * xquery * @param separator * split separator * @return iterable of domain class instances */ public Iterable query(final Class clazz, final String query, final String separator) { return new PositionalStringMapGenerator().split(clazz, performQuery(query), separator); } /** * Return a list of maps of splitted query results * * @param query * xquery * @param keys * list of keys * @return collection of key/value pairs */ public Iterable> query(final String query, final String... keys) { return new PositionalStringMapGenerator(keys).split(performQuery(query), ":-:"); } /** * Like query(String, String..) but returns a container that whose values can be modified. * * @param query * xquery * @param keys * list of keys * @return mutable collection of key/value pairs */ public Iterable> mutableQuery(final String query, final String... keys) { return Lists.newArrayList(query(query, keys)); } /** * Like query(Class, String), but returns a container which can be modified. * * @param * some domain class * @param clazz * domain class * @param query * xquery * @return mutable collection of X */ public Iterable mutableQuery(final Class clazz, final String query) { return Lists.newArrayList(query(clazz, query)); } /** * Like query(Class, String, String), but returns a container which can be modified. * * @param * some domain class * @param clazz * domain class * @param query * xquery * @param separator * separator * @return mutable collection of X */ public Iterable mutableQuery(final Class clazz, final String query, final String separator) { return Lists.newArrayList(query(clazz, query, separator)); } public List performQuery(final String query) { try { return serviceLocator.getService(ISLookUpService.class).quickSearchProfile(query); } catch (final ISLookUpException e) { throw new IllegalStateException(e); } } /** * Fetch only one string result. * * @param query * @return null if no such result */ public String queryFirst(final String query) { try { return serviceLocator.getService(ISLookUpService.class).getResourceProfileByQuery(query); } catch (ISLookUpDocumentNotFoundException e) { return null; } catch (final ISLookUpException e) { throw new IllegalStateException(e); } } public UniqueServiceLocator getServiceLocator() { return serviceLocator; } @Required public void setServiceLocator(final UniqueServiceLocator serviceLocator) { this.serviceLocator = serviceLocator; } }