/*
* #%L
* Alfresco Records Management Module
* %%
* Copyright (C) 2005 - 2016 Alfresco Software Limited
* %%
* This file is part of the Alfresco software.
* -
* If the software was purchased under a paid Alfresco license, the terms of
* the paid license agreement will prevail. Otherwise, the software is
* provided under the following open source license terms:
* -
* 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/>.
* #L%
*/
package org.alfresco.module.org_alfresco_module_rm.job;
import java.util.List;
import org.alfresco.module.org_alfresco_module_rm.model.RecordsManagementModel;
import org.alfresco.module.org_alfresco_module_rm.notification.RecordsManagementNotificationHelper;
import org.alfresco.repo.security.authentication.AuthenticationUtil;
import org.alfresco.repo.security.authentication.AuthenticationUtil.RunAsWork;
import org.alfresco.repo.transaction.RetryingTransactionHelper.RetryingTransactionCallback;
import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.cmr.repository.NodeService;
import org.alfresco.service.cmr.repository.StoreRef;
import org.alfresco.service.cmr.search.ResultSet;
import org.alfresco.service.cmr.search.SearchService;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
/**
* This job finds all Vital Records which are due for review, optionally
* excluding those for which notification has already been issued.
*
* @author Neil McErlean
*/
public class NotifyOfRecordsDueForReviewJobExecuter extends RecordsManagementJobExecuter
{
private static Log logger = LogFactory.getLog(NotifyOfRecordsDueForReviewJobExecuter.class);
private RecordsManagementNotificationHelper recordsManagementNotificationHelper;
private NodeService nodeService;
private SearchService searchService;
public void setRecordsManagementNotificationHelper(
RecordsManagementNotificationHelper recordsManagementNotificationHelper)
{
this.recordsManagementNotificationHelper = recordsManagementNotificationHelper;
}
public void setNodeService(NodeService nodeService)
{
this.nodeService = nodeService;
}
public void setSearchService(SearchService searchService)
{
this.searchService = searchService;
}
/**
* @see org.alfresco.module.org_alfresco_module_rm.job.RecordsManagementJobExecuter#execute()
*/
public void executeImpl()
{
if (logger.isDebugEnabled())
{
logger.debug("Job " + this.getClass().getSimpleName() + " starting.");
}
AuthenticationUtil.runAs(new RunAsWork<Object>()
{
public Object doWork()
{
// Query is for all records that are due for review and for which
// notification has not been sent.
StringBuilder queryBuffer = new StringBuilder();
queryBuffer.append("+ASPECT:\"rma:vitalRecord\" ");
queryBuffer.append("AND @rma\\:reviewAsOf:[MIN TO NOW] ");
queryBuffer.append("AND ( ");
queryBuffer.append("@rma\\:notificationIssued:false ");
queryBuffer.append("OR ISNULL:\"rma:notificationIssued\" ");
queryBuffer.append(") ");
String query = queryBuffer.toString();
ResultSet results = searchService.query(StoreRef.STORE_REF_WORKSPACE_SPACESSTORE, SearchService.LANGUAGE_FTS_ALFRESCO, query);
final List<NodeRef> resultNodes = results.getNodeRefs();
results.close();
if (logger.isDebugEnabled())
{
logger.debug("Found " + resultNodes.size() + " nodes due for review and without notification.");
}
//If we have something to do and a template to do it with
if(resultNodes.size() != 0)
{
//Send the email message - but we must not retry since email is not transactional
RetryingTransactionCallback<Void> txCallbackSendEmail = new RetryingTransactionCallback<Void>()
{
// Set the notification issued property.
public Void execute()
{
// Send notification
recordsManagementNotificationHelper.recordsDueForReviewEmailNotification(resultNodes);
return null;
}
};
RetryingTransactionCallback<Boolean> txUpdateNodesCallback = new RetryingTransactionCallback<Boolean>()
{
// Set the notification issued property.
public Boolean execute()
{
for (NodeRef node : resultNodes)
{
nodeService.setProperty(node, RecordsManagementModel.PROP_NOTIFICATION_ISSUED, "true");
}
return Boolean.TRUE;
}
};
/**
* Now do the work, one action in each transaction
*/
// don't retry the send email
retryingTransactionHelper.setMaxRetries(0);
retryingTransactionHelper.doInTransaction(txCallbackSendEmail);
retryingTransactionHelper.setMaxRetries(10);
retryingTransactionHelper.doInTransaction(txUpdateNodesCallback);
}
return null;
}
}, AuthenticationUtil.getSystemUserName());
if (logger.isDebugEnabled())
{
logger.debug("Job " + this.getClass().getSimpleName() + " finished");
}
} // end of execute method
}