package org.emfjson.mongo; import com.mongodb.MongoClient; import com.mongodb.client.MongoCollection; import org.bson.Document; import org.eclipse.emf.common.util.URI; import org.eclipse.emf.ecore.resource.impl.URIHandlerImpl; import org.emfjson.mongo.streams.MongoInputStream; import org.emfjson.mongo.streams.MongoOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.HashMap; import java.util.Map; public class MongoHandler extends URIHandlerImpl { public static final String ID_FIELD = "_id"; public static final String TYPE_FIELD = "_type"; public static final String CONTENTS_FIELD = "contents"; private final MongoClient client; public MongoHandler(MongoClient client) { this.client = client; } @Override public boolean canHandle(URI uri) { return uri.scheme().equals("mongodb"); } @Override public InputStream createInputStream(URI uri, Map<?, ?> options) throws IOException { return new MongoInputStream(this, uri, options); } @Override public OutputStream createOutputStream(URI uri, Map<?, ?> options) throws IOException { return new MongoOutputStream(this, uri, options); } @Override public void delete(URI uri, Map<?, ?> options) throws IOException { final MongoCollection<Document> collection = getCollection(uri); final Map<String, Object> filter = new HashMap<>(); filter.put(ID_FIELD, uri.segment(2)); filter.put(TYPE_FIELD, "resource"); collection.findOneAndDelete(new Document(filter)); } @Override public boolean exists(URI uri, Map<?, ?> options) { final MongoCollection<Document> collection = getCollection(uri); final Map<String, Object> filter = new HashMap<>(); filter.put(ID_FIELD, uri.segment(2)); filter.put(TYPE_FIELD, "resource"); return collection.find(new Document(filter)).limit(1).first() != null; } protected String db(URI uri) { String databaseName = uri.segment(0); if (databaseName == null) throw new IllegalArgumentException("Cannot find database name from uri " + uri); return databaseName; } protected String collection(URI uri) { final String collectionName = uri.segment(1); if (collectionName == null) throw new IllegalArgumentException("Cannot find collection name from uri " + uri); return collectionName; } public MongoCollection<Document> getCollection(URI uri) { if (uri.segmentCount() < 3) throw new IllegalArgumentException(); return client.getDatabase(uri.segment(0)).getCollection(uri.segment(1)); } }