Merged V3.0 to HEAD

11982: Fix for ETHREEOH-906 - Writing the TICKET value directly to the page during template processing is a potential XSS security hole.
   11983: Added back .html suffix to plain HTML form upload api call - added code comment to explain why it's there.
   11984: Added debug/info level logging to Invite process.
   11985: ETHREEOH-184: thumbnail assocs do not double up on check-in and thumbnail updates are done in one action
   11986: Fix for ETHREEOH-905 - missing url encoding step for user password during webscript based login process.
   11995: Unit test fixed up, fallout from runAs merge.
   11998: Part of a fix for ETHREEOH-546 - Cannot save document to the any space for Microsoft Office
   11999: Merged V2.2 to V3.0
      11996: Fix for open Lucene ResultSet memory leaks
   12000: ETHREEOH-692 - It is impossible to login to Alfresco from Microsoft Office add-in using NTLM authentication. ETHREEOH-546 - Cannot save document to the any space for Microsoft Office.
   12001: Paging enabled by default in all Document Libraries

git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@12494 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
Kevin Roast
2008-12-18 15:08:14 +00:00
parent c07be19e36
commit d20db6284c
3 changed files with 98 additions and 21 deletions

View File

@@ -29,21 +29,27 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import org.alfresco.model.ContentModel; import org.alfresco.model.ContentModel;
import org.alfresco.repo.copy.CopyServicePolicies;
import org.alfresco.repo.node.NodeServicePolicies; import org.alfresco.repo.node.NodeServicePolicies;
import org.alfresco.repo.policy.Behaviour; import org.alfresco.repo.policy.Behaviour;
import org.alfresco.repo.policy.JavaBehaviour; import org.alfresco.repo.policy.JavaBehaviour;
import org.alfresco.repo.policy.PolicyComponent; import org.alfresco.repo.policy.PolicyComponent;
import org.alfresco.repo.policy.PolicyScope;
import org.alfresco.service.cmr.action.Action; import org.alfresco.service.cmr.action.Action;
import org.alfresco.service.cmr.action.ActionService; import org.alfresco.service.cmr.action.ActionService;
import org.alfresco.service.cmr.action.CompositeAction;
import org.alfresco.service.cmr.dictionary.DataTypeDefinition; import org.alfresco.service.cmr.dictionary.DataTypeDefinition;
import org.alfresco.service.cmr.dictionary.DictionaryService; import org.alfresco.service.cmr.dictionary.DictionaryService;
import org.alfresco.service.cmr.dictionary.PropertyDefinition; import org.alfresco.service.cmr.dictionary.PropertyDefinition;
import org.alfresco.service.cmr.repository.ChildAssociationRef;
import org.alfresco.service.cmr.repository.ContentData; import org.alfresco.service.cmr.repository.ContentData;
import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.cmr.repository.NodeService; import org.alfresco.service.cmr.repository.NodeService;
import org.alfresco.service.cmr.repository.StoreRef;
import org.alfresco.service.cmr.thumbnail.ThumbnailService; import org.alfresco.service.cmr.thumbnail.ThumbnailService;
import org.alfresco.service.namespace.NamespaceService; import org.alfresco.service.namespace.NamespaceService;
import org.alfresco.service.namespace.QName; import org.alfresco.service.namespace.QName;
import org.alfresco.service.namespace.RegexQNamePattern;
import org.alfresco.util.EqualsHelper; import org.alfresco.util.EqualsHelper;
/** /**
@@ -51,7 +57,8 @@ import org.alfresco.util.EqualsHelper;
* *
* @author Roy Wetherall * @author Roy Wetherall
*/ */
public class ThumbnailedAspect implements NodeServicePolicies.OnUpdatePropertiesPolicy public class ThumbnailedAspect implements NodeServicePolicies.OnUpdatePropertiesPolicy,
CopyServicePolicies.OnCopyNodePolicy
{ {
/** Services */ /** Services */
private PolicyComponent policyComponent; private PolicyComponent policyComponent;
@@ -119,6 +126,10 @@ public class ThumbnailedAspect implements NodeServicePolicies.OnUpdateProperties
QName.createQName(NamespaceService.ALFRESCO_URI, "onUpdateProperties"), QName.createQName(NamespaceService.ALFRESCO_URI, "onUpdateProperties"),
ContentModel.ASPECT_THUMBNAILED, ContentModel.ASPECT_THUMBNAILED,
new JavaBehaviour(this, "onUpdateProperties", Behaviour.NotificationFrequency.TRANSACTION_COMMIT)); new JavaBehaviour(this, "onUpdateProperties", Behaviour.NotificationFrequency.TRANSACTION_COMMIT));
this.policyComponent.bindClassBehaviour(
QName.createQName(NamespaceService.ALFRESCO_URI, "onCopyNode"),
ContentModel.ASPECT_THUMBNAILED,
new JavaBehaviour(this, "onCopyNode"));
} }
/** /**
@@ -201,15 +212,48 @@ public class ThumbnailedAspect implements NodeServicePolicies.OnUpdateProperties
Boolean automaticUpdate = (Boolean)this.nodeService.getProperty(nodeRef, ContentModel.PROP_AUTOMATIC_UPDATE); Boolean automaticUpdate = (Boolean)this.nodeService.getProperty(nodeRef, ContentModel.PROP_AUTOMATIC_UPDATE);
if (automaticUpdate != null && automaticUpdate.booleanValue() == true) if (automaticUpdate != null && automaticUpdate.booleanValue() == true)
{ {
CompositeAction compositeAction = actionService.createCompositeAction();
List<NodeRef> thumbnails = this.thumbnailService.getThumbnails(nodeRef, contentProperty, null, null); List<NodeRef> thumbnails = this.thumbnailService.getThumbnails(nodeRef, contentProperty, null, null);
for (NodeRef thumbnail : thumbnails) for (NodeRef thumbnail : thumbnails)
{ {
// Execute the update thumbnail action async for each thumbnail // Execute the update thumbnail action async for each thumbnail
Action action = actionService.createAction(UpdateThumbnailActionExecuter.NAME); Action action = actionService.createAction(UpdateThumbnailActionExecuter.NAME);
action.setParameterValue(CreateThumbnailActionExecuter.PARAM_CONTENT_PROPERTY, contentProperty); action.setParameterValue(UpdateThumbnailActionExecuter.PARAM_CONTENT_PROPERTY, contentProperty);
actionService.executeAction(action, thumbnail, false, true); action.setParameterValue(UpdateThumbnailActionExecuter.PARAM_THUMBNAIL_NODE, thumbnail);
compositeAction.addAction(action);
} }
actionService.executeAction(compositeAction, nodeRef, false, true);
} }
} }
/**
* @see org.alfresco.repo.copy.CopyServicePolicies.OnCopyNodePolicy#onCopyNode(org.alfresco.service.namespace.QName, org.alfresco.service.cmr.repository.NodeRef, org.alfresco.service.cmr.repository.StoreRef, boolean, org.alfresco.repo.policy.PolicyScope)
*/
public void onCopyNode( QName classRef,
NodeRef sourceNodeRef,
StoreRef destinationStoreRef,
boolean copyToNewNode,
PolicyScope copyDetails)
{
// Add the automatic update property
copyDetails.addProperty(
ContentModel.ASPECT_THUMBNAILED,
ContentModel.PROP_AUTOMATIC_UPDATE,
this.nodeService.getProperty(sourceNodeRef, ContentModel.PROP_AUTOMATIC_UPDATE));
if (copyToNewNode == true)
{
List<ChildAssociationRef> assocs = this.nodeService.getChildAssocs(
sourceNodeRef,
ContentModel.ASSOC_THUMBNAILS,
RegexQNamePattern.MATCH_ALL);
for (ChildAssociationRef assoc : assocs)
{
copyDetails.addChildAssociation(classRef, assoc);
}
}
// otherwise we don't care about copying the associations over or we will get duplicates
}
} }

View File

@@ -56,6 +56,7 @@ public class UpdateThumbnailActionExecuter extends ActionExecuterAbstractBase
/** Action name and parameters */ /** Action name and parameters */
public static final String NAME = "update-thumbnail"; public static final String NAME = "update-thumbnail";
public static final String PARAM_CONTENT_PROPERTY = "content-property"; public static final String PARAM_CONTENT_PROPERTY = "content-property";
public static final String PARAM_THUMBNAIL_NODE = "thumbnail-node";
/** /**
* Set the thumbnail service * Set the thumbnail service
@@ -83,10 +84,18 @@ public class UpdateThumbnailActionExecuter extends ActionExecuterAbstractBase
@Override @Override
protected void executeImpl(Action action, NodeRef actionedUponNodeRef) protected void executeImpl(Action action, NodeRef actionedUponNodeRef)
{ {
if (this.nodeService.exists(actionedUponNodeRef) == true) // Get the thumbnail
NodeRef thumbnailNodeRef = (NodeRef)action.getParameterValue(PARAM_THUMBNAIL_NODE);
if (thumbnailNodeRef == null)
{ {
thumbnailNodeRef = actionedUponNodeRef;
}
if (this.nodeService.exists(thumbnailNodeRef) == true &&
ContentModel.TYPE_THUMBNAIL.equals(this.nodeService.getType(thumbnailNodeRef)) == true)
{
// Get the thumbnail Name // Get the thumbnail Name
String thumbnailName = (String)this.nodeService.getProperty(actionedUponNodeRef, ContentModel.PROP_THUMBNAIL_NAME); String thumbnailName = (String)this.nodeService.getProperty(thumbnailNodeRef, ContentModel.PROP_THUMBNAIL_NAME);
// Get the details of the thumbnail // Get the details of the thumbnail
ThumbnailRegistry registry = this.thumbnailService.getThumbnailRegistry(); ThumbnailRegistry registry = this.thumbnailService.getThumbnailRegistry();
@@ -105,7 +114,7 @@ public class UpdateThumbnailActionExecuter extends ActionExecuterAbstractBase
} }
// Create the thumbnail // Create the thumbnail
this.thumbnailService.updateThumbnail(actionedUponNodeRef, details.getTransformationOptions()); this.thumbnailService.updateThumbnail(thumbnailNodeRef, details.getTransformationOptions());
} }
} }
@@ -115,7 +124,8 @@ public class UpdateThumbnailActionExecuter extends ActionExecuterAbstractBase
@Override @Override
protected void addParameterDefinitions(List<ParameterDefinition> paramList) protected void addParameterDefinitions(List<ParameterDefinition> paramList)
{ {
paramList.add(new ParameterDefinitionImpl(PARAM_CONTENT_PROPERTY, DataTypeDefinition.QNAME, false, getParamDisplayLabel(PARAM_CONTENT_PROPERTY))); paramList.add(new ParameterDefinitionImpl(PARAM_CONTENT_PROPERTY, DataTypeDefinition.QNAME, false, getParamDisplayLabel(PARAM_CONTENT_PROPERTY)));
paramList.add(new ParameterDefinitionImpl(PARAM_THUMBNAIL_NODE, DataTypeDefinition.QNAME, false, getParamDisplayLabel(PARAM_THUMBNAIL_NODE)));
} }
} }

View File

@@ -406,18 +406,29 @@ public class WebProjectServiceImpl extends WCMUtil implements WebProjectService
if (this.webProjectsRootNodeRef == null) if (this.webProjectsRootNodeRef == null)
{ {
// Get the root 'web projects' folder // Get the root 'web projects' folder
ResultSet resultSet = this.searchService.query(WEBPROJECT_STORE, SearchService.LANGUAGE_LUCENE, "PATH:\""+WCMUtil.getWebProjectsPath()+"\""); ResultSet resultSet = null;
if (resultSet.length() == 0) try
{ {
// No root web projects folder exists resultSet = this.searchService.query(WEBPROJECT_STORE, SearchService.LANGUAGE_LUCENE, "PATH:\""+WCMUtil.getWebProjectsPath()+"\"");
throw new AlfrescoRuntimeException("No root 'Web Projects' folder exists (is WCM enabled ?)"); if (resultSet.length() == 0)
{
// No root web projects folder exists
throw new AlfrescoRuntimeException("No root 'Web Projects' folder exists (is WCM enabled ?)");
}
else if (resultSet.length() != 1)
{
// More than one root web projects folder exits
throw new AlfrescoRuntimeException("More than one root 'Web Projects' folder exists");
}
} }
else if (resultSet.length() != 1) finally
{ {
// More than one root web projects folder exits if (resultSet != null)
throw new AlfrescoRuntimeException("More than one root 'Web Projects' folder exists"); {
} resultSet.close();
}
}
this.webProjectsRootNodeRef = resultSet.getNodeRef(0); this.webProjectsRootNodeRef = resultSet.getNodeRef(0);
} }
@@ -804,11 +815,23 @@ public class WebProjectServiceImpl extends WCMUtil implements WebProjectService
query.append(userName); query.append(userName);
query.append("\""); query.append("\"");
ResultSet resultSet = searchService.query( ResultSet resultSet = null;
WEBPROJECT_STORE, List<NodeRef> nodes = null;
SearchService.LANGUAGE_LUCENE, try
query.toString()); {
List<NodeRef> nodes = resultSet.getNodeRefs(); resultSet = searchService.query(
WEBPROJECT_STORE,
SearchService.LANGUAGE_LUCENE,
query.toString());
nodes = resultSet.getNodeRefs();
}
finally
{
if (resultSet != null)
{
resultSet.close();
}
}
if (nodes.size() == 1) if (nodes.size() == 1)
{ {