mirror of
https://github.com/Alfresco/alfresco-community-repo.git
synced 2025-07-07 18:25:23 +00:00
Merge LOGNEON-HEAD-3D-BENCHMARK to HEAD
git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@13241 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
parent
109b51fb98
commit
711e4b298e
@ -57,6 +57,12 @@
|
|||||||
<property name="mimetypeService">
|
<property name="mimetypeService">
|
||||||
<ref bean="MimetypeService"/>
|
<ref bean="MimetypeService"/>
|
||||||
</property>
|
</property>
|
||||||
|
<property name="checkOutCheckInService">
|
||||||
|
<ref bean="CheckoutCheckinService"/>
|
||||||
|
</property>
|
||||||
|
<property name="fileFolderRemote">
|
||||||
|
<ref bean="fileFolderRemoteServer"/>
|
||||||
|
</property>
|
||||||
</bean>
|
</bean>
|
||||||
|
|
||||||
<bean id="loaderRemoteServerRMI" class="org.springframework.remoting.rmi.RmiServiceExporter">
|
<bean id="loaderRemoteServerRMI" class="org.springframework.remoting.rmi.RmiServiceExporter">
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2005-2007 Alfresco Software Limited.
|
* Copyright (C) 2005-2008 Alfresco Software Limited.
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or
|
* This program is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU General Public License
|
* modify it under the terms of the GNU General Public License
|
||||||
@ -28,10 +28,18 @@ import java.io.File;
|
|||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Random;
|
import java.util.Random;
|
||||||
|
import java.util.Collections;
|
||||||
import java.util.concurrent.atomic.AtomicBoolean;
|
import java.util.concurrent.atomic.AtomicBoolean;
|
||||||
|
import java.net.URL;
|
||||||
|
|
||||||
import org.alfresco.error.AlfrescoRuntimeException;
|
import org.alfresco.error.AlfrescoRuntimeException;
|
||||||
import org.alfresco.service.cmr.repository.NodeRef;
|
import org.alfresco.service.cmr.repository.NodeRef;
|
||||||
|
import org.alfresco.service.cmr.model.FileInfo;
|
||||||
|
import org.alfresco.service.cmr.model.FileExistsException;
|
||||||
|
import org.alfresco.model.ContentModel;
|
||||||
|
import org.alfresco.repo.cache.EhCacheAdapter;
|
||||||
|
import net.sf.ehcache.CacheManager;
|
||||||
|
import net.sf.ehcache.Cache;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A description of what the remote loader should do.
|
* A description of what the remote loader should do.
|
||||||
@ -54,6 +62,19 @@ public abstract class AbstractLoaderThread extends Thread
|
|||||||
private int statCount;
|
private int statCount;
|
||||||
private double statTotalMs;
|
private double statTotalMs;
|
||||||
|
|
||||||
|
private static EhCacheAdapter<String, NodeRef> pathCache;
|
||||||
|
|
||||||
|
static
|
||||||
|
{
|
||||||
|
System.setProperty(CacheManager.ENABLE_SHUTDOWN_HOOK_PROPERTY, "TRUE");
|
||||||
|
URL url = LoaderUploadThread.class.getResource("/org/alfresco/repo/model/filefolder/loader/loader-ehcache.xml");
|
||||||
|
CacheManager cacheManager = new CacheManager(url);
|
||||||
|
Cache cache = cacheManager.getCache("org.alfresco.LoaderUploadThread.PathCache");
|
||||||
|
|
||||||
|
pathCache = new EhCacheAdapter<String, NodeRef>();
|
||||||
|
pathCache.setCache(cache);
|
||||||
|
}
|
||||||
|
|
||||||
public AbstractLoaderThread(
|
public AbstractLoaderThread(
|
||||||
LoaderSession session,
|
LoaderSession session,
|
||||||
String loaderName,
|
String loaderName,
|
||||||
@ -110,6 +131,8 @@ public abstract class AbstractLoaderThread extends Thread
|
|||||||
int nodeIndex = random.nextInt(nodeCount);
|
int nodeIndex = random.nextInt(nodeCount);
|
||||||
NodeRef workingRootNodeRef = session.getWorkingRootNodeRefs().get(nodeIndex);
|
NodeRef workingRootNodeRef = session.getWorkingRootNodeRefs().get(nodeIndex);
|
||||||
|
|
||||||
|
this.doBefore(serverProxy, workingRootNodeRef);
|
||||||
|
|
||||||
long startTime = System.nanoTime();
|
long startTime = System.nanoTime();
|
||||||
String msg = doLoading(serverProxy, workingRootNodeRef);
|
String msg = doLoading(serverProxy, workingRootNodeRef);
|
||||||
long endTime = System.nanoTime();
|
long endTime = System.nanoTime();
|
||||||
@ -137,6 +160,7 @@ public abstract class AbstractLoaderThread extends Thread
|
|||||||
this.wait(mustWait);
|
this.wait(mustWait);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
this.doAfter(serverProxy, workingRootNodeRef);
|
||||||
}
|
}
|
||||||
catch (Throwable e)
|
catch (Throwable e)
|
||||||
{
|
{
|
||||||
@ -238,4 +262,69 @@ public abstract class AbstractLoaderThread extends Thread
|
|||||||
}
|
}
|
||||||
return file;
|
return file;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates or find the folders based on caching.
|
||||||
|
*/
|
||||||
|
protected NodeRef makeFolders(
|
||||||
|
String ticket,
|
||||||
|
LoaderServerProxy serverProxy,
|
||||||
|
NodeRef workingRootNodeRef,
|
||||||
|
List<String> folderPath) throws Exception
|
||||||
|
{
|
||||||
|
// Iterate down the path, checking the cache and populating it as necessary
|
||||||
|
NodeRef currentParentNodeRef = workingRootNodeRef;
|
||||||
|
String currentKey = workingRootNodeRef.toString();
|
||||||
|
|
||||||
|
for (String aFolderPath : folderPath)
|
||||||
|
{
|
||||||
|
currentKey += ("/" + aFolderPath);
|
||||||
|
// Is this there?
|
||||||
|
NodeRef nodeRef = pathCache.get(currentKey);
|
||||||
|
if (nodeRef != null)
|
||||||
|
{
|
||||||
|
// Found it
|
||||||
|
currentParentNodeRef = nodeRef;
|
||||||
|
// Step into the next level
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// It is not there, so create it
|
||||||
|
try
|
||||||
|
{
|
||||||
|
FileInfo folderInfo = serverProxy.fileFolderRemote.makeFolders(
|
||||||
|
serverProxy.ticket,
|
||||||
|
currentParentNodeRef,
|
||||||
|
Collections.singletonList(aFolderPath),
|
||||||
|
ContentModel.TYPE_FOLDER);
|
||||||
|
currentParentNodeRef = folderInfo.getNodeRef();
|
||||||
|
} catch (FileExistsException e)
|
||||||
|
{
|
||||||
|
currentParentNodeRef = pathCache.get(currentKey);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Cache the new node
|
||||||
|
pathCache.put(currentKey, currentParentNodeRef);
|
||||||
|
|
||||||
|
}
|
||||||
|
// Done
|
||||||
|
return currentParentNodeRef;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Run before record stats
|
||||||
|
*/
|
||||||
|
protected void doBefore(LoaderServerProxy loaderServerProxy, NodeRef nodeRef) throws Exception
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Run after record stats
|
||||||
|
*/
|
||||||
|
protected void doAfter(LoaderServerProxy loaderServerProxy, NodeRef nodeRef) throws Exception
|
||||||
|
{
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2005-2007 Alfresco Software Limited.
|
* Copyright (C) 2005-2008 Alfresco Software Limited.
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or
|
* This program is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU General Public License
|
* modify it under the terms of the GNU General Public License
|
||||||
@ -286,7 +286,7 @@ public class FileFolderRemoteLoader
|
|||||||
long testTotal = 0L;
|
long testTotal = 0L;
|
||||||
long testDepth = 1L;
|
long testDepth = 1L;
|
||||||
boolean testVerbose = false;
|
boolean testVerbose = false;
|
||||||
long filesPerUpload = 1;
|
long filesPerIteration = 1;
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
testCount = Long.parseLong(strValues[0]);
|
testCount = Long.parseLong(strValues[0]);
|
||||||
@ -294,13 +294,13 @@ public class FileFolderRemoteLoader
|
|||||||
testTotal = Long.parseLong(strValues[2]);
|
testTotal = Long.parseLong(strValues[2]);
|
||||||
testDepth = Long.parseLong(strValues[3]);
|
testDepth = Long.parseLong(strValues[3]);
|
||||||
testVerbose = Boolean.parseBoolean(strValues[4]);
|
testVerbose = Boolean.parseBoolean(strValues[4]);
|
||||||
filesPerUpload = Long.parseLong(strValues[5]);
|
filesPerIteration = Long.parseLong(strValues[5]);
|
||||||
}
|
}
|
||||||
catch (Throwable e)
|
catch (Throwable e)
|
||||||
{
|
{
|
||||||
throw new LoaderClientException(
|
throw new LoaderClientException(
|
||||||
"Unable to parse the loader configuration for '" + name + "'. " + LoaderSession.getLineEnding() +
|
"Unable to parse the loader configuration for '" + name + "'. " + LoaderSession.getLineEnding() +
|
||||||
"The correct format is [threadCount], [period(ms)], [total], [folder depth], [verbose]<, [filesPerUpload]>");
|
"The correct format is [threadCount], [period(ms)], [total], [folder depth], [verbose]<, [filesPerIteration]>");
|
||||||
}
|
}
|
||||||
|
|
||||||
// Construct
|
// Construct
|
||||||
@ -309,7 +309,7 @@ public class FileFolderRemoteLoader
|
|||||||
AbstractLoaderThread thread = null;
|
AbstractLoaderThread thread = null;
|
||||||
if (type.equals("upload"))
|
if (type.equals("upload"))
|
||||||
{
|
{
|
||||||
thread = new LoaderUploadThread(session, name, testPeriod, testTotal, testDepth, testVerbose, filesPerUpload);
|
thread = new LoaderUploadThread(session, name, testPeriod, testTotal, testDepth, testVerbose, filesPerIteration);
|
||||||
}
|
}
|
||||||
else if (type.equals("totals"))
|
else if (type.equals("totals"))
|
||||||
{
|
{
|
||||||
@ -318,6 +318,20 @@ public class FileFolderRemoteLoader
|
|||||||
else if (type.equals("listFolders"))
|
else if (type.equals("listFolders"))
|
||||||
{
|
{
|
||||||
thread = new LoaderListFoldersThread(session, name, testPeriod, testTotal, testDepth, testVerbose);
|
thread = new LoaderListFoldersThread(session, name, testPeriod, testTotal, testDepth, testVerbose);
|
||||||
|
|
||||||
|
}
|
||||||
|
else if(type.equals("delete"))
|
||||||
|
{
|
||||||
|
thread = new LoaderDeleteThread(session, name, testPeriod, testTotal, testDepth, testVerbose, filesPerIteration);
|
||||||
|
}
|
||||||
|
else if(type.equals("update"))
|
||||||
|
{
|
||||||
|
thread = new LoaderUpdateThread(session, name, testPeriod, testTotal, testDepth, testVerbose, filesPerIteration);
|
||||||
|
|
||||||
|
}
|
||||||
|
else if(type.equals("coci"))
|
||||||
|
{
|
||||||
|
thread = new LoaderCOCIThread(session, name, testPeriod, testTotal, testDepth, testVerbose, filesPerIteration);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -0,0 +1,113 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2005-2008 Alfresco Software Limited.
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU General Public License
|
||||||
|
* as published by the Free Software Foundation; either version 2
|
||||||
|
* of the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
|
||||||
|
* As a special exception to the terms and conditions of version 2.0 of
|
||||||
|
* the GPL, you may redistribute this Program in connection with Free/Libre
|
||||||
|
* and Open Source Software ("FLOSS") applications as described in Alfresco's
|
||||||
|
* FLOSS exception. You should have recieved a copy of the text describing
|
||||||
|
* the FLOSS exception, and it is also available here:
|
||||||
|
* http://www.alfresco.com/legal/licensing"
|
||||||
|
*/
|
||||||
|
package org.alfresco.repo.model.filefolder.loader;
|
||||||
|
|
||||||
|
import org.alfresco.service.cmr.repository.NodeRef;
|
||||||
|
import org.alfresco.service.cmr.model.FileInfo;
|
||||||
|
import org.alfresco.service.namespace.QName;
|
||||||
|
import org.alfresco.util.GUID;
|
||||||
|
import org.alfresco.model.ContentModel;
|
||||||
|
import org.springframework.util.FileCopyUtils;
|
||||||
|
|
||||||
|
import java.util.*;
|
||||||
|
import java.io.Serializable;
|
||||||
|
import java.io.File;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Loader thread that coci documents to the remote repository.
|
||||||
|
*/
|
||||||
|
|
||||||
|
public class LoaderCOCIThread extends AbstractLoaderThread
|
||||||
|
{
|
||||||
|
private int filesPerIteration;
|
||||||
|
private FileInfo[] filesInfo;
|
||||||
|
|
||||||
|
public LoaderCOCIThread(LoaderSession session, String loaderName, long testPeriod, long testTotal, long testLoadDepth, boolean verbose, long filesPerIteration)
|
||||||
|
{
|
||||||
|
super(session, loaderName, testPeriod, testTotal, testLoadDepth, verbose);
|
||||||
|
this.filesPerIteration = (int) filesPerIteration;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected String doLoading(LoaderServerProxy serverProxy, NodeRef workingRootNodeRef) throws Exception
|
||||||
|
{
|
||||||
|
|
||||||
|
List<HashMap<String, Serializable>> arrVersionProp = new ArrayList<HashMap<String, Serializable>>();
|
||||||
|
|
||||||
|
byte[][] bytes = new byte[filesPerIteration][];
|
||||||
|
for (int i = 0; i < filesPerIteration; i++)
|
||||||
|
{
|
||||||
|
File file = getFile();
|
||||||
|
bytes[i] = FileCopyUtils.copyToByteArray(file);
|
||||||
|
arrVersionProp.add(new HashMap<String, Serializable>());
|
||||||
|
}
|
||||||
|
|
||||||
|
serverProxy.loaderRemote.coci(serverProxy.ticket, getNodesRef(filesInfo), bytes, arrVersionProp);
|
||||||
|
|
||||||
|
return String.format("update version %d files in folder: %s", filesPerIteration, workingRootNodeRef.toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void doBefore(LoaderServerProxy loaderServerProxy, NodeRef nodeRef) throws Exception
|
||||||
|
{
|
||||||
|
// Get a random folder
|
||||||
|
List<String> folderPath = super.chooseFolderPath();
|
||||||
|
|
||||||
|
//makeFolders
|
||||||
|
NodeRef folderNodeRef = makeFolders(loaderServerProxy.ticket, loaderServerProxy, nodeRef, folderPath);
|
||||||
|
|
||||||
|
String[] fileNames = new String[filesPerIteration];
|
||||||
|
NodeRef[] parentNodeRefs = new NodeRef[filesPerIteration];
|
||||||
|
QName[] types = new QName[filesPerIteration];
|
||||||
|
|
||||||
|
// Build a set of files to coci
|
||||||
|
for (int i = 0; i < filesPerIteration; i++)
|
||||||
|
{
|
||||||
|
fileNames[i] = GUID.generate();
|
||||||
|
parentNodeRefs[i] = folderNodeRef;
|
||||||
|
types[i] = ContentModel.TYPE_CONTENT;
|
||||||
|
}
|
||||||
|
|
||||||
|
filesInfo = loaderServerProxy.fileFolderRemote.create(loaderServerProxy.ticket, parentNodeRefs, fileNames, types);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public String getSummary()
|
||||||
|
{
|
||||||
|
String summary = super.getSummary();
|
||||||
|
summary += String.format("%d files per iteration", filesPerIteration);
|
||||||
|
return summary;
|
||||||
|
}
|
||||||
|
|
||||||
|
NodeRef[] getNodesRef(FileInfo[] filesInfoList)
|
||||||
|
{
|
||||||
|
NodeRef[] nr = new NodeRef[filesInfoList.length];
|
||||||
|
for (int i = 0; i < filesInfoList.length; i++)
|
||||||
|
{
|
||||||
|
nr[i] = (filesInfoList[i].getNodeRef());
|
||||||
|
}
|
||||||
|
return nr;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,115 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2005-2008 Alfresco Software Limited.
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU General Public License
|
||||||
|
* as published by the Free Software Foundation; either version 2
|
||||||
|
* of the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
|
||||||
|
* As a special exception to the terms and conditions of version 2.0 of
|
||||||
|
* the GPL, you may redistribute this Program in connection with Free/Libre
|
||||||
|
* and Open Source Software ("FLOSS") applications as described in Alfresco's
|
||||||
|
* FLOSS exception. You should have recieved a copy of the text describing
|
||||||
|
* the FLOSS exception, and it is also available here:
|
||||||
|
* http://www.alfresco.com/legal/licensing"
|
||||||
|
*/
|
||||||
|
package org.alfresco.repo.model.filefolder.loader;
|
||||||
|
|
||||||
|
import org.alfresco.model.ContentModel;
|
||||||
|
import org.alfresco.service.cmr.model.FileInfo;
|
||||||
|
import org.alfresco.service.cmr.repository.NodeRef;
|
||||||
|
import org.alfresco.service.namespace.QName;
|
||||||
|
import org.alfresco.util.GUID;
|
||||||
|
import org.springframework.util.FileCopyUtils;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Loader thread that deletes documents to the remote repository.
|
||||||
|
*/
|
||||||
|
public class LoaderDeleteThread extends AbstractLoaderThread
|
||||||
|
{
|
||||||
|
private FileInfo[] filesInfo;
|
||||||
|
private int filesPerIteration;
|
||||||
|
|
||||||
|
public LoaderDeleteThread(
|
||||||
|
LoaderSession loaderSession,
|
||||||
|
String loaderName,
|
||||||
|
long testPeriod,
|
||||||
|
long testTotal,
|
||||||
|
long testLoadDepth,
|
||||||
|
boolean verbose,
|
||||||
|
long filesPerIteration)
|
||||||
|
{
|
||||||
|
super(loaderSession, loaderName, testPeriod, testTotal, testLoadDepth, verbose);
|
||||||
|
this.filesPerIteration = (int) filesPerIteration;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected String doLoading(LoaderServerProxy loaderServerProxy, NodeRef nodeRef) throws Exception
|
||||||
|
{
|
||||||
|
// Delete it
|
||||||
|
loaderServerProxy.fileFolderRemote.delete(loaderServerProxy.ticket, getNodesRef(filesInfo));
|
||||||
|
|
||||||
|
// Done
|
||||||
|
String msg = String.format("Deleted %d files from folder: %s", filesInfo.length, nodeRef.toString());
|
||||||
|
|
||||||
|
return msg;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void doBefore(LoaderServerProxy loaderServerProxy, NodeRef workingRootNodeRef) throws Exception
|
||||||
|
{
|
||||||
|
// Get a random folder
|
||||||
|
List<String> folderPath = super.chooseFolderPath();
|
||||||
|
|
||||||
|
//makeFolders
|
||||||
|
NodeRef folderNodeRef = makeFolders(loaderServerProxy.ticket, loaderServerProxy, workingRootNodeRef, folderPath);
|
||||||
|
|
||||||
|
byte[][] bytes = new byte[filesPerIteration][];
|
||||||
|
String[] fileNames = new String[filesPerIteration];
|
||||||
|
NodeRef[] parentNodeRefs = new NodeRef[filesPerIteration];
|
||||||
|
QName[] types = new QName[filesPerIteration];
|
||||||
|
|
||||||
|
// Build a set of files to delete
|
||||||
|
for (int i = 0; i < filesPerIteration; i++)
|
||||||
|
{
|
||||||
|
File file = getFile();
|
||||||
|
bytes[i] = FileCopyUtils.copyToByteArray(file);
|
||||||
|
fileNames[i] = GUID.generate();
|
||||||
|
parentNodeRefs[i] = folderNodeRef;
|
||||||
|
types[i] = ContentModel.TYPE_CONTENT;
|
||||||
|
}
|
||||||
|
|
||||||
|
filesInfo = loaderServerProxy.fileFolderRemote.create(loaderServerProxy.ticket, parentNodeRefs, fileNames, types);
|
||||||
|
|
||||||
|
loaderServerProxy.fileFolderRemote.putContent(loaderServerProxy.ticket, getNodesRef(filesInfo), bytes, fileNames);
|
||||||
|
}
|
||||||
|
|
||||||
|
NodeRef[] getNodesRef(FileInfo[] filesInfoList)
|
||||||
|
{
|
||||||
|
NodeRef[] nr = new NodeRef[filesInfoList.length];
|
||||||
|
for (int i = 0; i < filesInfoList.length; i++)
|
||||||
|
{
|
||||||
|
nr[i] = (filesInfoList[i].getNodeRef());
|
||||||
|
}
|
||||||
|
return nr;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getSummary()
|
||||||
|
{
|
||||||
|
String summary = super.getSummary();
|
||||||
|
summary += (String.format("%d files per iteration", filesPerIteration));
|
||||||
|
return summary;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,111 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2005-2008 Alfresco Software Limited.
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU General Public License
|
||||||
|
* as published by the Free Software Foundation; either version 2
|
||||||
|
* of the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
|
||||||
|
* As a special exception to the terms and conditions of version 2.0 of
|
||||||
|
* the GPL, you may redistribute this Program in connection with Free/Libre
|
||||||
|
* and Open Source Software ("FLOSS") applications as described in Alfresco's
|
||||||
|
* FLOSS exception. You should have recieved a copy of the text describing
|
||||||
|
* the FLOSS exception, and it is also available here:
|
||||||
|
* http://www.alfresco.com/legal/licensing"
|
||||||
|
*/
|
||||||
|
package org.alfresco.repo.model.filefolder.loader;
|
||||||
|
|
||||||
|
import org.alfresco.service.cmr.repository.NodeRef;
|
||||||
|
import org.alfresco.service.cmr.model.FileInfo;
|
||||||
|
import org.alfresco.service.namespace.QName;
|
||||||
|
import org.alfresco.util.GUID;
|
||||||
|
import org.alfresco.model.ContentModel;
|
||||||
|
import org.springframework.util.FileCopyUtils;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.io.File;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Loader thread that updates documents to the remote repository.
|
||||||
|
*/
|
||||||
|
|
||||||
|
public class LoaderUpdateThread extends AbstractLoaderThread
|
||||||
|
{
|
||||||
|
private FileInfo[] filesInfo;
|
||||||
|
private int filesPerIteration;
|
||||||
|
|
||||||
|
public LoaderUpdateThread(
|
||||||
|
LoaderSession session,
|
||||||
|
String loaderName,
|
||||||
|
long testPeriod,
|
||||||
|
long testTotal,
|
||||||
|
long testLoadDepth,
|
||||||
|
boolean verbose,
|
||||||
|
long filesPerIteration)
|
||||||
|
{
|
||||||
|
super(session, loaderName, testPeriod, testTotal, testLoadDepth, verbose);
|
||||||
|
this.filesPerIteration = (int)filesPerIteration;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void doBefore(LoaderServerProxy loaderServerProxy, NodeRef nodeRef) throws Exception
|
||||||
|
{
|
||||||
|
// Get a random folder
|
||||||
|
List<String> folderPath = super.chooseFolderPath();
|
||||||
|
|
||||||
|
//makeFolders
|
||||||
|
NodeRef folderNodeRef = makeFolders(loaderServerProxy.ticket, loaderServerProxy, nodeRef, folderPath);
|
||||||
|
|
||||||
|
String[] fileNames = new String[filesPerIteration];
|
||||||
|
NodeRef[] pareNodeRefs = new NodeRef[filesPerIteration];
|
||||||
|
QName[] types = new QName[filesPerIteration];
|
||||||
|
|
||||||
|
// Build a set of files to update
|
||||||
|
for (int i = 0; i < filesPerIteration; i++)
|
||||||
|
{
|
||||||
|
fileNames[i] = GUID.generate();
|
||||||
|
pareNodeRefs[i] = folderNodeRef;
|
||||||
|
types[i] = ContentModel.TYPE_CONTENT;
|
||||||
|
}
|
||||||
|
filesInfo = loaderServerProxy.fileFolderRemote.create(loaderServerProxy.ticket, pareNodeRefs, fileNames, types);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected String doLoading(LoaderServerProxy loaderServerProxy, NodeRef nodeRef) throws Exception
|
||||||
|
{
|
||||||
|
byte[][] bytes = new byte[filesPerIteration][];
|
||||||
|
String[] fileNames = new String[filesPerIteration];
|
||||||
|
NodeRef[] nodeRefs = new NodeRef[filesPerIteration];
|
||||||
|
|
||||||
|
for (int i = 0; i < filesPerIteration; i++)
|
||||||
|
{
|
||||||
|
File file = getFile();
|
||||||
|
bytes[i] = FileCopyUtils.copyToByteArray(file);
|
||||||
|
fileNames[i] = filesInfo[i].getName();
|
||||||
|
nodeRefs[i] = filesInfo[i].getNodeRef();
|
||||||
|
}
|
||||||
|
|
||||||
|
//Update it
|
||||||
|
loaderServerProxy.fileFolderRemote.putContent(loaderServerProxy.ticket, nodeRefs, bytes, fileNames);
|
||||||
|
|
||||||
|
// Done
|
||||||
|
return String.format("Updated %d files in folder: %s", filesInfo.length, nodeRef.toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public String getSummary()
|
||||||
|
{
|
||||||
|
String summary = super.getSummary();
|
||||||
|
summary += (String.format("%d files per iteration", filesPerIteration));
|
||||||
|
return summary;
|
||||||
|
}
|
||||||
|
}
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2005-2007 Alfresco Software Limited.
|
* Copyright (C) 2005-2008 Alfresco Software Limited.
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or
|
* This program is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU General Public License
|
* modify it under the terms of the GNU General Public License
|
||||||
@ -24,21 +24,14 @@
|
|||||||
*/
|
*/
|
||||||
package org.alfresco.repo.model.filefolder.loader;
|
package org.alfresco.repo.model.filefolder.loader;
|
||||||
|
|
||||||
import java.io.File;
|
|
||||||
import java.net.URL;
|
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
import net.sf.ehcache.Cache;
|
|
||||||
import net.sf.ehcache.CacheManager;
|
|
||||||
|
|
||||||
import org.alfresco.model.ContentModel;
|
|
||||||
import org.alfresco.repo.cache.EhCacheAdapter;
|
|
||||||
import org.alfresco.service.cmr.model.FileInfo;
|
import org.alfresco.service.cmr.model.FileInfo;
|
||||||
import org.alfresco.service.cmr.repository.NodeRef;
|
import org.alfresco.service.cmr.repository.NodeRef;
|
||||||
import org.alfresco.util.GUID;
|
import org.alfresco.util.GUID;
|
||||||
import org.springframework.util.FileCopyUtils;
|
import org.springframework.util.FileCopyUtils;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Loader thread that puts documents to the remote repository.
|
* Loader thread that puts documents to the remote repository.
|
||||||
*
|
*
|
||||||
@ -47,18 +40,6 @@ import org.springframework.util.FileCopyUtils;
|
|||||||
*/
|
*/
|
||||||
public class LoaderUploadThread extends AbstractLoaderThread
|
public class LoaderUploadThread extends AbstractLoaderThread
|
||||||
{
|
{
|
||||||
private static EhCacheAdapter<String, NodeRef> pathCache;
|
|
||||||
|
|
||||||
static
|
|
||||||
{
|
|
||||||
System.setProperty(CacheManager.ENABLE_SHUTDOWN_HOOK_PROPERTY, "TRUE");
|
|
||||||
URL url = LoaderUploadThread.class.getResource("/org/alfresco/repo/model/filefolder/loader/loader-ehcache.xml");
|
|
||||||
CacheManager cacheManager = new CacheManager(url);
|
|
||||||
Cache cache = cacheManager.getCache("org.alfresco.LoaderUploadThread.PathCache");
|
|
||||||
|
|
||||||
pathCache = new EhCacheAdapter<String, NodeRef>();
|
|
||||||
pathCache.setCache(cache);
|
|
||||||
}
|
|
||||||
|
|
||||||
private int filesPerUpload;
|
private int filesPerUpload;
|
||||||
|
|
||||||
@ -75,44 +56,6 @@ public class LoaderUploadThread extends AbstractLoaderThread
|
|||||||
this.filesPerUpload = (int) filesPerUpload;
|
this.filesPerUpload = (int) filesPerUpload;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates or find the folders based on caching.
|
|
||||||
*/
|
|
||||||
private NodeRef makeFolders(
|
|
||||||
String ticket,
|
|
||||||
LoaderServerProxy serverProxy,
|
|
||||||
NodeRef workingRootNodeRef,
|
|
||||||
List<String> folderPath) throws Exception
|
|
||||||
{
|
|
||||||
// Iterate down the path, checking the cache and populating it as necessary
|
|
||||||
NodeRef currentParentNodeRef = workingRootNodeRef;
|
|
||||||
String currentKey = workingRootNodeRef.toString();
|
|
||||||
for (String pathElement : folderPath)
|
|
||||||
{
|
|
||||||
currentKey += ("/" + pathElement);
|
|
||||||
// Is this there?
|
|
||||||
NodeRef nodeRef = pathCache.get(currentKey);
|
|
||||||
if (nodeRef != null)
|
|
||||||
{
|
|
||||||
// Found it
|
|
||||||
currentParentNodeRef = nodeRef;
|
|
||||||
// Step into the next level
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
// It is not there, so create it
|
|
||||||
FileInfo folderInfo = serverProxy.fileFolderRemote.makeFolders(
|
|
||||||
serverProxy.ticket,
|
|
||||||
currentParentNodeRef,
|
|
||||||
Collections.singletonList(pathElement),
|
|
||||||
ContentModel.TYPE_FOLDER);
|
|
||||||
currentParentNodeRef = folderInfo.getNodeRef();
|
|
||||||
// Cache the new node
|
|
||||||
pathCache.put(currentKey, currentParentNodeRef);
|
|
||||||
}
|
|
||||||
// Done
|
|
||||||
return currentParentNodeRef;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected String doLoading(LoaderServerProxy serverProxy, NodeRef workingRootNodeRef) throws Exception
|
protected String doLoading(LoaderServerProxy serverProxy, NodeRef workingRootNodeRef) throws Exception
|
||||||
{
|
{
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2005-2007 Alfresco Software Limited.
|
* Copyright (C) 2005-2008 Alfresco Software Limited.
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or
|
* This program is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU General Public License
|
* modify it under the terms of the GNU General Public License
|
||||||
@ -165,6 +165,13 @@ public class FileFolderRemoteClient implements FileFolderRemote
|
|||||||
return remotePeer.create(ticket, parentNodeRef, name, typeQName);
|
return remotePeer.create(ticket, parentNodeRef, name, typeQName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
|
public FileInfo[] create(String ticket, final NodeRef[] parentNodeRefs, final String[] names, final QName[] typesQName) throws FileExistsException
|
||||||
|
{
|
||||||
|
return remotePeer.create(ticket, parentNodeRefs, names, typesQName);
|
||||||
|
}
|
||||||
/**
|
/**
|
||||||
* {@inheritDoc}
|
* {@inheritDoc}
|
||||||
*/
|
*/
|
||||||
@ -173,6 +180,14 @@ public class FileFolderRemoteClient implements FileFolderRemote
|
|||||||
remotePeer.delete(ticket, nodeRef);
|
remotePeer.delete(ticket, nodeRef);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
|
public void delete(String ticket, final NodeRef[] nodeRefs)
|
||||||
|
{
|
||||||
|
remotePeer.delete(ticket, nodeRefs);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* {@inheritDoc}
|
* {@inheritDoc}
|
||||||
*/
|
*/
|
||||||
@ -213,6 +228,14 @@ public class FileFolderRemoteClient implements FileFolderRemote
|
|||||||
return remotePeer.putContent(ticket, nodeRef, bytes, filename);
|
return remotePeer.putContent(ticket, nodeRef, bytes, filename);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
|
public ContentData[] putContent(String ticket, NodeRef nodeRefs[], byte[][] bytes, String[] filenames)
|
||||||
|
{
|
||||||
|
return remotePeer.putContent(ticket, nodeRefs, bytes, filenames);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* {@inheritDoc}
|
* {@inheritDoc}
|
||||||
*/
|
*/
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2005-2007 Alfresco Software Limited.
|
* Copyright (C) 2005-2008 Alfresco Software Limited.
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or
|
* This program is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU General Public License
|
* modify it under the terms of the GNU General Public License
|
||||||
@ -357,6 +357,36 @@ public class FileFolderRemoteServer implements FileFolderRemote
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
|
public FileInfo[] create(String ticket, final NodeRef[] parentNodeRefs, final String[] names, final QName[] typesQName) throws FileExistsException
|
||||||
|
{
|
||||||
|
AuthenticationUtil.pushAuthentication();
|
||||||
|
try
|
||||||
|
{
|
||||||
|
authenticationService.validate(ticket);
|
||||||
|
// Make the call
|
||||||
|
RetryingTransactionCallback<FileInfo[]> callback = new RetryingTransactionCallback<FileInfo[]>()
|
||||||
|
{
|
||||||
|
public FileInfo[] execute() throws Throwable
|
||||||
|
{
|
||||||
|
FileInfo[] result = new FileInfo[parentNodeRefs.length];
|
||||||
|
for (int i = 0; i< result.length; i++)
|
||||||
|
{
|
||||||
|
result[i] = fileFolderService.create(parentNodeRefs[i], names[i], typesQName[i]);
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
return retryingTransactionHelper.doInTransaction(callback, false, true);
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
AuthenticationUtil.popAuthentication();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* {@inheritDoc}
|
* {@inheritDoc}
|
||||||
*/
|
*/
|
||||||
@ -383,6 +413,33 @@ public class FileFolderRemoteServer implements FileFolderRemote
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
|
public void delete(String ticket, final NodeRef[] nodeRefs)
|
||||||
|
{
|
||||||
|
AuthenticationUtil.pushAuthentication();
|
||||||
|
try
|
||||||
|
{
|
||||||
|
authenticationService.validate(ticket);
|
||||||
|
// Make the call
|
||||||
|
RetryingTransactionCallback<Object> callback = new RetryingTransactionCallback<Object>()
|
||||||
|
{
|
||||||
|
public Object execute() throws Throwable
|
||||||
|
{
|
||||||
|
for (NodeRef nodeRef : nodeRefs)
|
||||||
|
fileFolderService.delete(nodeRef);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
retryingTransactionHelper.doInTransaction(callback, false, true);
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
AuthenticationUtil.popAuthentication();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* {@inheritDoc}
|
* {@inheritDoc}
|
||||||
*/
|
*/
|
||||||
@ -532,6 +589,62 @@ public class FileFolderRemoteServer implements FileFolderRemote
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
|
public ContentData[] putContent(
|
||||||
|
String ticket,
|
||||||
|
final NodeRef[] nodeRefs,
|
||||||
|
final byte[][] bytes,
|
||||||
|
final String[] filenames)
|
||||||
|
{
|
||||||
|
AuthenticationUtil.pushAuthentication();
|
||||||
|
try
|
||||||
|
{
|
||||||
|
authenticationService.validate(ticket);
|
||||||
|
// Make the call
|
||||||
|
RetryingTransactionCallback<ContentData[]> callback = new RetryingTransactionCallback<ContentData[]>()
|
||||||
|
{
|
||||||
|
public ContentData[] execute() throws Throwable
|
||||||
|
{
|
||||||
|
// Guess the mimetype
|
||||||
|
ContentData[] results = new ContentData[filenames.length];
|
||||||
|
|
||||||
|
for (int i = 0; i < filenames.length; i++)
|
||||||
|
{
|
||||||
|
|
||||||
|
String mimetype = mimetypeService.guessMimetype(filenames[i]);
|
||||||
|
|
||||||
|
// Get a writer
|
||||||
|
ContentWriter writer = fileFolderService.getWriter(nodeRefs[i]);
|
||||||
|
// Make a stream
|
||||||
|
ByteArrayInputStream is = new ByteArrayInputStream(bytes[i]);
|
||||||
|
// Guess the encoding
|
||||||
|
ContentCharsetFinder charsetFinder = mimetypeService.getContentCharsetFinder();
|
||||||
|
Charset charset = charsetFinder.getCharset(is, mimetype);
|
||||||
|
// Set metadata
|
||||||
|
writer.setEncoding(charset.name());
|
||||||
|
writer.setMimetype(mimetype);
|
||||||
|
|
||||||
|
// Write the stream
|
||||||
|
writer.putContent(is);
|
||||||
|
results[i] = writer.getContentData();
|
||||||
|
}
|
||||||
|
// Done
|
||||||
|
return results;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
ContentData[] contentData = retryingTransactionHelper.doInTransaction(callback, false, true);
|
||||||
|
// Done
|
||||||
|
return contentData;
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
AuthenticationUtil.popAuthentication();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* {@inheritDoc}
|
* {@inheritDoc}
|
||||||
*/
|
*/
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2005-2007 Alfresco Software Limited.
|
* Copyright (C) 2005-2008 Alfresco Software Limited.
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or
|
* This program is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU General Public License
|
* modify it under the terms of the GNU General Public License
|
||||||
@ -24,25 +24,18 @@
|
|||||||
*/
|
*/
|
||||||
package org.alfresco.repo.remote;
|
package org.alfresco.repo.remote;
|
||||||
|
|
||||||
import java.io.ByteArrayInputStream;
|
|
||||||
import java.nio.charset.Charset;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
import org.alfresco.model.ContentModel;
|
import org.alfresco.model.ContentModel;
|
||||||
import org.alfresco.repo.content.encoding.ContentCharsetFinder;
|
import org.alfresco.repo.content.encoding.ContentCharsetFinder;
|
||||||
import org.alfresco.repo.node.db.NodeDaoService;
|
import org.alfresco.repo.node.db.NodeDaoService;
|
||||||
import org.alfresco.repo.security.authentication.AuthenticationUtil;
|
import org.alfresco.repo.security.authentication.AuthenticationUtil;
|
||||||
import org.alfresco.repo.transaction.RetryingTransactionHelper;
|
import org.alfresco.repo.transaction.RetryingTransactionHelper;
|
||||||
import org.alfresco.repo.transaction.RetryingTransactionHelper.RetryingTransactionCallback;
|
import org.alfresco.repo.transaction.RetryingTransactionHelper.RetryingTransactionCallback;
|
||||||
|
import org.alfresco.service.cmr.coci.CheckOutCheckInService;
|
||||||
import org.alfresco.service.cmr.model.FileFolderService;
|
import org.alfresco.service.cmr.model.FileFolderService;
|
||||||
import org.alfresco.service.cmr.model.FileInfo;
|
import org.alfresco.service.cmr.model.FileInfo;
|
||||||
|
import org.alfresco.service.cmr.remote.FileFolderRemote;
|
||||||
import org.alfresco.service.cmr.remote.LoaderRemote;
|
import org.alfresco.service.cmr.remote.LoaderRemote;
|
||||||
import org.alfresco.service.cmr.repository.ChildAssociationRef;
|
import org.alfresco.service.cmr.repository.*;
|
||||||
import org.alfresco.service.cmr.repository.ContentWriter;
|
|
||||||
import org.alfresco.service.cmr.repository.MimetypeService;
|
|
||||||
import org.alfresco.service.cmr.repository.NodeRef;
|
|
||||||
import org.alfresco.service.cmr.repository.NodeService;
|
|
||||||
import org.alfresco.service.cmr.repository.StoreRef;
|
|
||||||
import org.alfresco.service.cmr.security.AuthenticationService;
|
import org.alfresco.service.cmr.security.AuthenticationService;
|
||||||
import org.alfresco.service.namespace.NamespaceService;
|
import org.alfresco.service.namespace.NamespaceService;
|
||||||
import org.alfresco.service.namespace.QName;
|
import org.alfresco.service.namespace.QName;
|
||||||
@ -51,6 +44,13 @@ import org.alfresco.util.PropertyMap;
|
|||||||
import org.apache.commons.logging.Log;
|
import org.apache.commons.logging.Log;
|
||||||
import org.apache.commons.logging.LogFactory;
|
import org.apache.commons.logging.LogFactory;
|
||||||
|
|
||||||
|
import java.io.ByteArrayInputStream;
|
||||||
|
import java.io.Serializable;
|
||||||
|
import java.nio.charset.Charset;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Server side implementation of the <code>LoaderServiceTransport</code> transport
|
* Server side implementation of the <code>LoaderServiceTransport</code> transport
|
||||||
* layer. This is the class that gets exported remotely as it contains the
|
* layer. This is the class that gets exported remotely as it contains the
|
||||||
@ -73,7 +73,9 @@ public class LoaderRemoteServer implements LoaderRemote
|
|||||||
private NodeService nodeService;
|
private NodeService nodeService;
|
||||||
private NodeDaoService nodeDaoService;
|
private NodeDaoService nodeDaoService;
|
||||||
private FileFolderService fileFolderService;
|
private FileFolderService fileFolderService;
|
||||||
|
private FileFolderRemote fileFolderRemote;
|
||||||
private MimetypeService mimetypeService;
|
private MimetypeService mimetypeService;
|
||||||
|
private CheckOutCheckInService checkOutCheckInService;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param transactionService provides transactional support and retrying
|
* @param transactionService provides transactional support and retrying
|
||||||
@ -115,6 +117,11 @@ public class LoaderRemoteServer implements LoaderRemote
|
|||||||
this.fileFolderService = fileFolderService;
|
this.fileFolderService = fileFolderService;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setFileFolderRemote(FileFolderRemote fileFolderRemote)
|
||||||
|
{
|
||||||
|
this.fileFolderRemote = fileFolderRemote;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param mimetypeService used to determine encoding, etc
|
* @param mimetypeService used to determine encoding, etc
|
||||||
*/
|
*/
|
||||||
@ -123,6 +130,11 @@ public class LoaderRemoteServer implements LoaderRemote
|
|||||||
this.mimetypeService = mimetypeService;
|
this.mimetypeService = mimetypeService;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setCheckOutCheckInService(CheckOutCheckInService checkOutCheckInService)
|
||||||
|
{
|
||||||
|
this.checkOutCheckInService = checkOutCheckInService;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* {@inheritDoc}
|
* {@inheritDoc}
|
||||||
*/
|
*/
|
||||||
@ -285,4 +297,154 @@ public class LoaderRemoteServer implements LoaderRemote
|
|||||||
AuthenticationUtil.popAuthentication();
|
AuthenticationUtil.popAuthentication();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
|
public void coci(String ticket, final NodeRef[] nodeRef, byte[][] bytes, List<HashMap<String, Serializable>> versionProperties)
|
||||||
|
{
|
||||||
|
FileInfo[] workingCopy = checkout(ticket, nodeRef);
|
||||||
|
String[] fna = new String[bytes.length];
|
||||||
|
for (int i = 0; i < workingCopy.length; i++)
|
||||||
|
{
|
||||||
|
fna[i] = workingCopy[i].getName();
|
||||||
|
versionProperties.add(new HashMap<String, Serializable>());
|
||||||
|
}
|
||||||
|
fileFolderRemote.putContent(ticket, getNodesRef(workingCopy), bytes, fna);
|
||||||
|
checkin(ticket, getNodesRef(workingCopy), versionProperties);
|
||||||
|
}
|
||||||
|
|
||||||
|
NodeRef[] getNodesRef(FileInfo[] filesInfoList)
|
||||||
|
{
|
||||||
|
NodeRef[] nr = new NodeRef[filesInfoList.length];
|
||||||
|
for (int i = 0; i < filesInfoList.length; i++)
|
||||||
|
{
|
||||||
|
nr[i] = (filesInfoList[i].getNodeRef());
|
||||||
|
}
|
||||||
|
return nr;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
|
public NodeRef checkout(String ticket,final NodeRef nodeRef)
|
||||||
|
{
|
||||||
|
|
||||||
|
AuthenticationUtil.pushAuthentication();
|
||||||
|
try
|
||||||
|
{
|
||||||
|
authenticationService.validate(ticket);
|
||||||
|
RetryingTransactionCallback<NodeRef> callback = new RetryingTransactionCallback<NodeRef>()
|
||||||
|
{
|
||||||
|
public NodeRef execute() throws Throwable
|
||||||
|
{
|
||||||
|
//check out current document
|
||||||
|
return checkOutCheckInService.checkout(nodeRef);
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
return retryingTransactionHelper.doInTransaction(callback, false, true);
|
||||||
|
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
AuthenticationUtil.popAuthentication();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
|
public FileInfo[] checkout(String ticket, final NodeRef[] nodeRef)
|
||||||
|
{
|
||||||
|
AuthenticationUtil.pushAuthentication();
|
||||||
|
try
|
||||||
|
{
|
||||||
|
authenticationService.validate(ticket);
|
||||||
|
RetryingTransactionCallback<FileInfo[]> callback = new RetryingTransactionCallback<FileInfo[]>()
|
||||||
|
{
|
||||||
|
public FileInfo[] execute() throws Throwable
|
||||||
|
{
|
||||||
|
FileInfo[] arr = new FileInfo[nodeRef.length];
|
||||||
|
|
||||||
|
for(int i = 0; i < nodeRef.length; i++)
|
||||||
|
{
|
||||||
|
//check out current document
|
||||||
|
arr[i] = fileFolderService.getFileInfo(checkOutCheckInService.checkout(nodeRef[i]));
|
||||||
|
}
|
||||||
|
//Done
|
||||||
|
return arr;
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
return retryingTransactionHelper.doInTransaction(callback, false, true);
|
||||||
|
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
AuthenticationUtil.popAuthentication();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
|
public NodeRef checkin(String ticket,
|
||||||
|
final NodeRef workingCopyNodeRef,
|
||||||
|
final Map<String, Serializable> versionProperties)
|
||||||
|
{
|
||||||
|
AuthenticationUtil.pushAuthentication();
|
||||||
|
try
|
||||||
|
{
|
||||||
|
authenticationService.validate(ticket);
|
||||||
|
RetryingTransactionCallback<NodeRef> callback = new RetryingTransactionCallback<NodeRef>()
|
||||||
|
{
|
||||||
|
public NodeRef execute() throws Throwable
|
||||||
|
{
|
||||||
|
//check in current document
|
||||||
|
return checkOutCheckInService.checkin(workingCopyNodeRef,versionProperties);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
return retryingTransactionHelper.doInTransaction(callback, false, true);
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
AuthenticationUtil.popAuthentication();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
|
public NodeRef [] checkin(String ticket, final NodeRef [] workingCopyNodeRef,
|
||||||
|
final List<HashMap<String, Serializable>> versionProperties)
|
||||||
|
{
|
||||||
|
AuthenticationUtil.pushAuthentication();
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
authenticationService.validate(ticket);
|
||||||
|
RetryingTransactionCallback<NodeRef[]> callback = new RetryingTransactionCallback<NodeRef[]>()
|
||||||
|
{
|
||||||
|
public NodeRef [] execute() throws Throwable
|
||||||
|
{
|
||||||
|
NodeRef [] nr = new NodeRef[workingCopyNodeRef.length];
|
||||||
|
for(int i = 0; i < workingCopyNodeRef.length;i++)
|
||||||
|
{
|
||||||
|
//check in current document
|
||||||
|
nr[i] = checkOutCheckInService.checkin(workingCopyNodeRef[i],versionProperties.get(i));
|
||||||
|
}
|
||||||
|
//Done
|
||||||
|
return nr;
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
return retryingTransactionHelper.doInTransaction(callback, false, true);
|
||||||
|
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
AuthenticationUtil.popAuthentication();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2005-2007 Alfresco Software Limited.
|
* Copyright (C) 2005-2008 Alfresco Software Limited.
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or
|
* This program is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU General Public License
|
* modify it under the terms of the GNU General Public License
|
||||||
@ -134,6 +134,13 @@ public interface FileFolderRemote
|
|||||||
*/
|
*/
|
||||||
public FileInfo create(String ticket, NodeRef parentNodeRef, String name, QName typeQName) throws FileExistsException;
|
public FileInfo create(String ticket, NodeRef parentNodeRef, String name, QName typeQName) throws FileExistsException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param token the authentication ticket
|
||||||
|
*
|
||||||
|
* This is additional method to avoid multiple authorisation during creating files
|
||||||
|
*/
|
||||||
|
public FileInfo[] create(String ticket, NodeRef[] parentNodeRefs, String[] names, QName[] typesQName) throws FileExistsException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param token the authentication ticket
|
* @param token the authentication ticket
|
||||||
*
|
*
|
||||||
@ -141,6 +148,13 @@ public interface FileFolderRemote
|
|||||||
*/
|
*/
|
||||||
public void delete(String ticket, NodeRef nodeRef);
|
public void delete(String ticket, NodeRef nodeRef);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param token the authentication ticket
|
||||||
|
*
|
||||||
|
* This is additional method to avoid multiple authorisation during deleting files
|
||||||
|
*/
|
||||||
|
public void delete(String ticket, NodeRef[] nodeRefs);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param token the authentication ticket
|
* @param token the authentication ticket
|
||||||
*
|
*
|
||||||
@ -176,6 +190,13 @@ public interface FileFolderRemote
|
|||||||
*/
|
*/
|
||||||
public ContentData putContent(String ticket, NodeRef nodeRef, byte[] bytes, String filename);
|
public ContentData putContent(String ticket, NodeRef nodeRef, byte[] bytes, String filename);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param token the authentication ticket
|
||||||
|
*
|
||||||
|
* This is additional method to avoid multiple authorisation during putting content
|
||||||
|
*/
|
||||||
|
public ContentData[] putContent(String ticket, NodeRef nodeRefs[], byte[][] bytes, String[] filenames);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* TODO: Refactor!!!
|
* TODO: Refactor!!!
|
||||||
*/
|
*/
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2005-2007 Alfresco Software Limited.
|
* Copyright (C) 2005-2008 Alfresco Software Limited.
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or
|
* This program is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU General Public License
|
* modify it under the terms of the GNU General Public License
|
||||||
@ -28,6 +28,10 @@ import org.alfresco.service.cmr.model.FileInfo;
|
|||||||
import org.alfresco.service.cmr.repository.NodeRef;
|
import org.alfresco.service.cmr.repository.NodeRef;
|
||||||
import org.alfresco.service.cmr.repository.StoreRef;
|
import org.alfresco.service.cmr.repository.StoreRef;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Remote transport interface for the Loader application. This adds functionality
|
* Remote transport interface for the Loader application. This adds functionality
|
||||||
* that is generally required by the application and that is not available on other
|
* that is generally required by the application and that is not available on other
|
||||||
@ -84,4 +88,38 @@ public interface LoaderRemote
|
|||||||
* @return Returns the details of each file created
|
* @return Returns the details of each file created
|
||||||
*/
|
*/
|
||||||
public FileInfo[] uploadContent(String ticket, NodeRef folderNodeRef, String[] filenames, byte[][] bytes);
|
public FileInfo[] uploadContent(String ticket, NodeRef folderNodeRef, String[] filenames, byte[][] bytes);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check in Check out files.
|
||||||
|
*
|
||||||
|
* @param ticket the authentication ticket
|
||||||
|
* @param nodeRef a reference to the node to checkout
|
||||||
|
* @param bytes the contents of the files
|
||||||
|
* @param versionProperties the version properties. If null is passed then the original node
|
||||||
|
* is NOT versioned during the checkin operation.
|
||||||
|
*/
|
||||||
|
public void coci(String ticket, final NodeRef[] nodeRef, byte[][] bytes, List<HashMap<String, Serializable>> versionProperties);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check out files.
|
||||||
|
*
|
||||||
|
* @param ticket the authentication ticket
|
||||||
|
* @param nodeRef a reference to the node to checkout
|
||||||
|
* @return a node reference to the created working copy
|
||||||
|
*/
|
||||||
|
public FileInfo[] checkout(String ticket, NodeRef[] nodeRef);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check in files.
|
||||||
|
*
|
||||||
|
* @param ticket the authentication ticket
|
||||||
|
* @param workingCopyNodeRef the working copy node reference
|
||||||
|
* @param versionProperties the version properties. If null is passed then the original node
|
||||||
|
* is NOT versioned during the checkin operation.
|
||||||
|
* @return the node reference to the original node, updated with the checked in
|
||||||
|
* state
|
||||||
|
*/
|
||||||
|
public NodeRef[] checkin(String ticket, NodeRef[] workingCopyNodeRef,
|
||||||
|
List<HashMap<String, Serializable>> versionProperties);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user