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(); + } + } }