IDEMPIERE-3169 recent item do a lot query / implement cache for the label of recent items

This commit is contained in:
Carlos Ruiz 2018-06-07 10:34:08 +02:00
parent 667875b709
commit 18017938e6
2 changed files with 55 additions and 16 deletions

View File

@ -16,11 +16,13 @@ package org.compiere.model;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.logging.Level;
import org.adempiere.base.Service;
import org.adempiere.base.event.EventManager;
@ -44,16 +46,18 @@ public class MRecentItem extends X_AD_RecentItem
/**
*
*/
private static final long serialVersionUID = 6899554875745832L;
private static final long serialVersionUID = -311416268128338337L;
public static final String ON_RECENT_ITEM_CHANGED_TOPIC = "onRecentItemChanged";
/** Recent Item Cache */
private static CCache<Integer,MRecentItem> s_cache = new CCache<Integer,MRecentItem>(Table_Name, 10);
private static CCache<String,MRecentItem> s_cache = new CCache<String,MRecentItem>(Table_Name, 10);
/** Logger */
@SuppressWarnings("unused")
private static CLogger s_log = CLogger.getCLogger(MRecentItem.class);
/* Recent Item cached Label */
private String m_label;
/**************************************************************************
* Standard Constructor
* @param ctx context
@ -65,13 +69,17 @@ public class MRecentItem extends X_AD_RecentItem
super (ctx, AD_RecentItem_ID, trxName);
if (AD_RecentItem_ID > 0) {
synchronized (MRecentItem.class) {
Integer key = new Integer (AD_RecentItem_ID);
String key = getCacheKey(AD_RecentItem_ID, ctx);
if (!s_cache.containsKey(key))
s_cache.put (key, this);
}
}
} // MRecentItem
private static String getCacheKey(int AD_RecentItem_ID, Properties ctx) {
return AD_RecentItem_ID + "|" + Env.getAD_Language(ctx);
}
/**
* Load Constructor
* @param ctx ctx
@ -81,9 +89,9 @@ public class MRecentItem extends X_AD_RecentItem
public MRecentItem (Properties ctx, ResultSet rs, String trxName)
{
super(ctx, rs, trxName);
Integer key = null;
String key = null;
try {
key = new Integer (rs.getInt("AD_RecentItem_ID"));
key = getCacheKey(rs.getInt("AD_RecentItem_ID"), ctx);
} catch (SQLException e) {
throw new AdempiereException(e);
}
@ -101,7 +109,7 @@ public class MRecentItem extends X_AD_RecentItem
*/
public static synchronized MRecentItem get (Properties ctx, int AD_RecentItem_ID)
{
Integer ii = new Integer (AD_RecentItem_ID);
String ii = getCacheKey(AD_RecentItem_ID, ctx);
MRecentItem ri = (MRecentItem)s_cache.get(ii);
if (ri == null)
ri = new MRecentItem (ctx, AD_RecentItem_ID, null);
@ -123,7 +131,8 @@ public class MRecentItem extends X_AD_RecentItem
MRecentItem retValue = it.next();
if (retValue.getAD_Table_ID() == AD_Table_ID
&& retValue.getRecord_ID() == Record_ID
&& retValue.getCtx() == ctx
&& retValue.getAD_User_ID() == AD_User_ID
&& Env.getAD_Language(ctx).equals(Env.getAD_Language(retValue.getCtx()))
)
{
return retValue;
@ -155,7 +164,7 @@ public class MRecentItem extends X_AD_RecentItem
if (retValue != null)
{
Integer key = new Integer (retValue.getAD_RecentItem_ID());
String key = getCacheKey(retValue.getAD_RecentItem_ID(), ctx);
s_cache.put (key, retValue);
}
return retValue;
@ -265,7 +274,7 @@ public class MRecentItem extends X_AD_RecentItem
@Override
public boolean delete(boolean force) {
Integer ii = new Integer (getAD_RecentItem_ID());
String ii = getCacheKey(getAD_RecentItem_ID(), getCtx());
synchronized (MRecentItem.class) {
s_cache.remove(ii);
}
@ -273,16 +282,23 @@ public class MRecentItem extends X_AD_RecentItem
}
public static List<MRecentItem> getFromUser(Properties ctx, int AD_User_ID) {
List<MRecentItem> ris = new Query(ctx, MRecentItem.Table_Name, "NVL(AD_User_ID,0)=?", null)
int[] ids = new Query(ctx, MRecentItem.Table_Name, "NVL(AD_User_ID,0)=?", null)
.setOnlyActiveRecords(true)
.setClient_ID()
.setParameters(AD_User_ID)
.setOrderBy("Updated DESC")
.list();
.getIDs();
List<MRecentItem> ris = new ArrayList<MRecentItem>();
for (int id : ids) {
ris.add(MRecentItem.get(ctx, id));
}
return ris;
}
public String getLabel() {
if (m_label != null) {
return m_label;
}
String windowName;
MWindow win = MWindow.get(getCtx(), getAD_Window_ID());
MUserDefWin userDef = MUserDefWin.getBestMatch(getCtx(), getAD_Window_ID());
@ -322,7 +338,29 @@ public class MRecentItem extends X_AD_RecentItem
if (recordIdentifier.length() == 0)
recordIdentifier.append(" [no identifier]");
}
return windowName + ": " + recordIdentifier.substring(1);
m_label = windowName + ": " + recordIdentifier.substring(1);
if (s_log.isLoggable(Level.INFO)) s_log.info(m_label);
return m_label;
}
public static void clearLabel(int AD_Table_ID, int Record_ID) {
Iterator<MRecentItem> it = s_cache.values().iterator();
while (it.hasNext()) {
MRecentItem retValue = it.next();
if (retValue.getAD_Table_ID() == AD_Table_ID && retValue.getRecord_ID() == Record_ID) {
retValue.clearLabel();
}
}
}
private void clearLabel() {
m_label = null;
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder("MRecentItem[").append(get_ID()).append("]=").append(getLabel());
return sb.toString();
}
} // MRecentItem

View File

@ -2341,9 +2341,10 @@ public abstract class PO
m_newValues = new Object[size];
m_createNew = false;
}
if (!newRecord)
if (!newRecord) {
CacheMgt.get().reset(p_info.getTableName());
else if (get_ID() > 0 && success)
MRecentItem.clearLabel(p_info.getAD_Table_ID(), get_ID());
} else if (get_ID() > 0 && success)
CacheMgt.get().newRecord(p_info.getTableName(), get_ID());
return success;