Project

General

Profile

1
package eu.dnetlib.data.cleaner;
2

    
3
import java.io.StringReader;
4
import java.util.HashSet;
5
import java.util.List;
6
import java.util.Set;
7

    
8
import org.dom4j.Document;
9
import org.dom4j.Element;
10
import org.dom4j.io.SAXReader;
11
import org.springframework.beans.factory.annotation.Autowired;
12

    
13
import com.google.common.base.Splitter;
14
import com.google.common.collect.Lists;
15
import com.google.common.collect.Sets;
16

    
17
import eu.dnetlib.enabling.locators.UniqueServiceLocator;
18
import eu.dnetlib.rmi.data.CleanerException;
19
import eu.dnetlib.rmi.enabling.ISLookUpException;
20
import eu.dnetlib.rmi.enabling.ISLookUpService;
21

    
22
public class CleaningRuleFactory {
23

    
24
	@Autowired
25
	private UniqueServiceLocator serviceLocator;
26

    
27
	public CleaningRule obtainCleaningRule(final String ruleId) throws CleanerException {
28
		try {
29
			final String prof = this.serviceLocator.getService(ISLookUpService.class).getResourceProfileByQuery(
30
					"/RESOURCE_PROFILE[.//RESOURCE_IDENTIFIER/@value='" + ruleId + "' or .//CLEANER_NAME='" + ruleId + "']//CONFIGURATION");
31

    
32
			final SAXReader reader = new SAXReader();
33
			final Document doc = reader.read(new StringReader(prof));
34

    
35
			final CleaningRule rule = new CleaningRule();
36

    
37
			final ISLookUpService lookup = this.serviceLocator.getService(ISLookUpService.class);
38

    
39
			for (final Object o : doc.selectNodes("//RULE")) {
40
				final Element node = (Element) o;
41

    
42
				final String xpath = node.valueOf("@xpath");
43
				final String vocabularies = node.valueOf("@vocabularies");
44
				final String groovyRule = node.valueOf("@groovy");
45
				final String strict = node.valueOf("@strict");
46

    
47
				final XPATHCleaningRule xpathRule;
48
				if (vocabularies != null && vocabularies.length() > 0) {
49
					final Set<String> list = Sets.newHashSet(Splitter.on(",").omitEmptyStrings().trimResults().split(vocabularies));
50
					xpathRule = new VocabularyRule(list, lookup);
51
				} else {
52
					xpathRule = new GroovyRule(groovyRule);
53
				}
54
				xpathRule.setXpath(xpath);
55
				xpathRule.setStrict("true".equals(strict));
56
				rule.getXpathRules().add(xpathRule);
57
			}
58
			return rule;
59
		} catch (final Exception e) {
60
			throw new CleanerException("Error obtaing cleaner rule " + ruleId, e);
61
		}
62
	}
63

    
64
	public List<String> getRuleIds() throws CleanerException {
65
		try {
66
			final HashSet<String> response = new HashSet<String>();
67

    
68
			final List<String> list = this.serviceLocator.getService(ISLookUpService.class).quickSearchProfile("//CLEANER_NAME");
69
			if (list != null) {
70
				response.addAll(list);
71
			}
72

    
73
			return Lists.newArrayList(response);
74
		} catch (final ISLookUpException e) {
75
			throw new CleanerException("Error obtaining IDs of cleaner DSs", e);
76
		}
77
	}
78

    
79
}
(3-3/6)