1 14 package org.compiere.apps; 15 16 import java.awt.*; 17 import java.sql.*; 18 import java.util.*; 19 import javax.swing.*; 20 21 import org.compiere.util.*; 22 import org.compiere.process.*; 23 import org.compiere.print.*; 24 25 31 public class ProcessCtl extends Thread 32 { 33 51 public static ProcessCtl process (ASyncProcess parent, int WindowNo, ProcessInfo pi) 52 { 53 Log.trace(Log.l2_Sub, "ProcessCtl.process - WindowNo=" + WindowNo, pi); 54 55 pi.setAD_PInstance_ID (getInstanceID(WindowNo, pi.getAD_Process_ID(), pi.getRecord_ID())); 57 if (pi.getAD_PInstance_ID() == 0) 58 { 59 pi.setSummary (Msg.getMsg(Env.getCtx(), "ProcessNoInstance")); 60 pi.setError (true); 61 return null; 62 } 63 64 ProcessParameter para = new ProcessParameter (Env.getFrame((Container)parent), WindowNo, pi); 66 if (para.initDialog()) 67 { 68 para.show(); 69 if (!para.isOK()) 70 { 71 pi.setSummary (Msg.getMsg(Env.getCtx(), "ProcessCancelled")); 72 pi.setError (true); 73 return null; 74 } 75 } 76 77 ProcessCtl worker = new ProcessCtl(parent, pi); 79 worker.start(); 80 return worker; 81 } 83 84 85 86 95 public static int getInstanceID (int WindowNo, int AD_Process_ID, int Record_ID, int AD_Client_ID, int AD_Org_ID) 96 { 97 99 int AD_PInstance_ID = DB.getKeyNextNo(Env.getCtx(), WindowNo, "AD_PInstance"); 101 if (AD_PInstance_ID == 0) 102 return 0; 103 int AD_User_ID = Env.getContextAsInt(Env.getCtx(), "#AD_User_ID"); 105 106 String sql = "INSERT INTO AD_PInstance (AD_Client_ID,AD_Org_ID, IsActive, Created,CreatedBy,Updated,UpdatedBy," 108 + " AD_PInstance_ID, AD_Process_ID, Record_ID, AD_User_ID) " 109 + "VALUES (" + AD_Client_ID + "," + AD_Org_ID 110 + ",'Y',SysDate," + AD_User_ID + ",SysDate," + AD_User_ID + "," 111 + AD_PInstance_ID + "," + AD_Process_ID + "," + Record_ID + "," + AD_User_ID + ")"; 112 try 113 { 114 Statement stmt = DB.createStatement(); 115 int n = stmt.executeUpdate(sql.toString()); 116 stmt.close(); 117 } 118 catch (SQLException e) 119 { 120 Log.error("ProcessCtl.getInstanceID", e); 121 return 0; 122 } 123 Log.trace(Log.l4_Data, "ProcessCtl.getInstanceID = " + AD_PInstance_ID); 125 return AD_PInstance_ID; 126 } 128 135 public static int getInstanceID (int WindowNo, int AD_Process_ID, int Record_ID) 136 { 137 return getInstanceID (WindowNo, AD_Process_ID, Record_ID, 138 Env.getContextAsInt(Env.getCtx(), WindowNo, "AD_Client_ID"), 139 Env.getContextAsInt(Env.getCtx(), WindowNo, "AD_Org_ID")); 140 } 142 143 144 157 private static boolean startClass (Properties ctx, String ClassName, ProcessInfo pi) 158 { 159 Log.trace(Log.l4_Data, "ProcessCtl.startClass - " + ClassName, pi); 160 boolean retValue = false; 161 ProcessCall myObject = null; 162 try 163 { 164 Class myClass = Class.forName(ClassName); 165 myObject = (ProcessCall)myClass.newInstance(); 166 if (myObject == null) 167 retValue = false; 168 else 169 retValue = myObject.startProcess(ctx, pi); 170 } 171 catch (Exception e) 172 { 173 pi.setSummary("Error Start Class " + ClassName, true); 174 Log.error("ProcessCtl.startClass - " + ClassName, e); 175 retValue = false; 176 } 177 178 return retValue; 179 } 181 182 183 184 190 private static boolean startProcess (String ProcedureName, ProcessInfo pi) 191 { 192 Log.trace(Log.l4_Data, "ProcessCtl.startProcess", ProcedureName + "(" + pi.getAD_PInstance_ID() + ")"); 194 try 195 { 196 String sql = "{CALL " + ProcedureName + "(?)}"; 197 CallableStatement cstmt = DB.prepareCall(sql); cstmt.setInt(1, pi.getAD_PInstance_ID()); 199 cstmt.executeUpdate(); 200 cstmt.close(); 201 } 202 catch (Exception e) 203 { 204 Log.error("ProcessCtl.startProcess", e); 205 pi.setSummary (Msg.getMsg(Env.getCtx(), "ProcessRunError") + " " + e.getLocalizedMessage()); 206 pi.setError (true); 207 return false; 208 } 209 return true; 211 } 213 214 215 221 public ProcessCtl (ASyncProcess parent, ProcessInfo pi) 222 { 223 m_parent = parent; 224 m_pi = pi; 225 } 227 private ASyncProcess m_parent; 228 private ProcessInfo m_pi; 229 private Waiting m_waiting; 230 231 241 public void run () 242 { 243 Log.trace(Log.l3_Util, "ProcessCtl.run", "AD_PInstance_ID=" + m_pi.getAD_PInstance_ID() 244 + ", Record_ID=" + m_pi.getRecord_ID()); 245 246 lock(); 248 250 String ProcedureName = ""; 252 String ClassName = ""; 253 int AD_ReportView_ID = 0; 254 boolean IsReport = false; 255 boolean IsDirectPrint = false; 256 String SQL = "SELECT p.Name, p.ProcedureName,p.ClassName, p.AD_Process_ID," 258 + " p.isReport,p.IsDirectPrint,p.AD_ReportView_ID," 259 + " DECODE(p.Statistic_Count,0,0, p.Statistic_Seconds/p.Statistic_Count) " 260 + "FROM AD_Process p, AD_PInstance i " 261 + "WHERE p.AD_Process_ID=i.AD_Process_ID AND p.IsActive='Y'" 262 + " AND i.AD_PInstance_ID=?"; 263 if (!Env.isBaseLanguage(Env.getCtx(), "AD_Process")) 264 SQL = "SELECT t.Name, p.ProcedureName,p.ClassName, p.AD_Process_ID," 265 + " p.isReport, p.IsDirectPrint,AD_ReportView_ID," 266 + " DECODE(p.Statistic_Count,0,0, p.Statistic_Seconds/p.Statistic_Count) " 267 + "FROM AD_Process p, AD_Process_Trl t, AD_PInstance i " 268 + "WHERE p.AD_Process_ID=i.AD_Process_ID" 269 + " AND p.AD_Process_ID=t.AD_Process_ID AND p.IsActive='Y'" 270 + " AND i.AD_PInstance_ID=?" 271 + " AND t.AD_Language='" + Env.getAD_Language(Env.getCtx()) + "'"; 272 try 274 { 275 PreparedStatement pstmt = DB.prepareStatement(SQL, ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY); 276 pstmt.setInt(1, m_pi.getAD_PInstance_ID()); 277 ResultSet rs = pstmt.executeQuery(); 278 if (rs.next()) 279 { 280 m_pi.setTitle (rs.getString(1)); 281 if (m_waiting != null) 282 m_waiting.setTitle(m_pi.getTitle()); 283 ProcedureName = rs.getString(2); 284 ClassName = rs.getString(3); 285 m_pi.setAD_Process_ID (rs.getInt(4)); 286 if ("Y".equals(rs.getString(5))) 288 { 289 IsReport = true; 290 if ("Y".equals(rs.getString(6)) && !Ini.getPropertyBool(Ini.P_PRINTPREVIEW)) 291 IsDirectPrint = true; 292 } 293 AD_ReportView_ID = rs.getInt(7); 294 int estimate = rs.getInt(8); 296 if (estimate != 0) 297 { 298 m_pi.setEstSeconds (estimate + 1); if (m_waiting != null) 300 m_waiting.setTimerEstimate(m_pi.getEstSeconds()); 301 } 302 } 303 else 304 Log.error("ProcessCtrl.run - no AD_PInstance_ID=" + m_pi.getAD_PInstance_ID()); 305 rs.close(); 306 pstmt.close(); 307 } 308 catch (SQLException e) 309 { 310 m_pi.setSummary (Msg.getMsg(Env.getCtx(), "ProcessNoProcedure") + " " + e.getLocalizedMessage(), true); 311 unlock(); 312 Log.error("ProcessCtrl.run", e); 313 return; 314 } 315 316 if (ProcedureName == null) 318 ProcedureName = ""; 319 320 if (ClassName != null && ClassName.length() > 0) 322 { 323 if (!startClass (Env.getCtx(), ClassName, m_pi)) 325 { 326 unlock(); 327 return; 328 } 329 330 if (!IsReport && ProcedureName.length() == 0) 332 { 333 unlock (); 334 return; 335 } 336 if (IsReport && AD_ReportView_ID == 0) 338 { 339 unlock (); 340 return; 341 } 342 } 343 344 if (!IsReport && ProcedureName.length() == 0) 346 { 347 m_pi.setSummary (Msg.getMsg(Env.getCtx(), "ProcessNoProcedure"), true); 348 unlock(); 349 return; 350 } 351 352 355 if (IsReport) 356 { 357 if (ProcedureName.length() > 0) 359 { 360 if (!startProcess(ProcedureName, m_pi)) 361 { 362 unlock(); 363 return; 364 } 365 } 367 boolean ok = ReportCtl.start(m_pi, IsDirectPrint); 369 m_pi.setSummary("Report", !ok); 370 unlock (); 371 } 372 375 else 376 { 377 if (!startProcess(ProcedureName, m_pi)) 378 { 379 unlock(); 380 return; 381 } 382 ProcessInfoUtil.setSummaryFromDB(m_pi); 384 unlock(); 385 } } 389 392 private void lock () 393 { 394 JFrame frame = Env.getFrame((Container)m_parent); 396 if (frame instanceof AWindow) 397 ((AWindow)frame).setBusyTimer(m_pi.getEstSeconds()); 398 else 399 m_waiting = new Waiting (frame, Msg.getMsg(Env.getCtx(), "Processing"), false, m_pi.getEstSeconds()); 400 SwingUtilities.invokeLater(new Runnable () 401 { 402 public void run() 403 { 404 Log.trace(Log.l5_DData, "ProcessCtl.lock"); 405 m_parent.lockUI(m_pi); 406 } 407 }); 408 if (m_waiting != null) 409 m_waiting.toFront(); 410 } 412 415 private void unlock () 416 { 417 if (m_pi.getSummary().indexOf("@") != -1) 418 m_pi.setSummary(Msg.parseTranslation(Env.getCtx(), m_pi.getSummary())); 419 SwingUtilities.invokeLater(new Runnable () 420 { 421 public void run() 422 { 423 Log.trace(Log.l5_DData, "ProcessCtl.unlock"); 424 m_parent.unlockUI(m_pi); 425 } 426 }); 427 if (m_waiting != null) 428 m_waiting.dispose(); 429 m_waiting = null; 430 } 432 } | Popular Tags |