/**
* This file is part of Alfresco/Apache Storm demo project.
*
* Alfresco/Apache Storm demo project is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Alfresco/Apache Storm demo project is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with Alfresco/Apache Storm demo project. If not, see <http://www.gnu.org/licenses/>.
*/
package com.zaizi.alfresco.spouts;
import java.util.*;
import backtype.storm.spout.SpoutOutputCollector;
import backtype.storm.task.TopologyContext;
import backtype.storm.topology.OutputFieldsDeclarer;
import backtype.storm.topology.base.BaseRichSpout;
import backtype.storm.tuple.Fields;
import backtype.storm.tuple.Values;
import backtype.storm.utils.Utils;
import com.github.maoo.indexer.client.AlfrescoClient;
import com.github.maoo.indexer.client.AlfrescoFilters;
import com.github.maoo.indexer.client.AlfrescoResponse;
import com.github.maoo.indexer.client.WebScriptsAlfrescoClient;
import com.zaizi.alfresco.AlfrescoConstants;
import org.json.simple.JSONObject;
/**
* Fetch changes nodes from Alfresco using Alfresco indexer.
*/
@SuppressWarnings("serial")
public class AlfrescoSpout extends BaseRichSpout {
SpoutOutputCollector _collector;
Random _rand;
AlfrescoClient client;
List<Map<String, Object>> list;
Iterator<Map<String, Object>> listIterator;
long lastTransactionId = 0;
long lastChangesetId = 0;
@Override
public void open(Map conf, TopologyContext context, SpoutOutputCollector collector) {
_collector = collector;
_rand = new Random();
client = new WebScriptsAlfrescoClient(AlfrescoConstants.PROTOCOL, AlfrescoConstants.HOSTNAME, AlfrescoConstants.ENDPOINT,
AlfrescoConstants.STORE_PROTOCOL, AlfrescoConstants.STORE_ID, AlfrescoConstants.USERNAME, AlfrescoConstants.PASSWORD);
}
public void fetchNodes() {
AlfrescoResponse response = client.fetchNodes(lastTransactionId, lastChangesetId, new AlfrescoFilters());
list = response.getDocumentList();
lastTransactionId = response.getLastTransactionId();
lastChangesetId = response.getLastAclChangesetId();
listIterator = list.iterator();
}
@Override
public void nextTuple() {
if(listIterator!= null && listIterator.hasNext()) {
// Returning node by node
Map<String, Object> item = listIterator.next();
JSONObject jsonObject = new JSONObject();
for (Map.Entry<String, Object> mapEntry : item.entrySet()) {
jsonObject.put(mapEntry.getKey(), mapEntry.getValue());
}
_collector.emit(new Values(jsonObject.toJSONString()));
listIterator.remove();
} else {
// Fetch changed nodes if list is empty.
Utils.sleep(1000);
fetchNodes();
}
}
@Override
public void ack(Object id) {
}
@Override
public void fail(Object id) {
}
@Override
public void declareOutputFields(OutputFieldsDeclarer declarer) {
declarer.declare(new Fields("node"));
}
}