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.RestTemplate;
14

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

    
20
	private static final org.apache.commons.logging.Log log = org.apache.commons.logging.LogFactory.getLog(OpenAIRESubmitterUtils.class);
21
	private static final String ZENODO_COMMUNITY = "zenodo.org/communities/";
22
	public Map<String, String> calculateProjectInfo(final String link) {
23
		final Map<String, String> info = new HashMap<String, String>();
24
		final String[] arr = link.split("/");
25
		// info:eu-repo/grantAgreement/EC/FP7/244909/EU/Making Capabilities Work/WorkAble
26

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

    
46
	protected String calculateFunderPrefix(final String funderShortName, final String funding){
47
		switch(funderShortName.toLowerCase()){
48
		case "conicyt":
49
			return "conicytf____::";
50
		case "ec":
51
			if (funding.equalsIgnoreCase("fp7")) {
52
				return "corda_______::";
53
			} else {
54
				return "corda__h2020::";
55
			}
56
		case "hrzz":
57
		case "mzos":
58
			return "irb_hr______::";
59
		case "tara":
60
			return "taraexp_____::";
61
		case "tubitak":
62
			return "tubitakf____::";
63
		default:
64
			String prefix = funderShortName.toLowerCase();
65
			//ensure we have 12 chars
66
			while(prefix.length() < 12) prefix += "_";
67
			return prefix +"::";
68
		}
69
	}
70

    
71
	protected String calculateProjectId(final String funderShortName, final String funding, final String code) {
72
		final String suffix = Hashing.md5(code);
73
		final String funderPrefix = calculateFunderPrefix(funderShortName, funding);
74
		return funderPrefix + suffix;
75
	}
76

    
77
	protected String calculateFunderId(final String funderShortName, final String funding) {
78
		switch (funderShortName.toLowerCase()) {
79
		case "ec":
80
			return "ec__________::EC";
81
		default:
82
			String prefix = calculateFunderPrefix(funderShortName, funding);
83
			return prefix + funderShortName.toUpperCase();
84
		}
85
	}
86

    
87

    
88
	protected String calculateFunderName(final String funderShortName) {
89

    
90
		switch (funderShortName.toLowerCase()) {
91
		case "aff":
92
		case "aka":
93
			return "Academy of Finland";
94
		case "arc":
95
			return "Australian Research Council (ARC)";
96
		case "conicyt":
97
			return "Comisión Nacional de Investigación Científica y Tecnológica";
98
		case "ec":
99
			return "European Commission";
100
		case "fct":
101
			return "Fundação para a Ciência e a Tecnologia, I.P.";
102
		case "fwf":
103
			return "Austrian Science Fund (FWF)";
104
		case "hrzz":
105
			return "Croatian Science Foundation (CSF)";
106
		case "mestd":
107
			return "Ministry of Education, Science and Technological Development of Republic of Serbia";
108
		case "miur":
109
			return "Ministero dell'Istruzione dell'Università e della Ricerca";
110
		case "mzos":
111
			return "Ministry of Science, Education and Sports of the Republic of Croatia (MSES)";
112
		case "nhmrc":
113
			return "National Health and Medical Research Council (NHMRC)";
114
		case "nih":
115
			return "National Institutes of Health";
116
		case "nsf":
117
			return "National Science Foundation";
118
		case "nwo":
119
			return "Netherlands Organisation for Scientific Research (NWO)";
120
		case "rcuk":
121
			return "Research Council UK";
122
		case "sfi":
123
			return "Science Foundation Ireland";
124
		case "sgov":
125
			return "Gobierno de España";
126
		case "snsf":
127
			return "Swiss National Science Foundation";
128
		case "tara":
129
			return "Tara Expeditions Foundation";
130
		case "tubitak":
131
			return "Türkiye Bilimsel ve Teknolojik Araştırma Kurumu";
132
		case "wt":
133
			return "Wellcome Trust";
134
			case "rpf":
135
				return "Research Promotion Foundation";
136
			case "gsrt":
137
				return "General Secretariat for Research and Technology";
138
		default:
139
			log.error("Funder short name '"+funderShortName+"' not managed");
140
			return "";
141
		}
142
	}
143

    
144
	private List<String> filterContexts(List<String> contexts){
145

    
146
		List<String> zenodoContexts
147
				= contexts.stream()
148
				.map(c -> {
149
					if(c.contains(ZENODO_COMMUNITY))
150
						return c.substring(c.lastIndexOf("/")+1);
151
					return null;
152
				}).collect(Collectors.toList());
153

    
154
//		for(String c:contexts){
155
//			if(c.contains(ZENODO_COMMUNITY)){
156
//				zenodoContexts.add(c.substring(c.lastIndexOf("/")+1));
157
//			}
158
//		}
159
		if (zenodoContexts.size()>0){
160
			contexts = contexts.stream().filter(c -> !c.contains("https://zenodo.org/communities/")).collect(Collectors.toList());
161
			RestTemplate rt = new RestTemplate();
162
			Set<String> zenodoOpenAIRE = new HashSet<>();
163
			for (String context: zenodoContexts){
164
				//String ct = context.substring(context.lastIndexOf("/")+1);
165
				zenodoOpenAIRE.addAll(rt.getForObject("http://beta.services.openaire.eu/openaire/community/"+context+"/openairecommunities", ZenodoContextList.class).getOpenAirecommunitylist());
166

    
167
			}
168
			contexts.addAll(zenodoOpenAIRE);
169
		}
170

    
171
		return contexts;
172

    
173
	}
174
	public List<ContextInfo> processContexts(final List<String> list) {
175
		filterContexts(list);
176
		return Lists.newArrayList(Lists.transform(filterContexts(list), new Function<String, ContextInfo>() {
177

    
178
			@Override
179
			public ContextInfo apply(final String s) {
180
				return createContextInfo(s.split("::"), 0);
181
			}
182

    
183
			private ContextInfo createContextInfo(final String[] arr, final int pos) {
184
				final StringWriter id = new StringWriter();
185
				id.write(arr[0]);
186
				for (int i = 0; i < pos; i++) {
187
					id.write("::");
188
					id.write(arr[i + 1]);
189
				}
190
				final String elem = (pos == 0) ? "context" : (pos == 1) ? "category" : "concept";
191
				final ContextInfo info = new ContextInfo(elem, id.toString());
192
				if ((pos + 1) < arr.length) {
193
					info.getChildren().add(createContextInfo(arr, pos + 1));
194
				}
195
				return info;
196
			}
197
		}));
198

    
199
	}
200

    
201
	public class ContextInfo {
202

    
203
		private String elem;
204
		private String id;
205
		private List<ContextInfo> children = new ArrayList<ContextInfo>();
206

    
207
		public ContextInfo(final String elem,
208
				final String id) {
209
			this.elem = elem;
210
			this.id = id;
211
		}
212

    
213
		public String getElem() {
214
			return elem;
215
		}
216

    
217
		public void setElem(final String elem) {
218
			this.elem = elem;
219
		}
220

    
221
		public String getId() {
222
			return id;
223
		}
224

    
225
		public void setId(final String id) {
226
			this.id = id;
227
		}
228

    
229
		public List<ContextInfo> getChildren() {
230
			return children;
231
		}
232

    
233
		public void setChildren(final List<ContextInfo> children) {
234
			this.children = children;
235
		}
236

    
237
		public boolean isRoot() {
238
			return elem.equals("context");
239
		}
240
	}
241
}
(5-5/8)