Project

General

Profile

1
package eu.dnetlib.msro.workflows.nodes.is;
2

    
3
import java.io.StringReader;
4
import java.util.List;
5
import javax.annotation.Resource;
6
import javax.xml.XMLConstants;
7
import javax.xml.transform.stream.StreamSource;
8
import javax.xml.validation.Schema;
9
import javax.xml.validation.SchemaFactory;
10
import javax.xml.validation.Validator;
11

    
12
import eu.dnetlib.enabling.is.lookup.rmi.ISLookUpService;
13
import eu.dnetlib.enabling.locators.UniqueServiceLocator;
14
import eu.dnetlib.msro.rmi.MSROException;
15
import eu.dnetlib.msro.workflows.graph.Arc;
16
import eu.dnetlib.msro.workflows.graph.Env;
17
import eu.dnetlib.msro.workflows.nodes.ProgressJobNode;
18
import eu.dnetlib.msro.workflows.nodes.SimpleJobNode;
19
import eu.dnetlib.msro.workflows.procs.WorkflowProcess;
20
import eu.dnetlib.msro.workflows.util.ProgressProvider;
21
import eu.dnetlib.msro.workflows.util.WorkflowsConstants;
22
import org.apache.commons.logging.Log;
23
import org.apache.commons.logging.LogFactory;
24

    
25
public class ValidateProfilesJobNode extends SimpleJobNode implements ProgressJobNode {
26

    
27
	private static final Log log = LogFactory.getLog(ValidateProfilesJobNode.class);
28
	@Resource
29
	private UniqueServiceLocator serviceLocator;
30
	private int total = 0;
31
	private int current = 0;
32
	private WorkflowProcess process;
33

    
34
	@Override
35
	protected String execute(final Env env) throws Exception {
36

    
37
		final ISLookUpService lookup = serviceLocator.getService(ISLookUpService.class);
38
		final SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
39

    
40
		int invalidTotals = 0;
41

    
42
		final List<String> list = lookup.listResourceTypes();
43

    
44
		this.total = list.size();
45
		this.current = 0;
46
		for (String resourceType : list) {
47
			int valid = 0;
48
			int invalid = 0;
49

    
50
			final String schemaSource = lookup.getResourceTypeSchema(resourceType);
51
			final Schema schema = schemaFactory.newSchema(new StreamSource(new StringReader(schemaSource)));
52
			final Validator validator = schema.newValidator();
53

    
54
			for (String profile : lookup.quickSearchProfile("/RESOURCE_PROFILE[./HEADER/RESOURCE_TYPE/@value='" + resourceType + "']")) {
55
				try {
56
					validator.validate(new StreamSource(new StringReader(profile)));
57
					valid++;
58
				} catch (Exception e) {
59
					invalid++;
60
				}
61
			}
62
			invalidTotals += invalid;
63

    
64
			final String message = String.format("Valid: %s, Invalid: %s, Total: %s", valid, invalid, valid + invalid);
65
			env.setAttribute(WorkflowsConstants.MAIN_LOG_PREFIX + resourceType, message);
66
			log.info("Validation of " + resourceType + " profiles: " + message);
67
		}
68

    
69
		if (invalidTotals > 0) { throw new MSROException("Validation wf has found " + invalidTotals + " invalid profiles"); }
70

    
71
		return Arc.DEFAULT_ARC;
72
	}
73

    
74
	@Override
75
	public ProgressProvider getProgressProvider() {
76
		return new ProgressProvider() {
77

    
78
			@Override
79
			public boolean isInaccurate() {
80
				return false;
81
			}
82

    
83
			@Override
84
			public int getTotalValue() {
85
				return total;
86
			}
87

    
88
			@Override
89
			public int getCurrentValue() {
90
				return current;
91
			}
92
		};
93
	}
94

    
95
}
    (1-1/1)