Project

General

Profile

1 33635 michele.ar
package eu.dnetlib.msro.workflows.nodes.is;
2
3
import java.io.StringReader;
4
import java.util.List;
5
6
import javax.annotation.Resource;
7
import javax.xml.XMLConstants;
8
import javax.xml.transform.stream.StreamSource;
9
import javax.xml.validation.Schema;
10
import javax.xml.validation.SchemaFactory;
11
import javax.xml.validation.Validator;
12
13
import org.apache.commons.logging.Log;
14
import org.apache.commons.logging.LogFactory;
15
16
import com.googlecode.sarasvati.Arc;
17
import com.googlecode.sarasvati.NodeToken;
18
19
import eu.dnetlib.enabling.is.lookup.rmi.ISLookUpService;
20
import eu.dnetlib.enabling.locators.UniqueServiceLocator;
21
import eu.dnetlib.msro.rmi.MSROException;
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 ValidateProfilesJobNode extends SimpleJobNode implements ProgressJobNode {
28
29
	@Resource
30
	private UniqueServiceLocator serviceLocator;
31
32
	private int total = 0;
33
	private int current = 0;
34
35
	private static final Log log = LogFactory.getLog(ValidateProfilesJobNode.class);
36
37
	@Override
38
	protected String execute(final NodeToken token) throws Exception {
39
40
		final ISLookUpService lookup = serviceLocator.getService(ISLookUpService.class);
41
		final SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
42
43
		int invalidTotals = 0;
44
45
		final List<String> list = lookup.listResourceTypes();
46
47
		this.total = list.size();
48
		this.current = 0;
49
		for (String resourceType : list) {
50
			int valid = 0;
51
			int invalid = 0;
52
53
			final String schemaSource = lookup.getResourceTypeSchema(resourceType);
54
			final Schema schema = schemaFactory.newSchema(new StreamSource(new StringReader(schemaSource)));
55
			final Validator validator = schema.newValidator();
56
57
			for (String profile : lookup.quickSearchProfile("/RESOURCE_PROFILE[./HEADER/RESOURCE_TYPE/@value='" + resourceType + "']")) {
58
				try {
59
					validator.validate(new StreamSource(new StringReader(profile)));
60
					valid++;
61
				} catch (Exception e) {
62
					invalid++;
63
				}
64
			}
65
			invalidTotals += invalid;
66
67
			final String message = String.format("Valid: %s, Invalid: %s, Total: %s", valid, invalid, valid + invalid);
68
			token.getEnv().setAttribute(WorkflowsConstants.MAIN_LOG_PREFIX + resourceType, message);
69
			log.info("Validation of " + resourceType + " profiles: " + message);
70
		}
71
72
		if (invalidTotals > 0) { throw new MSROException("Validation wf has found " + invalidTotals + " invalid profiles"); }
73
74
		return Arc.DEFAULT_ARC;
75
	}
76
77
	@Override
78
	public ProgressProvider getProgressProvider() {
79
		return new ProgressProvider() {
80
81
			@Override
82
			public boolean isInaccurate() {
83
				return false;
84
			}
85
86
			@Override
87
			public int getTotalValue() {
88
				return total;
89
			}
90
91
			@Override
92
			public int getCurrentValue() {
93
				return current;
94
			}
95
		};
96
	}
97
98
}