Project

General

Profile

1
package eu.dnetlib.actionmanager.actions;
2

    
3
import java.io.StringReader;
4
import java.util.List;
5

    
6
import javax.xml.transform.Transformer;
7
import javax.xml.transform.TransformerException;
8

    
9
import org.apache.commons.codec.binary.Base64;
10
import org.apache.commons.logging.Log;
11
import org.apache.commons.logging.LogFactory;
12
import org.apache.hadoop.hbase.client.Put;
13
import org.apache.hadoop.hbase.util.Bytes;
14
import org.dom4j.Document;
15
import org.dom4j.DocumentException;
16
import org.dom4j.Element;
17
import org.dom4j.io.DocumentResult;
18
import org.dom4j.io.DocumentSource;
19
import org.dom4j.io.SAXReader;
20

    
21
import com.google.common.collect.Lists;
22

    
23
import eu.dnetlib.actionmanager.ActionManagerConstants;
24
import eu.dnetlib.actionmanager.ActionManagerConstants.ACTION_TYPE;
25
import eu.dnetlib.actionmanager.common.Agent;
26
import eu.dnetlib.actionmanager.common.Operation;
27
import eu.dnetlib.actionmanager.common.Provenance;
28
import eu.dnetlib.actionmanager.hbase.HBasePutFactory;
29
import eu.dnetlib.actionmanager.rmi.ActionManagerException;
30

    
31
public class XsltInfoPackageAction extends AbstractAction {
32

    
33
	private static final Log log = LogFactory.getLog(XsltInfoPackageAction.class); // NOPMD by marko on 11/24/08 5:02 PM
34

    
35
	private Operation operation;
36
	private String infoPackage;
37
	private Provenance provenance;
38
	private String nsprefix;
39
	private String trust;
40
	private ActionFactory actionFactory;
41
	private Transformer transformer;
42
	private final List<Put> puts = Lists.newArrayList();
43

    
44
	/*
45
	 * protected XsltInfoPackageAction(final String set, final Agent agent, final Operation operation, final Provenance provenance, final
46
	 * String trust, final String nsprefix, final String infoPackage, final Transformer transformer, final ActionFactory actionFactory) {
47
	 * super(ACTION_TYPE.pkg, set, agent);
48
	 * 
49
	 * this.operation = operation; this.infoPackage = infoPackage; this.actionFactory = actionFactory; this.transformer = transformer;
50
	 * 
51
	 * this.setPuts(asPutOperations()); }
52
	 */
53

    
54
	public XsltInfoPackageAction(final String rawSet, final Agent agent, final Operation operation, final String infoPackage, final Provenance provenance,
55
			final String nsprefix, final String trust, final Transformer transformer, final ActionFactory actionFactory) {
56
		super(ACTION_TYPE.pkg, rawSet, agent);
57

    
58
		this.transformer = transformer;
59
		this.operation = operation;
60
		this.infoPackage = infoPackage;
61
		this.provenance = provenance;
62
		this.nsprefix = nsprefix;
63
		this.trust = trust;
64
		this.actionFactory = actionFactory;
65
		this.transformer = transformer;
66
	}
67

    
68
	public List<Put> asPutOperations() throws ActionManagerException {
69
		if (puts.isEmpty()) {
70
			final List<String> partIds = Lists.newArrayList();
71
			try {
72
				for (AtomicAction action : calculateAtomicActions()) {
73
					if ((action != null) && action.isValid()) {
74
						puts.addAll(action.asPutOperations(getRowKey(), provenance, trust, nsprefix));
75
						partIds.add(action.getRowKey());
76
					}
77
				}
78
				puts.add(prepareMetaPut(partIds));
79
			} catch (Exception e) {
80
				log.error("Error generating actions", e);
81
				throw new ActionManagerException(e);
82
			}
83
		}
84
		return puts;
85
	}
86

    
87
	private Document applyXslt(final String xml, final Provenance provenance, final String trust, final String nsprefix) throws DocumentException,
88
			TransformerException {
89
		final Document doc = (new SAXReader()).read(new StringReader(xml));
90

    
91
		final DocumentResult result = new DocumentResult();
92

    
93
		transformer.setParameter("trust", trust);
94
		transformer.setParameter("provenance", provenance.toString());
95
		transformer.setParameter("namespaceprefix", nsprefix);
96

    
97
		transformer.transform(new DocumentSource(doc), result);
98

    
99
		return result.getDocument();
100
	}
101

    
102
	protected List<AtomicAction> calculateAtomicActions() {
103
		final List<AtomicAction> list = Lists.newArrayList();
104

    
105
		try {
106
			Document doc = applyXslt(getInfoPackage(), provenance, trust, nsprefix);
107
			for (Object o : doc.selectNodes("//ACTION")) {
108
				list.add(createAtomicAction((Element) o));
109
			}
110
		} catch (Exception e) {
111
			log.error("Error generating actions", e);
112
		}
113

    
114
		return list;
115
	}
116

    
117
	private AtomicAction createAtomicAction(final Element elem) {
118
		String key = elem.valueOf("./@targetKey");
119
		String colFamily = elem.valueOf("./@targetColumnFamily");
120
		String col = elem.valueOf("./@targetColumn");
121
		String value64 = elem.getTextTrim();
122
		byte[] value = value64.isEmpty() ? null : Base64.decodeBase64(value64);
123

    
124
		return getActionFactory().createAtomicAction(getRawSet(), getAgent(), key, colFamily, col, value);
125
	}
126

    
127
	private Put prepareMetaPut(final List<String> partIds) {
128
		final Put put = HBasePutFactory.createPutOperation(getRowKey(), getRawSet(), getAgent());
129

    
130
		put.add(ActionManagerConstants.OPERATION_COLFAMILY, Bytes.toBytes(getOperation().toString()), Bytes.toBytes(getOperation().toString()));
131
		put.add(ActionManagerConstants.ACTION_COLFAMILY, Bytes.toBytes(getActionType().toString()), getBytesContent(infoPackage));
132

    
133
		for (String id : partIds) {
134
			put.add(ActionManagerConstants.RELATION_COLFAMILY, Bytes.toBytes(id), ActionManagerConstants.HASPARTS);
135
		}
136
		return put;
137
	}
138

    
139
	public Operation getOperation() {
140
		return operation;
141
	}
142

    
143
	public void setOperation(final Operation operation) {
144
		this.operation = operation;
145
	}
146

    
147
	public ActionFactory getActionFactory() {
148
		return actionFactory;
149
	}
150

    
151
	public void setActionFactory(final ActionFactory actionFactory) {
152
		this.actionFactory = actionFactory;
153
	}
154

    
155
	protected byte[] getBytesContent(final String content) {
156
		return Bytes.toBytes(content);
157
	}
158

    
159
	public String getInfoPackage() {
160
		return infoPackage;
161
	}
162

    
163
	public void setInfoPackage(final String infoPackage) {
164
		this.infoPackage = infoPackage;
165
	}
166

    
167
	public Provenance getProvenance() {
168
		return provenance;
169
	}
170

    
171
	public void setProvenance(final Provenance provenance) {
172
		this.provenance = provenance;
173
	}
174

    
175
	public String getTrust() {
176
		return trust;
177
	}
178

    
179
	public void setTrust(final String trust) {
180
		this.trust = trust;
181
	}
182

    
183
	public Transformer getTransformer() {
184
		return transformer;
185
	}
186

    
187
	public String getNsprefix() {
188
		return nsprefix;
189
	}
190

    
191
	public void setNsprefix(final String nsprefix) {
192
		this.nsprefix = nsprefix;
193
	}
194

    
195
	public void setTransformer(final Transformer transformer) {
196
		this.transformer = transformer;
197
	}
198

    
199
}
(4-4/4)