Project

General

Profile

1
package eu.dnetlib.msro.openaireplus.workflows.nodes.hostedby;
2

    
3
import java.io.StringReader;
4
import java.util.Map;
5
import javax.annotation.Resource;
6
import javax.xml.ws.wsaddressing.W3CEndpointReference;
7

    
8
import com.google.common.collect.Maps;
9
import com.googlecode.sarasvati.Arc;
10
import com.googlecode.sarasvati.NodeToken;
11
import eu.dnetlib.enabling.database.rmi.DatabaseException;
12
import eu.dnetlib.enabling.database.rmi.DatabaseService;
13
import eu.dnetlib.enabling.locators.UniqueServiceLocator;
14
import eu.dnetlib.enabling.resultset.MappedResultSetFactory;
15
import eu.dnetlib.enabling.resultset.client.ResultSetClientFactory;
16
import eu.dnetlib.enabling.resultset.client.utils.EPRUtils;
17
import eu.dnetlib.msro.workflows.nodes.SimpleJobNode;
18
import org.apache.commons.lang.StringUtils;
19
import org.apache.commons.logging.Log;
20
import org.apache.commons.logging.LogFactory;
21
import org.dom4j.Document;
22
import org.dom4j.DocumentException;
23
import org.dom4j.io.SAXReader;
24
import org.springframework.beans.factory.annotation.Required;
25
import org.springframework.beans.factory.annotation.Value;
26

    
27
public class PatchHostedByJobNode extends SimpleJobNode {
28

    
29
	private static final Log log = LogFactory.getLog(PatchHostedByJobNode.class);
30
	private String inputEprParam;
31
	private String outputEprParam;
32
	@Value("${dnet.openaire.db.name}")
33
	private String dbName;
34
	private String countersParam;
35
	private String hostedbyMapTable;
36
	private String xpathEntry;
37
	private String overrideDataSourceId;
38
	private String keyTypeFilter;
39
	@Resource
40
	private UniqueServiceLocator serviceLocator;
41
	private MappedResultSetFactory mappedResultSetFactory;
42
	private ResultSetClientFactory resultSetClientFactory;
43

    
44
	/**
45
	 * {@inheritDoc}
46
	 */
47
	@Override
48
	protected String execute(final NodeToken token) throws Exception {
49
		final W3CEndpointReference inputEpr = new EPRUtils().getEpr(token.getEnv().getAttribute(inputEprParam));
50
		final HostedByCounters counters = new HostedByCounters();
51
		String datasourceId;
52
		if (StringUtils.isEmpty(overrideDataSourceId)) {
53
			datasourceId = token.getEnv().getAttribute("parentDatasourceId");
54
		} else {
55
			datasourceId = getOverrideDataSourceId();
56
		}
57

    
58
		Map<String, HostedByEntry> hostedByEntryMap;
59

    
60
		if (!StringUtils.isBlank(keyTypeFilter))
61
			hostedByEntryMap = loadHostedByMapFromType(keyTypeFilter);
62
		else
63
			hostedByEntryMap = loadHostedByMap(datasourceId);
64

    
65
		final W3CEndpointReference epr = mappedResultSetFactory.createMappedResultSet(inputEpr, new PatchHostedBy(hostedByEntryMap,
66
				getXpathEntry(), counters));
67

    
68
		token.getEnv().setAttribute(outputEprParam, epr.toString());
69
		token.getEnv().setTransientAttribute(countersParam, counters);
70

    
71
		return Arc.DEFAULT_ARC;
72
	}
73

    
74
	private Map<String, HostedByEntry> loadHostedByMap(final String datasourceId) throws DocumentException, DatabaseException {
75
		final String sql = "SELECT d.id, d.officialname, p.entry from %s p JOIN datasources d ON (p.datasourceid = d.id) WHERE p.oa_source_id= '%s'";
76
		return getHostedByEntryMapByQuery(datasourceId, sql);
77
	}
78

    
79
	private Map<String, HostedByEntry> loadHostedByMapFromType(final String keyType) throws DocumentException, DatabaseException {
80
		final String sql = "SELECT d.id, d.officialname, p.entry from %s p JOIN datasources d ON (p.datasourceid = d.id) WHERE p.key_type= '%s'";
81
		return getHostedByEntryMapByQuery(keyType, sql);
82
	}
83

    
84
	private Map<String, HostedByEntry> getHostedByEntryMapByQuery(final String datasourceId, final String sql)
85
			throws DatabaseException, DocumentException {
86
		final Map<String, HostedByEntry> map = Maps.newHashMap();
87
		final W3CEndpointReference epr = serviceLocator.getService(DatabaseService.class).searchSQL(getDbName(),
88
				String.format(sql, getHostedbyMapTable(), datasourceId));
89
		final SAXReader reader = new SAXReader();
90
		for (String s : resultSetClientFactory.getClient(epr)) {
91
			final Document doc = reader.read(new StringReader(s));
92
			final String entry = doc.valueOf("//FIELD[@name='entry']");
93
			final String dsId = doc.valueOf("//FIELD[@name='id']");
94
			final String dsName = doc.valueOf("//FIELD[@name='officialname']");
95
			map.put(entry, new HostedByEntry(dsId, dsName));
96
		}
97
		log.info(String.format("built hostedByMap from dsId '%s', size: '%s'", datasourceId, map.size()));
98
		return map;
99
	}
100

    
101
	/**
102
	 * Getter for property 'inputEprParam'.
103
	 *
104
	 * @return Value for property 'inputEprParam'.
105
	 */
106
	public String getInputEprParam() {
107
		return inputEprParam;
108
	}
109

    
110
	/**
111
	 * Setter for property 'inputEprParam'.
112
	 *
113
	 * @param inputEprParam Value to set for property 'inputEprParam'.
114
	 */
115
	public void setInputEprParam(final String inputEprParam) {
116
		this.inputEprParam = inputEprParam;
117
	}
118

    
119
	/**
120
	 * Getter for property 'outputEprParam'.
121
	 *
122
	 * @return Value for property 'outputEprParam'.
123
	 */
124
	public String getOutputEprParam() {
125
		return outputEprParam;
126
	}
127

    
128
	/**
129
	 * Setter for property 'outputEprParam'.
130
	 *
131
	 * @param outputEprParam Value to set for property 'outputEprParam'.
132
	 */
133
	public void setOutputEprParam(final String outputEprParam) {
134
		this.outputEprParam = outputEprParam;
135
	}
136

    
137
	/**
138
	 * Getter for property 'dbName'.
139
	 *
140
	 * @return Value for property 'dbName'.
141
	 */
142
	public String getDbName() {
143
		return dbName;
144
	}
145

    
146
	/**
147
	 * Setter for property 'dbName'.
148
	 *
149
	 * @param dbName Value to set for property 'dbName'.
150
	 */
151
	public void setDbName(final String dbName) {
152
		this.dbName = dbName;
153
	}
154

    
155
	public String getKeyTypeFilter() {
156
		return keyTypeFilter;
157
	}
158

    
159
	public void setKeyTypeFilter(final String keyTypeFilter) {
160
		this.keyTypeFilter = keyTypeFilter;
161
	}
162

    
163
	/**
164
	 * Getter for property 'mappedResultSetFactory'.
165
	 *
166
	 * @return Value for property 'mappedResultSetFactory'.
167
	 */
168
	public MappedResultSetFactory getMappedResultSetFactory() {
169
		return mappedResultSetFactory;
170
	}
171

    
172
	/**
173
	 * Setter for property 'mappedResultSetFactory'.
174
	 *
175
	 * @param mappedResultSetFactory Value to set for property 'mappedResultSetFactory'.
176
	 */
177
	@Required
178
	public void setMappedResultSetFactory(final MappedResultSetFactory mappedResultSetFactory) {
179
		this.mappedResultSetFactory = mappedResultSetFactory;
180
	}
181

    
182
	/**
183
	 * Getter for property 'resultSetClientFactory'.
184
	 *
185
	 * @return Value for property 'resultSetClientFactory'.
186
	 */
187
	public ResultSetClientFactory getResultSetClientFactory() {
188
		return resultSetClientFactory;
189
	}
190

    
191
	/**
192
	 * Setter for property 'resultSetClientFactory'.
193
	 *
194
	 * @param resultSetClientFactory Value to set for property 'resultSetClientFactory'.
195
	 */
196
	@Required
197
	public void setResultSetClientFactory(final ResultSetClientFactory resultSetClientFactory) {
198
		this.resultSetClientFactory = resultSetClientFactory;
199
	}
200

    
201
	/**
202
	 * Getter for property 'countersParam'.
203
	 *
204
	 * @return Value for property 'countersParam'.
205
	 */
206
	public String getCountersParam() {
207
		return countersParam;
208
	}
209

    
210
	/**
211
	 * Setter for property 'countersParam'.
212
	 *
213
	 * @param countersParam Value to set for property 'countersParam'.
214
	 */
215
	public void setCountersParam(final String countersParam) {
216
		this.countersParam = countersParam;
217
	}
218

    
219
	/**
220
	 * @return the hostedbyMapTable
221
	 */
222
	public String getHostedbyMapTable() {
223
		return hostedbyMapTable;
224
	}
225

    
226
	/**
227
	 * @param hostedbyMapTable the hostedbyMapTable to set
228
	 */
229
	public void setHostedbyMapTable(final String hostedbyMapTable) {
230
		this.hostedbyMapTable = hostedbyMapTable;
231
	}
232

    
233
	public String getXpathEntry() {
234
		return xpathEntry;
235
	}
236

    
237
	public void setXpathEntry(final String xpathEntry) {
238
		this.xpathEntry = xpathEntry;
239
	}
240

    
241
	/**
242
	 * @return the overrideDataSourceId
243
	 */
244
	public String getOverrideDataSourceId() {
245
		return overrideDataSourceId;
246
	}
247

    
248
	/**
249
	 * @param overrideDataSourceId the overrideDataSourceId to set
250
	 */
251
	public void setOverrideDataSourceId(final String overrideDataSourceId) {
252
		this.overrideDataSourceId = overrideDataSourceId;
253
	}
254
}
(5-5/7)