Merged V3.2 to HEAD

16030: Merged V3.1 to V3.2
        16001: Merged V2.2 to V3.1
            15999: Temp build/test (AVM permissions - testSimpleInternalLayer)
    16223: WCM UI - simple perf improvement when displaying modified list (lock icon)
    16472: Merged V3.1 to V3.2
        16180: ETHREEOH-2821 - fix deployment of WCM layered (ie. across web project) file
        16188: WCM - minor: display (localisable) "File" text (follow-on fix for r15970)
        16255: WCM - ETHREEOH-2836
        16257: AVM - minor updates to unit tests
        16275: WCM - ETHREEOH-2844
        16277: WCM - ETHREEOH-2829 - added simple unit test
        16341: AVM - minor update to reuse core (path) utils
        16344: Merged V2.2 to V3.1
            16323: Fix ETWOTWO-1266 (unexpected AVM conflict)
        16457: Fix ETHREEOH-2836 (WCM layered files) - follow-on fix, with additional unit test
    16649: Fix ETHREEOH-1878 - configure WCM locking for CIFS/FTP
    16654: Merged V3.1 to V3.2
        16507: Fix ETHREEOH-2604 - update unsecured-public-services-security-context.xml.sample (to allow server to start)
        16527: Fix ETHREEOH-2868 - can't submit removal of WCM layered file (Older version prevents update)
        16607: AVM - additional tests when deleting LD + fix to avoid cycle
        16612: AVM - console improvement (lsver, rmvers) to enable admin/support to list & purge snapshots between dates
        16638: Fix ETHREEOH-2893 - stale WCM/AVM layered dir
        16643: AVM - console improvement (setopacity) -> eg. to set stale/modifed WCM layered folder as opaque


git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@16895 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
Jan Vonka
2009-10-14 09:20:15 +00:00
parent f03cabea25
commit d9d774eac0
6 changed files with 133 additions and 56 deletions

View File

@@ -1329,7 +1329,7 @@ public class AVMBrowseBean implements IContextListener
String type = "";
if (avmRef.getType() == AVMNodeType.LAYERED_DIRECTORY && avmRef.isPrimary())
{
if (getAvmService().lookup(avmRef.getIndirectionVersion(), avmRef.getIndirection()) != null)
if ((getAvmService().lookup(avmRef.getIndirectionVersion(), avmRef.getIndirection()) != null) || (avmRef.getOpacity()))
{
type = Application.getMessage(FacesContext.getCurrentInstance(), "shared_folder");
}
@@ -1348,7 +1348,7 @@ public class AVMBrowseBean implements IContextListener
}
else
{
String type = "file";
String type = "";
if (avmRef.isLayeredFile())
{
if (getAvmService().lookup(avmRef.getIndirectionVersion(), avmRef.getIndirection()) != null)
@@ -1360,11 +1360,16 @@ public class AVMBrowseBean implements IContextListener
type = Application.getMessage(FacesContext.getCurrentInstance(), "stale_shared_file");
}
}
else
{
type = Application.getMessage(FacesContext.getCurrentInstance(), "file");
}
node.getProperties().put("fileType", type);
node.getProperties().put("fileType16", FileTypeImageUtils.getFileTypeImage(avmRef.getName(), true));
node.getProperties().put("url", DownloadContentServlet.generateBrowserURL(
AVMNodeConverter.ToNodeRef(-1, avmRef.getPath()), avmRef.getName()));
this.files.add(node);
}
@@ -1430,7 +1435,10 @@ public class AVMBrowseBean implements IContextListener
String path = params.get("id");
AVMNodeDescriptor avmNode = getAvmService().lookup(-1, path);
if (avmNode.isLayeredDirectory() && avmNode.isPrimary() && (getAvmService().lookup(avmNode.getIndirectionVersion(), avmNode.getIndirection()) == null))
if (avmNode.isLayeredDirectory() && avmNode.isPrimary() &&
(getAvmService().lookup(avmNode.getIndirectionVersion(), avmNode.getIndirection()) == null) &&
(! avmNode.getOpacity()) &&
getAvmService().getDirectoryListingDirect(avmNode, false).isEmpty())
{
String pattern = Application.getMessage(FacesContext.getCurrentInstance(), MSG_TARGET_IS_DELETED);
String folderName = path.substring(path.lastIndexOf("/") + 1);

View File

@@ -1,5 +1,5 @@
/*
* Copyright (C) 2005-2007 Alfresco Software Limited.
* Copyright (C) 2005-2009 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
@@ -38,7 +38,6 @@ import javax.faces.context.FacesContext;
import org.alfresco.error.AlfrescoRuntimeException;
import org.alfresco.model.ContentModel;
import org.alfresco.model.WCMAppModel;
import org.alfresco.repo.avm.AVMNodeConverter;
import org.alfresco.service.ServiceRegistry;
import org.alfresco.service.cmr.repository.AssociationRef;
import org.alfresco.service.cmr.repository.ChildAssociationRef;
@@ -213,7 +212,7 @@ public class FormImpl implements Form
result = AVMUtil.buildPath(parentAVMPath,
result,
AVMUtil.PathRelation.SANDBOX_RELATIVE);
result = AVMNodeConverter.NormalizePath(result);
result = AVMUtil.normalizePath(result);
LOGGER.debug("processed pattern " + outputPathPattern + " as " + result);
return result;
}

View File

@@ -1,5 +1,5 @@
/*
* Copyright (C) 2005-2007 Alfresco Software Limited.
* Copyright (C) 2005-2009 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
@@ -25,21 +25,20 @@
package org.alfresco.web.ui.wcm.component;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.faces.context.FacesContext;
import org.alfresco.repo.avm.AVMNodeConverter;
import org.alfresco.service.cmr.avm.AVMService;
import org.alfresco.service.cmr.avm.AVMNotFoundException;
import org.alfresco.service.cmr.avm.locking.AVMLock;
import org.alfresco.service.cmr.avm.locking.AVMLockingService;
import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.wcm.asset.AssetInfo;
import org.alfresco.wcm.util.WCMUtil;
import org.alfresco.web.app.Application;
import org.alfresco.web.app.servlet.FacesHelper;
import org.alfresco.web.bean.repository.Repository;
import org.alfresco.web.bean.wcm.AVMBrowseBean;
import org.alfresco.web.bean.wcm.AVMUtil;
import org.alfresco.web.bean.wcm.WebProject;
import org.alfresco.web.ui.repo.component.UILockIcon;
/**
@@ -70,15 +69,39 @@ public class UIAVMLockIcon extends UILockIcon
return;
}
// get the value and see if the image is locked
final AVMService avmService = Repository.getServiceRegistry(context).getAVMService();
final AVMLockingService avmLockingService = Repository.getServiceRegistry(context).getAVMLockingService();
final AVMBrowseBean avmBrowseBean = (AVMBrowseBean)FacesHelper.getManagedBean(context, AVMBrowseBean.BEAN_NAME);
boolean locked = false;
boolean lockedOwner = false;
Object val = getValue();
List<String> lockUsers = null;
if (val != null)
{
if (val instanceof AssetInfo)
{
// via UIUserSandboxes.renderUserFiles()
AssetInfo asset = (AssetInfo)val;
locked = asset.isLocked();
String assetLockOwner = asset.getLockOwner();
if (assetLockOwner != null)
{
lockUsers = new ArrayList<String>(1);
lockUsers.add(assetLockOwner);
lockedOwner = assetLockOwner.equals(Application.getCurrentUser(context).getUserName());
}
}
else
{
// TODO eventually refactor out
// via browse-sandbox.jsp -> AVMBrowseBean (getFolders/getFiles - directory listing or search)
// get the value and see if the image is locked
final AVMLockingService avmLockingService = Repository.getServiceRegistry(context).getAVMLockingService();
// NodeRef or String
final String avmPath = (val instanceof NodeRef
? AVMNodeConverter.ToAVMVersionPath((NodeRef)val).getSecond()
: (val instanceof String
@@ -86,18 +109,16 @@ public class UIAVMLockIcon extends UILockIcon
: null));
if (avmPath != null)
{
if (avmService.lookup(-1, avmPath) != null)
String[] pathParts = WCMUtil.splitPath(avmPath);
AVMLock lock = null;
try
{
// optimization to reuse the current WebProject object if it represents the
// same webproject that the lock item path is contained within - this ensures
// we do not perform slow store property lookups for every UIAVMLockIcon instance
String stagingStore = AVMUtil.buildStagingStoreName(AVMUtil.getStoreId(AVMUtil.getStoreName(avmPath)));
WebProject webProject = avmBrowseBean.getWebProject();
if (webProject == null || !webProject.getStagingStore().equals(stagingStore))
{
webProject = new WebProject(avmPath);
lock = avmLockingService.getLock(WCMUtil.getWebProjectStoreId(pathParts[0]), pathParts[1]);
}
catch (AVMNotFoundException nfe)
{
// ignore
}
AVMLock lock = avmLockingService.getLock(webProject.getStoreId(), avmPath.substring(avmPath.indexOf("/")));
if (lock != null)
{
locked = true;
@@ -106,9 +127,11 @@ public class UIAVMLockIcon extends UILockIcon
}
}
}
this.encodeBegin(context,
locked,
lockedOwner,
lockUsers == null ? new String[0] : (String[])lockUsers.toArray(new String[lockUsers.size()]));
}
}
}

View File

@@ -734,10 +734,19 @@ public class UIUserSandboxes extends SelfRenderingComponent implements Serializa
String stagingStore = AVMUtil.buildStagingStoreName(storeRoot);
String stagingStorePath = AVMUtil.buildStoreWebappPath(stagingStore, getWebapp());
long start = System.currentTimeMillis();
List<AssetInfo> assets = sandboxService.listChangedWebApp(userStore, getWebapp(), true);
if (logger.isDebugEnabled())
{
logger.debug("List "+assets.size()+" changes webapp in "+(System.currentTimeMillis()-start)+" msecs");
}
if (assets.size() != 0)
{
start = System.currentTimeMillis();
// output confict header, only if conflicts exist
int diffCount = 0;
for (AssetInfo asset : assets)
@@ -891,7 +900,7 @@ public class UIUserSandboxes extends SelfRenderingComponent implements Serializa
out.write("</td><td width=20>");
UIAVMLockIcon lockIcon = (UIAVMLockIcon)fc.getApplication().createComponent(UIAVMLockIcon.ALFRESCO_FACES_AVMLOCKICON);
lockIcon.setId("avmlock_" + Integer.toString(rowIndex));
lockIcon.setValue(sourcePath);
lockIcon.setValue(node);
Utils.encodeRecursive(fc, lockIcon);
out.write("</td><td width=16>");
out.write(linkPrefix);
@@ -993,6 +1002,11 @@ public class UIUserSandboxes extends SelfRenderingComponent implements Serializa
// end table
out.write("</table>");
if (logger.isDebugEnabled())
{
logger.debug("Wrote table in "+(System.currentTimeMillis()-start)+" msecs");
}
}
else
{

View File

@@ -1,5 +1,5 @@
/*
* Copyright (C) 2005-2007 Alfresco Software Limited.
* Copyright (C) 2005-2009 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
@@ -67,7 +67,8 @@ public class AVMListRenderer extends RichListRenderer
if ((avmRef.isLayeredDirectory() && avmRef.isPrimary()) || avmRef.isLayeredFile())
{
AVMService avmService = Repository.getServiceRegistry(context).getAVMService();
if (avmService.lookup(avmRef.getIndirectionVersion(), avmRef.getIndirection()) == null)
if ((avmService.lookup(avmRef.getIndirectionVersion(), avmRef.getIndirection()) == null) &&
(! avmRef.getOpacity()))
{
rowStyle = STALE_CSS;
}

View File

@@ -15,6 +15,8 @@ To quit / exit, close this window or tab (and logout from Alfresco Explorer or c
Individual Commands:
------
ls - Lists the contents of the given directory.
ls, avmpath, #versionnumber#
@@ -49,8 +51,12 @@ lsrep
lsver - Lists the versions in a given store.
lsver, storename
lsver, storename, fromDate
lsver, storename, fromDate, toDate
storename is the name of the store (alphanumeric).
storename - name of the store (alphanumeric).
fromDate, toDate in ISO 8601 format (eg. 'YYYY-MM-DDThh:mm:ss.sss<TZD>' where <TZD> = 'Z' or '+hh:mm' or '-hh:mm')
------
@@ -58,7 +64,7 @@ mkrep - Create a new store.
mkrep, storename
storename as above.
storename - as above.
------
@@ -66,6 +72,8 @@ setstoreproperty - Set the value of store property.
setstoreproperty, storename, qname, value
storename - as above.
value - the new property value - the type will be auto-detected. At present only TEXT
and INT types are suppored as well as collections of these types. Collections
can be specified using a comma seperated list enclosed in square brackets.
@@ -78,6 +86,8 @@ setstorepermission - Set a permission mask on a store.
setstorepermission, storename, authority, permission
storename - as above.
authority - the user or group identifier.
permission - the permission name to set.
@@ -88,6 +98,8 @@ clearstorepermission - Clears a permission mask on a store for a given authority
clearstorepermission, storename, authority
storename - as above.
authority - the user or group identifier.
------
@@ -133,6 +145,16 @@ name is a valid path component name.
------
setopacity - Set layered directory to be opaque (or not) to its indirection
setopacity, avmpath, bool
avmpath is avmpath to the layered directory
bool is "true" (opaque) or "false" (not opaque)
------
rename - Renames a node from one place to another.
rename, srcdiravmpath, srcname, dstdiravmpath, dstname
@@ -191,22 +213,32 @@ to remove.
rmrep - Purges a store, i.e. makes it truly go away.
rmrep, name
rmrep, storename
name is the name of the store to purge.
storename - as above.
------
rmver - Purges a particular version of a store.
rmver, name, #versionnumber#
rmver, storename, #versionnumber#
name is the name of the store.
storename - as above.
#versionnmber# is the version to purge.
------
rmvers - Purges versions of a store between two dates (inclusive).
rmvers, storename, fromDate, toDate
storename - as above.
fromDate, toDate in ISO 8601 format (eg. 'YYYY-MM-DDThh:mm:ss.sss<TZD>' where <TZD> = 'Z' or '+hh:mm' or '-hh:mm')
------
write - Writes content to an existing file.
write, avmpath