mirror of
https://github.com/Alfresco/alfresco-community-repo.git
synced 2025-06-02 17:35:18 +00:00
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
128 lines
5.3 KiB
Java
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);
|
|
}
|
|
}
|
|
}
|