Recommit to recover history on files modified integrating libero
This commit is contained in:
parent
089bfcd9b5
commit
dceffbc8e8
|
|
@ -0,0 +1,104 @@
|
||||||
|
package org.compiere.model;
|
||||||
|
|
||||||
|
import java.sql.PreparedStatement;
|
||||||
|
import java.sql.ResultSet;
|
||||||
|
import java.sql.SQLException;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Properties;
|
||||||
|
import java.util.logging.Level;
|
||||||
|
|
||||||
|
import org.compiere.util.CLogger;
|
||||||
|
import org.compiere.util.DB;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Trifon N. Trifonov
|
||||||
|
*/
|
||||||
|
public class MReplicationStrategy extends X_AD_ReplicationStrategy {
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
/** Static Logger */
|
||||||
|
private static CLogger s_log = CLogger.getCLogger (MReplicationStrategy.class);
|
||||||
|
|
||||||
|
|
||||||
|
public MReplicationStrategy(Properties ctx, int AD_ReplicationStrategy_ID, String trxName) {
|
||||||
|
super(ctx, AD_ReplicationStrategy_ID, trxName);
|
||||||
|
}
|
||||||
|
|
||||||
|
public X_AD_ReplicationTable[] getReplicationTables() {
|
||||||
|
List<X_AD_ReplicationTable> resultList = new ArrayList<X_AD_ReplicationTable>();
|
||||||
|
|
||||||
|
StringBuffer sql = new StringBuffer("SELECT * ")
|
||||||
|
.append(" FROM ").append(X_AD_ReplicationTable.Table_Name)
|
||||||
|
.append(" WHERE ").append(X_AD_ReplicationTable.COLUMNNAME_AD_ReplicationStrategy_ID).append("=?") // #1
|
||||||
|
.append(" AND IsActive = ?") // #2
|
||||||
|
// .append(" ORDER BY ").append(orderBy)
|
||||||
|
;
|
||||||
|
PreparedStatement pstmt = null;
|
||||||
|
X_AD_ReplicationTable rplTable = null;
|
||||||
|
try {
|
||||||
|
pstmt = DB.prepareStatement (sql.toString(), get_TrxName());
|
||||||
|
pstmt.setInt(1, getAD_ReplicationStrategy_ID());
|
||||||
|
pstmt.setString(2, "Y");
|
||||||
|
ResultSet rs = pstmt.executeQuery ();
|
||||||
|
while ( rs.next() ) {
|
||||||
|
rplTable = new X_AD_ReplicationTable (getCtx(), rs, get_TrxName());
|
||||||
|
resultList.add(rplTable);
|
||||||
|
}
|
||||||
|
rs.close ();
|
||||||
|
pstmt.close ();
|
||||||
|
pstmt = null;
|
||||||
|
} catch (SQLException e) {
|
||||||
|
s_log.log(Level.SEVERE, sql.toString(), e);
|
||||||
|
} finally {
|
||||||
|
try {
|
||||||
|
if (pstmt != null) pstmt.close ();
|
||||||
|
pstmt = null;
|
||||||
|
} catch (Exception e) { pstmt = null; }
|
||||||
|
}
|
||||||
|
|
||||||
|
X_AD_ReplicationTable[] result = (X_AD_ReplicationTable[])resultList.toArray( new X_AD_ReplicationTable[0]);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
public X_AD_ReplicationDocument[] getReplicationDocuments() {
|
||||||
|
List<X_AD_ReplicationDocument> resultList = new ArrayList<X_AD_ReplicationDocument>();
|
||||||
|
|
||||||
|
StringBuffer sql = new StringBuffer("SELECT * ")
|
||||||
|
.append(" FROM ").append(X_AD_ReplicationDocument.Table_Name)
|
||||||
|
.append(" WHERE ").append(X_AD_ReplicationDocument.COLUMNNAME_AD_ReplicationStrategy_ID).append("=?") // #1
|
||||||
|
.append(" AND IsActive = ?") // #2
|
||||||
|
// .append(" ORDER BY ").append(orderBy)
|
||||||
|
;
|
||||||
|
PreparedStatement pstmt = null;
|
||||||
|
X_AD_ReplicationDocument rplDocument = null;
|
||||||
|
try {
|
||||||
|
pstmt = DB.prepareStatement (sql.toString(), get_TrxName());
|
||||||
|
pstmt.setInt(1, getAD_ReplicationStrategy_ID());
|
||||||
|
pstmt.setString(2, "Y");
|
||||||
|
ResultSet rs = pstmt.executeQuery ();
|
||||||
|
while ( rs.next() ) {
|
||||||
|
rplDocument = new X_AD_ReplicationDocument (getCtx(), rs, get_TrxName());
|
||||||
|
resultList.add(rplDocument);
|
||||||
|
}
|
||||||
|
rs.close ();
|
||||||
|
pstmt.close ();
|
||||||
|
pstmt = null;
|
||||||
|
} catch (SQLException e) {
|
||||||
|
s_log.log(Level.SEVERE, sql.toString(), e);
|
||||||
|
} finally {
|
||||||
|
try {
|
||||||
|
if (pstmt != null) pstmt.close ();
|
||||||
|
pstmt = null;
|
||||||
|
} catch (Exception e) { pstmt = null; }
|
||||||
|
}
|
||||||
|
|
||||||
|
X_AD_ReplicationDocument[] result = (X_AD_ReplicationDocument[])resultList.toArray( new X_AD_ReplicationDocument[0]);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,56 @@
|
||||||
|
CREATE OR REPLACE VIEW RV_OPENITEMTODATE
|
||||||
|
(AD_ORG_ID, AD_CLIENT_ID, DOCUMENTNO, C_INVOICE_ID, C_ORDER_ID,
|
||||||
|
C_BPARTNER_ID, ISSOTRX, DATEINVOICED, DATEACCT, NETDAYS,
|
||||||
|
DUEDATE, DAYSDUE, DISCOUNTDATE, DISCOUNTAMT, GRANDTOTAL,
|
||||||
|
--PAIDAMT, OPENAMT,
|
||||||
|
C_CURRENCY_ID, C_CONVERSIONTYPE_ID, C_PAYMENTTERM_ID,
|
||||||
|
ISPAYSCHEDULEVALID, C_INVOICEPAYSCHEDULE_ID, INVOICECOLLECTIONTYPE, C_CAMPAIGN_ID, C_PROJECT_ID,
|
||||||
|
C_ACTIVITY_ID)
|
||||||
|
AS
|
||||||
|
SELECT i.AD_Org_ID, i.AD_Client_ID,
|
||||||
|
i.DocumentNo, i.C_Invoice_ID, i.C_Order_ID, i.C_BPartner_ID, i.IsSOTrx,
|
||||||
|
i.DateInvoiced, i.DateAcct,
|
||||||
|
p.NetDays,
|
||||||
|
paymentTermDueDate(i.C_PaymentTerm_ID, i.DateInvoiced) AS DueDate,
|
||||||
|
paymentTermDueDays(i.C_PaymentTerm_ID, i.DateInvoiced, getdate()) AS DaysDue,
|
||||||
|
addDays(i.DateInvoiced,p.DiscountDays) AS DiscountDate,
|
||||||
|
ROUND(i.GrandTotal*p.Discount/100,2) AS DiscountAmt,
|
||||||
|
i.GrandTotal,
|
||||||
|
--invoicePaid(i.C_Invoice_ID, i.C_Currency_ID, 1) AS PaidAmt,
|
||||||
|
--invoiceOpen(i.C_Invoice_ID,0) AS OpenAmt,
|
||||||
|
i.C_Currency_ID, i.C_ConversionType_ID,
|
||||||
|
i.C_PaymentTerm_ID,
|
||||||
|
i.IsPayScheduleValid, cast(null as number) AS C_InvoicePaySchedule_ID, i.InvoiceCollectionType,
|
||||||
|
i.C_Campaign_ID, i.C_Project_ID, i.C_Activity_ID
|
||||||
|
FROM RV_C_Invoice i
|
||||||
|
INNER JOIN C_PaymentTerm p ON (i.C_PaymentTerm_ID=p.C_PaymentTerm_ID)
|
||||||
|
WHERE -- i.IsPaid='N'
|
||||||
|
--invoiceOpen(i.C_Invoice_ID,0) <> 0 AND
|
||||||
|
i.IsPayScheduleValid<>'Y'
|
||||||
|
AND i.DocStatus<>'DR'
|
||||||
|
UNION
|
||||||
|
SELECT i.AD_Org_ID, i.AD_Client_ID,
|
||||||
|
i.DocumentNo, i.C_Invoice_ID, i.C_Order_ID, i.C_BPartner_ID, i.IsSOTrx,
|
||||||
|
i.DateInvoiced, i.DateAcct,
|
||||||
|
daysBetween(ips.DueDate,i.DateInvoiced) AS NetDays,
|
||||||
|
ips.DueDate,
|
||||||
|
daysBetween(getdate(),ips.DueDate) AS DaysDue,
|
||||||
|
ips.DiscountDate,
|
||||||
|
ips.DiscountAmt,
|
||||||
|
ips.DueAmt AS GrandTotal,
|
||||||
|
-- invoicePaid(i.C_Invoice_ID, i.C_Currency_ID, 1) AS PaidAmt,
|
||||||
|
-- invoiceOpen(i.C_Invoice_ID, ips.C_InvoicePaySchedule_ID) AS OpenAmt,
|
||||||
|
i.C_Currency_ID, i.C_ConversionType_ID,
|
||||||
|
i.C_PaymentTerm_ID,
|
||||||
|
i.IsPayScheduleValid, ips.C_InvoicePaySchedule_ID, i.InvoiceCollectionType,
|
||||||
|
i.C_Campaign_ID, i.C_Project_ID, i.C_Activity_ID
|
||||||
|
FROM RV_C_Invoice i
|
||||||
|
INNER JOIN C_InvoicePaySchedule ips ON (i.C_Invoice_ID=ips.C_Invoice_ID)
|
||||||
|
WHERE -- i.IsPaid='N'
|
||||||
|
--invoiceOpen(i.C_Invoice_ID,ips.C_InvoicePaySchedule_ID) <> 0 AND
|
||||||
|
i.IsPayScheduleValid='Y'
|
||||||
|
AND i.DocStatus<>'DR'
|
||||||
|
AND ips.IsValid='Y';
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -0,0 +1,56 @@
|
||||||
|
CREATE OR REPLACE VIEW RV_OPENITEMTODATE
|
||||||
|
(AD_ORG_ID, AD_CLIENT_ID, DOCUMENTNO, C_INVOICE_ID, C_ORDER_ID,
|
||||||
|
C_BPARTNER_ID, ISSOTRX, DATEINVOICED, DATEACCT, NETDAYS,
|
||||||
|
DUEDATE, DAYSDUE, DISCOUNTDATE, DISCOUNTAMT, GRANDTOTAL,
|
||||||
|
--PAIDAMT, OPENAMT,
|
||||||
|
C_CURRENCY_ID, C_CONVERSIONTYPE_ID, C_PAYMENTTERM_ID,
|
||||||
|
ISPAYSCHEDULEVALID, C_INVOICEPAYSCHEDULE_ID, INVOICECOLLECTIONTYPE, C_CAMPAIGN_ID, C_PROJECT_ID,
|
||||||
|
C_ACTIVITY_ID)
|
||||||
|
AS
|
||||||
|
SELECT i.AD_Org_ID, i.AD_Client_ID,
|
||||||
|
i.DocumentNo, i.C_Invoice_ID, i.C_Order_ID, i.C_BPartner_ID, i.IsSOTrx,
|
||||||
|
i.DateInvoiced, i.DateAcct,
|
||||||
|
p.NetDays,
|
||||||
|
paymentTermDueDate(i.C_PaymentTerm_ID, i.DateInvoiced) AS DueDate,
|
||||||
|
paymentTermDueDays(i.C_PaymentTerm_ID, i.DateInvoiced, getdate()) AS DaysDue,
|
||||||
|
addDays(i.DateInvoiced,p.DiscountDays) AS DiscountDate,
|
||||||
|
ROUND(i.GrandTotal*p.Discount/100,2) AS DiscountAmt,
|
||||||
|
i.GrandTotal,
|
||||||
|
--invoicePaid(i.C_Invoice_ID, i.C_Currency_ID, 1) AS PaidAmt,
|
||||||
|
--invoiceOpen(i.C_Invoice_ID,0) AS OpenAmt,
|
||||||
|
i.C_Currency_ID, i.C_ConversionType_ID,
|
||||||
|
i.C_PaymentTerm_ID,
|
||||||
|
i.IsPayScheduleValid, cast(null as numeric) AS C_InvoicePaySchedule_ID, i.InvoiceCollectionType,
|
||||||
|
i.C_Campaign_ID, i.C_Project_ID, i.C_Activity_ID
|
||||||
|
FROM RV_C_Invoice i
|
||||||
|
INNER JOIN C_PaymentTerm p ON (i.C_PaymentTerm_ID=p.C_PaymentTerm_ID)
|
||||||
|
WHERE -- i.IsPaid='N'
|
||||||
|
--invoiceOpen(i.C_Invoice_ID,0) <> 0 AND
|
||||||
|
i.IsPayScheduleValid<>'Y'
|
||||||
|
AND i.DocStatus<>'DR'
|
||||||
|
UNION
|
||||||
|
SELECT i.AD_Org_ID, i.AD_Client_ID,
|
||||||
|
i.DocumentNo, i.C_Invoice_ID, i.C_Order_ID, i.C_BPartner_ID, i.IsSOTrx,
|
||||||
|
i.DateInvoiced, i.DateAcct,
|
||||||
|
daysBetween(ips.DueDate,i.DateInvoiced) AS NetDays,
|
||||||
|
ips.DueDate,
|
||||||
|
daysBetween(getdate(),ips.DueDate) AS DaysDue,
|
||||||
|
ips.DiscountDate,
|
||||||
|
ips.DiscountAmt,
|
||||||
|
ips.DueAmt AS GrandTotal,
|
||||||
|
--invoicePaid(i.C_Invoice_ID, i.C_Currency_ID, 1) AS PaidAmt,
|
||||||
|
--invoiceOpen(i.C_Invoice_ID, ips.C_InvoicePaySchedule_ID) AS OpenAmt,
|
||||||
|
i.C_Currency_ID, i.C_ConversionType_ID,
|
||||||
|
i.C_PaymentTerm_ID,
|
||||||
|
i.IsPayScheduleValid, ips.C_InvoicePaySchedule_ID, i.InvoiceCollectionType,
|
||||||
|
i.C_Campaign_ID, i.C_Project_ID, i.C_Activity_ID
|
||||||
|
FROM RV_C_Invoice i
|
||||||
|
INNER JOIN C_InvoicePaySchedule ips ON (i.C_Invoice_ID=ips.C_Invoice_ID)
|
||||||
|
WHERE -- i.IsPaid='N'
|
||||||
|
--invoiceOpen(i.C_Invoice_ID,ips.C_InvoicePaySchedule_ID) <> 0 AND
|
||||||
|
i.IsPayScheduleValid='Y'
|
||||||
|
AND i.DocStatus<>'DR'
|
||||||
|
AND ips.IsValid='Y';
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -0,0 +1,106 @@
|
||||||
|
/**********************************************************************
|
||||||
|
* This file is part of Adempiere ERP Bazaar *
|
||||||
|
* http://www.adempiere.org *
|
||||||
|
* *
|
||||||
|
* Copyright (C) Trifon Trifonov. *
|
||||||
|
* 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: *
|
||||||
|
* - Trifon Trifonov (trifonnt@users.sourceforge.net) *
|
||||||
|
* *
|
||||||
|
* Sponsors: *
|
||||||
|
* - E-evolution (http://www.e-evolution.com) *
|
||||||
|
***********************************************************************/
|
||||||
|
package org.adempiere.server;
|
||||||
|
|
||||||
|
import javax.xml.parsers.*;
|
||||||
|
import org.w3c.dom.*;
|
||||||
|
import org.xml.sax.*;
|
||||||
|
import java.io.*;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Trifon N. Trifonov
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class JAXPParserMaker {
|
||||||
|
|
||||||
|
public static StringBuffer text = new StringBuffer("<?xml version=\"1.0\" encoding=\"UTF-8\"?>")
|
||||||
|
.append("<C_BPartner AD_Client_Value=\"GardenWorld\" Version=\"3.2.0\">")
|
||||||
|
.append(" <AD_Client_ID>")
|
||||||
|
.append(" <AD_Client_Value>GardenWorld</AD_Client_Value>")
|
||||||
|
.append(" </AD_Client_ID>")
|
||||||
|
.append(" <AD_Org_ID>")
|
||||||
|
.append(" <Value>0</Value>")
|
||||||
|
.append(" <AD_Client_ID>")
|
||||||
|
.append(" <AD_Client_Value>SYSTEM</AD_Client_Value>")
|
||||||
|
.append(" </AD_Client_ID>")
|
||||||
|
.append(" </AD_Org_ID>")
|
||||||
|
.append(" <Value>C&W-test05</Value>")
|
||||||
|
.append(" <Name>C&W Construction-05</Name>")
|
||||||
|
.append(" <C_BP_Group_ID>")
|
||||||
|
.append(" <Value>Standard</Value>")
|
||||||
|
.append(" <AD_Client_ID>")
|
||||||
|
.append(" <AD_Client_Value>GardenWorld</AD_Client_Value>")
|
||||||
|
.append(" </AD_Client_ID>")
|
||||||
|
.append(" </C_BP_Group_ID>")
|
||||||
|
.append(" <Created DateFormat=\"MM/dd/yyyy hh:mm:ss\">04/11/2001 09:11:36</Created>")
|
||||||
|
.append(" <CreatedBy>")
|
||||||
|
.append(" <Name>SuperUser</Name>")
|
||||||
|
.append(" <AD_Client_ID>")
|
||||||
|
.append(" <AD_Client_Value>SYSTEM</AD_Client_Value>")
|
||||||
|
.append(" </AD_Client_ID>")
|
||||||
|
.append(" </CreatedBy>")
|
||||||
|
.append(" <Updated DateFormat=\"MM/dd/yyyy hh:mm:ss\">11/17/2007 01:49:50</Updated>")
|
||||||
|
.append(" <UpdatedBy>")
|
||||||
|
.append(" <Name>System</Name>")
|
||||||
|
.append(" <AD_Client_ID>")
|
||||||
|
.append(" <AD_Client_Value>SYSTEM</AD_Client_Value>")
|
||||||
|
.append(" </AD_Client_ID>")
|
||||||
|
.append(" </UpdatedBy>")
|
||||||
|
.append("</C_BPartner>")
|
||||||
|
;
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
|
||||||
|
try {
|
||||||
|
DocumentBuilderFactory builderFactory = DocumentBuilderFactory
|
||||||
|
.newInstance();
|
||||||
|
DocumentBuilder parser = builderFactory.newDocumentBuilder();
|
||||||
|
|
||||||
|
try {
|
||||||
|
// Read the entire document into memory
|
||||||
|
Document document = parser.parse( new InputSource(new StringReader( text.toString() ) ) );
|
||||||
|
|
||||||
|
System.out.println( "Document = " + document);
|
||||||
|
// work with the document...
|
||||||
|
} catch (SAXException e) {
|
||||||
|
System.err.println(e);
|
||||||
|
} catch (IOException e) {
|
||||||
|
System.err.println(e);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
} catch (ParserConfigurationException e) {
|
||||||
|
System.err.println("You need to install a JAXP aware parser.");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
@ -0,0 +1,124 @@
|
||||||
|
/**********************************************************************
|
||||||
|
* This file is part of Adempiere ERP Bazaar *
|
||||||
|
* http://www.adempiere.org *
|
||||||
|
* *
|
||||||
|
* Copyright (C) Trifon Trifonov. *
|
||||||
|
* 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: *
|
||||||
|
* - Trifon Trifonov (trifonnt@users.sourceforge.net) *
|
||||||
|
* *
|
||||||
|
* Sponsors: *
|
||||||
|
* - E-evolution (http://www.e-evolution.com/) *
|
||||||
|
**********************************************************************/
|
||||||
|
package org.adempiere.server;
|
||||||
|
|
||||||
|
import org.apache.activemq.ActiveMQConnectionFactory;
|
||||||
|
|
||||||
|
import javax.jms.Connection;
|
||||||
|
import javax.jms.Session;
|
||||||
|
import javax.jms.Destination;
|
||||||
|
import javax.jms.MessageProducer;
|
||||||
|
import javax.jms.DeliveryMode;
|
||||||
|
import javax.jms.TextMessage;
|
||||||
|
|
||||||
|
public class SimpleMessageToTopic {
|
||||||
|
|
||||||
|
private static final String TOPIC_NAME = "ExampleTopic";
|
||||||
|
|
||||||
|
private static StringBuffer text = new StringBuffer("<?xml version=\"1.0\" encoding=\"UTF-8\"?>")
|
||||||
|
.append("<C_BPartner AD_Client_Value=\"GardenWorld\" Version=\"3.2.0\">")
|
||||||
|
.append(" <AD_Client_ID>")
|
||||||
|
.append(" <AD_Client_Value>GardenWorld</AD_Client_Value>")
|
||||||
|
.append(" </AD_Client_ID>")
|
||||||
|
.append(" <AD_Org_ID>")
|
||||||
|
.append(" <Value>0</Value>")
|
||||||
|
.append(" <AD_Client_ID>")
|
||||||
|
.append(" <AD_Client_Value>SYSTEM</AD_Client_Value>")
|
||||||
|
.append(" </AD_Client_ID>")
|
||||||
|
.append(" </AD_Org_ID>")
|
||||||
|
.append(" <Value>C&W-test06</Value>")
|
||||||
|
.append(" <Name>C&W Construction-06</Name>")
|
||||||
|
.append(" <C_BP_Group_ID>")
|
||||||
|
.append(" <Value>Standard</Value>")
|
||||||
|
.append(" <AD_Client_ID>")
|
||||||
|
.append(" <AD_Client_Value>GardenWorld</AD_Client_Value>")
|
||||||
|
.append(" </AD_Client_ID>")
|
||||||
|
.append(" </C_BP_Group_ID>")
|
||||||
|
.append(" <Created DateFormat=\"MM/dd/yyyy hh:mm:ss\">04/11/2001 09:11:36</Created>")
|
||||||
|
.append(" <CreatedBy>")
|
||||||
|
.append(" <Name>SuperUser</Name>")
|
||||||
|
.append(" <AD_Client_ID>")
|
||||||
|
.append(" <AD_Client_Value>SYSTEM</AD_Client_Value>")
|
||||||
|
.append(" </AD_Client_ID>")
|
||||||
|
.append(" </CreatedBy>")
|
||||||
|
.append(" <Updated DateFormat=\"MM/dd/yyyy hh:mm:ss\">11/17/2007 01:49:50</Updated>")
|
||||||
|
.append(" <UpdatedBy>")
|
||||||
|
.append(" <Name>System</Name>")
|
||||||
|
.append(" <AD_Client_ID>")
|
||||||
|
.append(" <AD_Client_Value>SYSTEM</AD_Client_Value>")
|
||||||
|
.append(" </AD_Client_ID>")
|
||||||
|
.append(" </UpdatedBy>")
|
||||||
|
.append("</C_BPartner>")
|
||||||
|
;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
runTool("localhost", 61616);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void runTool(String host, int port) {
|
||||||
|
try {
|
||||||
|
// Create a ConnectionFactory
|
||||||
|
ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory(
|
||||||
|
"tcp://"+host+":"+port);
|
||||||
|
|
||||||
|
// Create a Connection
|
||||||
|
Connection connection = connectionFactory.createConnection();
|
||||||
|
connection.setClientID("GardenWorld");
|
||||||
|
connection.start();
|
||||||
|
|
||||||
|
// Create a Session
|
||||||
|
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
|
||||||
|
|
||||||
|
// Create the destination (Topic or Queue)
|
||||||
|
Destination destination = session.createTopic(TOPIC_NAME);
|
||||||
|
|
||||||
|
// Create a MessageProducer from the Session to the Topic or Queue
|
||||||
|
MessageProducer producer = session.createProducer(destination);
|
||||||
|
producer.setTimeToLive(10000);
|
||||||
|
producer.setDeliveryMode(DeliveryMode.PERSISTENT);
|
||||||
|
|
||||||
|
// Create a message
|
||||||
|
|
||||||
|
TextMessage message = session.createTextMessage(text.toString());
|
||||||
|
|
||||||
|
// Tell the producer to send the message
|
||||||
|
System.out.println("Sent message");
|
||||||
|
producer.send(message);
|
||||||
|
|
||||||
|
// Clean up
|
||||||
|
session.close();
|
||||||
|
connection.close();
|
||||||
|
} catch (Exception e) {
|
||||||
|
System.out.println("Caught: " + e);
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,57 @@
|
||||||
|
/**********************************************************************
|
||||||
|
* This file is part of Adempiere ERP Bazaar *
|
||||||
|
* http://www.adempiere.org *
|
||||||
|
* *
|
||||||
|
* Copyright (C) Trifon Trifonov. *
|
||||||
|
* 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: *
|
||||||
|
* - Trifon Trifonov (trifonnt@users.sourceforge.net) *
|
||||||
|
* *
|
||||||
|
* Sponsors: *
|
||||||
|
* - E-evolution (http://www.e-evolution.com) *
|
||||||
|
***********************************************************************/
|
||||||
|
package org.adempiere.server.rpl;
|
||||||
|
|
||||||
|
import java.util.Properties;
|
||||||
|
|
||||||
|
import org.compiere.server.ReplicationProcessor;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Interface for Import processor
|
||||||
|
* @author Trifon Trifonov
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public interface IImportProcessor {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param ctx
|
||||||
|
* @param expProcessor
|
||||||
|
* @param trxName
|
||||||
|
* @return void
|
||||||
|
* @throws Exception
|
||||||
|
*/
|
||||||
|
public void process(Properties ctx, ReplicationProcessor replicationProcessor, String trxName) throws Exception;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @throws Exception
|
||||||
|
*/
|
||||||
|
public void stop() throws Exception;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,140 @@
|
||||||
|
/**********************************************************************
|
||||||
|
* This file is part of Adempiere ERP Bazaar *
|
||||||
|
* http://www.adempiere.org *
|
||||||
|
* *
|
||||||
|
* Copyright (C) Trifon Trifonov. *
|
||||||
|
* 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: *
|
||||||
|
* - Trifon Trifonov (trifonnt@users.sourceforge.net) *
|
||||||
|
* *
|
||||||
|
* Sponsors: *
|
||||||
|
* - E-evolution (http://www.e-evolution.com) *
|
||||||
|
***********************************************************************/
|
||||||
|
package org.adempiere.server.rpl;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.StringReader;
|
||||||
|
|
||||||
|
import javax.xml.parsers.DocumentBuilder;
|
||||||
|
import javax.xml.parsers.DocumentBuilderFactory;
|
||||||
|
import javax.xml.parsers.ParserConfigurationException;
|
||||||
|
import javax.xml.xpath.XPath;
|
||||||
|
import javax.xml.xpath.XPathConstants;
|
||||||
|
import javax.xml.xpath.XPathExpressionException;
|
||||||
|
import javax.xml.xpath.XPathFactory;
|
||||||
|
|
||||||
|
import org.w3c.dom.Document;
|
||||||
|
import org.w3c.dom.Element;
|
||||||
|
import org.w3c.dom.Node;
|
||||||
|
import org.w3c.dom.NodeList;
|
||||||
|
import org.xml.sax.InputSource;
|
||||||
|
import org.xml.sax.SAXException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Utility class which helps with XML processing.
|
||||||
|
*
|
||||||
|
* @author Trifon Trifonov
|
||||||
|
* @version $Id$
|
||||||
|
*/
|
||||||
|
public class XMLHelper {
|
||||||
|
|
||||||
|
private static XPath xPath = XPathFactory.newInstance().newXPath();
|
||||||
|
|
||||||
|
public static Element getElement(String xPathExpression, Node node)
|
||||||
|
throws XPathExpressionException {
|
||||||
|
return (Element) xPath.evaluate(xPathExpression, node,
|
||||||
|
XPathConstants.NODE);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Node getNode(String xPathExpression, Node node)
|
||||||
|
throws XPathExpressionException {
|
||||||
|
return (Node) xPath
|
||||||
|
.evaluate(xPathExpression, node, XPathConstants.NODE);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static NodeList getNodeList(String xPathExpression, Node node)
|
||||||
|
throws XPathExpressionException {
|
||||||
|
return (NodeList) xPath.evaluate(xPathExpression, node,
|
||||||
|
XPathConstants.NODESET);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Double getNumber(String xPathExpression, Node node)
|
||||||
|
throws XPathExpressionException {
|
||||||
|
return (Double) xPath.evaluate(xPathExpression, node,
|
||||||
|
XPathConstants.NUMBER);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String getString(String xPathExpression, Node node)
|
||||||
|
throws XPathExpressionException {
|
||||||
|
return (String) xPath.evaluate(xPathExpression, node,
|
||||||
|
XPathConstants.STRING);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Boolean getBoolean(String xPathExpression, Node node)
|
||||||
|
throws XPathExpressionException {
|
||||||
|
return (Boolean) xPath.evaluate(xPathExpression, node,
|
||||||
|
XPathConstants.BOOLEAN);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
public static Document createDocumentFromFile(String pathToXmlFile)
|
||||||
|
throws ParserConfigurationException, SAXException, IOException {
|
||||||
|
// path to file is global
|
||||||
|
String JAXP_SCHEMA_LANGUAGE = "http://java.sun.com/xml/jaxp/properties/schemaLanguage";
|
||||||
|
String W3C_XML_SCHEMA = "http://www.w3.org/2001/XMLSchema";
|
||||||
|
// String JAXP_SCHEMA_SOURCE = "http://java.sun.com/xml/jaxp/properties/schemaSource";
|
||||||
|
|
||||||
|
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
|
||||||
|
// validate against XML Schema in dbsql2xml.xsd
|
||||||
|
// documentBuilderFactory.setNamespaceAware(true);
|
||||||
|
|
||||||
|
//INFO change validation to true. Someday when xsd file is complete...
|
||||||
|
documentBuilderFactory.setValidating(false);
|
||||||
|
documentBuilderFactory.setAttribute(JAXP_SCHEMA_LANGUAGE, W3C_XML_SCHEMA);
|
||||||
|
// documentBuilderFactory.setAttribute(JAXP_SCHEMA_SOURCE, new File(pathToXsdFile));
|
||||||
|
DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
|
||||||
|
Document document = documentBuilder.parse(new File(pathToXmlFile));
|
||||||
|
|
||||||
|
return document;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Document createDocumentFromString(String str)
|
||||||
|
throws ParserConfigurationException, SAXException, IOException {
|
||||||
|
// path to file is global
|
||||||
|
// String JAXP_SCHEMA_LANGUAGE = "http://java.sun.com/xml/jaxp/properties/schemaLanguage";
|
||||||
|
// String W3C_XML_SCHEMA = "http://www.w3.org/2001/XMLSchema";
|
||||||
|
// String JAXP_SCHEMA_SOURCE = "http://java.sun.com/xml/jaxp/properties/schemaSource";
|
||||||
|
|
||||||
|
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
|
||||||
|
// validate against XML Schema in dbsql2xml.xsd
|
||||||
|
// documentBuilderFactory.setNamespaceAware(true);
|
||||||
|
|
||||||
|
//INFO change validation to true. Someday when xsd file is complete...
|
||||||
|
documentBuilderFactory.setValidating(false);
|
||||||
|
// documentBuilderFactory.setAttribute(JAXP_SCHEMA_LANGUAGE, W3C_XML_SCHEMA);
|
||||||
|
// documentBuilderFactory.setAttribute(JAXP_SCHEMA_SOURCE, new File(pathToXsdFile));
|
||||||
|
DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
|
||||||
|
Document document = documentBuilder.parse( new InputSource(new StringReader( str ) ) );
|
||||||
|
|
||||||
|
return document;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,89 @@
|
||||||
|
/**********************************************************************
|
||||||
|
* This file is part of Adempiere ERP Bazaar *
|
||||||
|
* http://www.adempiere.org *
|
||||||
|
* *
|
||||||
|
* Copyright (C) Trifon Trifonov. *
|
||||||
|
* 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: *
|
||||||
|
* - Trifon Trifonov (trifonnt@users.sourceforge.net) *
|
||||||
|
* *
|
||||||
|
* Sponsors: *
|
||||||
|
* - E-evolution (http://www.e-evolution.com/) *
|
||||||
|
**********************************************************************/
|
||||||
|
package org.adempiere.server.rpl.imp;
|
||||||
|
|
||||||
|
import java.util.Properties;
|
||||||
|
|
||||||
|
import org.adempiere.server.rpl.IImportProcessor;
|
||||||
|
import org.adempiere.server.rpl.XMLHelper;
|
||||||
|
import org.eevolution.model.MIMPProcessor;
|
||||||
|
import org.eevolution.model.X_IMP_ProcessorParameter;
|
||||||
|
import org.compiere.server.ReplicationProcessor;
|
||||||
|
import org.compiere.util.CLogger;
|
||||||
|
import org.w3c.dom.Document;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Trifon N. Trifonov
|
||||||
|
* @version $Id:$
|
||||||
|
*/
|
||||||
|
public class FileImportProcessor implements IImportProcessor {
|
||||||
|
|
||||||
|
/** Logger */
|
||||||
|
protected CLogger log = CLogger.getCLogger (FileImportProcessor.class);
|
||||||
|
|
||||||
|
public void process(Properties ctx, ReplicationProcessor replicationProcessor, String trxName)
|
||||||
|
throws Exception {
|
||||||
|
|
||||||
|
MIMPProcessor impProcessor = replicationProcessor.getMImportProcessor();
|
||||||
|
|
||||||
|
X_IMP_ProcessorParameter[] processorParameters = impProcessor.getIMP_ProcessorParameters(trxName);
|
||||||
|
|
||||||
|
String fileName = null;
|
||||||
|
if (processorParameters != null && processorParameters.length > 0) {
|
||||||
|
for (int i = 0; i < processorParameters.length; i++) {
|
||||||
|
log.info("ProcesParameter Value = " + processorParameters[i].getValue());
|
||||||
|
log.info("ProcesParameter ParameterValue = " + processorParameters[i].getParameterValue());
|
||||||
|
if (processorParameters[i].getValue().equals("fileName")) {
|
||||||
|
fileName = processorParameters[i].getParameterValue();
|
||||||
|
} else {
|
||||||
|
// Some other mandatory parameter here
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (fileName == null || fileName.length() == 0) {
|
||||||
|
throw new Exception("Missing IMP_ProcessorParameter with key 'fileName'!");
|
||||||
|
}
|
||||||
|
|
||||||
|
Document documentToBeImported = XMLHelper.createDocumentFromFile(fileName);
|
||||||
|
StringBuffer result = new StringBuffer();
|
||||||
|
|
||||||
|
ImportHelper impHelper = new ImportHelper( ctx );
|
||||||
|
impHelper.importXMLDocument(result, documentToBeImported, trxName );
|
||||||
|
|
||||||
|
// addLog(0, null, null, Msg.getMsg(ctx, "ImportModelProcessResult") + "\n" + result.toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
public void stop() throws Exception {
|
||||||
|
// do nothing!
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,604 @@
|
||||||
|
/**********************************************************************
|
||||||
|
* This file is part of Adempiere ERP Bazaar *
|
||||||
|
* http://www.adempiere.org *
|
||||||
|
* *
|
||||||
|
* Copyright (C) Trifon Trifonov. *
|
||||||
|
* 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: *
|
||||||
|
* - Trifon Trifonov (trifonnt@users.sourceforge.net) *
|
||||||
|
* *
|
||||||
|
* Sponsors: *
|
||||||
|
* - E-evolution (http://www.e-evolution.com/) *
|
||||||
|
**********************************************************************/
|
||||||
|
package org.adempiere.server.rpl.imp;
|
||||||
|
|
||||||
|
import java.math.BigDecimal;
|
||||||
|
import java.sql.PreparedStatement;
|
||||||
|
import java.sql.ResultSet;
|
||||||
|
import java.sql.SQLException;
|
||||||
|
import java.sql.Timestamp;
|
||||||
|
import java.text.DateFormat;
|
||||||
|
import java.text.ParseException;
|
||||||
|
import java.text.SimpleDateFormat;
|
||||||
|
import java.util.Properties;
|
||||||
|
import java.util.logging.Level;
|
||||||
|
|
||||||
|
import javax.xml.xpath.XPathExpressionException;
|
||||||
|
|
||||||
|
import org.adempiere.server.rpl.XMLHelper;
|
||||||
|
import org.compiere.model.MClient;
|
||||||
|
import org.compiere.model.MColumn;
|
||||||
|
import org.eevolution.model.MEXPFormat;
|
||||||
|
import org.eevolution.model.MEXPFormatLine;
|
||||||
|
import org.compiere.model.MTable;
|
||||||
|
import org.compiere.model.PO;
|
||||||
|
import org.compiere.model.X_AD_Client;
|
||||||
|
import org.eevolution.model.X_EXP_FormatLine;
|
||||||
|
import org.compiere.util.CLogger;
|
||||||
|
import org.compiere.util.DB;
|
||||||
|
import org.compiere.util.DisplayType;
|
||||||
|
import org.compiere.util.Env;
|
||||||
|
import org.compiere.util.Msg;
|
||||||
|
import org.w3c.dom.Document;
|
||||||
|
import org.w3c.dom.Element;
|
||||||
|
import org.w3c.dom.NodeList;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Trifon N. Trifonov
|
||||||
|
*/
|
||||||
|
public class ImportHelper {
|
||||||
|
|
||||||
|
/** Instance Logger */
|
||||||
|
private CLogger log = CLogger.getCLogger(ImportHelper.class);
|
||||||
|
|
||||||
|
/** Static Logger */
|
||||||
|
private static CLogger s_log = CLogger.getCLogger(ImportHelper.class);
|
||||||
|
|
||||||
|
/** Date Time Format */
|
||||||
|
private SimpleDateFormat m_dateTimeFormat = null;
|
||||||
|
|
||||||
|
/** Date Format */
|
||||||
|
private SimpleDateFormat m_dateFormat = null;
|
||||||
|
|
||||||
|
/** Custom Date Format */
|
||||||
|
private SimpleDateFormat m_customDateFormat = null;
|
||||||
|
|
||||||
|
/** Context */
|
||||||
|
private Properties ctx = null;
|
||||||
|
|
||||||
|
public ImportHelper(Properties ctx) {
|
||||||
|
this.ctx = ctx;
|
||||||
|
// Construct DateFromat and DateTimeFormat
|
||||||
|
m_dateTimeFormat = DisplayType.getDateFormat(DisplayType.DateTime, Env.getLanguage(ctx));
|
||||||
|
m_dateFormat = DisplayType.getDateFormat(DisplayType.Date, Env.getLanguage(ctx));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param ctx
|
||||||
|
* @param result
|
||||||
|
* @param documentToBeImported
|
||||||
|
* @param trxName
|
||||||
|
* @throws Exception
|
||||||
|
* @throws SQLException
|
||||||
|
* @throws XPathExpressionException
|
||||||
|
*/
|
||||||
|
public void importXMLDocument(StringBuffer result, Document documentToBeImported, String trxName)
|
||||||
|
throws Exception, SQLException, XPathExpressionException
|
||||||
|
{
|
||||||
|
//Element rootNode = importedDocument.getFirstChild();
|
||||||
|
Element rootElement = documentToBeImported.getDocumentElement();
|
||||||
|
//NodeList nl = rootElement.getChildNodes();
|
||||||
|
// iterate over all address nodes and find the one that has the correct addressee
|
||||||
|
//for (int i = 0; i < nl.getLength(); i++) { /* */ }
|
||||||
|
|
||||||
|
// Find which Export format to Load...
|
||||||
|
String AD_Client_Value = null;
|
||||||
|
//AD_Client_Value = XMLHelper.getString("@AD_Client_Value", rootNode);
|
||||||
|
AD_Client_Value = rootElement.getAttribute("AD_Client_Value");
|
||||||
|
log.info("AD_Client_Value = " + AD_Client_Value);
|
||||||
|
if (AD_Client_Value == null || "".equals(AD_Client_Value)) {
|
||||||
|
throw new Exception(Msg.getMsg(ctx, "XMLClientValueMandatory"));
|
||||||
|
}
|
||||||
|
String version = null;
|
||||||
|
version = rootElement.getAttribute("Version");
|
||||||
|
log.info("Version = " + version);
|
||||||
|
if (version == null || "".equals(version)) {
|
||||||
|
throw new Exception(Msg.getMsg(ctx, "XMLVersionAttributeMandatory"));
|
||||||
|
}
|
||||||
|
|
||||||
|
MClient client = null;
|
||||||
|
client = getAD_ClientByValue(ctx, AD_Client_Value, trxName);
|
||||||
|
if (client == null) {
|
||||||
|
throw new Exception(Msg.getMsg(ctx, "XMLClientNotFound"));
|
||||||
|
}
|
||||||
|
log.info(client.toString());
|
||||||
|
|
||||||
|
String EXP_Format_Value = null;
|
||||||
|
EXP_Format_Value = rootElement.getNodeName();
|
||||||
|
log.info("EXP_Format_Value = " + EXP_Format_Value);
|
||||||
|
|
||||||
|
MEXPFormat expFormat = null;
|
||||||
|
expFormat = MEXPFormat.getFormatByValueAD_Client_IDAndVersion(ctx, EXP_Format_Value, client.getAD_Client_ID(), version, trxName);
|
||||||
|
if (expFormat == null || expFormat.getEXP_Format_ID() == 0) {
|
||||||
|
// Fall back to SYSTEM Client.
|
||||||
|
// Try to search Export format defined for SYSTEM Client!!!
|
||||||
|
MClient systemClient = null;
|
||||||
|
systemClient = MClient.get(ctx, 0);
|
||||||
|
if (systemClient == null) {
|
||||||
|
throw new Exception(Msg.getMsg(ctx, "XMLClientNotFound"));
|
||||||
|
}
|
||||||
|
log.info(systemClient.toString());
|
||||||
|
expFormat = MEXPFormat.getFormatByValueAD_Client_IDAndVersion(ctx, EXP_Format_Value, systemClient.getAD_Client_ID(), version, trxName);
|
||||||
|
}
|
||||||
|
if (expFormat == null || expFormat.getEXP_Format_ID() == 0) {
|
||||||
|
throw new Exception(Msg.getMsg(ctx, "EXPFormatNotFound"));
|
||||||
|
}
|
||||||
|
log.info("expFormat = " + expFormat.toString());
|
||||||
|
|
||||||
|
PO po = importElement(ctx, result, rootElement, expFormat, trxName);
|
||||||
|
|
||||||
|
// Here must invoke other method else we get cycle...
|
||||||
|
boolean resultSave = po.saveReplica(true);
|
||||||
|
result.append("ResultSave=").append(resultSave).append("; ");
|
||||||
|
if (resultSave) {
|
||||||
|
// Success in save
|
||||||
|
} else {
|
||||||
|
// Failed in save
|
||||||
|
throw new Exception(Msg.getMsg(ctx, "EXPFormatFailedSave"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param result
|
||||||
|
* @param rootElement
|
||||||
|
* @param expFormat
|
||||||
|
* @throws Exception
|
||||||
|
* @throws XPathExpressionException
|
||||||
|
*/
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
private PO importElement(Properties ctx, StringBuffer result, Element rootElement,
|
||||||
|
MEXPFormat expFormat, String trxName) throws Exception, XPathExpressionException
|
||||||
|
{
|
||||||
|
// get AD_Table ID from export Format.
|
||||||
|
int AD_Table_ID = expFormat.getAD_Table_ID();
|
||||||
|
|
||||||
|
// Load appropriate Model class...
|
||||||
|
MTable table = MTable.get(ctx, AD_Table_ID);
|
||||||
|
log.info("Table = " + table);
|
||||||
|
|
||||||
|
int record_ID = 0;
|
||||||
|
// Find Record_ID by ???Value??? In fact by Columns set as Part Of Unique Index in Export Format!
|
||||||
|
record_ID = getID(ctx, expFormat, rootElement, rootElement.getNodeName(), trxName);
|
||||||
|
log.info("record_ID = " + record_ID);
|
||||||
|
|
||||||
|
PO po = table.getPO(record_ID, trxName);
|
||||||
|
log.info("PO.toString() = " + po.toString());
|
||||||
|
|
||||||
|
if (po.get_KeyColumns().length > 1 || po.get_KeyColumns().length < 1) {
|
||||||
|
throw new Exception(Msg.getMsg(ctx, "EDIMultiColumnNotSupported"));
|
||||||
|
}
|
||||||
|
|
||||||
|
StringBuffer orderBy = new StringBuffer(X_EXP_FormatLine.COLUMNNAME_IsMandatory).append(" DESC ")
|
||||||
|
.append(", ").append(X_EXP_FormatLine.COLUMNNAME_Position)
|
||||||
|
;
|
||||||
|
MEXPFormatLine[] formatLines = expFormat.getFormatLinesOrderedBy(orderBy.toString());
|
||||||
|
if (formatLines == null || formatLines.length < 1) {
|
||||||
|
throw new Exception(Msg.getMsg(ctx, "EXPFormatNoLines"));
|
||||||
|
}
|
||||||
|
Object value = null;
|
||||||
|
// Iterate all Export Format Lines (even this marked as part of unique index)
|
||||||
|
// and set value of column!
|
||||||
|
for (int i = 0; i < formatLines.length; i++) {
|
||||||
|
log.info("=================== Beginnig of Format Line ===============================");
|
||||||
|
log.info("formatLines["+i+"]=[" + formatLines[i].toString() + "]");
|
||||||
|
|
||||||
|
if (MEXPFormatLine.TYPE_XMLElement.equals(formatLines[i].getType())) {
|
||||||
|
// XML Element
|
||||||
|
value = XMLHelper.getString(formatLines[i].getValue(), rootElement);
|
||||||
|
log.info("value=[" + value + "]");
|
||||||
|
|
||||||
|
} else if (MEXPFormatLine.TYPE_ReferencedEXPFormat.equals(formatLines[i].getType())) {
|
||||||
|
// Referenced Export Format
|
||||||
|
/* <C_BPartner>
|
||||||
|
<AD_Org>
|
||||||
|
<Value>0</Value>
|
||||||
|
<AD_Client_Value>
|
||||||
|
<AD_Client_Value>SYSTEM</AD_Client_Value>
|
||||||
|
</AD_Client_Value>
|
||||||
|
</AD_Org>
|
||||||
|
...
|
||||||
|
<C_BPartner> */
|
||||||
|
|
||||||
|
MEXPFormat referencedExpFormat = new MEXPFormat(ctx, formatLines[i].getEXP_EmbeddedFormat_ID(), trxName);
|
||||||
|
log.info("referencedExpFormat = " + referencedExpFormat);
|
||||||
|
|
||||||
|
int refRecord_ID = 0;
|
||||||
|
// Find Record_ID by ???Value??? In fact by Columns set as Part Of Unique Index in Export Format!
|
||||||
|
String xPath = null;
|
||||||
|
//xPath = ""+rootElement.getNodeName() + "/" + formatLines[i].getValue() + ""; // Do not work
|
||||||
|
xPath = "" + formatLines[i].getValue() + ""; //
|
||||||
|
|
||||||
|
log.info("SEARCH FOR XML Element = " + xPath);
|
||||||
|
Element referencedNode = XMLHelper.getElement(xPath, rootElement);
|
||||||
|
|
||||||
|
//NodeList nodeList = XMLHelper.getNodeList(xPath, rootElement);
|
||||||
|
//referencedNode = (Element)nodeList.item(0);
|
||||||
|
|
||||||
|
log.info("referencedNode = " + referencedNode);
|
||||||
|
|
||||||
|
refRecord_ID = getID(ctx, referencedExpFormat, referencedNode, formatLines[i].getValue(), trxName);
|
||||||
|
log.info("refRecord_ID = " + refRecord_ID);
|
||||||
|
|
||||||
|
value = new Integer(refRecord_ID);
|
||||||
|
log.info("value=[" + value + "]");
|
||||||
|
} else if (MEXPFormatLine.TYPE_EmbeddedEXPFormat.equals(formatLines[i].getType())) {
|
||||||
|
boolean resSave = false;
|
||||||
|
if (po.get_ID() == 0) {
|
||||||
|
resSave = po.saveReplica(true);
|
||||||
|
result.append("ResultSave-MasterPO=").append(resSave).append("; ");
|
||||||
|
log.info("ResultSave-MasterPO = " + resSave);
|
||||||
|
} else {
|
||||||
|
resSave = true;
|
||||||
|
}
|
||||||
|
if (resSave) {
|
||||||
|
// Success in save
|
||||||
|
} else {
|
||||||
|
throw new Exception("Failed to save Master PO");
|
||||||
|
}
|
||||||
|
// Embedded Export Format
|
||||||
|
/* <C_Order>
|
||||||
|
<DocumentNo>GardenWorls</DocumentNo>
|
||||||
|
...
|
||||||
|
... <-- MUST save Master Record here! Else we can't set orderLine.setC_Order_ID(..)
|
||||||
|
<C_OrderLine>...</C_OrderLine>
|
||||||
|
<C_OrderLine>...</C_OrderLine>
|
||||||
|
</C_Order> */
|
||||||
|
MEXPFormat referencedExpFormat = new MEXPFormat(ctx, formatLines[i].getEXP_EmbeddedFormat_ID(), trxName);
|
||||||
|
log.info("embeddedExpFormat = " + referencedExpFormat);
|
||||||
|
|
||||||
|
NodeList nodeList = XMLHelper.getNodeList("/"+rootElement.getNodeName() + "/" + formatLines[i].getValue(), rootElement);
|
||||||
|
for (int j = 0; j < nodeList.getLength(); j++) {
|
||||||
|
Element referencedElement = (Element)nodeList.item(j);
|
||||||
|
log.info("EmbeddedEXPFormat - referencedElement.getNodeName = " + referencedElement.getNodeName());
|
||||||
|
|
||||||
|
PO embeddedPo = null;
|
||||||
|
// Import embedded PO
|
||||||
|
log.info("=== BEGIN RECURSION CALL ===");
|
||||||
|
embeddedPo = importElement(ctx, result, referencedElement, referencedExpFormat, trxName);
|
||||||
|
log.info("embeddedPo = " + embeddedPo);
|
||||||
|
|
||||||
|
//embeddedPo.set_CustomColumn(po.get_KeyColumns()[0], po.get_ID());
|
||||||
|
//log.info("embeddedPo.set"+po.get_KeyColumns()[0]+" = [" + po.get_ID()+"]");
|
||||||
|
|
||||||
|
boolean rSave = embeddedPo.saveReplica(true);
|
||||||
|
result.append("ResultSave-EmbeddedPO=").append(rSave).append("; ");
|
||||||
|
}
|
||||||
|
|
||||||
|
} else if (MEXPFormatLine.TYPE_XMLAttribute.equals(formatLines[i].getType())) {
|
||||||
|
// XML Attribute
|
||||||
|
value = XMLHelper.getString("@" + formatLines[i].getValue(), rootElement);
|
||||||
|
log.info("value=[" + value + "]");
|
||||||
|
} else {
|
||||||
|
// Export Format Line is not one of two possible values...ERROR
|
||||||
|
throw new Exception(Msg.getMsg(ctx, "EXPFormatLineNonValidType"));
|
||||||
|
}
|
||||||
|
if (value == null) {
|
||||||
|
|
||||||
|
} else {
|
||||||
|
/* if (column.getColumnName().equals("AD_Client_ID")) {
|
||||||
|
//Env.setContext(Env.getCtx(), "#AD_Client_ID", value.toString());
|
||||||
|
}
|
||||||
|
if (column.getColumnName().equals("AD_Org_ID")) {
|
||||||
|
//Env.setContext(Env.getCtx(), "#AD_Org_ID", value.toString());
|
||||||
|
} */
|
||||||
|
if ( MEXPFormatLine.TYPE_EmbeddedEXPFormat.equals(formatLines[i].getType()) ) {
|
||||||
|
// do nothing
|
||||||
|
} else {
|
||||||
|
MColumn column = MColumn.get(ctx, formatLines[i].getAD_Column_ID());
|
||||||
|
log.info("column=[" + column + "]");
|
||||||
|
|
||||||
|
// Clazz
|
||||||
|
Class clazz = DisplayType.getClass(column.getAD_Reference_ID(), true);
|
||||||
|
// Handle Posted
|
||||||
|
if (column.getColumnName().equalsIgnoreCase("Posted")
|
||||||
|
|| column.getColumnName().equalsIgnoreCase("Processed")
|
||||||
|
|| column.getColumnName().equalsIgnoreCase("Processing"))
|
||||||
|
{
|
||||||
|
clazz = Boolean.class;
|
||||||
|
} else if (column.getColumnName().equalsIgnoreCase("Record_ID"))
|
||||||
|
{
|
||||||
|
clazz = Integer.class;
|
||||||
|
} else if (column.getColumnName().equalsIgnoreCase("AD_Language")
|
||||||
|
|| column.getColumnName().equalsIgnoreCase("EntityType"))
|
||||||
|
{
|
||||||
|
clazz = String.class;
|
||||||
|
}
|
||||||
|
log.info("clazz = " + clazz.getName());
|
||||||
|
// Handle Date and Time
|
||||||
|
value = handleDateTime(value, column, formatLines[i]);
|
||||||
|
|
||||||
|
log.info("formatLinesType = " + formatLines[i].getType());
|
||||||
|
if (MEXPFormatLine.TYPE_EmbeddedEXPFormat.equals( formatLines[i].getType() ) ) {
|
||||||
|
// DO NOTHING
|
||||||
|
throw new Exception("We can't be here!!!");
|
||||||
|
} else {
|
||||||
|
if (column.getAD_Reference_ID() == DisplayType.DateTime
|
||||||
|
|| column.getAD_Reference_ID() == DisplayType.Date
|
||||||
|
)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
po.set_ValueOfColumn(formatLines[i].getAD_Column_ID(), value);
|
||||||
|
log.info("Set value of column ["+column.getColumnName()+"]=["+value+"]");
|
||||||
|
} else if (column.getAD_Reference_ID() == DisplayType.ID
|
||||||
|
|| column.getAD_Reference_ID() == DisplayType.Integer
|
||||||
|
|| column.getAD_Reference_ID() == DisplayType.Search
|
||||||
|
|| column.getAD_Reference_ID() == DisplayType.TableDir
|
||||||
|
|| column.getAD_Reference_ID() == DisplayType.Table
|
||||||
|
)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
int intValue = Integer.parseInt(value.toString());
|
||||||
|
value = new Integer( intValue );
|
||||||
|
log.info("Abut to set int value of column ["+column.getColumnName()+"]=["+value+"]");
|
||||||
|
po.set_ValueOfColumn(formatLines[i].getAD_Column_ID(), intValue);
|
||||||
|
log.info("Set int value of column ["+column.getColumnName()+"]=["+value+"]");
|
||||||
|
} else if (column.getAD_Reference_ID() == DisplayType.Amount
|
||||||
|
|| column.getAD_Reference_ID() == DisplayType.Number
|
||||||
|
|| column.getAD_Reference_ID() == DisplayType.CostPrice
|
||||||
|
|| column.getAD_Reference_ID() == DisplayType.Quantity
|
||||||
|
)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
double doubleValue = Double.parseDouble(value.toString());
|
||||||
|
value = new BigDecimal(doubleValue);
|
||||||
|
//value = new Double( doubleValue );
|
||||||
|
log.info("About to set BigDecimal value of column ["+column.getColumnName()+"]=["+value+"]");
|
||||||
|
po.set_ValueOfColumn(formatLines[i].getAD_Column_ID(), value);
|
||||||
|
log.info("Set BigDecimal value of column ["+column.getColumnName()+"]=["+value+"]");
|
||||||
|
}
|
||||||
|
else if(column.getAD_Reference_ID() == DisplayType.YesNo)
|
||||||
|
{
|
||||||
|
po.set_ValueOfColumn(formatLines[i].getAD_Column_ID(), value);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
//
|
||||||
|
try {
|
||||||
|
log.info("About to set value of column ["+column.getColumnName()+"]=["+value+"]");
|
||||||
|
po.set_ValueOfColumn(formatLines[i].getAD_Column_ID(), clazz.cast(value));
|
||||||
|
log.info("Set value of column ["+column.getColumnName()+"]=["+value+"]");
|
||||||
|
} catch (ClassCastException ex) {
|
||||||
|
ex.printStackTrace();
|
||||||
|
throw new Exception(ex);
|
||||||
|
}
|
||||||
|
|
||||||
|
//po.set_ValueOfColumn(formatLines[i].getAD_Column_ID(), value);
|
||||||
|
}
|
||||||
|
result.append(column.getColumnName()).append("=").append(value).append("; ");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
return po;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static MClient getAD_ClientByValue(Properties ctx, String value, String trxName)
|
||||||
|
throws SQLException
|
||||||
|
{
|
||||||
|
MClient result = null;
|
||||||
|
|
||||||
|
StringBuffer sql = new StringBuffer("SELECT AD_Client_ID ")
|
||||||
|
.append(" FROM ").append(X_AD_Client.Table_Name)
|
||||||
|
.append(" WHERE ").append(X_AD_Client.COLUMNNAME_Value).append(" = ?")
|
||||||
|
// .append(" AND IsActive = ?")
|
||||||
|
;
|
||||||
|
//s_log.info(sql.toString());
|
||||||
|
s_log.info("Client_Value =[" + value + "]");
|
||||||
|
|
||||||
|
PreparedStatement pstmt = null;
|
||||||
|
try {
|
||||||
|
pstmt = DB.prepareStatement(sql.toString(), trxName);
|
||||||
|
pstmt.setString(1, value);
|
||||||
|
ResultSet rs = pstmt.executeQuery();
|
||||||
|
if (rs.next()) {
|
||||||
|
int AD_Client_ID = rs.getInt(1);
|
||||||
|
s_log.info("AD_Client_ID = " + AD_Client_ID);
|
||||||
|
result = new MClient(ctx, AD_Client_ID, trxName);
|
||||||
|
}
|
||||||
|
rs.close();
|
||||||
|
pstmt.close();
|
||||||
|
pstmt = null;
|
||||||
|
} catch (SQLException e) {
|
||||||
|
s_log.log(Level.SEVERE, sql.toString(), e);
|
||||||
|
throw e;
|
||||||
|
} finally {
|
||||||
|
try {
|
||||||
|
if (pstmt != null)
|
||||||
|
pstmt.close();
|
||||||
|
pstmt = null;
|
||||||
|
} catch (Exception e) {
|
||||||
|
pstmt = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getID(Properties ctx, MEXPFormat expFormat, Element rootElement, String rootNodeName, String trxName) throws Exception {
|
||||||
|
int result = 0;
|
||||||
|
|
||||||
|
if (expFormat == null || rootElement == null || rootNodeName == null) {
|
||||||
|
throw new IllegalArgumentException("expFormat, rootNode and RootnodeName can't be null!");
|
||||||
|
}
|
||||||
|
log.info("expFormat = " + expFormat);
|
||||||
|
log.info("rootNode.getNodeName() = " + rootElement.getNodeName());
|
||||||
|
log.info("rootNodeName = " + rootNodeName);
|
||||||
|
if (rootElement.getParentNode() != null) {
|
||||||
|
log.info("rootNode.ParentName = " + rootElement.getParentNode().getNodeName());
|
||||||
|
}
|
||||||
|
|
||||||
|
// get AD_Table ID from export Format.
|
||||||
|
int AD_Table_ID = expFormat.getAD_Table_ID();
|
||||||
|
|
||||||
|
// Load appropriate Model class...
|
||||||
|
MTable table = MTable.get(ctx, AD_Table_ID);
|
||||||
|
log.info("Table = " + table);
|
||||||
|
|
||||||
|
//Select * FROM table.getTableName() WHERE Value or ANY IDENTIFIER column
|
||||||
|
StringBuffer sql = new StringBuffer("SELECT * ")
|
||||||
|
.append(" FROM ").append(table.getTableName())
|
||||||
|
.append(" WHERE ")
|
||||||
|
;
|
||||||
|
// Get list with all Unique columns!
|
||||||
|
MEXPFormatLine[] uniqueFormatLines = expFormat.getUniqueColumns();
|
||||||
|
if (uniqueFormatLines == null || uniqueFormatLines.length < 1) {
|
||||||
|
throw new Exception(Msg.getMsg(ctx, "EXPFormatLineNoUniqueColumns"));
|
||||||
|
}
|
||||||
|
Object[] values = new Object[uniqueFormatLines.length];
|
||||||
|
for (int i = 0; i < uniqueFormatLines.length; i++) {
|
||||||
|
log.info("--- iterate unique column with index = ["+i+"]");
|
||||||
|
MColumn column = MColumn.get(ctx, uniqueFormatLines[i].getAD_Column_ID());
|
||||||
|
log.info("column = ["+column+"]");
|
||||||
|
|
||||||
|
if (MEXPFormatLine.TYPE_XMLElement.equals(uniqueFormatLines[i].getType())) {
|
||||||
|
// XML Element
|
||||||
|
//values[i] = XMLHelper.getString("/"+rootElement.getNodeName() + "/" + uniqueFormatLines[i].getValue(), rootElement);
|
||||||
|
String xPath = null;
|
||||||
|
//xPath = "/"+rootNodeName + "/" + uniqueFormatLines[i].getValue(); -- works
|
||||||
|
//xPath = "/"+ uniqueFormatLines[i].getValue(); // do not work
|
||||||
|
xPath = ""+ uniqueFormatLines[i].getValue();
|
||||||
|
|
||||||
|
values[i] = XMLHelper.getString(xPath, rootElement);
|
||||||
|
//log.info("xml PATH =" + rootElement.getNodeName() + "." + xPath );
|
||||||
|
log.info("values[" + i + "]=" + values[i]);
|
||||||
|
|
||||||
|
} else if (MEXPFormatLine.TYPE_ReferencedEXPFormat.equals(uniqueFormatLines[i].getType())) {
|
||||||
|
// Referenced Export Format
|
||||||
|
log.info("referencedExpFormat.EXP_EmbeddedFormat_ID = " + uniqueFormatLines[i].getEXP_EmbeddedFormat_ID());
|
||||||
|
MEXPFormat referencedExpFormat = new MEXPFormat(ctx, uniqueFormatLines[i].getEXP_EmbeddedFormat_ID(), trxName);
|
||||||
|
log.info("referencedExpFormat = " + referencedExpFormat);
|
||||||
|
/*
|
||||||
|
<C_BPartner>
|
||||||
|
<AD_Org>
|
||||||
|
<Value>0</Value>
|
||||||
|
<AD_Client_Value>
|
||||||
|
<AD_Client_Value>SYSTEM</AD_Client_Value>
|
||||||
|
</AD_Client_Value>
|
||||||
|
</AD_Org>
|
||||||
|
...
|
||||||
|
<C_BPartner>
|
||||||
|
*/
|
||||||
|
int record_ID = 0;
|
||||||
|
// Find Record_ID by ???Value??? In fact by Columns set as Part Of Unique Index in Export Format!
|
||||||
|
Element referencedNode = ((Element) rootElement.getElementsByTagName(uniqueFormatLines[i].getValue()).item(0));
|
||||||
|
log.info("referencedNode = " + referencedNode);
|
||||||
|
|
||||||
|
record_ID = getID(ctx, referencedExpFormat, referencedNode, uniqueFormatLines[i].getValue(), trxName);
|
||||||
|
log.info("record_ID = " + record_ID);
|
||||||
|
|
||||||
|
values[i] = new Integer(record_ID);
|
||||||
|
} else {
|
||||||
|
// Export Format Line is not one of two possible values...ERROR
|
||||||
|
throw new Exception(Msg.getMsg(ctx, "EXPFormatLineNonValidType"));
|
||||||
|
}
|
||||||
|
if (i == 0) {
|
||||||
|
sql.append(" ").append(column.getColumnName()).append(" = ? ");
|
||||||
|
} else {
|
||||||
|
sql.append(" AND ").append(column.getColumnName()).append(" = ? ");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
log.info("sql = " + sql.toString());
|
||||||
|
|
||||||
|
PreparedStatement pstmt = null;
|
||||||
|
try {
|
||||||
|
pstmt = DB.prepareStatement (sql.toString(), trxName);
|
||||||
|
for (int i = 0; i < uniqueFormatLines.length; i++) {
|
||||||
|
MColumn col = MColumn.get(ctx, uniqueFormatLines[i].getAD_Column_ID());
|
||||||
|
|
||||||
|
if (col.getAD_Reference_ID() == DisplayType.DateTime
|
||||||
|
|| col.getAD_Reference_ID() == DisplayType.Date
|
||||||
|
)
|
||||||
|
{
|
||||||
|
|
||||||
|
Timestamp value = (Timestamp)handleDateTime(values[i], col , uniqueFormatLines[i]);
|
||||||
|
pstmt.setTimestamp(i+1, value);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
pstmt.setObject(i+1, values[i]);
|
||||||
|
log.info("pstmt.setObject["+(i+1)+"] = [" + values[i]+"]");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
ResultSet rs = pstmt.executeQuery();
|
||||||
|
if ( rs.next() ) {
|
||||||
|
result = rs.getInt(1);
|
||||||
|
}
|
||||||
|
rs.close ();
|
||||||
|
pstmt.close ();
|
||||||
|
pstmt = null;
|
||||||
|
} catch (SQLException e) {
|
||||||
|
s_log.log(Level.SEVERE, sql.toString(), e);
|
||||||
|
throw e;
|
||||||
|
} finally {
|
||||||
|
try {
|
||||||
|
if (pstmt != null) pstmt.close ();
|
||||||
|
pstmt = null;
|
||||||
|
} catch (Exception e) { pstmt = null; }
|
||||||
|
}
|
||||||
|
log.info("result = " + result);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
private Object handleDateTime(Object value, MColumn column, MEXPFormatLine formatLine) throws ParseException {
|
||||||
|
String valueString = null;
|
||||||
|
valueString = value.toString(); // We are sure that value is not null
|
||||||
|
Object result = value;
|
||||||
|
|
||||||
|
if (column.getAD_Reference_ID() == DisplayType.Date) {
|
||||||
|
if (valueString != null) {
|
||||||
|
if (formatLine.getDateFormat() != null && !"".equals(formatLine.getDateFormat())) {
|
||||||
|
m_customDateFormat = new SimpleDateFormat( formatLine.getDateFormat() ); // "MM/dd/yyyy"; MM/dd/yyyy hh:mm:ss
|
||||||
|
result = new Timestamp(m_customDateFormat.parse(valueString).getTime());
|
||||||
|
log.info("Custom Date Format; Parsed value = " + result.toString());
|
||||||
|
} else {
|
||||||
|
result = new Timestamp(m_dateFormat.parse(valueString).getTime());
|
||||||
|
log.info("Custom Date Format; Parsed value = " + result.toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
} else if (column.getAD_Reference_ID() == DisplayType.DateTime) {
|
||||||
|
if (valueString != null) {
|
||||||
|
if (formatLine.getDateFormat() != null && !"".equals(formatLine.getDateFormat())) {
|
||||||
|
m_customDateFormat = new SimpleDateFormat( formatLine.getDateFormat() ); // "MM/dd/yyyy"
|
||||||
|
result = new Timestamp(m_customDateFormat.parse(valueString).getTime());
|
||||||
|
log.info("Custom Date Format; Parsed value = " + result.toString());
|
||||||
|
} else {
|
||||||
|
result = new Timestamp(m_dateTimeFormat.parse(valueString).getTime());
|
||||||
|
log.info("Custom Date Format; Parsed value = " + result.toString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,154 @@
|
||||||
|
/**********************************************************************
|
||||||
|
* This file is part of Adempiere ERP Bazaar *
|
||||||
|
* http://www.adempiere.org *
|
||||||
|
* *
|
||||||
|
* Copyright (C) Trifon Trifonov. *
|
||||||
|
* 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: *
|
||||||
|
* - Trifon Trifonov (trifonnt@users.sourceforge.net) *
|
||||||
|
* *
|
||||||
|
* Sponsors: *
|
||||||
|
* - E-evolution (http://www.e-evolution.com/) *
|
||||||
|
**********************************************************************/
|
||||||
|
package org.adempiere.server.rpl.imp;
|
||||||
|
|
||||||
|
import java.util.logging.Level;
|
||||||
|
|
||||||
|
import org.adempiere.server.rpl.XMLHelper;
|
||||||
|
import org.compiere.Adempiere;
|
||||||
|
import org.compiere.process.ProcessInfo;
|
||||||
|
import org.compiere.process.ProcessInfoParameter;
|
||||||
|
import org.compiere.process.SvrProcess;
|
||||||
|
import org.compiere.util.CLogMgt;
|
||||||
|
import org.compiere.util.Env;
|
||||||
|
import org.compiere.util.Msg;
|
||||||
|
import org.w3c.dom.Document;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Trifon N. Trifonov
|
||||||
|
* @author victor.perez@e-evolution.com
|
||||||
|
* FB [1963487 ] Is necessary new process to export and import with an Export
|
||||||
|
* @see http://sourceforge.net/tracker/?func=detail&atid=879335&aid=1963487&group_id=176962
|
||||||
|
* @version $Id:$
|
||||||
|
*/
|
||||||
|
public class ModelImporter extends SvrProcess {
|
||||||
|
|
||||||
|
/** Client Parameter */
|
||||||
|
protected int p_AD_Client_ID = 0;
|
||||||
|
|
||||||
|
/** Document Type Parameter */
|
||||||
|
protected int p_C_DocType_ID = 0;
|
||||||
|
|
||||||
|
/** Record ID */
|
||||||
|
protected int p_Record_ID = 0;
|
||||||
|
/** EXP_Format_ID */
|
||||||
|
protected int p_EXP_Format_ID = 0;
|
||||||
|
/** File Name **/
|
||||||
|
protected String p_FileName = "";
|
||||||
|
|
||||||
|
/** Table ID */
|
||||||
|
int AD_Table_ID = 0;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get Parameters
|
||||||
|
*/
|
||||||
|
protected void prepare() {
|
||||||
|
|
||||||
|
p_Record_ID = getRecord_ID();
|
||||||
|
if (p_AD_Client_ID == 0)
|
||||||
|
p_AD_Client_ID = Env.getAD_Client_ID(getCtx());
|
||||||
|
AD_Table_ID = getTable_ID();
|
||||||
|
|
||||||
|
StringBuffer sb = new StringBuffer("AD_Table_ID=").append(AD_Table_ID);
|
||||||
|
sb.append("; Record_ID=").append(getRecord_ID());
|
||||||
|
// Parameter
|
||||||
|
ProcessInfoParameter[] para = getParameter();
|
||||||
|
for (int i = 0; i < para.length; i++) {
|
||||||
|
String name = para[i].getParameterName();
|
||||||
|
if (para[i].getParameter() == null)
|
||||||
|
;
|
||||||
|
else if (name.equals("EXP_Format_ID"))
|
||||||
|
p_EXP_Format_ID = para[i].getParameterAsInt();
|
||||||
|
else if (name.equals("FileName"))
|
||||||
|
p_FileName = (String)para[i].getParameter();
|
||||||
|
else
|
||||||
|
log.log(Level.SEVERE, "Unknown Parameter: " + name);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(p_EXP_Format_ID == 0)
|
||||||
|
p_EXP_Format_ID = p_Record_ID;
|
||||||
|
if(p_FileName == null)
|
||||||
|
{
|
||||||
|
// Load XML file and parse it
|
||||||
|
String fileNameOr = org.compiere.util.Ini.findAdempiereHome()
|
||||||
|
+ System.getProperty("file.separator")
|
||||||
|
+ "data"
|
||||||
|
+ System.getProperty("file.separator")
|
||||||
|
+ "ExportFile.xml";
|
||||||
|
p_FileName = fileNameOr;
|
||||||
|
}
|
||||||
|
|
||||||
|
log.info(sb.toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Process
|
||||||
|
*
|
||||||
|
* @return info
|
||||||
|
*/
|
||||||
|
protected String doIt() throws Exception
|
||||||
|
{
|
||||||
|
StringBuffer result = new StringBuffer("");
|
||||||
|
|
||||||
|
// Load XML file and parse it
|
||||||
|
/*String fileNameOr = org.compiere.util.Ini.findAdempiereHome()
|
||||||
|
+ System.getProperty("file.separator")
|
||||||
|
+ "data"
|
||||||
|
+ System.getProperty("file.separator");
|
||||||
|
|
||||||
|
String pathToXmlFile = fileNameOr+"XmlExport-test.xml";
|
||||||
|
Document documentToBeImported = XMLHelper.createDocumentFromFile(pathToXmlFile);*/
|
||||||
|
Document documentToBeImported = XMLHelper.createDocumentFromFile(p_FileName);
|
||||||
|
|
||||||
|
ImportHelper impHelper = new ImportHelper(getCtx());
|
||||||
|
impHelper.importXMLDocument(result, documentToBeImported, get_TrxName());
|
||||||
|
|
||||||
|
addLog(0, null, null, Msg.getMsg(getCtx(), "ImportModelProcessResult") + "\n" + result.toString());
|
||||||
|
return result.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void main(String[] args)
|
||||||
|
{
|
||||||
|
CLogMgt.setLoggerLevel(Level.INFO, null);
|
||||||
|
CLogMgt.setLevel(Level.INFO);
|
||||||
|
|
||||||
|
Adempiere.startupEnvironment(false);
|
||||||
|
ProcessInfo pi = new ProcessInfo("Test Import Model", 1000000);
|
||||||
|
pi.setAD_Client_ID(11);
|
||||||
|
pi.setAD_User_ID(100);
|
||||||
|
|
||||||
|
ModelImporter modelImporter = new ModelImporter();
|
||||||
|
modelImporter.startProcess(Env.getCtx(), pi, null);
|
||||||
|
|
||||||
|
System.out.println("Process=" + pi.getTitle() + " Error="+pi.isError() + " Summary=" + pi.getSummary());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,130 @@
|
||||||
|
/**********************************************************************
|
||||||
|
* This file is part of Adempiere ERP Bazaar *
|
||||||
|
* http://www.adempiere.org *
|
||||||
|
* *
|
||||||
|
* Copyright (C) Trifon Trifonov. *
|
||||||
|
* 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: *
|
||||||
|
* - Trifon Trifonov (trifonnt@users.sourceforge.net) *
|
||||||
|
* *
|
||||||
|
* Sponsors: *
|
||||||
|
* - E-evolution (http://www.e-evolution.com/) *
|
||||||
|
**********************************************************************/
|
||||||
|
package org.adempiere.server.rpl.imp;
|
||||||
|
|
||||||
|
import java.util.Properties;
|
||||||
|
|
||||||
|
import org.adempiere.server.rpl.IImportProcessor;
|
||||||
|
import org.eevolution.model.MIMPProcessor;
|
||||||
|
import org.eevolution.model.X_IMP_ProcessorParameter;
|
||||||
|
import org.compiere.server.ReplicationProcessor;
|
||||||
|
import org.compiere.util.CLogger;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Aim of this class is to import records from JMS Server.
|
||||||
|
*
|
||||||
|
* @author Trifon N. Trifonov
|
||||||
|
* @version $Id:$
|
||||||
|
*/
|
||||||
|
public class TopicImportProcessor implements IImportProcessor {
|
||||||
|
|
||||||
|
/** Logger */
|
||||||
|
protected CLogger log = CLogger.getCLogger (TopicImportProcessor.class);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Topic Listener
|
||||||
|
*/
|
||||||
|
private TopicListener topicListener = null;
|
||||||
|
|
||||||
|
|
||||||
|
public void process(Properties ctx, ReplicationProcessor replicationProcessor, String trxName)
|
||||||
|
throws Exception {
|
||||||
|
|
||||||
|
log.info("replicationProcessor = " + replicationProcessor);
|
||||||
|
log.info("replicationProcessor.getMImportProcessor() = " + replicationProcessor.getMImportProcessor());
|
||||||
|
|
||||||
|
MIMPProcessor impProcessor = replicationProcessor.getMImportProcessor();
|
||||||
|
|
||||||
|
X_IMP_ProcessorParameter[] processorParameters = impProcessor.getIMP_ProcessorParameters(trxName);
|
||||||
|
|
||||||
|
String host = impProcessor.getHost();
|
||||||
|
int port = impProcessor.getPort();
|
||||||
|
String account = impProcessor.getAccount();
|
||||||
|
String password = impProcessor.getPasswordInfo();
|
||||||
|
|
||||||
|
// mandatory parameters!
|
||||||
|
String topicName = null;
|
||||||
|
String protocol = null;
|
||||||
|
boolean isDurableSubscription = true;
|
||||||
|
String subscriptionName = null;
|
||||||
|
String options = null;
|
||||||
|
String clientID = null;
|
||||||
|
|
||||||
|
if (processorParameters != null && processorParameters.length > 0) {
|
||||||
|
for (int i = 0; i < processorParameters.length; i++) {
|
||||||
|
log.info("ProcesParameter Value = " + processorParameters[i].getValue());
|
||||||
|
log.info("ProcesParameter ParameterValue = " + processorParameters[i].getParameterValue());
|
||||||
|
if (processorParameters[i].getValue().equals("topicName")) {
|
||||||
|
topicName = processorParameters[i].getParameterValue();
|
||||||
|
} else if (processorParameters[i].getValue().equals("protocol")) {
|
||||||
|
protocol = processorParameters[i].getParameterValue();
|
||||||
|
} else if (processorParameters[i].getValue().equals("isDurableSubscription")) {
|
||||||
|
isDurableSubscription = Boolean.parseBoolean( processorParameters[i].getParameterValue() );
|
||||||
|
} else if (processorParameters[i].getValue().equals("subscriptionName")) {
|
||||||
|
subscriptionName = processorParameters[i].getParameterValue();
|
||||||
|
} else if (processorParameters[i].getValue().equals("clientID")) {
|
||||||
|
clientID = processorParameters[i].getParameterValue();
|
||||||
|
} else {
|
||||||
|
// Some other mandatory parameter here
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (topicName == null || topicName.length() == 0) {
|
||||||
|
throw new Exception("Missing "+X_IMP_ProcessorParameter.Table_Name+" with key 'topicName'!");
|
||||||
|
}
|
||||||
|
if (protocol == null || protocol.length() == 0) {
|
||||||
|
throw new Exception("Missing "+X_IMP_ProcessorParameter.Table_Name+" with key 'protocol'!");
|
||||||
|
}
|
||||||
|
if (isDurableSubscription && subscriptionName == null || subscriptionName.length() == 0) {
|
||||||
|
throw new Exception("Missing "+X_IMP_ProcessorParameter.Table_Name+" with key 'subscriptionName'!");
|
||||||
|
}
|
||||||
|
if (clientID == null || clientID.length() == 0) {
|
||||||
|
throw new Exception("Missing "+X_IMP_ProcessorParameter.Table_Name+" with key 'clientID'!");
|
||||||
|
}
|
||||||
|
|
||||||
|
topicListener = new TopicListener(ctx, replicationProcessor, protocol, host, port
|
||||||
|
, isDurableSubscription, subscriptionName, topicName, clientID
|
||||||
|
, account, password, options, trxName);
|
||||||
|
|
||||||
|
topicListener.run();
|
||||||
|
log.info("Started topicListener = " + topicListener);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void stop() throws Exception {
|
||||||
|
|
||||||
|
if ( topicListener != null ) {
|
||||||
|
topicListener.stop();
|
||||||
|
log.info("Stoped topicListener." );
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,278 @@
|
||||||
|
/**********************************************************************
|
||||||
|
* This file is part of Adempiere ERP Bazaar *
|
||||||
|
* http://www.adempiere.org *
|
||||||
|
* *
|
||||||
|
* Copyright (C) Trifon Trifonov. *
|
||||||
|
* 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: *
|
||||||
|
* - Trifon Trifonov (trifonnt@users.sourceforge.net) *
|
||||||
|
* *
|
||||||
|
* Sponsors: *
|
||||||
|
* - E-evolution (http://www.e-evolution.com/) *
|
||||||
|
**********************************************************************/
|
||||||
|
package org.adempiere.server.rpl.imp;
|
||||||
|
|
||||||
|
import java.util.Properties;
|
||||||
|
|
||||||
|
import javax.jms.Connection;
|
||||||
|
import javax.jms.JMSException;
|
||||||
|
import javax.jms.Message;
|
||||||
|
import javax.jms.MessageConsumer;
|
||||||
|
import javax.jms.MessageListener;
|
||||||
|
import javax.jms.Session;
|
||||||
|
import javax.jms.TextMessage;
|
||||||
|
import javax.jms.Topic;
|
||||||
|
|
||||||
|
import org.adempiere.server.rpl.XMLHelper;
|
||||||
|
import org.apache.activemq.ActiveMQConnectionFactory;
|
||||||
|
import org.eevolution.model.MIMPProcessorLog;
|
||||||
|
import org.compiere.server.ReplicationProcessor;
|
||||||
|
import org.compiere.util.CLogger;
|
||||||
|
import org.w3c.dom.Document;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Listen for JMS Messages
|
||||||
|
* @author Trifon N. Trifonov
|
||||||
|
*/
|
||||||
|
public class TopicListener implements MessageListener {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Connection to JMS Server
|
||||||
|
*/
|
||||||
|
private Connection conn;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* JMS Session
|
||||||
|
*/
|
||||||
|
private Session session;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* JMS Topic
|
||||||
|
*/
|
||||||
|
private Topic topic;
|
||||||
|
|
||||||
|
// private String url="tcp://localhost:61616?jms.dispatchAsync=true&jms.useAsyncSend=true&jms.optimizeAcknowledge=true&jms.disableTimeStampsByDefault=true&jms.optimizedMessageDispatch=true&wireFormat.cacheEnabled=false&wireFormat.tightEncodingEnabled=false";
|
||||||
|
private String url="tcp://localhost:61616";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* host where JMS server is running
|
||||||
|
*/
|
||||||
|
private String host = "localhost";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* port of JMS Server
|
||||||
|
*/
|
||||||
|
private int port = 61616;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Network protocol
|
||||||
|
*/
|
||||||
|
private String protocol = "tcp";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Context
|
||||||
|
*/
|
||||||
|
private Properties ctx = null;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Transaction name
|
||||||
|
*/
|
||||||
|
private String trxName = null;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Topic Name
|
||||||
|
*/
|
||||||
|
private String topicName = null;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Replication processor
|
||||||
|
*/
|
||||||
|
private ReplicationProcessor replicationProcessor = null;
|
||||||
|
|
||||||
|
/** Logger */
|
||||||
|
protected CLogger log = CLogger.getCLogger (TopicListener.class);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Is Durable Subscription
|
||||||
|
*/
|
||||||
|
private boolean isDurableSubscription = false;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Subscription Name
|
||||||
|
*/
|
||||||
|
private String subscriptionName = null;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* JMS Connection ClientID
|
||||||
|
*/
|
||||||
|
private String clientID = null;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* String User Name
|
||||||
|
*/
|
||||||
|
private String userName = null;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Password
|
||||||
|
*/
|
||||||
|
private String password = null;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public TopicListener(Properties ctx, ReplicationProcessor replicationProcessor, String protocol, String host, int port
|
||||||
|
, boolean isDurableSubscription, String subscriptionName, String topicName
|
||||||
|
, String clientID, String userName, String password
|
||||||
|
, String options, String trxName) {
|
||||||
|
if ( host != null && !host.equals("") ) {
|
||||||
|
this.host = host;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( port > 0 ) {
|
||||||
|
this.port = port;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( protocol != null && !protocol.equals("") ) {
|
||||||
|
this.protocol = protocol;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.topicName = topicName;
|
||||||
|
|
||||||
|
this.setUrl(this.protocol + "://" + this.host + ":" + this.port);
|
||||||
|
|
||||||
|
this.ctx = ctx;
|
||||||
|
|
||||||
|
this.trxName = trxName;
|
||||||
|
|
||||||
|
this.replicationProcessor = replicationProcessor;
|
||||||
|
|
||||||
|
this.isDurableSubscription = isDurableSubscription;
|
||||||
|
|
||||||
|
this.subscriptionName = subscriptionName;
|
||||||
|
|
||||||
|
this.clientID = clientID;
|
||||||
|
|
||||||
|
this.userName = userName;
|
||||||
|
|
||||||
|
this.password = password;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public void run() throws JMSException {
|
||||||
|
ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory( url );
|
||||||
|
log.finest("ActiveMQConnectionFactory = " + factory);
|
||||||
|
|
||||||
|
if (userName !=null && password != null) {
|
||||||
|
conn = factory.createConnection(userName, password);
|
||||||
|
} else {
|
||||||
|
conn = factory.createConnection();
|
||||||
|
}
|
||||||
|
|
||||||
|
log.finest("conn = " + conn );
|
||||||
|
|
||||||
|
conn.setClientID( clientID );
|
||||||
|
|
||||||
|
session = conn.createSession(false, Session.AUTO_ACKNOWLEDGE); // TODO - could be parameter
|
||||||
|
log.finest("session = " + session );
|
||||||
|
|
||||||
|
log.finest("topicName = " + topicName );
|
||||||
|
log.finest("subscriptionName = " + subscriptionName);
|
||||||
|
|
||||||
|
topic = session.createTopic( topicName );
|
||||||
|
log.finest("topic = " + topic );
|
||||||
|
|
||||||
|
MessageConsumer consumer = null;
|
||||||
|
if (isDurableSubscription) {
|
||||||
|
// http://publib.boulder.ibm.com/infocenter/wasinfo/v6r0/index.jsp?topic=/com.ibm.websphere.pmc.express.doc/tasks/tjn0012_.html
|
||||||
|
// The subscriptionName assigned to a durable subscription must be unique within a given client ID.
|
||||||
|
consumer = session.createDurableSubscriber( topic, subscriptionName );
|
||||||
|
} else {
|
||||||
|
consumer = session.createConsumer( topic );
|
||||||
|
}
|
||||||
|
|
||||||
|
log.finest("consumer = " + consumer );
|
||||||
|
|
||||||
|
consumer.setMessageListener( this );
|
||||||
|
|
||||||
|
conn.start();
|
||||||
|
log.finest("Waiting for JMS messages...");
|
||||||
|
//
|
||||||
|
MIMPProcessorLog pLog = new MIMPProcessorLog(replicationProcessor.getMImportProcessor(), "Connected to JMS Server. Waiting for messages!");
|
||||||
|
StringBuffer logReference = new StringBuffer("topicName = ").append(topicName)
|
||||||
|
.append(", subscriptionName = ").append( subscriptionName )
|
||||||
|
;
|
||||||
|
pLog.setReference( logReference.toString() );
|
||||||
|
boolean resultSave = pLog.save();
|
||||||
|
log.finest("Result Save = " + resultSave);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public void onMessage(Message message) {
|
||||||
|
if ( message instanceof TextMessage ) {
|
||||||
|
|
||||||
|
try {
|
||||||
|
TextMessage txtMessage = (TextMessage) message;
|
||||||
|
|
||||||
|
String text = txtMessage.getText();
|
||||||
|
//log.finest("Received message: \n" + text );
|
||||||
|
|
||||||
|
Document documentToBeImported = XMLHelper.createDocumentFromString( text );
|
||||||
|
StringBuffer result = new StringBuffer();
|
||||||
|
|
||||||
|
ImportHelper impHelper = new ImportHelper( ctx );
|
||||||
|
|
||||||
|
impHelper.importXMLDocument(result, documentToBeImported, trxName );
|
||||||
|
|
||||||
|
//
|
||||||
|
MIMPProcessorLog pLog = new MIMPProcessorLog(replicationProcessor.getMImportProcessor(), "Imported Document!");
|
||||||
|
//pLog.setReference("topicName = " + topicName );
|
||||||
|
if (text.length() > 2000 ) {
|
||||||
|
pLog.setTextMsg( text.substring(0, 1999) );
|
||||||
|
} else {
|
||||||
|
pLog.setTextMsg( text);
|
||||||
|
}
|
||||||
|
|
||||||
|
boolean resultSave = pLog.save();
|
||||||
|
log.finest("Result Save = " + resultSave);
|
||||||
|
|
||||||
|
} catch (Exception e) {
|
||||||
|
replicationProcessor.setProcessRunning(false);
|
||||||
|
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
} else {
|
||||||
|
log.finest("Received NO TEXT Message: " );
|
||||||
|
// Received non text message!!!
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setUrl(String url) {
|
||||||
|
this.url = url;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void stop() throws JMSException {
|
||||||
|
// Close JMS Connection
|
||||||
|
log.finest("Closing JMS Connection!");
|
||||||
|
conn.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,168 @@
|
||||||
|
/**********************************************************************
|
||||||
|
* This file is part of Adempiere ERP Bazaar *
|
||||||
|
* http://www.adempiere.org *
|
||||||
|
* *
|
||||||
|
* Copyright (C) Trifon Trifonov. *
|
||||||
|
* 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: *
|
||||||
|
* - Trifon Trifonov (trifonnt@users.sourceforge.net) *
|
||||||
|
* *
|
||||||
|
* Sponsors: *
|
||||||
|
* - E-evolution (http://www.e-evolution.com/) *
|
||||||
|
**********************************************************************/
|
||||||
|
package org.compiere.server;
|
||||||
|
|
||||||
|
import java.sql.Timestamp;
|
||||||
|
|
||||||
|
import org.adempiere.server.rpl.IImportProcessor;
|
||||||
|
import org.compiere.model.MClient;
|
||||||
|
import org.eevolution.model.MIMPProcessor;
|
||||||
|
import org.eevolution.model.MIMPProcessorLog;
|
||||||
|
import org.eevolution.model.X_IMP_Processor_Type;
|
||||||
|
import org.compiere.util.TimeUtil;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Trifon N. Trifonov
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class ReplicationProcessor extends AdempiereServer {
|
||||||
|
|
||||||
|
/** Last Summary */
|
||||||
|
private StringBuffer m_summary = new StringBuffer();
|
||||||
|
|
||||||
|
/** Client info */
|
||||||
|
private MClient m_client = null;
|
||||||
|
|
||||||
|
private MIMPProcessor mImportProcessor = null;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* flag showing if process is working!
|
||||||
|
*/
|
||||||
|
private boolean isProcessRunning = false;
|
||||||
|
|
||||||
|
|
||||||
|
protected ReplicationProcessor(MIMPProcessor model, int initialNap) {
|
||||||
|
super (model, initialNap);
|
||||||
|
mImportProcessor = model;
|
||||||
|
m_client = MClient.get(mImportProcessor.getCtx(), mImportProcessor.getAD_Client_ID());
|
||||||
|
}
|
||||||
|
|
||||||
|
protected ReplicationProcessor(MIMPProcessor model) {
|
||||||
|
super (model, 30);
|
||||||
|
mImportProcessor = model;
|
||||||
|
m_client = MClient.get(mImportProcessor.getCtx(), mImportProcessor.getAD_Client_ID());
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
@Override
|
||||||
|
protected void doWork() {
|
||||||
|
if (isProcessRunning) {
|
||||||
|
// process is already started successfully!
|
||||||
|
|
||||||
|
} else {
|
||||||
|
// process is not started!
|
||||||
|
|
||||||
|
m_summary = new StringBuffer();
|
||||||
|
String trxName = mImportProcessor.get_TrxName();
|
||||||
|
if ( trxName == null || "".equals(trxName) ) {
|
||||||
|
// trxName = "ImportProcessor-" + System.currentTimeMillis();
|
||||||
|
}
|
||||||
|
log.fine("trxName = " + trxName);
|
||||||
|
log.fine("ImportProcessor = " + mImportProcessor);
|
||||||
|
|
||||||
|
int IMP_ProcessorType_ID = 0;
|
||||||
|
IMP_ProcessorType_ID = mImportProcessor.getIMP_Processor_Type_ID();
|
||||||
|
X_IMP_Processor_Type impProcessor_Type = new X_IMP_Processor_Type(mImportProcessor.getCtx(), IMP_ProcessorType_ID, trxName );
|
||||||
|
log.fine("impProcessor_Type = " + impProcessor_Type); // TODO --- REMOVE
|
||||||
|
|
||||||
|
String javaClass = impProcessor_Type.getJavaClass();
|
||||||
|
IImportProcessor importProcessor = null;
|
||||||
|
try {
|
||||||
|
Class clazz = Class.forName(javaClass);
|
||||||
|
importProcessor = (IImportProcessor)clazz.newInstance();
|
||||||
|
|
||||||
|
importProcessor.process(mImportProcessor.getCtx(), this, trxName );
|
||||||
|
|
||||||
|
} catch (Exception e) {
|
||||||
|
isProcessRunning = false;
|
||||||
|
log.fine("ReplicationProcessor caught an exception !!!" );
|
||||||
|
e.printStackTrace();
|
||||||
|
|
||||||
|
log.severe( e.getMessage() );
|
||||||
|
|
||||||
|
MIMPProcessorLog pLog = new MIMPProcessorLog(mImportProcessor, e.getMessage() );
|
||||||
|
pLog.setReference("#" + String.valueOf(p_runCount) + " - " + TimeUtil.formatElapsed(new Timestamp(p_startWork)));
|
||||||
|
boolean resultSave = pLog.save();
|
||||||
|
|
||||||
|
try {
|
||||||
|
importProcessor.stop();
|
||||||
|
} catch (Exception e1) {
|
||||||
|
e1.printStackTrace();
|
||||||
|
MIMPProcessorLog pLog2 = new MIMPProcessorLog(mImportProcessor, e1.getMessage() );
|
||||||
|
|
||||||
|
boolean resultSave2 = pLog2.save();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
int no = mImportProcessor.deleteLog();
|
||||||
|
m_summary.append("Logs Records deleted=").append(no).append("; ");
|
||||||
|
//
|
||||||
|
MIMPProcessorLog pLog = new MIMPProcessorLog(mImportProcessor, m_summary.toString());
|
||||||
|
pLog.setReference("#" + String.valueOf(p_runCount) + " - " + TimeUtil.formatElapsed(new Timestamp(p_startWork)));
|
||||||
|
boolean resultSave = pLog.save();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getServerInfo()
|
||||||
|
{
|
||||||
|
return "#" + p_runCount + " - Last=" + m_summary.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return the isProcessRunning
|
||||||
|
*/
|
||||||
|
public boolean isProcessRunning() {
|
||||||
|
return isProcessRunning;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param isProcessRunning the isProcessRunning to set
|
||||||
|
*/
|
||||||
|
public void setProcessRunning(boolean isProcessRunning) {
|
||||||
|
this.isProcessRunning = isProcessRunning;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return the mImportProcessor
|
||||||
|
*/
|
||||||
|
public MIMPProcessor getMImportProcessor() {
|
||||||
|
return mImportProcessor;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param importProcessor the mImportProcessor to set
|
||||||
|
*/
|
||||||
|
public void setMImportProcessor(MIMPProcessor importProcessor) {
|
||||||
|
mImportProcessor = importProcessor;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue