Project

General

Profile

« Previous | Next » 

Revision 61341

When the label of the context cannot be resolved, the context tag is not added.
To ensure tests do not make any external calls, the code has been refactored so that the proper mock could be defined.

View differences:

OpenAIRESubmitterUtils.java
4 4
import java.util.*;
5 5
import java.util.stream.Collectors;
6 6
import java.util.stream.Collectors;
7
import java.util.stream.Stream;
7 8

  
8 9
import com.google.common.base.Function;
9 10
import com.google.common.collect.Lists;
11
import com.google.common.collect.Sets;
12
import eu.dnetlib.enabling.is.lookup.rmi.ISLookUpException;
13
import eu.dnetlib.enabling.is.lookup.rmi.ISLookUpService;
10 14
import eu.dnetlib.miscutils.functional.hash.Hashing;
15
import eu.dnetlib.openaire.directindex.objects.DatasourceEntry;
11 16
import eu.dnetlib.openaire.directindex.objects.ZenodoContextList;
12 17
import org.apache.commons.lang.StringUtils;
13 18
import org.springframework.web.client.RestClientException;
......
18 23
 */
19 24
public class OpenAIRESubmitterUtils {
20 25

  
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
	}
26
    private static final org.apache.commons.logging.Log log = org.apache.commons.logging.LogFactory.getLog(OpenAIRESubmitterUtils.class);
27
    private static final String ZENODO_COMMUNITY = "zenodo.org/communities/";
28
    private String community_api;
27 29

  
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
30
    public OpenAIRESubmitterUtils(String community_api) {
31
        this.community_api = community_api;
32
    }
32 33

  
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
	}
34
    public Map<String, String> calculateProjectInfo(final String link) {
35
        final Map<String, String> info = new HashMap<String, String>();
36
        final String[] arr = link.split("/");
37
        // info:eu-repo/grantAgreement/EC/FP7/244909/EU/Making Capabilities Work/WorkAble
51 38

  
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
	}
39
        if (arr.length > 4) {
40
            final String acronym = arr.length > 7 ? arr[7] : "";
41
            final String title = arr.length > 6 ? StringUtils.isNotBlank(arr[6]) ? arr[6] : acronym : "";
42
            final String jurisdiction = arr.length > 5 ? arr[5] : "";
43
            final String funderId = calculateFunderId(arr[2], arr[3]);
44
            info.put("id", calculateProjectId(arr[2], arr[3], arr[4]));
45
            info.put("funderShortName", fixFunderShortName(arr[2]));
46
            info.put("fundingName", arr[3]);
47
            info.put("code", unescape(arr[4]));
48
            info.put("jurisdiction", jurisdiction);
49
            info.put("title", title);
50
            info.put("acronym", acronym);
51
            info.put("funderId", funderId);
52
            info.put("funderName", calculateFunderName(arr[2]));
53
            if (StringUtils.isNotBlank(arr[3])) info.put("fundingId", funderId + "::" + arr[3]);
54
        }
55
        return info;
56
    }
61 57

  
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
	}
58
    //TODO: remove me when Zenodo ingests the good UKRI projects
59
    protected String fixFunderShortName(final String funderShortName) {
60
        switch (funderShortName) {
61
            case "RCUK":
62
                return "UKRI";
63
            default:
64
                return funderShortName;
65
        }
66
    }
92 67

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

  
100
	private String unescape(String code) {
101
		return StringUtils.replaceChars(code, "%2F", "/");
102
	}
99
    protected String calculateProjectId(final String funderShortName, final String funding, final String code) {
100
        final String suffix = Hashing.md5(unescape(code));
101
        //final String suffix = Hashing.md5(code);
102
        final String funderPrefix = calculateFunderPrefix(funderShortName, funding);
103
        return funderPrefix + suffix;
104
    }
103 105

  
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
	}
106
    private String unescape(String code) {
107
        return StringUtils.replaceChars(code, "%2F", "/");
108
    }
114 109

  
110
    protected String calculateFunderId(final String funderShortName, final String funding) {
111
        switch (funderShortName.toLowerCase()) {
112
            case "ec":
113
                return "ec__________::EC";
114
            default:
115
                String fixedFunderShortName = fixFunderShortName(funderShortName);
116
                String prefix = calculateFunderPrefix(fixedFunderShortName, funding);
117
                return prefix + fixedFunderShortName.toUpperCase();
118
        }
119
    }
115 120

  
116
	protected String calculateFunderName(final String funderShortName) {
117 121

  
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
	}
122
    protected String calculateFunderName(final String funderShortName) {
189 123

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

  
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());
196
    public Collection<String> translateZenodoCommunity(final String community) {
197
        if (community.contains(ZENODO_COMMUNITY)) {
198
            String context = community.substring(community.lastIndexOf("/") + 1);
199
            RestTemplate rt = new RestTemplate();
200
            try {
201
                return new HashSet<>(rt.getForObject(community_api + context + "/openairecommunities", ZenodoContextList.class)
202
                        .getOpenAirecommunitylist());
203
            } catch (RestClientException rce) {
204
                log.error("Unable to get object for " + community_api + context + "/openairecommunities");
205
                return new HashSet<>();
206
            }
207
        } else return Sets.newHashSet(community);
208
    }
199 209

  
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
				}
210
    private ContextInfo createContextInfo(final String[] arr, final int pos, Map<String, String> labelMap) {
211
        final StringWriter id = new StringWriter();
212
        id.write(arr[0]);
213
        for (int i = 0; i < pos; i++) {
214
            id.write("::");
215
            id.write(arr[i + 1]);
216
        }
217
        final String label = labelMap.get(id.toString());
218
        final String elem = (pos == 0) ? "context" : (pos == 1) ? "category" : "concept";
219
        final ContextInfo info = new ContextInfo(elem, id.toString(), label);
220
        if ((pos + 1) < arr.length) {
221
            info.getChildren().add(createContextInfo(arr, pos + 1, labelMap));
222
        }
223
        return info;
224
    }
211 225

  
226
    public List<ContextInfo> processContexts(final List<String> zenodoCommunities, final Map<String, String> labelMap) {
227
        return zenodoCommunities.stream().map(c -> translateZenodoCommunity(c))
228
                .flatMap(coll -> coll.stream())
229
                .map(ctx -> createContextInfo(ctx.split("::"), 0,  labelMap))
230
                .filter(info -> StringUtils.isNotBlank(info.getLabel()))
231
                .collect(Collectors.toList());
232
    }
212 233

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

  
217
		return contexts;
218 235

  
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>() {
236
    public class ContextInfo {
223 237

  
224
			@Override
225
			public ContextInfo apply(final String s) {
226
				return createContextInfo(s.split("::"), 0);
227
			}
238
        private String elem;
239
        private String id;
240
        private String label;
241
        private List<ContextInfo> children = new ArrayList<ContextInfo>();
228 242

  
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
		}));
243
        public ContextInfo(final String elem,
244
                           final String id, final String label) {
245
            this.elem = elem;
246
            this.id = id;
247
            this.label = label;
248
        }
244 249

  
245
	}
250
        public String getElem() {
251
            return elem;
252
        }
246 253

  
247
	public class ContextInfo {
254
        public void setElem(final String elem) {
255
            this.elem = elem;
256
        }
248 257

  
249
		private String elem;
250
		private String id;
251
		private List<ContextInfo> children = new ArrayList<ContextInfo>();
258
        public String getId() {
259
            return id;
260
        }
252 261

  
253
		public ContextInfo(final String elem,
254
				final String id) {
255
			this.elem = elem;
256
			this.id = id;
257
		}
262
        public void setId(final String id) {
263
            this.id = id;
264
        }
258 265

  
259
		public String getElem() {
260
			return elem;
261
		}
266
        public List<ContextInfo> getChildren() {
267
            return children;
268
        }
262 269

  
263
		public void setElem(final String elem) {
264
			this.elem = elem;
265
		}
270
        public void setChildren(final List<ContextInfo> children) {
271
            this.children = children;
272
        }
266 273

  
267
		public String getId() {
268
			return id;
269
		}
274
        public boolean isRoot() {
275
            return elem.equals("context");
276
        }
270 277

  
271
		public void setId(final String id) {
272
			this.id = id;
273
		}
278
        public String getLabel() {
279
            return label;
280
        }
274 281

  
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
	}
282
        public void setLabel(String label) {
283
            this.label = label;
284
        }
285
    }
287 286
}

Also available in: Unified diff