IDEMPIERE-5473 Refactoring of WArchive and MArchive (#1555)

This commit is contained in:
hengsin 2022-11-15 21:51:11 +08:00 committed by GitHub
parent c9f589c4d5
commit 05bf9d6add
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 181 additions and 50 deletions

View File

@ -48,7 +48,7 @@ public class MArchive extends X_AD_Archive {
/**
*
*/
private static final long serialVersionUID = 6934821005476123632L;
private static final long serialVersionUID = -6343913337999164991L;
/**
* Get Archives
@ -147,7 +147,8 @@ public class MArchive extends X_AD_Archive {
setC_BPartner_ID(info.getC_BPartner_ID());
} // MArchive
public MStorageProvider provider;
protected MStorageProvider provider;
/**
* Get the isStoreArchiveOnFileSystem and archivePath for the client.
*
@ -175,8 +176,12 @@ public class MArchive extends X_AD_Archive {
return sb.toString();
} // toString
public byte[] getBinaryData() {
/**
* Get data as byte[] from storage provider
*
* @return byte[] or null
*/
public byte[] getBinaryData() {
IArchiveStore prov = provider.getArchiveStore();
if (prov != null)
return prov.loadLOBData(this,provider);
@ -196,7 +201,7 @@ public class MArchive extends X_AD_Archive {
} // getInputStream
/**
* Save Binary Data to file system or db.
* Save Binary Data through storage provider
*
* @param inflatedData
* inflated data
@ -258,10 +263,20 @@ public class MArchive extends X_AD_Archive {
return path.toString();
}
/**
* Get byte data from BinaryData column.
* Usually, your code should call getBinaryData() instead (using provider).
* @return byte[]
*/
public byte[] getByteData(){
return super.getBinaryData();
}
/**
* Store byte data to BinaryData column.
* Usually, your code should call setBinaryData() instead (using provider).
* @param BinaryData
*/
public void setByteData(byte[] BinaryData){
super.setBinaryData(BinaryData);
}
@ -369,4 +384,60 @@ public class MArchive extends X_AD_Archive {
return destZipFile;
}
/**
* Get number of document and report archive by table and record id
*
* @param AD_Table_ID
* @param Record_ID
* @param trxName
* @return int[], [0] = report count and [1] = document count
*/
public static int[] getReportAndDocumentCountByRecordId(int AD_Table_ID, int Record_ID, String trxName) {
int reportCount = 0;
int documentCount = 0;
StringBuilder sql = new StringBuilder("SELECT IsReport, COUNT(*) FROM AD_Archive ")
.append("WHERE (AD_Table_ID=? AND Record_ID=?) ");
if (AD_Table_ID == MBPartner.Table_ID)
sql.append(" OR C_BPartner_ID=?");
sql.append(" GROUP BY IsReport");
PreparedStatement pstmt = null;
ResultSet rs = null;
try
{
pstmt = DB.prepareStatement (sql.toString(), trxName);
pstmt.setInt(1, AD_Table_ID);
pstmt.setInt(2, Record_ID);
if (AD_Table_ID == MBPartner.Table_ID)
pstmt.setInt(3, Record_ID);
rs = pstmt.executeQuery ();
while (rs.next ())
{
if ("Y".equals(rs.getString(1)))
reportCount += rs.getInt(2);
else
documentCount += rs.getInt(2);
}
}
catch (Exception e)
{
throw new AdempiereException(e);
}
finally
{
DB.close(rs, pstmt);
}
return new int[] {reportCount, documentCount};
}
/**
* Get number of report archive by table id
*
* @param AD_Table_ID
* @param trxName
* @return Number of report archive for AD_Table_ID
*/
public static int getReportCountByTableId(int AD_Table_ID, String trxName) {
String sql = "SELECT COUNT(*) FROM AD_Archive WHERE AD_Table_ID=? AND IsReport='Y'";
return DB.getSQLValueEx(trxName, sql, AD_Table_ID);
}
} // MArchive

View File

@ -1,17 +1,39 @@
/***********************************************************************
* 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. *
* *
* Contributors: *
* - hengsin *
**********************************************************************/
package org.adempiere.webui;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.logging.Level;
import org.adempiere.webui.apps.form.WArchiveViewer;
import org.adempiere.webui.component.Window;
import org.adempiere.webui.panel.ADForm;
import org.adempiere.webui.session.SessionManager;
import org.compiere.model.MArchive;
import org.compiere.model.MBPartner;
import static org.compiere.model.SystemIDs.*;
import org.compiere.util.CLogger;
import org.compiere.util.DB;
import org.compiere.util.Env;
import org.compiere.util.Msg;
import org.zkoss.zk.ui.Component;
@ -55,23 +77,19 @@ public class WArchive implements EventListener<Event>
private Menuitem m_reports = null;
private Menuitem m_reportsAll = null;
private Menuitem m_documents = null;
// private JPopupMenu m_popup = new JPopupMenu("ArchiveMenu");
/** Where Clause */
StringBuffer m_where = null;
protected StringBuffer m_where = null;
/** Logger */
private static final CLogger log = CLogger.getCLogger (WArchive.class);
/**
* Display Request Options - New/Existing.
* Display archive menu
* @param invoker button
*/
private void getArchives(Component invoker)
{
int reportCount = 0;
int documentCount = 0;
m_where = new StringBuffer();
m_where.append("(AD_Table_ID=").append(m_AD_Table_ID)
.append(" AND Record_ID=").append(m_Record_ID)
@ -80,39 +98,9 @@ public class WArchive implements EventListener<Event>
if (m_AD_Table_ID == MBPartner.Table_ID)
m_where.append(" OR C_BPartner_ID=").append(m_Record_ID);
//
StringBuffer sql = new StringBuffer("SELECT IsReport, COUNT(*) FROM AD_Archive ")
.append("WHERE (AD_Table_ID=? AND Record_ID=?) ");
if (m_AD_Table_ID == MBPartner.Table_ID)
sql.append(" OR C_BPartner_ID=?");
sql.append(" GROUP BY IsReport");
PreparedStatement pstmt = null;
ResultSet rs = null;
try
{
pstmt = DB.prepareStatement (sql.toString(), null);
pstmt.setInt(1, m_AD_Table_ID);
pstmt.setInt(2, m_Record_ID);
if (m_AD_Table_ID == MBPartner.Table_ID)
pstmt.setInt(3, m_Record_ID);
rs = pstmt.executeQuery ();
while (rs.next ())
{
if ("Y".equals(rs.getString(1)))
reportCount += rs.getInt(2);
else
documentCount += rs.getInt(2);
}
}
catch (Exception e)
{
log.log(Level.SEVERE, sql.toString(), e);
}
finally
{
DB.close(rs, pstmt);
rs = null; pstmt = null;
}
int[] counts = MArchive.getReportAndDocumentCountByRecordId(m_AD_Table_ID, m_Record_ID, null);
int reportCount = counts[0];
int documentCount = counts[1];
//
if (documentCount > 0)
{
@ -129,8 +117,7 @@ public class WArchive implements EventListener<Event>
m_popup.appendChild(m_reports);
}
// All Reports
String sql1 = "SELECT COUNT(*) FROM AD_Archive WHERE AD_Table_ID=? AND IsReport='Y'";
int allReports = DB.getSQLValue(null, sql1, m_AD_Table_ID);
int allReports = MArchive.getReportCountByTableId(m_AD_Table_ID, null);
if (allReports > 0)
{
m_reportsAll = new Menuitem(Msg.getMsg(Env.getCtx(), "ArchivedReportsAll")
@ -141,7 +128,6 @@ public class WArchive implements EventListener<Event>
if (documentCount == 0 && reportCount == 0 && allReports == 0)
m_popup.appendChild(new Menuitem(Msg.getMsg(Env.getCtx(), "ArchivedNone")));
//
Popup popup = LayoutUtils.findPopup(invoker);
if (popup != null)
@ -160,6 +146,7 @@ public class WArchive implements EventListener<Event>
* Listner
* @param e event
*/
@Override
public void onEvent(Event e) throws Exception
{
if (e.getTarget() instanceof Menuitem)

View File

@ -0,0 +1,73 @@
/***********************************************************************
* 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. *
* *
* Contributors: *
* - hengsin *
**********************************************************************/
package org.idempiere.test.model;
import static org.junit.jupiter.api.Assertions.assertEquals;
import org.compiere.model.MArchive;
import org.compiere.model.MProduct;
import org.compiere.util.Env;
import org.idempiere.test.AbstractTestCase;
import org.idempiere.test.DictionaryIDs;
import org.junit.jupiter.api.Test;
public class MArchiveTest extends AbstractTestCase {
public MArchiveTest() {
}
@Test
public void testArchive() {
int allReportCount = MArchive.getReportCountByTableId(MProduct.Table_ID, getTrxName());
int[] recordCounts = MArchive.getReportAndDocumentCountByRecordId(MProduct.Table_ID, DictionaryIDs.M_Product.AZALEA_BUSH.id, getTrxName());
MArchive marchive = new MArchive(Env.getCtx(), 0, getTrxName());
marchive.setAD_Table_ID(MProduct.Table_ID);
marchive.setIsReport(true);
marchive.setName(getClass().getName());
marchive.setRecord_ID(DictionaryIDs.M_Product.AZALEA_BUSH.id);
marchive.setBinaryData("test".getBytes());
marchive.saveEx();
int allReportCount1 = MArchive.getReportCountByTableId(MProduct.Table_ID, getTrxName());
assertEquals(allReportCount+1, allReportCount1, "Unexpected all archive report counts by table");
int[] recordCounts1 = MArchive.getReportAndDocumentCountByRecordId(MProduct.Table_ID, DictionaryIDs.M_Product.AZALEA_BUSH.id, getTrxName());
assertEquals(recordCounts[0]+1, recordCounts1[0], "Unexpected archive report counts by table and record id");
assertEquals(recordCounts[1], recordCounts1[1], "Unexpected archive document counts by table and record id");
marchive = new MArchive(Env.getCtx(), 0, getTrxName());
marchive.setAD_Table_ID(MProduct.Table_ID);
marchive.setIsReport(false);
marchive.setName(getClass().getName());
marchive.setRecord_ID(DictionaryIDs.M_Product.AZALEA_BUSH.id);
marchive.setBinaryData("test1".getBytes());
marchive.saveEx();
recordCounts1 = MArchive.getReportAndDocumentCountByRecordId(MProduct.Table_ID, DictionaryIDs.M_Product.AZALEA_BUSH.id, getTrxName());
assertEquals(recordCounts[0]+1, recordCounts1[0], "Unexpected archive report counts by table and record id");
assertEquals(recordCounts[1]+1, recordCounts1[1], "Unexpected archive document counts by table and record id");
}
}