Merge DEV\WCM_SERVICES2 to HEAD

12513 Implementation of Asset.getProperties
    12469 Implement paths relative to web app.  And unit tests.   Asset Test is now clean of TODOs.
    12413  Implementation of WCM Asset.    Still work remaining but this is 80% of the implementation.
    12404 WCM Services
        - asset service - fix rename/move folder issue (folders are not locked)
        - sandbox service - fix delete sandbox test
    12374 WCM Services - optimise get/is web project
    12347  WCM Services - "asset service" - add/remove/has aspect, get aspects
    12341  WCM Services - "asset service" checkpoint (locking fixes, bulk import, more tests added)




git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@12547 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
Mark Rogers
2008-12-23 22:54:46 +00:00
parent eb906a0d52
commit d09673969d
14 changed files with 507 additions and 192 deletions

View File

@@ -28,6 +28,7 @@ import java.io.File;
import java.io.Serializable;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.alfresco.service.cmr.repository.ContentReader;
import org.alfresco.service.cmr.repository.ContentWriter;
@@ -175,6 +176,40 @@ public interface AssetService
*/
public void updateAssetProperties(AssetInfo asset, Map<QName, Serializable> properties);
/**
* Apply aspect to asset, with given properties (can be null)
*
* @param asset
* @param aspectName
* @param properties
*/
public void addAspect(AssetInfo asset, QName aspectName, Map<QName, Serializable> properties);
/**
* Remove aspect from asset, and any related properties
*
* @param asset
* @param aspectName
*/
public void removeAspect(AssetInfo asset, QName aspectName);
/**
* Get set of aspects applied to asset
*
* @param asset
* @return list of aspects
*/
public Set<QName> getAspects(AssetInfo asset);
/**
* True, if asset has given aspect applied
*
* @param asset
* @param aspectName
* @return
*/
public boolean hasAspect(AssetInfo asset, QName aspectName);
/**
* List assets within given sandbox and webApp and path (within webApp), optionally include deleted
*
@@ -182,7 +217,7 @@ public interface AssetService
* @param webApp
* @param parentFolderPathRelativeToWebApp
* @param includeDeleted
* @return
* @return list of assets
*/
public List<AssetInfo> listAssetsWebApp(String sbStoreId, String webApp, String parentFolderPathRelativeToWebApp, boolean includeDeleted);
@@ -192,7 +227,7 @@ public interface AssetService
* @param sbStoreId
* @param parentFolderPath
* @param includeDeleted
* @return
* @return list of assets
*/
public List<AssetInfo> listAssets(String sbStoreId, String parentFolderPath, boolean includeDeleted);
@@ -203,7 +238,7 @@ public interface AssetService
* @param version
* @param parentFolderPath
* @param includeDeleted
* @return
* @return list of assets
*/
public List<AssetInfo> listAssets(String sbStoreId, int version, String parentFolderPath, boolean includeDeleted);

View File

@@ -35,6 +35,7 @@ import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.alfresco.error.AlfrescoRuntimeException;
import org.alfresco.mbeans.VirtServerRegistry;
@@ -443,13 +444,54 @@ public class AssetServiceImpl implements AssetService
private void setProperties(String avmPath, Map<QName, Serializable> properties)
{
NodeRef avmNodeRef = AVMNodeConverter.ToNodeRef(-1, avmPath);
avmNodeService.setProperties(avmNodeRef, properties); // note: assumes lock, if applicable, is taken by caller
avmNodeService.setProperties(avmNodeRef, properties);
}
/* (non-Javadoc)
* @see org.alfresco.wcm.asset.AssetService#addAspect(org.alfresco.wcm.asset.AssetInfo, org.alfresco.service.namespace.QName, java.util.Map)
*/
public void addAspect(AssetInfo asset, QName aspectName, Map<QName, Serializable> properties)
{
addAspect(asset.getAvmPath(), aspectName, properties);
}
private void addAspect(String avmPath, QName aspect, Map<QName, Serializable> properties)
{
NodeRef avmNodeRef = AVMNodeConverter.ToNodeRef(-1, avmPath);
avmNodeService.addAspect(avmNodeRef, aspect, properties); // note: assumes lock, if applicable, is taken by caller
avmNodeService.addAspect(avmNodeRef, aspect, properties);
}
/* (non-Javadoc)
* @see org.alfresco.wcm.asset.AssetService#removeAspect(org.alfresco.wcm.asset.AssetInfo, org.alfresco.service.namespace.QName)
*/
public void removeAspect(AssetInfo asset, QName aspectName)
{
ParameterCheck.mandatory("asset", asset);
NodeRef avmNodeRef = AVMNodeConverter.ToNodeRef(-1, asset.getAvmPath());
avmNodeService.removeAspect(avmNodeRef, aspectName);
}
/* (non-Javadoc)
* @see org.alfresco.wcm.asset.AssetService#getAspects(org.alfresco.wcm.asset.AssetInfo)
*/
public Set<QName> getAspects(AssetInfo asset)
{
ParameterCheck.mandatory("asset", asset);
NodeRef avmNodeRef = AVMNodeConverter.ToNodeRef(asset.getSandboxVersion(), asset.getAvmPath());
return avmNodeService.getAspects(avmNodeRef);
}
/* (non-Javadoc)
* @see org.alfresco.wcm.asset.AssetService#hasAspect(org.alfresco.wcm.asset.AssetInfo, org.alfresco.service.namespace.QName)
*/
public boolean hasAspect(AssetInfo asset, QName aspectName)
{
ParameterCheck.mandatory("asset", asset);
NodeRef avmNodeRef = AVMNodeConverter.ToNodeRef(asset.getSandboxVersion(), asset.getAvmPath());
return avmNodeService.hasAspect(avmNodeRef, aspectName);
}
/* (non-Javadoc)

View File

@@ -199,7 +199,7 @@ public class AssetServiceImplTest extends TestCase
assetService.createFolder(sbStoreId, path, "myFolder1", null);
// create (empty) file
assetService.createFile(sbStoreId, path+"/myFolder1", "myFile1", null);
assetService.createFile(sbStoreId, path+"/myFolder1", "myFile1", null); // ignore return
// get assets
@@ -502,12 +502,6 @@ public class AssetServiceImplTest extends TestCase
checkAssetInfo(myFile1Asset, "myFile1Renamed", path+"/myFolder1/myFolder2/myFile1Renamed", USER_ONE, true, false, false, true, USER_ONE);
}
/*
// TODO lock issue ...
// org.alfresco.service.cmr.avm.AVMNotFoundException: Lock not found for testAsset-1228476617644-rename:/www/avm_webapps/ROOT/myFolder1
// at org.alfresco.repo.avm.locking.AVMLockingServiceImpl.modifyLock(AVMLockingServiceImpl.java:490)
// at org.alfresco.repo.avm.AVMLockingAwareService.rename(AVMLockingAwareService.java:712)
public void testRenameFolder()
{
// create web project (also creates staging sandbox and admin's author sandbox)
@@ -536,20 +530,18 @@ public class AssetServiceImplTest extends TestCase
AssetInfo myFolder2Asset = assetService.getAsset(sbStoreId, path+"/myFolder1/myFolder2");
checkAssetInfo(myFolder2Asset, "myFolder2", path+"/myFolder1/myFolder2", USER_ONE, false, true, false, false, null);
// TODO lock issue ...
// org.alfresco.service.cmr.avm.AVMNotFoundException: Lock not found for testAsset-1228476617644-rename:/www/avm_webapps/ROOT/myFolder1
// at org.alfresco.repo.avm.locking.AVMLockingServiceImpl.modifyLock(AVMLockingServiceImpl.java:490)
//at org.alfresco.repo.avm.AVMLockingAwareService.rename(AVMLockingAwareService.java:712)
// rename folder
// rename folder 1
myFolder1Asset = assetService.renameAsset(myFolder1Asset, "myFolder1Renamed");
checkAssetInfo(myFolder1Asset, "myFolder1Renamed", path+"/myFolder1Renamed", USER_ONE, false, true, false, false, null);
// rename folder
// rename folder 2
myFolder2Asset = assetService.getAsset(sbStoreId, path+"/myFolder1Renamed/myFolder2");
checkAssetInfo(myFolder2Asset, "myFolder2", path+"/myFolder1Renamed/myFolder2", USER_ONE, false, true, false, false, null);
myFolder2Asset = assetService.renameAsset(myFolder2Asset, "myFolder2Renamed");
checkAssetInfo(myFolder2Asset, "myFolder2Renamed", path+"/myFolder1/myFolder2Renamed", USER_ONE, false, true, false, false, null);
checkAssetInfo(myFolder2Asset, "myFolder2Renamed", path+"/myFolder1Renamed/myFolder2Renamed", USER_ONE, false, true, false, false, null);
}
*/
public void testCopyFile()
{
@@ -573,7 +565,7 @@ public class AssetServiceImplTest extends TestCase
assetService.createFolder(sbStoreId, path, "myFolder1", null);
assetService.createFolder(sbStoreId, path+"/myFolder1", "myFolder2", null);
// create (nn-empty) file
// create (non-empty) file
final String MYFILE1 = "This is myFile1";
ContentWriter writer = assetService.createFile(sbStoreId, path+"/myFolder1/myFolder2", "myFile1", null);
writer.setMimetype(MimetypeMap.MIMETYPE_TEXT_PLAIN);
@@ -584,9 +576,8 @@ public class AssetServiceImplTest extends TestCase
AssetInfo myFile1Asset = assetService.getAsset(sbStoreId, path+"/myFolder1/myFolder2/myFile1");
checkAssetInfo(myFile1Asset, "myFile1", path+"/myFolder1/myFolder2/myFile1", USER_ONE, true, false, false, true, USER_ONE);
myFile1Asset = assetService.copyAsset(myFile1Asset, path+"/myFolder1");
// TODO review - copied files are not locked ?
myFile1Asset = assetService.copyAsset(myFile1Asset, path+"/myFolder1");
//checkAssetInfo(myFile1Asset, "myFile1", path+"/myFolder1/myFile1", USER_ONE, true, false, false, true, USER_ONE);
checkAssetInfo(myFile1Asset, "myFile1", path+"/myFolder1/myFile1", USER_ONE, true, false, false, false, null);
}
@@ -664,7 +655,7 @@ public class AssetServiceImplTest extends TestCase
assetService.createFolder(sbStoreId, path+"/myFolder1", "myFolder2", null);
// create (empty) file
assetService.createFile(sbStoreId, path+"/myFolder1/myFolder2", "myFile1", null);
assetService.createFile(sbStoreId, path+"/myFolder1/myFolder2", "myFile1", null); // ignore return
// move file
AssetInfo myFile1Asset = assetService.getAsset(sbStoreId, path+"/myFolder1/myFolder2/myFile1");
@@ -682,7 +673,7 @@ public class AssetServiceImplTest extends TestCase
// org.alfresco.service.cmr.avm.AVMNotFoundException: Lock not found for testAsset-1228830920248-movefolder:/www/avm_webapps/ROOT/myFolder1/myFolder2
// at org.alfresco.repo.avm.locking.AVMLockingServiceImpl.modifyLock(AVMLockingServiceImpl.java:490)
// at org.alfresco.repo.avm.AVMLockingAwareService.rename(AVMLockingAwareService.java:712)
*/
public void testMoveFolder()
{
// create web project (also creates staging sandbox and admin's author sandbox)
@@ -705,12 +696,8 @@ public class AssetServiceImplTest extends TestCase
assetService.createFolder(sbStoreId, path, "myFolder1", null);
assetService.createFolder(sbStoreId, path+"/myFolder1", "myFolder2", null);
// create (non-empty) file
//final String MYFILE1 = "This is myFile1";
ContentWriter writer = assetService.createFile(sbStoreId, path+"/myFolder1/myFolder2", "myFile1", null);
//writer.setMimetype(MimetypeMap.MIMETYPE_TEXT_PLAIN);
//writer.setEncoding("UTF-8");
//writer.putContent(MYFILE1);
// create (empty) file
assetService.createFile(sbStoreId, path+"/myFolder1/myFolder2", "myFile1", null); // ignore return
AssetInfo myFile1Asset = assetService.getAsset(sbStoreId, path+"/myFolder1/myFolder2/myFile1");
checkAssetInfo(myFile1Asset, "myFile1", path+"/myFolder1/myFolder2/myFile1", USER_ONE, true, false, false, true, USER_ONE);
@@ -729,10 +716,9 @@ public class AssetServiceImplTest extends TestCase
AssetInfo myMovedFile1Asset = assetService.getAsset(sbStoreId, path+"/myFolder2/myFile1");
// TODO review - moved files are not locked ?
checkAssetInfo(myMovedFile1Asset, "myFile1", path+"/myFolder2/myFile1", USER_ONE, true, false, false, true, USER_ONE);
//checkAssetInfo(myMovedFile1Asset, "myFile1", path+"/myFolder2/myFile1", USER_ONE, true, false, false, false, null);
//checkAssetInfo(myMovedFile1Asset, "myFile1", path+"/myFolder2/myFile1", USER_ONE, true, false, false, true, USER_ONE);
checkAssetInfo(myMovedFile1Asset, "myFile1", path+"/myFolder2/myFile1", USER_ONE, true, false, false, false, null);
}
*/
public void testProperties()
{
@@ -817,6 +803,76 @@ public class AssetServiceImplTest extends TestCase
assertEquals(USER_ONE, assetService.getLockOwner(myFile1Asset));
}
public void testAspects()
{
// create web project (also creates staging sandbox and admin's author sandbox)
WebProjectInfo wpInfo = wpService.createWebProject(TEST_WEBPROJ_DNS+"-aspects", TEST_WEBPROJ_NAME+"-aspects", TEST_WEBPROJ_TITLE, TEST_WEBPROJ_DESCRIPTION, TEST_WEBPROJ_DEFAULT_WEBAPP, TEST_WEBPROJ_DONT_USE_AS_TEMPLATE, null);
String defaultWebApp = wpInfo.getDefaultWebApp();
// invite web user and auto-create their (author) sandbox
wpService.inviteWebUser(wpInfo.getStoreId(), USER_ONE, WCMUtil.ROLE_CONTENT_CONTRIBUTOR, true);
// switch to user
AuthenticationUtil.setFullyAuthenticatedUser(USER_ONE);
// get user's author sandbox
SandboxInfo sbInfo = sbService.getAuthorSandbox(wpInfo.getStoreId());
String sbStoreId = sbInfo.getSandboxId();
String path = sbInfo.getSandboxRootPath() + "/" + defaultWebApp;
// create folder
assetService.createFolderWebApp(sbStoreId, defaultWebApp, "/", "myFolder1");
AssetInfo myFolder1Asset = assetService.getAssetWebApp(sbStoreId, defaultWebApp, "/myFolder1");
checkAssetInfo(myFolder1Asset, "myFolder1", path+"/myFolder1", USER_ONE, false, true, false, false, null);
int folderAspectCnt = assetService.getAspects(myFolder1Asset).size();
// create file
assetService.createFileWebApp(sbStoreId, defaultWebApp, "/myFolder1", "myFile1");
AssetInfo myFile1Asset = assetService.getAssetWebApp(sbStoreId, defaultWebApp, "/myFolder1/myFile1");
checkAssetInfo(myFile1Asset, "myFile1", path+"/myFolder1/myFile1", USER_ONE, true, false, false, true, USER_ONE);
int fileAspectCnt = assetService.getAspects(myFile1Asset).size();
// add/remove aspect to/from folder
assertFalse(assetService.hasAspect(myFolder1Asset, ContentModel.ASPECT_TITLED));
Map<QName, Serializable> newProps = new HashMap<QName, Serializable>(2);
newProps.put(ContentModel.PROP_TITLE, "folder title");
newProps.put(ContentModel.PROP_DESCRIPTION, "folder description");
assetService.addAspect(myFolder1Asset, ContentModel.ASPECT_TITLED, newProps);
assertEquals(folderAspectCnt+1, assetService.getAspects(myFolder1Asset).size());
assertTrue(assetService.hasAspect(myFolder1Asset, ContentModel.ASPECT_TITLED));
assetService.removeAspect(myFolder1Asset, ContentModel.ASPECT_TITLED);
assertEquals(folderAspectCnt, assetService.getAspects(myFolder1Asset).size());
assertFalse(assetService.hasAspect(myFolder1Asset, ContentModel.ASPECT_TITLED));
// add/remove aspect to/from file
assertFalse(assetService.hasAspect(myFile1Asset, ContentModel.ASPECT_TITLED));
newProps = new HashMap<QName, Serializable>(2);
newProps.put(ContentModel.PROP_TITLE, "file title");
newProps.put(ContentModel.PROP_DESCRIPTION, "file description");
assetService.addAspect(myFile1Asset, ContentModel.ASPECT_TITLED, newProps);
assertEquals(fileAspectCnt+1, assetService.getAspects(myFile1Asset).size());
assertTrue(assetService.hasAspect(myFile1Asset, ContentModel.ASPECT_TITLED));
assetService.removeAspect(myFile1Asset, ContentModel.ASPECT_TITLED);
assertEquals(fileAspectCnt, assetService.getAspects(myFile1Asset).size());
assertFalse(assetService.hasAspect(myFile1Asset, ContentModel.ASPECT_TITLED));
}
public void testSimpleLockFile()
{
// create web project (also creates staging sandbox and admin's author sandbox)

View File

@@ -341,7 +341,7 @@ public class SandboxServiceImpl implements SandboxService
if (sbStoreId.equals(wpStoreId))
{
throw new AlfrescoRuntimeException("Cannot delete staging sandbox '"+sbStoreId+"' (web project id: "+wpStoreId+")");
throw new AccessDeniedException("Cannot delete staging sandbox '"+sbStoreId+"' (web project id: "+wpStoreId+")");
}
// content manager may delete sandboxes, except staging sandbox

View File

@@ -33,12 +33,10 @@ import java.util.Map;
import junit.framework.TestCase;
import org.alfresco.error.AlfrescoRuntimeException;
import org.alfresco.model.ContentModel;
import org.alfresco.repo.content.MimetypeMap;
import org.alfresco.repo.security.authentication.AuthenticationUtil;
import org.alfresco.repo.security.permissions.AccessDeniedException;
import org.alfresco.service.cmr.avm.AVMNotFoundException;
import org.alfresco.service.cmr.avm.AVMService;
import org.alfresco.service.cmr.avm.VersionDescriptor;
import org.alfresco.service.cmr.repository.ContentReader;
@@ -419,7 +417,7 @@ public class SandboxServiceImplTest extends TestCase
sbService.deleteSandbox(sbInfo.getSandboxId());
fail("Shouldn't be able to delete staging sandbox");
}
catch (AlfrescoRuntimeException exception)
catch (AccessDeniedException exception)
{
// Expected
}
@@ -430,7 +428,7 @@ public class SandboxServiceImplTest extends TestCase
sbService.deleteSandbox("some-random-staging-sandbox");
fail("Shouldn't be able to delete non-existant sandbox");
}
catch (AVMNotFoundException exception)
catch (AccessDeniedException exception)
{
// Expected
}

View File

@@ -24,12 +24,20 @@
*/
package org.alfresco.wcm.sandbox.script;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.alfresco.service.cmr.repository.ContentWriter;
import org.alfresco.service.namespace.NamespaceException;
import org.alfresco.service.namespace.NamespaceService;
import org.alfresco.service.namespace.QName;
import org.alfresco.util.ISO8601DateFormat;
import org.alfresco.wcm.asset.AssetInfo;
import org.alfresco.wcm.asset.AssetService;
import org.alfresco.wcm.sandbox.SandboxService;
/**
@@ -37,10 +45,15 @@ import org.alfresco.wcm.sandbox.SandboxService;
* @author mrogers
*
*/
public class Asset
public class Asset implements Serializable
{
/**
*
*/
private static final long serialVersionUID = -5759260478423750966L;
private AssetInfo asset;
private Sandbox sandbox;
private Map<String, String> props;
public Asset(Sandbox sandbox, AssetInfo asset)
{
@@ -62,6 +75,11 @@ public class Asset
return asset.getCreatedDate();
}
public long getFileSize()
{
return asset.getFileSize();
}
public String getCreatedDateAsISO8601()
{
return ISO8601DateFormat.format(getCreatedDate());
@@ -82,12 +100,33 @@ public class Asset
return ISO8601DateFormat.format(getModifiedDate());
}
/*
public String getAssetRef()
{
return asset.getGuid();
}
*/
/**
* rename this asset
* @param newName
*/
public Asset rename(String newName)
{
if(!newName.equals(asset.getName()))
{
AssetInfo newAsset = getAssetService().renameAsset(asset, newName);
this.asset = newAsset;
}
return this;
}
/**
* move this asset
* @param newPath
*/
public Asset move(String newPath)
{
if(!newPath.equals(asset.getPath()))
{
AssetInfo newAsset = getAssetService().moveAsset(asset, newPath);
this.asset = newAsset;
}
return this;
}
public String getName()
{
@@ -108,7 +147,7 @@ public class Asset
return asset.isFile();
}
public boolean isDirectory()
public boolean isFolder()
{
return asset.isFolder();
}
@@ -123,14 +162,82 @@ public class Asset
return asset.isLocked();
}
/* TODO review
public String lockOwner()
{
return asset.getLockOwner();
}
public int getVersion()
{
return asset.getVersion();
return asset.getSandboxVersion();
}
*/
/**
* Get the properties as a key value pair. The key will be either a local qname e.g. "cm:content" or
* a global qname e.g. "{http://www.alfresco.com/content/1.0}content".
*
* Some properties will be updatable, protected properties are not.
*
* @return the properties in a key, value pair
*/
public Map<String, String> getProperties()
{
if(props == null) {
// Note there is something very strange going on with scope which is why there's this guff with propsX
Map<String, String> propsX = new HashMap<String, String>();
props = propsX;
NamespaceService ns = getNamespaceService();
if(!asset.isDeleted())
{
Map <QName, Serializable> intprops = getAssetService().getAssetProperties(asset);
for (QName qname : intprops.keySet())
{
QName prefixQname = qname.getPrefixedQName(ns);
Serializable propValue = intprops.get(qname);
try
{
propsX.put(prefixQname.toPrefixString(), propValue.toString());
}
catch (NamespaceException ne)
{ // No local name, only thing I can do is use the full namke
propsX.put(qname.toString(), propValue.toString());
}
}
}
}
return props;
}
// /**
// * Save the properties please note some system properties are protected and cannot be updated. If you attempt to
// * update a protected property your request will be ignored.
// * @param properties
// */
// public void save()
// {
// if(props != null)
// {
// /**
// * Need to map the <String, String> to a <Qname, Serializable>
// */
// NamespaceService ns = getNamespaceService();
// Map<QName, Serializable> newProps = new HashMap<QName, Serializable>(props.size());
// for (String key : props.keySet())
// {
// String value = props.get(key);
// QName q = QName.resolveToQName(ns, key);
// newProps.put(q, value);
// }
// getAssetService().setAssetProperties(asset, newProps);
// }
// }
/**
* Submit this asset to staging
* @param submitLabel
* @param submitComment
@@ -143,6 +250,14 @@ public class Asset
}
/**
* Delete this asset, after it has been deleted do not use this asset.
*/
public void deleteAsset()
{
getAssetService().deleteAsset(this.asset);
}
/**
* revert this asset
*/
public void revert()
@@ -153,6 +268,49 @@ public class Asset
}
/**
* Get children of this asset, returns an empty array if there are no children.
* Only folders have children.
*/
public Asset[] getChildren()
{
Asset[] ret = new Asset[0];
if(asset.isFolder())
{
int i = 0;
List<AssetInfo> assets = getAssetService().listAssets(getSandbox().getSandboxRef(), asset.getPath(), true);
ret = new Asset[assets.size()];
for(AssetInfo asset : assets)
{
ret[i++]=new Asset(sandbox, asset);
}
}
return ret;
}
/**
* create a new file with the specified properties and content.
* @param name the name of the file
* @param stringContent the content of the file. Can be null.
*/
public void createFile(String name, String stringContent)
{
ContentWriter writer = getAssetService().createFile(getSandbox().getSandboxRef(), asset.getPath(), name, null);
if(stringContent != null)
{
writer.putContent(stringContent);
}
}
/**
* create a new folder
* @param name the name of the new folder
*/
public void createFolder(String name)
{
getAssetService().createFolder(getSandbox().getSandboxRef(), asset.getPath(), name, null);
}
/**
* Get the parent sandbox which contains this asset
* @return the parent sandbox which contains this asset
*/
@@ -161,8 +319,29 @@ public class Asset
return this.sandbox;
}
/**
* @return
*/
private SandboxService getSandboxService()
{
return getSandbox().getWebproject().getWebProjects().getSandboxService();
}
/**
* Get the asset service
* @return the asset service
*/
private AssetService getAssetService()
{
return getSandbox().getWebproject().getWebProjects().getAssetService();
}
/**
* Get the asset service
* @return the asset service
*/
private NamespaceService getNamespaceService()
{
return getSandbox().getWebproject().getWebProjects().getNamespaceService();
}
}

View File

@@ -29,7 +29,6 @@ import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import org.alfresco.service.cmr.avm.AVMNodeDescriptor;
import org.alfresco.util.ISO8601DateFormat;
import org.alfresco.wcm.asset.AssetInfo;
import org.alfresco.wcm.asset.AssetService;
@@ -277,28 +276,37 @@ public class Sandbox implements Serializable
/**
* Get the specified asset (Either folder or file)
* @param path the full path e.g. /www/web_apps/ROOT/index.html
* @return the asset
* @return the asset or null if it does not exist
*/
public Asset getAsset(String path)
{
AssetService as = getAssetService();
AssetInfo item = as.getAsset(getSandboxRef(), path);
Asset newAsset = new Asset(this, item);
return newAsset;
if (item != null)
{
Asset newAsset = new Asset(this, item);
return newAsset;
}
return null;
}
/**
* Get the specified asset with a path relative to the specified web app.
* @param path e.g. index.html
* @param webApp e.g. ROOT
* @return the asset
* @return the asset or null if it does not exist
*/
public Asset getAssetWebApp(String webApp, String path)
{
AssetService as = getAssetService();
AssetInfo item = as.getAssetWebApp(getSandboxRef(), webApp, path);
Asset newAsset = new Asset(this, item);
return newAsset;
if (item != null)
{
Asset newAsset = new Asset(this, item);
return newAsset;
}
return null;
}
/**

View File

@@ -36,7 +36,9 @@ import org.alfresco.mbeans.VirtServerRegistry;
import org.alfresco.model.WCMAppModel;
import org.alfresco.repo.domain.PropertyValue;
import org.alfresco.service.cmr.avm.AVMBadArgumentException;
import org.alfresco.service.cmr.avm.AVMNotFoundException;
import org.alfresco.service.cmr.avm.AVMService;
import org.alfresco.service.cmr.dictionary.DataTypeDefinition;
import org.alfresco.service.cmr.repository.ChildAssociationRef;
import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.cmr.repository.NodeService;
@@ -45,6 +47,8 @@ import org.alfresco.service.namespace.RegexQNamePattern;
import org.alfresco.util.ParameterCheck;
import org.alfresco.util.VirtServerUtils;
import org.alfresco.wcm.sandbox.SandboxConstants;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
/**
@@ -57,6 +61,8 @@ import org.alfresco.wcm.sandbox.SandboxConstants;
*/
public class WCMUtil
{
private static Log logger = LogFactory.getLog(WCMUtil.class);
/**
* Extracts the sandbox store id from the avm path
*
@@ -478,6 +484,29 @@ public class WCMUtil
: null);
}
public static NodeRef getWebProjectNodeFromWebProjectStore(AVMService avmService, String wpStoreId)
{
NodeRef wpNodeRef = null;
String stagingStoreId = wpStoreId; // note: equivalent to WCMUtil.buildStagingStoreName(wpStoreId)
try
{
PropertyValue pValue = avmService.getStoreProperty(stagingStoreId, SandboxConstants.PROP_WEB_PROJECT_NODE_REF);
if (pValue != null)
{
wpNodeRef = (NodeRef)pValue.getValue(DataTypeDefinition.NODE_REF);
}
}
catch (AVMNotFoundException nfe)
{
logger.warn(wpStoreId + " is not a web project: " + nfe);
}
return wpNodeRef;
}
/**
* Converts the provided path to an absolute path within the avm.
*

View File

@@ -75,7 +75,7 @@ public interface WebProjectService
* @param absoluteAVMPath the AVM path from which to determine the Web Project
* @return NodeRef the web project node ref for the path or null if it could not be determined
*/
public NodeRef findWebProjectNodeFromPath(String absoluteAVMPath);
public NodeRef getWebProjectNodeFromPath(String absoluteAVMPath);
/**
* Returns the Web Project for the given AVM store name (sandbox store id)
@@ -83,7 +83,7 @@ public interface WebProjectService
* @param storeName the AVM store name (sandbox store id) from which to determine the Web Project
* @return NodeRef the web project node ref for the path or null if it could not be determined
*/
public NodeRef findWebProjectNodeFromStore(String storeName);
public NodeRef getWebProjectNodeFromStore(String storeName);
/**
* List the available web projects for the current user

View File

@@ -66,7 +66,6 @@ import org.alfresco.service.namespace.QName;
import org.alfresco.service.namespace.RegexQNamePattern;
import org.alfresco.util.DNSNameMangler;
import org.alfresco.util.ParameterCheck;
import org.alfresco.wcm.sandbox.SandboxConstants;
import org.alfresco.wcm.sandbox.SandboxFactory;
import org.alfresco.wcm.sandbox.SandboxInfo;
import org.alfresco.wcm.util.WCMUtil;
@@ -269,7 +268,7 @@ public class WebProjectServiceImpl extends WCMUtil implements WebProjectService
*/
public void createWebApp(String wpStoreId, String webAppName, String webAppDescription)
{
createWebApp(findWebProjectNodeFromStore(wpStoreId), webAppName, webAppDescription);
createWebApp(getWebProjectNodeFromStore(wpStoreId), webAppName, webAppDescription);
}
/* (non-Javadoc)
@@ -326,7 +325,7 @@ public class WebProjectServiceImpl extends WCMUtil implements WebProjectService
*/
public List<String> listWebApps(String wpStoreId)
{
return listWebApps(findWebProjectNodeFromStore(wpStoreId));
return listWebApps(getWebProjectNodeFromStore(wpStoreId));
}
/* (non-Javadoc)
@@ -349,7 +348,7 @@ public class WebProjectServiceImpl extends WCMUtil implements WebProjectService
*/
public void deleteWebApp(String wpStoreId, String webAppName)
{
deleteWebApp(findWebProjectNodeFromStore(wpStoreId), webAppName);
deleteWebApp(getWebProjectNodeFromStore(wpStoreId), webAppName);
}
/* (non-Javadoc)
@@ -477,7 +476,7 @@ public class WebProjectServiceImpl extends WCMUtil implements WebProjectService
*/
public boolean isWebProject(String wpStoreId)
{
NodeRef wpNodeRef = findWebProjectNodeFromStore(wpStoreId);
NodeRef wpNodeRef = getWebProjectNodeFromStore(wpStoreId);
if (wpNodeRef == null)
{
return false;
@@ -513,7 +512,7 @@ public class WebProjectServiceImpl extends WCMUtil implements WebProjectService
WebProjectInfo result = null;
// Get the web project node
NodeRef wpNodeRef = findWebProjectNodeFromStore(wpStoreId);
NodeRef wpNodeRef = getWebProjectNodeFromStore(wpStoreId);
if (wpNodeRef != null)
{
// Create the web project info
@@ -554,7 +553,7 @@ public class WebProjectServiceImpl extends WCMUtil implements WebProjectService
*/
public void updateWebProject(WebProjectInfo wpInfo)
{
NodeRef wpNodeRef = findWebProjectNodeFromStore(wpInfo.getStoreId());
NodeRef wpNodeRef = getWebProjectNodeFromStore(wpInfo.getStoreId());
if (wpNodeRef == null)
{
throw new AlfrescoRuntimeException("Cannot update web project '" + wpInfo.getStoreId() + "' because it does not exist.");
@@ -584,7 +583,7 @@ public class WebProjectServiceImpl extends WCMUtil implements WebProjectService
*/
public void deleteWebProject(String wpStoreId)
{
NodeRef wpNodeRef = findWebProjectNodeFromStore(wpStoreId);
NodeRef wpNodeRef = getWebProjectNodeFromStore(wpStoreId);
if (wpNodeRef != null)
{
deleteWebProject(wpNodeRef);
@@ -676,20 +675,9 @@ public class WebProjectServiceImpl extends WCMUtil implements WebProjectService
/* (non-Javadoc)
* @see org.alfresco.wcm.WebProjectService#isContentManager(java.lang.String, java.lang.String)
*/
public boolean isContentManager(String storeName, String userName)
public boolean isContentManager(String wpStoreId, String userName)
{
String wpStoreId = WCMUtil.getWebProjectStoreId(storeName);
PropertyValue pValue = avmService.getStoreProperty(wpStoreId, SandboxConstants.PROP_WEB_PROJECT_NODE_REF);
if (pValue != null)
{
NodeRef wpNodeRef = (NodeRef) pValue.getValue(DataTypeDefinition.NODE_REF);
return isContentManager(wpNodeRef, userName);
}
else
{
return false;
}
return isContentManager(getWebProjectNodeFromStore(wpStoreId), userName);
}
/* (non-Javadoc)
@@ -712,20 +700,11 @@ public class WebProjectServiceImpl extends WCMUtil implements WebProjectService
/* (non-Javadoc)
* @see org.alfresco.wcm.webproject.WebProjectService#isWebUser(java.lang.String, java.lang.String)
*/
public boolean isWebUser(String storeName, String username)
public boolean isWebUser(String wpStoreId, String username)
{
String wpStoreId = WCMUtil.getWebProjectStoreId(storeName);
PropertyValue pValue = avmService.getStoreProperty(wpStoreId, SandboxConstants.PROP_WEB_PROJECT_NODE_REF);
ParameterCheck.mandatoryString("username", username);
if (pValue != null)
{
NodeRef wpNodeRef = (NodeRef) pValue.getValue(DataTypeDefinition.NODE_REF);
return isWebUser(wpNodeRef, username);
}
else
{
return false;
}
return isWebUser(getWebProjectNodeFromStore(wpStoreId), username);
}
/* (non-Javadoc)
@@ -733,8 +712,9 @@ public class WebProjectServiceImpl extends WCMUtil implements WebProjectService
*/
public boolean isWebUser(NodeRef wpNodeRef, String userName)
{
String userRole = getWebUserRoleImpl(wpNodeRef, userName);
return (userRole != null);
ParameterCheck.mandatoryString("userName", userName);
return (getWebUserRoleImpl(wpNodeRef, userName) != null);
}
/* (non-Javadoc)
@@ -750,7 +730,7 @@ public class WebProjectServiceImpl extends WCMUtil implements WebProjectService
*/
public Map<String, String> listWebUsers(String wpStoreId)
{
return listWebUsers(findWebProjectNodeFromStore(wpStoreId));
return listWebUsers(getWebProjectNodeFromStore(wpStoreId));
}
/* (non-Javadoc)
@@ -774,7 +754,7 @@ public class WebProjectServiceImpl extends WCMUtil implements WebProjectService
*/
public String getWebUserRole(String wpStoreId, String userName)
{
return getWebUserRole(findWebProjectNodeFromStore(wpStoreId), userName);
return getWebUserRole(getWebProjectNodeFromStore(wpStoreId), userName);
}
/* (non-Javadoc)
@@ -782,6 +762,8 @@ public class WebProjectServiceImpl extends WCMUtil implements WebProjectService
*/
public String getWebUserRole(NodeRef wpNodeRef, String userName)
{
ParameterCheck.mandatoryString("userName", userName);
String userRole = null;
if (! isWebProject(wpNodeRef))
@@ -860,72 +842,19 @@ public class WebProjectServiceImpl extends WCMUtil implements WebProjectService
/* (non-Javadoc)
* @see org.alfresco.wcm.webproject.WebProjectService#findWebProjectNodeFromPath(java.lang.String)
*/
public NodeRef findWebProjectNodeFromPath(String absoluteAVMPath)
public NodeRef getWebProjectNodeFromPath(String absoluteAVMPath)
{
return findWebProjectNodeFromStore(WCMUtil.getWebProjectStoreIdFromPath(absoluteAVMPath));
return getWebProjectNodeFromStore(WCMUtil.getWebProjectStoreIdFromPath(absoluteAVMPath));
}
/*(non-Javadoc)
* @see org.alfresco.wcm.webproject.WebProjectService#findWebProjectNodeFromStore(java.lang.String)
* @see org.alfresco.wcm.webproject.WebProjectService#getWebProjectNodeFromStore(java.lang.String)
*/
public NodeRef findWebProjectNodeFromStore(String wpStoreId)
public NodeRef getWebProjectNodeFromStore(String wpStoreId)
{
ParameterCheck.mandatoryString("wpStoreId", wpStoreId);
if (wpStoreId.indexOf(WCMUtil.STORE_SEPARATOR) != -1)
{
throw new IllegalArgumentException("Unexpected web project store id '"+wpStoreId+"' - should not contain '"+WCMUtil.STORE_SEPARATOR+"'");
}
if (wpStoreId.indexOf(":") != -1)
{
throw new IllegalArgumentException("Unexpected web project store id '"+wpStoreId+"' - should not contain ':'");
}
// construct the query
String path = getWebProjectsPath() + "/*";
String query = "PATH:\"/" + path + "\" AND @wca\\:avmstore:\"" + wpStoreId + "\"";
NodeRef webProjectNode = null;
ResultSet results = null;
try
{
// execute the query
results = searchService.query(WEBPROJECT_STORE, SearchService.LANGUAGE_LUCENE, query);
// WCM-810:
// the 'avmstore' property was not defined as an identifier in the model (before 2.2)
// which means it may get tokenised which in turn means that 'test' and 'test-site'
// would get returned by the query above even though it's an exact match query,
// we therefore need to go through the results and check names if there is more
// than one result although this shouldn't happen anymore as the
// AVMStorePropertyTokenisationPatch will have reindexed the wca:avmstore property
if (results.length() == 1)
{
webProjectNode = results.getNodeRef(0);
}
else if (results.length() > 1)
{
for (NodeRef node : results.getNodeRefs())
{
String nodeStoreName = (String)nodeService.getProperty(node, WCMAppModel.PROP_AVMSTORE);
if (nodeStoreName.equals(wpStoreId))
{
webProjectNode = node;
break;
}
}
}
}
finally
{
if (results != null)
{
results.close();
}
}
return webProjectNode;
return WCMUtil.getWebProjectNodeFromWebProjectStore(avmService, wpStoreId);
}
/* (non-Javadoc)
@@ -933,7 +862,7 @@ public class WebProjectServiceImpl extends WCMUtil implements WebProjectService
*/
public void inviteWebUsersGroups(String wpStoreId, Map<String, String> userGroupRoles)
{
inviteWebUsersGroups(findWebProjectNodeFromStore(wpStoreId), userGroupRoles, false);
inviteWebUsersGroups(getWebProjectNodeFromStore(wpStoreId), userGroupRoles, false);
}
/* (non-Javadoc)
@@ -941,7 +870,7 @@ public class WebProjectServiceImpl extends WCMUtil implements WebProjectService
*/
public void inviteWebUsersGroups(String wpStoreId, Map<String, String> userGroupRoles, boolean autoCreateAuthorSandbox)
{
inviteWebUsersGroups(findWebProjectNodeFromStore(wpStoreId), userGroupRoles, autoCreateAuthorSandbox);
inviteWebUsersGroups(getWebProjectNodeFromStore(wpStoreId), userGroupRoles, autoCreateAuthorSandbox);
}
public void inviteWebUsersGroups(NodeRef wpNodeRef, Map<String, String> userGroupRoles, boolean autoCreateAuthorSandbox)
@@ -1069,7 +998,7 @@ public class WebProjectServiceImpl extends WCMUtil implements WebProjectService
*/
public void inviteWebUser(String wpStoreId, String userAuth, String role)
{
inviteWebUser(findWebProjectNodeFromStore(wpStoreId), userAuth, role, false);
inviteWebUser(getWebProjectNodeFromStore(wpStoreId), userAuth, role, false);
}
/* (non-Javadoc)
@@ -1077,7 +1006,7 @@ public class WebProjectServiceImpl extends WCMUtil implements WebProjectService
*/
public void inviteWebUser(String wpStoreId, String userAuth, String role, boolean autoCreateAuthorSandbox)
{
inviteWebUser(findWebProjectNodeFromStore(wpStoreId), userAuth, role, autoCreateAuthorSandbox);
inviteWebUser(getWebProjectNodeFromStore(wpStoreId), userAuth, role, autoCreateAuthorSandbox);
}
/* (non-Javadoc)
@@ -1183,7 +1112,7 @@ public class WebProjectServiceImpl extends WCMUtil implements WebProjectService
*/
public void uninviteWebUser(String wpStoreId, String userAuth)
{
uninviteWebUser(findWebProjectNodeFromStore(wpStoreId), userAuth, false);
uninviteWebUser(getWebProjectNodeFromStore(wpStoreId), userAuth, false);
}
/* (non-Javadoc)
@@ -1191,7 +1120,7 @@ public class WebProjectServiceImpl extends WCMUtil implements WebProjectService
*/
public void uninviteWebUser(String wpStoreId, String userAuth, boolean autoDeleteAuthorSandbox)
{
uninviteWebUser(findWebProjectNodeFromStore(wpStoreId), userAuth, autoDeleteAuthorSandbox);
uninviteWebUser(getWebProjectNodeFromStore(wpStoreId), userAuth, autoDeleteAuthorSandbox);
}
/* (non-Javadoc)

View File

@@ -30,6 +30,7 @@ import org.alfresco.repo.jscript.BaseScopableProcessorExtension;
import org.alfresco.repo.model.Repository;
import org.alfresco.service.ServiceRegistry;
import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.namespace.NamespaceService;
import org.alfresco.wcm.asset.AssetService;
import org.alfresco.wcm.sandbox.SandboxService;
import org.alfresco.wcm.webproject.WebProjectInfo;
@@ -55,6 +56,9 @@ public class WebProjects extends BaseScopableProcessorExtension
/** The asset service */
private AssetService assetService;
/** The namespace service */
private NamespaceService namespaceService;
/**
* Sets the Service Registry
*
@@ -110,6 +114,21 @@ public class WebProjects extends BaseScopableProcessorExtension
return this.assetService;
}
/**
* Set the alfresco namespace service
*
* @param namespace service
*/
public void setNamespaceService(NamespaceService namespaceService)
{
this.namespaceService = namespaceService;
}
public NamespaceService getNamespaceService()
{
return this.namespaceService;
}
/**
* create web project
* @param name