/***********************************************************************
* This file is part of iDempiere ERP Open Source *
* http://www.idempiere.org *
* *
* Copyright (C) Contributors *
* *
* This program is free software; you can redistribute it and/or *
* modify it under the terms of the GNU General Public License *
* as published by the Free Software Foundation; either version 2 *
* of the License, or (at your option) any later version. *
* *
* This program 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 General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the Free Software *
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, *
* MA 02110-1301, USA. *
**********************************************************************/
package org.adempiere.webui.apps;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
import java.util.concurrent.Callable;
import java.util.logging.Level;
import org.adempiere.util.IProcessUI;
import org.adempiere.util.ServerContext;
import org.compiere.model.MAttachment;
import org.compiere.model.MClient;
import org.compiere.model.MNote;
import org.compiere.model.MPInstance;
import org.compiere.model.MPInstanceLog;
import org.compiere.model.MProcess;
import org.compiere.process.ProcessInfo;
import org.compiere.process.ProcessInfoUtil;
import org.compiere.process.ServerProcessCtl;
import org.compiere.util.CLogger;
import org.compiere.util.Env;
import org.compiere.util.Msg;
import org.compiere.util.Util;
/**
* Callable to run process as background job.
* Send email or notice notification to user upon completion of job.
*/
public class BackgroundJobCallable implements Callable
{
private final ProcessInfo processInfo;
private Properties m_ctx;
private IProcessUI processUI;
private static final CLogger log = CLogger.getCLogger(BackgroundJobCallable.class);
/**
* @param ctx
* @param processInfo
*/
public BackgroundJobCallable(Properties ctx, ProcessInfo processInfo)
{
this(ctx, processInfo, null);
}
/**
* @param ctx
* @param processInfo
* @param processUI
*/
public BackgroundJobCallable(Properties ctx, ProcessInfo processInfo, IProcessUI processUI)
{
super();
this.processInfo = processInfo;
this.processUI = processUI;
m_ctx = new Properties();
Env.setContext(m_ctx, Env.AD_CLIENT_ID, ctx.getProperty(Env.AD_CLIENT_ID));
Env.setContext(m_ctx, Env.AD_ORG_ID, ctx.getProperty(Env.AD_ORG_ID));
Env.setContext(m_ctx, Env.AD_ROLE_ID, ctx.getProperty(Env.AD_ROLE_ID));
Env.setContext(m_ctx, Env.M_WAREHOUSE_ID, ctx.getProperty(Env.M_WAREHOUSE_ID));
Env.setContext(m_ctx, Env.LANGUAGE, ctx.getProperty(Env.LANGUAGE));
Env.setContext(m_ctx, Env.AD_USER_ID, ctx.getProperty(Env.AD_USER_ID));
Env.setContext(m_ctx, Env.DATE, ctx.getProperty(Env.DATE));
Env.setContext(m_ctx, Env.AD_SESSION_ID, ctx.getProperty(Env.AD_SESSION_ID));
}
@Override
public ProcessInfo call() {
try {
ServerContext.setCurrentInstance(m_ctx);
return doRun();
} finally {
ServerContext.dispose();
}
}
/**
* Run job
* @return
*/
private ProcessInfo doRun()
{
processInfo.setIsBatch(true);
processInfo.setPrintPreview(true);
MPInstance instance = new MPInstance(m_ctx, processInfo.getAD_PInstance_ID(), null);
String notificationType = instance.getNotificationType();
if (notificationType == null)
notificationType = MPInstance.NOTIFICATIONTYPE_Notice;
boolean sendEmail = notificationType.equals(MPInstance.NOTIFICATIONTYPE_EMail) || notificationType.equals(MPInstance.NOTIFICATIONTYPE_EMailPlusNotice);
boolean createNotice = notificationType.equals(MPInstance.NOTIFICATIONTYPE_Notice) || notificationType.equals(MPInstance.NOTIFICATIONTYPE_EMailPlusNotice);
int AD_Client_ID = Env.getAD_Client_ID(m_ctx);
int AD_User_ID = Env.getAD_User_ID(m_ctx);
try {
MProcess process = new MProcess(m_ctx, processInfo.getAD_Process_ID(), null);
if (process.isReport() && process.getJasperReport() != null) {
if (!Util.isEmpty(process.getJasperReport()))
{
processInfo.setExport(true);
if ("HTML".equals(processInfo.getReportType()))
processInfo.setExportFileExtension("html");
else if ("CSV".equals(processInfo.getReportType()))
processInfo.setExportFileExtension("csv");
else if ("XLS".equals(processInfo.getReportType()))
processInfo.setExportFileExtension("xls");
else if ("XLSX".equals(processInfo.getReportType()))
processInfo.setExportFileExtension("xlsx");
else
processInfo.setExportFileExtension("pdf");
}
}
List downloadFiles = new ArrayList();
ServerProcessCtl.process(processInfo, null);
ProcessInfoUtil.setLogFromDB(processInfo);
if (!processInfo.isError())
{
boolean isReport = (process.isReport() || process.getAD_ReportView_ID() > 0 || process.getJasperReport() != null || process.getAD_PrintFormat_ID() > 0);
if (isReport && processInfo.getPDFReport() != null)
{
downloadFiles.add(processInfo.getPDFReport());
if (processUI != null)
processUI.download(processInfo.getPDFReport());
}
if (processInfo.isExport() && processInfo.getExportFile() != null)
{
downloadFiles.add(processInfo.getExportFile());
if (processUI != null)
processUI.download(processInfo.getExportFile());
}
}
if (sendEmail)
{
MClient client = MClient.get(m_ctx, AD_Client_ID);
client.sendEMailAttachments(AD_User_ID, process.get_Translation("Name", Env.getAD_Language(Env.getCtx())), processInfo.getSummary() + " " + processInfo.getLogInfo(),
downloadFiles);
}
if (createNotice)
{
MNote note = new MNote(m_ctx, "BackgroundJob", AD_User_ID, null);
note.setTextMsg(process.get_Translation("Name", Env.getAD_Language(Env.getCtx())) + "\n" + processInfo.getSummary());
note.setRecord(MPInstance.Table_ID, processInfo.getAD_PInstance_ID());
note.saveEx();
MAttachment attachment = null;
if (downloadFiles.size() > 0)
{
attachment = note.createAttachment();
for (File downloadFile : downloadFiles)
attachment.addEntry(downloadFile);
}
String log = processInfo.getLogInfo(true);
if (log != null && log.trim().length() > 0) {
if (attachment == null)
attachment = note.createAttachment();
attachment.addEntry("ProcessLog.html", log.getBytes("UTF-8"));
}
if (attachment != null)
attachment.saveEx();
MPInstanceLog il = instance.addLog(null, 0, null, Msg.parseTranslation(m_ctx, "@Created@ @AD_Note_ID@ " + note.getAD_Note_ID()),
MNote.Table_ID, note.getAD_Note_ID());
il.saveEx();
}
} catch (Throwable e) {
log.log(Level.SEVERE, e.getLocalizedMessage(), e);
if (instance.getAD_PInstance_ID() > 0) {
MPInstanceLog il = instance.addLog(null, 0, null, e.getLocalizedMessage());
il.save();
}
} finally {
instance.setIsProcessing(false);
instance.saveEx();
MPInstance.publishChangedEvent(AD_User_ID);
}
return processInfo;
}
}