Author: ozeigermann
Date: Tue Mar 20 06:58:37 2007
New Revision: 520390

URL: http://svn.apache.org/viewvc?view=rev&rev=520390
Log:
Moved changes for administration command to a sub class in order not to 
overload the base implementation.

Added:
    
jakarta/commons/proper/transaction/trunk/src/java/org/apache/commons/transaction/file/VirtualAdminCommandsFileResourceManager.java

Added: 
jakarta/commons/proper/transaction/trunk/src/java/org/apache/commons/transaction/file/VirtualAdminCommandsFileResourceManager.java
URL: 
http://svn.apache.org/viewvc/jakarta/commons/proper/transaction/trunk/src/java/org/apache/commons/transaction/file/VirtualAdminCommandsFileResourceManager.java?view=auto&rev=520390
==============================================================================
--- 
jakarta/commons/proper/transaction/trunk/src/java/org/apache/commons/transaction/file/VirtualAdminCommandsFileResourceManager.java
 (added)
+++ 
jakarta/commons/proper/transaction/trunk/src/java/org/apache/commons/transaction/file/VirtualAdminCommandsFileResourceManager.java
 Tue Mar 20 06:58:37 2007
@@ -0,0 +1,304 @@
+/*
+ * 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.commons.transaction.file;
+
+import java.io.ByteArrayInputStream;
+import java.io.InputStream;
+import java.io.OutputStream;
+
+import org.apache.commons.transaction.util.LoggerFacade;
+
+/**
+ * A resource manager for streamable objects stored in a file system that
+ * features additional administration commands.
+ * 
+ * @version $Id: FileResourceManager.java 519647 2007-03-18 17:50:02Z
+ *          ozeigermann $
+ */
+public class VirtualAdminCommandsFileResourceManager extends
+        FileResourceManager implements ResourceManager,
+        ResourceManagerErrorCodes {
+
+    protected String virtualAdminPath = null;
+
+    public String getVirtualAdminPath() {
+        return virtualAdminPath;
+    }
+
+    public void setVirtualAdminPath(String virutalAdminPath) {
+        this.virtualAdminPath = virutalAdminPath;
+    }
+
+    /**
+     * Creates a new resource manager operation on the specified directories.
+     * 
+     * @param storeDir
+     *            directory where main data should go after commit
+     * @param workDir
+     *            directory where transactions store temporary data
+     * @param urlEncodePath
+     *            if set to <code>true</code> encodes all paths to allow for
+     *            any kind of characters
+     * @param logger
+     *            the logger to be used by this store
+     */
+    public VirtualAdminCommandsFileResourceManager(String storeDir,
+            String workDir, boolean urlEncodePath, LoggerFacade logger) {
+        this(storeDir, workDir, urlEncodePath, logger, false);
+    }
+
+    /**
+     * Creates a new resource manager operation on the specified directories.
+     * 
+     * @param storeDir
+     *            directory where main data should go after commit
+     * @param workDir
+     *            directory where transactions store temporary data
+     * @param urlEncodePath
+     *            if set to <code>true</code> encodes all paths to allow for
+     *            any kind of characters
+     * @param logger
+     *            the logger to be used by this store
+     * @param debug
+     *            if set to <code>true</code> logs all locking information to
+     *            "transaction.log" for debugging inspection
+     */
+    public VirtualAdminCommandsFileResourceManager(String storeDir,
+            String workDir, boolean urlEncodePath, LoggerFacade logger,
+            boolean debug) {
+        this(storeDir, workDir, urlEncodePath ? new URLEncodeIdMapper() : null,
+                new NoOpTransactionIdToPathMapper(), logger, debug);
+    }
+
+    /**
+     * Creates a new resource manager operation on the specified directories.
+     * This constructor is reintroduced for backwards API compatibility and is
+     * used by jakarta-slide.
+     * 
+     * @param storeDir
+     *            directory where main data should go after commit
+     * @param workDir
+     *            directory where transactions store temporary data
+     * @param idMapper
+     *            mapper for resourceId to path
+     * @param logger
+     *            the logger to be used by this store
+     * @param debug
+     *            if set to <code>true</code> logs all locking information to
+     *            "transaction.log" for debugging inspection
+     */
+    public VirtualAdminCommandsFileResourceManager(String storeDir,
+            String workDir, ResourceIdToPathMapper idMapper,
+            LoggerFacade logger, boolean debug) {
+        this(storeDir, workDir, idMapper, new NoOpTransactionIdToPathMapper(),
+                logger, debug);
+    }
+
+    /**
+     * Creates a new resource manager operation on the specified directories.
+     * 
+     * @param storeDir
+     *            directory where main data should go after commit
+     * @param workDir
+     *            directory where transactions store temporary data
+     * @param idMapper
+     *            mapper for resourceId to path
+     * @param txIdMapper
+     *            mapper for transaction id to path
+     * @param logger
+     *            the logger to be used by this store
+     * @param debug
+     *            if set to <code>true</code> logs all locking information to
+     *            "transaction.log" for debugging inspection
+     */
+    public VirtualAdminCommandsFileResourceManager(String storeDir,
+            String workDir, ResourceIdToPathMapper idMapper,
+            TransactionIdToPathMapper txIdMapper, LoggerFacade logger,
+            boolean debug) {
+        super(workDir, storeDir, idMapper, txIdMapper, logger, debug);
+    }
+
+    public boolean resourceExists(Object resourceId)
+            throws ResourceManagerException {
+        if (isVirtualAdminId(resourceId)) {
+            logger
+                    .logFine("Faking existence of virtual administration 
command");
+            return true;
+        }
+
+        return super.resourceExists(resourceId);
+    }
+
+    public boolean resourceExists(Object txId, Object resourceId)
+            throws ResourceManagerException {
+        if (isVirtualAdminId(resourceId)) {
+            logger
+                    .logFine("Faking existence of virtual administration 
command");
+            return true;
+        }
+
+        return super.resourceExists(txId, resourceId);
+    }
+
+    public void deleteResource(Object txId, Object resourceId)
+            throws ResourceManagerException {
+
+        checkForVirtualAdminCommand(resourceId);
+
+        super.deleteResource(txId, resourceId);
+    }
+
+    public void deleteResource(Object txId, Object resourceId,
+            boolean assureOnly) throws ResourceManagerException {
+
+        checkForVirtualAdminCommand(resourceId);
+
+        super.deleteResource(txId, resourceId, assureOnly);
+    }
+
+    public void createResource(Object txId, Object resourceId)
+            throws ResourceManagerException {
+
+        checkForVirtualAdminCommand(resourceId);
+
+        super.createResource(txId, resourceId);
+    }
+
+    public void createResource(Object txId, Object resourceId,
+            boolean assureOnly) throws ResourceManagerException {
+
+        checkForVirtualAdminCommand(resourceId);
+
+        super.createResource(txId, resourceId, assureOnly);
+    }
+
+    public void copyResource(Object txId, Object fromResourceId,
+            Object toResourceId, boolean overwrite)
+            throws ResourceManagerException {
+
+        checkForVirtualAdminCommand(fromResourceId);
+        checkForVirtualAdminCommand(toResourceId);
+
+        super.copyResource(txId, fromResourceId, toResourceId, overwrite);
+    }
+
+    public void moveResource(Object txId, Object fromResourceId,
+            Object toResourceId, boolean overwrite)
+            throws ResourceManagerException {
+
+        checkForVirtualAdminCommand(fromResourceId);
+        checkForVirtualAdminCommand(toResourceId);
+
+        super.moveResource(txId, fromResourceId, toResourceId, overwrite);
+    }
+
+    public InputStream readResource(Object resourceId)
+            throws ResourceManagerException {
+
+        if (isVirtualAdminId(resourceId)) {
+            logger.logWarning("Issuing virtual admin command" + resourceId);
+            return executeAdminCommand(resourceId);
+        }
+
+        return super.readResource(resourceId);
+    }
+
+    public InputStream readResource(Object txId, Object resourceId)
+            throws ResourceManagerException {
+
+        if (isVirtualAdminId(resourceId)) {
+            String message = "You must not call virtual admin commands ("
+                    + resourceId + ") from within transactions!";
+            logger.logSevere(message);
+            throw new ResourceManagerException(message);
+        }
+
+        return super.readResource(txId, resourceId);
+    }
+
+    protected void checkForVirtualAdminCommand(Object resourceId)
+            throws ResourceManagerException {
+        if (isVirtualAdminId(resourceId)) {
+            String message = "You must not make modification calls to virtual 
admin commands ("
+                    + resourceId + ")!";
+            logger.logSevere(message);
+            throw new ResourceManagerException(message);
+        }
+    }
+
+    protected boolean isVirtualAdminId(Object resourceId) {
+        return (getVirtualAdminPath() != null && resourceId.toString()
+                .startsWith(getVirtualAdminPath()));
+    }
+
+    protected InputStream executeAdminCommand(Object resourceId) {
+        StringBuffer sb = new StringBuffer();
+
+        if (!isVirtualAdminId(resourceId)) {
+            String message = "Internal error: " + resourceId.toString()
+                    + " is no administration command, but is supposed to!";
+            sb.append(message);
+            logger.logSevere(message);
+        } else {
+            String command = resourceId.toString().substring(
+                    getVirtualAdminPath().length());
+            logger.logInfo("Processing admin command " + command);
+
+            // XXX this really should be more flexible
+            try {
+                if (isAKnowCommand(command)) {
+                    if (command.equals("recover")) {
+                        recover();
+                    }
+
+                    String message = "Command " + command
+                            + " terminated successfully";
+                    sb.append(message);
+                    logger.logInfo(message);
+                } else {
+                    String message = "Command " + command + " unknown";
+                    sb.append(message);
+                    logger.logWarning(message);
+
+                }
+            } catch (ResourceManagerSystemException e) {
+                String message = "Command " + command
+                        + " failed with the following message: "
+                        + e.getMessage();
+                sb.append(message);
+                logger.logSevere(message, e);
+            }
+
+        }
+        ByteArrayInputStream baIs = new ByteArrayInputStream(sb.toString()
+                .getBytes());
+        return baIs;
+
+    }
+
+    protected boolean isAKnowCommand(String command) {
+        return command.equals("recover");
+    }
+
+    public OutputStream writeResource(Object txId, Object resourceId,
+            boolean append) throws ResourceManagerException {
+
+        checkForVirtualAdminCommand(resourceId);
+
+        return super.writeResource(txId, resourceId, append);
+    }
+}



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to