/* Copyright (c) 2013-2014 Boundless and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Distribution License v1.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/org/documents/edl-v10.html
*
* Contributors:
* Gabriel Roldan (Boundless) - initial implementation
*/
package org.locationtech.geogig.di;
import java.util.Iterator;
import org.locationtech.geogig.api.ObjectId;
import org.locationtech.geogig.api.RevCommit;
import org.locationtech.geogig.api.RevObject;
import org.locationtech.geogig.storage.BulkOpListener;
import org.locationtech.geogig.storage.ForwardingObjectDatabase;
import org.locationtech.geogig.storage.GraphDatabase;
import org.locationtech.geogig.storage.ObjectDatabase;
import org.locationtech.geogig.storage.StagingDatabase;
import com.google.common.base.Function;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Iterators;
import com.google.inject.Provider;
import com.google.inject.util.Providers;
/**
* Method interceptor for {@link ObjectDatabase#put(RevObject)} that adds new commits to the graph
* database.
*/
class ObjectDatabasePutInterceptor implements Decorator {
private Provider<GraphDatabase> graphDb;
public ObjectDatabasePutInterceptor(Provider<GraphDatabase> graphDb) {
this.graphDb = graphDb;
}
@Override
public boolean canDecorate(Object subject) {
boolean canDecorate = subject instanceof ObjectDatabase
&& !(subject instanceof StagingDatabase);
return canDecorate;
}
@SuppressWarnings("unchecked")
@Override
public ObjectDatabase decorate(Object subject) {
return new GraphUpdatingObjectDatabase(graphDb, (ObjectDatabase) subject);
}
private static class GraphUpdatingObjectDatabase extends ForwardingObjectDatabase {
private Provider<GraphDatabase> graphDb;
public GraphUpdatingObjectDatabase(Provider<GraphDatabase> graphDb, ObjectDatabase subject) {
super(Providers.of(subject));
this.graphDb = graphDb;
}
@Override
public boolean put(RevObject object) {
final boolean inserted = super.put(object);
if (inserted && RevObject.TYPE.COMMIT.equals(object.getType())) {
RevCommit commit = (RevCommit) object;
graphDb.get().put(commit.getId(), commit.getParentIds());
}
return inserted;
}
@Override
public void putAll(Iterator<? extends RevObject> objects) {
putAll(objects, BulkOpListener.NOOP_LISTENER);
}
@Override
public void putAll(Iterator<? extends RevObject> objects, BulkOpListener listener) {
//final List<RevCommit> addedCommits = Lists.newLinkedList();
final Iterator<? extends RevObject> collectingIterator = Iterators.transform(objects,
new Function<RevObject, RevObject>() {
private final GraphDatabase graphDatabase = graphDb.get();
@Override
public RevObject apply(RevObject input) {
if (input instanceof RevCommit) {
RevCommit commit = (RevCommit) input;
ObjectId commitId = commit.getId();
ImmutableList<ObjectId> parentIds = commit.getParentIds();
graphDatabase.put(commitId, parentIds);
// addedCommits.add((RevCommit) input);
}
return input;
}
});
super.putAll(collectingIterator, listener);
// if (!addedCommits.isEmpty()) {
// GraphDatabase graphDatabase = graphDb.get();
// for (RevCommit commit : addedCommits) {
// ObjectId commitId = commit.getId();
// ImmutableList<ObjectId> parentIds = commit.getParentIds();
// graphDatabase.put(commitId, parentIds);
// }
// }
}
}
}