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 md...@apache.org on 2014/11/20 22:02:37 UTC

svn commit: r1640811 - in /jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak: plugins/document/DocumentCheckpointMBean.java plugins/segment/SegmentCheckpointMBean.java util/AbstractCheckpointMBean.java

Author: mduerig
Date: Thu Nov 20 21:02:37 2014
New Revision: 1640811

URL: http://svn.apache.org/r1640811
Log:
OAK-2267: Expose checkpoints through JMX
Factor common parts between implementations into base class

Added:
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/util/AbstractCheckpointMBean.java
      - copied, changed from r1640810, jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentCheckpointMBean.java
Modified:
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentCheckpointMBean.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentCheckpointMBean.java

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentCheckpointMBean.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentCheckpointMBean.java?rev=1640811&r1=1640810&r2=1640811&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentCheckpointMBean.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentCheckpointMBean.java Thu Nov 20 21:02:37 2014
@@ -24,39 +24,15 @@ import java.util.Date;
 import java.util.Map;
 import java.util.Map.Entry;
 
-import javax.management.openmbean.CompositeDataSupport;
-import javax.management.openmbean.CompositeType;
 import javax.management.openmbean.OpenDataException;
-import javax.management.openmbean.OpenType;
-import javax.management.openmbean.SimpleType;
-import javax.management.openmbean.TabularData;
 import javax.management.openmbean.TabularDataSupport;
-import javax.management.openmbean.TabularType;
 
-import org.apache.jackrabbit.oak.api.jmx.CheckpointMBean;
+import org.apache.jackrabbit.oak.util.AbstractCheckpointMBean;
 
 /**
  * {@code CheckpointMBean} implementation for the {@code DocumentNodeStore}.
  */
-public class DocumentCheckpointMBean implements CheckpointMBean {
-    private static final String[] FIELD_NAMES = new String[] { "id", "created", "expires"};
-    private static final String[] FIELD_DESCRIPTIONS = FIELD_NAMES;
-
-    @SuppressWarnings("rawtypes")
-    private static final OpenType[] FIELD_TYPES = new OpenType[] {
-            SimpleType.STRING, SimpleType.STRING, SimpleType.STRING };
-
-    private static final CompositeType TYPE = createCompositeType();
-
-    private static CompositeType createCompositeType() {
-        try {
-            return new CompositeType(DocumentCheckpointMBean.class.getName(),
-                    "Checkpoints", FIELD_NAMES, FIELD_DESCRIPTIONS, FIELD_TYPES);
-        } catch (OpenDataException e) {
-            throw new IllegalStateException(e);
-        }
-    }
-
+public class DocumentCheckpointMBean extends AbstractCheckpointMBean {
     private final DocumentNodeStore store;
 
     public DocumentCheckpointMBean(DocumentNodeStore store) {
@@ -64,35 +40,20 @@ public class DocumentCheckpointMBean imp
     }
 
     @Override
-    public TabularData listCheckpoints() {
+    protected void collectCheckpoints(TabularDataSupport tab) throws OpenDataException {
         Map<Revision, String> checkpoints = store.getCheckpoints().getCheckpoints();
         if (checkpoints == null) {
             checkpoints = Collections.emptyMap();
         }
 
-        try {
-            TabularDataSupport tab = new TabularDataSupport(
-                    new TabularType(DocumentCheckpointMBean.class.getName(),
-                            "Checkpoints", TYPE, new String[] { "id" }));
-
-            for (Entry<Revision, String> checkpoint : checkpoints.entrySet()) {
-                String id = checkpoint.getKey().toString();
-                Date created = new Date(checkpoint.getKey().getTimestamp());
-                Date expires = new Date(Long.parseLong(checkpoint.getValue()));
-                tab.put(id, toCompositeData(id, created.toString(), expires.toString()));
-            }
-
-            return tab;
-        } catch (OpenDataException e) {
-            throw new IllegalStateException(e);
+        for (Entry<Revision, String> checkpoint : checkpoints.entrySet()) {
+            String id = checkpoint.getKey().toString();
+            Date created = new Date(checkpoint.getKey().getTimestamp());
+            Date expires = new Date(Long.parseLong(checkpoint.getValue()));
+            tab.put(id, toCompositeData(id, created.toString(), expires.toString()));
         }
     }
 
-    private static CompositeDataSupport toCompositeData(String id, String created, String expires)
-            throws OpenDataException {
-        return new CompositeDataSupport(TYPE, FIELD_NAMES, new String[] { id, created, expires });
-    }
-
     @Override
     public String createCheckpoint(long lifetime) {
         return store.checkpoint(lifetime);

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentCheckpointMBean.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentCheckpointMBean.java?rev=1640811&r1=1640810&r2=1640811&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentCheckpointMBean.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentCheckpointMBean.java Thu Nov 20 21:02:37 2014
@@ -21,43 +21,19 @@ package org.apache.jackrabbit.oak.plugin
 
 import java.util.Date;
 
-import javax.management.openmbean.CompositeDataSupport;
-import javax.management.openmbean.CompositeType;
 import javax.management.openmbean.OpenDataException;
-import javax.management.openmbean.OpenType;
-import javax.management.openmbean.SimpleType;
-import javax.management.openmbean.TabularData;
 import javax.management.openmbean.TabularDataSupport;
-import javax.management.openmbean.TabularType;
 
 import org.apache.jackrabbit.oak.api.PropertyState;
 import org.apache.jackrabbit.oak.api.Type;
-import org.apache.jackrabbit.oak.api.jmx.CheckpointMBean;
 import org.apache.jackrabbit.oak.spi.state.ChildNodeEntry;
 import org.apache.jackrabbit.oak.spi.state.NodeState;
+import org.apache.jackrabbit.oak.util.AbstractCheckpointMBean;
 
 /**
  * {@code CheckpointMBean} implementation for the {@code SegmentNodeStore}.
  */
-public class SegmentCheckpointMBean implements CheckpointMBean {
-    private static final String[] FIELD_NAMES = new String[] { "id", "created", "expires"};
-    private static final String[] FIELD_DESCRIPTIONS = FIELD_NAMES;
-
-    @SuppressWarnings("rawtypes")
-    private static final OpenType[] FIELD_TYPES = new OpenType[] {
-            SimpleType.STRING, SimpleType.STRING, SimpleType.STRING };
-
-    private static final CompositeType TYPE = createCompositeType();
-
-    private static CompositeType createCompositeType() {
-        try {
-            return new CompositeType(SegmentCheckpointMBean.class.getName(),
-                    "Checkpoints", FIELD_NAMES, FIELD_DESCRIPTIONS, FIELD_TYPES);
-        } catch (OpenDataException e) {
-            throw new IllegalStateException(e);
-        }
-    }
-
+public class SegmentCheckpointMBean extends AbstractCheckpointMBean {
     private final SegmentNodeStore store;
 
     public SegmentCheckpointMBean(SegmentNodeStore store) {
@@ -65,33 +41,16 @@ public class SegmentCheckpointMBean impl
     }
 
     @Override
-    public TabularData listCheckpoints() {
-        NodeState checkpoints = store.getCheckpoints();
-
-        try {
-            TabularDataSupport tab = new TabularDataSupport(
-                    new TabularType(SegmentCheckpointMBean.class.getName(),
-                            "Checkpoints", TYPE, new String[] { "id" }));
-
-            for (ChildNodeEntry cne : checkpoints.getChildNodeEntries()) {
-                String id = cne.getName();
-                NodeState checkpoint = cne.getNodeState();
-                String created = getDate(checkpoint, "created");
-                String expires = getDate(checkpoint, "timestamp");
-                tab.put(id, toCompositeData(id, created, expires));
-            }
-
-            return tab;
-        } catch (OpenDataException e) {
-            throw new IllegalStateException(e);
+    protected void collectCheckpoints(TabularDataSupport tab) throws OpenDataException {
+        for (ChildNodeEntry cne : store.getCheckpoints().getChildNodeEntries()) {
+            String id = cne.getName();
+            NodeState checkpoint = cne.getNodeState();
+            String created = getDate(checkpoint, "created");
+            String expires = getDate(checkpoint, "timestamp");
+            tab.put(id, toCompositeData(id, created, expires));
         }
     }
 
-    private static CompositeDataSupport toCompositeData(String id, String created, String expires)
-            throws OpenDataException {
-        return new CompositeDataSupport(TYPE, FIELD_NAMES, new String[] { id, created, expires });
-    }
-
     private static String getDate(NodeState checkpoint, String name) {
         PropertyState p = checkpoint.getProperty(name);
         if (p == null) {

Copied: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/util/AbstractCheckpointMBean.java (from r1640810, jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentCheckpointMBean.java)
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/util/AbstractCheckpointMBean.java?p2=jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/util/AbstractCheckpointMBean.java&p1=jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentCheckpointMBean.java&r1=1640810&r2=1640811&rev=1640811&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentCheckpointMBean.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/util/AbstractCheckpointMBean.java Thu Nov 20 21:02:37 2014
@@ -17,9 +17,7 @@
  * under the License.
  */
 
-package org.apache.jackrabbit.oak.plugins.segment;
-
-import java.util.Date;
+package org.apache.jackrabbit.oak.util;
 
 import javax.management.openmbean.CompositeDataSupport;
 import javax.management.openmbean.CompositeType;
@@ -30,16 +28,15 @@ import javax.management.openmbean.Tabula
 import javax.management.openmbean.TabularDataSupport;
 import javax.management.openmbean.TabularType;
 
-import org.apache.jackrabbit.oak.api.PropertyState;
-import org.apache.jackrabbit.oak.api.Type;
 import org.apache.jackrabbit.oak.api.jmx.CheckpointMBean;
-import org.apache.jackrabbit.oak.spi.state.ChildNodeEntry;
-import org.apache.jackrabbit.oak.spi.state.NodeState;
+import org.apache.jackrabbit.oak.plugins.segment.SegmentCheckpointMBean;
 
 /**
- * {@code CheckpointMBean} implementation for the {@code SegmentNodeStore}.
+ * Abstract base class for {@code CheckpointMBean} implementations.
+ * This class provides the basic functionality for converting checkpoints
+ * into tabular data.
  */
-public class SegmentCheckpointMBean implements CheckpointMBean {
+public abstract class AbstractCheckpointMBean implements CheckpointMBean {
     private static final String[] FIELD_NAMES = new String[] { "id", "created", "expires"};
     private static final String[] FIELD_DESCRIPTIONS = FIELD_NAMES;
 
@@ -58,28 +55,26 @@ public class SegmentCheckpointMBean impl
         }
     }
 
-    private final SegmentNodeStore store;
-
-    public SegmentCheckpointMBean(SegmentNodeStore store) {
-        this.store = store;
-    }
+    /**
+     * Called to collect the tabular data for the checkpoints.
+     * Each checkpoint should be represented by a single row in {@code tab}.
+     * Implementors should use the {@link #toCompositeData} utility method for converting
+     * the individual fields associated with a checkpoint into the correct composite data
+     * format.
+     *
+     * @param tab
+     * @throws OpenDataException
+     */
+    protected abstract void collectCheckpoints(TabularDataSupport tab) throws OpenDataException;
 
     @Override
     public TabularData listCheckpoints() {
-        NodeState checkpoints = store.getCheckpoints();
-
         try {
             TabularDataSupport tab = new TabularDataSupport(
                     new TabularType(SegmentCheckpointMBean.class.getName(),
                             "Checkpoints", TYPE, new String[] { "id" }));
 
-            for (ChildNodeEntry cne : checkpoints.getChildNodeEntries()) {
-                String id = cne.getName();
-                NodeState checkpoint = cne.getNodeState();
-                String created = getDate(checkpoint, "created");
-                String expires = getDate(checkpoint, "timestamp");
-                tab.put(id, toCompositeData(id, created, expires));
-            }
+            collectCheckpoints(tab);
 
             return tab;
         } catch (OpenDataException e) {
@@ -87,28 +82,20 @@ public class SegmentCheckpointMBean impl
         }
     }
 
-    private static CompositeDataSupport toCompositeData(String id, String created, String expires)
+    /**
+     * Utility method for converting the fields associated with a checkpoint to the
+     * composite data format.
+     *
+     * @param id        id of the checkpoint
+     * @param created   creation data of the checkpoint
+     * @param expires   expiry data of the checkpoint
+     * @return          composite data representation of the fields associated with the
+     *                  checkpoint
+     * @throws OpenDataException
+     */
+    protected static CompositeDataSupport toCompositeData(String id, String created, String expires)
             throws OpenDataException {
         return new CompositeDataSupport(TYPE, FIELD_NAMES, new String[] { id, created, expires });
     }
 
-    private static String getDate(NodeState checkpoint, String name) {
-        PropertyState p = checkpoint.getProperty(name);
-        if (p == null) {
-            return "NA";
-        }
-
-        return new Date(p.getValue(Type.LONG)).toString();
-    }
-
-    @Override
-    public String createCheckpoint(long lifetime) {
-        return store.checkpoint(lifetime);
-    }
-
-    @Override
-    public boolean releaseCheckpoint(String checkpoint) {
-        return store.release(checkpoint);
-    }
-
 }