Project

General

Profile

1
package eu.dnetlib.msro.openaireplus.workflows.nodes.consistency;
2

    
3
import java.util.HashMap;
4
import java.util.List;
5
import java.util.Map;
6
import java.util.concurrent.atomic.AtomicInteger;
7
import java.util.stream.Collectors;
8

    
9
import org.apache.commons.lang.StringUtils;
10
import org.apache.commons.logging.Log;
11
import org.apache.commons.logging.LogFactory;
12
import org.springframework.beans.factory.annotation.Autowired;
13

    
14
import com.googlecode.sarasvati.Arc;
15
import com.googlecode.sarasvati.NodeToken;
16

    
17
import eu.dnetlib.enabling.datasources.DatasourceManagerClients;
18
import eu.dnetlib.enabling.datasources.LocalOpenaireDatasourceManager;
19
import eu.dnetlib.enabling.is.lookup.rmi.ISLookUpService;
20
import eu.dnetlib.enabling.is.registry.rmi.ISRegistryService;
21
import eu.dnetlib.enabling.locators.UniqueServiceLocator;
22
import eu.dnetlib.msro.workflows.nodes.ProgressJobNode;
23
import eu.dnetlib.msro.workflows.nodes.SimpleJobNode;
24
import eu.dnetlib.msro.workflows.util.ProgressProvider;
25
import eu.dnetlib.msro.workflows.util.WorkflowsConstants;
26

    
27
public class FindInvalidRepoProfilesJobNode extends SimpleJobNode implements ProgressJobNode {
28

    
29
	@Autowired
30
	private LocalOpenaireDatasourceManager dsManager;
31

    
32
	@Autowired
33
	private DatasourceManagerClients dsManagerClient;
34

    
35
	@Autowired
36
	private UniqueServiceLocator serviceLocator;
37

    
38
	private int current = 0;
39
	private int total = 0;
40

    
41
	private boolean deleteInvalidProfiles = false;
42
	private boolean registerMissingProfiles = false;
43

    
44
	private static final Log log = LogFactory.getLog(FindInvalidRepoProfilesJobNode.class);
45

    
46
	@Override
47
	protected String execute(final NodeToken token) throws Exception {
48

    
49
		final Map<String, AtomicInteger> validIds = dsManagerClient.searchSQL("SELECT id FROM dsm_datasources", new HashMap<>())
50
				.stream()
51
				.map(m -> (String) m.get("id"))
52
				.collect(Collectors.toMap(s -> s, s -> new AtomicInteger(0)));
53

    
54
		final List<String> list = serviceLocator.getService(ISLookUpService.class).quickSearchProfile(
55
				"for $x in collection('/db/DRIVER/RepositoryServiceResources/RepositoryServiceResourceType') return concat($x//DATASOURCE_ORIGINAL_ID, ' @@@ ', $x//RESOURCE_IDENTIFIER/@value)");
56

    
57
		this.current = 0;
58
		this.total = list.size() + validIds.size();
59
		int errorInvalidProfiles = 0;
60
		int errorUnregisteredProfiles = 0;
61
		int errorTooManyProfiles = 0;
62

    
63
		for (final String s : list) {
64
			current++;
65
			final String oid = StringUtils.substringBefore(s, "@@@").trim();
66
			final String profId = StringUtils.substringAfter(s, "@@@").trim();
67
			log.info("Evaluating ds: " + oid);
68
			if (validIds.containsKey(oid)) {
69
				validIds.get(oid).incrementAndGet();
70
			} else {
71
				log.warn("Invalid profile " + profId + ", openaireId " + oid + " not registered properly");
72
				errorInvalidProfiles++;
73
				// token.getEnv().setAttribute(WorkflowsConstants.MAIN_LOG_PREFIX + "invalidProfile:" + oid, profId);
74
				if (deleteInvalidProfiles) {
75
					log.warn("  - Deleting profile " + profId);
76
					serviceLocator.getService(ISRegistryService.class).deleteProfile(profId);
77
				}
78
			}
79
		}
80

    
81
		for (final Map.Entry<String, AtomicInteger> e : validIds.entrySet()) {
82
			current++;
83
			final String dsId = e.getKey();
84
			final int n = e.getValue().get();
85
			if (n == 0) {
86
				errorUnregisteredProfiles++;
87
				// token.getEnv().setAttribute(WorkflowsConstants.MAIN_LOG_PREFIX + "unregisterdProfile:" + dsId, dsId);
88
				log.warn("Missing profile for ds " + dsId);
89
				if (registerMissingProfiles) {
90
					dsManager.setManaged(dsId, dsManager.isManaged(dsId)); // This command should regenerate the repo profile
91
				}
92
			} else if (n > 1) {
93
				errorTooManyProfiles++;
94
				log.error("Too many profiles registerd " + n + " for ds " + dsId);
95
				// token.getEnv().setAttribute(WorkflowsConstants.MAIN_LOG_PREFIX + "tooManyProfiles:" + dsId, n);
96
			}
97
		}
98

    
99
		token.getEnv().setAttribute(WorkflowsConstants.MAIN_LOG_PREFIX + "errorInvalidProfiles", errorInvalidProfiles);
100
		token.getEnv().setAttribute(WorkflowsConstants.MAIN_LOG_PREFIX + "errorUnregisteredProfiles", errorUnregisteredProfiles);
101
		token.getEnv().setAttribute(WorkflowsConstants.MAIN_LOG_PREFIX + "errorTooManyProfiles", errorTooManyProfiles);
102

    
103
		return Arc.DEFAULT_ARC;
104
	}
105

    
106
	@Override
107
	public ProgressProvider getProgressProvider() {
108
		return new ProgressProvider() {
109

    
110
			@Override
111
			public int getTotalValue() {
112
				return total;
113
			}
114

    
115
			@Override
116
			public int getCurrentValue() {
117
				return current;
118
			}
119

    
120
			@Override
121
			public boolean isInaccurate() {
122
				return false;
123
			}
124
		};
125
	}
126

    
127
	public boolean isDeleteInvalidProfiles() {
128
		return deleteInvalidProfiles;
129
	}
130

    
131
	public void setDeleteInvalidProfiles(final boolean deleteInvalidProfiles) {
132
		this.deleteInvalidProfiles = deleteInvalidProfiles;
133
	}
134

    
135
	public boolean isRegisterMissingProfiles() {
136
		return registerMissingProfiles;
137
	}
138

    
139
	public void setRegisterMissingProfiles(final boolean registerMissingProfiles) {
140
		this.registerMissingProfiles = registerMissingProfiles;
141
	}
142
}
(1-1/3)