alfresco-community-repo/source/java/org/alfresco/repo/avm/wf/AVMSubmitPackageHandler.java
Jon Cox b80c73be52 Point checkin for virt server notifiction.
Now the virt server can react properly when a file in WEB-INF
 (such as a jar or web.xml file) is submitted to staging.


 Details
 -------
 
 More testing is needed, but the basic stuff looks ok.
 Here's a list of the events within the webapp that
 the virt server is now able to receive & handle properly:

     o  Invite user to web project
     o  Create web project
     o  Delete sandbox
     o  Delete web project 
     o  Submission of files to WEB-INF  


 The virt server does not yet get: 
     o  Revert events
     o  Out-of-band changes from CIFS (and probably never will).
  
 The plan to deal with changes made to critical files in WEB-INF
 is to have an exlicit control available within the webapp. 
 

 It does not yet handle "approved with changes" very gracefully.
 That can probably be fixed over the next few days.



 Gory details
 -----------

   projects/core/source/java/org/alfresco/util/VirtServerUtils.java
        Moved pattern that detects whether virt server needs
        updating in from AVMConstants, due to build dependencies;
        now this function is needed by workflow, which is in the
        repository package.

   projects/repository/config/alfresco/avm-services-context.xml
        Added AVMSubmitTransactionListener bean to allow virt
        server notification to hapen immediately after the
        submit transaction has been committed sucessfully.


   projects/repository/source/java/org/alfresco/repo/avm/wf/AVMSubmitPackageHandler.java
        Added transaction listner that does the virt server update,
        and added the list of staging diffs to AlfrescoTransactionSupport
        as a bound resource.


   projects/repository/source/java/org/alfresco/repo/avm/wf/AVMSubmitTransactionListener.java
        Does the actual notification of the virt server.
        The logic in this class still needs some work to handle
        "approved with changes" gracefully, but it does do
        the right thing when it comes to recursively reloading
        staging when a jar or web.xml file is modified.
        Light testing so far, but looks ok.  Consider this
        a point checkin only.  A singleton of this class is
        instantiated via the Spring config avm-services-context.xml,
        and used by AVMSubmitPackageHandler.


   projects/web-client/source/java/org/alfresco/web/bean/wcm/AVMConstants.java
        Removed the utility function that tests whether or not
        updating a file would require the virt server to be notified.
        This class would benifit from a major cleanup when time permits.

   projects/web-client/source/java/org/alfresco/web/bean/wcm/SubmitDialog.java
        Using the function that was moved/renamed from AVMConstants
        to VirtServerUtils that tests if a given file update requires
        a virt server notification message.




git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@4990 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
2007-02-01 02:18:54 +00:00

128 lines
5.3 KiB
Java

/*
* Copyright (C) 2006 Alfresco, Inc.
*
* Licensed under the Mozilla Public License version 1.1
* with a permitted attribution clause. You may obtain a
* copy of the License at
*
* http://www.alfresco.org/legal/license.txt
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
* either express or implied. See the License for the specific
* language governing permissions and limitations under the
* License.
*/
package org.alfresco.repo.avm.wf;
import java.io.Serializable;
import java.util.List;
import org.alfresco.repo.avm.AVMDAOs;
import org.alfresco.repo.avm.AVMNodeConverter;
import org.alfresco.repo.transaction.AlfrescoTransactionSupport;
import org.alfresco.repo.workflow.jbpm.JBPMNode;
import org.alfresco.repo.workflow.jbpm.JBPMSpringActionHandler;
import org.alfresco.service.cmr.avm.AVMNodeDescriptor;
import org.alfresco.service.cmr.avm.AVMService;
import org.alfresco.service.cmr.avmsync.AVMDifference;
import org.alfresco.service.cmr.avmsync.AVMSyncService;
import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.util.Pair;
import org.jbpm.graph.exe.ExecutionContext;
import org.springframework.beans.factory.BeanFactory;
public class AVMSubmitPackageHandler extends JBPMSpringActionHandler implements
Serializable
{
private static final long serialVersionUID = 4113360751217684995L;
/**
* The AVMService instance.
*/
private AVMService fAVMService;
/**
* The AVMSyncService instance.
*/
private AVMSyncService fAVMSyncService;
/**
* The AVMSubmittedAspect instance.
*/
private AVMSubmittedAspect fAVMSubmittedAspect;
/**
* The AVMSubmitTransactionListener instance
* (for JMX notification of virtualization server after commit/rollback).
*/
private AVMSubmitTransactionListener fAVMSubmitTransactionListener;
/**
* Initialize service references.
* @param factory The BeanFactory to get references from.
*/
@Override
protected void initialiseHandler(BeanFactory factory)
{
fAVMService = (AVMService)factory.getBean("AVMService");
fAVMSyncService = (AVMSyncService)factory.getBean("AVMSyncService");
fAVMSubmittedAspect = (AVMSubmittedAspect)factory.getBean("AVMSubmittedAspect");
fAVMSubmitTransactionListener = (AVMSubmitTransactionListener) factory.getBean("AVMSubmitTransactionListener");
AlfrescoTransactionSupport.bindListener(fAVMSubmitTransactionListener);
}
/**
* Do the actual work.
* @param executionContext The context to get stuff from.
*/
public void execute(ExecutionContext executionContext) throws Exception
{
// TODO: Allow submit parameters to be passed into this action handler
// rather than pulling directly from execution context
NodeRef pkg = ((JBPMNode)executionContext.getContextInstance().getVariable("bpm_package")).getNodeRef();
Pair<Integer, String> pkgPath = AVMNodeConverter.ToAVMVersionPath(pkg);
// submit the package changes
String description = (String)executionContext.getContextInstance().getVariable("bpm_workflowDescription");
String tag = (String)executionContext.getContextInstance().getVariable("wcmwf_label");
AVMNodeDescriptor pkgDesc = fAVMService.lookup(pkgPath.getFirst(), pkgPath.getSecond());
String targetPath = pkgDesc.getIndirection();
List<AVMDifference> stagingDiffs = fAVMSyncService.compare(pkgPath.getFirst(), pkgPath.getSecond(), -1, targetPath, null);
for (AVMDifference diff : stagingDiffs)
{
fAVMSubmittedAspect.clearSubmitted(diff.getSourceVersion(), diff.getSourcePath());
}
// Allow AVMSubmitTransactionListener to inspect the staging diffs
// so it can notify the virtualization server via JMX if when this
// submit succeeds or fails. This allows virtual webapps devoted
// to the workarea to be destroyed, and staging to be updated in
// the event that some of the files alter the behavior of the
// webapp itself (e.g.: WEB-INF/web.xml, WEB-INF/lib/*.jar), etc.
AlfrescoTransactionSupport.bindResource("staging_diffs", stagingDiffs);
fAVMSyncService.update(stagingDiffs, null, false, false, true, true, tag, description);
// flatten source folder where changes were submitted from
String from = (String)executionContext.getContextInstance().getVariable("wcmwf_fromPath");
if (from != null && from.length() > 0)
{
// first, submit changes back to sandbox forcing addition of edits in workflow (and submission
// flag removal). second, flatten sandbox, removing modified items that have been submitted
// TODO: Without locking on the sandbox, it's possible that a change to a "submitted" item
// may get lost when the item is finally approved
List<AVMDifference> sandboxDiffs = fAVMSyncService.compare(pkgPath.getFirst(), pkgPath.getSecond(), -1, from, null);
fAVMSyncService.update(sandboxDiffs, null, true, true, false, false, tag, description);
AVMDAOs.Instance().fAVMNodeDAO.flush();
fAVMSyncService.flatten(from, targetPath);
}
}
}