Author: mduerig
Date: Tue Mar 18 10:06:08 2014
New Revision: 1578807
URL: http://svn.apache.org/r1578807
Log:
OAK-1160: Generic interfaces for operation tasks
Default, whiteboard based implementation of RepositoryManagementMBean
Added:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/RepositoryManager.java
Modified:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/Oak.java
Modified:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/Oak.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/Oak.java?rev=1578807&r1=1578806&r2=1578807&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/Oak.java
(original)
+++
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/Oak.java
Tue Mar 18 10:06:08 2014
@@ -18,6 +18,9 @@ package org.apache.jackrabbit.oak;
import static com.google.common.base.Preconditions.checkNotNull;
import static com.google.common.collect.Lists.newArrayList;
+import static
org.apache.jackrabbit.oak.spi.whiteboard.WhiteboardUtils.registerMBean;
+import static
org.apache.jackrabbit.oak.spi.whiteboard.WhiteboardUtils.registerObserver;
+import static
org.apache.jackrabbit.oak.spi.whiteboard.WhiteboardUtils.scheduleWithFixedDelay;
import java.io.IOException;
import java.util.ArrayList;
@@ -50,6 +53,7 @@ import org.apache.jackrabbit.oak.api.Con
import org.apache.jackrabbit.oak.api.ContentSession;
import org.apache.jackrabbit.oak.api.Root;
import org.apache.jackrabbit.oak.api.jmx.IndexStatsMBean;
+import org.apache.jackrabbit.oak.api.jmx.RepositoryManagementMBean;
import org.apache.jackrabbit.oak.core.ContentRepositoryImpl;
import org.apache.jackrabbit.oak.plugins.commit.ConflictHook;
import org.apache.jackrabbit.oak.plugins.index.AsyncIndexUpdate;
@@ -82,7 +86,6 @@ import org.apache.jackrabbit.oak.spi.whi
import org.apache.jackrabbit.oak.spi.whiteboard.Registration;
import org.apache.jackrabbit.oak.spi.whiteboard.Whiteboard;
import org.apache.jackrabbit.oak.spi.whiteboard.WhiteboardAware;
-import org.apache.jackrabbit.oak.spi.whiteboard.WhiteboardUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -487,8 +490,8 @@ public class Oak {
String name = "async";
AsyncIndexUpdate task = new AsyncIndexUpdate(name, store,
indexEditors);
- WhiteboardUtils.scheduleWithFixedDelay(whiteboard, task, 5, true);
- WhiteboardUtils.registerMBean(whiteboard, IndexStatsMBean.class,
+ scheduleWithFixedDelay(whiteboard, task, 5, true);
+ registerMBean(whiteboard, IndexStatsMBean.class,
task.getIndexStats(), IndexStatsMBean.TYPE, name);
}
@@ -512,13 +515,16 @@ public class Oak {
// Register observer last to prevent sending events while initialising
for (Observer observer : observers) {
- WhiteboardUtils.registerObserver(whiteboard, observer);
+ registerObserver(whiteboard, observer);
}
- CommitHook commitHook = CompositeHook.compose(commitHooks);
+ RepositoryManager repositoryManager = new
RepositoryManager(whiteboard);
+ registerMBean(whiteboard, RepositoryManagementMBean.class,
repositoryManager,
+ RepositoryManagementMBean.TYPE, repositoryManager.getName());
+
return new ContentRepositoryImpl(
store,
- commitHook,
+ CompositeHook.compose(commitHooks),
defaultWorkspaceName,
indexProvider,
securityProvider);
Added:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/RepositoryManager.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/RepositoryManager.java?rev=1578807&view=auto
==============================================================================
---
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/RepositoryManager.java
(added)
+++
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/RepositoryManager.java
Tue Mar 18 10:06:08 2014
@@ -0,0 +1,161 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.jackrabbit.oak;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import java.util.List;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+import com.google.common.base.Function;
+import org.apache.jackrabbit.oak.api.jmx.RepositoryManagementMBean;
+import org.apache.jackrabbit.oak.plugins.backup.FileStoreBackupRestoreMBean;
+import org.apache.jackrabbit.oak.plugins.blob.BlobGCMBean;
+import org.apache.jackrabbit.oak.spi.state.RevisionGCMBean;
+import org.apache.jackrabbit.oak.spi.whiteboard.Tracker;
+import org.apache.jackrabbit.oak.spi.whiteboard.Whiteboard;
+
+/**
+ * Default implementation of the {@link RepositoryManagementMBean} based
+ * on a {@link Whiteboard} instance, which is used to look up individual
+ * service providers for backup ({@link FileStoreBackupRestoreMBean}), data
store
+ * garbage collections ({@link BlobGCMBean}) and revision store garbage
+ * collections ({@link RevisionGCMBean}).
+ */
+public class RepositoryManager implements RepositoryManagementMBean {
+ private final Whiteboard whiteboard;
+
+ public RepositoryManager(@Nonnull Whiteboard whiteboard) {
+ this.whiteboard = checkNotNull(whiteboard);
+ }
+
+ public String getName() {
+ return "repository manager";
+ }
+
+ private <T> String execute(Class<T> serviceType, Function<T, String>
operation) {
+ Tracker<T> tracker = whiteboard.track(serviceType);
+ try {
+ List<T> services = tracker.getServices();
+ if (services.size() == 1) {
+ return operation.apply(services.get(0));
+ } else if (services.isEmpty()) {
+ return "Cannot perform operation: no service of type " +
+ serviceType.getSimpleName() + " found.";
+ } else {
+ return "Cannot perform operation: multiple services of type " +
+ serviceType.getSimpleName() + " found.";
+ }
+ } finally {
+ tracker.stop();
+ }
+ }
+
+ @Override
+ public String startBackup() {
+ return execute(FileStoreBackupRestoreMBean.class, new
Function<FileStoreBackupRestoreMBean, String>() {
+ @Nullable
+ @Override
+ public String apply(FileStoreBackupRestoreMBean
fileStoreBackupRestoreMBean) {
+ return fileStoreBackupRestoreMBean.startBackup();
+ }
+ });
+ }
+
+ @Override
+ public String getBackupStatus() {
+ return execute(FileStoreBackupRestoreMBean.class, new
Function<FileStoreBackupRestoreMBean, String>() {
+ @Nullable
+ @Override
+ public String apply(FileStoreBackupRestoreMBean backupService) {
+ return backupService.getBackupStatus();
+ }
+ });
+ }
+
+ @Override
+ public String startRestore() {
+ return execute(FileStoreBackupRestoreMBean.class, new
Function<FileStoreBackupRestoreMBean, String>() {
+ @Nullable
+ @Override
+ public String apply(FileStoreBackupRestoreMBean backupService) {
+ return backupService.startRestore();
+ }
+ });
+ }
+
+ @Override
+ public String getRestoreStatus() {
+ return execute(FileStoreBackupRestoreMBean.class, new
Function<FileStoreBackupRestoreMBean, String>() {
+ @Nullable
+ @Override
+ public String apply(FileStoreBackupRestoreMBean backupService) {
+ return backupService.getRestoreStatus();
+ }
+ });
+ }
+
+ @Override
+ public String startDataStoreGC() {
+ return execute(BlobGCMBean.class, new Function<BlobGCMBean, String>() {
+ @Nullable
+ @Override
+ public String apply(BlobGCMBean blobGCService) {
+ return blobGCService.startBlobGC();
+ }
+ });
+ }
+
+ @Override
+ public String getDataStoreGCStatus() {
+ return execute(BlobGCMBean.class, new Function<BlobGCMBean, String>() {
+ @Nullable
+ @Override
+ public String apply(BlobGCMBean blobGCService) {
+ return blobGCService.getBlobGCStatus();
+ }
+ });
+ }
+
+ @Override
+ public String startRevisionGC() {
+ return execute(RevisionGCMBean.class, new Function<RevisionGCMBean,
String>() {
+ @Nullable
+ @Override
+ public String apply(RevisionGCMBean revisionGCService) {
+ return revisionGCService.startRevisionGC();
+ }
+ });
+ }
+
+ @Override
+ public String getRevisionGCStatus() {
+ return execute(RevisionGCMBean.class, new Function<RevisionGCMBean,
String>() {
+ @Nullable
+ @Override
+ public String apply(RevisionGCMBean revisionGCService) {
+ return revisionGCService.getRevisionGCStatus();
+ }
+ });
+ }
+
+}