You are viewing a plain text version of this content. The canonical link for it is here.
Posted to oak-commits@jackrabbit.apache.org by ju...@apache.org on 2013/05/16 10:51:42 UTC
svn commit: r1483255 -
/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentNodeStoreService.java
Author: jukka
Date: Thu May 16 08:51:42 2013
New Revision: 1483255
URL: http://svn.apache.org/r1483255
Log:
OAK-593: Segment-based MK
Avoid OSGi intialization trouble by using the proxy pattern instead of direct inheritance
Modified:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentNodeStoreService.java
Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentNodeStoreService.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentNodeStoreService.java?rev=1483255&r1=1483254&r2=1483255&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentNodeStoreService.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentNodeStoreService.java Thu May 16 08:51:42 2013
@@ -17,10 +17,10 @@
package org.apache.jackrabbit.oak.plugins.segment;
import java.io.IOException;
-import java.util.Collection;
+import java.io.InputStream;
import java.util.Dictionary;
-import java.util.Map;
-import java.util.UUID;
+
+import javax.annotation.Nonnull;
import org.apache.felix.scr.annotations.Activate;
import org.apache.felix.scr.annotations.Component;
@@ -28,16 +28,20 @@ import org.apache.felix.scr.annotations.
import org.apache.felix.scr.annotations.Deactivate;
import org.apache.felix.scr.annotations.Property;
import org.apache.felix.scr.annotations.Service;
+import org.apache.jackrabbit.oak.api.Blob;
import org.apache.jackrabbit.oak.plugins.segment.file.FileStore;
import org.apache.jackrabbit.oak.plugins.segment.mongo.MongoStore;
+import org.apache.jackrabbit.oak.spi.state.AbstractNodeStore;
+import org.apache.jackrabbit.oak.spi.state.NodeState;
import org.apache.jackrabbit.oak.spi.state.NodeStore;
+import org.apache.jackrabbit.oak.spi.state.NodeStoreBranch;
import org.osgi.service.component.ComponentContext;
import com.mongodb.Mongo;
@Component(policy = ConfigurationPolicy.REQUIRE)
@Service(NodeStore.class)
-public class SegmentNodeStoreService extends SegmentNodeStore {
+public class SegmentNodeStoreService extends AbstractNodeStore {
@Property(description="The unique name of this instance")
public static final String NAME = "name";
@@ -63,64 +67,18 @@ public class SegmentNodeStoreService ext
private Mongo mongo;
- private final SegmentStore[] store;
+ private SegmentStore store;
- public SegmentNodeStoreService(final SegmentStore[] store) {
- super(new SegmentStore() {
- @Override
- public void close() {
- store[0].close();
- }
- @Override
- public Journal getJournal(final String name) {
- return new Journal() {
- @Override
- public RecordId getHead() {
- return store[0].getJournal(name).getHead();
- }
- @Override
- public boolean setHead(RecordId base, RecordId head) {
- return store[0].getJournal(name).setHead(base, head);
- }
- @Override
- public void merge() {
- store[0].getJournal(name).merge();
- }
- };
- }
- @Override
- public Segment readSegment(UUID segmentId) {
- return store[0].readSegment(segmentId);
- }
- @Override
- public void createSegment(
- UUID segmentId, byte[] bytes, int offset, int length,
- Collection<UUID> referencedSegmentIds,
- Map<String, RecordId> strings,
- Map<Template, RecordId> templates) {
- store[0].createSegment(
- segmentId, bytes, offset, length,
- referencedSegmentIds, strings, templates);
- }
- @Override
- public void deleteSegment(UUID segmentId) {
- store[0].deleteSegment(segmentId);
- }
- });
- this.store = store;
- }
+ private NodeStore delegate;
- public SegmentNodeStoreService() {
- this(new SegmentStore[1]);
- }
-
- @Override
- public String toString() {
- return name;
+ private synchronized NodeStore getDelegate() {
+ assert delegate != null : "service must be activated when used";
+ return delegate;
}
@Activate
- public void activate(ComponentContext context) throws IOException {
+ public synchronized void activate(ComponentContext context)
+ throws IOException {
Dictionary<?, ?> properties = context.getProperties();
name = "" + properties.get(NAME);
@@ -128,7 +86,7 @@ public class SegmentNodeStoreService ext
String directory = properties.get(DIRECTORY).toString();
mongo = null;
- store[0] = new FileStore(directory);
+ store = new FileStore(directory);
} else {
String host = String.valueOf(properties.get(HOST));
int port = Integer.parseInt(String.valueOf(properties.get(PORT)));
@@ -136,16 +94,44 @@ public class SegmentNodeStoreService ext
int cache = Integer.parseInt(String.valueOf(properties.get(CACHE)));
mongo = new Mongo(host, port);
- store[0] = new MongoStore(mongo.getDB(db), cache * MB);
+ store = new MongoStore(mongo.getDB(db), cache * MB);
}
+
+ delegate = new SegmentNodeStore(store);
}
@Deactivate
- public void deactivate() {
- store[0].close();
+ public synchronized void deactivate() {
+ delegate = null;
+
+ store.close();
if (mongo != null) {
mongo.close();
}
}
+ //---------------------------------------------------------< NodeStore >--
+
+ @Override @Nonnull
+ public NodeState getRoot() {
+ return getDelegate().getRoot();
+ }
+
+ @Override @Nonnull
+ public NodeStoreBranch branch() {
+ return getDelegate().branch();
+ }
+
+ @Override
+ public Blob createBlob(InputStream stream) throws IOException {
+ return getDelegate().createBlob(stream);
+ }
+
+ //------------------------------------------------------------< Object >--
+
+ @Override
+ public synchronized String toString() {
+ return name + ": " + super.toString();
+ }
+
}