TraceDAO.java

176 lines | 6.899 kB Blame History Raw Download
//----------------------------------------------------------------------------
// Copyright (C) 2011  Ingrid Nunes
// 
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
// License as published by the Free Software Foundation; either
// version 2.1 of the License, or (at your option) any later version.
// 
// This library 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
// Lesser General Public License for more details.
// 
// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
// 
// To contact the authors:
// http://inf.ufrgs.br/prosoft/bdi4jade/
//
//----------------------------------------------------------------------------

package bdi4jade.examples.interactionprotocol.dao;

import java.util.ArrayList;

import org.bson.Document;

import com.mongodb.client.FindIterable;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
import com.mongodb.client.model.Filters;
import com.mongodb.client.model.Sorts;

import bdi4jade.examples.interactionprotocol.Trace;
import bdi4jade.examples.interactionprotocol.TraceDatabase;

/**
 * @author jgfaccin
 *
 */
public class TraceDAO {

	private static final String SENDER = "sender";
	private static final String RECEIVER = "receiver";
	private static final String SERVICE = "service";
	private static final String CID = "cid";
	private static final String PARENT_CID = "parentCid";
	private static final String SENT_AT = "sentAt";
	private static final String RECEIVED_AT = "receivedAt";
	private static final String VALUE = "value";
	private static final String TRACES_COLLECTION = "traces";

	private MongoDatabase db;

	public TraceDAO(String dbName) {
		this.db = TraceDatabase.getInstance().getDatabase(dbName);
	}

	public void dropCollection() {
		MongoCollection<Document> traces = getCollection();
		traces.drop();
	}

	public void addTrace(Trace trace) {
		MongoCollection<Document> traces = getCollection();
		Document item = new Document(TraceDAO.SENDER, trace.getSender()).append(TraceDAO.RECEIVER, trace.getReceiver())
				.append(TraceDAO.SERVICE, trace.getService()).append(TraceDAO.CID, trace.getCid())
				.append(TraceDAO.PARENT_CID, trace.getParentCid()).append(TraceDAO.SENT_AT, trace.getSentAt());
		traces.insertOne(item);
	}

	public void updateTrace(Trace trace) {
		MongoCollection<Document> traces = getCollection();
		traces.updateOne(
				Filters.and(Filters.eq(TraceDAO.SENDER, trace.getSender()),
						Filters.eq(TraceDAO.RECEIVER, trace.getReceiver()), Filters.eq(TraceDAO.CID, trace.getCid())),
				new Document("$set", new Document(TraceDAO.RECEIVED_AT, trace.getReceivedAt()).append(TraceDAO.VALUE,
						trace.getValue())));
	}

	public ArrayList<Trace> getTracesOfProvidedByBefore(String service, String provider, String parentCid) {
		MongoCollection<Document> traces = getCollection();
		Document doc = traces.find(Filters.and(Filters.eq(TraceDAO.PARENT_CID, parentCid), Filters.eq(TraceDAO.SERVICE, service),
				Filters.eq(TraceDAO.RECEIVER, provider))).first();
		Long receivedAt = doc.getLong(TraceDAO.RECEIVED_AT);

		FindIterable<Document> findIterable = traces.find(Filters.and(Filters.eq(TraceDAO.SERVICE, service),
				Filters.eq(TraceDAO.RECEIVER, provider), Filters.lte(TraceDAO.RECEIVED_AT, receivedAt)));
		
		ArrayList<Trace> traceList = new ArrayList<Trace>();
		for (Document document : findIterable) {
			traceList.add(getTraceInstance(document));
		}
		
		return traceList;
	}

	public ArrayList<Trace> getTracesByCID(String cid) {
		MongoCollection<Document> traces = getCollection();
		FindIterable<Document> findIterable = traces.find(Filters.eq(TraceDAO.CID, cid));
		ArrayList<Trace> traceList = new ArrayList<Trace>();
		for (Document document : findIterable) {
			traceList.add(getTraceInstance(document));
		}
		return traceList;
	}

	public ArrayList<Trace> getTracesByParentCID(String parentCid) {
		MongoCollection<Document> traces = getCollection();
		FindIterable<Document> findIterable = traces.find(Filters.eq(TraceDAO.PARENT_CID, parentCid));
		ArrayList<Trace> traceList = new ArrayList<Trace>();
		for (Document document : findIterable) {
			traceList.add(getTraceInstance(document));
		}
		return traceList;
	}

	public ArrayList<Trace> getTracesByServiceAndProvider(String service, String provider) {
		MongoCollection<Document> traces = getCollection();
		FindIterable<Document> findIterable = traces.find(Filters.and(Filters.eq(TraceDAO.SERVICE, service),
				Filters.eq(TraceDAO.RECEIVER, provider), Filters.exists(TraceDAO.RECEIVED_AT)))
				.sort(Sorts.ascending(TraceDAO.RECEIVED_AT));
		ArrayList<Trace> traceList = new ArrayList<Trace>();
		for (Document document : findIterable) {
			traceList.add(getTraceInstance(document));
		}
		return traceList;
	}

	public ArrayList<Trace> getTracesByCIDAndProvider(String cid, String provider) {
		MongoCollection<Document> traces = getCollection();
		FindIterable<Document> findIterable = traces
				.find(Filters.and(Filters.eq(TraceDAO.CID, cid), Filters.eq(TraceDAO.RECEIVER, provider)));
		ArrayList<Trace> traceList = new ArrayList<Trace>();
		for (Document document : findIterable) {
			traceList.add(getTraceInstance(document));
		}
		return traceList;
	}

	public ArrayList<Trace> getTracesByParentCIDAndProvider(String parentCid, String provider) {
		MongoCollection<Document> traces = getCollection();
		FindIterable<Document> findIterable = traces
				.find(Filters.and(Filters.eq(TraceDAO.PARENT_CID, parentCid), Filters.eq(TraceDAO.RECEIVER, provider)));
		ArrayList<Trace> traceList = new ArrayList<Trace>();
		for (Document document : findIterable) {
			traceList.add(getTraceInstance(document));
		}
		return traceList;
	}

	public String getCIDByParentCIDAndProviderAndService(String parentCid, String provider, String service) {
		MongoCollection<Document> traces = getCollection();
		FindIterable<Document> findIterable = traces.find(Filters.and(Filters.eq(TraceDAO.PARENT_CID, parentCid),
				Filters.eq(TraceDAO.RECEIVER, provider), Filters.eq(TraceDAO.SERVICE, service)));
		Document document = findIterable.first();
		return (String) document.get(TraceDAO.CID);
	}

	private MongoCollection<Document> getCollection() {
		return this.db.getCollection(TraceDAO.TRACES_COLLECTION);
	}

	private Trace getTraceInstance(Document document) {
		Trace trace = new Trace(document.getString(TraceDAO.SENDER), document.getString(TraceDAO.RECEIVER),
				document.getString(TraceDAO.SERVICE), document.getString(TraceDAO.CID),
				document.getString(TraceDAO.PARENT_CID));
		trace.setSentAt(document.getLong(TraceDAO.SENT_AT));
		trace.setReceivedAt(document.getLong(TraceDAO.RECEIVED_AT));
		trace.setValue(document.getString(TraceDAO.VALUE));
		return trace;
	}

}