diff --git a/source/java/org/alfresco/repo/model/filefolder/loader/AbstractLoaderThread.java b/source/java/org/alfresco/repo/model/filefolder/loader/AbstractLoaderThread.java index 11cff034a5..d1fd6e93c6 100644 --- a/source/java/org/alfresco/repo/model/filefolder/loader/AbstractLoaderThread.java +++ b/source/java/org/alfresco/repo/model/filefolder/loader/AbstractLoaderThread.java @@ -24,6 +24,9 @@ */ package org.alfresco.repo.model.filefolder.loader; +import java.io.File; +import java.util.ArrayList; +import java.util.List; import java.util.Random; import java.util.concurrent.atomic.AtomicBoolean; @@ -43,6 +46,7 @@ public abstract class AbstractLoaderThread extends Thread protected final int testLoadDepth; private AtomicBoolean mustStop; + Random random; public AbstractLoaderThread( LoaderSession session, @@ -60,6 +64,7 @@ public abstract class AbstractLoaderThread extends Thread this.testLoadDepth = testLoadDepth; this.mustStop = new AtomicBoolean(false); + this.random = new Random(); } /** @@ -75,8 +80,6 @@ public abstract class AbstractLoaderThread extends Thread @Override public void run() { - Random random = new Random(); - int testCount = 0; while (!mustStop.get()) { @@ -93,9 +96,11 @@ public abstract class AbstractLoaderThread extends Thread NodeRef workingRootNodeRef = session.getWorkingRootNodeRefs().get(nodeIndex); long startTime = System.currentTimeMillis(); - doLoading(serverProxy, workingRootNodeRef); + String msg = doLoading(serverProxy, workingRootNodeRef); long endTime = System.currentTimeMillis(); + // Dump the specifics of the load + // Have we done this enough? testCount++; if (testCount > testTotal) @@ -121,12 +126,45 @@ public abstract class AbstractLoaderThread extends Thread } } + private void dumpLoadSpecifics(long startTime, long endTime, String msg) + { + + } + /** * @param serverProxy the server to load * @param workingRootNodeRef the root of the hierarchy to use + * @return a brief description of the loading * @throws Exception any exception will be handled */ - protected abstract void doLoading( + protected abstract String doLoading( LoaderServerProxy serverProxy, NodeRef workingRootNodeRef) throws Exception; + + protected List chooseFolderPath() + { + int[] folderProfiles = session.getFolderProfiles(); + // We work through these until we get the required depth. + // The root node is ignored as it acts as the search root + List path = new ArrayList(testLoadDepth); + for (int i = 1; i < folderProfiles.length; i++) + { + int folderProfile = folderProfiles[i]; + int randomFolderId = random.nextInt(folderProfile); + String name = String.format("folder-%05d", randomFolderId); + path.add(name); + } + return path; + } + + protected File getFile() throws Exception + { + File[] files = session.getSourceFiles(); + File file = files[random.nextInt(files.length)]; + if (!file.exists() || file.isDirectory()) + { + throw new LoaderClientException("Cannot find loading file: " + file); + } + return file; + } } diff --git a/source/java/org/alfresco/repo/model/filefolder/loader/FileFolderRemoteLoader.java b/source/java/org/alfresco/repo/model/filefolder/loader/FileFolderRemoteLoader.java index fd6a3e0b8e..760ccb6427 100644 --- a/source/java/org/alfresco/repo/model/filefolder/loader/FileFolderRemoteLoader.java +++ b/source/java/org/alfresco/repo/model/filefolder/loader/FileFolderRemoteLoader.java @@ -109,7 +109,7 @@ public class FileFolderRemoteLoader for (AbstractLoaderThread thread : threads) { String summary = thread.getSummary(); - session.logNormal(summary); + session.logSummary(summary); } } @@ -178,6 +178,13 @@ public class FileFolderRemoteLoader { folderProfiles[i] = folderProfilesList.get(i); } + if (folderProfiles.length == 0 || folderProfiles[0] != 1) + { + throw new LoaderClientException( + "'" + PROP_SESSION_FOLDER_PROFILE + "' must always start with '1', " + + "which represents the root of the hierarchy, and have at least one other value. " + + "E.g. '1, 3'"); + } // Construct LoaderSession session = new LoaderSession( @@ -313,14 +320,29 @@ public class FileFolderRemoteLoader // Run app.start(); - synchronized(app) - { - app.wait(1000L); - } -// System.out.println("" + // Now lower this threads priority + Thread.currentThread().setPriority(Thread.MIN_PRIORITY); + // Wait for a quit signal + System.out.println("Running test " + app.session.getName() + ". Enter 'q' to quit"); + while (true) + { + int keyPress = System.in.read(); + if (keyPress == 'Q' || keyPress == 'q') + { + break; + } + else if (System.in.available() > 0) + { + // Don't wait, just process + continue; + } + // No more keypresses so just wait + Thread.yield(); + } // Finish off app.stop(); + System.out.println("The test is complete."); } catch (LoaderClientException e) { diff --git a/source/java/org/alfresco/repo/model/filefolder/loader/LoaderSession.java b/source/java/org/alfresco/repo/model/filefolder/loader/LoaderSession.java index 7fd95c83dd..15d5359c73 100644 --- a/source/java/org/alfresco/repo/model/filefolder/loader/LoaderSession.java +++ b/source/java/org/alfresco/repo/model/filefolder/loader/LoaderSession.java @@ -27,6 +27,7 @@ package org.alfresco.repo.model.filefolder.loader; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileOutputStream; +import java.io.IOException; import java.io.OutputStream; import java.util.ArrayList; import java.util.List; @@ -64,8 +65,9 @@ public class LoaderSession private List remoteServers; private List workingRootNodeRefs; private File[] sourceFiles; - private OutputStream outStream; - private OutputStream errStream; + private OutputStream outVerbose; + private OutputStream outSummary; + private OutputStream outError; /** * @@ -153,19 +155,23 @@ public class LoaderSession // Construct output and error files long time = System.currentTimeMillis(); - File outFile = new File("./LoaderSession-" + name + "-"+ time + "-out.txt"); - File errFile = new File("./LoaderSession-" + name + "-"+ time + "-err.txt"); - outStream = new BufferedOutputStream(new FileOutputStream(outFile)); - errStream = new BufferedOutputStream(new FileOutputStream(errFile)); + File fileVerbose = new File("./LoaderSession-" + name + "-"+ time + "-verbose.txt"); + File fileSummary = new File("./LoaderSession-" + name + "-"+ time + "-summary.txt"); + File fileError = new File("./LoaderSession-" + name + "-"+ time + "-error.txt"); + outVerbose = new BufferedOutputStream(new FileOutputStream(fileVerbose)); + outSummary = new BufferedOutputStream(new FileOutputStream(fileSummary)); + outError = new BufferedOutputStream(new FileOutputStream(fileError)); } public synchronized void close() { - try { outStream.close(); } catch (Throwable e) {} - try { errStream.close(); } catch (Throwable e) {} + try { outVerbose.close(); } catch (Throwable e) {} + try { outSummary.close(); } catch (Throwable e) {} + try { outError.close(); } catch (Throwable e) {} - outStream = null; - errStream = null; + outVerbose = null; + outSummary = null; + outError = null; } /** @@ -337,50 +343,75 @@ public class LoaderSession } } - public void logVerbose(String msg) + private void writeLineEnding(OutputStream out) throws IOException { - if (!verbose) + if (File.separatorChar == '/') { - // Just ignore it + // It's unix + out.write('\n'); + } + else + { + // Windows + out.write('\r'); + out.write('\n'); } - logNormal(msg); } - public synchronized void logNormal(String msg) + public synchronized void logVerbose(String msg) { - if (outStream == null) + if (!verbose || outVerbose == null) { return; } try { byte[] bytes = msg.getBytes("UTF-8"); - outStream.write(bytes); - outStream.write('\n'); - outStream.flush(); + outVerbose.write(bytes); + writeLineEnding(outVerbose); + outVerbose.flush(); } catch (Throwable e) { - System.err.println("Failed to write message to output file: " + e.getMessage()); + System.err.println("Failed to write message to verbose file: " + e.getMessage()); + } + } + + public synchronized void logSummary(String msg) + { + if (outSummary == null) + { + return; + } + try + { + byte[] bytes = msg.getBytes("UTF-8"); + outSummary.write(bytes); + writeLineEnding(outSummary); + outSummary.flush(); + } + catch (Throwable e) + { + System.err.println("Failed to write message to summary file: " + e.getMessage()); } } public synchronized void logError(String msg) { - if (errStream == null) + if (outSummary == null) { return; } try { byte[] bytes = msg.getBytes("UTF-8"); - errStream.write(bytes); - outStream.write('\n'); - errStream.flush(); + outSummary.write(bytes); + writeLineEnding(outError); + outSummary.flush(); } catch (Throwable e) { - System.err.println("Failed to write message to output file: " + e.getMessage()); + System.err.println("Failed to write message to error file: " + e.getMessage()); } } } diff --git a/source/java/org/alfresco/repo/model/filefolder/loader/LoaderUploadThread.java b/source/java/org/alfresco/repo/model/filefolder/loader/LoaderUploadThread.java index 0cd6afc41a..0b7950b4e0 100644 --- a/source/java/org/alfresco/repo/model/filefolder/loader/LoaderUploadThread.java +++ b/source/java/org/alfresco/repo/model/filefolder/loader/LoaderUploadThread.java @@ -24,7 +24,14 @@ */ package org.alfresco.repo.model.filefolder.loader; +import java.io.File; +import java.util.List; + +import org.alfresco.model.ContentModel; +import org.alfresco.service.cmr.model.FileInfo; import org.alfresco.service.cmr.repository.NodeRef; +import org.alfresco.util.GUID; +import org.springframework.util.FileCopyUtils; /** * A description of what the remote loader should do. @@ -44,14 +51,52 @@ public class LoaderUploadThread extends AbstractLoaderThread } @Override - protected void doLoading(LoaderServerProxy serverProxy, NodeRef workingRootNodeRef) throws Exception + protected String doLoading(LoaderServerProxy serverProxy, NodeRef workingRootNodeRef) throws Exception { - int totalNodeCount = serverProxy.loaderRemote.getNodeCount( - serverProxy.ticket); - int storeNodeCount = serverProxy.loaderRemote.getNodeCount( + // Get a random folder + List folderPath = super.chooseFolderPath(); + // Make sure the folder exists + FileInfo folderInfo = serverProxy.fileFolderRemote.makeFolders( serverProxy.ticket, - workingRootNodeRef.getStoreRef()); - session.logVerbose("Nodes: " + totalNodeCount + ". Store Nodes: " + storeNodeCount); + workingRootNodeRef, + folderPath, + ContentModel.TYPE_FOLDER); + + // Get a random file + File file = getFile(); + byte[] bytes = FileCopyUtils.copyToByteArray(file); + // Get the extension + String filename = GUID.generate(); + int index = file.getName().lastIndexOf('.'); + if (index > 0) + { + String ext = file.getName().substring(index + 1, file.getName().length()); + filename += ("." + ext); + } + + // Upload it + NodeRef folderNodeRef = folderInfo.getNodeRef(); + + FileInfo fileInfo = serverProxy.fileFolderRemote.create( + serverProxy.ticket, + folderNodeRef, + filename, + ContentModel.TYPE_CONTENT); + NodeRef fileNodeRef = fileInfo.getNodeRef(); + serverProxy.fileFolderRemote.putContent(serverProxy.ticket, fileNodeRef, bytes, filename); + + // Done + String msg = String.format("Uploaded %s to folder: %s", filename, folderPath.toString()); + session.logVerbose(msg); + + return msg; + +// int totalNodeCount = serverProxy.loaderRemote.getNodeCount( +// serverProxy.ticket); +// int storeNodeCount = serverProxy.loaderRemote.getNodeCount( +// serverProxy.ticket, +// workingRootNodeRef.getStoreRef()); +// session.logVerbose("Nodes: " + totalNodeCount + ". Store Nodes: " + storeNodeCount); } @Override