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 org.apache.commons.io.IOUtils;
13
import org.apache.commons.lang.StringUtils;
14
import org.apache.commons.lang.exception.ExceptionUtils;
15
import org.apache.commons.logging.Log;
16
import org.apache.commons.logging.LogFactory;
17
import org.springframework.beans.factory.annotation.Autowired;
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
import com.google.gson.reflect.TypeToken;
32

    
33
import eu.dnetlib.data.collector.rmi.CollectorService;
34
import eu.dnetlib.data.collector.rmi.CollectorServiceException;
35
import eu.dnetlib.data.collector.rmi.ProtocolParameterValue;
36
import eu.dnetlib.enabling.datasources.common.Api;
37
import eu.dnetlib.enabling.datasources.common.ApiParam;
38
import eu.dnetlib.enabling.datasources.common.ApiParamImpl;
39
import eu.dnetlib.enabling.datasources.common.BrowseTerm;
40
import eu.dnetlib.enabling.datasources.common.Datasource;
41
import eu.dnetlib.enabling.datasources.common.DsmException;
42
import eu.dnetlib.enabling.datasources.common.Identity;
43
import eu.dnetlib.enabling.datasources.common.LocalDatasourceManager;
44
import eu.dnetlib.enabling.datasources.common.Organization;
45
import eu.dnetlib.enabling.datasources.common.SearchApisEntry;
46
import eu.dnetlib.enabling.datasources.common.SimpleDatasource;
47
import eu.dnetlib.enabling.is.lookup.rmi.ISLookUpDocumentNotFoundException;
48
import eu.dnetlib.enabling.is.lookup.rmi.ISLookUpService;
49
import eu.dnetlib.enabling.is.registry.rmi.ISRegistryService;
50
import eu.dnetlib.enabling.locators.UniqueServiceLocator;
51
import eu.dnetlib.functionality.modular.ui.error.ErrorMessage;
52
import eu.dnetlib.functionality.modular.ui.repositories.objects.RepoInterfaceEntry;
53
import eu.dnetlib.functionality.modular.ui.workflows.objects.sections.WorkflowSectionGrouper;
54
import eu.dnetlib.miscutils.functional.xml.ApplyXslt;
55
import eu.dnetlib.msro.workflows.sarasvati.loader.WorkflowExecutor;
56
import eu.dnetlib.msro.workflows.util.WorkflowsConstants;
57

    
58
@Controller
59
public class RepoInternalController {
60

    
61
	@Autowired
62
	private LocalDatasourceManager<Datasource<?, ?>, Api<?>> dsManager;
63

    
64
	@Resource
65
	private UniqueServiceLocator serviceLocator;
66

    
67
	@Resource
68
	private WorkflowSectionGrouper workflowSectionGrouper;
69

    
70
	@Resource
71
	private WorkflowExecutor workflowExecutor;
72

    
73
	@Resource
74
	private RepoUIUtils repoUIUtils;
75

    
76
	private static final Log log = LogFactory.getLog(RepoInternalController.class);
77

    
78
	@RequestMapping(value = "/ui/browseRepoField.do")
79
	public @ResponseBody List<? extends BrowseTerm> browseRepoField(@RequestParam(value = "field", required = true) final String field) throws Exception {
80
		return dsManager.browseField(field);
81
	}
82

    
83
	@Cacheable(cacheNames = "repoUIJsonCache", key = "#param, #value", condition = "#refresh == false")
84
	@RequestMapping(value = "/ui/listApis.do")
85
	public @ResponseBody List<? extends SearchApisEntry> listApis(
86
			@RequestParam(value = "param", required = true) final String param,
87
			@RequestParam(value = "value", required = true) final String value,
88
			@RequestParam(value = "refresh", required = false) final String refresh) throws Exception {
89

    
90
		return dsManager.searchApis(param, value);
91
	}
92

    
93
	@RequestMapping(value = "/ui/listRepositories.json")
94
	public @ResponseBody List<SimpleDatasource> listRepositories(@RequestParam(value = "type", required = true) final String type) throws Exception {
95
		return dsManager.searchDatasourcesByType(type);
96
	}
97

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

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

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

    
110
		return newId;
111
	}
112

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

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

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

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

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

    
140
		return workflowExecutor.startProcess(wfId, params);
141
	}
142

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

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

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

    
162
		if (!StringUtils.isEmpty(accessParamsJson)) {
163
			final Map<String, String> params = new Gson().fromJson(accessParamsJson, new TypeToken<Map<String, String>>() {}.getType());
164
			final String baseUrl = params.remove("baseUrl");
165
			dsManager.updateApiDetails(repoId, ifaceId, mdIdPath, baseUrl, params);
166
		}
167

    
168
		return true;
169
	}
170

    
171
	@RequestMapping("/ui/repoApi.delete")
172
	public @ResponseBody boolean updateRepoApi(
173
			@RequestParam(value = "repo", required = true) final String repoId,
174
			@RequestParam(value = "iface", required = true) final String ifaceId) throws Exception {
175
		dsManager.deleteApi(repoId, ifaceId);
176
		return true;
177
	}
178

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

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

    
187
		dsManager.updateCompliance(repoId, ifaceId, compliance, true);
188

    
189
		return true;
190
	}
191

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

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

    
199
		dsManager.updateCompliance(repoId, ifaceId, null, true);
200

    
201
		return true;
202
	}
203

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

    
207
	@RequestMapping("/ui/repoApi.new")
208
	public @ResponseBody boolean addRepoApi(@RequestParam(value = "repoId", required = true) final String repoId,
209
			@RequestParam(value = "iface", required = true) final String ifaceJson) throws DsmException {
210
		final Api<ApiParam> iface = new Gson().fromJson(ifaceJson, new TypeToken<Api<ApiParamImpl>>() {}.getType());
211

    
212
		iface.setDatasource(repoId);
213

    
214
		log.info("Adding api " + iface.getId() + " to repository " + repoId);
215

    
216
		dsManager.addApi(iface);
217

    
218
		return true;
219
	}
220

    
221
	@RequestMapping("/ui/repo.new")
222
	public @ResponseBody boolean addRepoApi(@RequestParam(value = "repo", required = true) final String repoJson) throws DsmException {
223
		final Datasource<Organization<?>, Identity> ds = new Gson().fromJson(repoJson, new TypeToken<Datasource<Organization<?>, Identity>>() {}.getType());
224
		final Date now = new Date();
225
		ds.setDateofcollection(new java.sql.Date(now.getTime()));
226

    
227
		if (StringUtils.isBlank(ds.getEnglishname())) {
228
			ds.setEnglishname(ds.getOfficialname());
229
		}
230

    
231
		log.info("Adding datasource " + ds.getId() + " - name " + ds.getOfficialname());
232

    
233
		dsManager.saveDs(ds);
234

    
235
		return true;
236
	}
237

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

    
244
		return serviceLocator.getService(CollectorService.class).listValidValuesForParam(protocol, baseUrl, param, null);
245
	}
246

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

    
254
}
(5-5/7)