Author: reinhard
Date: Mon Apr  4 05:56:46 2005
New Revision: 160036

URL: http://svn.apache.org/viewcvs?view=rev&rev=160036
Log:
introduce interface 'transactional' for locators that support transactions; 
rename 'RemoteBlock' to 'Block' as the distinction isn't useful anymore; work 
on exception handling

Added:
    
cocoon/whiteboard/block-deployer/src/api/org/apache/cocoon/blockdeployer/block/Block.java
      - copied, changed from r159025, 
cocoon/whiteboard/block-deployer/src/api/org/apache/cocoon/blockdeployer/block/RemoteBlock.java
    
cocoon/whiteboard/block-deployer/src/api/org/apache/cocoon/blockdeployer/block/BlockDeploymentData.java
    
cocoon/whiteboard/block-deployer/src/api/org/apache/cocoon/blockdeployer/repository/DeploymentException.java
    
cocoon/whiteboard/block-deployer/src/api/org/apache/cocoon/blockdeployer/repository/TransactionException.java
    
cocoon/whiteboard/block-deployer/src/api/org/apache/cocoon/blockdeployer/repository/Transactional.java
    
cocoon/whiteboard/block-deployer/src/api/org/apache/cocoon/blockdeployer/repository/UnsupportedBlockException.java
    
cocoon/whiteboard/block-deployer/src/impl/org/apache/cocoon/blockdeployer/block/BlockFactory.java
      - copied, changed from r159025, 
cocoon/whiteboard/block-deployer/src/impl/org/apache/cocoon/blockdeployer/block/RemoteBlockFactory.java
Removed:
    
cocoon/whiteboard/block-deployer/src/api/org/apache/cocoon/blockdeployer/block/RemoteBlock.java
    
cocoon/whiteboard/block-deployer/src/impl/org/apache/cocoon/blockdeployer/block/RemoteBlockFactory.java
Modified:
    
cocoon/whiteboard/block-deployer/src/api/org/apache/cocoon/blockdeployer/block/RecursiveBlockHierarchyException.java
    
cocoon/whiteboard/block-deployer/src/api/org/apache/cocoon/blockdeployer/repository/Browsable.java
    
cocoon/whiteboard/block-deployer/src/api/org/apache/cocoon/blockdeployer/repository/Deployable.java
    
cocoon/whiteboard/block-deployer/src/api/org/apache/cocoon/blockdeployer/repository/Locator.java
    
cocoon/whiteboard/block-deployer/src/api/org/apache/cocoon/blockdeployer/repository/Searchable.java
    
cocoon/whiteboard/block-deployer/src/api/org/apache/cocoon/blockdeployer/repository/Writeable.java
    
cocoon/whiteboard/block-deployer/src/impl/org/apache/cocoon/blockdeployer/DeploymentService.java
    
cocoon/whiteboard/block-deployer/src/impl/org/apache/cocoon/blockdeployer/block/Cob10.java
    
cocoon/whiteboard/block-deployer/src/impl/org/apache/cocoon/blockdeployer/block/Cob10Resolver.java
    
cocoon/whiteboard/block-deployer/src/impl/org/apache/cocoon/blockdeployer/repository/ApplicationServer22Locator.java
    
cocoon/whiteboard/block-deployer/src/impl/org/apache/cocoon/blockdeployer/repository/DefaultRepository.java
    
cocoon/whiteboard/block-deployer/src/impl/org/apache/cocoon/blockdeployer/repository/DependencyBuilder.java
    
cocoon/whiteboard/block-deployer/src/impl/org/apache/cocoon/blockdeployer/repository/FilesystemLocator.java
    
cocoon/whiteboard/block-deployer/src/impl/org/apache/cocoon/blockdeployer/utils/CommonsTransactionLogger.java
    
cocoon/whiteboard/block-deployer/src/impl/org/apache/cocoon/blockdeployer/utils/LocatorUtils.java
    
cocoon/whiteboard/block-deployer/test/junit/org/apache/cocoon/blockdeployer/Constants.java
    
cocoon/whiteboard/block-deployer/test/junit/org/apache/cocoon/blockdeployer/repository/ApplicationServer22LocatorTest.java
    
cocoon/whiteboard/block-deployer/test/junit/org/apache/cocoon/blockdeployer/repository/DefaultRepositoryTest.java
    
cocoon/whiteboard/block-deployer/test/junit/org/apache/cocoon/blockdeployer/repository/FilesystemLocatorTest.java
    
cocoon/whiteboard/block-deployer/test/sample-repositories/application-server/WEB-INF/blocks/wiring.xml

Copied: 
cocoon/whiteboard/block-deployer/src/api/org/apache/cocoon/blockdeployer/block/Block.java
 (from r159025, 
cocoon/whiteboard/block-deployer/src/api/org/apache/cocoon/blockdeployer/block/RemoteBlock.java)
URL: 
http://svn.apache.org/viewcvs/cocoon/whiteboard/block-deployer/src/api/org/apache/cocoon/blockdeployer/block/Block.java?view=diff&rev=160036&p1=cocoon/whiteboard/block-deployer/src/api/org/apache/cocoon/blockdeployer/block/RemoteBlock.java&r1=159025&p2=cocoon/whiteboard/block-deployer/src/api/org/apache/cocoon/blockdeployer/block/Block.java&r2=160036
==============================================================================
--- 
cocoon/whiteboard/block-deployer/src/api/org/apache/cocoon/blockdeployer/block/RemoteBlock.java
 (original)
+++ 
cocoon/whiteboard/block-deployer/src/api/org/apache/cocoon/blockdeployer/block/Block.java
 Mon Apr  4 05:56:46 2005
@@ -23,11 +23,11 @@
 
 
 /**
- * The RemoteBlock points to a block that can be reached by a locator. This
+ * The Block points to a block that can be reached by a locator. This
  * object gives access to this locator, to its meta information and has a 
method
  * to get the complete block as stream.
  */
-public interface RemoteBlock {
+public interface Block {
     
     /**
      * @return returns the Block uri
@@ -52,5 +52,11 @@
      * @return the meta information to a block
      */
     public BlockDescriptor getBlockDescriptor();
+    
+    /**
+     * 
+     * @return meta information how a block is intalled (mount directory, 
properties)
+     */
+    public BlockDeploymentData getBlockDeploymentData();
     
 }

Added: 
cocoon/whiteboard/block-deployer/src/api/org/apache/cocoon/blockdeployer/block/BlockDeploymentData.java
URL: 
http://svn.apache.org/viewcvs/cocoon/whiteboard/block-deployer/src/api/org/apache/cocoon/blockdeployer/block/BlockDeploymentData.java?view=auto&rev=160036
==============================================================================
--- 
cocoon/whiteboard/block-deployer/src/api/org/apache/cocoon/blockdeployer/block/BlockDeploymentData.java
 (added)
+++ 
cocoon/whiteboard/block-deployer/src/api/org/apache/cocoon/blockdeployer/block/BlockDeploymentData.java
 Mon Apr  4 05:56:46 2005
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2005 The Apache Software Foundation.
+ * 
+ * Licensed 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.cocoon.blockdeployer.block;
+
+import java.util.Iterator;
+
+import org.apache.cocoon.blockdeployer.block.descriptor.BlockProperty;
+
+public interface BlockDeploymentData {
+
+    /**
+     * @return the path where the block is installed
+     */
+    public String getLocation();
+    
+    /**
+     * @return the mount path in sitemap processing
+     */
+    public String getMountPath();
+    
+    /**
+     * Get the names of all parameters that have to be set when the block is 
deployed
+     * 
+     * @return Iterator with all parameter names
+     */
+    public Iterator getPropertyNames();
+    
+    /**
+     * Get a property by its name
+     * 
+     * @param name of the property
+     * @return returns a BlockProperty object containing the property 
information
+     */
+    public BlockProperty getProperty(String name);
+    
+}

Modified: 
cocoon/whiteboard/block-deployer/src/api/org/apache/cocoon/blockdeployer/block/RecursiveBlockHierarchyException.java
URL: 
http://svn.apache.org/viewcvs/cocoon/whiteboard/block-deployer/src/api/org/apache/cocoon/blockdeployer/block/RecursiveBlockHierarchyException.java?view=diff&r1=160035&r2=160036
==============================================================================
--- 
cocoon/whiteboard/block-deployer/src/api/org/apache/cocoon/blockdeployer/block/RecursiveBlockHierarchyException.java
 (original)
+++ 
cocoon/whiteboard/block-deployer/src/api/org/apache/cocoon/blockdeployer/block/RecursiveBlockHierarchyException.java
 Mon Apr  4 05:56:46 2005
@@ -21,13 +21,13 @@
  */
 public class RecursiveBlockHierarchyException extends Exception {
 
-    public RecursiveBlockHierarchyException(RemoteBlock errorBlock) {
+    public RecursiveBlockHierarchyException(Block errorBlock) {
        this.errorBlock = errorBlock;
     }
     
-    private RemoteBlock errorBlock;
+    private Block errorBlock;
     
-    public RemoteBlock getErrorRoot() {
+    public Block getErrorRoot() {
        return this.errorBlock;
     }
     

Modified: 
cocoon/whiteboard/block-deployer/src/api/org/apache/cocoon/blockdeployer/repository/Browsable.java
URL: 
http://svn.apache.org/viewcvs/cocoon/whiteboard/block-deployer/src/api/org/apache/cocoon/blockdeployer/repository/Browsable.java?view=diff&r1=160035&r2=160036
==============================================================================
--- 
cocoon/whiteboard/block-deployer/src/api/org/apache/cocoon/blockdeployer/repository/Browsable.java
 (original)
+++ 
cocoon/whiteboard/block-deployer/src/api/org/apache/cocoon/blockdeployer/repository/Browsable.java
 Mon Apr  4 05:56:46 2005
@@ -15,7 +15,7 @@
  */
 package org.apache.cocoon.blockdeployer.repository;
 
-import org.apache.cocoon.blockdeployer.block.RemoteBlock;
+import org.apache.cocoon.blockdeployer.block.Block;
 
 /** 
  * Locator inferface
@@ -29,6 +29,6 @@
      * 
      * @return returns an array of RemoteBlocks.
      */
-    public RemoteBlock[] browse();
+    public Block[] browse();
 
 }

Modified: 
cocoon/whiteboard/block-deployer/src/api/org/apache/cocoon/blockdeployer/repository/Deployable.java
URL: 
http://svn.apache.org/viewcvs/cocoon/whiteboard/block-deployer/src/api/org/apache/cocoon/blockdeployer/repository/Deployable.java?view=diff&r1=160035&r2=160036
==============================================================================
--- 
cocoon/whiteboard/block-deployer/src/api/org/apache/cocoon/blockdeployer/repository/Deployable.java
 (original)
+++ 
cocoon/whiteboard/block-deployer/src/api/org/apache/cocoon/blockdeployer/repository/Deployable.java
 Mon Apr  4 05:56:46 2005
@@ -15,9 +15,7 @@
  */
 package org.apache.cocoon.blockdeployer.repository;
 
-import java.io.IOException;
-
-import org.apache.cocoon.blockdeployer.block.RemoteBlock;
+import org.apache.cocoon.blockdeployer.block.Block;
 
 /**
  * This interface marks a locator that is able to deploy a block into
@@ -28,18 +26,18 @@
 public interface Deployable {
 
     /**
-     * Deploy an array of blocks. The implementation has to make sure
+     * <p>Deploy an array of blocks. The implementation has to make sure
      * that either all or any block is deployed.
+     * </p>
      * 
-     * @param an array of blocks
-     * @return true if deployment was successfull, false if not
+     * @param block - the Block to be deployed
      * @throws @link UnsupportedBlockException if the block version is not 
supported
-     * @throws @link IOException if the block can't be deployed in the target 
filesystem
+     * @throws @link DeploymentException if the block can't be deployed for 
any reason
      */
-    /*
-     * FIXME remove return value - throw Exceptions instead
-     */    
-    public boolean deploy(RemoteBlock[] blocks) 
-       throws UnsupportedBlockException, IOException;
+
+    public void deploy(Block block) 
+       throws UnsupportedBlockException, DeploymentException;
+    
+    
     
 }

Added: 
cocoon/whiteboard/block-deployer/src/api/org/apache/cocoon/blockdeployer/repository/DeploymentException.java
URL: 
http://svn.apache.org/viewcvs/cocoon/whiteboard/block-deployer/src/api/org/apache/cocoon/blockdeployer/repository/DeploymentException.java?view=auto&rev=160036
==============================================================================
--- 
cocoon/whiteboard/block-deployer/src/api/org/apache/cocoon/blockdeployer/repository/DeploymentException.java
 (added)
+++ 
cocoon/whiteboard/block-deployer/src/api/org/apache/cocoon/blockdeployer/repository/DeploymentException.java
 Mon Apr  4 05:56:46 2005
@@ -0,0 +1,39 @@
+/*
+ * Copyright 2004 The Apache Software Foundation.
+ * 
+ * Licensed 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.cocoon.blockdeployer.repository;
+
+/**
+ * Checked exception during deployment.
+ */
+public class DeploymentException extends Exception {
+
+    public DeploymentException() {
+        super();
+    }
+
+    public DeploymentException(String arg0) {
+        super(arg0);
+    }
+
+    public DeploymentException(Throwable arg0) {
+        super(arg0);
+    }
+
+    public DeploymentException(String arg0, Throwable arg1) {
+        super(arg0, arg1);
+    }
+
+}

Modified: 
cocoon/whiteboard/block-deployer/src/api/org/apache/cocoon/blockdeployer/repository/Locator.java
URL: 
http://svn.apache.org/viewcvs/cocoon/whiteboard/block-deployer/src/api/org/apache/cocoon/blockdeployer/repository/Locator.java?view=diff&r1=160035&r2=160036
==============================================================================
--- 
cocoon/whiteboard/block-deployer/src/api/org/apache/cocoon/blockdeployer/repository/Locator.java
 (original)
+++ 
cocoon/whiteboard/block-deployer/src/api/org/apache/cocoon/blockdeployer/repository/Locator.java
 Mon Apr  4 05:56:46 2005
@@ -18,7 +18,7 @@
 import java.io.IOException;
 import java.io.InputStream;
 
-import org.apache.cocoon.blockdeployer.block.RemoteBlock;
+import org.apache.cocoon.blockdeployer.block.Block;
 
 
 /**
@@ -35,12 +35,12 @@
      * implementation "knows" where to look for this block.
      * 
      * @param Get a block by its id.
-     * @return A @link RemoteBlock object representing a block
+     * @return A @link Block object representing a block
      * @throws BlockNotFoundException if the locator can't find the requested 
block
      * @throws IOException in the case that the block can be found but there 
are problems
      *         when accessing its meta data
      */
-    public RemoteBlock getRemoteBlock(String blockId) throws 
BlockNotFoundException, IOException;
+    public Block getRemoteBlock(String blockId) throws BlockNotFoundException, 
IOException;
     
     /**
      * @return returns the unique identifier of this locator

Modified: 
cocoon/whiteboard/block-deployer/src/api/org/apache/cocoon/blockdeployer/repository/Searchable.java
URL: 
http://svn.apache.org/viewcvs/cocoon/whiteboard/block-deployer/src/api/org/apache/cocoon/blockdeployer/repository/Searchable.java?view=diff&r1=160035&r2=160036
==============================================================================
--- 
cocoon/whiteboard/block-deployer/src/api/org/apache/cocoon/blockdeployer/repository/Searchable.java
 (original)
+++ 
cocoon/whiteboard/block-deployer/src/api/org/apache/cocoon/blockdeployer/repository/Searchable.java
 Mon Apr  4 05:56:46 2005
@@ -15,7 +15,7 @@
  */
 package org.apache.cocoon.blockdeployer.repository;
 
-import org.apache.cocoon.blockdeployer.block.RemoteBlock;
+import org.apache.cocoon.blockdeployer.block.Block;
 
 
 /**
@@ -26,13 +26,13 @@
 public interface Searchable {
 
     /**
-     * Search for a block by its ID. A locator can only return a single 
RemoteBlock, 
+     * Search for a block by its ID. A locator can only return a single Block, 
      * a repository can return an array with RemoteBlocks available in several 
locators.
      * Note that the order is important.
      * 
      * @return a sorted array of all locators that contain the named block
      */
-    public RemoteBlock[] lookupBlock(String blockId) throws 
BlockNotFoundException;
+    public Block[] lookupBlock(String blockId) throws BlockNotFoundException;
 
     /**
      * Query the repositry whether it has a certain block or not.

Added: 
cocoon/whiteboard/block-deployer/src/api/org/apache/cocoon/blockdeployer/repository/TransactionException.java
URL: 
http://svn.apache.org/viewcvs/cocoon/whiteboard/block-deployer/src/api/org/apache/cocoon/blockdeployer/repository/TransactionException.java?view=auto&rev=160036
==============================================================================
--- 
cocoon/whiteboard/block-deployer/src/api/org/apache/cocoon/blockdeployer/repository/TransactionException.java
 (added)
+++ 
cocoon/whiteboard/block-deployer/src/api/org/apache/cocoon/blockdeployer/repository/TransactionException.java
 Mon Apr  4 05:56:46 2005
@@ -0,0 +1,31 @@
+/* Copyright 2004 The Apache Software Foundation.
+ * 
+ * Licensed 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.cocoon.blockdeployer.repository;
+
+public class TransactionException extends Exception {
+
+    public TransactionException() {
+        super();
+    }
+    
+    public TransactionException(String s) {
+        super(s);
+    }   
+    
+    public TransactionException(String s, Exception ex) {
+        super(s, ex);
+    }        
+    
+}

Added: 
cocoon/whiteboard/block-deployer/src/api/org/apache/cocoon/blockdeployer/repository/Transactional.java
URL: 
http://svn.apache.org/viewcvs/cocoon/whiteboard/block-deployer/src/api/org/apache/cocoon/blockdeployer/repository/Transactional.java?view=auto&rev=160036
==============================================================================
--- 
cocoon/whiteboard/block-deployer/src/api/org/apache/cocoon/blockdeployer/repository/Transactional.java
 (added)
+++ 
cocoon/whiteboard/block-deployer/src/api/org/apache/cocoon/blockdeployer/repository/Transactional.java
 Mon Apr  4 05:56:46 2005
@@ -0,0 +1,26 @@
+/*
+ * Copyright 2004 The Apache Software Foundation.
+ * 
+ * Licensed 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.cocoon.blockdeployer.repository;
+
+public interface Transactional {
+
+    public void startTransaction() throws TransactionException;
+    
+    public void commitTransaction() throws TransactionException;
+    
+    public void rollbackTransaction() throws TransactionException;
+    
+}

Added: 
cocoon/whiteboard/block-deployer/src/api/org/apache/cocoon/blockdeployer/repository/UnsupportedBlockException.java
URL: 
http://svn.apache.org/viewcvs/cocoon/whiteboard/block-deployer/src/api/org/apache/cocoon/blockdeployer/repository/UnsupportedBlockException.java?view=auto&rev=160036
==============================================================================
--- 
cocoon/whiteboard/block-deployer/src/api/org/apache/cocoon/blockdeployer/repository/UnsupportedBlockException.java
 (added)
+++ 
cocoon/whiteboard/block-deployer/src/api/org/apache/cocoon/blockdeployer/repository/UnsupportedBlockException.java
 Mon Apr  4 05:56:46 2005
@@ -0,0 +1,33 @@
+/*
+ * Copyright 2004 The Apache Software Foundation.
+ * 
+ * Licensed 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.cocoon.blockdeployer.repository;
+
+/**
+ * Exception if a block implementation is not supported e.g. by a deployable 
locator
+ * 
+ * @since 0.1
+ */
+public class UnsupportedBlockException extends Exception {
+
+    public UnsupportedBlockException() {
+        super();
+    }
+
+    public UnsupportedBlockException(String message) {
+        super(message);
+    }
+
+}

Modified: 
cocoon/whiteboard/block-deployer/src/api/org/apache/cocoon/blockdeployer/repository/Writeable.java
URL: 
http://svn.apache.org/viewcvs/cocoon/whiteboard/block-deployer/src/api/org/apache/cocoon/blockdeployer/repository/Writeable.java?view=diff&r1=160035&r2=160036
==============================================================================
--- 
cocoon/whiteboard/block-deployer/src/api/org/apache/cocoon/blockdeployer/repository/Writeable.java
 (original)
+++ 
cocoon/whiteboard/block-deployer/src/api/org/apache/cocoon/blockdeployer/repository/Writeable.java
 Mon Apr  4 05:56:46 2005
@@ -15,7 +15,7 @@
  */
 package org.apache.cocoon.blockdeployer.repository;
 
-import org.apache.cocoon.blockdeployer.block.RemoteBlock;
+import org.apache.cocoon.blockdeployer.block.Block;
 
 /**
  * This interface marks a locator which a block can be added to.
@@ -24,6 +24,6 @@
  */
 public interface Writeable {
 
-    public void addBlock(final RemoteBlock block, final Credentials 
credentials);
+    public void addBlock(final Block block, final Credentials credentials);
     
 }

Modified: 
cocoon/whiteboard/block-deployer/src/impl/org/apache/cocoon/blockdeployer/DeploymentService.java
URL: 
http://svn.apache.org/viewcvs/cocoon/whiteboard/block-deployer/src/impl/org/apache/cocoon/blockdeployer/DeploymentService.java?view=diff&r1=160035&r2=160036
==============================================================================
--- 
cocoon/whiteboard/block-deployer/src/impl/org/apache/cocoon/blockdeployer/DeploymentService.java
 (original)
+++ 
cocoon/whiteboard/block-deployer/src/impl/org/apache/cocoon/blockdeployer/DeploymentService.java
 Mon Apr  4 05:56:46 2005
@@ -42,6 +42,8 @@
         
         // get the blocks from the repository
         
+        // enrich blocks with deployment meta information 
block.getBlockDeploymentData()
+        
         // deploy the blocks to the Cocoon server
         
         // deploy the blocks to locators that have the attribute 
'add-unavailable-blocks' set

Copied: 
cocoon/whiteboard/block-deployer/src/impl/org/apache/cocoon/blockdeployer/block/BlockFactory.java
 (from r159025, 
cocoon/whiteboard/block-deployer/src/impl/org/apache/cocoon/blockdeployer/block/RemoteBlockFactory.java)
URL: 
http://svn.apache.org/viewcvs/cocoon/whiteboard/block-deployer/src/impl/org/apache/cocoon/blockdeployer/block/BlockFactory.java?view=diff&rev=160036&p1=cocoon/whiteboard/block-deployer/src/impl/org/apache/cocoon/blockdeployer/block/RemoteBlockFactory.java&r1=159025&p2=cocoon/whiteboard/block-deployer/src/impl/org/apache/cocoon/blockdeployer/block/BlockFactory.java&r2=160036
==============================================================================
--- 
cocoon/whiteboard/block-deployer/src/impl/org/apache/cocoon/blockdeployer/block/RemoteBlockFactory.java
 (original)
+++ 
cocoon/whiteboard/block-deployer/src/impl/org/apache/cocoon/blockdeployer/block/BlockFactory.java
 Mon Apr  4 05:56:46 2005
@@ -38,37 +38,34 @@
  * 
  * @since 0.1
  */
-public class RemoteBlockFactory {
+public class BlockFactory {
 
     /**
-     * Creates a RemoteBlock based on the descriptor and is called from
-     * a locator which wants to provide a RemoteBlock. (It's not the job of
+     * Creates a Block based on the descriptor and is called from
+     * a locator which wants to provide a Block. (It's not the job of
      * the locator to know where to find and how to read the descriptor file.)
      * 
      * @param descriptorString is a string containing the BlockDescription 
(block.xml)
-     * @return the RemoteBlock
+     * @return the Block
      */
     /*
-     * FIXME the factory should analyse the doctype of the descriptor (not the 
namespace)
      * FIXME the descriptor should be analyzed whether it is correct - 
otherwise raise an exception
      */
-    public static RemoteBlock getRemoteBlock(InputStream descriptor, Locator 
locator) {
+    public static Block getRemoteBlock(InputStream descriptor, Locator 
locator) {
         if(descriptor == null) {
             throw new NullPointerException("The descriptor mustn't be null.");
         }
         
-        RemoteBlock block = null;
+        Block block = null;
 
-        // analyse the descriptor and decide which RemoteBlock implementation 
should be used
+        // analyse the descriptor and decide which Block implementation should 
be used
         // by finding out the namespace of the root element
         DOMParser parser = new DOMParser();
         try {
                        parser.parse(new InputSource(descriptor));
-               } catch (SAXException e) {
-            
-               } catch (IOException e) {
-            
-               }
+               } catch (Exception e) {
+            throw new RuntimeException("Block descriptor can't be read.");
+        }
         Document descriptorDocument = parser.getDocument();   
         NodeList rootNodeList = descriptorDocument.getChildNodes();
         String namespace = null;
@@ -82,21 +79,21 @@
         
         if(Cob10.NAMESPACE.equals(namespace)) {
             // it's a Cob10 ...
-            Cob10 realRemoteBlock = new Cob10();
-            
realRemoteBlock.setBlockDescriptor(createCOB10Descriptor(descriptorDocument));
-            
realRemoteBlock.setBlockId(realRemoteBlock.getBlockDescriptor().getBlockId());
+            Cob10 cob10 = new Cob10();
+            
cob10.setBlockDescriptor(createCOB10Descriptor(descriptorDocument));
+            cob10.setBlockId(cob10.getBlockDescriptor().getBlockId());
             if(locator == null) {
                 throw new NullPointerException("The locator mustn't be null.");
             }        
-            realRemoteBlock.setLocator(locator);
-            block = realRemoteBlock;
+            cob10.setLocator(locator);
+            block = cob10;
         }
         
         return block;
     }
     
     private static Cob10Descriptor createCOB10Descriptor(Node descriptor) {
-        Cob10Descriptor realBlockDescriptor = null;
+        Cob10Descriptor cob10Descriptor = null;
         try {
                Mapping mapping = new Mapping();
                mapping.loadMapping(Cob10Descriptor.class.getClassLoader().
@@ -107,11 +104,11 @@
                unmarshaller.setIgnoreExtraAttributes(true);
                unmarshaller.setIgnoreExtraElements(true);
                // unmarshaller.setDebug(true);
-               realBlockDescriptor = 
(Cob10Descriptor)unmarshaller.unmarshal(descriptor);
+               cob10Descriptor = 
(Cob10Descriptor)unmarshaller.unmarshal(descriptor);
         } catch(Exception e) {
             throw new RuntimeException(e);
         }
-        return realBlockDescriptor;
+        return cob10Descriptor;
     }
     
 }

Modified: 
cocoon/whiteboard/block-deployer/src/impl/org/apache/cocoon/blockdeployer/block/Cob10.java
URL: 
http://svn.apache.org/viewcvs/cocoon/whiteboard/block-deployer/src/impl/org/apache/cocoon/blockdeployer/block/Cob10.java?view=diff&r1=160035&r2=160036
==============================================================================
--- 
cocoon/whiteboard/block-deployer/src/impl/org/apache/cocoon/blockdeployer/block/Cob10.java
 (original)
+++ 
cocoon/whiteboard/block-deployer/src/impl/org/apache/cocoon/blockdeployer/block/Cob10.java
 Mon Apr  4 05:56:46 2005
@@ -18,14 +18,14 @@
 import java.io.IOException;
 import java.io.InputStream;
 
-import org.apache.cocoon.blockdeployer.block.RemoteBlock;
+import org.apache.cocoon.blockdeployer.block.Block;
 import org.apache.cocoon.blockdeployer.block.descriptor.BlockDescriptor;
 import org.apache.cocoon.blockdeployer.repository.Locator;
 
 /**
  * @since 0.1
  */
-public class Cob10 implements RemoteBlock {
+public class Cob10 implements Block {
     
     public final static String NAMESPACE = 
"http://apache.org/cocoon/blocks/cob/1.0";;
 
@@ -65,6 +65,10 @@
        StringBuffer sb = new StringBuffer();
        sb.append("id: " + this.blockId + ", locator: " + 
this.locator.toString());
        return sb.toString();
+    }
+
+    public BlockDeploymentData getBlockDeploymentData() {
+        return null;
     }
     
 }

Modified: 
cocoon/whiteboard/block-deployer/src/impl/org/apache/cocoon/blockdeployer/block/Cob10Resolver.java
URL: 
http://svn.apache.org/viewcvs/cocoon/whiteboard/block-deployer/src/impl/org/apache/cocoon/blockdeployer/block/Cob10Resolver.java?view=diff&r1=160035&r2=160036
==============================================================================
--- 
cocoon/whiteboard/block-deployer/src/impl/org/apache/cocoon/blockdeployer/block/Cob10Resolver.java
 (original)
+++ 
cocoon/whiteboard/block-deployer/src/impl/org/apache/cocoon/blockdeployer/block/Cob10Resolver.java
 Mon Apr  4 05:56:46 2005
@@ -15,7 +15,7 @@
  */
 package org.apache.cocoon.blockdeployer.block;
 
-import org.apache.cocoon.blockdeployer.block.RemoteBlock;
+import org.apache.cocoon.blockdeployer.block.Block;
 
 /**
  * These services help to find required blocks and to resolve dependencies.
@@ -31,8 +31,8 @@
      * @param blocks - the know blocks to be deployed
      * @return all blocks that are necessary to make the passed blocks run
      */
-    public static RemoteBlock[] resolve(RemoteBlock[] blocks, RemoteBlock[] 
installedBlocks) {
-       return new RemoteBlock[0];
+    public static Block[] resolve(Block[] blocks, Block[] installedBlocks) {
+       return new Block[0];
     }
     
     /**
@@ -41,8 +41,8 @@
      * @param block
      * @return
      */
-    public static RemoteBlock[] getRequiredBlocks(RemoteBlock block) throws 
RecursiveBlockHierarchyException {
-        return new RemoteBlock[0];
+    public static Block[] getRequiredBlocks(Block block) throws 
RecursiveBlockHierarchyException {
+        return new Block[0];
     }
     
 }

Modified: 
cocoon/whiteboard/block-deployer/src/impl/org/apache/cocoon/blockdeployer/repository/ApplicationServer22Locator.java
URL: 
http://svn.apache.org/viewcvs/cocoon/whiteboard/block-deployer/src/impl/org/apache/cocoon/blockdeployer/repository/ApplicationServer22Locator.java?view=diff&r1=160035&r2=160036
==============================================================================
--- 
cocoon/whiteboard/block-deployer/src/impl/org/apache/cocoon/blockdeployer/repository/ApplicationServer22Locator.java
 (original)
+++ 
cocoon/whiteboard/block-deployer/src/impl/org/apache/cocoon/blockdeployer/repository/ApplicationServer22Locator.java
 Mon Apr  4 05:56:46 2005
@@ -15,16 +15,14 @@
  */
 package org.apache.cocoon.blockdeployer.repository;
 
-import java.io.ByteArrayOutputStream;
 import java.io.File;
+import java.io.FileReader;
 import java.io.IOException;
 import java.io.InputStream;
-import java.io.OutputStream;
 import java.net.MalformedURLException;
-import java.util.zip.ZipEntry;
 import java.util.zip.ZipInputStream;
 
-import org.apache.cocoon.blockdeployer.block.RemoteBlock;
+import org.apache.cocoon.blockdeployer.block.Block;
 import org.apache.cocoon.blockdeployer.locking.Lock;
 import org.apache.cocoon.blockdeployer.locking.LockingException;
 import org.apache.cocoon.blockdeployer.logging.LoggerFacade;
@@ -35,6 +33,8 @@
 import org.apache.commons.transaction.file.ResourceManagerException;
 import org.apache.commons.transaction.file.ResourceManagerSystemException;
 import org.apache.commons.transaction.util.FileHelper;
+import org.exolab.castor.xml.MarshalException;
+import org.exolab.castor.xml.ValidationException;
 
 /**
  * The <code>ApplicationServer22Locator</code> points to a Cocoon server that
@@ -42,8 +42,11 @@
  * 
  * @since 0.1
  */
-public class ApplicationServer22Locator implements Locator, Deployable, 
Lockable {
+public class ApplicationServer22Locator implements Locator, Deployable, 
Lockable, Transactional {
 
+    protected final static String WIRING_XML = "wiring.xml";
+    protected final static String WORK_DIR = "work";
+    
     private File basedir;
     private LoggerFacade logger;
 
@@ -53,8 +56,6 @@
      * @param basedir
      *            is a <code>File</code> object pointing to the directory
      *            where blocks can be deployed
-     * @param wiring
-     *            is the [EMAIL PROTECTED] Wiring} (representing wiring.xml) 
of a Cocoon server
      */
     public ApplicationServer22Locator(File basedir, LoggerFacade logger ) {
         if(logger == null) {
@@ -65,126 +66,53 @@
         this.logger = logger;
     }
 
-    public RemoteBlock getRemoteBlock(String blockUri) {
+    public Block getRemoteBlock(String blockUri) {
         return null;
     }
 
-    public RemoteBlock[] browse() {
+    public Block[] browse() {
         return null;
     }
 
-    /**
-     * Deploy an array of blocks. It makes sure that either any or all blocks
-     * are deployed.
-     */
-    public boolean deploy(RemoteBlock[] blocks) throws 
UnsupportedBlockException, IOException {        
-        // create the workdir
-        // FIXME workdir has to be configurable
-        String workDir = "WORK";
-        FileHelper.removeRec(new File(workDir));
-        new File(workDir).mkdirs();
-
-        // initialize the logger by using a implementation delegating all 
logging infos of 
-        // Commons transactions to BlockDeployer LoggingFacade
-        org.apache.commons.transaction.util.LoggerFacade ctLogger = new 
CommonsTransactionLogger(this.logger);
+    
+    public synchronized void deploy(Block block)  throws DeploymentException, 
UnsupportedBlockException {
+        // check whether transaction is available
+        if(frm == null) {
+            throw new IllegalStateException("A transaction has to be started 
before a block can be deployed!");
+        }
         
-        // start the file resource manager
-        if(this.logger.isDebugEnabled()) {
-               this.logger.debug(this.getClass(), "Initializing 
FileResourceManager - workdir:" 
-                + workDir + ", store:" + this.basedir.getAbsolutePath());
+        // check if the block can be deployed
+        if(false) {
+            throw new UnsupportedBlockException("Deploying a block of this 
type is not supported!");
         }
-        FileResourceManager frm = new FileResourceManager(this.basedir
-                .getAbsolutePath(), workDir, false, ctLogger, true);
 
-        String txId = "deploy";
-        boolean success = false;
-        long startDeployment = System.currentTimeMillis();
-        try {
-            // start resource manager
-            frm.start();
-            // start file system transaction
-            frm.startTransaction(txId);
-            this.logger.info(this.getClass(), "Started FileResourceManager 
transaction \"" + txId + "\"");
-
-            // loop over all blocks and deploy them using the file resource
-            // manager
-            for (int i = 0; i < blocks.length; i++) {
-                // check if the block can be deployed
-                if(false) {
-                    throw new UnsupportedBlockException("Deploying a block of 
this type is not supported!");
-                }
-                // create random string as base directory for the block to be 
deployer
+        // deploy block into next available directory and update wiring.xml 
accordingly
+        try {
+            if(!this.blockExists(this.wiring10, block.getBlockId())) {
                 String nextDir = LocatorUtils.getNextDirectory(this.basedir);
-                this.logger.info(this.getClass(), "Block to be deployed in " + 
nextDir);
-                // write block
-                ZipInputStream zis = new ZipInputStream(blocks[i].getStream());
-                ZipEntry document = null;
-                try {
-                    do {
-                        document = zis.getNextEntry();
-                        if (document != null) {
-                            // skip directories (only files have to be written)
-                            if (document.isDirectory()) {
-                                zis.closeEntry();
-                                continue;
-                            }
-                            // open output stream with the file/directory-name
-                            // saved in the ZIP file
-                            OutputStream out = frm.writeResource(txId, nextDir 
+ File.separator + document
-                                    .getName());
-                            ByteArrayOutputStream baos = new 
ByteArrayOutputStream();
-                            // loop over ZIP entry stream
-                            byte[] buffer = new byte[8192];
-                            int length = -1;
-                            while (zis.available() > 0) {
-                                length = zis.read(buffer, 0, 8192);
-                                if (length > 0) {
-                                    baos.write(buffer, 0, length);
-                                }
-                            }
-                            // write it to the output stream provided by the
-                            // file resource manager
-                            out.write(baos.toByteArray());
-                            // go to next entry
-                            zis.closeEntry();
-                        }
-                    } while (document != null);
-                } finally {
-                    zis.close();
-                }
-                // add new block to wiring object
-
+                this.logger.debug(this.getClass(), "Block to be deployed in " 
+ nextDir);
+                LocatorUtils.writeZip(new ZipInputStream(block.getStream()), 
this.frm, this.txId, nextDir);
             }
+            this.updateWiring(block);            
+        } catch(Exception ex) {
+            throw new DeploymentException("Block " + block.getBlockId() + " 
couldn't be deployed.", ex);
+        }
+    }
+    
+    protected void updateWiring(Block block) {
 
-            // write wiring
 
-            // commit transaction
-            frm.commitTransaction(txId);
-            success = true;
-            this.logger.debug(this.getClass(), "Deployment took " + 
(System.currentTimeMillis() - startDeployment) + "ms"); 
-            this.logger.info(this.getClass(), "Transaction \"" + txId + "\" 
has been committed");
-        } catch (Exception rme) {
-            try {
-                frm.rollbackTransaction(txId);
-                this.logger.error(this.getClass(), "Transaction \"" + txId + 
"\" has been roled back: " + rme.getStackTrace());
-                return false;
-            } catch (ResourceManagerException rme1) {
-                this.logger.error(this.getClass(), "While rolling back 
transaction \"" + txId + "\" an error occurred: " + rme1.getStackTrace());
-            }
-            throw new IOException(this.getClass().getName() + ": While 
deploying the passed blocks an error occurred. Check the logs for details. " + 
rme.getClass());
-        } finally {
-            try {
-                frm.stop(FileResourceManager.SHUTDOWN_MODE_NORMAL);
-            } catch (ResourceManagerSystemException e) {
-                String msg = "the filesystem transaction that extracts all 
blocks was NOT successful.";
-                if(success) {
-                       msg = "the filesystem transaction that extracts all 
blocks WAS successful.";
-                }
-                throw new RuntimeException("FileResourceManager wasn't shut 
down normally - " + msg);
+    }
+    
+    protected boolean blockExists(Wiring wiring10, String blockId) {
+        for(int i = 0; i < wiring10.getBlockCount(); i++) {
+            if(wiring10.getBlock(i).getId().equals(blockId)) {
+                return true;
             }
         }
-        return true;
-    } 
+        return false;
+    }
+    
     
     public String getIdentifier() {
         try {
@@ -194,9 +122,14 @@
         }
     }
 
-
+    public InputStream getBlockAsStream(String blockId) throws IOException, 
BlockNotFoundException {
+        return null;
+    }
+        
+    
+    // ------- locking 
--------------------------------------------------------------
+    
     public void setLock(Lock lock) throws LockingException {
-
     }
 
     public Lock getLockingStatus() throws LockingException {
@@ -207,8 +140,122 @@
         return false;
     }
 
-    public InputStream getBlockAsStream(String blockId) throws IOException, 
BlockNotFoundException {
-        return null;
+    // ------- transaction handling 
-------------------------------------------------
+    
+    protected FileResourceManager frm = null;
+    protected String txId = "deploy";
+    protected Wiring wiring10 = null;
+
+    public synchronized void startTransaction() throws TransactionException {
+        // check if a transaction has already been started, if so, throw an 
exception
+        if(frm != null) {
+            throw new TransactionException("Transaction has already been 
started!");
+        }
+
+        // read in wiring.xml
+        try {
+            readWiring();
+        } catch (Exception ex) {
+            String msg = "Transaction couldn't be started because problems 
when reading application server's wiring.xml";
+            logger.error(ApplicationServer22Locator.class, msg);
+            throw new TransactionException(msg);
+        }
+        
+        // create and reset the workdir
+        // FIXME workdir has to be a temporary directory
+        String workDir = "WORK";
+        FileHelper.removeRec(new File(workDir));
+        new File(workDir).mkdirs();
+
+        // start the file resource manager
+        if(this.logger.isDebugEnabled()) {
+            this.logger.debug(this.getClass(), "Initializing 
FileResourceManager - workdir:" 
+                + workDir + ", store:" + this.basedir.getAbsolutePath());
+        }
+        
+        // initialize and start file resource manager and start transaction
+        try {
+            this.frm = new FileResourceManager(this.basedir.getAbsolutePath(), 
+                    workDir, false, new CommonsTransactionLogger(this.logger), 
true);            
+            this.frm.start();
+            this.frm.startTransaction(txId);   
+            this.logger.debug(this.getClass(), "Started FileResourceManager 
transaction \"" + txId + "\"");
+        } catch(ResourceManagerException rme) {
+            throw new TransactionException("Can't start transaction.", rme);
+        }
+    }
+
+    public void commitTransaction()  throws TransactionException {
+        if(frm == null) {
+            throw new TransactionException("You have to start a transaction 
before it can be committed!");
+        }
+
+        try {
+            writeWiring();
+            frm.commitTransaction(txId);
+            this.logger.debug(ApplicationServer22Locator.class, "Filesystem 
transaction has been committed successfully.");
+        } catch (ResourceManagerException ex) {
+            throw new TransactionException("Transaction couldn't be 
committed!", ex);
+        } catch (Exception ex) {
+            String msg = "Transaction couldn't be written because of problems 
when writing the wiring information.";
+            logger.error(ApplicationServer22Locator.class, msg);
+            throw new TransactionException(msg);
+        } finally {
+            stopResourceManager();
+        }
+    }
+
+    
+    public void rollbackTransaction()   throws TransactionException {
+        if(frm == null) {
+            throw new TransactionException("You have to start a transaction 
before it can be rolled back!");
+        }
+        try {
+            frm.rollbackTransaction(txId);
+            this.logger.debug(ApplicationServer22Locator.class, "Filesystem 
transaction has been rolled back successfully.");            
+        } catch (ResourceManagerException ex) {
+            this.logger.error(this.getClass(), "Transaction \"" + txId + "\" 
has been roled back: " + ex.getStackTrace());            
+            throw new TransactionException("Transaction couldn't be 
committed!", ex);
+        }  finally {
+            stopResourceManager();
+        }
+    }
+    
+    private void readWiring() throws MarshalException, ValidationException, 
IOException {
+        // read the wiring information (currently we have to support only 
+        // http://apache.org/cocoon/blocks/wiring/1.0)
+        File wiringDescriptor = new File(this.basedir, WIRING_XML);
+        if(wiringDescriptor.exists()) {
+            wiring10 = (Wiring) Wiring.unmarshal(new 
FileReader(wiringDescriptor));
+            logger.info("Using wiring descriptor at " + 
wiringDescriptor.getCanonicalPath().toString());                
+
+            // log already deployed blocks
+            if(logger.isDebugEnabled()) {
+                StringBuffer logInformation = new StringBuffer("Following 
blocks are already installed: ");
+                for(int i = 0; i < wiring10.getBlockCount(); i++) {
+                    logInformation.append(wiring10.getBlock(i).getId() + "; ");
+                }
+                logger.debug(ApplicationServer22Locator.class, 
logInformation.toString());
+            }
+        } else {
+            wiring10 = new Wiring();
+        }  
+    }
+    
+    private void writeWiring()  throws MarshalException, ValidationException, 
IOException {
+        
     }
+
+    private void stopResourceManager() {
+        try {
+            frm.stop(FileResourceManager.SHUTDOWN_MODE_NORMAL);
+        } catch (ResourceManagerSystemException e) {
+            String msg = "The filesystem transaction that extracts all blocks 
was NOT successful.";
+            throw new RuntimeException("FileResourceManager wasn't shut down 
normally - " + msg);
+        } finally {
+            // null out FileResourceManager so that another transaction can 
start
+            frm = null;
+        }
+    }    
 
 }

Modified: 
cocoon/whiteboard/block-deployer/src/impl/org/apache/cocoon/blockdeployer/repository/DefaultRepository.java
URL: 
http://svn.apache.org/viewcvs/cocoon/whiteboard/block-deployer/src/impl/org/apache/cocoon/blockdeployer/repository/DefaultRepository.java?view=diff&r1=160035&r2=160036
==============================================================================
--- 
cocoon/whiteboard/block-deployer/src/impl/org/apache/cocoon/blockdeployer/repository/DefaultRepository.java
 (original)
+++ 
cocoon/whiteboard/block-deployer/src/impl/org/apache/cocoon/blockdeployer/repository/DefaultRepository.java
 Mon Apr  4 05:56:46 2005
@@ -20,7 +20,7 @@
 import java.util.Iterator;
 import java.util.List;
 
-import org.apache.cocoon.blockdeployer.block.RemoteBlock;
+import org.apache.cocoon.blockdeployer.block.Block;
 import org.apache.cocoon.blockdeployer.repository.Locator;
 import org.apache.cocoon.blockdeployer.repository.Repository;
 
@@ -45,7 +45,7 @@
         this.locators.remove(locator);   
     }
 
-    public RemoteBlock[] browse() {
+    public Block[] browse() {
         return null;
     }
 
@@ -56,13 +56,13 @@
      * @param blockId is the URI of the block
      * @throws BlockNotFoundException if the block can't be found in any 
locator.
      */
-    public RemoteBlock[] lookupBlock(String blockId) throws 
BlockNotFoundException {
+    public Block[] lookupBlock(String blockId) throws BlockNotFoundException {
         ArrayList tempLocators = new ArrayList();
         // if the locator has the requested block it is added
         Iterator locatorsIterator = this.locators.iterator();
         while(locatorsIterator.hasNext()) {
             Locator locator = (Locator) locatorsIterator.next();
-            RemoteBlock remoteBlock = null;
+            Block remoteBlock = null;
             try {
                 remoteBlock = locator.getRemoteBlock(blockId);
                 tempLocators.add(remoteBlock);   
@@ -73,12 +73,13 @@
             }
         }
         if(tempLocators.size() == 0) {
-            throw new BlockNotFoundException("The block " + blockId + " can't 
be found in any of the provided locators.");
+            throw new BlockNotFoundException("The block " + blockId + 
+                    " can't be found in any of the provided locators.");
         }
         Object[] array = tempLocators.toArray();
-        RemoteBlock[] resultRemoteBlock = new RemoteBlock[tempLocators.size()];
+        Block[] resultRemoteBlock = new Block[tempLocators.size()];
         for(int i = 0; i < tempLocators.size(); i++) {
-            resultRemoteBlock[i] = (RemoteBlock) array[i];
+            resultRemoteBlock[i] = (Block) array[i];
         }
         return resultRemoteBlock;
     }

Modified: 
cocoon/whiteboard/block-deployer/src/impl/org/apache/cocoon/blockdeployer/repository/DependencyBuilder.java
URL: 
http://svn.apache.org/viewcvs/cocoon/whiteboard/block-deployer/src/impl/org/apache/cocoon/blockdeployer/repository/DependencyBuilder.java?view=diff&r1=160035&r2=160036
==============================================================================
--- 
cocoon/whiteboard/block-deployer/src/impl/org/apache/cocoon/blockdeployer/repository/DependencyBuilder.java
 (original)
+++ 
cocoon/whiteboard/block-deployer/src/impl/org/apache/cocoon/blockdeployer/repository/DependencyBuilder.java
 Mon Apr  4 05:56:46 2005
@@ -15,14 +15,14 @@
  */
 package org.apache.cocoon.blockdeployer.repository;
 
-import org.apache.cocoon.blockdeployer.block.RemoteBlock;
+import org.apache.cocoon.blockdeployer.block.Block;
 
 /**
  * @since 0.1
  */
 public class DependencyBuilder {
 
-   public static RemoteBlock[] getDependingBlocks(RemoteBlock repositoryBlock) 
{
+   public static Block[] getDependingBlocks(Block repositoryBlock) {
        return null;
    }
    

Modified: 
cocoon/whiteboard/block-deployer/src/impl/org/apache/cocoon/blockdeployer/repository/FilesystemLocator.java
URL: 
http://svn.apache.org/viewcvs/cocoon/whiteboard/block-deployer/src/impl/org/apache/cocoon/blockdeployer/repository/FilesystemLocator.java?view=diff&r1=160035&r2=160036
==============================================================================
--- 
cocoon/whiteboard/block-deployer/src/impl/org/apache/cocoon/blockdeployer/repository/FilesystemLocator.java
 (original)
+++ 
cocoon/whiteboard/block-deployer/src/impl/org/apache/cocoon/blockdeployer/repository/FilesystemLocator.java
 Mon Apr  4 05:56:46 2005
@@ -23,8 +23,8 @@
 import java.net.MalformedURLException;
 import java.util.zip.ZipInputStream;
 
-import org.apache.cocoon.blockdeployer.block.RemoteBlock;
-import org.apache.cocoon.blockdeployer.block.RemoteBlockFactory;
+import org.apache.cocoon.blockdeployer.block.Block;
+import org.apache.cocoon.blockdeployer.block.BlockFactory;
 import org.apache.cocoon.blockdeployer.logging.LoggerFacade;
 import org.apache.cocoon.blockdeployer.utils.LocatorUtils;
 
@@ -73,8 +73,8 @@
             this.logger.info(this.getClass(), infoMsg);
             throw new BlockNotFoundException(infoMsg);
         }
-        InputStream descriptorInputStream = null;
-        return LocatorUtils.getDescriptorInputStream(new ZipInputStream(new 
FileInputStream(cobFile)), this.logger);
+        ZipInputStream descriptorInputStream = new ZipInputStream(new 
FileInputStream(cobFile));
+        return LocatorUtils.getDescriptorInputStream(descriptorInputStream, 
this.logger);
     }
     
     protected File getBlockAsFile(String blockUri) throws 
FileNotFoundException {
@@ -83,20 +83,19 @@
             throw new IllegalArgumentException("Can't find the requested block 
" + blockUri + 
                     ". Wrong schema, only http:// block uris are allowed.");
         }
-        
         return LocatorUtils.getBlockAsFile(this.basedir, 
blockUri.substring("http:/".length()));
     }
     
-    public RemoteBlock getRemoteBlock(String blockUri) throws IOException, 
BlockNotFoundException {
+    public Block getRemoteBlock(String blockUri) throws IOException, 
BlockNotFoundException {
         InputStream descriptorInputStream = 
this.getBlockDescriptorAsStream(blockUri);
         if(descriptorInputStream == null) {
             throw new BlockNotFoundException("Block " + blockUri + " not 
found.");
         }
-        return RemoteBlockFactory.getRemoteBlock(descriptorInputStream, this);
+        return BlockFactory.getRemoteBlock(descriptorInputStream, this);
     }  
     
-    public RemoteBlock[] browse() {
-        return null;
+    public Block[] browse() {
+        throw new UnsupportedOperationException("Not supported yet");
     }
     
     public String toString() {

Modified: 
cocoon/whiteboard/block-deployer/src/impl/org/apache/cocoon/blockdeployer/utils/CommonsTransactionLogger.java
URL: 
http://svn.apache.org/viewcvs/cocoon/whiteboard/block-deployer/src/impl/org/apache/cocoon/blockdeployer/utils/CommonsTransactionLogger.java?view=diff&r1=160035&r2=160036
==============================================================================
--- 
cocoon/whiteboard/block-deployer/src/impl/org/apache/cocoon/blockdeployer/utils/CommonsTransactionLogger.java
 (original)
+++ 
cocoon/whiteboard/block-deployer/src/impl/org/apache/cocoon/blockdeployer/utils/CommonsTransactionLogger.java
 Mon Apr  4 05:56:46 2005
@@ -35,7 +35,7 @@
        }
 
        public void logInfo(String msg) {
-        this.logger.info(PREFIX + msg);
+        this.logger.debug(PREFIX + msg);
        }
 
        public void logFine(String msg) {

Modified: 
cocoon/whiteboard/block-deployer/src/impl/org/apache/cocoon/blockdeployer/utils/LocatorUtils.java
URL: 
http://svn.apache.org/viewcvs/cocoon/whiteboard/block-deployer/src/impl/org/apache/cocoon/blockdeployer/utils/LocatorUtils.java?view=diff&r1=160035&r2=160036
==============================================================================
--- 
cocoon/whiteboard/block-deployer/src/impl/org/apache/cocoon/blockdeployer/utils/LocatorUtils.java
 (original)
+++ 
cocoon/whiteboard/block-deployer/src/impl/org/apache/cocoon/blockdeployer/utils/LocatorUtils.java
 Mon Apr  4 05:56:46 2005
@@ -21,6 +21,7 @@
 import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.io.InputStream;
+import java.io.OutputStream;
 import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
@@ -29,6 +30,8 @@
 
 import org.apache.cocoon.blockdeployer.logging.LoggerFacade;
 import org.apache.cocoon.blockdeployer.repository.Locator;
+import org.apache.commons.transaction.file.FileResourceManager;
+import org.apache.commons.transaction.file.ResourceManagerException;
 
 /**
  * @since 0.1
@@ -161,6 +164,7 @@
                 }
             } catch(NumberFormatException nfe) {
                // ignore it because directories with alpha characters are no 
problem
+                // as they don't conflict with the namespace
             }
         }
         
@@ -196,5 +200,52 @@
             logger.error(errorMsg);            
             throw new IllegalArgumentException(errorMsg);
         }            
+    }
+
+    /**
+     * Write (extract) a zip file using the jakarta-commons-transaction 
FileResourceManager
+     * 
+     * @param blockStream
+     * @param frm
+     * @param txId
+     * @param targetDir
+     * @throws IOException
+     * @throws ResourceManagerException
+     */
+    public static void writeZip(ZipInputStream blockStream, 
FileResourceManager frm, String txId, String targetDir) 
+        throws IOException, ResourceManagerException {
+        ZipEntry document = null;
+        try {
+            do {
+                document = blockStream.getNextEntry();
+                if (document != null) {
+                    // skip directories (only files have to be written)
+                    if (document.isDirectory()) {
+                        blockStream.closeEntry();
+                        continue;
+                    }
+                    // open output stream with the file/directory-name
+                    // saved in the ZIP file
+                    OutputStream out = frm.writeResource(
+                        txId, targetDir + File.separator + document.getName());
+                    ByteArrayOutputStream baos = new ByteArrayOutputStream();
+                    // loop over ZIP entry stream
+                    byte[] buffer = new byte[8192];
+                    int length = -1;
+                    while (blockStream.available() > 0) {
+                        length = blockStream.read(buffer, 0, 8192);
+                        if (length > 0) {
+                            baos.write(buffer, 0, length);
+                        }
+                    }
+                    // write it to the output stream provided by the file 
resource manager
+                    out.write(baos.toByteArray());
+                    // go to next entry
+                    blockStream.closeEntry();
+                }
+            } while (document != null);
+        } finally {
+            blockStream.close();
+        }
     }
 }

Modified: 
cocoon/whiteboard/block-deployer/test/junit/org/apache/cocoon/blockdeployer/Constants.java
URL: 
http://svn.apache.org/viewcvs/cocoon/whiteboard/block-deployer/test/junit/org/apache/cocoon/blockdeployer/Constants.java?view=diff&r1=160035&r2=160036
==============================================================================
--- 
cocoon/whiteboard/block-deployer/test/junit/org/apache/cocoon/blockdeployer/Constants.java
 (original)
+++ 
cocoon/whiteboard/block-deployer/test/junit/org/apache/cocoon/blockdeployer/Constants.java
 Mon Apr  4 05:56:46 2005
@@ -26,8 +26,7 @@
     // basedirs for locators
     public static final String VALID_LOCATION_1 = 
"test/sample-repositories/rep1";
     public static final String VALID_ASL_1 = 
"test/sample-repositories/application-server/WEB-INF/blocks";
-    public static final String VALID_ASL21_1 = 
"test/sample-repositories/application-server-21";    
-    public static final String TMP_VALID_ASL_1 = TMP_JUNIT + "/asf1";
+    public static final String TMP_VALID_ASL_1 = TMP_JUNIT + 
"/asf1/WEB-INF/blocks";
     public static final String INVALID_LOCATION = "bla";
     
     // available and valid block

Modified: 
cocoon/whiteboard/block-deployer/test/junit/org/apache/cocoon/blockdeployer/repository/ApplicationServer22LocatorTest.java
URL: 
http://svn.apache.org/viewcvs/cocoon/whiteboard/block-deployer/test/junit/org/apache/cocoon/blockdeployer/repository/ApplicationServer22LocatorTest.java?view=diff&r1=160035&r2=160036
==============================================================================
--- 
cocoon/whiteboard/block-deployer/test/junit/org/apache/cocoon/blockdeployer/repository/ApplicationServer22LocatorTest.java
 (original)
+++ 
cocoon/whiteboard/block-deployer/test/junit/org/apache/cocoon/blockdeployer/repository/ApplicationServer22LocatorTest.java
 Mon Apr  4 05:56:46 2005
@@ -23,7 +23,9 @@
 
 import org.apache.cocoon.blockdeployer.Constants;
 import org.apache.cocoon.blockdeployer.LogEnabledTestCase;
-import org.apache.cocoon.blockdeployer.block.RemoteBlock;
+import org.apache.cocoon.blockdeployer.block.Block;
+import org.apache.cocoon.blockdeployer.block.BlockDeploymentData;
+import org.apache.cocoon.blockdeployer.block.descriptor.BlockDescriptor;
 import org.easymock.MockControl;
 
 /**
@@ -31,51 +33,133 @@
  */
 public class ApplicationServer22LocatorTest extends LogEnabledTestCase {
 
+    private final static String ASL = Constants.TMP_VALID_ASL_1;
+    
     private void setupExamples() {
-        FileUtil.mkdir(Constants.TMP_VALID_ASL_1);
-        FileUtil.copyDir(Constants.VALID_ASL_1, Constants.TMP_VALID_ASL_1);
+        FileUtil.deleteDir(ASL);
+        FileUtil.mkdirs(ASL);
+        FileUtil.copyDir(ASL, Constants.TMP_VALID_ASL_1);
     }
     
-    private void removeExamples() {
-        FileUtil.deleteDir(Constants.TMP_VALID_ASL_1);        
+    public void testTransactionManagement() {
+        ApplicationServer22Locator asl = new ApplicationServer22Locator(new 
File(ASL), this.logger);
+        try {
+            asl.commitTransaction();
+            fail("Calling commitTransaction() before calling start ransaction 
mustn't work.");            
+        } catch (TransactionException ex) {
+            // expected behaviour
+        }    
+        
+        try {
+            asl.rollbackTransaction();
+            fail("Calling rollbackTransaction() before calling start 
ransaction mustn't work.");            
+        } catch (TransactionException ex) {
+            // expected behaviour
+        }     
+        
+        try {
+            asl.startTransaction();
+            assertNotNull(asl.frm);
+            assertNotNull(asl.wiring10);
+        } catch (TransactionException ex) {
+            fail("startTransaction() on a new ApplicationServer22Locator 
should work.");
+        }
+        
+        try {
+            asl.startTransaction();
+            fail("Calling startTransaction() twice should not work.");         
   
+        } catch (TransactionException ex) {
+            // expected behaviour
+        }  
+        assertNotNull(asl.frm);
+        assertNotNull(asl.wiring10);        
+        
     }
     
     public void testDeploy() throws Exception {
         // copy examples into tmp location
         setupExamples();
-        // first hack to run the deploy method             
-        ApplicationServer22Locator asl = new ApplicationServer22Locator(new 
File(Constants.TMP_VALID_ASL_1), this.logger);
-        RemoteBlock b[] = new RemoteBlock[1];
-        b[0] = createBlockMock(null);
+        // deploy method             
+        ApplicationServer22Locator asl = new ApplicationServer22Locator(new 
File(ASL), this.logger);
+        
+        asl.startTransaction();
+        
+        Block b = createBlockMock("http://bla";, null);
         asl.deploy(b);
+        
+        asl.commitTransaction();
+        
+        // test that the block is extracted correctly by checking whether the 
+        // COB_INF and the block.xml are available
+        
         // clean up
-        // removeExamples();
+        // FileUtil.deleteDir(ASL);        
         
     }
     
-    private RemoteBlock createBlockMock(String file) throws Exception {
+    /*
+    public void testAddBlockToWiring() throws Exception {
+        ApplicationServer22Locator asl = new ApplicationServer22Locator(
+                new File(ASL), this.logger);
+        String blockId = "http://bla";;
+        Block block = createBlockMock(blockId, null);
+        Wiring wiring = new Wiring();
+        asl.addBlockToWiring(wiring, block);
+        
+        // check that only one block is set
+        int blockCount = wiring.getBlockCount();
+        // assertEquals(blockCount, 1);
+        
+        // check that the right number of connections is set
+        Connections connections = wiring.getBlock(0).getConnections();
+        int connectionsCount = connections.getConnectionCount();
+        // assertEquals(connectionsCount, 1);
+        
+        // check that the right connection is set
+        Connection connection = connections.getConnection(0);
+        // assertEquals(connection.getBlock(), blockId);
+    }
+    */
+
+    private Block createBlockMock(String id, BlockDeploymentData deployData) 
throws Exception {
         // create the Block
-        MockControl blockControl = 
MockControl.createControl(RemoteBlock.class);
-        RemoteBlock block = (RemoteBlock) blockControl.getMock();
+        MockControl blockControl = MockControl.createControl(Block.class);
+        Block block = (Block) blockControl.getMock();
         
         // create the block descriptor information
+        block.getBlockDescriptor();
+        blockControl.setReturnValue(createBlockDescriptorMock(id));
         
-        // create the Inputstream containing block as binary
-        try {
-            block.getStream();
-            InputStream is = new FileInputStream(
-                    Constants.VALID_LOCATION_1 + File.separator +
-                    Constants.AVAILABLE_VALID_WEBMAIL1343_BLOCKPATH + 
-                    File.separator + 
Constants.AVAILABLE_VALID_WEBMAIL1343_BLOCKFILE) ;
-            blockControl.setReturnValue(is);            
-        } catch (Exception e) {
-            throw e;
-        }
+        // set the id
+        block.getBlockId();
+        blockControl.setReturnValue(id);
+
+        // create the deployment meta information
+        block.getBlockDeploymentData();
+        blockControl.setReturnValue(deployData);
         
+        // create the Inputstream containing block as binary
+        block.getStream();
+        InputStream is = new FileInputStream(
+                Constants.VALID_LOCATION_1 + File.separator +
+                Constants.AVAILABLE_VALID_WEBMAIL1343_BLOCKPATH + 
+                File.separator + 
Constants.AVAILABLE_VALID_WEBMAIL1343_BLOCKFILE) ;
+        blockControl.setReturnValue(is);            
+
         blockControl.replay();
-        
         return block;
+    }
+    
+    
+    private BlockDescriptor createBlockDescriptorMock(String id) {
+        MockControl descriptorControl = 
MockControl.createControl(BlockDescriptor.class);
+        BlockDescriptor descriptor = (BlockDescriptor) 
descriptorControl.getMock();
+        
+        descriptor.getBlockId();
+        descriptorControl.setReturnValue(id);
         
+        descriptorControl.replay();
+        return descriptor;
     }
     
 }

Modified: 
cocoon/whiteboard/block-deployer/test/junit/org/apache/cocoon/blockdeployer/repository/DefaultRepositoryTest.java
URL: 
http://svn.apache.org/viewcvs/cocoon/whiteboard/block-deployer/test/junit/org/apache/cocoon/blockdeployer/repository/DefaultRepositoryTest.java?view=diff&r1=160035&r2=160036
==============================================================================
--- 
cocoon/whiteboard/block-deployer/test/junit/org/apache/cocoon/blockdeployer/repository/DefaultRepositoryTest.java
 (original)
+++ 
cocoon/whiteboard/block-deployer/test/junit/org/apache/cocoon/blockdeployer/repository/DefaultRepositoryTest.java
 Mon Apr  4 05:56:46 2005
@@ -19,7 +19,7 @@
 
 import junit.framework.TestCase;
 
-import org.apache.cocoon.blockdeployer.block.RemoteBlock;
+import org.apache.cocoon.blockdeployer.block.Block;
 import org.easymock.MockControl;
 
 /**
@@ -46,7 +46,7 @@
         defaultRepository.addLocator(createMockLocator(locator3Name, 
allAvailableBlocks, new String[0], new String[] {"myBlock"}));                
         
         // test that all locators return the block
-        RemoteBlock[] resultRemoteBlock = 
defaultRepository.lookupBlock("myBlock");
+        Block[] resultRemoteBlock = defaultRepository.lookupBlock("myBlock");
         assertEquals(resultRemoteBlock[0].getLocator().getIdentifier(), 
locator1Name);
         assertEquals(resultRemoteBlock[1].getLocator().getIdentifier(), 
locator2Name);   
         assertEquals(resultRemoteBlock[2].getLocator().getIdentifier(), 
locator3Name);      
@@ -95,7 +95,7 @@
                 createMockLocator(locator3Name, allAvailableBlocks, new 
String[0], new String[] {"myBlock1", "myBlock4", "myBlock3"}));                
         
         // test that myBlock3 is returned twice, having the locators locator2 
and locator3
-        RemoteBlock[] resultRemoteBlock = 
defaultRepository.lookupBlock("myBlock3");
+        Block[] resultRemoteBlock = defaultRepository.lookupBlock("myBlock3");
         assertEquals(resultRemoteBlock[0].getLocator().getIdentifier(), 
locator2Name);
         assertEquals(resultRemoteBlock[1].getLocator().getIdentifier(), 
locator3Name);   
         assertEquals(resultRemoteBlock.length, 2);
@@ -119,7 +119,7 @@
         defaultRepository.addLocator(
                 createMockLocator(locator1Name, new String[0], 
allUnavailableBlocks, new String[0]));    
         try {
-            RemoteBlock[] resultRemoteBlock = 
defaultRepository.lookupBlock("myBlock1");
+            Block[] resultRemoteBlock = 
defaultRepository.lookupBlock("myBlock1");
             fail("This block shouldn't be available in the repository and 
therefore throw an BlockNotFoundException");
         } catch(BlockNotFoundException bnfe) {
             // correct behaviour
@@ -127,7 +127,7 @@
     }
     
     /**
-     * Create a mock locator containg all <code>locatorBlocks</code> and 
returning a RemoteBlock object for them.
+     * Create a mock locator containg all <code>locatorBlocks</code> and 
returning a Block object for them.
      * If they don't contain a certain block, the locator returns null.
      * 
      * @param name
@@ -137,9 +137,9 @@
      */
     private Locator createMockLocator(String name, String[] 
allAvailableBlocks, String[] allUnavailableBlocks, String[] locatorBlocks) 
throws Exception {
         
-        // create a mock for a RemoteBlock
-        MockControl blockControl = 
MockControl.createControl(RemoteBlock.class);
-        RemoteBlock remoteBlock = (RemoteBlock) blockControl.getMock();
+        // create a mock for a Block
+        MockControl blockControl = MockControl.createControl(Block.class);
+        Block remoteBlock = (Block) blockControl.getMock();
 
         // create a mock for the locator
         MockControl control1 = MockControl.createControl(Locator.class);

Modified: 
cocoon/whiteboard/block-deployer/test/junit/org/apache/cocoon/blockdeployer/repository/FilesystemLocatorTest.java
URL: 
http://svn.apache.org/viewcvs/cocoon/whiteboard/block-deployer/test/junit/org/apache/cocoon/blockdeployer/repository/FilesystemLocatorTest.java?view=diff&r1=160035&r2=160036
==============================================================================
--- 
cocoon/whiteboard/block-deployer/test/junit/org/apache/cocoon/blockdeployer/repository/FilesystemLocatorTest.java
 (original)
+++ 
cocoon/whiteboard/block-deployer/test/junit/org/apache/cocoon/blockdeployer/repository/FilesystemLocatorTest.java
 Mon Apr  4 05:56:46 2005
@@ -24,7 +24,7 @@
 
 import org.apache.cocoon.blockdeployer.Constants;
 import org.apache.cocoon.blockdeployer.LogEnabledTestCase;
-import org.apache.cocoon.blockdeployer.block.RemoteBlock;
+import org.apache.cocoon.blockdeployer.block.Block;
 import org.apache.cocoon.blockdeployer.utils.LocatorUtils;
 
 /**
@@ -55,7 +55,7 @@
         assertNotNull(filesystemLocator);
         
         // get the block that should be available and test its data
-        RemoteBlock remoteBlock = null;
+        Block remoteBlock = null;
         try {
             remoteBlock = 
filesystemLocator.getRemoteBlock(Constants.AVAILABLE_VALID_WEBMAIL1343_BLOCKID);
         } catch(Exception e) {
@@ -87,7 +87,7 @@
         }
 
         // try to get an unavailable block
-        RemoteBlock remoteBlock = null;
+        Block remoteBlock = null;
         try {
             remoteBlock = 
filesystemLocator.getRemoteBlock(Constants.AVAILABLE_INVALID_SAMPLE_BLOCKID);
             fail("The block URI is valid but at this place there is no block. 
An exception should be raised.");

Modified: 
cocoon/whiteboard/block-deployer/test/sample-repositories/application-server/WEB-INF/blocks/wiring.xml
URL: 
http://svn.apache.org/viewcvs/cocoon/whiteboard/block-deployer/test/sample-repositories/application-server/WEB-INF/blocks/wiring.xml?view=diff&r1=160035&r2=160036
==============================================================================
--- 
cocoon/whiteboard/block-deployer/test/sample-repositories/application-server/WEB-INF/blocks/wiring.xml
 (original)
+++ 
cocoon/whiteboard/block-deployer/test/sample-repositories/application-server/WEB-INF/blocks/wiring.xml
 Mon Apr  4 05:56:46 2005
@@ -1,28 +1,51 @@
-<!-- in Stefan's example "blocks" instead of "wiring" is used -->
-<wiring xmlns="http://apache.org/cocoon/blocks/wiring/1.0";>
+<!--
+  Copyright 1999-2004 The Apache Software Foundation
+
+  Licensed 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. 
+-->
+<wiring xmlns="http://apache.org/cocoon/blocks/wiring/1.0";
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"; 
+       xsi:schemaLocation="http://apache.org/cocoon/blocks/wiring/1.0 
wiring-schema-1.0.xsd"
+>
 
   <block id="http://mycompany.com/webmail/1.3.43"; 
          location="WEB-INF/blocks/384938958499">
-    <mount>/mail/</mount>
+    <mount path="/mail/"/>
     <connections>
-      <connection 
-        
name="external-skin">http://yetanothercompany.com/skins/fancy/1.2.2</connection>
-      <connection
-        
name="internal-skin">http://mycompany.com/skins/corporate/34.3.345</connection>
-      <connection
-        
name="repository">http://mycompany.com/repositories/email/exchange/3.2.1</connection>
+      <connection name="external-skin" 
+       block="http://yetanothercompany.com/skins/fancy/1.2.2"/>
+      <connection name="internal-skin"
+       block="http://mycompany.com/skins/corporate/34.3.345"/>
+      <connection name="repository"
+       block="http://mycompany.com/repositories/email/exchange/3.2.1"/>
     </connections>
     <properties>
-      <property name="user">guest</property>
-      <property name="password">sj3u493</property>
+      <property name="user" value="guest"/>
+      <property name="password" value="sj3u493"/>
     </properties>
   </block>
 
   <block id="http://mycompany.com/repositories/email/exchange/3.2.1"; 
          location="WEB-INF/blocks/394781274834">
     <properties>
-      <property name="host">mail.blah.org</property>
+      <property name="host" value="mail.blah.org"/>
     </properties>
   </block>
+
+  <block id="http://yetanothercompany.com/skins/fancy/1.2.2"; 
+         location="WEB-INF/blocks/947384127832"/>
+
+  <block id="http://mycompany.com/skins/corporate/34.3.345"; 
+         location="WEB-INF/blocks/746394782637"/>
 
 </wiring>


Reply via email to