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", arr[2]);
40
			info.put("fundingName", arr[3]);
41
			info.put("code", 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
			info.put("fundingId", funderId + "::" + arr[3]);
48
		}
49
		return info;
50
	}
51

    
52
	protected String calculateFunderPrefix(final String funderShortName, final String funding){
53
		switch(funderShortName.toLowerCase()){
54
		case "conicyt":
55
			return "conicytf____::";
56
		case "dfg":
57
			return "dfgf________::";
58
		case "ec":
59
			if (funding.equalsIgnoreCase("fp7")) {
60
				return "corda_______::";
61
			} else {
62
				return "corda__h2020::";
63
			}
64
		case "eea":
65
			return "euenvagency_::";
66
		case "hrzz":
67
		case "mzos":
68
			return "irb_hr______::";
69
		case "tara":
70
			return "taraexp_____::";
71
		case "tubitak":
72
			return "tubitakf____::";
73
			case "rcuk":
74
				return "ukri________";
75
		default:
76
			String prefix = funderShortName.toLowerCase();
77
			//ensure we have 12 chars
78
			while(prefix.length() < 12) prefix += "_";
79
			return prefix +"::";
80
		}
81
	}
82

    
83
	protected String calculateProjectId(final String funderShortName, final String funding, final String code) {
84
		final String suffix = Hashing.md5(code);
85
		final String funderPrefix = calculateFunderPrefix(funderShortName, funding);
86
		return funderPrefix + suffix;
87
	}
88

    
89
	protected String calculateFunderId(final String funderShortName, final String funding) {
90
		switch (funderShortName.toLowerCase()) {
91
		case "ec":
92
			return "ec__________::EC";
93
		default:
94
			String prefix = calculateFunderPrefix(funderShortName, funding);
95
			return prefix + funderShortName.toUpperCase();
96
		}
97
	}
98

    
99

    
100
	protected String calculateFunderName(final String funderShortName) {
101

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

    
174
	private List<String> filterContexts(List<String> contexts){
175

    
176
		List<String> zenodoContexts
177
				= contexts.stream()
178
				.map(c -> {
179
					if(c.contains(ZENODO_COMMUNITY))
180
						return c.substring(c.lastIndexOf("/")+1);
181
					return null;
182
				}).collect(Collectors.toList());
183

    
184
		if (zenodoContexts.size()>0){
185
			contexts = contexts.stream().filter(c -> !c.contains(ZENODO_COMMUNITY)).collect(Collectors.toList());
186
			RestTemplate rt = new RestTemplate();
187
			Set<String> zenodoOpenAIRE = new HashSet<>();
188
			for (String context: zenodoContexts){
189
				//String ct = context.substring(context.lastIndexOf("/")+1);
190
				try{
191
					zenodoOpenAIRE.addAll(rt.getForObject(community_api +context+"/openairecommunities", ZenodoContextList.class).getOpenAirecommunitylist());
192
				}catch(RestClientException rce){
193
					log.error("Unable to get object for " + community_api +context+"/openairecommunities");
194
				}
195

    
196

    
197
			}
198
			contexts.addAll(zenodoOpenAIRE);
199
		}
200

    
201
		return contexts;
202

    
203
	}
204
	public List<ContextInfo> processContexts(final List<String> list) {
205
		//filterContexts(list);
206
		return Lists.newArrayList(Lists.transform(filterContexts(list), new Function<String, ContextInfo>() {
207

    
208
			@Override
209
			public ContextInfo apply(final String s) {
210
				return createContextInfo(s.split("::"), 0);
211
			}
212

    
213
			private ContextInfo createContextInfo(final String[] arr, final int pos) {
214
				final StringWriter id = new StringWriter();
215
				id.write(arr[0]);
216
				for (int i = 0; i < pos; i++) {
217
					id.write("::");
218
					id.write(arr[i + 1]);
219
				}
220
				final String elem = (pos == 0) ? "context" : (pos == 1) ? "category" : "concept";
221
				final ContextInfo info = new ContextInfo(elem, id.toString());
222
				if ((pos + 1) < arr.length) {
223
					info.getChildren().add(createContextInfo(arr, pos + 1));
224
				}
225
				return info;
226
			}
227
		}));
228

    
229
	}
230

    
231
	public class ContextInfo {
232

    
233
		private String elem;
234
		private String id;
235
		private List<ContextInfo> children = new ArrayList<ContextInfo>();
236

    
237
		public ContextInfo(final String elem,
238
				final String id) {
239
			this.elem = elem;
240
			this.id = id;
241
		}
242

    
243
		public String getElem() {
244
			return elem;
245
		}
246

    
247
		public void setElem(final String elem) {
248
			this.elem = elem;
249
		}
250

    
251
		public String getId() {
252
			return id;
253
		}
254

    
255
		public void setId(final String id) {
256
			this.id = id;
257
		}
258

    
259
		public List<ContextInfo> getChildren() {
260
			return children;
261
		}
262

    
263
		public void setChildren(final List<ContextInfo> children) {
264
			this.children = children;
265
		}
266

    
267
		public boolean isRoot() {
268
			return elem.equals("context");
269
		}
270
	}
271
}
(5-5/8)