diff --git a/config/alfresco/avm-services-context.xml b/config/alfresco/avm-services-context.xml
index 8ac5b08c7b..9a06fbe21c 100644
--- a/config/alfresco/avm-services-context.xml
+++ b/config/alfresco/avm-services-context.xml
@@ -185,6 +185,20 @@
+
+
+
+
+
+ org.alfresco.service.cmr.avmsync.AVMSyncService
+
+
+ avmsync
+
+
+ ${avm.remote.port}
+
+
diff --git a/config/alfresco/remote-avm-test-context.xml b/config/alfresco/remote-avm-test-context.xml
index c824bdb6b1..a7268b5e4a 100644
--- a/config/alfresco/remote-avm-test-context.xml
+++ b/config/alfresco/remote-avm-test-context.xml
@@ -4,7 +4,7 @@
-
+
@@ -18,4 +18,18 @@
+
+
+
+
+ rmi://localhost:1313/avmsync
+
+
+ org.alfresco.service.cmr.avmsync.AVMSyncService
+
+
+ true
+
+
+
diff --git a/source/java/org/alfresco/repo/avm/AVMRemoteOutputStream.java b/source/java/org/alfresco/repo/avm/AVMRemoteOutputStream.java
new file mode 100644
index 0000000000..e39debd580
--- /dev/null
+++ b/source/java/org/alfresco/repo/avm/AVMRemoteOutputStream.java
@@ -0,0 +1,111 @@
+/*
+ * Copyright (C) 2006 Alfresco, Inc.
+ *
+ * Licensed under the Mozilla Public License version 1.1
+ * with a permitted attribution clause. You may obtain a
+ * copy of the License at
+ *
+ * http://www.alfresco.org/legal/license.txt
+ *
+ * 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.alfresco.repo.avm;
+
+import java.io.IOException;
+import java.io.OutputStream;
+
+public class AVMRemoteOutputStream extends OutputStream
+{
+ private AVMRemote fAVMRemote;
+
+ private String fHandle;
+
+ /**
+ * Create a new one.
+ * @param handle The handle returned from an AVMRemote call.
+ * @param remote The AVMRemote instance.
+ */
+ public AVMRemoteOutputStream(String handle, AVMRemote remote)
+ {
+ fAVMRemote = remote;
+ fHandle = handle;
+ }
+
+ /**
+ * Write one character.
+ * @param b The character.
+ */
+ @Override
+ public void write(int b)
+ throws IOException
+ {
+ byte [] buff = new byte[1];
+ buff[0] = (byte)b;
+ write(buff);
+ }
+
+ /**
+ * Close the stream.
+ */
+ @Override
+ public void close()
+ throws IOException
+ {
+ try
+ {
+ fAVMRemote.closeOutputHandle(fHandle);
+ }
+ catch (Exception e)
+ {
+ throw new IOException("IO Error: " + e);
+ }
+ }
+
+ /**
+ * Write a portion of a block of bytes.
+ * @param b The buffer containing the data.
+ * @param off The offset into the buffer.
+ * @param len The number of bytes to write.
+ */
+ @Override
+ public void write(byte[] b, int off, int len)
+ throws IOException
+ {
+ try
+ {
+ if (off == 0)
+ {
+ fAVMRemote.writeOutput(fHandle, b, len);
+ }
+ else
+ {
+ byte [] buff = new byte[len];
+ for (int i = 0; i < len; i++)
+ {
+ buff[i] = b[i + off];
+ }
+ fAVMRemote.writeOutput(fHandle, buff, len);
+ }
+ }
+ catch (Exception e)
+ {
+ throw new IOException("IO Error: " + e);
+ }
+ }
+
+ /**
+ * Write a buffer of data.
+ * @param b The buffer.
+ */
+ @Override
+ public void write(byte[] b)
+ throws IOException
+ {
+ write(b, 0, b.length);
+ }
+}
diff --git a/source/java/org/alfresco/repo/avm/AVMTestRemote.java b/source/java/org/alfresco/repo/avm/AVMTestRemote.java
index e91109b010..d10efa4967 100644
--- a/source/java/org/alfresco/repo/avm/AVMTestRemote.java
+++ b/source/java/org/alfresco/repo/avm/AVMTestRemote.java
@@ -20,6 +20,8 @@ package org.alfresco.repo.avm;
import java.util.List;
import org.alfresco.service.cmr.avm.AVMStoreDescriptor;
+import org.alfresco.service.cmr.avmsync.AVMDifference;
+import org.alfresco.service.cmr.avmsync.AVMSyncService;
import org.springframework.context.support.FileSystemXmlApplicationContext;
import junit.framework.TestCase;
@@ -35,6 +37,11 @@ public class AVMTestRemote extends TestCase
*/
private AVMRemote fAVMRemote;
+ /**
+ * The Sync service.
+ */
+ private AVMSyncService fAVMSync;
+
/**
* The application context.
*/
@@ -45,11 +52,17 @@ public class AVMTestRemote extends TestCase
{
fContext = new FileSystemXmlApplicationContext("config/alfresco/remote-avm-test-context.xml");
fAVMRemote = (AVMRemote)fContext.getBean("avmRemote");
+ fAVMSync = (AVMSyncService)fContext.getBean("avmSync");
}
@Override
protected void tearDown() throws Exception
{
+ List stores = fAVMRemote.getAVMStores();
+ for (AVMStoreDescriptor desc : stores)
+ {
+ fAVMRemote.purgeAVMStore(desc.getName());
+ }
fContext.close();
}
@@ -61,7 +74,6 @@ public class AVMTestRemote extends TestCase
try
{
List stores = fAVMRemote.getAVMStores();
- assertTrue(stores.size() > 0);
for (AVMStoreDescriptor store : stores)
{
System.out.println(store);
@@ -81,21 +93,27 @@ public class AVMTestRemote extends TestCase
{
try
{
- // Create a directory.
- fAVMRemote.createDirectory("main:/", "a");
- // Write out a file.
- String outHandle = fAVMRemote.createFile("main:/a", "foo.txt");
- byte [] buff = "This is a plain old text file.\n".getBytes();
- fAVMRemote.writeOutput(outHandle, buff, buff.length);
- buff = "It contains text.\n".getBytes();
- fAVMRemote.writeOutput(outHandle, buff, buff.length);
- fAVMRemote.closeOutputHandle(outHandle);
- // Read back that file.
- String inHandle = fAVMRemote.getInputHandle(-1, "main:/a/foo.txt");
- buff = fAVMRemote.readInput(inHandle, 1024);
- fAVMRemote.closeInputHandle(inHandle);
- System.out.print(new String(buff));
- fAVMRemote.removeNode("main:/", "a");
+ // Create a test store.
+ fAVMRemote.createAVMStore("test2933");
+ // Create a directory.
+ fAVMRemote.createDirectory("test2933:/", "a");
+ // Write out a file.
+ AVMRemoteOutputStream out =
+ new AVMRemoteOutputStream(fAVMRemote.createFile("test2933:/a", "foo.txt"),
+ fAVMRemote);
+ byte [] buff = "This is a plain old text file.\n".getBytes();
+ out.write(buff);
+ buff = "It contains text.\n".getBytes();
+ out.write(buff);
+ out.close();
+ // Read back that file.
+ AVMRemoteInputStream in =
+ new AVMRemoteInputStream(fAVMRemote.getInputHandle(-1, "test2933:/a/foo.txt"),
+ fAVMRemote);
+ buff = new byte[1024];
+ assertEquals(49, in.read(buff));
+ System.out.print(new String(buff));
+ assertEquals(-1, in.read(buff));
}
catch (Exception e)
{
@@ -111,19 +129,25 @@ public class AVMTestRemote extends TestCase
{
try
{
+ fAVMRemote.createAVMStore("froo");
// Create a file.
byte [] buff = new byte[64];
for (int i = 0; i < 64; i++)
{
buff[i] = (byte)i;
}
- String outHandle = fAVMRemote.createFile("main:/", "foo.dat");
- fAVMRemote.writeOutput(outHandle, buff, 64);
- fAVMRemote.closeOutputHandle(outHandle);
+ AVMRemoteOutputStream out =
+ new AVMRemoteOutputStream(fAVMRemote.createFile("froo:/", "foo.dat"),
+ fAVMRemote);
+ out.write(buff, 32, 32);
+ out.close();
// Read it back in.
- String inHandle = fAVMRemote.getInputHandle(-1, "main:/foo.dat");
- buff = fAVMRemote.readInput(inHandle, 64);
- fAVMRemote.closeInputHandle(inHandle);
+ AVMRemoteInputStream in =
+ new AVMRemoteInputStream(fAVMRemote.getInputHandle(-1, "froo:/foo.dat"),
+ fAVMRemote);
+ buff = new byte[1024];
+ assertEquals(32, in.read(buff));
+ in.close();
}
catch (Exception e)
{
@@ -147,4 +171,38 @@ public class AVMTestRemote extends TestCase
fail();
}
}
+
+ /**
+ * Test the sync service.
+ */
+ public void testSyncService()
+ {
+ try
+ {
+ // Create a store.
+ fAVMRemote.createAVMStore("froo");
+ // Create a directory.
+ fAVMRemote.createDirectory("froo:/", "a");
+ // Create a file.
+ fAVMRemote.closeOutputHandle(fAVMRemote.createFile("froo:/a", "foo"));
+ // Create another store.
+ fAVMRemote.createAVMStore("broo");
+ // Create a branch.
+ fAVMRemote.createBranch(-1, "froo:/a", "broo:/", "a");
+ List diffs = fAVMSync.compare(-1, "froo:/a", -1, "broo:/a");
+ assertEquals(0, diffs.size());
+ fAVMRemote.closeOutputHandle(fAVMRemote.createFile("froo:/a", "bar"));
+ diffs = fAVMSync.compare(-1, "froo:/a", -1, "broo:/a");
+ assertEquals(1, diffs.size());
+ // Update.
+ fAVMSync.update(diffs, false, false, false, false, "flippy", "Stuff");
+ diffs = fAVMSync.compare(-1, "froo:/a", -1, "broo:/a");
+ assertEquals(0, diffs.size());
+ }
+ catch (Exception e)
+ {
+ e.printStackTrace();
+ fail();
+ }
+ }
}