KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > compiere > apps > form > VMerge


1 /******************************************************************************
2  * The contents of this file are subject to the Compiere License Version 1.1
3  * ("License"); You may not use this file except in compliance with the License
4  * You may obtain a copy of the License at http://www.compiere.org/license.html
5  * Software distributed under the License is distributed on an "AS IS" basis,
6  * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for
7  * the specific language governing rights and limitations under the License.
8  * The Original Code is Compiere ERP & CRM Smart Business Solution
9  * The Initial Developer of the Original Code is Jorg Janke and ComPiere, Inc.
10  * Portions created by Jorg Janke are Copyright (C) 1999-2003 Jorg Janke, parts
11  * created by ComPiere are Copyright (C) ComPiere, Inc.; All Rights Reserved.
12  * Contributor(s): ______________________________________.
13  *****************************************************************************/

14 package org.compiere.apps.form;
15
16 import java.awt.BorderLayout JavaDoc;
17 import java.awt.Cursor JavaDoc;
18 import java.awt.Font JavaDoc;
19 import java.awt.GridLayout JavaDoc;
20 import java.awt.event.ActionEvent JavaDoc;
21 import java.awt.event.ActionListener JavaDoc;
22 import java.sql.Connection JavaDoc;
23 import java.sql.PreparedStatement JavaDoc;
24 import java.sql.ResultSet JavaDoc;
25 import java.sql.SQLException JavaDoc;
26 import java.sql.Savepoint JavaDoc;
27 import java.sql.Statement JavaDoc;
28
29 import javax.swing.JLabel JavaDoc;
30 import javax.swing.JPanel JavaDoc;
31
32 import org.compiere.apps.ADialog;
33 import org.compiere.apps.ConfirmPanel;
34 import org.compiere.grid.ed.VLookup;
35 import org.compiere.model.MLookupFactory;
36 import org.compiere.swing.CLabel;
37 import org.compiere.util.DB;
38 import org.compiere.util.DisplayType;
39 import org.compiere.util.Env;
40 import org.compiere.util.Log;
41 import org.compiere.util.Msg;
42
43 /**
44  * Merge Dialog.
45  * Restriction - fails for Accounting
46  *
47  * @author Jorg Janke
48  * @version $Id: VMerge.java,v 1.3 2003/10/03 04:06:36 jjanke Exp $
49  */

50 public class VMerge extends JPanel JavaDoc implements FormPanel, ActionListener JavaDoc
51 {
52     /**
53      * Merge Entities
54      */

55     public VMerge ()
56     {
57     } // VMerge
58

59     /** Window No */
60     private int m_WindowNo = 0;
61     /** FormFrame */
62     private FormFrame m_frame;
63     /** Total Count */
64     private int m_totalCount = 0;
65     /** Error Log */
66     private StringBuffer JavaDoc m_errorLog = new StringBuffer JavaDoc();
67     /** Connection */
68     private Connection JavaDoc m_con = null;
69
70     static private String JavaDoc AD_ORG_ID = "AD_Org_ID";
71     static private String JavaDoc C_BPARTNER_ID = "C_BPartner_ID";
72     static private String JavaDoc AD_USER_ID = "AD_User_ID";
73     static private String JavaDoc M_PRODUCT_ID = "M_Product_ID";
74
75     /** Tables to delete (not update) for AD_Org */
76     static private String JavaDoc[] s_delete_Org = new String JavaDoc[]
77         {"AD_OrgInfo"};
78     /** Tables to delete (not update) for AD_User */
79     static private String JavaDoc[] s_delete_User = new String JavaDoc[]
80         {"AD_User_Roles"};
81     /** Tables to delete (not update) for C_BPartner */
82     static private String JavaDoc[] s_delete_BPartner = new String JavaDoc[]
83         {"C_BP_Employee_Acct", "C_BP_Vendor_Acct", "C_BP_Customer_Acct"};
84     /** Tables to delete (not update) for M_Product */
85     static private String JavaDoc[] s_delete_Product = new String JavaDoc[]
86         {"M_Product_PO", "M_Replenish", "M_ProductPrice", "M_Product_Costing",
87         "M_Product_Trl", "M_Product_Acct"}; // M_Storage
88

89     private String JavaDoc[] m_columnName = null;
90     private CLabel[] m_label = null;
91     private VLookup[] m_from = null;
92     private VLookup[] m_to = null;
93     private String JavaDoc[] m_deleteTables = null;
94
95
96     private BorderLayout JavaDoc mainLayout = new BorderLayout JavaDoc();
97     private JPanel JavaDoc CenterPanel = new JPanel JavaDoc();
98     private GridLayout JavaDoc centerLayout = new GridLayout JavaDoc();
99     private JLabel JavaDoc mergeFromLabel = new JLabel JavaDoc();
100     private JLabel JavaDoc mergeToLabel = new JLabel JavaDoc();
101     private ConfirmPanel confirmPanel = new ConfirmPanel(true);
102
103     /**
104      * Initialize Panel
105      * @param WindowNo window
106      * @param frame frame
107      */

108     public void init (int WindowNo, FormFrame frame)
109     {
110         m_WindowNo = WindowNo;
111         m_frame = frame;
112         Log.trace(Log.l1_User, "VMerge.init - WinNo=" + m_WindowNo);
113         try
114         {
115             preInit();
116             jbInit ();
117             frame.getContentPane().add(this, BorderLayout.CENTER);
118         // frame.getContentPane().add(statusBar, BorderLayout.SOUTH);
119
}
120         catch (Exception JavaDoc ex)
121         {
122             Log.error("VMerge.init", ex);
123         }
124     } // init
125

126     /**
127      * Pre Init
128      */

129     private void preInit()
130     {
131         int count = 4; // ** Update **
132
m_columnName = new String JavaDoc[count];
133         m_label = new CLabel[count];
134         m_from = new VLookup[count];
135         m_to = new VLookup[count];
136
137         // ** Update **
138
preInit (0, 2163, DisplayType.TableDir, AD_ORG_ID); // C_Order.AD_Org_ID
139
preInit (1, 2762, DisplayType.Search, C_BPARTNER_ID); // C_Order.C_BPartner_ID
140
preInit (2, 971, DisplayType.Search, AD_USER_ID); // AD_User_Roles.AD_User_ID
141
preInit (3, 2221, DisplayType.Search, M_PRODUCT_ID); // C_OrderLine.M_Product_ID
142
} // preInit
143

144     /**
145      * Pre Init Line
146      * @param index index
147      * @param AD_Column_ID id
148      * @param displayType display type
149      * @param ColumnName column name
150      */

151     private void preInit (int index, int AD_Column_ID, int displayType, String JavaDoc ColumnName)
152     {
153         m_columnName[index] = ColumnName;
154         String JavaDoc what = Msg.translate(Env.getCtx(), ColumnName);
155         m_label[index] = new CLabel(what);
156         m_from[index] = new VLookup (ColumnName, false, false, true,
157             MLookupFactory.get (Env.getCtx(), m_WindowNo, 0, AD_Column_ID, displayType),
158             displayType, m_WindowNo);
159         m_to[index] = new VLookup (ColumnName, false, false, true,
160             MLookupFactory.get (Env.getCtx(), m_WindowNo, 0, AD_Column_ID, displayType),
161             displayType, m_WindowNo);
162     } // preInit
163

164     /**
165      * Static init
166      * @throws java.lang.Exception
167      */

168     void jbInit () throws Exception JavaDoc
169     {
170         this.setLayout (mainLayout);
171         mainLayout.setHgap (5);
172         mainLayout.setVgap (5);
173         //
174
this.add (confirmPanel, BorderLayout.SOUTH);
175         confirmPanel.addActionListener(this);
176         //
177
centerLayout.setHgap (5);
178         centerLayout.setVgap (5);
179         centerLayout.setColumns (3);
180         centerLayout.setRows (m_label.length+1);
181         //
182
CenterPanel.setLayout (centerLayout);
183         this.add (CenterPanel, BorderLayout.CENTER);
184         CenterPanel.add (new CLabel(), null);
185         CenterPanel.add (mergeFromLabel, null);
186         CenterPanel.add (mergeToLabel, null);
187         //
188
Font JavaDoc heading = mergeFromLabel.getFont();
189         heading = new Font JavaDoc(heading.getName(), Font.BOLD, heading.getSize());
190         mergeFromLabel.setFont (heading);
191         mergeFromLabel.setRequestFocusEnabled (false);
192         mergeFromLabel.setText (Msg.getMsg(Env.getCtx(), "MergeFrom"));
193         mergeToLabel.setFont (heading);
194         mergeToLabel.setText (Msg.getMsg(Env.getCtx(), "MergeTo"));
195         //
196
for (int i = 0; i < m_label.length; i++)
197         {
198             CenterPanel.add (m_label[i], null);
199             CenterPanel.add (m_from[i], null);
200             CenterPanel.add (m_to[i], null);
201         }
202     } // jbInit
203

204     /**
205      * Dispose
206      */

207     public void dispose()
208     {
209         m_frame.dispose();
210     } // dispose
211

212     /**
213      * Action Listener
214      * @param e event
215      */

216     public void actionPerformed (ActionEvent JavaDoc e)
217     {
218         if (e.getActionCommand().equals(ConfirmPanel.A_CANCEL))
219         {
220             dispose();
221             return;
222         }
223         //
224
String JavaDoc columnName = null;
225         String JavaDoc from_Info = null;
226         String JavaDoc to_Info = null;
227         int from_ID = 0;
228         int to_ID = 0;
229         // get first merge pair
230
for (int i = 0; (i < m_columnName.length && from_ID == 0 && to_ID == 0); i++)
231         {
232             Object JavaDoc value = m_from[i].getValue();
233             if (value != null)
234             {
235                 if (value instanceof Integer JavaDoc)
236                     from_ID = ((Integer JavaDoc)value).intValue();
237                 else
238                     continue;
239                 value = m_to[i].getValue();
240                 if (value != null && value instanceof Integer JavaDoc)
241                     to_ID = ((Integer JavaDoc)value).intValue();
242                 else
243                     from_ID = 0;
244                 if (from_ID != 0)
245                 {
246                     columnName = m_columnName[i];
247                     from_Info = m_from[i].getDisplay ();
248                     to_Info = m_to[i].getDisplay ();
249                 }
250             }
251         } // get first merge pair
252

253         if (from_ID == 0 || from_ID == to_ID)
254             return;
255
256         String JavaDoc msg = Msg.getMsg(Env.getCtx(), "MergeFrom") + " = " + from_Info
257             + "\n" + Msg.getMsg(Env.getCtx(), "MergeTo") + " = " + to_Info;
258         if (!ADialog.ask(m_WindowNo, this, "MergeQuestion", msg))
259             return;
260
261         // ** Update **
262
if (columnName.equals(AD_ORG_ID))
263             m_deleteTables = s_delete_Org;
264         else if (columnName.equals(AD_USER_ID))
265             m_deleteTables = s_delete_User;
266         else if (columnName.equals(C_BPARTNER_ID))
267             m_deleteTables = s_delete_BPartner;
268         else if (columnName.equals(M_PRODUCT_ID))
269             m_deleteTables = s_delete_Product;
270
271         setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
272         confirmPanel.getOKButton().setEnabled(false);
273         //
274
boolean success = merge (columnName, from_ID, to_ID);
275         //
276
confirmPanel.getOKButton().setEnabled(true);
277         setCursor(Cursor.getDefaultCursor());
278         //
279
if (success)
280         {
281             ADialog.info (m_WindowNo, this, "MergeSuccess", msg + " #" + m_totalCount);
282         }
283         else
284         {
285             ADialog.error (m_WindowNo, this, "MergeError", m_errorLog.toString());
286             return;
287         }
288         dispose();
289     } // actionPerformed
290

291
292     /**
293      * Merge.
294      * @param ColumnName column
295      * @param from_ID from
296      * @param to_ID to
297      * @return true if merged
298      */

299     private boolean merge (String JavaDoc ColumnName, int from_ID, int to_ID)
300     {
301         String JavaDoc TableName = ColumnName.substring(0, ColumnName.length()-3);
302         Log.trace(Log.l4_Data, "VMerge.merge", ColumnName
303             + " - From=" + from_ID + ",To=" + to_ID);
304
305         boolean success = true;
306         m_totalCount = 0;
307         m_errorLog = new StringBuffer JavaDoc();
308         String JavaDoc sql = "SELECT TableName "
309             + "FROM AD_Table t WHERE t.IsView='N'"
310             + " AND EXISTS (SELECT * FROM AD_Column c WHERE t.AD_Table_ID=c.AD_Table_ID"
311             + " AND c.ColumnName=?) "
312             + "ORDER BY t.LoadSeq DESC";
313         PreparedStatement JavaDoc pstmt = null;
314         Savepoint JavaDoc sp = null;
315         try
316         {
317             m_con = DB.createConnection(false, Connection.TRANSACTION_SERIALIZABLE);
318             sp = m_con.setSavepoint("merge");
319             //
320
pstmt = DB.prepareStatement(sql);
321             pstmt.setString(1, ColumnName);
322             ResultSet JavaDoc rs = pstmt.executeQuery();
323             while (rs.next())
324             {
325                 String JavaDoc name = rs.getString(1);
326                 if (!TableName.equals(name))
327                 {
328                     int count = mergeTable (name, ColumnName, from_ID, to_ID);
329                     if (count < 0)
330                         success = false;
331                     else
332                         m_totalCount += count;
333                 }
334             }
335             rs.close();
336             pstmt.close();
337             pstmt = null;
338             //
339
if (success)
340             {
341                 sql = "DELETE " + TableName + " WHERE " + ColumnName + "=" + from_ID;
342                 Statement JavaDoc stmt = m_con.createStatement();
343                 int count = 0;
344                 try
345                 {
346                     count = stmt.executeUpdate (sql);
347                     if (count != 1)
348                     {
349                         m_errorLog.append(Env.NL).append("DELETE ").append(TableName)
350                             .append(" - Count=").append(count);
351                         success = false;
352                     }
353                 }
354                 catch (SQLException JavaDoc ex1)
355                 {
356                     m_errorLog.append(Env.NL).append("DELETE ").append(TableName)
357                         .append(" - ").append(ex1.toString());
358                     success = false;
359                 }
360                 stmt.close();
361                 stmt = null;
362             }
363             //
364
if (success)
365                 m_con.commit();
366             else
367                 m_con.rollback(sp);
368             m_con.close();
369             m_con = null;
370         }
371         catch (Exception JavaDoc ex)
372         {
373             Log.error("VMerge.merge", ex);
374         }
375         // Cleanup
376
try
377         {
378             if (pstmt != null)
379                 pstmt.close();
380             if (m_con != null)
381                 m_con.close();
382         }
383         catch (Exception JavaDoc ex)
384         {
385         }
386         pstmt = null;
387         m_con = null;
388         //
389
return success;
390     } // merge
391

392
393     /**
394      * Merge Table
395      * @param TableName table
396      * @param ColumnName column
397      * @param from_ID from
398      * @param to_ID to
399      * @return -1 for error or number of changes
400      */

401     private int mergeTable (String JavaDoc TableName, String JavaDoc ColumnName, int from_ID, int to_ID)
402     {
403     // Log.trace(Log.l4_Data, "VMerge.mergeTable", TableName + "." + ColumnName
404
// + " - From=" + from_ID + ",To=" + to_ID);
405
String JavaDoc sql = "UPDATE " + TableName
406             + " SET " + ColumnName + "=" + to_ID
407             + " WHERE " + ColumnName + "=" + from_ID;
408         boolean delete = false;
409         for (int i = 0; i < m_deleteTables.length; i++)
410         {
411             if (m_deleteTables[i].equals(TableName))
412             {
413                 delete = true;
414                 sql = "DELETE " + TableName + " WHERE " + ColumnName + "=" + from_ID;
415             }
416         }
417
418         int count = -1;
419
420         try
421         {
422             Statement JavaDoc stmt = m_con.createStatement ();
423             try
424             {
425                 count = stmt.executeUpdate (sql);
426                 Log.trace(Log.l5_DData, "VMerge.mergeTable", count
427                     + (delete ? " -Delete- " : " -Update- ") + TableName);
428             }
429             catch (SQLException JavaDoc ex1)
430             {
431                 count = -1;
432                 m_errorLog.append(Env.NL).append(delete ? "DELETE " : "UPDATE ")
433                     .append(TableName).append(" - ").append(ex1.toString());
434             }
435             stmt.close();
436             stmt = null;
437         }
438         catch (SQLException JavaDoc ex)
439         {
440             count = -1;
441             m_errorLog.append(Env.NL).append(delete ? "DELETE " : "UPDATE ")
442                 .append(TableName).append(" - ").append(ex.toString());
443         }
444         return count;
445     } // mergeTable
446

447 } // VMerge
448
Popular Tags