Project

General

Profile

1
package eu.dnetlib.xml.database.exist;
2

    
3
import java.util.HashMap;
4
import java.util.List;
5
import java.util.Map;
6

    
7
import org.apache.commons.logging.Log;
8
import org.apache.commons.logging.LogFactory;
9
import org.exist.collections.Collection;
10
import org.exist.collections.triggers.SAXTrigger;
11
import org.exist.collections.triggers.TriggerException;
12
import org.exist.dom.persistent.DocumentImpl;
13
import org.exist.storage.DBBroker;
14
import org.exist.storage.txn.Txn;
15
import org.exist.xmldb.XmldbURI;
16

    
17
import eu.dnetlib.miscutils.functional.xml.XMLIndenter;
18
import eu.dnetlib.xml.database.Trigger;
19

    
20
/**
21
 * this trigger delegates diffs for CRUDE events to an non-exist dependent eu.dnetlib.xml.database.Trigger instance.
22
 *
23
 * Since eXist triggers are instantiated by eXist, we need to locate the Trigger instances which are registered to the database instance.
24
 *
25
 * @author marko
26
 *
27
 */
28
public class DelegatingDiffTrigger extends SAXTrigger {
29

    
30
	/**
31
	 * logger.
32
	 */
33
	private static final Log log = LogFactory.getLog(DelegatingDiffTrigger.class); // NOPMD by marko on 11/24/08 5:02 PM
34

    
35
	/**
36
	 * trigger identifier, from configuration.
37
	 */
38
	private String triggerName;
39

    
40
	private Map<String, ExistsTriggerEvent> existsTriggerEventMap = new HashMap<>();
41

    
42
	private XMLIndenter indenter = new XMLIndenter();
43

    
44
	/**
45
	 * {@inheritDoc}
46
	 *
47
	 * @see org.exist.collections.triggers.FilteringTrigger#configure(org.exist.storage.DBBroker, org.exist.collections.Collection,
48
	 *      java.util.Map)
49
	 */
50
	@SuppressWarnings("unchecked")
51
	@Override
52
	public void configure(final DBBroker dbBroker, final Collection parent, final Map<String, List<?>> parameters) throws TriggerException {
53
		super.configure(dbBroker, parent, parameters);
54

    
55
		if (parameters == null) { return; }
56

    
57
		final Map<String, List<?>> params = parameters;
58
		if (parameters.containsKey("triggerName")) {
59
			final List<?> myTriggerName = parameters.get("triggerName");
60
			if ((myTriggerName != null) && (myTriggerName.size() == 1)) {
61
				setTriggerName(myTriggerName.get(0).toString());
62
			}
63
		}
64
		if (getTriggerName() == null) {
65
			log.fatal("trigger id not configured");
66
			throw new TriggerException("trigger name not configured");
67
		}
68
	}
69

    
70
	/**
71
	 * find the trigger instance associated with this delegation.
72
	 *
73
	 * @return trigger instance
74
	 */
75
	protected Trigger getTrigger() {
76
		final Trigger trigger = ExistTriggerRegistry.defaultInstance().getTrigger(getTriggerName());
77
		if (trigger == null) {
78
			log.fatal("no trigger " + triggerName + " but there is a registered callback for it");
79
			return null;
80
		}
81

    
82
		return trigger;
83
	}
84

    
85
	public String getTriggerName() {
86
		return triggerName;
87
	}
88

    
89
	public void setTriggerName(final String triggerId) {
90
		triggerName = triggerId;
91
	}
92

    
93
	@Override
94
	public void beforeCreateDocument(final DBBroker dbBroker, final Txn txn, final XmldbURI xmldbURI) throws TriggerException {
95

    
96
	}
97

    
98
	@Override
99
	public void afterCreateDocument(final DBBroker dbBroker, final Txn txn, final DocumentImpl document) throws TriggerException {
100

    
101
		try {
102
			final Trigger trigger = getTrigger();
103
			final String collection = document.getCollection().getURI().toString();
104
			final String fileName = document.getFileURI().toString();
105
			if (trigger != null) {
106
				trigger.created(fileName, collection, document);
107
			}
108
		} catch (final Exception e) {
109
			throw new TriggerException(e);
110
		}
111
	}
112

    
113
	@Override
114
	public void beforeUpdateDocument(final DBBroker dbBroker, final Txn txn, final DocumentImpl document) throws TriggerException {
115

    
116
		try {
117
			final String collection = document.getCollection().getURI().toString();
118
			final String fileName = document.getFileURI().toString();
119
			final ExistsTriggerEvent event = new ExistsTriggerEvent();
120
			event.setOldDocument(indenter.parseXmlString(XMLIndenter.indent(document)));
121
			event.setEventType(EventType.UPDATE);
122
			event.setCollection(collection);
123
			event.setName(fileName);
124
			existsTriggerEventMap.put(String.valueOf(txn.getId()), event);
125
		} catch (final Exception e) {
126
			throw new TriggerException(e);
127
		}
128
	}
129

    
130
	@Override
131
	public void afterUpdateDocument(final DBBroker dbBroker, final Txn txn, final DocumentImpl document) throws TriggerException {
132

    
133
		try {
134
			if (!existsTriggerEventMap.containsKey(
135
					String.valueOf(txn.getId()))) { throw new TriggerException("Error on trigger missing previous operation beforeUpdateTrigger"); }
136
			final ExistsTriggerEvent existsTriggerEvent = existsTriggerEventMap.remove(String.valueOf(txn.getId()));
137

    
138
			existsTriggerEvent.setDocument(indenter.parseXmlString(XMLIndenter.indent(document)));
139
			final Trigger trigger = getTrigger();
140
			if (trigger != null) {
141
				trigger.updated(existsTriggerEvent.getName(), existsTriggerEvent.getCollection(), existsTriggerEvent.getOldDocument(),
142
						existsTriggerEvent.getDocument());
143
			}
144
		} catch (final Exception e) {
145
			throw new TriggerException(e);
146
		}
147
	}
148

    
149
	@Override
150
	public void beforeUpdateDocumentMetadata(final DBBroker dbBroker, final Txn txn, final DocumentImpl document) throws TriggerException {
151

    
152
	}
153

    
154
	@Override
155
	public void afterUpdateDocumentMetadata(final DBBroker dbBroker, final Txn txn, final DocumentImpl document) throws TriggerException {
156

    
157
	}
158

    
159
	@Override
160
	public void beforeCopyDocument(final DBBroker dbBroker, final Txn txn, final DocumentImpl document, final XmldbURI xmldbURI) throws TriggerException {
161

    
162
	}
163

    
164
	@Override
165
	public void afterCopyDocument(final DBBroker dbBroker, final Txn txn, final DocumentImpl document, final XmldbURI xmldbURI) throws TriggerException {
166

    
167
	}
168

    
169
	@Override
170
	public void beforeMoveDocument(final DBBroker dbBroker, final Txn txn, final DocumentImpl document, final XmldbURI xmldbURI) throws TriggerException {
171

    
172
	}
173

    
174
	@Override
175
	public void afterMoveDocument(final DBBroker dbBroker, final Txn txn, final DocumentImpl document, final XmldbURI xmldbURI) throws TriggerException {
176

    
177
	}
178

    
179
	@Override
180
	public void beforeDeleteDocument(final DBBroker dbBroker, final Txn txn, final DocumentImpl document) throws TriggerException {
181

    
182
		try {
183
			final Trigger trigger = getTrigger();
184
			final String collection = document.getCollection().getURI().toString();
185
			final String fileName = document.getFileURI().toString();
186
			if (trigger != null) {
187
				trigger.deleted(fileName, collection, indenter.parseXmlString(XMLIndenter.indent(document)));
188
			}
189
		} catch (final Exception e) {
190
			throw new TriggerException(e);
191
		}
192
	}
193

    
194
	@Override
195
	public void afterDeleteDocument(final DBBroker dbBroker, final Txn txn, final XmldbURI xmldbURI) throws TriggerException {
196

    
197
	}
198

    
199
}
(1-1/8)