Dave Ward fa1f4c3276 1Merged V4.0-BUG-FIX to HEAD
35438: Merged BRANCHES/DEV/THOR0 to BRANCHES/DEV/V4.0-BUG-FIX:
       - fix merge issue (THOR-4 / ALF-13756)
   35446: Merged BRANCHES/DEV/THOR0 to BRANCHES/DEV/V4.0-BUG-FIX:
      29422: record-only
      29453: build/test fix (AspectTest, PolicyTest, WebScriptTestSuite)
   35448: ALF-13770: Merged V3.4-BUG-FIX (3.4.10) to V4.0-BUG-FIX (4.0.2)
      35447: ALF-13769: Merged V3.4.8 (3.4.8.7) to V3.4-BUG-FIX (3.4.10)
         35435: ALF-11535 Home Folder Synchronizer fails when destination folder already exists
            - HomeFolderProviderSynchronizerTest was broken on build m/c because PersonTest (in the same suite) created
              its own UserNameMatcherImpl and left it attached to the personServiceImpl.
         35413: ALF-11535 Home Folder Synchronizer (HFS) fails when destination folder already exists
            - HomeFolderManager no longer returns an existing folder (unless the provider is an ExistingPathBasedHomeFolderProvider*),
              but will append -N (where N is an integer) so that a new folder is always created.
              This fixes an unreported bug (when case sensitive user names are in use) that users created in Share that only differ
              in case would have shared the same home folder.
            - Modified HFS to log more 'info' rather than 'debug' messages so it is possible for administrators to understand the moves
              and errors better.
            - Modified HFS to understand that Alfresco does not allow duplicate folders/content when case is ignored.
            - Added unit test for case insensitive user names.
            - Modified HFS to allows folder structure to change case on re-sync
   35451: Fix for ALF-13503 Add SOLR client API tests to the SystemBuildTest project
   - missed keystore from checkin
   35454: Improved solution for ALF-13286 - after changes to "SiteService" ProxyFactoryBean definition from Andy.
    - now checks user ability to execute the SiteService.createSite() method based on ACLs defined - avoiding AccessDeniedException.
   35462: Merged BRANCHES/DEV/THOR1 to BRANCHES/DEV/V4.0-BUG-FIX:
   - minor manual merge (to avoid future conflict)
   35465: Fix for ALF-13454 - Advanced search date picker missing the additional pop up
   35475: ALF-12780 - CIFS and TextEdit shuffle
   35495: ALF-13753: Prevent users from editing the name of locked documents in Share via the insitu editor


git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@35499 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
2012-04-20 16:51:08 +00:00

182 lines
5.4 KiB
Java

/*
* Copyright (C) 2005-2010 Alfresco Software Limited.
*
* This file is part of Alfresco
*
* Alfresco is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Alfresco 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 Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
*/
package org.alfresco.filesys.repo.rules;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.alfresco.filesys.repo.rules.ScenarioInstance.Ranking;
import org.alfresco.filesys.repo.rules.operations.CreateFileOperation;
import org.alfresco.filesys.repo.rules.operations.OpenFileOperation;
import org.alfresco.filesys.repo.rules.operations.RenameFileOperation;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
/**
* The Open File Scenario is a sequence of multiple openFile operations
*
* Only on the last close does the repo get closed. Open Files in the middle
* share the same file handle.
*
* For example:
*
* 1) open(readOnly)
* 2) open(readWrite)
* 3) open(readOnly) - does nothing.
* 4) close - does nothing
* 5) close - does nothing
* 6) close - updates the repo
*/
public class ScenarioOpenFile implements Scenario
{
private static Log logger = LogFactory.getLog(ScenarioOpenFile.class);
private String pattern;
private long timeout = 300000;
@Override
public ScenarioInstance createInstance(final EvaluatorContext ctx, Operation operation)
{
/**
* This scenario is triggered by an open or create of a new file
*/
if(operation instanceof CreateFileOperation)
{
CreateFileOperation c = (CreateFileOperation)operation;
if(c.getName() == null)
{
logger.debug("c.getName is null! - scenario not active");
return null;
}
if(c.getName().matches(pattern))
{
if(checkScenarioActive(c.getName(),ctx.getScenarioInstances()))
{
logger.debug("scenario already active for name" + c.getName());
return null;
}
if(logger.isDebugEnabled())
{
logger.debug("New Open File Instance for CreateFileOperation:" + c);
}
ScenarioOpenFileInstance instance = new ScenarioOpenFileInstance();
instance.setTimeout(timeout);
instance.setRanking(ranking);
return instance;
}
}
if(operation instanceof OpenFileOperation)
{
OpenFileOperation o = (OpenFileOperation)operation;
if(o.getName() == null)
{
logger.debug("o.getName is null! - scenario not active");
return null;
}
if(o.getName().matches(pattern))
{
if(checkScenarioActive(o.getName(),ctx.getScenarioInstances()))
{
logger.debug("scenario already active for name" + o.getName());
return null;
}
if(logger.isDebugEnabled())
{
logger.debug("New Open File Instance for OpenFileOperation:" + o);
}
ScenarioOpenFileInstance instance = new ScenarioOpenFileInstance();
instance.setTimeout(timeout);
instance.setRanking(ranking);
return instance;
}
}
// No not interested.
return null;
}
public void setTimeout(long timeout)
{
this.timeout = timeout;
}
public long getTimeout()
{
return timeout;
}
public void setPattern(String pattern)
{
this.pattern = pattern;
}
public String getPattern()
{
return pattern;
}
private Ranking ranking = Ranking.HIGH;
public void setRanking(Ranking ranking)
{
this.ranking = ranking;
}
public Ranking getRanking()
{
return ranking;
}
/**
* Check whether there is already an instance of the ScenarioOpenFile for the file
*/
private boolean checkScenarioActive(String name, final List<ScenarioInstance> currentInstances)
{
for(ScenarioInstance instance: currentInstances)
{
if(instance instanceof ScenarioOpenFileInstance)
{
ScenarioOpenFileInstance i = (ScenarioOpenFileInstance)instance;
if(i.getName() != null && name != null)
{
if(i.getName().equalsIgnoreCase(name))
{
return true;
}
}
}
}
return false;
}
}