mirror of
				https://github.com/Alfresco/alfresco-community-repo.git
				synced 2025-10-29 15:21:53 +00:00 
			
		
		
		
	30270: ALF-9492 Can now update task properties through the Workflow JavaScript API. ALF-10087 Fixed failing Multi-tenancy tests.
   30306: Fixed ALF-7384: Xam: XamArchiveCleaner can delete files before retention period has passed
    - Keep the NOW upper limit to the query
    - Add a double-check using Java code to precisely check (down to the ms) that the retention time has passed
   30308: Merged V3.4 to V3.4-BUG-FIX
      30307: ALF-10186: Fix up all code that expects it can cast a WebScriptRequest directly into a WebScriptServletRequest
   30310: ALF-5830 show_audit.ftl template doesn't work any more
      - Changes to support new audit api
      - Works with high level content auditing
   30337: Merge DEV to V3.4-BUG-FIX
     30160 :  ALF-9257 - Renaming web project cause no trigger of the autodeploy process
   30362: ALF-10227 Add space after ''{0}'' in text
   30395: Removed deep svn:mergeinfo
   30433: Merged DEV/TEMPORARY to V3.4-BUG-FIX
      30424: ALF-8941: WCM: Virtual server setting lazyDeployExperimentalOnly ="true" (as per si3 fix) fails to load library under WEB-INF/lib directory (for HTTP filter).
         Walk up by hierarchy to the root and deploys a context if it wasn't deployed yet, through invocation of updateAllVirtualWebapps recursively. 
   30454: Fixed ALF-9158: Assignment of workflow task is not proper - out-of-the-box WCM workflow
   30466: Merged DEV/TEMPORARY to V3.4-BUG-FIX
      30460: ALF-9424 : Webform(XSD): xf:switch switch group does not work based on "complexContent with Base" element.
         Schema2XForms and SchemaUtil were modified to allow correctly process elements with namespace that differ from "http://www.w3.org/2001/XMLSchema"
   30476: Merged DEV to V3.4-BUG-FIX
      30474: ALF-10021: Get the last node in the resultset outside the timing loop to force prefetch.
   30483: Fixed ALF-9417: (pdf2swf) Share preview is blank with some pdf files.
   30514: ALF-240: Unfriendly error appears when trying to view details for created discussion for multilingual content   
      Webdav URLs were not valid for non-ML or ML discussion items, but were only stopping the details page for the ML items from being shown. Utils.generateURL now returns null for such items.   
   30517: Fixed ALF-5526: Component-Generator for d:noteref and other "system" types always disabled => breaks extensibility
   30519: FileFolderService moveFrom method was not supported by MLTranslationInterceptor
   30527: ALF-240: added missing exception message.
   30531: Fixed ALF-9599: Share forms do not allow edit of non-cm:content nodes
   30541: ALF-9424: Missed change, causing compilation error
   30552: Tests to accompany fix for ALF-240, ALF-10298: discussion topic webdav URLs causing error page in explorer.
   30565: Fixed ALF-10336 "Drag and Drop item in Customize Site Dashboard - text of item reverts to default font style and size during drag operation"
   30568: Fixed ALF-10342: ClassCastException on org.alfresco.repo.copy.AbstractCopyBehaviourCallback
   30570: ALF-3332: (circa 2008) Pagination inks rewritten incorrectly by opensearch proxy
   30574: ALF-9470: OwnableService cache not being updated for archived nodes - modified fix by Pavel
   30579: ALF-5607: Cancelling of install. Some directories are not deleted from disk.
   - Fixed provided by Bitrock for Mac and Windows
   30583: Merged HEAD to V3.4-BUG-FIX (Back ported 2 fixes for included resource handling when running unit tests)
      28711: Avoid a NPE on certain kinds missing included resources, and instead give a helpful error along the lines of other include issues
      28716: When loading JS includes with a full classpath reference, handle the Eclipse classloader behaving slightly differently on absolute paths compared to the JVM one
   30648: Fixed ALF-10401: No simple way to disable auto-versioning behaviour
    - Added property: version.store.enableAutoVersioning=true
    - When set to 'false', the VersionableAspect will not respond to any events;
      even if the aspect is present, it will not create versions.
   30657: Merged DEV/TEMPORARY to V3.4-BUG-FIX
      30590: ALF-7105: pdfbox returns errors in the logs but one cannot understand what file is affected (PDFBox)
         Level log4j.logger.org.apache.pdfbox.pdmodel.font.PDCIDFont=fatal was introduced in log4j.properties.
   30669: Fixes: ALF-6470 (Updates FR translation)
   30686: ALF-1017: Fixed compilation error in backport
   30696: Fix for ALF-8176
   30708: ALF-10040: Added missing ReferenceCountingReadOnlyIndexReaderFactory wrapper to IndexInfo.getMainIndexReferenceCountingReadOnlyIndexReader() to make it consistent with IndexInfo.getMainIndexReferenceCountingReadOnlyIndexReader(String, Set<String>, boolean) and allow SingleFieldSelectors to make it through from LeafScorer to the path caches! Affects ALL Lucene queries that run OUTSIDE of a transaction.
   30722: Fixed ALF-9465: Share: We can add category in Share, but the selected value will not be shown in U.I.
   30724: Merged BRANCHES/DEV/BELARUS/V3.4-BUG-FIX-2011_09_05 to BRANCHES/DEV/V3.4-BUG-FIX:
      30603: ALF-10165: Unexpected behaviour when title duplicated between web forms
   30754: Fix for ALF-9899 Huge share site migration, add group to site and user access site related performance issue.
   - generic performance improvements for PATH queries ending "..../*" - specifically to improve listing calendar items for users in many share sites
   30765: Fix for ALF-760 - import loses category association data  
   30779: Merged V3.4 to V3.4-BUG-FIX
      30716: ALF-10452 It's impossible to edit existing user details
         - Change for ALF-371 did not handle the simplest case - no change of home folder location
      30549: Fixes ALF-9534 - Location API
git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@30780 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
		
	
		
			
				
	
	
		
			199 lines
		
	
	
		
			9.9 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
			
		
		
	
	
			199 lines
		
	
	
		
			9.9 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.repo.avm.wf;
 | |
| 
 | |
| 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.config.JNDIConstants;
 | |
| import org.alfresco.model.WCMAppModel;
 | |
| import org.alfresco.repo.avm.AVMNodeConverter;
 | |
| import org.alfresco.repo.avm.actions.AVMDeployWebsiteAction;
 | |
| import org.alfresco.repo.domain.PropertyValue;
 | |
| import org.alfresco.repo.workflow.jbpm.JBPMNode;
 | |
| import org.alfresco.repo.workflow.jbpm.JBPMSpringActionHandler;
 | |
| import org.alfresco.service.cmr.avm.deploy.DeploymentService;
 | |
| import org.alfresco.wcm.sandbox.SandboxConstants;
 | |
| import org.alfresco.service.cmr.action.Action;
 | |
| import org.alfresco.service.cmr.action.ActionService;
 | |
| import org.alfresco.service.cmr.avm.AVMService;
 | |
| import org.alfresco.service.cmr.dictionary.DataTypeDefinition;
 | |
| import org.alfresco.service.cmr.repository.NodeRef;
 | |
| import org.alfresco.service.cmr.repository.NodeService;
 | |
| import org.alfresco.service.cmr.security.PermissionService;
 | |
| import org.alfresco.service.namespace.QName;
 | |
| import org.alfresco.util.GUID;
 | |
| import org.alfresco.util.Pair;
 | |
| import org.apache.commons.logging.Log;
 | |
| import org.apache.commons.logging.LogFactory;
 | |
| import org.jbpm.graph.exe.ExecutionContext;
 | |
| import org.springframework.beans.factory.BeanFactory;
 | |
| 
 | |
| 
 | |
| /**
 | |
|  * Deploys the latest snapshot of the staging area the submission was for.
 | |
|  * 
 | |
|  * @author Gavin Cornwell
 | |
|  */
 | |
| public class AVMDeployHandler extends JBPMSpringActionHandler 
 | |
| {
 | |
|     private DeploymentService deploymentService;
 | |
|     private AVMService avmService;
 | |
|     private ActionService actionService;
 | |
|     private NodeService unprotectedNodeService;
 | |
|     private PermissionService unprotectedPermissionService;
 | |
|     
 | |
|     private static final String BEAN_DEPLOYMENT_SERVICE = "deploymentService";
 | |
|     private static final String BEAN_AVM_SERVICE = "AVMService";
 | |
|     private static final String BEAN_ACTION_SERVICE = "actionService";
 | |
|     private static final String BEAN_NODE_SERVICE = "nodeService";
 | |
|     private static final String BEAN_PERMISSION_SERVICE = "permissionService";
 | |
| 
 | |
|     private static final long serialVersionUID = 5590265401983087178L;
 | |
|     private static final Log logger = LogFactory.getLog(AVMDeployHandler.class);
 | |
|     
 | |
|     /**
 | |
|      * Initialize service references.
 | |
|      * @param factory The BeanFactory to get references from.
 | |
|      */
 | |
|     @Override
 | |
|     protected void initialiseHandler(BeanFactory factory) 
 | |
|     {
 | |
|         this.deploymentService = (DeploymentService)factory.getBean(BEAN_DEPLOYMENT_SERVICE);
 | |
|         this.avmService = (AVMService)factory.getBean(BEAN_AVM_SERVICE);
 | |
|         this.actionService = (ActionService)factory.getBean(BEAN_ACTION_SERVICE);
 | |
|         this.unprotectedNodeService = (NodeService)factory.getBean(BEAN_NODE_SERVICE);
 | |
|         this.unprotectedPermissionService = (PermissionService)factory.getBean(BEAN_PERMISSION_SERVICE);
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Do the actual work.
 | |
|      * @param executionContext The context to get stuff from.
 | |
|      */
 | |
|     public void execute(ExecutionContext executionContext) throws Exception 
 | |
|     {
 | |
|         // determine if the auto deploy needs to be executed
 | |
|         Boolean autoDeploy = (Boolean)executionContext.getContextInstance().getVariable("wcmwf_autoDeploy");
 | |
|            
 | |
|         if (logger.isDebugEnabled())
 | |
|         {
 | |
|             String label = (String)executionContext.getContextInstance().getVariable("wcmwf_label");
 | |
|             long workflowId = executionContext.getProcessInstance().getId();
 | |
|             
 | |
|             logger.debug("autoDeploy state for submission (workflowid: jbpm$" + workflowId + 
 | |
|                      ", label: " + label + ") is: " + autoDeploy);
 | |
|         }
 | |
|         
 | |
|         if (autoDeploy != null && autoDeploy.booleanValue())
 | |
|         {
 | |
|             // get the web project node for the submission
 | |
|             JBPMNode webProjNode = (JBPMNode)executionContext.getContextInstance().getVariable("wcmwf_webproject");
 | |
|             NodeRef webProjectRef = webProjNode.getNodeRef();
 | |
| 
 | |
|             // get the list of live servers for the project that have the auto deploy flag turned on
 | |
|             List<NodeRef> servers = deploymentService.findLiveDeploymentServers(webProjectRef);
 | |
|            
 | |
|             // if there are servers do the deploy
 | |
|             if (servers.size() > 0)
 | |
|             {
 | |
|                 // Get the staging store name
 | |
|                 NodeRef pkg = ((JBPMNode)executionContext.getContextInstance().getVariable("bpm_package")).getNodeRef();
 | |
|                 Pair<Integer, String> pkgPath = AVMNodeConverter.ToAVMVersionPath(pkg);
 | |
|                 String [] workflowStorePath = pkgPath.getSecond().split(":");
 | |
|                 String workflowStoreName = workflowStorePath[0];
 | |
|                 PropertyValue propVal = this.avmService.getStoreProperty(workflowStoreName, 
 | |
|                          SandboxConstants.PROP_WEBSITE_NAME);
 | |
|                 String store = propVal.getStringValue();
 | |
|         
 | |
|                 if (logger.isDebugEnabled())
 | |
|                      logger.debug("Attempting auto deploy to store: " + store);
 | |
|             
 | |
|                 // retrieve the latest snapshot number for the store
 | |
|                 int snapshotVersionToDeploy = this.avmService.getLatestSnapshotID(store);
 | |
|                 
 | |
|                 // work out the path of the store that needs deploying
 | |
|                 String pathToDeploy = store + ":/" + JNDIConstants.DIR_DEFAULT_WWW + 
 | |
|                                       '/' +  JNDIConstants.DIR_DEFAULT_APPBASE;
 | |
|                 NodeRef websiteRef = AVMNodeConverter.ToNodeRef(snapshotVersionToDeploy, pathToDeploy);
 | |
|                
 | |
|                 // create a deploymentattempt node to represent this deployment
 | |
|                 String attemptId = GUID.generate();
 | |
|                 Map<QName, Serializable> props = new HashMap<QName, Serializable>(8, 1.0f);
 | |
|                 props.put(WCMAppModel.PROP_DEPLOYATTEMPTID, attemptId);
 | |
|                 props.put(WCMAppModel.PROP_DEPLOYATTEMPTTYPE, WCMAppModel.CONSTRAINT_LIVESERVER);
 | |
|                 props.put(WCMAppModel.PROP_DEPLOYATTEMPTSTORE, store);
 | |
|                 props.put(WCMAppModel.PROP_DEPLOYATTEMPTVERSION, snapshotVersionToDeploy);
 | |
|                 props.put(WCMAppModel.PROP_DEPLOYATTEMPTTIME, new Date());
 | |
|                 NodeRef attempt = unprotectedNodeService.createNode(webProjectRef, 
 | |
|                          WCMAppModel.ASSOC_DEPLOYMENTATTEMPT, WCMAppModel.ASSOC_DEPLOYMENTATTEMPT, 
 | |
|                          WCMAppModel.TYPE_DEPLOYMENTATTEMPT, props).getChildRef();
 | |
|                
 | |
|                 // allow anyone to add child nodes to the deploymentattempt node
 | |
|                 unprotectedPermissionService.setPermission(attempt, PermissionService.ALL_AUTHORITIES, 
 | |
|                          PermissionService.ADD_CHILDREN, true);
 | |
|                 
 | |
|                 // iterate round each server and fire off a deplyoment action
 | |
|                 List<String> selectedDeployToNames = new ArrayList<String>();
 | |
|                 for (NodeRef serverRef: servers)
 | |
|                 {
 | |
|                     if (unprotectedNodeService.exists(serverRef))
 | |
|                     {
 | |
|                         // get all properties of the target server
 | |
|                         Map<QName, Serializable> serverProps = unprotectedNodeService.getProperties(serverRef);
 | |
|                         
 | |
|                         String serverUri = AVMDeployWebsiteAction.calculateServerUri(serverProps);
 | |
|                         String serverName = (String)serverProps.get(WCMAppModel.PROP_DEPLOYSERVERNAME);
 | |
|                         if (serverName == null || serverName.length() == 0)
 | |
|                         {
 | |
|                            serverName = serverUri;
 | |
|                         }
 | |
|                         
 | |
|                         // remember the servers deployed to
 | |
|                         selectedDeployToNames.add(serverName);
 | |
|                         
 | |
|                         if (logger.isDebugEnabled())
 | |
|                            logger.debug("Auto deploying '" + websiteRef.toString() + "' to server: " + serverName);
 | |
|                         
 | |
|                         // create and execute the action asynchronously
 | |
|                         Map<String, Serializable> args = new HashMap<String, Serializable>(1, 1.0f);
 | |
|                         args.put(AVMDeployWebsiteAction.PARAM_WEBPROJECT, webProjectRef);
 | |
|                         args.put(AVMDeployWebsiteAction.PARAM_SERVER, serverRef);
 | |
|                         args.put(AVMDeployWebsiteAction.PARAM_ATTEMPT, attempt);
 | |
|                         Action action = this.actionService.createAction(AVMDeployWebsiteAction.NAME, args);
 | |
|                         this.actionService.executeAction(action, websiteRef, false, true);
 | |
|                     }
 | |
|                 }
 | |
|                 
 | |
|                 // now we know the list of selected servers set the property on the attempt node
 | |
|                 unprotectedNodeService.setProperty(attempt, WCMAppModel.PROP_DEPLOYATTEMPTSERVERS, 
 | |
|                          (Serializable)selectedDeployToNames);
 | |
|                 
 | |
|                 // set the deploymentattempid property on the store this deployment was for
 | |
|                 this.avmService.deleteStoreProperty(store, SandboxConstants.PROP_LAST_DEPLOYMENT_ID);
 | |
|                 this.avmService.setStoreProperty(store, SandboxConstants.PROP_LAST_DEPLOYMENT_ID, 
 | |
|                          new PropertyValue(DataTypeDefinition.TEXT, attemptId));
 | |
|             }
 | |
|         }
 | |
|     }
 | |
| }
 |