Project

General

Profile

1
package eu.dnetlib.functionality.modular.ui.repositories;
2

    
3
import java.io.StringReader;
4
import java.util.Date;
5
import java.util.List;
6
import java.util.Map;
7

    
8
import javax.annotation.Resource;
9
import javax.servlet.http.HttpServletRequest;
10
import javax.servlet.http.HttpServletResponse;
11

    
12
import com.google.common.cache.Cache;
13
import org.apache.commons.io.IOUtils;
14
import org.apache.commons.lang.StringUtils;
15
import org.apache.commons.lang.exception.ExceptionUtils;
16
import org.apache.commons.logging.Log;
17
import org.apache.commons.logging.LogFactory;
18
import org.springframework.cache.annotation.CacheEvict;
19
import org.springframework.cache.annotation.Cacheable;
20
import org.springframework.http.HttpStatus;
21
import org.springframework.stereotype.Controller;
22
import org.springframework.ui.ModelMap;
23
import org.springframework.web.bind.annotation.ExceptionHandler;
24
import org.springframework.web.bind.annotation.RequestMapping;
25
import org.springframework.web.bind.annotation.RequestParam;
26
import org.springframework.web.bind.annotation.ResponseBody;
27
import org.springframework.web.bind.annotation.ResponseStatus;
28

    
29
import com.google.common.collect.Maps;
30
import com.google.gson.Gson;
31

    
32
import eu.dnetlib.data.collector.rmi.CollectorService;
33
import eu.dnetlib.data.collector.rmi.CollectorServiceException;
34
import eu.dnetlib.data.collector.rmi.ProtocolParameterValue;
35
import eu.dnetlib.enabling.datasources.rmi.BrowseTerm;
36
import eu.dnetlib.enabling.datasources.rmi.DatasourceDesc;
37
import eu.dnetlib.enabling.datasources.rmi.DatasourceManagerService;
38
import eu.dnetlib.enabling.datasources.rmi.DatasourceManagerServiceException;
39
import eu.dnetlib.enabling.datasources.rmi.IfaceDesc;
40
import eu.dnetlib.enabling.datasources.rmi.RepositoryMapEntry;
41
import eu.dnetlib.enabling.datasources.rmi.SearchInterfacesEntry;
42
import eu.dnetlib.enabling.datasources.rmi.SimpleDatasourceDesc;
43
import eu.dnetlib.enabling.is.lookup.rmi.ISLookUpDocumentNotFoundException;
44
import eu.dnetlib.enabling.is.lookup.rmi.ISLookUpService;
45
import eu.dnetlib.enabling.is.registry.rmi.ISRegistryService;
46
import eu.dnetlib.enabling.locators.UniqueServiceLocator;
47
import eu.dnetlib.functionality.modular.ui.error.ErrorMessage;
48
import eu.dnetlib.functionality.modular.ui.repositories.objects.RepoInterfaceEntry;
49
import eu.dnetlib.functionality.modular.ui.workflows.objects.sections.WorkflowSectionGrouper;
50
import eu.dnetlib.miscutils.functional.xml.ApplyXslt;
51
import eu.dnetlib.msro.workflows.sarasvati.loader.WorkflowExecutor;
52
import eu.dnetlib.msro.workflows.util.WorkflowsConstants;
53

    
54
@Controller
55
public class RepoInternalController {
56

    
57
	@Resource
58
	private UniqueServiceLocator serviceLocator;
59

    
60
	@Resource
61
	private WorkflowSectionGrouper workflowSectionGrouper;
62

    
63
	@Resource
64
	private WorkflowExecutor workflowExecutor;
65

    
66
	@Resource
67
	private RepoUIUtils repoUIUtils;
68

    
69
	private static final Log log = LogFactory.getLog(RepoInternalController.class);
70

    
71
	@RequestMapping(value = "/ui/browseRepoField.do")
72
	public @ResponseBody List<BrowseTerm> browseRepoField(@RequestParam(value = "field", required = true) final String field) throws Exception {
73
		return serviceLocator.getService(DatasourceManagerService.class).browseField(field);
74
	}
75

    
76
	@Cacheable(cacheNames = "repoUIJsonCache", key = "#param, #value", condition = "#refresh == false")
77
	@RequestMapping(value = "/ui/listApis.do")
78
	public @ResponseBody List<SearchInterfacesEntry> listApis(
79
			@RequestParam(value = "param", required = true) final String param,
80
			@RequestParam(value = "value", required = true) final String value,
81
			@RequestParam(value = "refresh", required = false) final String refresh) throws Exception {
82

    
83
		return serviceLocator.getService(DatasourceManagerService.class).searchInterface(param, value);
84
	}
85

    
86
	@RequestMapping(value = "/ui/listRepositories.map")
87
	public @ResponseBody List<RepositoryMapEntry> listRepositories_asMap() throws Exception {
88
		return serviceLocator.getService(DatasourceManagerService.class).getRepositoryMap();
89
	}
90

    
91
	@RequestMapping(value = "/ui/listRepositories.json")
92
	public @ResponseBody List<SimpleDatasourceDesc> listRepositories(@RequestParam(value = "type", required = true) final String type) throws Exception {
93
		return serviceLocator.getService(DatasourceManagerService.class).simpleListDatasourcesByType(type);
94
	}
95

    
96
	@CacheEvict("repoUIJsonCache")
97
	@RequestMapping(value = "/ui/validateRepo.do")
98
	public @ResponseBody String listRepositories(@RequestParam(value = "id", required = true) final String id,
99
			@RequestParam(value = "b", required = true) final boolean b) throws Exception {
100

    
101
		final String query = "count(/*[.//RESOURCE_TYPE/@value='MetaWorkflowDSResourceType' and .//DATAPROVIDER/@id='" + id + "'])";
102
		if (!b && (Integer.parseInt(serviceLocator.getService(ISLookUpService.class).getResourceProfileByQuery(query)) > 0)) { throw new Exception("Repo " + id
103
				+ " can be invalidated: it is related to some metawfs"); }
104

    
105
		final String newId = b ? serviceLocator.getService(ISRegistryService.class).validateProfile(id)
106
				: serviceLocator.getService(ISRegistryService.class).invalidateProfile(id);
107

    
108
		return newId;
109
	}
110

    
111
	@RequestMapping(value = "/ui/getRepoDetails.do")
112
	public void getRepoDetails(final HttpServletResponse response, @RequestParam(value = "id", required = true) final String id) throws Exception {
113
		String profile;
114
		try {
115
			profile = serviceLocator.getService(ISLookUpService.class).getResourceProfile(id);
116
		} catch (final ISLookUpDocumentNotFoundException e) {
117
			profile = serviceLocator.getService(ISLookUpService.class).getResourceProfileByQuery(
118
					"collection('/db/DRIVER/RepositoryServiceResources/RepositoryServiceResourceType')/*[.//DATASOURCE_ORIGINAL_ID='" + id + "']");
119
		}
120

    
121
		final ApplyXslt xslt = new ApplyXslt(IOUtils.toString(getClass().getResourceAsStream(
122
				"/eu/dnetlib/functionality/modular/ui/repositories/xslt/repoDetails.xslt")));
123

    
124
		IOUtils.copy(new StringReader(xslt.evaluate(profile)), response.getOutputStream());
125
	}
126

    
127
	@RequestMapping("/ui/repoMetaWf.new")
128
	public @ResponseBody String newDataProviderWorkflow(@RequestParam(value = "id", required = true) final String repoId,
129
			@RequestParam(value = "name", required = true) final String repoName,
130
			@RequestParam(value = "iface", required = true) final String ifaceId,
131
			@RequestParam(value = "wf", required = true) final String wfId) throws Exception {
132

    
133
		final Map<String, Object> params = Maps.newHashMap();
134
		params.put(WorkflowsConstants.DATAPROVIDER_ID, repoId);
135
		params.put(WorkflowsConstants.DATAPROVIDER_NAME, repoName);
136
		params.put(WorkflowsConstants.DATAPROVIDER_INTERFACE, ifaceId);
137

    
138
		return workflowExecutor.startProcess(wfId, params);
139
	}
140

    
141
	@RequestMapping("/ui/repoMetaWf.destroy")
142
	public @ResponseBody String destroyDataProviderWorkflow(@RequestParam(value = "destroyWf", required = true) final String destroyWfId)
143
			throws Exception {
144
		return workflowExecutor.startProcess(destroyWfId, null);
145
	}
146

    
147
	@RequestMapping("/ui/repoApi.get")
148
	public @ResponseBody RepoInterfaceEntry getRepoApi(@RequestParam(value = "repoId", required = true) final String repoId,
149
			@RequestParam(value = "ifaceId", required = true) final String ifaceId) throws Exception {
150
		return repoUIUtils.getApi(repoId, ifaceId);
151
	}
152

    
153
	@SuppressWarnings("unchecked")
154
	@RequestMapping("/ui/repoApi.update")
155
	public @ResponseBody boolean updateRepoApi(
156
			@RequestParam(value = "id", required = true) final String repoId,
157
			@RequestParam(value = "iface", required = true) final String ifaceId,
158
			@RequestParam(value = "accessParams", required = false) final String accessParamsJson,
159
			@RequestParam(value = "mdIdPath", required = false) final String mdIdPath) throws Exception {
160

    
161
		final DatasourceManagerService dsManager = serviceLocator.getService(DatasourceManagerService.class);
162

    
163
		if (!StringUtils.isEmpty(accessParamsJson)) {
164
			dsManager.bulkUpdateApiAccessParams(repoId, ifaceId, new Gson().fromJson(accessParamsJson, Map.class));
165
		}
166
		if (mdIdPath != null) {
167
			dsManager.updateExtraField(repoId, ifaceId, "metadata_identifier_path", mdIdPath, true);
168
		}
169

    
170
		return true;
171
	}
172

    
173
	@RequestMapping("/ui/repoApi.delete")
174
	public @ResponseBody boolean updateRepoApi(
175
			@RequestParam(value = "repo", required = true) final String repoId,
176
			@RequestParam(value = "iface", required = true) final String ifaceId) throws Exception {
177
		return serviceLocator.getService(DatasourceManagerService.class).deleteInterface(repoId, ifaceId);
178
	}
179

    
180
	@CacheEvict("repoUIJsonCache")
181
	@RequestMapping("/ui/repoApiCompliance.update")
182
	public @ResponseBody boolean updateRepoApiCompliance(@RequestParam(value = "id", required = true) final String repoId,
183
			@RequestParam(value = "iface", required = true) final String ifaceId,
184
			@RequestParam(value = "compliance", required = true) final String compliance) throws Exception {
185

    
186
		log.debug("SET COMPLIANCE TO " + compliance);
187

    
188
		serviceLocator.getService(DatasourceManagerService.class).overrideCompliance(repoId, ifaceId, compliance);
189

    
190
		return true;
191
	}
192

    
193
	@CacheEvict("repoUIJsonCache")
194
	@RequestMapping("/ui/repoApiCompliance.reset")
195
	public @ResponseBody boolean resetRepoApiCompliance(@RequestParam(value = "id", required = true) final String repoId,
196
			@RequestParam(value = "iface", required = true) final String ifaceId) throws Exception {
197

    
198
		log.debug("RESET COMPLIANCE");
199

    
200
		serviceLocator.getService(DatasourceManagerService.class).overrideCompliance(repoId, ifaceId, null);
201

    
202
		return true;
203
	}
204

    
205
	@RequestMapping("/ui/repos/repoApi.html")
206
	public void resetRepoApiCompliance(final ModelMap map) throws Exception {}
207

    
208
	@RequestMapping("/ui/repoApi.new")
209
	public @ResponseBody boolean addRepoApi(@RequestParam(value = "repoId", required = true) final String repoId,
210
			@RequestParam(value = "iface", required = true) final String ifaceJson) throws DatasourceManagerServiceException {
211
		final IfaceDesc iface = new Gson().fromJson(ifaceJson, IfaceDesc.class);
212

    
213
		log.info("Adding interface " + iface.getId() + " to repository " + repoId);
214

    
215
		final DatasourceManagerService dsManager = serviceLocator.getService(DatasourceManagerService.class);
216
		return dsManager.addInterface(repoId, iface);
217
	}
218

    
219
	@RequestMapping("/ui/repo.new")
220
	public @ResponseBody boolean addRepoApi(@RequestParam(value = "repo", required = true) final String repoJson) throws DatasourceManagerServiceException {
221
		final DatasourceDesc ds = new Gson().fromJson(repoJson, DatasourceDesc.class);
222
		ds.setDateOfCollection(new Date());
223

    
224
		if (StringUtils.isBlank(ds.getEnglishName())) {
225
			ds.setEnglishName(ds.getOfficialName());
226
		}
227

    
228
		log.info("Adding datasource " + ds.getId() + " - name " + ds.getOfficialName());
229

    
230
		final DatasourceManagerService dsManager = serviceLocator.getService(DatasourceManagerService.class);
231

    
232
		return dsManager.addDatasource(ds);
233
	}
234

    
235
	@RequestMapping("/ui/listValidValuesForParam.do")
236
	public @ResponseBody List<ProtocolParameterValue> listValidValuesForParam(
237
			@RequestParam(value = "protocol", required = true) final String protocol,
238
			@RequestParam(value = "param", required = true) final String param,
239
			@RequestParam(value = "baseUrl", required = true) final String baseUrl) throws CollectorServiceException {
240

    
241
		return serviceLocator.getService(CollectorService.class).listValidValuesForParam(protocol, baseUrl, param, null);
242
	}
243

    
244
	@ExceptionHandler(Exception.class)
245
	@ResponseStatus(value = HttpStatus.INTERNAL_SERVER_ERROR)
246
	public @ResponseBody ErrorMessage handleException(final HttpServletRequest req, final Exception e) {
247
		log.error("Error processing " + req.getRequestURI(), e);
248
		return new ErrorMessage(e.getMessage(), ExceptionUtils.getStackTrace(e));
249
	}
250

    
251
}
(5-5/7)