Project

General

Profile

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

    
3
import java.io.StringReader;
4
import java.util.ArrayList;
5
import java.util.Collections;
6
import java.util.List;
7
import java.util.Set;
8

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

    
13
import org.dom4j.Document;
14
import org.dom4j.Node;
15
import org.dom4j.io.SAXReader;
16
import org.springframework.beans.factory.annotation.Required;
17
import org.springframework.ui.ModelMap;
18

    
19
import com.google.common.base.Splitter;
20
import com.google.common.collect.Lists;
21
import com.google.common.collect.Sets;
22
import com.google.gson.Gson;
23

    
24
import eu.dnetlib.enabling.datasources.rmi.DatasourceManagerService;
25
import eu.dnetlib.enabling.is.lookup.rmi.ISLookUpException;
26
import eu.dnetlib.enabling.is.lookup.rmi.ISLookUpService;
27
import eu.dnetlib.enabling.locators.UniqueServiceLocator;
28
import eu.dnetlib.functionality.modular.ui.ModuleEntryPoint;
29
import eu.dnetlib.miscutils.collections.Pair;
30

    
31
public class RepoApisEntryPointController extends ModuleEntryPoint {
32

    
33
	@Resource
34
	private UniqueServiceLocator serviceLocator;
35

    
36
	@Resource
37
	private RepoUIUtils repoUIUtils;
38

    
39
	private String compatibilityLevelsVocabulary;
40

    
41
	private String validatorAddress;
42
	private String validatorServiceAddress;
43

    
44
	public class RepoHIWorkflow implements Comparable<RepoHIWorkflow> {
45

    
46
		private String id;
47
		private String name;
48
		private Set<String> ifaceTypes;
49
		private Set<String> compliances;
50
		private List<Pair<String, String>> fields;
51

    
52
		/**
53
		 * Instantiates a new repo hi workflow.
54
		 *
55
		 * @param id
56
		 *            the id
57
		 * @param name
58
		 *            the name
59
		 * @param ifaceTypes
60
		 *            the iface types
61
		 * @param compliances
62
		 *            the compliances
63
		 * @param fields
64
		 *            the fields
65
		 */
66
		public RepoHIWorkflow(final String id, final String name, final Set<String> ifaceTypes, final Set<String> compliances,
67
				final List<Pair<String, String>> fields) {
68
			super();
69
			this.id = id;
70
			this.name = name;
71
			this.ifaceTypes = ifaceTypes;
72
			this.compliances = compliances;
73
			this.fields = fields;
74
		}
75

    
76
		public String getId() {
77
			return id;
78
		}
79

    
80
		public String getName() {
81
			return name;
82
		}
83

    
84
		public Set<String> getIfaceTypes() {
85
			return ifaceTypes;
86
		}
87

    
88
		public Set<String> getCompliances() {
89
			return compliances;
90
		}
91

    
92
		@Override
93
		public int compareTo(final RepoHIWorkflow o) {
94
			return getName().compareTo(o.getName());
95
		}
96

    
97
		/**
98
		 * @return the fields
99
		 */
100
		public List<Pair<String, String>> getFields() {
101
			return fields;
102
		}
103

    
104
		/**
105
		 * @param fields
106
		 *            the fields to set
107
		 */
108
		public void setFields(final List<Pair<String, String>> fields) {
109
			this.fields = fields;
110
		}
111

    
112
	}
113

    
114
	private RepoHIWorkflow parseQuery(final String input) {
115
		final SAXReader reader = new SAXReader();
116
		try {
117
			final Document doc = reader.read(new StringReader(input));
118

    
119
			final String id = doc.valueOf("//id");
120
			final String name = doc.valueOf("//name");
121
			final String type = doc.valueOf("//types");
122
			final String compliance = doc.valueOf("//compliances");
123
			final Set<String> ifcTypes = Sets.newHashSet(Splitter.on(",").omitEmptyStrings().trimResults().split(type));
124
			final Set<String> compliances = Sets.newHashSet(Splitter.on(",").omitEmptyStrings().trimResults().split(compliance));
125

    
126
			final List<Pair<String, String>> fields = new ArrayList<Pair<String, String>>();
127
			for (final Object o : doc.selectNodes(".//FIELD")) {
128
				final Node currentNode = (Node) o;
129
				final String key = currentNode.valueOf("@name");
130
				final String value = currentNode.getText();
131
				fields.add(new Pair<String, String>(key, value));
132
			}
133
			return new RepoHIWorkflow(id, name, ifcTypes, compliances, fields);
134
		} catch (final Exception e) {
135
			return null;
136
		}
137
	}
138

    
139
	private List<RepoHIWorkflow> listRepoHIWorkflows() throws ISLookUpException {
140

    
141
		final String xquery =
142
				"for $x in collection('/db/DRIVER/WorkflowDSResources/WorkflowDSResourceType') where $x//WORKFLOW_TYPE='REPO_HI' return <result> <id>{$x//RESOURCE_IDENTIFIER/@value/string()}</id> <name>{$x//WORKFLOW_NAME/text()}</name> <types>{$x//PARAM[@name='expectedInterfaceTypologyPrefixes']/text()}</types> <compliances>{$x//PARAM[@name='expectedCompliancePrefixes']/text()}</compliances> {$x//FIELD} </result>";
143
		final List<RepoHIWorkflow> list = Lists.newArrayList();
144
		for (final String s : serviceLocator.getService(ISLookUpService.class).quickSearchProfile(xquery)) {
145
			final RepoHIWorkflow repoHiInfo = parseQuery(s);
146
			if (repoHiInfo != null) {
147
				list.add(repoHiInfo);
148
			}
149
		}
150
		Collections.sort(list);
151
		return list;
152
	}
153

    
154
	@Override
155
	protected void initialize(final ModelMap map, final HttpServletRequest request, final HttpServletResponse response) throws Exception {
156
		final Gson gson = new Gson();
157
		map.addAttribute("availableRepohiWfs", gson.toJson(listRepoHIWorkflows()));
158
		map.addAttribute("compatibilityLevels", gson.toJson(repoUIUtils.fetchVocabularyTerms(getCompatibilityLevelsVocabulary())));
159
		map.addAttribute("browseFields", gson.toJson(serviceLocator.getService(DatasourceManagerService.class).listBrowsableFields()));
160
		map.addAttribute("validatorAddress", getValidatorAddress());
161
		map.addAttribute("validatorServiceAddress", getValidatorServiceAddress());
162
	}
163

    
164
	public String getCompatibilityLevelsVocabulary() {
165
		return compatibilityLevelsVocabulary;
166
	}
167

    
168
	@Required
169
	public void setCompatibilityLevelsVocabulary(final String compatibilityLevelsVocabulary) {
170
		this.compatibilityLevelsVocabulary = compatibilityLevelsVocabulary;
171
	}
172

    
173
	public String getValidatorAddress() {
174
		return validatorAddress;
175
	}
176

    
177
	@Required
178
	public void setValidatorAddress(final String validatorAddress) {
179
		this.validatorAddress = validatorAddress;
180
	}
181

    
182
	public String getValidatorServiceAddress() {
183
		return validatorServiceAddress;
184
	}
185

    
186
	@Required
187
	public void setValidatorServiceAddress(final String validatorServiceAddress) {
188
		this.validatorServiceAddress = validatorServiceAddress;
189
	}
190

    
191
}
(3-3/7)