Project

General

Profile

1 29686 sandro.lab
package eu.dnetlib.functionality.index.utils;
2
3
import java.util.HashMap;
4
import java.util.List;
5
import java.util.Map;
6
7
import javax.annotation.Resource;
8
9
import org.apache.commons.lang.StringUtils;
10
import org.apache.commons.logging.Log;
11
import org.apache.commons.logging.LogFactory;
12
13
import com.google.common.base.Function;
14
import com.google.common.collect.Iterables;
15
import com.google.common.collect.Lists;
16
17
import eu.dnetlib.data.provision.index.rmi.IndexServiceException;
18
import eu.dnetlib.enabling.is.lookup.rmi.ISLookUpDocumentNotFoundException;
19
import eu.dnetlib.enabling.is.lookup.rmi.ISLookUpException;
20
import eu.dnetlib.enabling.is.lookup.rmi.ISLookUpService;
21
import eu.dnetlib.enabling.is.registry.ISRegistryDocumentNotFoundException;
22
import eu.dnetlib.enabling.is.registry.rmi.ISRegistryException;
23
import eu.dnetlib.enabling.is.registry.rmi.ISRegistryService;
24 32572 michele.ar
import eu.dnetlib.enabling.locators.UniqueServiceLocator;
25 29686 sandro.lab
import eu.dnetlib.functionality.index.client.IndexClientException;
26
27
public class ServiceTools {
28
29
	private static final Log log = LogFactory.getLog(ServiceTools.class);
30
31 32572 michele.ar
	@Resource
32
	private UniqueServiceLocator serviceLocator;
33 29686 sandro.lab
34
	@Resource
35
	private MetadataReferenceFactory mdFactory;
36
37
	public List<MetadataReference> listMDRefs() throws IndexClientException {
38
		return Lists.newArrayList(Iterables.transform(listMDRefsAsString(), new Function<String, MetadataReference>() {
39
40
			@Override
41
			public MetadataReference apply(final String s) {
42
				return mdFactory.decodeMetadata(s);
43
			}
44
		}));
45
	}
46
47
	private List<String> quickSearchProfile(final String xquery) throws IndexClientException {
48
		try {
49 32572 michele.ar
			return serviceLocator.getService(ISLookUpService.class).quickSearchProfile(xquery);
50 29686 sandro.lab
		} catch (ISLookUpException e) {
51
			throw new IndexClientException(e);
52
		}
53
	}
54
55
	public MetadataReference getMetadataRef(final String dsId) throws IndexServiceException {
56
57
		final String xquery = "for $x in //RESOURCE_PROFILE[.//RESOURCE_IDENTIFIER/@value='" + dsId + "']//CONFIGURATION " + "return concat("
58
				+ "$x/METADATA_FORMAT/text(),'-'," + "$x/METADATA_FORMAT_LAYOUT/text(),'-'," + "$x/METADATA_FORMAT_INTERPRETATION/text())";
59
		return mdFactory.decodeMetadata(getResourceProfileByQuery(xquery));
60
	}
61
62
	private String getResourceProfileByQuery(final String xquery) throws IndexServiceException {
63
		try {
64 32572 michele.ar
			return serviceLocator.getService(ISLookUpService.class).getResourceProfileByQuery(xquery);
65 29686 sandro.lab
		} catch (ISLookUpDocumentNotFoundException e) {
66
			throw new IndexServiceException(e);
67
		} catch (ISLookUpException e) {
68
			throw new IndexServiceException(e);
69
		}
70
	}
71
72
	public String getIndexFields(final String dsId) throws IndexServiceException {
73
74
		return getIndexFields(getMetadataRef(dsId));
75
	}
76
77
	public String getIndexFields(final MetadataReference mdRef) {
78
79
		final String xquery = "for $x in collection('')/RESOURCE_PROFILE/BODY[CONFIGURATION/NAME='" + mdRef.getFormat()
80
				+ "'] return $x/STATUS/LAYOUTS/LAYOUT[@name='" + mdRef.getLayout() + "']/FIELDS";
81
		try {
82
			return getResourceProfileByQuery(xquery);
83
		} catch (IndexServiceException e) {
84
			log.warn("couldn't find Metadata format profile matching specs: " + mdRef.toString());
85
			return "";
86
		}
87
	}
88
89
	public List<String> listDsIds() throws IndexClientException {
90
		final String xquery = "//RESOURCE_PROFILE[.//RESOURCE_TYPE/@value='IndexDSResourceType']//RESOURCE_IDENTIFIER/@value/string()";
91
		return quickSearchProfile(xquery);
92
	}
93
94
	private List<String> listMDRefsAsString() throws IndexClientException {
95
		final String xquery = "for $x in //RESOURCE_PROFILE[.//RESOURCE_TYPE/@value='MDFormatDSResourceType'] "
96
				+ "let $format:= $x//CONFIGURATION/NAME/string() " + "for $y in $x//LAYOUTS/LAYOUT " + "let $layout:= $y//LAYOUT/@name/string() "
97
				+ "let $interpretation:= $x//CONFIGURATION/INTERPRETATION/text() " + "return concat($format,'-',$layout,'-',$interpretation) ";
98
		return quickSearchProfile(xquery);
99
	}
100
101
	public Map<String, String> getIndexProperties(final String backendId) throws IndexClientException {
102
103
		String query = "for $x in /RESOURCE_PROFILE[.//RESOURCE_TYPE/@value=\"IndexServiceResourceType\"]//SERVICE_PROPERTIES/PROPERTY"
104
				+ " return concat($x/@key/string(),\":::\", $x/@value/string())";
105
		Map<String, String> indexProperties = new HashMap<String, String>();
106
		try {
107 32572 michele.ar
			List<String> results = serviceLocator.getService(ISLookUpService.class).quickSearchProfile(query);
108 29686 sandro.lab
			if (results != null) {
109
				for (String s : results) {
110
					String[] values = s.split(":::");
111 32572 michele.ar
					if (values != null && values.length == 2) {
112 29686 sandro.lab
						String key = values[0];
113
						String value = values[1];
114
						if (StringUtils.startsWith(key, backendId)) {
115
							indexProperties.put(StringUtils.substringAfter(key, backendId + ":"), value);
116
						}
117
					}
118
				}
119
			}
120
			return indexProperties;
121
		} catch (ISLookUpException e) {
122
			throw new IndexClientException();
123
		}
124
	}
125
126
	public String registerProfile(final String resourceProfile) throws IndexServiceException {
127
		try {
128 32572 michele.ar
			return serviceLocator.getService(ISRegistryService.class).registerProfile(resourceProfile);
129 29686 sandro.lab
		} catch (ISRegistryException e) {
130
			throw new IndexServiceException(e);
131
		}
132
	}
133
134
	public boolean incrementHandledDataStructures(final String backendId) throws IndexServiceException {
135
		final String xquery = "let $x := //RESOURCE_PROFILE[HEADER/PROTOCOLS/PROTOCOL/@name='" + backendId + "'],"
136
				+ "$tot := $x//STATUS/HANDLED_DATASTRUCTURE/number() + 1 " + "return update replace $x//STATUS/HANDLED_DATASTRUCTURE with "
137
				+ "<HANDLED_DATASTRUCTURE>{$tot}</HANDLED_DATASTRUCTURE>";
138
139
		log.info("performing increment of HANDLED_DATASTRUCTURE");
140
		return executeXUpdate(xquery);
141
	}
142
143
	private boolean executeXUpdate(final String xquery) throws IndexServiceException {
144
		try {
145 32572 michele.ar
			return serviceLocator.getService(ISRegistryService.class).executeXUpdate(xquery);
146 29686 sandro.lab
		} catch (ISRegistryException e) {
147
			throw new IndexServiceException(e);
148
		}
149
	}
150
151
	public String getServiceAddress(final String backendId) {
152
		final String xquery = "let $x := //RESOURCE_PROFILE[HEADER/PROTOCOLS/PROTOCOL/@name='" + backendId + "']"
153
				+ "return $x//PROTOCOL[./@name='SOAP']/@address/string()";
154
		try {
155
			return getResourceProfileByQuery(xquery);
156
		} catch (IndexServiceException e) {
157
			log.warn("couldn't find service Address for index Service with protocol: " + backendId);
158
			return "";
159
		}
160
	}
161
162
	public boolean deleteIndexDS(final String dsId) throws IndexServiceException {
163
		try {
164 32572 michele.ar
			return serviceLocator.getService(ISRegistryService.class).deleteProfile(dsId);
165 29686 sandro.lab
		} catch (ISRegistryDocumentNotFoundException e) {
166
			throw new IndexServiceException(e);
167
		} catch (ISRegistryException e) {
168
			throw new IndexServiceException(e);
169
		}
170
	}
171 29978 sandro.lab
172
	public List<String> getBackendIds(final MetadataReference mdRef) throws IndexServiceException {
173
		String query = "distinct-values(//RESOURCE_PROFILE[.//METADATA_FORMAT='%s' and .//METADATA_FORMAT_LAYOUT='%s' and .//METADATA_FORMAT_INTERPRETATION='%s']//BACKEND/@ID/string())";
174
		try {
175
			String instanceQuery = String.format(query, mdRef.getFormat(), mdRef.getLayout(), mdRef.getInterpretation());
176
			log.debug("Executing query to IS: " + instanceQuery);
177 32572 michele.ar
			return serviceLocator.getService(ISLookUpService.class).quickSearchProfile(instanceQuery);
178 29978 sandro.lab
		} catch (ISLookUpException e) {
179
			throw new IndexServiceException(e);
180
		}
181
	}
182 29686 sandro.lab
}