Project

General

Profile

1
package eu.dnetlib.services;
2

    
3
import java.io.InputStream;
4
import java.util.ArrayList;
5
import java.util.HashMap;
6
import java.util.List;
7
import java.util.Set;
8

    
9
import org.antlr.stringtemplate.StringTemplate;
10
import org.apache.commons.io.IOUtils;
11
import org.apache.commons.logging.Log;
12
import org.apache.commons.logging.LogFactory;
13
import org.springframework.beans.factory.annotation.Autowired;
14
import org.springframework.scheduling.annotation.Scheduled;
15
import org.springframework.stereotype.Component;
16

    
17
import com.google.common.collect.Sets;
18

    
19
import eu.dnetlib.clients.is.InformationServiceClient;
20
import eu.dnetlib.enabling.annotations.DnetServiceType;
21
import eu.dnetlib.exceptions.InformationServiceException;
22

    
23
@Component
24
public class ServiceRegistrationManager {
25

    
26
	private static final Log log = LogFactory.getLog(ServiceRegistrationManager.class);
27

    
28
	@Autowired
29
	private InformationServiceClient isClient;
30

    
31
	private boolean disabled = false;
32

    
33
	@Autowired(required = false)
34
	private List<BaseService> services = new ArrayList<>();
35

    
36
	@Scheduled(fixedDelay = 20000)
37
	public void registerAllServices() throws Exception {
38

    
39
		if (disabled) { return; }
40

    
41
		log.info("registering services...");
42

    
43
		disabled = true;
44

    
45
		final Set<String> schemas = Sets.newHashSet(isClient.listSchemas());
46

    
47
		for (final BaseService service : services) {
48

    
49
			if (!schemas.contains(service.getServiceType())) {
50
				registerSchema(service.getServiceType());
51
			}
52

    
53
			if (!isAlreadyRegistered(service)) {
54
				registerService(service);
55
			}
56
		}
57

    
58
		log.info("...all services registered");
59

    
60
	}
61

    
62
	private boolean isAlreadyRegistered(final BaseService service) throws InformationServiceException {
63

    
64
		final String query = "for $x in collection('/db/DRIVER/dnetService') "
65
				+ "where $x//baseUrl='" + service.getBaseUrl() + "' "
66
				+ "and $x//type/@value = '" + service.getServiceType() + "' "
67
				+ "return $x//id/text()";
68

    
69
		final List<String> profIds = isClient.find(query);
70

    
71
		if (profIds.isEmpty()) {
72
			log.debug("there is no service registered for service: " + service.getServiceType());
73
			return false;
74
		} else {
75
			service.setProfileId(profIds.get(0));
76
			return true;
77
		}
78
	}
79

    
80
	private void registerService(final BaseService service) throws Exception {
81

    
82
		final DnetServiceType type = service.getServiceType();
83

    
84
		final String st = IOUtils.toString(getClass().getResourceAsStream("ServiceProfileTemplate.st"));
85

    
86
		final StringTemplate templ = new StringTemplate(st);
87

    
88
		templ.setAttribute("resourceType", type);
89
		templ.setAttribute("baseUrl", service.getBaseUrl());
90
		templ.setAttribute("properties", new HashMap<>());
91

    
92
		final String profId = isClient.register(templ.toString());
93

    
94
		log.info("  new service: " + profId);
95

    
96
		service.setProfileId(profId);
97

    
98
	}
99

    
100
	private void registerSchema(final DnetServiceType type) throws Exception {
101

    
102
		final InputStream schemaStream = getClass().getResourceAsStream("ServiceProfileSchemaTemplate.st");
103
		if (schemaStream == null) { throw new IllegalStateException("cannot find service profile schema template"); }
104

    
105
		final StringTemplate schema = new StringTemplate(IOUtils.toString(schemaStream));
106

    
107
		schema.setAttribute("resourceType", type);
108

    
109
		isClient.registerSchema(type.toString(), schema.toString());
110

    
111
		log.info("  new schema  : " + type);
112
	}
113

    
114
	public boolean isDisabled() {
115
		return disabled;
116
	}
117

    
118
}
(2-2/3)