Project

General

Profile

1
package eu.dnetlib.openaire.directindex.api;
2

    
3
import java.io.StringWriter;
4
import java.util.*;
5
import java.util.stream.Collectors;
6
import java.util.stream.Collectors;
7

    
8
import com.google.common.base.Function;
9
import com.google.common.collect.Lists;
10
import eu.dnetlib.miscutils.functional.hash.Hashing;
11
import eu.dnetlib.openaire.directindex.objects.ZenodoContextList;
12
import org.apache.commons.lang.StringUtils;
13
import org.springframework.web.client.RestClientException;
14
import org.springframework.web.client.RestTemplate;
15

    
16
/**
17
 * Created by michele on 15/01/16.
18
 */
19
public class OpenAIRESubmitterUtils {
20

    
21
	private static final org.apache.commons.logging.Log log = org.apache.commons.logging.LogFactory.getLog(OpenAIRESubmitterUtils.class);
22
	private static final String ZENODO_COMMUNITY = "zenodo.org/communities/";
23
	private String community_api;
24
	public OpenAIRESubmitterUtils(String community_api){
25
		this.community_api = community_api;
26
	}
27

    
28
	public Map<String, String> calculateProjectInfo(final String link) {
29
		final Map<String, String> info = new HashMap<String, String>();
30
		final String[] arr = link.split("/");
31
		// info:eu-repo/grantAgreement/EC/FP7/244909/EU/Making Capabilities Work/WorkAble
32

    
33
		if (arr.length > 4) {
34
			final String acronym = arr.length > 7 ? arr[7] : "";
35
			final String title = arr.length > 6 ? StringUtils.isNotBlank(arr[6]) ? arr[6] : acronym : "";
36
			final String jurisdiction = arr.length > 5 ? arr[5] : "";
37
			final String funderId = calculateFunderId(arr[2], arr[3]);
38
			info.put("id", calculateProjectId(arr[2], arr[3], arr[4]));
39
			info.put("funderShortName", fixFunderShortName(arr[2]));
40
			info.put("fundingName", arr[3]);
41
			info.put("code", unescape(arr[4]));
42
			info.put("jurisdiction", jurisdiction);
43
			info.put("title", title);
44
			info.put("acronym", acronym);
45
			info.put("funderId", funderId);
46
			info.put("funderName", calculateFunderName(arr[2]));
47
			if(StringUtils.isNotBlank(arr[3])) info.put("fundingId", funderId + "::" + arr[3]);
48
		}
49
		return info;
50
	}
51

    
52
	//TODO: remove me when Zenodo ingests the good UKRI projects
53
	protected String fixFunderShortName(final String funderShortName){
54
		switch(funderShortName){
55
			case "RCUK":
56
				return "UKRI";
57
			default:
58
				return funderShortName;
59
		}
60
	}
61

    
62
	protected String calculateFunderPrefix(final String funderShortName, final String funding){
63
		switch(funderShortName.toLowerCase()){
64
		case "conicyt":
65
			return "conicytf____::";
66
		case "dfg":
67
			return "dfgf________::";
68
		case "ec":
69
			if (funding.equalsIgnoreCase("fp7")) {
70
				return "corda_______::";
71
			} else {
72
				return "corda__h2020::";
73
			}
74
		case "eea":
75
			return "euenvagency_::";
76
		case "hrzz":
77
		case "mzos":
78
			return "irb_hr______::";
79
		case "tara":
80
			return "taraexp_____::";
81
		case "tubitak":
82
			return "tubitakf____::";
83
			case "rcuk":
84
				return "ukri________::";
85
		default:
86
			String prefix = funderShortName.toLowerCase();
87
			//ensure we have 12 chars
88
			while(prefix.length() < 12) prefix += "_";
89
			return prefix +"::";
90
		}
91
	}
92

    
93
	protected String calculateProjectId(final String funderShortName, final String funding, final String code) {
94
		final String suffix = Hashing.md5(unescape(code));
95
		//final String suffix = Hashing.md5(code);
96
		final String funderPrefix = calculateFunderPrefix(funderShortName, funding);
97
		return funderPrefix + suffix;
98
	}
99

    
100
	private String unescape(String code) {
101
		return StringUtils.replaceChars(code, "%2F", "/");
102
	}
103

    
104
	protected String calculateFunderId(final String funderShortName, final String funding) {
105
		switch (funderShortName.toLowerCase()) {
106
		case "ec":
107
			return "ec__________::EC";
108
		default:
109
			String fixedFunderShortName = fixFunderShortName(funderShortName);
110
			String prefix = calculateFunderPrefix(fixedFunderShortName, funding);
111
			return prefix + fixedFunderShortName.toUpperCase();
112
		}
113
	}
114

    
115

    
116
	protected String calculateFunderName(final String funderShortName) {
117

    
118
		switch (funderShortName.toLowerCase()) {
119
		case "aff":
120
		case "aka":
121
			return "Academy of Finland";
122
		case "anr":
123
			return "French National Research Agency (ANR)";
124
		case "arc":
125
			return "Australian Research Council (ARC)";
126
		case "cihr":
127
			return "Canadian Institutes of Health Research";
128
		case "conicyt":
129
			return "Comisión Nacional de Investigación Científica y Tecnológica";
130
		case "dfg":
131
			return "Deutsche Forschungsgemeinschaft";
132
		case "ec":
133
			return "European Commission";
134
		case "eea":
135
			return "European Environment Agency";
136
		case "fct":
137
			return "Fundação para a Ciência e a Tecnologia, I.P.";
138
		case "fwf":
139
			return "Austrian Science Fund (FWF)";
140
		case "gsrt":
141
			return "General Secretariat of Research and Technology (GSRT)";
142
		case "hrzz":
143
			return "Croatian Science Foundation (CSF)";
144
		case "innoviris":
145
			return "INNOVIRIS";
146
		case "mestd":
147
			return "Ministry of Education, Science and Technological Development of Republic of Serbia";
148
		case "miur":
149
			return "Ministero dell'Istruzione dell'Università e della Ricerca";
150
		case "mzos":
151
			return "Ministry of Science, Education and Sports of the Republic of Croatia (MSES)";
152
		case "nhmrc":
153
			return "National Health and Medical Research Council (NHMRC)";
154
		case "nih":
155
			return "National Institutes of Health";
156
		case "nsf":
157
			return "National Science Foundation";
158
		case "nserc":
159
			return "Natural Sciences and Engineering Research Council of Canada";
160
		case "nwo":
161
			return "Netherlands Organisation for Scientific Research (NWO)";
162
		case "rcuk":
163
			case "ukri":
164
			return "UK Research and Innovation";
165
		case "rif":
166
		case "rpf":
167
			return "Research and Innovation Foundation";
168
		case "rsf":
169
			return "Russian Science Foundation";
170
		case "sfi":
171
			return "Science Foundation Ireland";
172
		case "sgov":
173
			return "Gobierno de España";
174
		case "snsf":
175
			return "Swiss National Science Foundation";
176
		case "sshrc":
177
			return "Social Sciences and Humanities Research Council";
178
		case "tara":
179
			return "Tara Expeditions Foundation";
180
		case "tubitak":
181
			return "Türkiye Bilimsel ve Teknolojik Araştırma Kurumu";
182
		case "wt":
183
			return "Wellcome Trust";
184
		default:
185
			log.error("Funder short name '"+funderShortName+"' not managed");
186
			return "";
187
		}
188
	}
189

    
190
	private List<String> filterContexts(List<String> contexts){
191

    
192
		List<String> zenodoContexts
193
				= contexts.stream()
194
				.map(c -> {
195
					if(c.contains(ZENODO_COMMUNITY))
196
						return c.substring(c.lastIndexOf("/")+1);
197
					return null;
198
				}).collect(Collectors.toList());
199

    
200
		if (zenodoContexts.size()>0){
201
			contexts = contexts.stream().filter(c -> !c.contains(ZENODO_COMMUNITY)).collect(Collectors.toList());
202
			RestTemplate rt = new RestTemplate();
203
			Set<String> zenodoOpenAIRE = new HashSet<>();
204
			for (String context: zenodoContexts){
205
				//String ct = context.substring(context.lastIndexOf("/")+1);
206
				try{
207
					zenodoOpenAIRE.addAll(rt.getForObject(community_api +context+"/openairecommunities", ZenodoContextList.class).getOpenAirecommunitylist());
208
				}catch(RestClientException rce){
209
					log.error("Unable to get object for " + community_api +context+"/openairecommunities");
210
				}
211

    
212

    
213
			}
214
			contexts.addAll(zenodoOpenAIRE);
215
		}
216

    
217
		return contexts;
218

    
219
	}
220
	public List<ContextInfo> processContexts(final List<String> list) {
221
		//filterContexts(list);
222
		return Lists.newArrayList(Lists.transform(filterContexts(list), new Function<String, ContextInfo>() {
223

    
224
			@Override
225
			public ContextInfo apply(final String s) {
226
				return createContextInfo(s.split("::"), 0);
227
			}
228

    
229
			private ContextInfo createContextInfo(final String[] arr, final int pos) {
230
				final StringWriter id = new StringWriter();
231
				id.write(arr[0]);
232
				for (int i = 0; i < pos; i++) {
233
					id.write("::");
234
					id.write(arr[i + 1]);
235
				}
236
				final String elem = (pos == 0) ? "context" : (pos == 1) ? "category" : "concept";
237
				final ContextInfo info = new ContextInfo(elem, id.toString());
238
				if ((pos + 1) < arr.length) {
239
					info.getChildren().add(createContextInfo(arr, pos + 1));
240
				}
241
				return info;
242
			}
243
		}));
244

    
245
	}
246

    
247
	public class ContextInfo {
248

    
249
		private String elem;
250
		private String id;
251
		private List<ContextInfo> children = new ArrayList<ContextInfo>();
252

    
253
		public ContextInfo(final String elem,
254
				final String id) {
255
			this.elem = elem;
256
			this.id = id;
257
		}
258

    
259
		public String getElem() {
260
			return elem;
261
		}
262

    
263
		public void setElem(final String elem) {
264
			this.elem = elem;
265
		}
266

    
267
		public String getId() {
268
			return id;
269
		}
270

    
271
		public void setId(final String id) {
272
			this.id = id;
273
		}
274

    
275
		public List<ContextInfo> getChildren() {
276
			return children;
277
		}
278

    
279
		public void setChildren(final List<ContextInfo> children) {
280
			this.children = children;
281
		}
282

    
283
		public boolean isRoot() {
284
			return elem.equals("context");
285
		}
286
	}
287
}
(5-5/8)