();
- else
- m_Attachments.clear();
- PreparedStatement pstmt = DB.prepareStatement(SQL, null);
- pstmt.setInt(1, m_vo.AD_Table_ID);
- ResultSet rs = pstmt.executeQuery();
- while (rs.next())
- {
- Integer key = new Integer(rs.getInt(2));
- Integer value = new Integer(rs.getInt(1));
- m_Attachments.put(key, value);
- }
- rs.close();
- pstmt.close();
- }
- catch (SQLException e)
- {
- log.log(Level.SEVERE, "loadAttachments", e);
- }
- log.config("#" + m_Attachments.size());
- } // loadAttachment
-
/**
* Can this tab have Attachments?.
*
@@ -2091,13 +2043,7 @@ public class GridTab implements DataStatusListener, Evaluatee, Serializable
*/
public boolean hasAttachment()
{
- if (m_Attachments == null)
- loadAttachments();
- if (m_Attachments == null || m_Attachments.isEmpty())
- return false;
- //
- Integer key = new Integer(m_mTable.getKeyID (m_currentRow));
- return m_Attachments.containsKey(key);
+ return getAD_AttachmentID() > 0;
} // hasAttachment
/**
@@ -2106,54 +2052,11 @@ public class GridTab implements DataStatusListener, Evaluatee, Serializable
*/
public int getAD_AttachmentID()
{
- if (m_Attachments == null)
- loadAttachments();
- if (m_Attachments.isEmpty())
- return 0;
- //
- Integer key = new Integer(m_mTable.getKeyID (m_currentRow));
- Integer value = (Integer)m_Attachments.get(key);
- if (value == null)
- return 0;
- else
- return value.intValue();
- } // getAttachmentID
-
- /**************************************************************************
- * Load Chats for this table
- */
- public void loadChats()
- {
- log.fine("#" + m_vo.TabNo);
if (!canHaveAttachment())
- return;
-
- String sql = "SELECT CM_Chat_ID, Record_ID FROM CM_Chat "
- + "WHERE AD_Table_ID=?";
- try
- {
- if (m_Chats == null)
- m_Chats = new HashMap();
- else
- m_Chats.clear();
- PreparedStatement pstmt = DB.prepareStatement(sql, null);
- pstmt.setInt(1, m_vo.AD_Table_ID);
- ResultSet rs = pstmt.executeQuery();
- while (rs.next())
- {
- Integer key = new Integer(rs.getInt(2)); // Record_ID
- Integer value = new Integer(rs.getInt(1)); // CM_Chat_ID
- m_Chats.put(key, value);
- }
- rs.close();
- pstmt.close();
- }
- catch (SQLException e)
- {
- log.log(Level.SEVERE, sql, e);
- }
- log.config("#" + m_Chats.size());
- } // loadChats
+ return 0;
+ int recordID = m_mTable.getKeyID(m_currentRow);
+ return MAttachment.getID(m_vo.AD_Table_ID, recordID);
+ } // getAttachmentID
/**
* Returns true, if current row has a Chat
@@ -2161,13 +2064,7 @@ public class GridTab implements DataStatusListener, Evaluatee, Serializable
*/
public boolean hasChat()
{
- if (m_Chats == null)
- loadChats();
- if (m_Chats == null || m_Chats.isEmpty())
- return false;
- //
- Integer key = new Integer(m_mTable.getKeyID (m_currentRow));
- return m_Chats.containsKey(key);
+ return getCM_ChatID() > 0;
} // hasChat
/**
@@ -2176,17 +2073,10 @@ public class GridTab implements DataStatusListener, Evaluatee, Serializable
*/
public int getCM_ChatID()
{
- if (m_Chats == null)
- loadChats();
- if (m_Chats.isEmpty())
+ if (!canHaveAttachment())
return 0;
- //
- Integer key = new Integer(m_mTable.getKeyID (m_currentRow));
- Integer value = (Integer)m_Chats.get(key);
- if (value == null)
- return 0;
- else
- return value.intValue();
+ int recordID = m_mTable.getKeyID(m_currentRow);
+ return MChat.getID(m_vo.AD_Table_ID, recordID);
} // getCM_ChatID
diff --git a/org.adempiere.base/src/org/compiere/model/MAttachment.java b/org.adempiere.base/src/org/compiere/model/MAttachment.java
index d115d7d47e..ab45213663 100644
--- a/org.adempiere.base/src/org/compiere/model/MAttachment.java
+++ b/org.adempiere.base/src/org/compiere/model/MAttachment.java
@@ -26,6 +26,7 @@ import java.util.Properties;
import java.util.logging.Level;
import org.compiere.util.CLogger;
+import org.compiere.util.DB;
import org.compiere.util.Env;
import org.compiere.util.MimeType;
@@ -47,7 +48,7 @@ public class MAttachment extends X_AD_Attachment
/**
*
*/
- private static final long serialVersionUID = -8013716602070647299L;
+ private static final long serialVersionUID = -8261865873158774665L;
/**
* Get Attachment (if there are more than one attachment it gets the first in no specific order)
@@ -94,9 +95,7 @@ public class MAttachment extends X_AD_Attachment
*/
public MAttachment(Properties ctx, int AD_Table_ID, int Record_ID, String trxName)
{
- this (ctx
- , MAttachment.get(ctx, AD_Table_ID, Record_ID) == null ? 0 : MAttachment.get(ctx, AD_Table_ID, Record_ID).get_ID()
- , trxName);
+ this (ctx, MAttachment.getID(AD_Table_ID, Record_ID) > 0 ? MAttachment.getID(AD_Table_ID, Record_ID) : 0, trxName);
if (get_ID() == 0) {
setAD_Table_ID (AD_Table_ID);
setRecord_ID (Record_ID);
@@ -598,4 +597,17 @@ public class MAttachment extends X_AD_Attachment
return true;
}
+ /**
+ * IDEMPIERE-530
+ * Get the attachment ID based on table_id and record_id
+ * @param AD_Table_ID
+ * @param Record_ID
+ * @return AD_Attachment_ID
+ */
+ public static int getID(int Table_ID, int Record_ID) {
+ String sql="SELECT AD_Attachment_ID FROM AD_Attachment WHERE AD_Table_ID=? AND Record_ID=?";
+ int attachid = DB.getSQLValue(null, sql, Table_ID, Record_ID);
+ return attachid;
+ }
+
} // MAttachment
diff --git a/org.adempiere.base/src/org/compiere/model/MChat.java b/org.adempiere.base/src/org/compiere/model/MChat.java
index 4598ff4391..b55bc34d65 100644
--- a/org.adempiere.base/src/org/compiere/model/MChat.java
+++ b/org.adempiere.base/src/org/compiere/model/MChat.java
@@ -44,8 +44,7 @@ public class MChat extends X_CM_Chat
/**
*
*/
- private static final long serialVersionUID = -5053130533036069784L;
-
+ private static final long serialVersionUID = 9165439123618441913L;
/**
* Get Chats Of Table - of client in context
@@ -240,7 +239,19 @@ public class MChat extends X_CM_Chat
} // entry
//
return history;
- } // getHistory
-
+ } // getHistory
+
+ /**
+ * IDEMPIERE-530
+ * Get the chat ID based on table_id and record_id
+ * @param AD_Table_ID
+ * @param Record_ID
+ * @return CM_Chat_ID
+ */
+ public static int getID(int Table_ID, int Record_ID) {
+ String sql="SELECT CM_Chat_ID FROM CM_Chat WHERE AD_Table_ID=? AND Record_ID=?";
+ int chatID = DB.getSQLValueEx(null, sql, Table_ID, Record_ID);
+ return chatID;
+ }
} // MChat
diff --git a/org.adempiere.base/src/org/compiere/model/MEXPProcessor.java b/org.adempiere.base/src/org/compiere/model/MEXPProcessor.java
index b2d69b69c2..c300207d61 100644
--- a/org.adempiere.base/src/org/compiere/model/MEXPProcessor.java
+++ b/org.adempiere.base/src/org/compiere/model/MEXPProcessor.java
@@ -51,7 +51,7 @@ public class MEXPProcessor extends X_EXP_Processor {
/** Static Logger */
private static CLogger s_log = CLogger.getCLogger (MEXPProcessor.class);
- private static MEXPProcessor processor= null;
+ private volatile static MEXPProcessor processor= null;
private X_EXP_ProcessorParameter[] parameters = null;
public static MEXPProcessor get(Properties ctx, int EXP_Processor_ID, String trxName)
diff --git a/org.adempiere.base/src/org/compiere/model/MLocator.java b/org.adempiere.base/src/org/compiere/model/MLocator.java
index 67c3d306a3..2ece305a49 100644
--- a/org.adempiere.base/src/org/compiere/model/MLocator.java
+++ b/org.adempiere.base/src/org/compiere/model/MLocator.java
@@ -186,7 +186,7 @@ public class MLocator extends X_M_Locator
} // get
/** Cache */
- private static CCache s_cache;
+ private volatile static CCache s_cache;
/** Logger */
private static CLogger s_log = CLogger.getCLogger (MLocator.class);
diff --git a/org.adempiere.base/src/org/compiere/model/MRequestType.java b/org.adempiere.base/src/org/compiere/model/MRequestType.java
index e447537429..1e8363092e 100644
--- a/org.adempiere.base/src/org/compiere/model/MRequestType.java
+++ b/org.adempiere.base/src/org/compiere/model/MRequestType.java
@@ -196,7 +196,7 @@ public class MRequestType extends X_R_RequestType
* Get Total No of requests of type
* @return no
*/
- public int getTotalNo()
+ public synchronized int getTotalNo()
{
updateStatistics();
return m_totalNo;
@@ -206,7 +206,7 @@ public class MRequestType extends X_R_RequestType
* Get Open No of requests of type
* @return no
*/
- public int getOpenNo()
+ public synchronized int getOpenNo()
{
updateStatistics();
return m_openNo;
@@ -216,7 +216,7 @@ public class MRequestType extends X_R_RequestType
* Get Closed in last 30 days of type
* @return no
*/
- public int getClosed30No()
+ public synchronized int getClosed30No()
{
updateStatistics();
return m_closed30No;
@@ -226,7 +226,7 @@ public class MRequestType extends X_R_RequestType
* Get New in the last 30 days of type
* @return no
*/
- public int getNew30No()
+ public synchronized int getNew30No()
{
updateStatistics();
return m_new30No;
diff --git a/org.adempiere.base/src/org/compiere/model/MSystem.java b/org.adempiere.base/src/org/compiere/model/MSystem.java
index fed85f1340..a983d7d81e 100644
--- a/org.adempiere.base/src/org/compiere/model/MSystem.java
+++ b/org.adempiere.base/src/org/compiere/model/MSystem.java
@@ -62,7 +62,7 @@ public class MSystem extends X_AD_System
* @param ctx context
* @return System
*/
- public static MSystem get (Properties ctx)
+ public synchronized static MSystem get (Properties ctx)
{
if (s_system != null)
return s_system;
diff --git a/org.adempiere.base/src/org/compiere/model/MUserDefWin.java b/org.adempiere.base/src/org/compiere/model/MUserDefWin.java
index bd52bbfbb9..511b2eb0cf 100644
--- a/org.adempiere.base/src/org/compiere/model/MUserDefWin.java
+++ b/org.adempiere.base/src/org/compiere/model/MUserDefWin.java
@@ -35,7 +35,7 @@ public class MUserDefWin extends X_AD_UserDef_Win
*/
private static final long serialVersionUID = -5775251886672840324L;
- private static List m_fullList = null;
+ private volatile static List m_fullList = null;
/**
* Standard constructor.
diff --git a/org.adempiere.base/src/org/compiere/model/TranslationTable.java b/org.adempiere.base/src/org/compiere/model/TranslationTable.java
index f6528a3feb..17ecde661c 100644
--- a/org.adempiere.base/src/org/compiere/model/TranslationTable.java
+++ b/org.adempiere.base/src/org/compiere/model/TranslationTable.java
@@ -65,7 +65,7 @@ public class TranslationTable
* @param requery requery
* @return number of active Translations
*/
- public static int getActiveLanguages (boolean requery)
+ public synchronized static int getActiveLanguages (boolean requery)
{
if (s_activeLanguages != null && !requery)
return s_activeLanguages.intValue();
diff --git a/org.adempiere.base/src/org/compiere/print/ArchiveEngine.java b/org.adempiere.base/src/org/compiere/print/ArchiveEngine.java
index 6594b201f9..db23742186 100644
--- a/org.adempiere.base/src/org/compiere/print/ArchiveEngine.java
+++ b/org.adempiere.base/src/org/compiere/print/ArchiveEngine.java
@@ -195,7 +195,7 @@ public class ArchiveEngine
/** Logger */
private static CLogger log = CLogger.getCLogger(ArchiveEngine.class);
/** Singleton */
- private static ArchiveEngine s_engine = null;
+ private volatile static ArchiveEngine s_engine = null;
/**************************************************************************
diff --git a/org.adempiere.base/src/org/compiere/print/util/SwapFile.java b/org.adempiere.base/src/org/compiere/print/util/SwapFile.java
index 51c0764980..89f8f8438b 100644
--- a/org.adempiere.base/src/org/compiere/print/util/SwapFile.java
+++ b/org.adempiere.base/src/org/compiere/print/util/SwapFile.java
@@ -171,7 +171,7 @@ public class SwapFile
freeBlocks(segment.getOffsets());
}
- private void verifyOpen() {
+ private synchronized void verifyOpen() {
if (randomAccessFile == null) {
throw new RuntimeException("Swap file not open for read write access");
}
diff --git a/org.adempiere.base/src/org/compiere/process/SvrProcess.java b/org.adempiere.base/src/org/compiere/process/SvrProcess.java
index a4374b6f58..927867ff8f 100644
--- a/org.adempiere.base/src/org/compiere/process/SvrProcess.java
+++ b/org.adempiere.base/src/org/compiere/process/SvrProcess.java
@@ -108,8 +108,10 @@ public abstract class SvrProcess implements ProcessCall
boolean success = false;
+ ClassLoader contextLoader = Thread.currentThread().getContextClassLoader();
try
{
+ Thread.currentThread().setContextClassLoader(getClass().getClassLoader());
m_ctx.put(PROCESS_INFO_CTX_KEY, m_pi);
if (processUI != null)
m_ctx.put(PROCESS_UI_CTX_KEY, processUI);
@@ -143,6 +145,8 @@ public abstract class SvrProcess implements ProcessCall
// outside transaction processing [ teo_sarca, 1646891 ]
postProcess(!m_pi.isError());
+
+ Thread.currentThread().setContextClassLoader(contextLoader);
}
return !m_pi.isError();
diff --git a/org.adempiere.base/src/org/compiere/util/CCachedRowSet.java b/org.adempiere.base/src/org/compiere/util/CCachedRowSet.java
index 13aa1a1168..16a889b3a5 100644
--- a/org.adempiere.base/src/org/compiere/util/CCachedRowSet.java
+++ b/org.adempiere.base/src/org/compiere/util/CCachedRowSet.java
@@ -52,7 +52,7 @@ public class CCachedRowSet extends CachedRowSetImpl implements CachedRowSet
* @return Cached Row Set
* @throws SQLException
*/
- public static CCachedRowSet get() throws SQLException
+ public synchronized static CCachedRowSet get() throws SQLException
{
CCachedRowSet crs = null;
// only first time call
diff --git a/org.adempiere.base/src/org/compiere/util/CLogMgt.java b/org.adempiere.base/src/org/compiere/util/CLogMgt.java
index 49b3fb372d..e74a46ad2c 100644
--- a/org.adempiere.base/src/org/compiere/util/CLogMgt.java
+++ b/org.adempiere.base/src/org/compiere/util/CLogMgt.java
@@ -23,6 +23,7 @@ import java.net.InetAddress;
import java.sql.DriverManager;
import java.util.ArrayList;
import java.util.Arrays;
+import java.util.Collection;
import java.util.Enumeration;
import java.util.Iterator;
import java.util.List;
@@ -35,9 +36,12 @@ import java.util.logging.Level;
import java.util.logging.LogManager;
import java.util.logging.Logger;
+import org.adempiere.base.Service;
import org.compiere.Adempiere;
import org.compiere.db.CConnection;
import org.compiere.model.MClient;
+import org.idempiere.distributed.IClusterMember;
+import org.idempiere.distributed.IClusterService;
/**
@@ -542,6 +546,24 @@ public class CLogMgt
//thread info
sb.append("Active Threads = " + Thread.activeCount());
//
+ //cluster info
+ if (Env.getAD_Client_ID(Env.getCtx()) == 0) {
+ IClusterService service = Service.locator().locate(IClusterService.class).getService();
+ if (service != null) {
+ IClusterMember local = service.getLocalMember();
+ Collection members = service.getMembers();
+ if (!members.isEmpty())
+ sb.append(NL).append("Cluster Nodes:").append(NL);
+ for(IClusterMember member : members) {
+ sb.append(member.toString());
+ if (local != null && member.getId().equals(local.getId())) {
+ sb.append(" *");
+ }
+ sb.append(NL);
+ }
+ }
+ }
+
return sb;
} // getInfo
diff --git a/org.adempiere.base/src/org/compiere/util/CLogger.java b/org.adempiere.base/src/org/compiere/util/CLogger.java
index 072a064293..653746224e 100644
--- a/org.adempiere.base/src/org/compiere/util/CLogger.java
+++ b/org.adempiere.base/src/org/compiere/util/CLogger.java
@@ -116,7 +116,7 @@ public class CLogger extends Logger implements Serializable
} // get
/** Default Logger */
- private static CLogger s_logger = null;
+ private volatile static CLogger s_logger = null;
/**************************************************************************
diff --git a/org.adempiere.base/src/org/compiere/util/DB.java b/org.adempiere.base/src/org/compiere/util/DB.java
index 28e5092a70..69282464a4 100644
--- a/org.adempiere.base/src/org/compiere/util/DB.java
+++ b/org.adempiere.base/src/org/compiere/util/DB.java
@@ -255,7 +255,7 @@ public final class DB
* Set connection
* @param cc connection
*/
- public static void setDBTarget (CConnection cc)
+ public synchronized static void setDBTarget (CConnection cc)
{
if (cc == null)
throw new IllegalArgumentException("Connection is NULL");
diff --git a/org.adempiere.base/src/org/compiere/util/Env.java b/org.adempiere.base/src/org/compiere/util/Env.java
index f3f75276d8..1182442673 100644
--- a/org.adempiere.base/src/org/compiere/util/Env.java
+++ b/org.adempiere.base/src/org/compiere/util/Env.java
@@ -232,7 +232,8 @@ public final class Env
}
/**
- * Set Context
+ * Replace the contents of the current session/process context.
+ * Don't use this to setup a new session/process context, use ServerContext.setCurrentInstance instead.
* @param ctx context
*/
public static void setCtx (Properties ctx)
diff --git a/org.adempiere.base/src/org/compiere/util/Ini.java b/org.adempiere.base/src/org/compiere/util/Ini.java
index b39307c61e..9f121f7e69 100644
--- a/org.adempiere.base/src/org/compiere/util/Ini.java
+++ b/org.adempiere.base/src/org/compiere/util/Ini.java
@@ -224,7 +224,7 @@ public final class Ini implements Serializable
};
/** Container for Properties */
- private static Properties s_prop = new Properties();
+ private volatile static Properties s_prop = new Properties();
private static String s_propertyFileName = null;
diff --git a/org.adempiere.base/src/org/compiere/util/SecureEngine.java b/org.adempiere.base/src/org/compiere/util/SecureEngine.java
index 796a532060..ef9be7313c 100644
--- a/org.adempiere.base/src/org/compiere/util/SecureEngine.java
+++ b/org.adempiere.base/src/org/compiere/util/SecureEngine.java
@@ -217,7 +217,7 @@ public class SecureEngine
/** Test String */
private static final String TEST = "This is a 0123456789 .,; -= Test!";
/** Secure Engine */
- private static SecureEngine s_engine = null;
+ private volatile static SecureEngine s_engine = null;
/** The real Engine */
private SecureInterface implementation = null;
diff --git a/org.adempiere.base/src/org/compiere/util/WebInfo.java b/org.adempiere.base/src/org/compiere/util/WebInfo.java
index 07521402e8..d32b3ba5b0 100644
--- a/org.adempiere.base/src/org/compiere/util/WebInfo.java
+++ b/org.adempiere.base/src/org/compiere/util/WebInfo.java
@@ -64,7 +64,7 @@ public class WebInfo
} // getGeneral
/** General Info */
- private static WebInfo m_general = null;
+ private volatile static WebInfo m_general = null;
/**
* Constructor
diff --git a/org.adempiere.base/src/org/compiere/util/WebUser.java b/org.adempiere.base/src/org/compiere/util/WebUser.java
index 92db947e16..5f8fea21ca 100644
--- a/org.adempiere.base/src/org/compiere/util/WebUser.java
+++ b/org.adempiere.base/src/org/compiere/util/WebUser.java
@@ -107,7 +107,7 @@ public class WebUser
} // get
/** Short term Cache for immediate re-query/post (hit rate 20%) */
- private static WebUser s_cache = null;
+ private volatile static WebUser s_cache = null;
/*************************************************************************/
diff --git a/org.adempiere.base/src/org/compiere/wf/DocWorkflowManager.java b/org.adempiere.base/src/org/compiere/wf/DocWorkflowManager.java
index 5c4772a472..c5d91ac441 100644
--- a/org.adempiere.base/src/org/compiere/wf/DocWorkflowManager.java
+++ b/org.adempiere.base/src/org/compiere/wf/DocWorkflowManager.java
@@ -55,7 +55,7 @@ public class DocWorkflowManager implements DocWorkflowMgr
}
/** Document Workflow Manager */
- private static DocWorkflowManager s_mgr = null;
+ private volatile static DocWorkflowManager s_mgr = null;
/** Logger */
private static CLogger log = CLogger.getCLogger(DocWorkflowManager.class);
diff --git a/org.adempiere.base/src/org/idempiere/distributed/IClusterMember.java b/org.adempiere.base/src/org/idempiere/distributed/IClusterMember.java
index 0e9362796c..ceb56e344f 100644
--- a/org.adempiere.base/src/org/idempiere/distributed/IClusterMember.java
+++ b/org.adempiere.base/src/org/idempiere/distributed/IClusterMember.java
@@ -5,4 +5,5 @@ import java.net.InetAddress;
public interface IClusterMember {
public String getId();
public InetAddress getAddress();
+ public int getPort();
}
diff --git a/org.adempiere.eclipse.equinox.http.servlet/src/org/eclipse/equinox/http/servlet/internal/HttpServiceImpl.java b/org.adempiere.eclipse.equinox.http.servlet/src/org/eclipse/equinox/http/servlet/internal/HttpServiceImpl.java
index 0d99739af1..8589e2986b 100644
--- a/org.adempiere.eclipse.equinox.http.servlet/src/org/eclipse/equinox/http/servlet/internal/HttpServiceImpl.java
+++ b/org.adempiere.eclipse.equinox.http.servlet/src/org/eclipse/equinox/http/servlet/internal/HttpServiceImpl.java
@@ -50,7 +50,7 @@ public class HttpServiceImpl implements HttpService, ExtendedHttpService {
shutdown = true;
}
- private void checkShutdown() {
+ private synchronized void checkShutdown() {
if (shutdown)
throw new IllegalStateException("Service instance is already shutdown"); //$NON-NLS-1$
}
diff --git a/org.adempiere.eclipse.equinox.http.servlet/src/org/eclipse/equinox/http/servlet/internal/ProxyServlet.java b/org.adempiere.eclipse.equinox.http.servlet/src/org/eclipse/equinox/http/servlet/internal/ProxyServlet.java
index a9c051c653..f9d1854f9c 100644
--- a/org.adempiere.eclipse.equinox.http.servlet/src/org/eclipse/equinox/http/servlet/internal/ProxyServlet.java
+++ b/org.adempiere.eclipse.equinox.http.servlet/src/org/eclipse/equinox/http/servlet/internal/ProxyServlet.java
@@ -42,7 +42,7 @@ public class ProxyServlet extends HttpServlet implements Filter {
Activator.addProxyServlet(this);
}
- public void destroy() {
+ public synchronized void destroy() {
Activator.removeProxyServlet(this);
proxyContext.destroy();
proxyContext = null;
@@ -56,7 +56,7 @@ public class ProxyServlet extends HttpServlet implements Filter {
process(req, resp, null);
}
- protected void process(HttpServletRequest req, HttpServletResponse resp, FilterChain filterChain) throws ServletException, IOException {
+ protected synchronized void process(HttpServletRequest req, HttpServletResponse resp, FilterChain filterChain) throws ServletException, IOException {
proxyContext.initializeServletPath(req, filterChain);
String alias = HttpServletRequestAdaptor.getDispatchPathInfo(req, filterChain);
if (alias == null)
diff --git a/org.adempiere.eclipse.equinox.servletbridge/src/org/eclipse/equinox/servletbridge/BridgeServlet.java b/org.adempiere.eclipse.equinox.servletbridge/src/org/eclipse/equinox/servletbridge/BridgeServlet.java
index 177b467a4c..f66b1dcc74 100644
--- a/org.adempiere.eclipse.equinox.servletbridge/src/org/eclipse/equinox/servletbridge/BridgeServlet.java
+++ b/org.adempiere.eclipse.equinox.servletbridge/src/org/eclipse/equinox/servletbridge/BridgeServlet.java
@@ -35,7 +35,7 @@ public class BridgeServlet extends HttpServlet {
private static HttpServlet servletDelegateInstance;
private HttpServlet delegate;
// true if current HttpServlet is an HTTP Filter and false otherwise.
- private boolean delegateIsFilter;
+ private static boolean delegateIsFilter;
private int delegateReferenceCount;
/**
@@ -175,7 +175,7 @@ public class BridgeServlet extends HttpServlet {
try {
// cache the flag if HttpServlet servlet delegate is an HTTP Filter.
- instance.delegateIsFilter = (servletDelegate instanceof Filter);
+ BridgeServlet.delegateIsFilter = (servletDelegate instanceof Filter);
// initialize the servlet delegate.
servletDelegate.init(instance.getServletConfig());
} catch (ServletException e) {
@@ -207,7 +207,7 @@ public class BridgeServlet extends HttpServlet {
HttpServlet oldProxy = instance.delegate;
instance.delegate = null;
- instance.delegateIsFilter = false;
+ BridgeServlet.delegateIsFilter = false;
while (instance.delegateReferenceCount != 0) {
try {
instance.wait();
diff --git a/org.adempiere.pipo.handlers/src/org/adempiere/pipo2/handler/GenericPOElementHandler.java b/org.adempiere.pipo.handlers/src/org/adempiere/pipo2/handler/GenericPOElementHandler.java
index 161183c1a6..b115ae2865 100644
--- a/org.adempiere.pipo.handlers/src/org/adempiere/pipo2/handler/GenericPOElementHandler.java
+++ b/org.adempiere.pipo.handlers/src/org/adempiere/pipo2/handler/GenericPOElementHandler.java
@@ -73,8 +73,8 @@ public class GenericPOElementHandler extends AbstractElementHandler {
String uuidColumn = PO.getUUIDColumnName(tableName);
String idColumn = tableName + "_ID";
MTable table = MTable.get(ctx.ctx, tableName);
- if ((!element.properties.containsKey(uuidColumn) || element.properties.get(uuidColumn).contents == null || element.properties.get(uuidColumn).contents.toString().trim().length() > 0)
- && (!element.properties.containsKey(idColumn) || element.properties.get(idColumn).contents == null || element.properties.get(idColumn).contents.toString().trim().length() > 0)) {
+ if ((!element.properties.containsKey(uuidColumn) || element.properties.get(uuidColumn).contents == null || element.properties.get(uuidColumn).contents.toString().trim().length() == 0)
+ && (!element.properties.containsKey(idColumn) || element.properties.get(idColumn).contents == null || element.properties.get(idColumn).contents.toString().trim().length() == 0)) {
POInfo info = POInfo.getPOInfo(ctx.ctx, table.getAD_Table_ID());
MColumn columns[] = table.getColumns(false);
StringBuilder whereClause = new StringBuilder();
diff --git a/org.adempiere.server/src/main/server/org/compiere/server/AdempiereServer.java b/org.adempiere.server/src/main/server/org/compiere/server/AdempiereServer.java
index 330100a4e2..66d4fe90d8 100644
--- a/org.adempiere.server/src/main/server/org/compiere/server/AdempiereServer.java
+++ b/org.adempiere.server/src/main/server/org/compiere/server/AdempiereServer.java
@@ -102,8 +102,8 @@ public abstract class AdempiereServer implements Runnable
/** Initial nap is seconds */
private int m_initialNap = 0;
- /** Milliseconds to sleep - 10 Min default */
- protected long m_sleepMS = 600000;
+ /** Milliseconds to sleep - 0 Sec default */
+ protected long m_sleepMS = 0;
/** Sleeping */
private volatile boolean m_sleeping = true;
/** Server start time */
@@ -178,6 +178,17 @@ public abstract class AdempiereServer implements Runnable
*/
public void run ()
{
+ final Thread currentThread = Thread.currentThread();
+ final String oldThreadName = currentThread.getName();
+ String newThreadName = getName();
+ boolean renamed = false;
+ if (!oldThreadName.equals(newThreadName)) {
+ try {
+ currentThread.setName(newThreadName);
+ renamed = true;
+ } catch (SecurityException e) {}
+ }
+
m_sleeping = false;
if (m_start == 0)
m_start = System.currentTimeMillis();
@@ -202,7 +213,7 @@ public abstract class AdempiereServer implements Runnable
lastRun = new Timestamp(p_startWork);
}
}
-
+
m_nextWork = MSchedule.getNextRunMS(lastRun.getTime(),
p_model.getScheduleType(), p_model.getFrequencyType(),
p_model.getFrequency(), p_model.getCronPattern());
@@ -214,7 +225,12 @@ public abstract class AdempiereServer implements Runnable
p_model.setDateLastRun(lastRun);
p_model.setDateNextRun(new Timestamp(m_nextWork));
p_model.saveEx();
- m_sleeping = true;
+ m_sleeping = true;
+ if (renamed) {
+ // Revert the name back if the current thread was renamed.
+ // We do not check the exception here because we know it works.
+ currentThread.setName(oldThreadName);
+ }
} // run
/**
diff --git a/org.adempiere.server/src/main/server/org/compiere/server/AdempiereServerGroup.java b/org.adempiere.server/src/main/server/org/compiere/server/AdempiereServerGroup.java
index dad61e56e0..17393879c5 100644
--- a/org.adempiere.server/src/main/server/org/compiere/server/AdempiereServerGroup.java
+++ b/org.adempiere.server/src/main/server/org/compiere/server/AdempiereServerGroup.java
@@ -38,7 +38,7 @@ public class AdempiereServerGroup extends ThreadGroup
} // get
/** Group */
- private static AdempiereServerGroup s_group = null;
+ private volatile static AdempiereServerGroup s_group = null;
/**
* AdempiereServerGroup
diff --git a/org.adempiere.server/src/main/server/org/compiere/server/Scheduler.java b/org.adempiere.server/src/main/server/org/compiere/server/Scheduler.java
index fbfddc204d..a456aada48 100644
--- a/org.adempiere.server/src/main/server/org/compiere/server/Scheduler.java
+++ b/org.adempiere.server/src/main/server/org/compiere/server/Scheduler.java
@@ -23,6 +23,7 @@ import java.text.SimpleDateFormat;
import java.util.Properties;
import java.util.logging.Level;
+import org.adempiere.util.ServerContext;
import org.compiere.model.MAttachment;
import org.compiere.model.MClient;
import org.compiere.model.MNote;
@@ -106,8 +107,7 @@ public class Scheduler extends AdempiereServer
Timestamp ts = new Timestamp(System.currentTimeMillis());
SimpleDateFormat dateFormat4Timestamp = new SimpleDateFormat("yyyy-MM-dd");
Env.setContext(m_schedulerctx, "#Date", dateFormat4Timestamp.format(ts)+" 00:00:00" ); // JDBC format
- Properties currentctx = Env.getCtx();
- Env.setCtx(m_schedulerctx);
+ ServerContext.setCurrentInstance(m_schedulerctx);
MProcess process = new MProcess(m_schedulerctx, m_model.getAD_Process_ID(), null);
try
@@ -129,8 +129,8 @@ public class Scheduler extends AdempiereServer
m_trx.close();
}
- // Restore system context
- Env.setCtx(currentctx);
+ // clear thread local context
+ ServerContext.dispose();
//
int no = m_model.deleteLog();
diff --git a/org.adempiere.server/src/main/servlet/org/adempiere/web/server/command/ExecuteProcessCommand.java b/org.adempiere.server/src/main/servlet/org/adempiere/web/server/command/ExecuteProcessCommand.java
index b9c7df3f6c..f80cbeeda3 100644
--- a/org.adempiere.server/src/main/servlet/org/adempiere/web/server/command/ExecuteProcessCommand.java
+++ b/org.adempiere.server/src/main/servlet/org/adempiere/web/server/command/ExecuteProcessCommand.java
@@ -18,6 +18,7 @@ import java.util.Properties;
import org.adempiere.exceptions.AdempiereException;
import org.adempiere.util.RestletUtil;
+import org.adempiere.util.ServerContext;
import org.compiere.interfaces.impl.ServerBean;
import org.compiere.model.MRole;
import org.compiere.process.ProcessInfo;
@@ -61,12 +62,9 @@ public class ExecuteProcessCommand extends ServerResource {
}
ServerBean bean = new ServerBean();
- //back up properties
- Properties backup = new Properties();
- backup.putAll(Env.getCtx());
try
{
- Env.setCtx(context);
+ ServerContext.setCurrentInstance(context);
if (procedureName != null && procedureName.trim().length() > 0)
return bean.dbProcess(context, pi, procedureName);
else
@@ -74,7 +72,7 @@ public class ExecuteProcessCommand extends ServerResource {
}
finally
{
- Env.setCtx(backup);
+ ServerContext.dispose();
}
}
diff --git a/org.adempiere.server/src/main/servlet/org/adempiere/web/server/command/ExecuteTaskCommand.java b/org.adempiere.server/src/main/servlet/org/adempiere/web/server/command/ExecuteTaskCommand.java
index be39be01de..a3cf5b482c 100644
--- a/org.adempiere.server/src/main/servlet/org/adempiere/web/server/command/ExecuteTaskCommand.java
+++ b/org.adempiere.server/src/main/servlet/org/adempiere/web/server/command/ExecuteTaskCommand.java
@@ -18,6 +18,7 @@ import java.util.Properties;
import org.adempiere.exceptions.AdempiereException;
import org.adempiere.util.RestletUtil;
+import org.adempiere.util.ServerContext;
import org.compiere.interfaces.impl.ServerBean;
import org.compiere.model.MRole;
import org.compiere.util.Env;
@@ -57,17 +58,14 @@ public class ExecuteTaskCommand extends ServerResource {
}
ServerBean bean = new ServerBean();
- //back up properties
- Properties backup = new Properties();
- backup.putAll(Env.getCtx());
try
{
- Env.setCtx(context);
+ ServerContext.setCurrentInstance(context);
return bean.executeTask(context, AD_Task_ID);
}
finally
{
- Env.setCtx(backup);
+ ServerContext.dispose();
}
}
}
diff --git a/org.adempiere.server/src/main/servlet/org/adempiere/web/server/command/ExecuteWorkflowCommand.java b/org.adempiere.server/src/main/servlet/org/adempiere/web/server/command/ExecuteWorkflowCommand.java
index bc7eb9148a..f4f477b9a8 100644
--- a/org.adempiere.server/src/main/servlet/org/adempiere/web/server/command/ExecuteWorkflowCommand.java
+++ b/org.adempiere.server/src/main/servlet/org/adempiere/web/server/command/ExecuteWorkflowCommand.java
@@ -18,6 +18,7 @@ import java.util.Properties;
import org.adempiere.exceptions.AdempiereException;
import org.adempiere.util.RestletUtil;
+import org.adempiere.util.ServerContext;
import org.compiere.interfaces.impl.ServerBean;
import org.compiere.model.MRole;
import org.compiere.process.ProcessInfo;
@@ -60,17 +61,14 @@ public class ExecuteWorkflowCommand extends ServerResource {
}
ServerBean bean = new ServerBean();
- //back up properties
- Properties backup = new Properties();
- backup.putAll(Env.getCtx());
try
{
- Env.setCtx(context);
+ ServerContext.setCurrentInstance(context);
return bean.workflow(context, pi, AD_Workflow_ID);
}
finally
{
- Env.setCtx(backup);
+ ServerContext.dispose();
}
}
}
diff --git a/org.adempiere.server/src/main/servlet/org/adempiere/web/server/command/PostDocumentCommand.java b/org.adempiere.server/src/main/servlet/org/adempiere/web/server/command/PostDocumentCommand.java
index eb4bb68315..71a2302f59 100644
--- a/org.adempiere.server/src/main/servlet/org/adempiere/web/server/command/PostDocumentCommand.java
+++ b/org.adempiere.server/src/main/servlet/org/adempiere/web/server/command/PostDocumentCommand.java
@@ -18,6 +18,7 @@ import java.util.Properties;
import org.adempiere.exceptions.AdempiereException;
import org.adempiere.util.RestletUtil;
+import org.adempiere.util.ServerContext;
import org.compiere.interfaces.impl.ServerBean;
import org.compiere.util.Env;
import org.restlet.representation.Representation;
@@ -57,17 +58,14 @@ public class PostDocumentCommand extends ServerResource {
boolean force = (Boolean) entity.get("force");
ServerBean bean = new ServerBean();
- //back up properties
- Properties backup = new Properties();
- backup.putAll(Env.getCtx());
try
{
- Env.setCtx(context);
+ ServerContext.setCurrentInstance(context);
msg = bean.postImmediate(context, AD_Client_ID, AD_Table_ID, Record_ID, force);
}
finally
{
- Env.setCtx(backup);
+ ServerContext.dispose();
}
return msg;
}
diff --git a/org.adempiere.server/src/main/servlet/org/adempiere/web/server/command/ResetCacheCommand.java b/org.adempiere.server/src/main/servlet/org/adempiere/web/server/command/ResetCacheCommand.java
index 9b445a5c31..86c66c2c63 100644
--- a/org.adempiere.server/src/main/servlet/org/adempiere/web/server/command/ResetCacheCommand.java
+++ b/org.adempiere.server/src/main/servlet/org/adempiere/web/server/command/ResetCacheCommand.java
@@ -18,6 +18,7 @@ import java.util.Properties;
import org.adempiere.exceptions.AdempiereException;
import org.adempiere.util.RestletUtil;
+import org.adempiere.util.ServerContext;
import org.compiere.interfaces.impl.ServerBean;
import org.compiere.util.Env;
import org.restlet.representation.Representation;
@@ -53,17 +54,14 @@ public class ResetCacheCommand extends ServerResource {
String tableName = (String) entity.get("tableName");
ServerBean bean = new ServerBean();
- //back up properties
- Properties backup = new Properties();
- backup.putAll(Env.getCtx());
try
{
- Env.setCtx(context);
+ ServerContext.setCurrentInstance(context);
return bean.cacheReset(context, tableName, Record_ID);
}
finally
{
- Env.setCtx(backup);
+ ServerContext.dispose();
}
}
}
diff --git a/org.adempiere.server/src/main/servlet/org/adempiere/web/server/command/SendEmailCommand.java b/org.adempiere.server/src/main/servlet/org/adempiere/web/server/command/SendEmailCommand.java
index bd292b56ec..50b58c4746 100644
--- a/org.adempiere.server/src/main/servlet/org/adempiere/web/server/command/SendEmailCommand.java
+++ b/org.adempiere.server/src/main/servlet/org/adempiere/web/server/command/SendEmailCommand.java
@@ -18,6 +18,7 @@ import java.util.Properties;
import org.adempiere.exceptions.AdempiereException;
import org.adempiere.util.RestletUtil;
+import org.adempiere.util.ServerContext;
import org.compiere.interfaces.impl.ServerBean;
import org.compiere.util.EMail;
import org.compiere.util.Env;
@@ -53,17 +54,14 @@ public class SendEmailCommand extends ServerResource {
EMail email = (EMail) entity.get("email");
ServerBean bean = new ServerBean();
- //back up properties
- Properties backup = new Properties();
- backup.putAll(Env.getCtx());
try
{
- Env.setCtx(context);
+ ServerContext.setCurrentInstance(context);
return bean.sendEMail(context, email);
}
finally
{
- Env.setCtx(backup);
+ ServerContext.dispose();
}
}
}
diff --git a/org.adempiere.server/src/main/servlet/org/compiere/web/AdempiereMonitor.java b/org.adempiere.server/src/main/servlet/org/compiere/web/AdempiereMonitor.java
index ed7a7eb72e..36f006d63a 100644
--- a/org.adempiere.server/src/main/servlet/org/compiere/web/AdempiereMonitor.java
+++ b/org.adempiere.server/src/main/servlet/org/compiere/web/AdempiereMonitor.java
@@ -94,11 +94,11 @@ public class AdempiereMonitor extends HttpServlet
/** Logger */
private static CLogger log = CLogger.getCLogger(AdempiereMonitor.class);
/** The Server */
- private AdempiereServerMgr m_serverMgr = null;
+ private static AdempiereServerMgr m_serverMgr = null;
/** Message */
- private p m_message = null;
+ private static p m_message = null;
- private ArrayList m_dirAccessList = null;
+ private volatile static ArrayList m_dirAccessList = null;
/**
* Get
diff --git a/org.adempiere.ui.swing/src/org/compiere/apps/APanel.java b/org.adempiere.ui.swing/src/org/compiere/apps/APanel.java
index d536657b1f..aec0feedf7 100644
--- a/org.adempiere.ui.swing/src/org/compiere/apps/APanel.java
+++ b/org.adempiere.ui.swing/src/org/compiere/apps/APanel.java
@@ -2304,11 +2304,10 @@ public final class APanel extends CPanel
return;
}
- // Attachment va =
- new Attachment (AEnv.getFrame(this), m_curWindowNo,
+ @SuppressWarnings("unused")
+ Attachment va = new Attachment (AEnv.getFrame(this), m_curWindowNo,
m_curTab.getAD_AttachmentID(), m_curTab.getAD_Table_ID(), record_ID, null);
//
- m_curTab.loadAttachments(); // reload
aAttachment.setPressed(m_curTab.hasAttachment());
} // attachment
@@ -2345,7 +2344,6 @@ public final class APanel extends CPanel
m_curTab.getCM_ChatID(), m_curTab.getAD_Table_ID(), record_ID,
description, null);
//
- m_curTab.loadChats(); // reload
aChat.setPressed(m_curTab.hasChat());
} // chat
@@ -2368,7 +2366,6 @@ public final class APanel extends CPanel
else
{
m_curTab.lock (Env.getCtx(), record_ID, aLock.getButton().isSelected());
- m_curTab.loadAttachments(); // reload
}
aLock.setPressed(m_curTab.isLocked());
} // lock
diff --git a/org.adempiere.ui.swing/src/org/compiere/apps/Attachment.java b/org.adempiere.ui.swing/src/org/compiere/apps/Attachment.java
index 588a575c62..6d83eb01dc 100644
--- a/org.adempiere.ui.swing/src/org/compiere/apps/Attachment.java
+++ b/org.adempiere.ui.swing/src/org/compiere/apps/Attachment.java
@@ -78,7 +78,7 @@ public final class Attachment extends CDialog
int AD_Table_ID, int Record_ID, String trxName)
{
super (frame, Msg.getMsg(Env.getCtx(), "Attachment"), true);
- // needs to be modal otherwise APanel does not recongize change.
+ // needs to be modal otherwise APanel does not recognize change.
log.config("ID=" + AD_Attachment_ID
+ ", Table=" + AD_Table_ID + ", Record=" + Record_ID);
//
@@ -93,10 +93,10 @@ public final class Attachment extends CDialog
log.log(Level.SEVERE, "", ex);
}
// Create Model
- if (AD_Attachment_ID == 0)
- m_attachment = new MAttachment (Env.getCtx(), AD_Table_ID, Record_ID, trxName);
- else
+ if (AD_Attachment_ID > 0)
m_attachment = new MAttachment (Env.getCtx(), AD_Attachment_ID, trxName);
+ else
+ m_attachment = new MAttachment (Env.getCtx(), AD_Table_ID, Record_ID, trxName);
loadAttachments();
//
try
@@ -112,7 +112,7 @@ public final class Attachment extends CDialog
/** Window No */
private int m_WindowNo;
/** Attachment */
- private MAttachment m_attachment;
+ private MAttachment m_attachment = null;
/** Change */
private boolean m_change = false;
/** Logger */
@@ -380,7 +380,10 @@ public final class Attachment extends CDialog
}
}
else
+ {
m_attachment.delete(true);
+ m_attachment = null;
+ }
dispose();
}
// Cancel
@@ -468,8 +471,10 @@ public final class Attachment extends CDialog
private void deleteAttachment()
{
log.info("");
- if (ADialog.ask(m_WindowNo, this, "AttachmentDelete?"))
+ if (ADialog.ask(m_WindowNo, this, "AttachmentDelete?")) {
m_attachment.delete(true);
+ m_attachment = null;
+ }
} // deleteAttachment
/**
diff --git a/org.adempiere.ui.swing/src/org/compiere/apps/form/VAllocation.java b/org.adempiere.ui.swing/src/org/compiere/apps/form/VAllocation.java
index d712224ed4..64259f6305 100644
--- a/org.adempiere.ui.swing/src/org/compiere/apps/form/VAllocation.java
+++ b/org.adempiere.ui.swing/src/org/compiere/apps/form/VAllocation.java
@@ -361,20 +361,14 @@ public class VAllocation extends Allocation
// Organization
if (name.equals("AD_Org_ID"))
{
- if (value == null)
- m_AD_Org_ID = 0;
- else
- m_AD_Org_ID = ((Integer) value).intValue();
+ m_AD_Org_ID = ((Integer) value).intValue();
loadBPartner();
}
// Charge
else if (name.equals("C_Charge_ID") )
{
- if ( value == null )
- m_C_Charge_ID = 0;
- else
- m_C_Charge_ID = ((Integer) value).intValue();
+ m_C_Charge_ID = ((Integer) value).intValue();
setAllocateButton();
}
diff --git a/org.adempiere.ui.swing/src/org/compiere/grid/ed/VAccountDialog.java b/org.adempiere.ui.swing/src/org/compiere/grid/ed/VAccountDialog.java
index 6e5d986a3e..199af65e93 100644
--- a/org.adempiere.ui.swing/src/org/compiere/grid/ed/VAccountDialog.java
+++ b/org.adempiere.ui.swing/src/org/compiere/grid/ed/VAccountDialog.java
@@ -146,7 +146,7 @@ public final class VAccountDialog extends CDialog
protected boolean m_changed = false;
/** Accounting Schema */
- private static MAcctSchema s_AcctSchema = null;
+ private volatile static MAcctSchema s_AcctSchema = null;
/** MWindow for AccountCombination */
private GridWindow m_mWindow = null;
/** MTab for AccountCombination */
diff --git a/org.adempiere.ui.zk/META-INF/MANIFEST.MF b/org.adempiere.ui.zk/META-INF/MANIFEST.MF
index f76cd10ca7..52e8080613 100644
--- a/org.adempiere.ui.zk/META-INF/MANIFEST.MF
+++ b/org.adempiere.ui.zk/META-INF/MANIFEST.MF
@@ -39,6 +39,7 @@ Export-Package: metainfo.zk,
org.adempiere.webui.editor,
org.adempiere.webui.event,
org.adempiere.webui.exception,
+ org.adempiere.webui.factory,
org.adempiere.webui.grid,
org.adempiere.webui.install,
org.adempiere.webui.panel,
diff --git a/org.adempiere.ui.zk/WEB-INF/src/fi/jawsy/jawwa/zk/atmosphere/AtmosphereServerPush.java b/org.adempiere.ui.zk/WEB-INF/src/fi/jawsy/jawwa/zk/atmosphere/AtmosphereServerPush.java
index a9c8ef6dda..f45929b215 100644
--- a/org.adempiere.ui.zk/WEB-INF/src/fi/jawsy/jawwa/zk/atmosphere/AtmosphereServerPush.java
+++ b/org.adempiere.ui.zk/WEB-INF/src/fi/jawsy/jawwa/zk/atmosphere/AtmosphereServerPush.java
@@ -90,7 +90,7 @@ public class AtmosphereServerPush implements ServerPush {
synchronized (info) {
info.nActive = 1; //granted
- info.notify();
+ info.notifyAll();
}
try {
@@ -145,7 +145,7 @@ public class AtmosphereServerPush implements ServerPush {
_active = null;
synchronized (_mutex) {
- _mutex.notify();
+ _mutex.notifyAll();
}
}
}
diff --git a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/AdempiereIdGenerator.java b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/AdempiereIdGenerator.java
index 2cebb6c37d..24bf0f8d4e 100644
--- a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/AdempiereIdGenerator.java
+++ b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/AdempiereIdGenerator.java
@@ -44,6 +44,13 @@ public class AdempiereIdGenerator implements IdGenerator {
public String nextComponentUuid(Desktop desktop, Component comp, ComponentInfo compInfo) {
String prefix = comp.getId();
+ if (prefix == null || prefix.length() == 0) {
+ String attribute = comp.getWidgetAttribute(AdempiereWebUI.WIDGET_INSTANCE_NAME);
+ if (attribute != null && attribute.length() > 0) {
+ prefix = getWidgetName(comp.getWidgetClass())+"0"+attribute;
+ }
+ }
+
if (prefix == null || prefix.length() == 0) {
prefix = DEFAULT_ZK_COMP_PREFIX;
}
@@ -54,8 +61,15 @@ public class AdempiereIdGenerator implements IdGenerator {
//only include id space owner to ease converting test case to use zk id selector instead of uuid
if (parent instanceof IdSpace) {
String id = parent.getId();
- if (id != null && id.length() > 0)
- builder.insert(0, id+"_");
+ if (id != null && id.length() > 0) {
+ builder.insert(0, id+"_");
+ } else {
+ String attribute = parent.getWidgetAttribute(AdempiereWebUI.WIDGET_INSTANCE_NAME);
+ if (attribute != null && attribute.length() > 0) {
+ id = getWidgetName(parent.getWidgetClass())+"0"+attribute;
+ builder.insert(0, id+"_");
+ }
+ }
}
parent = parent.getParent();
}
@@ -85,6 +99,11 @@ public class AdempiereIdGenerator implements IdGenerator {
return prefix + i;
}
+ private String getWidgetName(String widgetClass) {
+ String name = widgetClass.substring(widgetClass.lastIndexOf(".")+1);
+ return name.toLowerCase();
+ }
+
public static String escapeId(String prefix) {
Pattern pattern = Pattern.compile("[^a-zA-Z_0-9]");
Matcher matcher = pattern.matcher(prefix);
diff --git a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/adwindow/ADTabpanel.java b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/adwindow/ADTabpanel.java
index a3568a00ea..8bf26b8cd0 100644
--- a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/adwindow/ADTabpanel.java
+++ b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/adwindow/ADTabpanel.java
@@ -82,6 +82,7 @@ import org.zkoss.zul.Div;
import org.zkoss.zul.Separator;
import org.zkoss.zul.Space;
import org.zkoss.zul.Style;
+import org.zkoss.zul.TreeModel;
import org.zkoss.zul.Treeitem;
import org.zkoss.zul.Vlayout;
import org.zkoss.zul.West;
@@ -1051,10 +1052,10 @@ DataStatusListener, IADTabpanel, IdSpace
private void deleteNode(int recordId) {
if (recordId <= 0) return;
- SimpleTreeModel model = (SimpleTreeModel) treePanel.getTree().getModel();
+ SimpleTreeModel model = (SimpleTreeModel)(TreeModel>) treePanel.getTree().getModel();
if (treePanel.getTree().getSelectedItem() != null) {
- DefaultTreeNode