IDEMPIERE 4287 (#247)

* IDEMPIERE-4287 Cache API not thread safe and inconsistent with Context
add support to make PO immutable

* IDEMPIERE-4287 Cache API not thread safe and inconsistent with Context
- added thread safe Immutable and Copy cache implementation for PO.
- migrate most of PO cache to immutable and copy cache.
- added pos sales order test.

* IDEMPIERE-4287 Cache API not thread safe and inconsistent with Context
- add test case for initial client setup and bank statement
- fix error for image editor, location editor, locator editor, initial
client setup, complete bank statement and migrate storage provider.

* IDEMPIERE-4287 Cache API not thread safe and inconsistent with Context
- added ImmutablePOSupport interface. Model class implement this
interface for immutable PO support.
- remove usage of cache for transaction table (rfq, invoice, inventory).
- add getCopy method to some model class to support getting an
updateable copy of PO from the otherwise immutable PO cache.
- the added getCopy method is use to return updateable PO for indirect
PO reference, for e.g MColumn.getAD_Table() and MOrderLine.getProduct.
This commit is contained in:
hengsin 2020-09-21 14:03:00 +08:00 committed by GitHub
parent 9509d95c7c
commit dd2ef468b0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
223 changed files with 12310 additions and 1883 deletions

View File

@ -172,6 +172,7 @@ public class InitialClientSetup extends SvrProcess
*/ */
protected String doIt () throws Exception protected String doIt () throws Exception
{ {
boolean isDryRun = "Y".equalsIgnoreCase(Env.getContext(Env.getCtx(), Env.RUNNING_UNIT_TESTING_TEST_CASE));
StringBuilder msglog = new StringBuilder("InitialClientSetup") StringBuilder msglog = new StringBuilder("InitialClientSetup")
.append(": ClientName=").append(p_ClientName) .append(": ClientName=").append(p_ClientName)
@ -261,7 +262,7 @@ public class InitialClientSetup extends SvrProcess
throw new AdempiereException(Msg.getMsg(Env.getCtx(), "CoaFile") + " " + p_CoAFile + " " + Msg.getMsg(Env.getCtx(), "is empty")); throw new AdempiereException(Msg.getMsg(Env.getCtx(), "CoaFile") + " " + p_CoAFile + " " + Msg.getMsg(Env.getCtx(), "is empty"));
// Process // Process
MSetup ms = new MSetup(Env.getCtx(), WINDOW_THIS_PROCESS); MSetup ms = new MSetup(Env.getCtx(), WINDOW_THIS_PROCESS, isDryRun);
try { try {
if (! ms.createClient(p_ClientName, p_OrgValue, p_OrgName, p_AdminUserName, p_NormalUserName if (! ms.createClient(p_ClientName, p_OrgValue, p_OrgName, p_AdminUserName, p_NormalUserName
, p_Phone, p_Phone2, p_Fax, p_EMail, p_TaxID, p_AdminUserEmail, p_NormalUserEmail, p_IsSetInitialPassword)) { , p_Phone, p_Phone2, p_Fax, p_EMail, p_TaxID, p_AdminUserEmail, p_NormalUserEmail, p_IsSetInitialPassword)) {
@ -289,7 +290,9 @@ public class InitialClientSetup extends SvrProcess
addLog(ms.getInfo()); addLog(ms.getInfo());
// Create Print Documents // Create Print Documents
PrintUtil.setupPrintForm(ms.getAD_Client_ID()); PrintUtil.setupPrintForm(ms.getAD_Client_ID(), isDryRun ? ms.getTrxName() : null);
if (isDryRun)
ms.rollback();
} catch (Exception e) { } catch (Exception e) {
ms.rollback(); ms.rollback();
throw e; throw e;

View File

@ -59,8 +59,7 @@ public class ConvertLead extends SvrProcess {
if (p_AD_User_ID <= 0) if (p_AD_User_ID <= 0)
throw new FillMandatoryException("AD_User_ID"); throw new FillMandatoryException("AD_User_ID");
MUser lead = MUser.get(getCtx(), p_AD_User_ID); MUser lead = new MUser(getCtx(), p_AD_User_ID, get_TrxName());
lead.set_TrxName(get_TrxName());
if (!lead.isSalesLead() && lead.getC_BPartner_ID() != 0) if (!lead.isSalesLead() && lead.getC_BPartner_ID() != 0)
throw new AdempiereUserError("Lead already converted"); throw new AdempiereUserError("Lead already converted");

View File

@ -29,6 +29,7 @@ import org.compiere.model.MColumn;
import org.compiere.model.MElementValue; import org.compiere.model.MElementValue;
import org.compiere.model.X_I_ElementValue; import org.compiere.model.X_I_ElementValue;
import org.compiere.util.DB; import org.compiere.util.DB;
import org.compiere.util.Env;
/** /**
* Import Accounts from I_ElementValue * Import Accounts from I_ElementValue
@ -605,7 +606,7 @@ public class ImportAccount extends SvrProcess
{ {
if (m_createNewCombination) if (m_createNewCombination)
{ {
MAccount acct = MAccount.get(getCtx(), C_ValidCombination_ID); MAccount acct = new MAccount(Env.getCtx(), C_ValidCombination_ID, (String)null);
acct.setAccount_ID(C_ElementValue_ID); acct.setAccount_ID(C_ElementValue_ID);
if (acct.save()) if (acct.save())
{ {

View File

@ -79,8 +79,7 @@ public class UserPassword extends SvrProcess
{ {
if (log.isLoggable(Level.INFO)) log.info ("AD_User_ID=" + p_AD_User_ID + " from " + getAD_User_ID()); if (log.isLoggable(Level.INFO)) log.info ("AD_User_ID=" + p_AD_User_ID + " from " + getAD_User_ID());
MUser user = MUser.get(getCtx(), p_AD_User_ID); MUser user = new MUser(getCtx(), p_AD_User_ID, get_TrxName());
user.load(get_TrxName());
MUser operator = MUser.get(getCtx(), getAD_User_ID()); MUser operator = MUser.get(getCtx(), getAD_User_ID());
if (log.isLoggable(Level.FINE)) log.fine("User=" + user + ", Operator=" + operator); if (log.isLoggable(Level.FINE)) log.fine("User=" + user + ", Operator=" + operator);

View File

@ -157,7 +157,7 @@ public class MigrateStorageProvider extends SvrProcess {
// for each client // for each client
for (int clientid : clients) { for (int clientid : clients) {
idxClient++; idxClient++;
MClientInfo clientInfo = MClientInfo.get(getCtx(), clientid); MClientInfo clientInfo = MClientInfo.getCopy(getCtx(), clientid, (String)null);
MClient client = MClient.get(getCtx(), clientid); MClient client = MClient.get(getCtx(), clientid);
int odometer = 10; int odometer = 10;

View File

@ -50,6 +50,7 @@ Export-Package: bsh,
org.compiere.wf, org.compiere.wf,
org.eevolution.model, org.eevolution.model,
org.idempiere.broadcast, org.idempiere.broadcast,
org.idempiere.cache,
org.idempiere.distributed, org.idempiere.distributed,
org.idempiere.fa.service.api, org.idempiere.fa.service.api,
org.idempiere.model org.idempiere.model

View File

@ -17,9 +17,10 @@ import java.sql.ResultSet;
import java.util.Properties; import java.util.Properties;
import org.compiere.model.X_AD_BroadcastMessage; import org.compiere.model.X_AD_BroadcastMessage;
import org.compiere.util.CCache;
import org.compiere.util.DB; import org.compiere.util.DB;
import org.compiere.util.Env; import org.compiere.util.Env;
import org.idempiere.cache.ImmutableIntPOCache;
import org.idempiere.cache.ImmutablePOSupport;
/** /**
* *
@ -27,14 +28,14 @@ import org.compiere.util.Env;
* @author Deepak Pansheriya * @author Deepak Pansheriya
* *
*/ */
public class MBroadcastMessage extends X_AD_BroadcastMessage public class MBroadcastMessage extends X_AD_BroadcastMessage implements ImmutablePOSupport
{ {
/** /**
* *
*/ */
private static final long serialVersionUID = 1908264699133879072L; private static final long serialVersionUID = -5402131480890468471L;
static private CCache<Integer,MBroadcastMessage> s_cache = new CCache<Integer,MBroadcastMessage>("AD_BroadcastMessage", 30, 60); static private ImmutableIntPOCache<Integer,MBroadcastMessage> s_cache = new ImmutableIntPOCache<Integer,MBroadcastMessage>("AD_BroadcastMessage", 30, 60);
public MBroadcastMessage(Properties ctx, int AD_BroadcastMessage_ID, public MBroadcastMessage(Properties ctx, int AD_BroadcastMessage_ID,
String trxName) String trxName)
@ -48,15 +49,66 @@ public class MBroadcastMessage extends X_AD_BroadcastMessage
super(ctx, rs, trxName); super(ctx, rs, trxName);
} }
/**
*
* @param copy
*/
public MBroadcastMessage(MBroadcastMessage copy)
{
this(Env.getCtx(), copy);
}
/**
*
* @param ctx
* @param copy
*/
public MBroadcastMessage(Properties ctx, MBroadcastMessage copy)
{
this(ctx, copy, (String)null);
}
/**
*
* @param ctx
* @param copy
* @param trxName
*/
public MBroadcastMessage(Properties ctx, MBroadcastMessage copy, String trxName)
{
this(ctx, 0, trxName);
copyPO(copy);
}
/**
* Get MBroadcastMessage from cache (immutable)
* @param AD_BroadcastMessage_ID
* @return MBroadcastMessage or null
*/
public static MBroadcastMessage get (int AD_BroadcastMessage_ID)
{
return get(Env.getCtx(), AD_BroadcastMessage_ID);
}
/**
* Get MBroadcastMessage from cache (immutable)
* @param ctx
* @param AD_BroadcastMessage_ID
* @return MBroadcastMessage or null
*/
public static MBroadcastMessage get (Properties ctx, int AD_BroadcastMessage_ID) public static MBroadcastMessage get (Properties ctx, int AD_BroadcastMessage_ID)
{ {
Integer key = Integer.valueOf(AD_BroadcastMessage_ID); Integer key = Integer.valueOf(AD_BroadcastMessage_ID);
MBroadcastMessage retValue = (MBroadcastMessage)s_cache.get(key); MBroadcastMessage retValue = s_cache.get(ctx, key, e -> new MBroadcastMessage(ctx, e));
if (retValue == null) if (retValue == null)
{ {
retValue = new MBroadcastMessage (ctx, AD_BroadcastMessage_ID, null); retValue = new MBroadcastMessage (ctx, AD_BroadcastMessage_ID, (String)null);
if (retValue.get_ID() == AD_BroadcastMessage_ID)
s_cache.put(key, retValue); {
s_cache.put(key, retValue, e -> new MBroadcastMessage(Env.getCtx(), e));
return retValue;
}
return null;
} }
return retValue; return retValue;
} // get } // get
@ -116,4 +168,12 @@ public class MBroadcastMessage extends X_AD_BroadcastMessage
return true; return true;
} }
@Override
public MBroadcastMessage markImmutable() {
if (is_Immutable())
return this;
makeImmutable();
return this;
}
} }

View File

@ -22,9 +22,10 @@ import java.util.List;
import java.util.Properties; import java.util.Properties;
import java.util.logging.Level; import java.util.logging.Level;
import org.compiere.util.CCache;
import org.compiere.util.CLogger; import org.compiere.util.CLogger;
import org.compiere.util.Env; import org.compiere.util.Env;
import org.idempiere.cache.ImmutableIntPOCache;
import org.idempiere.cache.ImmutablePOSupport;
/** /**
* Account Object Entity to maintain all segment values. * Account Object Entity to maintain all segment values.
@ -35,14 +36,14 @@ import org.compiere.util.Env;
* <li>RF [ 2214883 ] Remove SQL code and Replace for Query http://sourceforge.net/tracker/index.php?func=detail&aid=2214883&group_id=176962&atid=879335 * <li>RF [ 2214883 ] Remove SQL code and Replace for Query http://sourceforge.net/tracker/index.php?func=detail&aid=2214883&group_id=176962&atid=879335
* @version $Id: MAccount.java,v 1.4 2006/07/30 00:58:04 jjanke Exp $ * @version $Id: MAccount.java,v 1.4 2006/07/30 00:58:04 jjanke Exp $
*/ */
public class MAccount extends X_C_ValidCombination public class MAccount extends X_C_ValidCombination implements ImmutablePOSupport
{ {
/** /**
* *
*/ */
private static final long serialVersionUID = 7980515458720808532L; private static final long serialVersionUID = 1927316490582718406L;
private static final CCache<Integer, MAccount> s_cache = new CCache<Integer, MAccount>(Table_Name, 100); private static final ImmutableIntPOCache<Integer, MAccount> s_cache = new ImmutableIntPOCache<Integer, MAccount>(Table_Name, 100);
/* /*
* Deprecated - use the same method with trxName instead * Deprecated - use the same method with trxName instead
@ -359,29 +360,35 @@ public class MAccount extends X_C_ValidCombination
return vc; return vc;
} // getDefault } // getDefault
/** /**
* Get Account * Get Account from cache (immutable)
* @param ctx context
* @param C_ValidCombination_ID combination * @param C_ValidCombination_ID combination
* @return Account * @return Account
*/ */
public static MAccount get (int C_ValidCombination_ID)
{
return get(Env.getCtx(), C_ValidCombination_ID);
}
/**
* Get Account from cache (immutable)
* @param ctx context
* @param C_ValidCombination_ID combination
* @return Immutable instance of Account
*/
public static MAccount get (Properties ctx, int C_ValidCombination_ID) public static MAccount get (Properties ctx, int C_ValidCombination_ID)
{ {
MAccount account = s_cache.get(C_ValidCombination_ID); MAccount account = s_cache.get(ctx, C_ValidCombination_ID, e -> new MAccount(ctx, e));
if (account != null && account.getCtx() == ctx) if (account != null)
return account; return account;
account = new MAccount(ctx, C_ValidCombination_ID, null); account = new MAccount(ctx, C_ValidCombination_ID, (String)null);
if (account.getC_ValidCombination_ID() == C_ValidCombination_ID) if (account.getC_ValidCombination_ID() == C_ValidCombination_ID)
{ {
s_cache.put(C_ValidCombination_ID, account); s_cache.put(C_ValidCombination_ID, account, e -> new MAccount(Env.getCtx(), e));
return account; return account;
} }
else
{
return null; return null;
}
} // getAccount } // getAccount
/** /**
@ -447,6 +454,38 @@ public class MAccount extends X_C_ValidCombination
setC_AcctSchema_ID(as.getC_AcctSchema_ID()); setC_AcctSchema_ID(as.getC_AcctSchema_ID());
} // Account } // Account
/**
*
* @param copy
*/
public MAccount(MAccount copy)
{
this(Env.getCtx(), copy);
}
/**
*
* @param ctx
* @param copy
*/
public MAccount(Properties ctx, MAccount copy)
{
this(ctx, copy, (String)null);
}
/**
*
* @param ctx
* @param copy
* @param trxName
*/
public MAccount(Properties ctx, MAccount copy, String trxName)
{
this(ctx, 0, trxName);
copyPO(copy);
this.m_accountEV = copy.m_accountEV != null ? new MElementValue(ctx, copy.m_accountEV, trxName) : null;
}
/** Account Segment */ /** Account Segment */
private MElementValue m_accountEV = null; private MElementValue m_accountEV = null;
@ -521,7 +560,11 @@ public class MAccount extends X_C_ValidCombination
if (m_accountEV == null) if (m_accountEV == null)
{ {
if (getAccount_ID() != 0) if (getAccount_ID() != 0)
{
m_accountEV = new MElementValue(getCtx(), getAccount_ID(), get_TrxName()); m_accountEV = new MElementValue(getCtx(), getAccount_ID(), get_TrxName());
if (is_Immutable())
m_accountEV.markImmutable();
}
} }
return m_accountEV; return m_accountEV;
} // setAccount } // setAccount
@ -838,6 +881,17 @@ public class MAccount extends X_C_ValidCombination
} // beforeSave } // beforeSave
@Override
public MAccount markImmutable() {
if (is_Immutable())
return this;
makeImmutable();
if (m_accountEV != null)
m_accountEV.markImmutable();
return this;
}
/** /**
* Test * Test
* @param args * @param args

View File

@ -18,13 +18,17 @@ package org.compiere.model;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays;
import java.util.List; import java.util.List;
import java.util.Properties; import java.util.Properties;
import java.util.logging.Level; import java.util.logging.Level;
import org.compiere.report.MReportTree; import org.compiere.report.MReportTree;
import org.compiere.util.CCache; import org.compiere.util.CCache;
import org.compiere.util.Env;
import org.compiere.util.KeyNamePair; import org.compiere.util.KeyNamePair;
import org.idempiere.cache.ImmutableIntPOCache;
import org.idempiere.cache.ImmutablePOSupport;
/** /**
* Accounting Schema Model (base) * Accounting Schema Model (base)
@ -34,26 +38,37 @@ import org.compiere.util.KeyNamePair;
* <li>RF [ 2214883 ] Remove SQL code and Replace for Query http://sourceforge.net/tracker/index.php?func=detail&aid=2214883&group_id=176962&atid=879335 * <li>RF [ 2214883 ] Remove SQL code and Replace for Query http://sourceforge.net/tracker/index.php?func=detail&aid=2214883&group_id=176962&atid=879335
* @version $Id: MAcctSchema.java,v 1.4 2006/07/30 00:58:04 jjanke Exp $ * @version $Id: MAcctSchema.java,v 1.4 2006/07/30 00:58:04 jjanke Exp $
*/ */
public class MAcctSchema extends X_C_AcctSchema public class MAcctSchema extends X_C_AcctSchema implements ImmutablePOSupport
{ {
/** /**
* *
*/ */
private static final long serialVersionUID = 8940388112876468770L; private static final long serialVersionUID = 405097978362430053L;
/** /**
* Get AccountSchema of Client * Get AccountSchema
* @param C_AcctSchema_ID schema id
* @return Accounting schema
*/
public static MAcctSchema get (int C_AcctSchema_ID)
{
return get(Env.getCtx(), C_AcctSchema_ID);
}
/**
* Get AccountSchema
* @param ctx context * @param ctx context
* @param C_AcctSchema_ID schema id * @param C_AcctSchema_ID schema id
* @return Accounting schema * @return Accounting schema
*/ */
public static MAcctSchema get (Properties ctx, int C_AcctSchema_ID) public static MAcctSchema get (Properties ctx, int C_AcctSchema_ID)
{ {
return get(ctx, C_AcctSchema_ID, null); return get(ctx, C_AcctSchema_ID, (String)null);
} // get } // get
/** /**
* Get AccountSchema of Client * Get AccountSchema
* @param ctx context * @param ctx context
* @param C_AcctSchema_ID schema id * @param C_AcctSchema_ID schema id
* @param trxName optional trx * @param trxName optional trx
@ -63,15 +78,34 @@ public class MAcctSchema extends X_C_AcctSchema
{ {
// Check Cache // Check Cache
Integer key = Integer.valueOf(C_AcctSchema_ID); Integer key = Integer.valueOf(C_AcctSchema_ID);
MAcctSchema retValue = (MAcctSchema)s_cache.get(key); MAcctSchema retValue = s_cache.get(ctx, key, e -> new MAcctSchema(ctx, e));
if (retValue != null) if (retValue != null)
return retValue; return retValue;
retValue = new MAcctSchema (ctx, C_AcctSchema_ID, trxName); retValue = new MAcctSchema (ctx, C_AcctSchema_ID, trxName);
if (trxName == null) if (retValue.get_ID() == C_AcctSchema_ID)
s_cache.put(key, retValue); {
s_cache.put(key, retValue, e -> new MAcctSchema(Env.getCtx(), e));
return retValue; return retValue;
}
return null;
} // get } // get
/**
* Get updateable copy of MAcctSchema from cache
* @param ctx
* @param C_AcctSchema_ID
* @param trxName
* @return MAcctSchema
*/
public static MAcctSchema getCopy(Properties ctx, int C_AcctSchema_ID, String trxName)
{
MAcctSchema as = get(ctx, C_AcctSchema_ID, trxName);
if (as != null)
as = new MAcctSchema(ctx, as, trxName);
return as;
}
/** /**
* Get AccountSchema of Client * Get AccountSchema of Client
* @param ctx context * @param ctx context
@ -95,7 +129,12 @@ public class MAcctSchema extends X_C_AcctSchema
// Check Cache // Check Cache
Integer key = Integer.valueOf(AD_Client_ID); Integer key = Integer.valueOf(AD_Client_ID);
if (s_schema.containsKey(key)) if (s_schema.containsKey(key))
return (MAcctSchema[])s_schema.get(key); {
if (ctx == Env.getCtx())
return s_schema.get(key);
else
return Arrays.stream(s_schema.get(key)).map(e -> { return new MAcctSchema(ctx, e).markImmutable(); }).toArray(MAcctSchema[]::new);
}
// Create New // Create New
ArrayList<MAcctSchema> list = new ArrayList<MAcctSchema>(); ArrayList<MAcctSchema> list = new ArrayList<MAcctSchema>();
@ -125,21 +164,26 @@ public class MAcctSchema extends X_C_AcctSchema
if (acctschema.get_ID() != info.getC_AcctSchema1_ID()) // already in list if (acctschema.get_ID() != info.getC_AcctSchema1_ID()) // already in list
{ {
if (acctschema.get_ID() != 0) if (acctschema.get_ID() != 0)
{
acctschema.markImmutable();
list.add(acctschema); list.add(acctschema);
} }
} }
}
// Save // Save
MAcctSchema[] retValue = new MAcctSchema [list.size()]; MAcctSchema[] retValue = new MAcctSchema [list.size()];
list.toArray(retValue); list.toArray(retValue);
if (trxName == null) if (ctx == Env.getCtx())
s_schema.put(key, retValue); s_schema.put(key, retValue);
else
s_schema.put(key, Arrays.stream(retValue).map(e -> {return new MAcctSchema(Env.getCtx(), e).markImmutable();}).toArray(MAcctSchema[]::new));
return retValue; return retValue;
} // getClientAcctSchema } // getClientAcctSchema
/** Cache of Client AcctSchema Arrays **/ /** Cache of Client AcctSchema Arrays **/
private static CCache<Integer,MAcctSchema[]> s_schema = new CCache<Integer,MAcctSchema[]>(I_AD_ClientInfo.Table_Name, I_AD_ClientInfo.Table_Name+"|MAcctSchema[]", 3, 120, true); // 3 clients private static CCache<Integer,MAcctSchema[]> s_schema = new CCache<Integer,MAcctSchema[]>(I_AD_ClientInfo.Table_Name, I_AD_ClientInfo.Table_Name+"|MAcctSchema[]", 3, 120, true); // 3 clients
/** Cache of AcctSchemas **/ /** Cache of AcctSchemas **/
private static CCache<Integer,MAcctSchema> s_cache = new CCache<Integer,MAcctSchema>(Table_Name, 3, 120, true); // 3 accounting schemas private static ImmutableIntPOCache<Integer,MAcctSchema> s_cache = new ImmutableIntPOCache<Integer,MAcctSchema>(Table_Name, 3, 120, true); // 3 accounting schemas
/************************************************************************** /**************************************************************************
@ -200,6 +244,46 @@ public class MAcctSchema extends X_C_AcctSchema
setName (msgset.toString()); setName (msgset.toString());
} // MAcctSchema } // MAcctSchema
/**
*
* @param copy
*/
public MAcctSchema(MAcctSchema copy)
{
this(Env.getCtx(), copy);
}
/**
*
* @param ctx
* @param copy
*/
public MAcctSchema(Properties ctx, MAcctSchema copy)
{
this(ctx, copy, (String)null);
}
/**
*
* @param ctx
* @param copy
* @param trxName
*/
public MAcctSchema(Properties ctx, MAcctSchema copy, String trxName)
{
super(ctx, 0, trxName);
copyPO(copy);
this.m_gl = copy.m_gl != null ? new MAcctSchemaGL(ctx, copy.m_gl) : null;
this.m_default = copy.m_default != null ? new MAcctSchemaDefault(ctx, copy.m_default) : null;
this.m_SuspenseError_Acct = copy.m_SuspenseError_Acct != null ? new MAccount(ctx, copy.m_SuspenseError_Acct) : null;
this.m_CurrencyBalancing_Acct = copy.m_CurrencyBalancing_Acct != null ? new MAccount(ctx, copy.m_CurrencyBalancing_Acct) : null;
this.m_DueTo_Acct = copy.m_DueTo_Acct != null ? new MAccount(ctx, copy.m_DueTo_Acct) : null;
this.m_DueFrom_Acct = copy.m_DueFrom_Acct != null ? new MAccount(ctx, copy.m_DueFrom_Acct) : null;
this.m_stdPrecision = copy.m_stdPrecision;
this.m_costPrecision = copy.m_costPrecision;
this.m_onlyOrg = copy.m_onlyOrg != null ? new MOrg(ctx, copy.m_onlyOrg) : null;
this.m_onlyOrgs = copy.m_onlyOrgs;
}
/** GL Info */ /** GL Info */
private MAcctSchemaGL m_gl = null; private MAcctSchemaGL m_gl = null;
@ -261,7 +345,11 @@ public class MAcctSchema extends X_C_AcctSchema
public MAcctSchemaGL getAcctSchemaGL() public MAcctSchemaGL getAcctSchemaGL()
{ {
if (m_gl == null) if (m_gl == null)
{
m_gl = MAcctSchemaGL.get(getCtx(), getC_AcctSchema_ID()); m_gl = MAcctSchemaGL.get(getCtx(), getC_AcctSchema_ID());
if (m_gl != null && is_Immutable())
m_gl.markImmutable();
}
if (m_gl == null) if (m_gl == null)
throw new IllegalStateException("No GL Definition for C_AcctSchema_ID=" + getC_AcctSchema_ID()); throw new IllegalStateException("No GL Definition for C_AcctSchema_ID=" + getC_AcctSchema_ID());
return m_gl; return m_gl;
@ -274,7 +362,11 @@ public class MAcctSchema extends X_C_AcctSchema
public MAcctSchemaDefault getAcctSchemaDefault() public MAcctSchemaDefault getAcctSchemaDefault()
{ {
if (m_default == null) if (m_default == null)
{
m_default = MAcctSchemaDefault.get(getCtx(), getC_AcctSchema_ID()); m_default = MAcctSchemaDefault.get(getCtx(), getC_AcctSchema_ID());
if (m_default != null && is_Immutable())
m_default.markImmutable();
}
if (m_default == null) if (m_default == null)
throw new IllegalStateException("No Default Definition for C_AcctSchema_ID=" + getC_AcctSchema_ID()); throw new IllegalStateException("No Default Definition for C_AcctSchema_ID=" + getC_AcctSchema_ID());
return m_default; return m_default;
@ -314,7 +406,7 @@ public class MAcctSchema extends X_C_AcctSchema
if (m_gl == null) if (m_gl == null)
getAcctSchemaGL(); getAcctSchemaGL();
int C_ValidCombination_ID = m_gl.getSuspenseBalancing_Acct(); int C_ValidCombination_ID = m_gl.getSuspenseBalancing_Acct();
m_SuspenseError_Acct = MAccount.get(getCtx(), C_ValidCombination_ID); m_SuspenseError_Acct = MAccount.get(C_ValidCombination_ID);
return m_SuspenseError_Acct; return m_SuspenseError_Acct;
} // getSuspenseBalancing_Acct } // getSuspenseBalancing_Acct
@ -340,7 +432,7 @@ public class MAcctSchema extends X_C_AcctSchema
if (m_gl == null) if (m_gl == null)
getAcctSchemaGL(); getAcctSchemaGL();
int C_ValidCombination_ID = m_gl.getCurrencyBalancing_Acct(); int C_ValidCombination_ID = m_gl.getCurrencyBalancing_Acct();
m_CurrencyBalancing_Acct = MAccount.get(getCtx(), C_ValidCombination_ID); m_CurrencyBalancing_Acct = MAccount.get(C_ValidCombination_ID);
return m_CurrencyBalancing_Acct; return m_CurrencyBalancing_Acct;
} // getCurrencyBalancing_Acct } // getCurrencyBalancing_Acct
@ -357,7 +449,7 @@ public class MAcctSchema extends X_C_AcctSchema
if (m_gl == null) if (m_gl == null)
getAcctSchemaGL(); getAcctSchemaGL();
int C_ValidCombination_ID = m_gl.getIntercompanyDueTo_Acct(); int C_ValidCombination_ID = m_gl.getIntercompanyDueTo_Acct();
m_DueTo_Acct = MAccount.get(getCtx(), C_ValidCombination_ID); m_DueTo_Acct = MAccount.get(C_ValidCombination_ID);
return m_DueTo_Acct; return m_DueTo_Acct;
} // getDueTo_Acct } // getDueTo_Acct
@ -373,7 +465,7 @@ public class MAcctSchema extends X_C_AcctSchema
if (m_gl == null) if (m_gl == null)
getAcctSchemaGL(); getAcctSchemaGL();
int C_ValidCombination_ID = m_gl.getIntercompanyDueFrom_Acct(); int C_ValidCombination_ID = m_gl.getIntercompanyDueFrom_Acct();
m_DueFrom_Acct = MAccount.get(getCtx(), C_ValidCombination_ID); m_DueFrom_Acct = MAccount.get(C_ValidCombination_ID);
return m_DueFrom_Acct; return m_DueFrom_Acct;
} // getDueFrom_Acct } // getDueFrom_Acct
@ -416,7 +508,7 @@ public class MAcctSchema extends X_C_AcctSchema
if (getAD_OrgOnly_ID() == AD_Org_ID) if (getAD_OrgOnly_ID() == AD_Org_ID)
return false; return false;
if (m_onlyOrg == null) if (m_onlyOrg == null)
m_onlyOrg = MOrg.get(getCtx(), getAD_OrgOnly_ID()); m_onlyOrg = MOrg.get(getAD_OrgOnly_ID());
// Not Summary Only - i.e. skip it // Not Summary Only - i.e. skip it
if (!m_onlyOrg.isSummary()) if (!m_onlyOrg.isSummary())
return true; return true;
@ -625,4 +717,18 @@ public class MAcctSchema extends X_C_AcctSchema
return true; return true;
} // beforeSave } // beforeSave
@Override
public MAcctSchema markImmutable()
{
if (is_Immutable())
return this;
makeImmutable();
if (m_gl != null)
m_gl.markImmutable();
if (m_default != null)
m_default.markImmutable();
return this;
}
} // MAcctSchema } // MAcctSchema

View File

@ -21,7 +21,9 @@ import java.util.ArrayList;
import java.util.Properties; import java.util.Properties;
import org.compiere.util.CLogger; import org.compiere.util.CLogger;
import org.compiere.util.Env;
import org.compiere.util.KeyNamePair; import org.compiere.util.KeyNamePair;
import org.idempiere.cache.ImmutablePOSupport;
/** /**
* Default Accounts for MAcctSchema * Default Accounts for MAcctSchema
@ -31,14 +33,13 @@ import org.compiere.util.KeyNamePair;
* <li>RF [ 2214883 ] Remove SQL code and Replace for Query http://sourceforge.net/tracker/index.php?func=detail&aid=2214883&group_id=176962&atid=879335 * <li>RF [ 2214883 ] Remove SQL code and Replace for Query http://sourceforge.net/tracker/index.php?func=detail&aid=2214883&group_id=176962&atid=879335
* @version $Id: MAcctSchemaDefault.java,v 1.3 2006/07/30 00:58:37 jjanke Exp $ * @version $Id: MAcctSchemaDefault.java,v 1.3 2006/07/30 00:58:37 jjanke Exp $
*/ */
public class MAcctSchemaDefault extends X_C_AcctSchema_Default public class MAcctSchemaDefault extends X_C_AcctSchema_Default implements ImmutablePOSupport
{ {
/** /**
* *
*/ */
private static final long serialVersionUID = 199959007595802866L; private static final long serialVersionUID = -7966846617443248102L;
/** /**
* Get Accounting Schema Default Info * Get Accounting Schema Default Info
@ -79,6 +80,37 @@ public class MAcctSchemaDefault extends X_C_AcctSchema_Default
super(ctx, rs, trxName); super(ctx, rs, trxName);
} // MAcctSchemaDefault } // MAcctSchemaDefault
/**
*
* @param copy
*/
public MAcctSchemaDefault(MAcctSchemaDefault copy)
{
this(Env.getCtx(), copy);
}
/**
*
* @param ctx
* @param copy
*/
public MAcctSchemaDefault(Properties ctx, MAcctSchemaDefault copy)
{
this(ctx, copy, (String) null);
}
/**
*
* @param ctx
* @param copy
* @param trxName
*/
public MAcctSchemaDefault(Properties ctx, MAcctSchemaDefault copy, String trxName)
{
this(ctx, 0, trxName);
copyPO(copy);
}
/** /**
* Get Realized Gain Acct for currency * Get Realized Gain Acct for currency
* @param C_Currency_ID currency * @param C_Currency_ID currency
@ -152,4 +184,13 @@ public class MAcctSchemaDefault extends X_C_AcctSchema_Default
return true; return true;
} // beforeSave } // beforeSave
@Override
public MAcctSchemaDefault markImmutable() {
if (is_Immutable())
return this;
makeImmutable();
return this;
}
} // MAcctSchemaDefault } // MAcctSchemaDefault

View File

@ -28,6 +28,7 @@ import org.compiere.util.DB;
import org.compiere.util.Env; import org.compiere.util.Env;
import org.compiere.util.Language; import org.compiere.util.Language;
import org.compiere.util.Msg; import org.compiere.util.Msg;
import org.idempiere.cache.ImmutablePOSupport;
/** /**
* Account Schema Element Object * Account Schema Element Object
@ -38,15 +39,15 @@ import org.compiere.util.Msg;
* @author victor.perez@e-evolution.com, www.e-evolution.com * @author victor.perez@e-evolution.com, www.e-evolution.com
* <li>RF [ 2214883 ] Remove SQL code and Replace for Query http://sourceforge.net/tracker/index.php?func=detail&aid=2214883&group_id=176962&atid=879335 * <li>RF [ 2214883 ] Remove SQL code and Replace for Query http://sourceforge.net/tracker/index.php?func=detail&aid=2214883&group_id=176962&atid=879335
*/ */
public class MAcctSchemaElement extends X_C_AcctSchema_Element public class MAcctSchemaElement extends X_C_AcctSchema_Element implements ImmutablePOSupport
{ {
/** /**
* *
*/ */
private static final long serialVersionUID = -4642928142654938659L; private static final long serialVersionUID = -747934131394469553L;
/** /**
* Factory: Return ArrayList of Account Schema Elements * Get ArrayList of Account Schema Elements from cache
* @param as Accounting Schema * @param as Accounting Schema
* @return ArrayList with Elements * @return ArrayList with Elements
*/ */
@ -71,12 +72,13 @@ public class MAcctSchemaElement extends X_C_AcctSchema_Element
if (s_log.isLoggable(Level.FINE)) s_log.fine(" - " + ase); if (s_log.isLoggable(Level.FINE)) s_log.fine(" - " + ase);
if (ase.isMandatory() && ase.getDefaultValue() == 0) if (ase.isMandatory() && ase.getDefaultValue() == 0)
s_log.log(Level.SEVERE, "No default value for " + ase.getName()); s_log.log(Level.SEVERE, "No default value for " + ase.getName());
ase.markImmutable();
list.add(ase); list.add(ase);
} }
retValue = new MAcctSchemaElement[list.size()]; retValue = new MAcctSchemaElement[list.size()];
list.toArray(retValue); list.toArray(retValue);
s_cache.put (key, retValue); s_cache.put(key, retValue);
return retValue; return retValue;
} // getAcctSchemaElements } // getAcctSchemaElements
@ -238,6 +240,38 @@ public class MAcctSchemaElement extends X_C_AcctSchema_Element
} // MAcctSchemaElement } // MAcctSchemaElement
/**
*
* @param copy
*/
public MAcctSchemaElement(MAcctSchemaElement copy)
{
this(Env.getCtx(), copy);
}
/**
*
* @param ctx
* @param copy
*/
public MAcctSchemaElement(Properties ctx, MAcctSchemaElement copy)
{
this(ctx, copy, (String)null);
}
/**
*
* @param ctx
* @param copy
* @param trxName
*/
public MAcctSchemaElement(Properties ctx, MAcctSchemaElement copy, String trxName)
{
super(ctx, 0, trxName);
copyPO(copy);
this.m_ColumnName = copy.m_ColumnName;
}
/** User Element Column Name */ /** User Element Column Name */
private String m_ColumnName = null; private String m_ColumnName = null;
@ -539,4 +573,13 @@ public class MAcctSchemaElement extends X_C_AcctSchema_Element
return success; return success;
} // afterDelete } // afterDelete
@Override
public MAcctSchemaElement markImmutable() {
if (is_Immutable())
return this;
makeImmutable();
return this;
}
} // AcctSchemaElement } // AcctSchemaElement

View File

@ -21,7 +21,9 @@ import java.util.ArrayList;
import java.util.Properties; import java.util.Properties;
import org.compiere.util.CLogger; import org.compiere.util.CLogger;
import org.compiere.util.Env;
import org.compiere.util.KeyNamePair; import org.compiere.util.KeyNamePair;
import org.idempiere.cache.ImmutablePOSupport;
@ -33,15 +35,13 @@ import org.compiere.util.KeyNamePair;
* @author victor.perez@e-evolution.com, www.e-evolution.com * @author victor.perez@e-evolution.com, www.e-evolution.com
* <li>RF [ 2214883 ] Remove SQL code and Replace for Query http://sourceforge.net/tracker/index.php?func=detail&aid=2214883&group_id=176962&atid=879335 * <li>RF [ 2214883 ] Remove SQL code and Replace for Query http://sourceforge.net/tracker/index.php?func=detail&aid=2214883&group_id=176962&atid=879335
*/ */
public class MAcctSchemaGL extends X_C_AcctSchema_GL public class MAcctSchemaGL extends X_C_AcctSchema_GL implements ImmutablePOSupport
{ {
/** /**
* *
*/ */
private static final long serialVersionUID = 5303102649110271896L; private static final long serialVersionUID = -53120274583638950L;
/** /**
* Get Accounting Schema GL Info * Get Accounting Schema GL Info
@ -89,6 +89,37 @@ public class MAcctSchemaGL extends X_C_AcctSchema_GL
super(ctx, rs, trxName); super(ctx, rs, trxName);
} // MAcctSchemaGL } // MAcctSchemaGL
/**
*
* @param copy
*/
public MAcctSchemaGL(MAcctSchemaGL copy)
{
this(Env.getCtx(), copy);
}
/**
*
* @param ctx
* @param copy
*/
public MAcctSchemaGL(Properties ctx, MAcctSchemaGL copy)
{
this(ctx, copy, (String) null);
}
/**
*
* @param ctx
* @param copy
* @param trxName
*/
public MAcctSchemaGL(Properties ctx, MAcctSchemaGL copy, String trxName)
{
this(ctx, 0, trxName);
copyPO(copy);
}
/** /**
* Get Acct Info list * Get Acct Info list
* @return list * @return list
@ -131,4 +162,13 @@ public class MAcctSchemaGL extends X_C_AcctSchema_GL
return true; return true;
} // beforeSave } // beforeSave
@Override
public MAcctSchemaGL markImmutable() {
if (is_Immutable())
return this;
makeImmutable();
return this;
}
} // MAcctSchemaGL } // MAcctSchemaGL

View File

@ -19,7 +19,9 @@ package org.compiere.model;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.util.Properties; import java.util.Properties;
import org.compiere.util.CCache; import org.compiere.util.Env;
import org.idempiere.cache.ImmutableIntPOCache;
import org.idempiere.cache.ImmutablePOSupport;
/** /**
@ -31,18 +33,28 @@ import org.compiere.util.CCache;
* @author Teo Sarca, www.arhipac.ro * @author Teo Sarca, www.arhipac.ro
* <li>FR [ 2736867 ] Add caching support to MActivity * <li>FR [ 2736867 ] Add caching support to MActivity
*/ */
public class MActivity extends X_C_Activity public class MActivity extends X_C_Activity implements ImmutablePOSupport
{ {
/** /**
* *
*/ */
private static final long serialVersionUID = 3014706648686670575L; private static final long serialVersionUID = -5939026057597689130L;
/** Static Cache */ /** Static Cache */
private static CCache<Integer, MActivity> s_cache = new CCache<Integer, MActivity>(Table_Name, 30); private static ImmutableIntPOCache<Integer, MActivity> s_cache = new ImmutableIntPOCache<Integer, MActivity>(Table_Name, 30);
/** /**
* Get/Load Activity [CACHED] * Get/Load Activity [CACHED] (immutable)
* @param C_Activity_ID
* @return activity or null
*/
public static MActivity get(int C_Activity_ID)
{
return get(Env.getCtx(), C_Activity_ID);
}
/**
* Get/Load Activity [CACHED] (immutable)
* @param ctx context * @param ctx context
* @param C_Activity_ID * @param C_Activity_ID
* @return activity or null * @return activity or null
@ -54,23 +66,20 @@ public class MActivity extends X_C_Activity
return null; return null;
} }
// Try cache // Try cache
MActivity activity = s_cache.get(C_Activity_ID); MActivity activity = s_cache.get(ctx, C_Activity_ID, e -> new MActivity(ctx, e));
if (activity != null) if (activity != null)
{ {
return activity; return activity;
} }
// Load from DB // Load from DB
activity = new MActivity(ctx, C_Activity_ID, null); activity = new MActivity(ctx, C_Activity_ID, (String)null);
if (activity.get_ID() == C_Activity_ID) if (activity.get_ID() == C_Activity_ID)
{ {
s_cache.put(C_Activity_ID, activity); s_cache.put(C_Activity_ID, activity, e -> new MActivity(Env.getCtx(), e));
}
else
{
activity = null;
}
return activity; return activity;
} }
return null;
}
/** /**
* Standard Constructor * Standard Constructor
@ -94,6 +103,36 @@ public class MActivity extends X_C_Activity
super(ctx, rs, trxName); super(ctx, rs, trxName);
} // MActivity } // MActivity
/**
*
* @param copy
*/
public MActivity(MActivity copy)
{
this(Env.getCtx(), copy);
}
/**
*
* @param ctx
* @param copy
*/
public MActivity(Properties ctx, MActivity copy)
{
this(ctx, copy, (String)null);
}
/**
*
* @param ctx
* @param copy
* @param trxName
*/
public MActivity(Properties ctx, MActivity copy, String trxName)
{
this(ctx, 0, trxName);
copyPO(copy);
}
/** /**
* After Save. * After Save.
@ -131,4 +170,13 @@ public class MActivity extends X_C_Activity
return success; return success;
} // afterDelete } // afterDelete
@Override
public MActivity markImmutable() {
if (is_Immutable())
return this;
makeImmutable();
return this;
}
} // MActivity } // MActivity

View File

@ -21,7 +21,6 @@ import java.sql.Timestamp;
import java.util.List; import java.util.List;
import java.util.Properties; import java.util.Properties;
import org.compiere.util.CCache;
import org.compiere.util.CLogger; import org.compiere.util.CLogger;
import org.compiere.util.DB; import org.compiere.util.DB;
@ -82,8 +81,8 @@ public class MAlertProcessor extends X_AD_AlertProcessor
super(ctx, rs, trxName); super(ctx, rs, trxName);
} // MAlertProcessor } // MAlertProcessor
/** Cache: AD_AlertProcessor -> Alerts array */ /** Cache: Alerts array */
private static CCache<Integer, MAlert[]> s_cacheAlerts = new CCache<Integer, MAlert[]>(I_AD_Alert.Table_Name, "AD_Alert|AlertProcessor", 10, false); private MAlert[] m_alerts = null;
/** /**
* Get Server ID * Get Server ID
@ -145,9 +144,8 @@ public class MAlertProcessor extends X_AD_AlertProcessor
*/ */
public MAlert[] getAlerts (boolean reload) public MAlert[] getAlerts (boolean reload)
{ {
MAlert[] alerts = s_cacheAlerts.get(get_ID()); if (m_alerts != null && !reload)
if (alerts != null && !reload) return m_alerts;
return alerts;
final String whereClause ="AD_AlertProcessor_ID=?"; final String whereClause ="AD_AlertProcessor_ID=?";
List <MAlert> list = new Query(getCtx(), I_AD_Alert.Table_Name, whereClause, null) List <MAlert> list = new Query(getCtx(), I_AD_Alert.Table_Name, whereClause, null)
@ -156,10 +154,9 @@ public class MAlertProcessor extends X_AD_AlertProcessor
.list(); .list();
// //
alerts = new MAlert[list.size ()]; m_alerts = new MAlert[list.size ()];
list.toArray (alerts); list.toArray (m_alerts);
s_cacheAlerts.put(get_ID(), alerts); return m_alerts;
return alerts;
} // getAlerts } // getAlerts
/** /**

View File

@ -262,6 +262,38 @@ public class MAsset extends X_A_Asset
} }
/**
*
* @param copy
*/
public MAsset(MAsset copy)
{
this(Env.getCtx(), copy);
}
/**
*
* @param ctx
* @param copy
*/
public MAsset(Properties ctx, MAsset copy)
{
this(ctx, copy, (String) null);
}
/**
*
* @param ctx
* @param copy
* @param trxName
*/
public MAsset(Properties ctx, MAsset copy, String trxName)
{
this(ctx, 0, trxName);
copyPO(copy);
this.m_DateAcct = copy.m_DateAcct;
}
/** /**
* Set Asset Group; also it sets other default fields * Set Asset Group; also it sets other default fields
* @param assetGroup * @param assetGroup
@ -278,7 +310,7 @@ public class MAsset extends X_A_Asset
} }
public MAssetGroup getAssetGroup() { public MAssetGroup getAssetGroup() {
return MAssetGroup.get(getCtx(), getA_Asset_Group_ID()); return MAssetGroup.getCopy(getCtx(), getA_Asset_Group_ID(), get_TrxName());
} }
/** /**

View File

@ -6,20 +6,22 @@ import java.sql.Timestamp;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Properties; import java.util.Properties;
import org.compiere.util.CCache;
import org.compiere.util.Env; import org.compiere.util.Env;
import org.compiere.util.TimeUtil; import org.compiere.util.TimeUtil;
import org.idempiere.cache.ImmutableIntPOCache;
import org.idempiere.cache.ImmutablePOSupport;
/** /**
* Asset Acct Model * Asset Acct Model
* @author Teo Sarca, SC ARHIPAC SERVICE SRL * @author Teo Sarca, SC ARHIPAC SERVICE SRL
*/ */
public class MAssetAcct extends X_A_Asset_Acct public class MAssetAcct extends X_A_Asset_Acct implements ImmutablePOSupport
{ {
/** /**
* *
*/ */
private static final long serialVersionUID = -3919172418904053712L; private static final long serialVersionUID = -8898773839204909595L;
/** /**
* DO NOT USE DIRECTLY * DO NOT USE DIRECTLY
@ -38,32 +40,69 @@ public class MAssetAcct extends X_A_Asset_Acct
super (ctx, rs, trxName); super (ctx, rs, trxName);
} }
/** Static Cache: A_Asset_Acct_ID -> MAssetAcct */ /**
private static CCache<Integer,MAssetAcct> s_cache = new CCache<Integer,MAssetAcct>(Table_Name, 5); *
* @param copy
*/
public MAssetAcct(MAssetAcct copy)
{
this(Env.getCtx(), copy);
}
/** /**
* Get Asset Accounting (from cache) *
* @param ctx
* @param copy
*/
public MAssetAcct(Properties ctx, MAssetAcct copy)
{
this(ctx, copy, (String)null);
}
/**
*
* @param ctx
* @param copy
* @param trxName
*/
public MAssetAcct(Properties ctx, MAssetAcct copy, String trxName)
{
this(ctx, 0, trxName);
copyPO(copy);
}
/** Static Cache: A_Asset_Acct_ID -> MAssetAcct */
private static ImmutableIntPOCache<Integer,MAssetAcct> s_cache = new ImmutableIntPOCache<Integer,MAssetAcct>(Table_Name, 5);
/**
* Get Asset Accounting (from cache) (immutable)
* @param A_Asset_Acct_ID asset accounting id
* @return asset accounting or null if not found
*/
public static MAssetAcct get (int A_Asset_Acct_ID)
{
return get(Env.getCtx(), A_Asset_Acct_ID);
}
/**
* Get Asset Accounting (from cache) (immutable)
* @param ctx context * @param ctx context
* @param A_Asset_Acct_ID asset accounting id * @param A_Asset_Acct_ID asset accounting id
* @return asset accounting or null if not found * @return asset accounting or null if not found
*/ */
public static MAssetAcct get (Properties ctx, int A_Asset_Acct_ID) public static MAssetAcct get (Properties ctx, int A_Asset_Acct_ID)
{ {
MAssetAcct acct = s_cache.get(A_Asset_Acct_ID); MAssetAcct acct = s_cache.get(ctx, A_Asset_Acct_ID, e -> new MAssetAcct(ctx, e));
if (acct != null) if (acct != null)
return acct;
acct = new MAssetAcct(ctx, A_Asset_Acct_ID, (String)null);
if (acct.get_ID() == A_Asset_Acct_ID)
{ {
s_cache.put(A_Asset_Acct_ID, acct, e -> new MAssetAcct(Env.getCtx(), e));
return acct; return acct;
} }
acct = new MAssetAcct(ctx, A_Asset_Acct_ID, null); return null;
if (acct.get_ID() > 0)
{
addToCache(acct);
}
else
{
acct = null;
}
return acct;
} }
/** /**
@ -91,22 +130,13 @@ public class MAssetAcct extends X_A_Asset_Acct
.setParameters(params) .setParameters(params)
.setOrderBy(COLUMNNAME_ValidFrom+" DESC NULLS LAST") .setOrderBy(COLUMNNAME_ValidFrom+" DESC NULLS LAST")
.first(); .first();
if (trxName == null) if (acct.get_ID() > 0)
{ {
addToCache(acct); s_cache.put(acct.get_ID(), acct, e -> new MAssetAcct(Env.getCtx(), e));
} }
return acct; return acct;
} }
private static void addToCache(MAssetAcct acct)
{
if (acct == null || acct.get_ID() <= 0)
{
return;
}
s_cache.put(acct.get_ID(), acct);
}
/** /**
* Create new asset accounting from asset group accounting * Create new asset accounting from asset group accounting
* @param asset asset * @param asset asset
@ -143,7 +173,7 @@ public class MAssetAcct extends X_A_Asset_Acct
public MAcctSchema getC_AcctSchema() public MAcctSchema getC_AcctSchema()
{ {
return MAcctSchema.get(getCtx(), getC_AcctSchema_ID()); return MAcctSchema.getCopy(getCtx(), getC_AcctSchema_ID(), get_TrxName());
} }
public MAccount getP_Asset_Acct(int M_Product_ID) public MAccount getP_Asset_Acct(int M_Product_ID)
@ -162,5 +192,13 @@ public class MAssetAcct extends X_A_Asset_Acct
return true; return true;
} }
@Override
public MAssetAcct markImmutable() {
if (is_Immutable())
return this;
makeImmutable();
return this;
}
} // class MAssetAcct } // class MAssetAcct

View File

@ -6,21 +6,23 @@ import java.util.Calendar;
import java.util.Properties; import java.util.Properties;
import java.util.logging.Level; import java.util.logging.Level;
import org.compiere.util.CCache;
import org.compiere.util.Env; import org.compiere.util.Env;
import org.compiere.util.TimeUtil; import org.compiere.util.TimeUtil;
import org.idempiere.cache.ImmutableIntPOCache;
import org.idempiere.cache.ImmutablePOSupport;
import org.idempiere.fa.feature.UseLifeImpl; import org.idempiere.fa.feature.UseLifeImpl;
/** Asset Class /** Asset Class
* @author Teo Sarca, SC Arhipac SRL * @author Teo Sarca, SC Arhipac SRL
* @version $Id$ * @version $Id$
*/ */
public class MAssetClass extends X_A_Asset_Class public class MAssetClass extends X_A_Asset_Class implements ImmutablePOSupport
{ {
/** /**
* *
*/ */
private static final long serialVersionUID = -6526341869523579715L; private static final long serialVersionUID = -7805056592418891872L;
/** /**
* *
@ -40,8 +42,47 @@ public class MAssetClass extends X_A_Asset_Class
super (ctx, rs, trxName); super (ctx, rs, trxName);
} // MAssetClass } // MAssetClass
/**
*
* @param copy
*/
public MAssetClass(MAssetClass copy)
{
this(Env.getCtx(), copy);
}
/**
*
* @param ctx
* @param copy
*/
public MAssetClass(Properties ctx, MAssetClass copy)
{
this(ctx, copy, (String) null);
}
/**
*
* @param ctx
* @param copy
* @param trxName
*/
public MAssetClass(Properties ctx, MAssetClass copy, String trxName)
{
this(ctx, 0, trxName);
copyPO(copy);
}
/** */ /** */
private static CCache<Integer, MAssetClass> s_cache = new CCache<Integer, MAssetClass>(Table_Name, 20); private static ImmutableIntPOCache<Integer, MAssetClass> s_cache = new ImmutableIntPOCache<Integer, MAssetClass>(Table_Name, 20);
/** Get Asset Class from cache
* @param id A_Asset_Class_ID
* @return MAssetClass or null if not found
*/
public static MAssetClass get(int id) {
return get(Env.getCtx(), id);
}
/** Get Asset Class from cache /** Get Asset Class from cache
* @param ctx context * @param ctx context
@ -53,14 +94,16 @@ public class MAssetClass extends X_A_Asset_Class
return null; return null;
} }
MAssetClass assetClass = s_cache.get(id); MAssetClass assetClass = s_cache.get(ctx, id, e -> new MAssetClass(ctx, e));
if (assetClass == null) { if (assetClass == null) {
assetClass = new MAssetClass(ctx, id, null); assetClass = new MAssetClass(ctx, id, (String)null);
if (assetClass.get_ID() == id) {
s_cache.put(id, assetClass, e -> new MAssetClass(Env.getCtx(), e));
return assetClass;
} }
if (assetClass.get_ID() != id) {
return null; return null;
} }
s_cache.put(id, assetClass);
return assetClass; return assetClass;
} // get } // get
@ -209,4 +252,14 @@ public class MAssetClass extends X_A_Asset_Class
} }
return true; return true;
} }
@Override
public MAssetClass markImmutable() {
if (is_Immutable())
return this;
makeImmutable();
return this;
}
} }

View File

@ -3,22 +3,25 @@ package org.compiere.model;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.util.Properties; import java.util.Properties;
import org.compiere.util.CCache;
import org.compiere.util.DB; import org.compiere.util.DB;
import org.compiere.util.Env;
import org.idempiere.cache.ImmutableIntPOCache;
import org.idempiere.cache.ImmutablePOSupport;
/** /**
* Asset Group Model * Asset Group Model
* @author Teo Sarca, SC ARHIPAC SERVICE SRL * @author Teo Sarca, SC ARHIPAC SERVICE SRL
*/ */
public class MAssetGroup extends X_A_Asset_Group public class MAssetGroup extends X_A_Asset_Group implements ImmutablePOSupport
{ {
/** /**
* *
*/ */
private static final long serialVersionUID = -173157506404569463L; private static final long serialVersionUID = 2605166916393528396L;
/** Cache: ID -> MAssetGroup */ /** Cache: ID -> MAssetGroup */
private static CCache<Integer, MAssetGroup> s_cache = new CCache<Integer, MAssetGroup>(Table_Name, 10, 0); private static ImmutableIntPOCache<Integer, MAssetGroup> s_cache = new ImmutableIntPOCache<Integer, MAssetGroup>(Table_Name, 10, 0);
/** /**
* Default Constructor * Default Constructor
@ -40,6 +43,47 @@ public class MAssetGroup extends X_A_Asset_Group
super (ctx, rs, trxName); super (ctx, rs, trxName);
} // MAssetGroup } // MAssetGroup
/**
*
* @param copy
*/
public MAssetGroup(MAssetGroup copy)
{
this(Env.getCtx(), copy);
}
/**
*
* @param ctx
* @param copy
*/
public MAssetGroup(Properties ctx, MAssetGroup copy)
{
this(ctx, copy, (String) null);
}
/**
*
* @param ctx
* @param copy
* @param trxName
*/
public MAssetGroup(Properties ctx, MAssetGroup copy, String trxName)
{
this(ctx, 0, trxName);
copyPO(copy);
}
/**
* Get Asset Group [CACHE]
* @param A_Asset_Group_ID asset group id
* @return asset group or null
*/
public static MAssetGroup get(int A_Asset_Group_ID)
{
return get(Env.getCtx(), A_Asset_Group_ID);
}
/** /**
* Get Asset Group [CACHE] * Get Asset Group [CACHE]
* @param ctx context * @param ctx context
@ -51,18 +95,33 @@ public class MAssetGroup extends X_A_Asset_Group
if (A_Asset_Group_ID <= 0) if (A_Asset_Group_ID <= 0)
return null; return null;
// Try cache // Try cache
MAssetGroup ag = s_cache.get(A_Asset_Group_ID); MAssetGroup ag = s_cache.get(ctx, A_Asset_Group_ID, e -> new MAssetGroup(ctx, e));
if (ag != null) if (ag != null)
return ag; return ag;
// Load // Load
ag = new MAssetGroup(ctx, A_Asset_Group_ID, null); ag = new MAssetGroup(ctx, A_Asset_Group_ID, (String)null);
if (ag != null && ag.get_ID() != A_Asset_Group_ID) if (ag.get_ID() == A_Asset_Group_ID)
ag = null; {
else s_cache.put(A_Asset_Group_ID, ag, e -> new MAssetGroup(Env.getCtx(), e));
s_cache.put(A_Asset_Group_ID, ag);
//
return ag; return ag;
} }
return null;
}
/**
* Get updateable copy of MAssetGroup from cache
* @param ctx
* @param A_Asset_Group_ID
* @param trxName
* @return MAssetGroup
*/
public static MAssetGroup getCopy(Properties ctx, int A_Asset_Group_ID, String trxName)
{
MAssetGroup grp = get(A_Asset_Group_ID);
if (grp != null)
grp = new MAssetGroup(ctx, grp, trxName);
return grp;
}
/** /**
* Get default asset group ID for given model. * Get default asset group ID for given model.
@ -170,5 +229,15 @@ public class MAssetGroup extends X_A_Asset_Group
// //
return true; return true;
} }
@Override
public MAssetGroup markImmutable() {
if (is_Immutable())
return this;
makeImmutable();
return this;
}
} // MAssetGroup } // MAssetGroup

View File

@ -73,14 +73,7 @@ public class MAssetGroupAcct extends X_A_Asset_Group_Acct
if (m_parent == null) if (m_parent == null)
{ {
int A_Asset_Group_ID = getA_Asset_Group_ID(); int A_Asset_Group_ID = getA_Asset_Group_ID();
if (is_new()) m_parent = MAssetGroup.getCopy(getCtx(), A_Asset_Group_ID, get_TrxName());
{
m_parent = new MAssetGroup(getCtx(), A_Asset_Group_ID, get_TrxName());
}
else
{
m_parent = MAssetGroup.get(getCtx(), A_Asset_Group_ID);
}
} }
return m_parent; return m_parent;
} }

View File

@ -4,19 +4,20 @@ import java.sql.ResultSet;
import java.util.Properties; import java.util.Properties;
import org.compiere.util.ArhRuntimeException; import org.compiere.util.ArhRuntimeException;
import org.compiere.util.CCache;
import org.compiere.util.Env; import org.compiere.util.Env;
import org.idempiere.cache.ImmutableIntPOCache;
import org.idempiere.cache.ImmutablePOSupport;
/** /**
* Asset Type * Asset Type
* @author Teo Sarca, SC ARHIPAC SERVICE SRL * @author Teo Sarca, SC ARHIPAC SERVICE SRL
*/ */
public class MAssetType extends X_A_Asset_Type public class MAssetType extends X_A_Asset_Type implements ImmutablePOSupport
{ {
/** /**
* *
*/ */
private static final long serialVersionUID = -1371478760221357780L; private static final long serialVersionUID = -5511421754249363729L;
private static final String A_ASSET_TYPE_MFX = "MFX"; // HARDCODED - you must create a Asset Type with Value=MFX to indicate is Fixed Asset private static final String A_ASSET_TYPE_MFX = "MFX"; // HARDCODED - you must create a Asset Type with Value=MFX to indicate is Fixed Asset
private static final String A_ASSET_TYPE_INV = "INV"; // HARDCODED - you must create a Asset Type with Value=MFX to indicate is Inventory Object private static final String A_ASSET_TYPE_INV = "INV"; // HARDCODED - you must create a Asset Type with Value=MFX to indicate is Inventory Object
@ -36,9 +37,20 @@ public class MAssetType extends X_A_Asset_Type
}; };
/** Static Cache: A_Asset_Type.A_Asset_Type_ID-> MAssetType */ /** Static Cache: A_Asset_Type.A_Asset_Type_ID-> MAssetType */
private static CCache<Integer,MAssetType> s_cache = new CCache<Integer,MAssetType>(Table_Name, 10, 0); private static ImmutableIntPOCache<Integer,MAssetType> s_cache = new ImmutableIntPOCache<Integer,MAssetType>(Table_Name, 10, 0);
/** Get Asset Type /**
* Get Asset Type from cache (immutable)
* @param A_Asset_Type_ID
* @return asset type object
*/
public static MAssetType get (int A_Asset_Type_ID)
{
return get(Env.getCtx(), A_Asset_Type_ID);
}
/**
* Get Asset Type from cache (immutable)
* @param ctx context * @param ctx context
* @param A_Asset_Type_ID * @param A_Asset_Type_ID
* @return asset type object * @return asset type object
@ -47,29 +59,17 @@ public class MAssetType extends X_A_Asset_Type
{ {
if (A_Asset_Type_ID <= 0) if (A_Asset_Type_ID <= 0)
return null; return null;
MAssetType o = s_cache.get(A_Asset_Type_ID); MAssetType o = s_cache.get(ctx, A_Asset_Type_ID, e -> new MAssetType(ctx, e));
if (o != null) if (o != null)
return o; return o;
o = new MAssetType(ctx, A_Asset_Type_ID, null); o = new MAssetType(ctx, A_Asset_Type_ID, (String)null);
if (o.get_ID() > 0) { if (o.get_ID() == A_Asset_Type_ID) {
s_cache.put(A_Asset_Type_ID, o); s_cache.put(A_Asset_Type_ID, o, e -> new MAssetType(Env.getCtx(), e));
return o; return o;
} }
return null; return null;
} }
/** Get Asset Type
* @param ctx context
* @param id id as Number
* @return asset type object
*/
public static MAssetType get (Properties ctx, Object id)
{
if (id == null)
return null;
return get(ctx, ((Number)id).intValue());
}
/** Standard Constructor */ /** Standard Constructor */
public MAssetType (Properties ctx, int A_Asset_Type_ID, String trxName) public MAssetType (Properties ctx, int A_Asset_Type_ID, String trxName)
{ {
@ -82,6 +82,37 @@ public class MAssetType extends X_A_Asset_Type
super (ctx, rs, trxName); super (ctx, rs, trxName);
} }
/**
*
* @param copy
*/
public MAssetType(MAssetType copy)
{
this(Env.getCtx(), copy);
}
/**
*
* @param ctx
* @param copy
*/
public MAssetType(Properties ctx, MAssetType copy)
{
this(ctx, copy, (String) null);
}
/**
*
* @param ctx
* @param copy
* @param trxName
*/
public MAssetType(Properties ctx, MAssetType copy, String trxName)
{
this(ctx, 0, trxName);
copyPO(copy);
}
/** Is Fixed Asset /** Is Fixed Asset
*/ */
public boolean isFixedAsset() public boolean isFixedAsset()
@ -197,6 +228,15 @@ public class MAssetType extends X_A_Asset_Type
return true; return true;
} }
@Override
public MAssetType markImmutable() {
if (is_Immutable())
return this;
makeImmutable();
return this;
}
/** Callout Class */ /** Callout Class */
public static class Callout extends CalloutEngine public static class Callout extends CalloutEngine
{ {

View File

@ -20,6 +20,7 @@ import java.math.BigDecimal;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.sql.Timestamp; import java.sql.Timestamp;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays;
import java.util.List; import java.util.List;
import java.util.Properties; import java.util.Properties;
import java.util.logging.Level; import java.util.logging.Level;
@ -27,6 +28,7 @@ import java.util.logging.Level;
import org.compiere.util.CLogger; import org.compiere.util.CLogger;
import org.compiere.util.DB; import org.compiere.util.DB;
import org.compiere.util.Env; import org.compiere.util.Env;
import org.idempiere.cache.ImmutablePOSupport;
/** /**
* Product Attribute * Product Attribute
@ -34,13 +36,12 @@ import org.compiere.util.Env;
* @author Jorg Janke * @author Jorg Janke
* @version $Id: MAttribute.java,v 1.3 2006/07/30 00:51:03 jjanke Exp $ * @version $Id: MAttribute.java,v 1.3 2006/07/30 00:51:03 jjanke Exp $
*/ */
public class MAttribute extends X_M_Attribute public class MAttribute extends X_M_Attribute implements ImmutablePOSupport
{ {
/** /**
* *
*/ */
private static final long serialVersionUID = 7869800574413317999L; private static final long serialVersionUID = 7513117649181926813L;
/** /**
* Get Attributes Of Client * Get Attributes Of Client
@ -112,6 +113,38 @@ public class MAttribute extends X_M_Attribute
super(ctx, rs, trxName); super(ctx, rs, trxName);
} // MAttribute } // MAttribute
/**
*
* @param copy
*/
public MAttribute(MAttribute copy)
{
this(Env.getCtx(), copy);
}
/**
*
* @param ctx
* @param copy
*/
public MAttribute(Properties ctx, MAttribute copy)
{
this(ctx, copy, (String) null);
}
/**
*
* @param ctx
* @param copy
* @param trxName
*/
public MAttribute(Properties ctx, MAttribute copy, String trxName)
{
this(ctx, 0, trxName);
copyPO(copy);
this.m_values = copy.m_values != null ? Arrays.stream(copy.m_values).map(e -> {return new MAttributeValue(ctx, e, trxName);}).toArray(MAttributeValue[]::new) : null;
}
/** Values */ /** Values */
private MAttributeValue[] m_values = null; private MAttributeValue[] m_values = null;
@ -127,7 +160,7 @@ public class MAttribute extends X_M_Attribute
List<MAttributeValue> list = new ArrayList<MAttributeValue>(); List<MAttributeValue> list = new ArrayList<MAttributeValue>();
if (!isMandatory()) if (!isMandatory())
list.add (null); list.add (null);
list = new Query(getCtx(),I_M_AttributeValue.Table_Name,whereClause,null) list = new Query(getCtx(),I_M_AttributeValue.Table_Name,whereClause,get_TrxName())
.setParameters(getM_Attribute_ID()) .setParameters(getM_Attribute_ID())
.setOrderBy("Value") .setOrderBy("Value")
.list(); .list();
@ -270,4 +303,13 @@ public class MAttribute extends X_M_Attribute
return success; return success;
} // afterSave } // afterSave
@Override
public MAttribute markImmutable() {
if (is_Immutable())
return this;
makeImmutable();
return this;
}
} // MAttribute } // MAttribute

View File

@ -20,12 +20,15 @@ import java.sql.PreparedStatement;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.sql.SQLException; import java.sql.SQLException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays;
import java.util.List; import java.util.List;
import java.util.Properties; import java.util.Properties;
import org.adempiere.exceptions.DBException; import org.adempiere.exceptions.DBException;
import org.compiere.util.CCache;
import org.compiere.util.DB; import org.compiere.util.DB;
import org.compiere.util.Env;
import org.idempiere.cache.ImmutableIntPOCache;
import org.idempiere.cache.ImmutablePOSupport;
/** /**
* Product Attribute Set * Product Attribute Set
@ -36,12 +39,22 @@ import org.compiere.util.DB;
* @author Teo Sarca, www.arhipac.ro * @author Teo Sarca, www.arhipac.ro
* <li>FR [ 2214883 ] Remove SQL code and Replace for Query * <li>FR [ 2214883 ] Remove SQL code and Replace for Query
*/ */
public class MAttributeSet extends X_M_AttributeSet public class MAttributeSet extends X_M_AttributeSet implements ImmutablePOSupport
{ {
/** /**
* *
*/ */
private static final long serialVersionUID = -187568054160926817L; private static final long serialVersionUID = -6570475541239019293L;
/**
* Get MAttributeSet from Cache
* @param M_AttributeSet_ID id
* @return MAttributeSet
*/
public static MAttributeSet get (int M_AttributeSet_ID)
{
return get(Env.getCtx(), M_AttributeSet_ID);
}
/** /**
* Get MAttributeSet from Cache * Get MAttributeSet from Cache
@ -52,18 +65,35 @@ public class MAttributeSet extends X_M_AttributeSet
public static MAttributeSet get (Properties ctx, int M_AttributeSet_ID) public static MAttributeSet get (Properties ctx, int M_AttributeSet_ID)
{ {
Integer key = Integer.valueOf(M_AttributeSet_ID); Integer key = Integer.valueOf(M_AttributeSet_ID);
MAttributeSet retValue = (MAttributeSet) s_cache.get (key); MAttributeSet retValue = s_cache.get (ctx, key, e -> new MAttributeSet(ctx, e));
if (retValue != null) if (retValue != null)
return retValue; return retValue;
retValue = new MAttributeSet (ctx, M_AttributeSet_ID, null); retValue = new MAttributeSet (ctx, M_AttributeSet_ID, (String)null);
if (retValue.get_ID () != 0) if (retValue.get_ID () == M_AttributeSet_ID)
s_cache.put (key, retValue); {
s_cache.put (key, retValue, e -> new MAttributeSet(Env.getCtx(), e));
return retValue; return retValue;
}
return null;
} // get } // get
/**
* Get updateable copy of MAttributeSet from cache
* @param ctx
* @param M_AttributeSet_ID
* @return MAttributeSet
*/
public static MAttributeSet getCopy(Properties ctx, int M_AttributeSet_ID, String trxName)
{
MAttributeSet mas = get(M_AttributeSet_ID);
if (mas != null)
mas = new MAttributeSet(ctx, mas, trxName);
return mas;
}
/** Cache */ /** Cache */
private static CCache<Integer,MAttributeSet> s_cache private static ImmutableIntPOCache<Integer,MAttributeSet> s_cache
= new CCache<Integer,MAttributeSet> (Table_Name, 20); = new ImmutableIntPOCache<Integer,MAttributeSet> (Table_Name, 20);
/** /**
@ -100,17 +130,53 @@ public class MAttributeSet extends X_M_AttributeSet
super(ctx, rs, trxName); super(ctx, rs, trxName);
} // MAttributeSet } // MAttributeSet
/**
*
* @param copy
*/
public MAttributeSet(MAttributeSet copy)
{
this(Env.getCtx(), copy);
}
/**
*
* @param ctx
* @param copy
*/
public MAttributeSet(Properties ctx, MAttributeSet copy)
{
this(ctx, copy, (String) null);
}
/**
*
* @param ctx
* @param copy
* @param trxName
*/
public MAttributeSet(Properties ctx, MAttributeSet copy, String trxName)
{
this(ctx, 0, trxName);
copyPO(copy);
this.m_instanceAttributes = copy.m_instanceAttributes != null ? Arrays.stream(copy.m_instanceAttributes).map(e -> {return new MAttribute(ctx, e, trxName);}).toArray(MAttribute[]::new) : null;
this.m_productAttributes = copy.m_productAttributes != null ? Arrays.stream(copy.m_productAttributes).map(e -> {return new MAttribute(ctx, e, trxName);}).toArray(MAttribute[]::new) : null;
this.m_excludes = copy.m_excludes != null ? Arrays.copyOf(copy.m_excludes, copy.m_excludes.length) : null;
this.m_excludeLots = copy.m_excludeLots != null ? Arrays.copyOf(copy.m_excludeLots, copy.m_excludeLots.length) : null;
this.m_excludeSerNos = copy.m_excludeSerNos != null ? Arrays.copyOf(copy.m_excludeSerNos, copy.m_excludeSerNos.length) : null;
}
/** Instance Attributes */ /** Instance Attributes */
private MAttribute[] m_instanceAttributes = null; private MAttribute[] m_instanceAttributes = null;
/** Instance Attributes */ /** Instance Attributes */
private MAttribute[] m_productAttributes = null; private MAttribute[] m_productAttributes = null;
/** Entry Exclude */ /** Entry Exclude */
private X_M_AttributeSetExclude[] m_excludes = null; private MAttributeSetExclude[] m_excludes = null;
/** Lot create Exclude */ /** Lot create Exclude */
private X_M_LotCtlExclude[] m_excludeLots = null; private MLotCtlExclude[] m_excludeLots = null;
/** Serial No create Exclude */ /** Serial No create Exclude */
private X_M_SerNoCtlExclude[] m_excludeSerNos = null; private MSerNoCtlExclude[] m_excludeSerNos = null;
/** /**
* Get Attribute Array * Get Attribute Array
@ -158,11 +224,15 @@ public class MAttributeSet extends X_M_AttributeSet
{ {
m_instanceAttributes = new MAttribute[list.size()]; m_instanceAttributes = new MAttribute[list.size()];
list.toArray (m_instanceAttributes); list.toArray (m_instanceAttributes);
if (m_instanceAttributes.length > 0 && is_Immutable())
Arrays.stream(m_instanceAttributes).forEach(e -> e.markImmutable());
} }
else else
{ {
m_productAttributes = new MAttribute[list.size()]; m_productAttributes = new MAttribute[list.size()];
list.toArray (m_productAttributes); list.toArray (m_productAttributes);
if (m_productAttributes.length > 0 && is_Immutable())
Arrays.stream(m_productAttributes).forEach(e -> e.markImmutable());
} }
} }
// //
@ -245,12 +315,12 @@ public class MAttributeSet extends X_M_AttributeSet
private void loadExcludes() { private void loadExcludes() {
if (m_excludes == null) if (m_excludes == null)
{ {
final String whereClause = X_M_AttributeSetExclude.COLUMNNAME_M_AttributeSet_ID+"=?"; final String whereClause = MAttributeSetExclude.COLUMNNAME_M_AttributeSet_ID+"=?";
List<X_M_AttributeSetExclude> list = new Query(getCtx(), X_M_AttributeSetExclude.Table_Name, whereClause, null) List<MAttributeSetExclude> list = new Query(getCtx(), MAttributeSetExclude.Table_Name, whereClause, null)
.setParameters(get_ID()) .setParameters(get_ID())
.setOnlyActiveRecords(true) .setOnlyActiveRecords(true)
.list(); .list();
m_excludes = new X_M_AttributeSetExclude[list.size ()]; m_excludes = new MAttributeSetExclude[list.size ()];
list.toArray (m_excludes); list.toArray (m_excludes);
} }
} }
@ -267,12 +337,12 @@ public class MAttributeSet extends X_M_AttributeSet
return true; return true;
if (m_excludeLots == null) if (m_excludeLots == null)
{ {
final String whereClause = X_M_LotCtlExclude.COLUMNNAME_M_LotCtl_ID+"=?"; final String whereClause = MLotCtlExclude.COLUMNNAME_M_LotCtl_ID+"=?";
List<X_M_LotCtlExclude> list = new Query(getCtx(), X_M_LotCtlExclude.Table_Name, whereClause, null) List<MLotCtlExclude> list = new Query(getCtx(), MLotCtlExclude.Table_Name, whereClause, null)
.setParameters(getM_LotCtl_ID()) .setParameters(getM_LotCtl_ID())
.setOnlyActiveRecords(true) .setOnlyActiveRecords(true)
.list(); .list();
m_excludeLots = new X_M_LotCtlExclude[list.size ()]; m_excludeLots = new MLotCtlExclude[list.size ()];
list.toArray (m_excludeLots); list.toArray (m_excludeLots);
} }
// Find it // Find it
@ -301,12 +371,12 @@ public class MAttributeSet extends X_M_AttributeSet
return true; return true;
if (m_excludeSerNos == null) if (m_excludeSerNos == null)
{ {
final String whereClause = X_M_SerNoCtlExclude.COLUMNNAME_M_SerNoCtl_ID+"=?"; final String whereClause = MSerNoCtlExclude.COLUMNNAME_M_SerNoCtl_ID+"=?";
List<X_M_SerNoCtlExclude> list = new Query(getCtx(), X_M_SerNoCtlExclude.Table_Name, whereClause, null) List<MSerNoCtlExclude> list = new Query(getCtx(), MSerNoCtlExclude.Table_Name, whereClause, null)
.setParameters(getM_SerNoCtl_ID()) .setParameters(getM_SerNoCtl_ID())
.setOnlyActiveRecords(true) .setOnlyActiveRecords(true)
.list(); .list();
m_excludeSerNos = new X_M_SerNoCtlExclude[list.size ()]; m_excludeSerNos = new MSerNoCtlExclude[list.size ()];
list.toArray (m_excludeSerNos); list.toArray (m_excludeSerNos);
} }
// Find it // Find it
@ -442,4 +512,17 @@ public class MAttributeSet extends X_M_AttributeSet
return success; return success;
} // afterSave } // afterSave
@Override
public MAttributeSet markImmutable() {
if (is_Immutable())
return this;
makeImmutable();
if (m_instanceAttributes != null && m_instanceAttributes.length > 0)
Arrays.stream(m_instanceAttributes).forEach(e -> e.markImmutable());
if (m_productAttributes != null && m_productAttributes.length > 0)
Arrays.stream(m_productAttributes).forEach(e -> e.markImmutable());
return this;
}
} // MAttributeSet } // MAttributeSet

View File

@ -0,0 +1,89 @@
/**********************************************************************
* This file is part of iDempiere ERP Open Source *
* http://www.idempiere.org *
* *
* 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: *
* - Trek Global Corporation *
* - Heng Sin Low *
**********************************************************************/
package org.compiere.model;
import java.sql.ResultSet;
import java.util.Properties;
import org.compiere.util.Env;
/**
* @author hengsin
*
*/
public class MAttributeSetExclude extends X_M_AttributeSetExclude {
/**
*
*/
private static final long serialVersionUID = -2977401481745176882L;
/**
* @param ctx
* @param M_AttributeSetExclude_ID
* @param trxName
*/
public MAttributeSetExclude(Properties ctx, int M_AttributeSetExclude_ID, String trxName) {
super(ctx, M_AttributeSetExclude_ID, trxName);
}
/**
* @param ctx
* @param rs
* @param trxName
*/
public MAttributeSetExclude(Properties ctx, ResultSet rs, String trxName) {
super(ctx, rs, trxName);
}
/**
*
* @param copy
*/
public MAttributeSetExclude(MAttributeSetExclude copy) {
this(Env.getCtx(), copy);
}
/**
*
* @param ctx
* @param copy
*/
public MAttributeSetExclude(Properties ctx, MAttributeSetExclude copy) {
this(ctx, copy, (String) null);
}
/**
*
* @param ctx
* @param copy
* @param trxName
*/
public MAttributeSetExclude(Properties ctx, MAttributeSetExclude copy, String trxName) {
this(ctx, 0, trxName);
copyPO(copy);
}
}

View File

@ -19,6 +19,8 @@ package org.compiere.model;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.util.Properties; import java.util.Properties;
import org.compiere.util.Env;
/** /**
* Product Attribute Value * Product Attribute Value
* *
@ -62,6 +64,36 @@ public class MAttributeValue extends X_M_AttributeValue
super(ctx, rs, trxName); super(ctx, rs, trxName);
} // MAttributeValue } // MAttributeValue
/**
*
* @param copy
*/
public MAttributeValue(MAttributeValue copy)
{
this(Env.getCtx(), copy);
}
/**
*
* @param ctx
* @param copy
*/
public MAttributeValue(Properties ctx, MAttributeValue copy)
{
this(ctx, copy, (String) null);
}
/**
*
* @param ctx
* @param copy
* @param trxName
*/
public MAttributeValue(Properties ctx, MAttributeValue copy, String trxName)
{
this(ctx, 0, trxName);
copyPO(copy);
}
/** /**
* String Representation * String Representation
* @return info * @return info

View File

@ -20,25 +20,36 @@ import java.sql.ResultSet;
import java.util.List; import java.util.List;
import java.util.Properties; import java.util.Properties;
import org.compiere.util.CCache;
import org.compiere.util.CLogger; import org.compiere.util.CLogger;
import org.compiere.util.Env;
import org.compiere.util.Msg; import org.compiere.util.Msg;
import org.idempiere.cache.ImmutableIntPOCache;
import org.idempiere.cache.ImmutablePOSupport;
/** /**
* BOM Model * BOM Model
* @author Jorg Janke * @author Jorg Janke
* @version $Id: MBOM.java,v 1.3 2006/07/30 00:51:03 jjanke Exp $ * @version $Id: MBOM.java,v 1.3 2006/07/30 00:51:03 jjanke Exp $
*/ */
public class MBOM extends X_M_BOM public class MBOM extends X_M_BOM implements ImmutablePOSupport
{ {
/** /**
* *
*/ */
private static final long serialVersionUID = -8885316310068284701L; private static final long serialVersionUID = -6311001492891936078L;
/** /**
* Get BOM from Cache * Get BOM from Cache (immutable)
* @param M_BOM_ID id
* @return MBOM
*/
public static MBOM get (int M_BOM_ID)
{
return get(Env.getCtx(), M_BOM_ID);
}
/**
* Get BOM from Cache (immutable)
* @param ctx context * @param ctx context
* @param M_BOM_ID id * @param M_BOM_ID id
* @return MBOM * @return MBOM
@ -46,15 +57,33 @@ public class MBOM extends X_M_BOM
public static MBOM get (Properties ctx, int M_BOM_ID) public static MBOM get (Properties ctx, int M_BOM_ID)
{ {
Integer key = Integer.valueOf(M_BOM_ID); Integer key = Integer.valueOf(M_BOM_ID);
MBOM retValue = (MBOM) s_cache.get (key); MBOM retValue = (MBOM) s_cache.get (ctx, key, e -> new MBOM(ctx, e));
if (retValue != null) if (retValue != null)
return retValue; return retValue;
retValue = new MBOM (ctx, M_BOM_ID, null); retValue = new MBOM (ctx, M_BOM_ID, (String)null);
if (retValue.get_ID () != 0) if (retValue.get_ID () == M_BOM_ID)
s_cache.put (key, retValue); {
return retValue; s_cache.put (key, retValue, e -> new MBOM(Env.getCtx(), e));
return retValue.markImmutable();
}
return null;
} // get } // get
/**
* Get updateable copy of MBOM from cache
* @param ctx
* @param M_BOM_ID
* @param trxName
* @return MBOM
*/
public static MBOM getCopy(Properties ctx, int M_BOM_ID, String trxName)
{
MBOM bom = get(M_BOM_ID);
if (bom != null)
bom = new MBOM(ctx, bom, trxName);
return bom;
}
/** /**
* Get BOMs Of Product * Get BOMs Of Product
* @param ctx context * @param ctx context
@ -80,8 +109,8 @@ public class MBOM extends X_M_BOM
} // getOfProduct } // getOfProduct
/** Cache */ /** Cache */
private static CCache<Integer,MBOM> s_cache private static ImmutableIntPOCache<Integer,MBOM> s_cache
= new CCache<Integer,MBOM>(Table_Name, 20); = new ImmutableIntPOCache<Integer,MBOM>(Table_Name, 20);
/** Logger */ /** Logger */
@SuppressWarnings("unused") @SuppressWarnings("unused")
private static CLogger s_log = CLogger.getCLogger (MBOM.class); private static CLogger s_log = CLogger.getCLogger (MBOM.class);
@ -116,6 +145,37 @@ public class MBOM extends X_M_BOM
super (ctx, rs, trxName); super (ctx, rs, trxName);
} // MBOM } // MBOM
/**
*
* @param copy
*/
public MBOM(MBOM copy)
{
this(Env.getCtx(), copy);
}
/**
*
* @param ctx
* @param copy
*/
public MBOM(Properties ctx, MBOM copy)
{
this(ctx, copy, (String) null);
}
/**
*
* @param ctx
* @param copy
* @param trxName
*/
public MBOM(Properties ctx, MBOM copy, String trxName)
{
this(ctx, 0, trxName);
copyPO(copy);
}
/** /**
* Before Save * Before Save
* @param newRecord new * @param newRecord new
@ -161,4 +221,12 @@ public class MBOM extends X_M_BOM
return true; return true;
} // beforeSave } // beforeSave
@Override
public MBOM markImmutable() {
if (is_Immutable())
return this;
makeImmutable();
return this;
}
} // MBOM } // MBOM

View File

@ -113,7 +113,7 @@ public class MBOMProduct extends X_M_BOMProduct
private MBOM getBOM() private MBOM getBOM()
{ {
if (m_bom == null && getM_BOM_ID() != 0) if (m_bom == null && getM_BOM_ID() != 0)
m_bom = MBOM.get(getCtx(), getM_BOM_ID()); m_bom = MBOM.getCopy(getCtx(), getM_BOM_ID(), get_TrxName());
return m_bom; return m_bom;
} // getBOM } // getBOM

View File

@ -115,6 +115,38 @@ public class MBPBankAccount extends X_C_BP_BankAccount
setA_Country(location.getCountryName()); setA_Country(location.getCountryName());
} // MBP_BankAccount } // MBP_BankAccount
/**
*
* @param copy
*/
public MBPBankAccount(MBPBankAccount copy)
{
this(Env.getCtx(), copy);
}
/**
*
* @param ctx
* @param copy
*/
public MBPBankAccount(Properties ctx, MBPBankAccount copy)
{
this(ctx, copy, (String) null);
}
/**
*
* @param ctx
* @param copy
* @param trxName
*/
public MBPBankAccount(Properties ctx, MBPBankAccount copy, String trxName)
{
this(ctx, 0, trxName);
copyPO(copy);
this.m_bank = copy.m_bank != null ? new MBank(ctx, copy.m_bank, trxName) : null;
}
/** Bank Link */ /** Bank Link */
private MBank m_bank = null; private MBank m_bank = null;

View File

@ -23,11 +23,12 @@ import java.sql.ResultSet;
import java.util.Properties; import java.util.Properties;
import java.util.logging.Level; import java.util.logging.Level;
import org.compiere.util.CCache;
import org.compiere.util.CLogger; import org.compiere.util.CLogger;
import org.compiere.util.DB; import org.compiere.util.DB;
import org.compiere.util.Env; import org.compiere.util.Env;
import org.compiere.util.Util; import org.idempiere.cache.ImmutableIntPOCache;
import org.idempiere.cache.ImmutablePOSupport;
import org.idempiere.cache.IntPOCopyCache;
/** /**
* Business Partner Group Model * Business Partner Group Model
@ -35,33 +36,36 @@ import org.compiere.util.Util;
* @author Jorg Janke * @author Jorg Janke
* @version $Id: MBPGroup.java,v 1.4 2006/09/23 15:54:22 jjanke Exp $ * @version $Id: MBPGroup.java,v 1.4 2006/09/23 15:54:22 jjanke Exp $
*/ */
public class MBPGroup extends X_C_BP_Group public class MBPGroup extends X_C_BP_Group implements ImmutablePOSupport
{ {
/** /**
* *
*/ */
private static final long serialVersionUID = 8897399796117872715L; private static final long serialVersionUID = 1155912422087010656L;
/** /**
* Get MBPGroup from Cache * Get MBPGroup from Cache (immutable)
* @param C_BP_Group_ID id
* @return MBPGroup
*/
public static MBPGroup get (int C_BP_Group_ID)
{
return get(Env.getCtx(), C_BP_Group_ID);
}
/**
* Get MBPGroup from Cache (immutable)
* @param ctx context * @param ctx context
* @param C_BP_Group_ID id * @param C_BP_Group_ID id
* @return MBPGroup * @return MBPGroup
*/ */
public static MBPGroup get (Properties ctx, int C_BP_Group_ID) public static MBPGroup get (Properties ctx, int C_BP_Group_ID)
{ {
Integer key = Integer.valueOf(C_BP_Group_ID); return get(ctx, C_BP_Group_ID, (String)null);
MBPGroup retValue = (MBPGroup) s_cache.get (key);
if (retValue != null)
return retValue;
retValue = new MBPGroup (ctx, C_BP_Group_ID, null);
if (retValue.get_ID () != 0)
s_cache.put (key, retValue);
return retValue;
} // get } // get
/** /**
* * Get MBPGroup from cache (immutable)
* @param ctx * @param ctx
* @param C_BP_Group_ID * @param C_BP_Group_ID
* @param trxName * @param trxName
@ -69,10 +73,32 @@ public class MBPGroup extends X_C_BP_Group
*/ */
public static MBPGroup get (Properties ctx, int C_BP_Group_ID, String trxName) public static MBPGroup get (Properties ctx, int C_BP_Group_ID, String trxName)
{ {
if (Util.isEmpty(trxName, true)) Integer key = Integer.valueOf(C_BP_Group_ID);
return get(ctx, C_BP_Group_ID); MBPGroup retValue = s_cache.get (ctx, key, e -> new MBPGroup(ctx, e));
else if (retValue != null)
return new MBPGroup (ctx, C_BP_Group_ID, trxName); return retValue;
retValue = new MBPGroup (ctx, C_BP_Group_ID, trxName);
if (retValue.get_ID () == C_BP_Group_ID)
{
s_cache.put (key, retValue, e -> new MBPGroup(Env.getCtx(), e));
return retValue;
}
return null;
}
/**
* Get updateable copy of MBPGroup from cache
* @param ctx
* @param C_BP_Group_ID
* @param trxName
* @return MBPGroup
*/
public static MBPGroup getCopy(Properties ctx, int C_BP_Group_ID, String trxName)
{
MBPGroup group = get(ctx, C_BP_Group_ID, trxName);
if (group != null)
group = new MBPGroup(ctx, group, trxName);
return group;
} }
/** /**
@ -84,7 +110,7 @@ public class MBPGroup extends X_C_BP_Group
{ {
int AD_Client_ID = Env.getAD_Client_ID(ctx); int AD_Client_ID = Env.getAD_Client_ID(ctx);
Integer key = Integer.valueOf(AD_Client_ID); Integer key = Integer.valueOf(AD_Client_ID);
MBPGroup retValue = (MBPGroup) s_cacheDefault.get (key); MBPGroup retValue = s_cacheDefault.get (key, e -> new MBPGroup(ctx, e));
if (retValue != null) if (retValue != null)
return retValue; return retValue;
@ -100,9 +126,11 @@ public class MBPGroup extends X_C_BP_Group
rs = pstmt.executeQuery (); rs = pstmt.executeQuery ();
if (rs.next ()) if (rs.next ())
{ {
retValue = new MBPGroup (ctx, rs, null); retValue = new MBPGroup (ctx, rs, (String)null);
if (retValue.get_ID () != 0) if (retValue.get_ID () != 0)
s_cacheDefault.put (key, retValue); {
s_cacheDefault.put (key, retValue, e -> new MBPGroup(Env.getCtx(), e));
}
} }
} }
catch (Exception e) catch (Exception e)
@ -162,11 +190,11 @@ public class MBPGroup extends X_C_BP_Group
} // getOfBPartner } // getOfBPartner
/** Cache */ /** Cache */
private static CCache<Integer,MBPGroup> s_cache private static ImmutableIntPOCache<Integer,MBPGroup> s_cache
= new CCache<Integer,MBPGroup>(Table_Name, 10); = new ImmutableIntPOCache<Integer,MBPGroup>(Table_Name, 10);
/** Default Cache */ /** Default Cache */
private static CCache<Integer,MBPGroup> s_cacheDefault private static IntPOCopyCache<Integer,MBPGroup> s_cacheDefault
= new CCache<Integer,MBPGroup>(Table_Name, MBPGroup.class.getName()+".Default", 5); = new IntPOCopyCache<Integer,MBPGroup>(Table_Name, MBPGroup.class.getName()+".Default", 5);
/** Logger */ /** Logger */
private static CLogger s_log = CLogger.getCLogger (MBPGroup.class); private static CLogger s_log = CLogger.getCLogger (MBPGroup.class);
@ -200,6 +228,36 @@ public class MBPGroup extends X_C_BP_Group
super(ctx, rs, trxName); super(ctx, rs, trxName);
} // MBPGroup } // MBPGroup
/**
*
* @param copy
*/
public MBPGroup(MBPGroup copy)
{
this(Env.getCtx(), copy);
}
/**
*
* @param ctx
* @param copy
*/
public MBPGroup(Properties ctx, MBPGroup copy)
{
this(ctx, copy, (String) null);
}
/**
*
* @param ctx
* @param copy
* @param trxName
*/
public MBPGroup(Properties ctx, MBPGroup copy, String trxName)
{
this(ctx, 0, trxName);
copyPO(copy);
}
/** /**
* Get Credit Watch Percent * Get Credit Watch Percent
@ -246,4 +304,12 @@ public class MBPGroup extends X_C_BP_Group
return success; return success;
} // afterSave } // afterSave
@Override
public MBPGroup markImmutable() {
if (is_Immutable())
return this;
makeImmutable();
return this;
}
} // MBPGroup } // MBPGroup

View File

@ -21,6 +21,7 @@ import java.sql.PreparedStatement;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.sql.Timestamp; import java.sql.Timestamp;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays;
import java.util.Properties; import java.util.Properties;
import java.util.logging.Level; import java.util.logging.Level;
@ -28,6 +29,7 @@ import org.compiere.util.CLogger;
import org.compiere.util.DB; import org.compiere.util.DB;
import org.compiere.util.Env; import org.compiere.util.Env;
import org.compiere.util.Msg; import org.compiere.util.Msg;
import org.idempiere.cache.ImmutablePOSupport;
/** /**
* Business Partner Model * Business Partner Model
@ -42,12 +44,12 @@ import org.compiere.util.Msg;
* <LI>BF [ 2041226 ] BP Open Balance should count only Completed Invoice * <LI>BF [ 2041226 ] BP Open Balance should count only Completed Invoice
* <LI>BF [ 2498949 ] BP Get Not Invoiced Shipment Value return null * <LI>BF [ 2498949 ] BP Get Not Invoiced Shipment Value return null
*/ */
public class MBPartner extends X_C_BPartner public class MBPartner extends X_C_BPartner implements ImmutablePOSupport
{ {
/** /**
* *
*/ */
private static final long serialVersionUID = 5534148976588041343L; private static final long serialVersionUID = 2256035503713773448L;
/** /**
* Get Empty Template Business Partner * Get Empty Template Business Partner
@ -323,6 +325,42 @@ public class MBPartner extends X_C_BPartner
setC_BP_Group_ID(impBP.getC_BP_Group_ID()); setC_BP_Group_ID(impBP.getC_BP_Group_ID());
} // MBPartner } // MBPartner
/**
*
* @param copy
*/
public MBPartner(MBPartner copy)
{
this(Env.getCtx(), copy);
}
/**
*
* @param ctx
* @param copy
*/
public MBPartner(Properties ctx, MBPartner copy)
{
this(ctx, copy, (String) null);
}
/**
*
* @param ctx
* @param copy
* @param trxName
*/
public MBPartner(Properties ctx, MBPartner copy, String trxName)
{
this(ctx, 0, trxName);
copyPO(copy);
this.m_contacts = copy.m_contacts != null ? Arrays.stream(copy.m_contacts).map(e -> {return new MUser(ctx, e, trxName);}).toArray(MUser[]::new) : null;
this.m_locations = copy.m_locations != null ? Arrays.stream(copy.m_locations).map(e -> {return new MBPartnerLocation(ctx, e, trxName);}).toArray(MBPartnerLocation[]::new) : null;
this.m_accounts = copy.m_accounts != null ? Arrays.stream(copy.m_accounts).map(e -> {return new MBPBankAccount(ctx, e, trxName);}).toArray(MBPBankAccount[]::new) : null;
this.m_primaryC_BPartner_Location_ID = copy.m_primaryC_BPartner_Location_ID;
this.m_primaryAD_User_ID = copy.m_primaryAD_User_ID;
this.m_group = copy.m_group != null ? new MBPGroup(ctx, copy.m_group, trxName) : null;
}
/** Users */ /** Users */
protected MUser[] m_contacts = null; protected MUser[] m_contacts = null;
@ -843,7 +881,7 @@ public class MBPartner extends X_C_BPartner
if (getC_BP_Group_ID() == 0) if (getC_BP_Group_ID() == 0)
m_group = MBPGroup.getDefault(getCtx()); m_group = MBPGroup.getDefault(getCtx());
else else
m_group = MBPGroup.get(getCtx(), getC_BP_Group_ID(), get_TrxName()); m_group = MBPGroup.getCopy(getCtx(), getC_BP_Group_ID(), get_TrxName());
} }
return m_group; return m_group;
} // getBPGroup } // getBPGroup
@ -994,4 +1032,13 @@ public class MBPartner extends X_C_BPartner
return true; return true;
} }
@Override
public MBPartner markImmutable() {
if (is_Immutable())
return this;
makeImmutable();
return this;
}
} // MBPartner } // MBPartner

View File

@ -20,6 +20,8 @@ import java.sql.ResultSet;
import java.util.List; import java.util.List;
import java.util.Properties; import java.util.Properties;
import org.compiere.util.Env;
/** /**
* Partner Location Model * Partner Location Model
* *
@ -122,6 +124,40 @@ public class MBPartnerLocation extends X_C_BPartner_Location {
super(ctx, rs, trxName); super(ctx, rs, trxName);
} // MBPartner_Location } // MBPartner_Location
/**
*
* @param copy
*/
public MBPartnerLocation(MBPartnerLocation copy)
{
this(Env.getCtx(), copy);
}
/**
*
* @param ctx
* @param copy
*/
public MBPartnerLocation(Properties ctx, MBPartnerLocation copy)
{
this(ctx, copy, (String) null);
}
/**
*
* @param ctx
* @param copy
* @param trxName
*/
public MBPartnerLocation(Properties ctx, MBPartnerLocation copy, String trxName)
{
this(ctx, 0, trxName);
copyPO(copy);
this.m_location = copy.m_location != null ? new MLocation(ctx, copy.m_location, trxName) : null;
this.m_uniqueName = copy.m_uniqueName;
this.m_unique = copy.m_unique;
}
/** Cached Location */ /** Cached Location */
private MLocation m_location = null; private MLocation m_location = null;
/** Unique Name */ /** Unique Name */
@ -136,7 +172,7 @@ public class MBPartnerLocation extends X_C_BPartner_Location {
*/ */
public MLocation getLocation(boolean requery) { public MLocation getLocation(boolean requery) {
if (requery || m_location == null) if (requery || m_location == null)
m_location = MLocation.get(getCtx(), getC_Location_ID(), get_TrxName()); m_location = MLocation.getCopy(getCtx(), getC_Location_ID(), get_TrxName());
return m_location; return m_location;
} // getLocation } // getLocation

View File

@ -19,7 +19,9 @@ package org.compiere.model;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.util.Properties; import java.util.Properties;
import org.compiere.util.CCache; import org.compiere.util.Env;
import org.idempiere.cache.ImmutableIntPOCache;
import org.idempiere.cache.ImmutablePOSupport;
/** /**
* Bank Model * Bank Model
@ -27,16 +29,25 @@ import org.compiere.util.CCache;
* @author Jorg Janke * @author Jorg Janke
* @version $Id: MBank.java,v 1.2 2006/07/30 00:51:05 jjanke Exp $ * @version $Id: MBank.java,v 1.2 2006/07/30 00:51:05 jjanke Exp $
*/ */
public class MBank extends X_C_Bank public class MBank extends X_C_Bank implements ImmutablePOSupport
{ {
/** /**
* *
*/ */
private static final long serialVersionUID = 3459010882027283811L; private static final long serialVersionUID = 5093713970786841175L;
/** /**
* Get MBank from Cache * Get MBank from Cache (immutable)
* @param C_Bank_ID id
* @return MBank
*/
public static MBank get (int C_Bank_ID)
{
return get(Env.getCtx(), C_Bank_ID);
}
/**
* Get MBank from Cache (immutable)
* @param ctx context * @param ctx context
* @param C_Bank_ID id * @param C_Bank_ID id
* @return MBank * @return MBank
@ -44,18 +55,36 @@ public class MBank extends X_C_Bank
public static MBank get (Properties ctx, int C_Bank_ID) public static MBank get (Properties ctx, int C_Bank_ID)
{ {
Integer key = Integer.valueOf(C_Bank_ID); Integer key = Integer.valueOf(C_Bank_ID);
MBank retValue = (MBank)s_cache.get (key); MBank retValue = s_cache.get (ctx, key, e -> new MBank(ctx, e));
if (retValue != null) if (retValue != null)
return retValue; return retValue;
retValue = new MBank (ctx, C_Bank_ID, null); retValue = new MBank (ctx, C_Bank_ID, (String)null);
if (retValue.get_ID() != 0) if (retValue.get_ID() == C_Bank_ID)
s_cache.put (key, retValue); {
s_cache.put (key, retValue, e -> new MBank(Env.getCtx(), e));
return retValue; return retValue;
}
return null;
} // get } // get
/**
* Get updateable copy of MBank from cache
* @param ctx
* @param C_Bank_ID
* @param trxName
* @return MBank
*/
public static MBank getCopy(Properties ctx, int C_Bank_ID, String trxName)
{
MBank bank = get(C_Bank_ID);
if (bank != null)
bank = new MBank(ctx, bank, trxName);
return bank;
}
/** Cache */ /** Cache */
private static CCache<Integer,MBank> s_cache = private static ImmutableIntPOCache<Integer,MBank> s_cache =
new CCache<Integer,MBank> (Table_Name, 3); new ImmutableIntPOCache<Integer,MBank> (Table_Name, 3);
/************************************************************************** /**************************************************************************
@ -80,6 +109,46 @@ public class MBank extends X_C_Bank
super (ctx, rs, trxName); super (ctx, rs, trxName);
} // MBank } // MBank
/**
*
* @param copy
*/
public MBank(MBank copy)
{
this(Env.getCtx(), copy);
}
/**
*
* @param ctx
* @param copy
*/
public MBank(Properties ctx, MBank copy)
{
this(ctx, copy, (String) null);
}
/**
*
* @param ctx
* @param copy
* @param trxName
*/
public MBank(Properties ctx, MBank copy, String trxName)
{
this(ctx, 0, trxName);
copyPO(copy);
}
@Override
public MBank markImmutable() {
if (is_Immutable())
return this;
makeImmutable();
return this;
}
/** /**
* String Representation * String Representation
* @return info * @return info

View File

@ -19,11 +19,12 @@ package org.compiere.model;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.util.Properties; import java.util.Properties;
import org.compiere.util.CCache;
import org.compiere.util.Env; import org.compiere.util.Env;
import org.compiere.util.IBAN; import org.compiere.util.IBAN;
import org.compiere.util.Msg; import org.compiere.util.Msg;
import org.compiere.util.Util; import org.compiere.util.Util;
import org.idempiere.cache.ImmutableIntPOCache;
import org.idempiere.cache.ImmutablePOSupport;
/** /**
@ -32,15 +33,25 @@ import org.compiere.util.Util;
* @author Jorg Janke * @author Jorg Janke
* @version $Id: MBankAccount.java,v 1.3 2006/07/30 00:51:05 jjanke Exp $ * @version $Id: MBankAccount.java,v 1.3 2006/07/30 00:51:05 jjanke Exp $
*/ */
public class MBankAccount extends X_C_BankAccount public class MBankAccount extends X_C_BankAccount implements ImmutablePOSupport
{ {
/** /**
* *
*/ */
private static final long serialVersionUID = -110709935374907275L; private static final long serialVersionUID = -3792366454862697171L;
/** /**
* Get BankAccount from Cache * Get BankAccount from Cache (immutable)
* @param C_BankAccount_ID id
* @return MBankAccount
*/
public static MBankAccount get (int C_BankAccount_ID)
{
return get(Env.getCtx(), C_BankAccount_ID);
}
/**
* Get BankAccount from Cache (immutable)
* @param ctx context * @param ctx context
* @param C_BankAccount_ID id * @param C_BankAccount_ID id
* @return MBankAccount * @return MBankAccount
@ -48,18 +59,36 @@ public class MBankAccount extends X_C_BankAccount
public static MBankAccount get (Properties ctx, int C_BankAccount_ID) public static MBankAccount get (Properties ctx, int C_BankAccount_ID)
{ {
Integer key = Integer.valueOf(C_BankAccount_ID); Integer key = Integer.valueOf(C_BankAccount_ID);
MBankAccount retValue = (MBankAccount) s_cache.get (key); MBankAccount retValue = s_cache.get (ctx, key, e -> new MBankAccount(ctx, e));
if (retValue != null) if (retValue != null)
return retValue; return retValue;
retValue = new MBankAccount (ctx, C_BankAccount_ID, null); retValue = new MBankAccount (ctx, C_BankAccount_ID, (String)null);
if (retValue.get_ID () != 0) if (retValue.get_ID () == C_BankAccount_ID)
s_cache.put (key, retValue); {
s_cache.put (key, retValue, e -> new MBankAccount(Env.getCtx(), e));
return retValue; return retValue;
}
return null;
} // get } // get
/**
* Get updateable copy of MBankAccount from cache
* @param ctx
* @param C_BankAccount_ID
* @param trxName
* @return MBankAccount
*/
public static MBankAccount getCopy(Properties ctx, int C_BankAccount_ID, String trxName)
{
MBankAccount mba = get(C_BankAccount_ID);
if (mba != null)
mba = new MBankAccount(ctx, mba, trxName);
return mba;
}
/** Cache */ /** Cache */
private static CCache<Integer,MBankAccount> s_cache private static ImmutableIntPOCache<Integer,MBankAccount> s_cache
= new CCache<Integer,MBankAccount>(Table_Name, 5); = new ImmutableIntPOCache<Integer,MBankAccount>(Table_Name, 5);
/** /**
* Bank Account Model * Bank Account Model
@ -92,6 +121,37 @@ public class MBankAccount extends X_C_BankAccount
super(ctx, rs, trxName); super(ctx, rs, trxName);
} // MBankAccount } // MBankAccount
/**
*
* @param copy
*/
public MBankAccount(MBankAccount copy)
{
this(Env.getCtx(), copy);
}
/**
*
* @param ctx
* @param copy
*/
public MBankAccount(Properties ctx, MBankAccount copy)
{
this(ctx, copy, (String) null);
}
/**
*
* @param ctx
* @param copy
* @param trxName
*/
public MBankAccount(Properties ctx, MBankAccount copy, String trxName)
{
this(ctx, 0, trxName);
copyPO(copy);
}
/** /**
* String representation * String representation
* @return info * @return info
@ -111,7 +171,7 @@ public class MBankAccount extends X_C_BankAccount
*/ */
public MBank getBank() public MBank getBank()
{ {
return MBank.get(getCtx(), getC_Bank_ID()); return MBank.getCopy(getCtx(), getC_Bank_ID(), get_TrxName());
} // getBank } // getBank
/** /**
@ -159,4 +219,13 @@ public class MBankAccount extends X_C_BankAccount
return success; return success;
} // afterSave } // afterSave
@Override
public MBankAccount markImmutable() {
if (is_Immutable())
return this;
makeImmutable();
return this;
}
} // MBankAccount } // MBankAccount

View File

@ -180,7 +180,7 @@ public class MBankStatement extends X_C_BankStatement implements DocAction
*/ */
public MBankAccount getBankAccount() public MBankAccount getBankAccount()
{ {
return MBankAccount.get(getCtx(), getC_BankAccount_ID()); return MBankAccount.getCopy(getCtx(), getC_BankAccount_ID(), (String)null);
} // getBankAccount } // getBankAccount
/** /**

View File

@ -20,9 +20,10 @@ import java.sql.ResultSet;
import java.util.Locale; import java.util.Locale;
import java.util.Properties; import java.util.Properties;
import org.compiere.util.CCache;
import org.compiere.util.Env; import org.compiere.util.Env;
import org.compiere.util.Msg; import org.compiere.util.Msg;
import org.idempiere.cache.ImmutableIntPOCache;
import org.idempiere.cache.ImmutablePOSupport;
/** /**
* Calendar Model * Calendar Model
@ -30,16 +31,25 @@ import org.compiere.util.Msg;
* @author Jorg Janke * @author Jorg Janke
* @version $Id: MCalendar.java,v 1.3 2006/07/30 00:51:05 jjanke Exp $ * @version $Id: MCalendar.java,v 1.3 2006/07/30 00:51:05 jjanke Exp $
*/ */
public class MCalendar extends X_C_Calendar public class MCalendar extends X_C_Calendar implements ImmutablePOSupport
{ {
/** /**
* *
*/ */
private static final long serialVersionUID = 7721451326626542420L; private static final long serialVersionUID = 6036302512252100576L;
/** /**
* Get MCalendar from Cache * Get MCalendar from Cache (immutable)
* @param C_Calendar_ID id
* @return MCalendar
*/
public static MCalendar get (int C_Calendar_ID)
{
return get(Env.getCtx(), C_Calendar_ID);
}
/**
* Get MCalendar from Cache (immutable)
* @param ctx context * @param ctx context
* @param C_Calendar_ID id * @param C_Calendar_ID id
* @return MCalendar * @return MCalendar
@ -47,15 +57,33 @@ public class MCalendar extends X_C_Calendar
public static MCalendar get (Properties ctx, int C_Calendar_ID) public static MCalendar get (Properties ctx, int C_Calendar_ID)
{ {
Integer key = Integer.valueOf(C_Calendar_ID); Integer key = Integer.valueOf(C_Calendar_ID);
MCalendar retValue = (MCalendar) s_cache.get (key); MCalendar retValue = s_cache.get (ctx, key, e -> new MCalendar(ctx, e));
if (retValue != null) if (retValue != null)
return retValue; return retValue;
retValue = new MCalendar (ctx, C_Calendar_ID, null); retValue = new MCalendar (ctx, C_Calendar_ID, (String)null);
if (retValue.get_ID () != 0) if (retValue.get_ID () == C_Calendar_ID)
s_cache.put (key, retValue); {
s_cache.put (key, retValue, e -> new MCalendar(Env.getCtx(), e));
return retValue; return retValue;
}
return null;
} // get } // get
/**
* Get updateable copy of MCalendar from cache
* @param ctx
* @param C_Calendar_ID
* @param trxName
* @return MCalendar
*/
public static MCalendar getCopy(Properties ctx, int C_Calendar_ID, String trxName)
{
MCalendar calendar = get(C_Calendar_ID);
if (calendar != null)
calendar = new MCalendar(ctx, calendar, trxName);
return calendar;
}
/** /**
* Get Default Calendar for Client * Get Default Calendar for Client
* @param ctx context * @param ctx context
@ -65,7 +93,7 @@ public class MCalendar extends X_C_Calendar
public static MCalendar getDefault (Properties ctx, int AD_Client_ID) public static MCalendar getDefault (Properties ctx, int AD_Client_ID)
{ {
MClientInfo info = MClientInfo.get(ctx, AD_Client_ID); MClientInfo info = MClientInfo.get(ctx, AD_Client_ID);
return get (ctx, info.getC_Calendar_ID()); return getCopy(ctx, info.getC_Calendar_ID(), (String)null);
} // getDefault } // getDefault
/** /**
@ -79,8 +107,8 @@ public class MCalendar extends X_C_Calendar
} // getDefault } // getDefault
/** Cache */ /** Cache */
private static CCache<Integer,MCalendar> s_cache private static ImmutableIntPOCache<Integer,MCalendar> s_cache
= new CCache<Integer,MCalendar>(Table_Name, 20); = new ImmutableIntPOCache<Integer,MCalendar>(Table_Name, 20);
/************************************************************************* /*************************************************************************
@ -117,6 +145,31 @@ public class MCalendar extends X_C_Calendar
setName(msgset.toString()); setName(msgset.toString());
} // MCalendar } // MCalendar
/**
*
* @param copy
*/
public MCalendar(MCalendar copy)
{
this(Env.getCtx(), copy);
}
/**
*
* @param ctx
* @param copy
*/
public MCalendar(Properties ctx, MCalendar copy)
{
this(ctx, copy, (String) null);
}
public MCalendar(Properties ctx, MCalendar copy, String trxName)
{
this(ctx, 0, trxName);
copyPO(copy);
}
/** /**
* Create (current) Calendar Year * Create (current) Calendar Year
* @param locale locale * @param locale locale
@ -133,4 +186,13 @@ public class MCalendar extends X_C_Calendar
return year; return year;
} // createYear } // createYear
@Override
public MCalendar markImmutable() {
if (is_Immutable())
return this;
makeImmutable();
return this;
}
} // MCalendar } // MCalendar

View File

@ -237,7 +237,7 @@ public class MCash extends X_C_Cash implements DocAction
public MCashBook getCashBook() public MCashBook getCashBook()
{ {
if (m_book == null) if (m_book == null)
m_book = MCashBook.get(getCtx(), getC_CashBook_ID()); m_book = MCashBook.getCopy(getCtx(), getC_CashBook_ID(), get_TrxName());
return m_book; return m_book;
} // getCashBook } // getCashBook

View File

@ -17,11 +17,12 @@
package org.compiere.model; package org.compiere.model;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.util.Iterator;
import java.util.Properties; import java.util.Properties;
import org.compiere.util.CCache;
import org.compiere.util.CLogger; import org.compiere.util.CLogger;
import org.compiere.util.Env;
import org.idempiere.cache.ImmutableIntPOCache;
import org.idempiere.cache.ImmutablePOSupport;
/** /**
* Cash Book Model * Cash Book Model
@ -30,43 +31,71 @@ import org.compiere.util.CLogger;
* @version $Id: MCashBook.java,v 1.3 2006/07/30 00:51:02 jjanke Exp $ * @version $Id: MCashBook.java,v 1.3 2006/07/30 00:51:02 jjanke Exp $
* @author red1 - FR: [ 2214883 ] Remove SQL code and Replace for Query * @author red1 - FR: [ 2214883 ] Remove SQL code and Replace for Query
*/ */
public class MCashBook extends X_C_CashBook public class MCashBook extends X_C_CashBook implements ImmutablePOSupport
{ {
/** /**
* *
*/ */
private static final long serialVersionUID = 3991585668643587699L; private static final long serialVersionUID = -743516751730874877L;
/** /**
* Get MCashBook from Cache * Get MCashBook from Cache (immutable))
* @param C_CashBook_ID id
* @return MCashBook
*/
public static MCashBook get (int C_CashBook_ID)
{
return get(Env.getCtx(), C_CashBook_ID);
}
/**
* Get MCashBook from Cache (immutable)
* @param ctx context * @param ctx context
* @param C_CashBook_ID id * @param C_CashBook_ID id
* @return MCashBook * @return MCashBook
*/ */
public static MCashBook get (Properties ctx, int C_CashBook_ID) public static MCashBook get (Properties ctx, int C_CashBook_ID)
{ {
return get(ctx, C_CashBook_ID, null); return get(ctx, C_CashBook_ID, (String)null);
} // get } // get
/** /**
* Gets MCashBook from Cache under transaction scope * Gets MCashBook from Cache (immutabble)
* @param ctx context * @param ctx context
* @param C_CashBook_ID id of cashbook to load * @param C_CashBook_ID id of cashbook to load
* @param trxName transaction name * @param trxName transaction to load mcashbook if it is not in cache
* @return Cashbook * @return Cashbook
*/ */
public static MCashBook get(Properties ctx, int C_CashBook_ID, String trxName) public static MCashBook get(Properties ctx, int C_CashBook_ID, String trxName)
{ {
Integer key = Integer.valueOf(C_CashBook_ID); Integer key = Integer.valueOf(C_CashBook_ID);
MCashBook retValue = (MCashBook) s_cache.get (key); MCashBook retValue = s_cache.get (ctx, key, e -> new MCashBook(ctx, e));
if (retValue != null) if (retValue != null)
return retValue; return retValue;
retValue = new MCashBook (ctx, C_CashBook_ID, trxName); retValue = new MCashBook (ctx, C_CashBook_ID, trxName);
if (retValue.get_ID () != 0) if (retValue.get_ID () == C_CashBook_ID)
s_cache.put (key, retValue); {
s_cache.put (key, retValue, e -> new MCashBook(Env.getCtx(), e));
return retValue; return retValue;
}
return null;
} // get } // get
/**
* Get updateable copy of MCashBook from cache
* @param ctx
* @param C_CashBook_ID
* @param trxName
* @return MCashBook
*/
public static MCashBook getCopy(Properties ctx, int C_CashBook_ID, String trxName)
{
MCashBook cb = get(ctx, C_CashBook_ID, trxName);
if (cb != null)
cb = new MCashBook(ctx, cb, trxName);
return cb;
}
/** /**
* Get CashBook for Org and Currency * Get CashBook for Org and Currency
* @param ctx context * @param ctx context
@ -77,12 +106,11 @@ public class MCashBook extends X_C_CashBook
public static MCashBook get (Properties ctx, int AD_Org_ID, int C_Currency_ID) public static MCashBook get (Properties ctx, int AD_Org_ID, int C_Currency_ID)
{ {
// Try from cache // Try from cache
Iterator<MCashBook> it = s_cache.values().iterator(); MCashBook[] it = s_cache.values().toArray(new MCashBook[0]);
while (it.hasNext()) for (MCashBook cb : it)
{ {
MCashBook cb = (MCashBook)it.next();
if (cb.getAD_Org_ID() == AD_Org_ID && cb.getC_Currency_ID() == C_Currency_ID) if (cb.getAD_Org_ID() == AD_Org_ID && cb.getC_Currency_ID() == C_Currency_ID)
return cb; return new MCashBook(ctx, cb);
} }
// Get from DB // Get from DB
@ -94,15 +122,15 @@ public class MCashBook extends X_C_CashBook
if (retValue!=null) if (retValue!=null)
{ {
Integer key = Integer.valueOf(retValue.getC_CashBook_ID()); Integer key = Integer.valueOf(retValue.getC_CashBook_ID());
s_cache.put (key, retValue); s_cache.put (key, new MCashBook(Env.getCtx(), retValue));
} }
return retValue; return retValue;
} // get } // get
/** Cache */ /** Cache */
private static CCache<Integer,MCashBook> s_cache private static ImmutableIntPOCache<Integer,MCashBook> s_cache
= new CCache<Integer,MCashBook>(Table_Name, 20); = new ImmutableIntPOCache<Integer,MCashBook>(Table_Name, 20);
/** Static Logger */ /** Static Logger */
@SuppressWarnings("unused") @SuppressWarnings("unused")
private static CLogger s_log = CLogger.getCLogger (MCashBook.class); private static CLogger s_log = CLogger.getCLogger (MCashBook.class);
@ -129,6 +157,37 @@ public class MCashBook extends X_C_CashBook
super(ctx, rs, trxName); super(ctx, rs, trxName);
} // MCashBook } // MCashBook
/**
*
* @param copy
*/
public MCashBook(MCashBook copy)
{
this(Env.getCtx(), copy);
}
/**
*
* @param ctx
* @param copy
*/
public MCashBook(Properties ctx, MCashBook copy)
{
this(ctx, copy, (String) null);
}
/**
*
* @param ctx
* @param copy
* @param trxName
*/
public MCashBook(Properties ctx, MCashBook copy, String trxName)
{
this(ctx, 0, trxName);
copyPO(copy);
}
/** /**
* After Save * After Save
* @param newRecord new * @param newRecord new
@ -143,4 +202,13 @@ public class MCashBook extends X_C_CashBook
return success; return success;
} // afterSave } // afterSave
@Override
public MCashBook markImmutable() {
if (is_Immutable())
return this;
makeImmutable();
return this;
}
} // MCashBook } // MCashBook

View File

@ -86,13 +86,10 @@ public class MCashLine extends X_C_CashLine
setClientOrg(cash); setClientOrg(cash);
setC_Cash_ID(cash.getC_Cash_ID()); setC_Cash_ID(cash.getC_Cash_ID());
m_parent = cash; m_parent = cash;
m_cashBook = m_parent.getCashBook();
} // MCashLine } // MCashLine
/** Parent */ /** Parent */
protected MCash m_parent = null; protected MCash m_parent = null;
/** Cash Book */
protected MCashBook m_cashBook = null;
/** Bank Account */ /** Bank Account */
protected MBankAccount m_bankAccount = null; protected MBankAccount m_bankAccount = null;
/** Invoice */ /** Invoice */
@ -241,9 +238,7 @@ public class MCashLine extends X_C_CashLine
*/ */
public MCashBook getCashBook() public MCashBook getCashBook()
{ {
if (m_cashBook == null) return getParent().getCashBook();
m_cashBook = MCashBook.get(getCtx(), getParent().getC_CashBook_ID());
return m_cashBook;
} // getCashBook } // getCashBook
/** /**
@ -253,7 +248,7 @@ public class MCashLine extends X_C_CashLine
public MBankAccount getBankAccount() public MBankAccount getBankAccount()
{ {
if (m_bankAccount == null && getC_BankAccount_ID() != 0) if (m_bankAccount == null && getC_BankAccount_ID() != 0)
m_bankAccount = MBankAccount.get(getCtx(), getC_BankAccount_ID()); m_bankAccount = MBankAccount.getCopy(getCtx(), getC_BankAccount_ID(), get_TrxName());
return m_bankAccount; return m_bankAccount;
} // getBankAccount } // getBankAccount

View File

@ -20,10 +20,11 @@ import java.math.BigDecimal;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.util.Properties; import java.util.Properties;
import org.compiere.util.CCache;
import org.compiere.util.CLogger; import org.compiere.util.CLogger;
import org.compiere.util.DB; import org.compiere.util.DB;
import org.compiere.util.Env; import org.compiere.util.Env;
import org.idempiere.cache.ImmutableIntPOCache;
import org.idempiere.cache.ImmutablePOSupport;
/** /**
* Charge Model * Charge Model
@ -34,12 +35,12 @@ import org.compiere.util.Env;
* @author Teo Sarca, www.arhipac.ro * @author Teo Sarca, www.arhipac.ro
* <li>FR [ 2214883 ] Remove SQL code and Replace for Query * <li>FR [ 2214883 ] Remove SQL code and Replace for Query
*/ */
public class MCharge extends X_C_Charge public class MCharge extends X_C_Charge implements ImmutablePOSupport
{ {
/** /**
* *
*/ */
private static final long serialVersionUID = -4628105180010713510L; private static final long serialVersionUID = 1978008783808254164L;
/** /**
* Get Charge Account * Get Charge Account
@ -80,7 +81,17 @@ public class MCharge extends X_C_Charge
} // getAccount } // getAccount
/** /**
* Get MCharge from Cache * Get MCharge from Cache (immutable)
* @param C_Charge_ID id
* @return MCharge
*/
public static MCharge get (int C_Charge_ID)
{
return get(Env.getCtx(), C_Charge_ID);
}
/**
* Get MCharge from Cache (immutable)
* @param ctx context * @param ctx context
* @param C_Charge_ID id * @param C_Charge_ID id
* @return MCharge * @return MCharge
@ -88,18 +99,36 @@ public class MCharge extends X_C_Charge
public static MCharge get (Properties ctx, int C_Charge_ID) public static MCharge get (Properties ctx, int C_Charge_ID)
{ {
Integer key = Integer.valueOf(C_Charge_ID); Integer key = Integer.valueOf(C_Charge_ID);
MCharge retValue = (MCharge)s_cache.get (key); MCharge retValue = (MCharge)s_cache.get (ctx, key, e -> new MCharge(ctx, e));
if (retValue != null) if (retValue != null)
return retValue; return retValue;
retValue = new MCharge (ctx, C_Charge_ID, null); retValue = new MCharge (ctx, C_Charge_ID, (String)null);
if (retValue.get_ID() != 0) if (retValue.get_ID() == C_Charge_ID)
s_cache.put (key, retValue); {
s_cache.put (key, retValue, e -> new MCharge(Env.getCtx(), e));
return retValue; return retValue;
}
return null;
} // get } // get
/**
* Get updateable copy of MCharge from cache
* @param ctx
* @param C_Charge_ID
* @param trxName
* @return MCharge
*/
public static MCharge getCopy(Properties ctx, int C_Charge_ID, String trxName)
{
MCharge charge = get(C_Charge_ID);
if (charge != null)
charge = new MCharge(ctx, charge, trxName);
return charge;
}
/** Cache */ /** Cache */
private static CCache<Integer, MCharge> s_cache private static ImmutableIntPOCache<Integer, MCharge> s_cache
= new CCache<Integer, MCharge> (Table_Name, 10); = new ImmutableIntPOCache<Integer, MCharge> (Table_Name, 10);
/** Static Logger */ /** Static Logger */
private static CLogger s_log = CLogger.getCLogger (MCharge.class); private static CLogger s_log = CLogger.getCLogger (MCharge.class);
@ -136,6 +165,37 @@ public class MCharge extends X_C_Charge
super(ctx, rs, trxName); super(ctx, rs, trxName);
} // MCharge } // MCharge
/**
*
* @param copy
*/
public MCharge(MCharge copy)
{
this(Env.getCtx(), copy);
}
/**
*
* @param ctx
* @param copy
*/
public MCharge(Properties ctx, MCharge copy)
{
this(ctx, copy, (String) null);
}
/**
*
* @param ctx
* @param copy
* @param trxName
*/
public MCharge(Properties ctx, MCharge copy, String trxName)
{
this(ctx, 0, trxName);
copyPO(copy);
}
/** /**
* After Save * After Save
* @param newRecord new * @param newRecord new
@ -150,4 +210,13 @@ public class MCharge extends X_C_Charge
return success; return success;
} // afterSave } // afterSave
@Override
public MCharge markImmutable() {
if (is_Immutable())
return this;
makeImmutable();
return this;
}
} // MCharge } // MCharge

View File

@ -19,7 +19,9 @@ package org.compiere.model;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.util.Properties; import java.util.Properties;
import org.compiere.util.CCache; import org.compiere.util.Env;
import org.idempiere.cache.ImmutableIntPOCache;
import org.idempiere.cache.ImmutablePOSupport;
/** /**
* Chat Type Model * Chat Type Model
@ -27,15 +29,25 @@ import org.compiere.util.CCache;
* @author Jorg Janke * @author Jorg Janke
* @version $Id: MChatType.java,v 1.2 2006/07/30 00:51:03 jjanke Exp $ * @version $Id: MChatType.java,v 1.2 2006/07/30 00:51:03 jjanke Exp $
*/ */
public class MChatType extends X_CM_ChatType public class MChatType extends X_CM_ChatType implements ImmutablePOSupport
{ {
/** /**
* *
*/ */
private static final long serialVersionUID = -7933150405119053730L; private static final long serialVersionUID = 973259852970379643L;
/** /**
* Get MChatType from Cache * Get MChatType from Cache (immutable)
* @param CM_ChatType_ID id
* @return MChatType
*/
public static MChatType get (int CM_ChatType_ID)
{
return get(Env.getCtx(), CM_ChatType_ID);
}
/**
* Get MChatType from Cache (immutable)
* @param ctx context * @param ctx context
* @param CM_ChatType_ID id * @param CM_ChatType_ID id
* @return MChatType * @return MChatType
@ -43,18 +55,21 @@ public class MChatType extends X_CM_ChatType
public static MChatType get (Properties ctx, int CM_ChatType_ID) public static MChatType get (Properties ctx, int CM_ChatType_ID)
{ {
Integer key = Integer.valueOf(CM_ChatType_ID); Integer key = Integer.valueOf(CM_ChatType_ID);
MChatType retValue = (MChatType)s_cache.get (key); MChatType retValue = s_cache.get (ctx, key, e -> new MChatType(ctx, e));
if (retValue != null) if (retValue != null)
return retValue; return retValue;
retValue = new MChatType (ctx, CM_ChatType_ID, null); retValue = new MChatType (ctx, CM_ChatType_ID, (String)null);
if (retValue.get_ID () != CM_ChatType_ID) if (retValue.get_ID () == CM_ChatType_ID)
s_cache.put (key, retValue); {
s_cache.put (key, retValue, e -> new MChatType(Env.getCtx(), e));
return retValue; return retValue;
}
return null;
} // get } // get
/** Cache */ /** Cache */
private static CCache<Integer, MChatType> s_cache private static ImmutableIntPOCache<Integer, MChatType> s_cache
= new CCache<Integer, MChatType> (Table_Name, 20); = new ImmutableIntPOCache<Integer, MChatType> (Table_Name, 20);
/** /**
* Standard Constructor * Standard Constructor
@ -80,4 +95,44 @@ public class MChatType extends X_CM_ChatType
super (ctx, rs, trxName); super (ctx, rs, trxName);
} // MChatType } // MChatType
/**
*
* @param copy
*/
public MChatType(MChatType copy)
{
this(Env.getCtx(), copy);
}
/**
*
* @param ctx
* @param copy
*/
public MChatType(Properties ctx, MChatType copy)
{
this(ctx, copy, (String) null);
}
/**
*
* @param ctx
* @param copy
* @param trxName
*/
public MChatType(Properties ctx, MChatType copy, String trxName)
{
this(ctx, 0, trxName);
copyPO(copy);
}
@Override
public MChatType markImmutable() {
if (is_Immutable())
return this;
makeImmutable();
return this;
}
} // MChatType } // MChatType

View File

@ -22,8 +22,10 @@ import java.text.Collator;
import java.util.Comparator; import java.util.Comparator;
import java.util.Properties; import java.util.Properties;
import org.compiere.util.CCache;
import org.compiere.util.CLogger; import org.compiere.util.CLogger;
import org.compiere.util.Env;
import org.idempiere.cache.ImmutableIntPOCache;
import org.idempiere.cache.ImmutablePOSupport;
/** /**
* Location City Model (Value Object) * Location City Model (Value Object)
@ -31,15 +33,25 @@ import org.compiere.util.CLogger;
* @author Mario Calderon / Carlos Ruiz * @author Mario Calderon / Carlos Ruiz
*/ */
public class MCity extends X_C_City public class MCity extends X_C_City
implements Comparator<Object>, Serializable implements Comparator<Object>, Serializable, ImmutablePOSupport
{ {
/** /**
* *
*/ */
private static final long serialVersionUID = -8905525315954621942L; private static final long serialVersionUID = -3716470269471334172L;
/** /**
* Get City (cached) * Get City (cached) (immutable)
* @param C_City_ID ID
* @return City
*/
public static MCity get (int C_City_ID)
{
return get(Env.getCtx(), C_City_ID);
}
/**
* Get City (cached) (immutable)
* @param ctx context * @param ctx context
* @param C_City_ID ID * @param C_City_ID ID
* @return City * @return City
@ -47,20 +59,20 @@ public class MCity extends X_C_City
public static MCity get (Properties ctx, int C_City_ID) public static MCity get (Properties ctx, int C_City_ID)
{ {
Integer key = Integer.valueOf(C_City_ID); Integer key = Integer.valueOf(C_City_ID);
MCity r = s_Cities.get(key); MCity r = s_Cities.get(ctx, key, e -> new MCity(ctx, e));
if (r != null) if (r != null)
return r; return r;
r = new MCity (ctx, C_City_ID, null); r = new MCity (ctx, C_City_ID, (String)null);
if (r.getC_City_ID() == C_City_ID) if (r.getC_City_ID() == C_City_ID)
{ {
s_Cities.put(key, r); s_Cities.put(key, r, e -> new MCity(Env.getCtx(), e));
return r; return r;
} }
return null; return null;
} // get } // get
/** City Cache */ /** City Cache */
private static CCache<Integer,MCity> s_Cities = new CCache<Integer,MCity>(Table_Name, 20);; private static ImmutableIntPOCache<Integer,MCity> s_Cities = new ImmutableIntPOCache<Integer,MCity>(Table_Name, 20);;
/** Static Logger */ /** Static Logger */
@SuppressWarnings("unused") @SuppressWarnings("unused")
private static CLogger s_log = CLogger.getCLogger (MCity.class); private static CLogger s_log = CLogger.getCLogger (MCity.class);
@ -105,6 +117,36 @@ public class MCity extends X_C_City
setName(cityName); setName(cityName);
} // MCity } // MCity
/**
*
* @param copy
*/
public MCity(MCity copy)
{
this(Env.getCtx(), copy);
}
/**
*
* @param ctx
* @param copy
*/
public MCity(Properties ctx, MCity copy)
{
this(ctx, copy, (String) null);
}
/**
*
* @param ctx
* @param copy
* @param trxName
*/
public MCity(Properties ctx, MCity copy, String trxName)
{
this(ctx, 0, trxName);
copyPO(copy);
}
/** /**
* Return Name * Return Name
* @return Name * @return Name
@ -132,4 +174,13 @@ public class MCity extends X_C_City
return collator.compare(s1, s2); return collator.compare(s1, s2);
} // compare } // compare
@Override
public MCity markImmutable() {
if (is_Immutable())
return this;
makeImmutable();
return this;
}
} // MCity } // MCity

View File

@ -32,12 +32,13 @@ import java.util.logging.Level;
import javax.mail.internet.InternetAddress; import javax.mail.internet.InternetAddress;
import org.compiere.db.CConnection; import org.compiere.db.CConnection;
import org.compiere.util.CCache;
import org.compiere.util.CLogger; import org.compiere.util.CLogger;
import org.compiere.util.DB; import org.compiere.util.DB;
import org.compiere.util.EMail; import org.compiere.util.EMail;
import org.compiere.util.Env; import org.compiere.util.Env;
import org.compiere.util.Language; import org.compiere.util.Language;
import org.idempiere.cache.ImmutableIntPOCache;
import org.idempiere.cache.ImmutablePOSupport;
/** /**
* Client Model * Client Model
@ -51,15 +52,25 @@ import org.compiere.util.Language;
* @author Teo Sarca, SC ARHIPAC SERVICE SRL * @author Teo Sarca, SC ARHIPAC SERVICE SRL
* <li>BF [ 1886480 ] Print Format Item Trl not updated even if not multilingual * <li>BF [ 1886480 ] Print Format Item Trl not updated even if not multilingual
*/ */
public class MClient extends X_AD_Client public class MClient extends X_AD_Client implements ImmutablePOSupport
{ {
/** /**
* *
*/ */
private static final long serialVersionUID = 8418331925351272377L; private static final long serialVersionUID = 1820358079361924020L;
/** /**
* Get client * Get client from cache (immutable)
* @param AD_Client_ID id
* @return client
*/
public static MClient get (int AD_Client_ID)
{
return get(Env.getCtx(), AD_Client_ID);
}
/**
* Get client from cache (immutable)
* @param ctx context * @param ctx context
* @param AD_Client_ID id * @param AD_Client_ID id
* @return client * @return client
@ -67,11 +78,11 @@ public class MClient extends X_AD_Client
public static MClient get (Properties ctx, int AD_Client_ID) public static MClient get (Properties ctx, int AD_Client_ID)
{ {
Integer key = Integer.valueOf(AD_Client_ID); Integer key = Integer.valueOf(AD_Client_ID);
MClient client = (MClient)s_cache.get(key); MClient client = (MClient)s_cache.get(ctx, key, e -> new MClient(ctx, e));
if (client != null) if (client != null)
return client; return client;
client = new MClient (ctx, AD_Client_ID, null); client = new MClient (ctx, AD_Client_ID, (String)null);
s_cache.put (key, client); s_cache.put (key, client, e -> new MClient(Env.getCtx(), e));
return client; return client;
} // get } // get
@ -93,11 +104,11 @@ public class MClient extends X_AD_Client
*/ */
public static MClient[] getAll (Properties ctx, String orderBy) public static MClient[] getAll (Properties ctx, String orderBy)
{ {
List<MClient> list = new Query(ctx,I_AD_Client.Table_Name,null,null) List<MClient> list = new Query(ctx,I_AD_Client.Table_Name,(String)null,(String)null)
.setOrderBy(orderBy) .setOrderBy(orderBy)
.list(); .list();
for(MClient client:list ){ for(MClient client:list ){
s_cache.put (Integer.valueOf(client.getAD_Client_ID()), client); s_cache.put (Integer.valueOf(client.getAD_Client_ID()), client, e -> new MClient(Env.getCtx(), e));
} }
MClient[] retValue = new MClient[list.size ()]; MClient[] retValue = new MClient[list.size ()];
list.toArray (retValue); list.toArray (retValue);
@ -118,7 +129,7 @@ public class MClient extends X_AD_Client
@SuppressWarnings("unused") @SuppressWarnings("unused")
private static CLogger s_log = CLogger.getCLogger (MClient.class); private static CLogger s_log = CLogger.getCLogger (MClient.class);
/** Cache */ /** Cache */
private static CCache<Integer,MClient> s_cache = new CCache<Integer,MClient>(Table_Name, 3, 120, true); private static ImmutableIntPOCache<Integer,MClient> s_cache = new ImmutableIntPOCache<Integer,MClient>(Table_Name, 3, 120, true);
/************************************************************************** /**************************************************************************
@ -185,6 +196,40 @@ public class MClient extends X_AD_Client
this (ctx, Env.getAD_Client_ID(ctx), trxName); this (ctx, Env.getAD_Client_ID(ctx), trxName);
} // MClient } // MClient
/**
*
* @param copy
*/
public MClient(MClient copy)
{
this(Env.getCtx(), copy);
}
/**
*
* @param ctx
* @param copy
*/
public MClient(Properties ctx, MClient copy)
{
this(ctx, copy, (String) null);
}
/**
*
* @param ctx
* @param copy
* @param trxName
*/
public MClient(Properties ctx, MClient copy, String trxName)
{
this(ctx, 0, trxName);
copyPO(copy);
this.m_info = copy.m_info != null ? new MClientInfo(ctx, copy.m_info, trxName) : null;
this.m_AD_Tree_Account_ID = copy.m_AD_Tree_Account_ID;
this.m_fieldAccess = copy.m_fieldAccess != null ? new ArrayList<Integer>(copy.m_fieldAccess) : null;
}
/** Client Info */ /** Client Info */
private MClientInfo m_info = null; private MClientInfo m_info = null;
/** Language */ /** Language */
@ -201,7 +246,12 @@ public class MClient extends X_AD_Client
public MClientInfo getInfo() public MClientInfo getInfo()
{ {
if (m_info == null) if (m_info == null)
{
if (is_Immutable())
m_info = MClientInfo.get (getCtx(), getAD_Client_ID(), get_TrxName()); m_info = MClientInfo.get (getCtx(), getAD_Client_ID(), get_TrxName());
else
m_info = MClientInfo.getCopy(getCtx(), getAD_Client_ID(), get_TrxName());
}
return m_info; return m_info;
} // getMClientInfo } // getMClientInfo
@ -437,7 +487,7 @@ public class MClient extends X_AD_Client
{ {
int C_AcctSchema_ID = m_info.getC_AcctSchema1_ID(); int C_AcctSchema_ID = m_info.getC_AcctSchema1_ID();
if (C_AcctSchema_ID != 0) if (C_AcctSchema_ID != 0)
return MAcctSchema.get(getCtx(), C_AcctSchema_ID); return MAcctSchema.getCopy(getCtx(), C_AcctSchema_ID, get_TrxName());
} }
return null; return null;
} // getMClientInfo } // getMClientInfo
@ -1141,6 +1191,17 @@ public class MClient extends X_AD_Client
return s; return s;
} // getSMTPHost } // getSMTPHost
@Override
public MClient markImmutable() {
if (is_Immutable())
return this;
makeImmutable();
if (m_info != null)
m_info.markImmutable();
return this;
}
// IDEMPIERE-722 // IDEMPIERE-722
private static final String MAIL_SEND_CREDENTIALS_USER = "U"; private static final String MAIL_SEND_CREDENTIALS_USER = "U";
private static final String MAIL_SEND_CREDENTIALS_CLIENT = "C"; private static final String MAIL_SEND_CREDENTIALS_CLIENT = "C";

View File

@ -22,10 +22,11 @@ import java.sql.SQLException;
import java.util.Properties; import java.util.Properties;
import java.util.logging.Level; import java.util.logging.Level;
import org.compiere.util.CCache;
import org.compiere.util.CLogger; import org.compiere.util.CLogger;
import org.compiere.util.DB; import org.compiere.util.DB;
import org.compiere.util.Env; import org.compiere.util.Env;
import org.idempiere.cache.ImmutableIntPOCache;
import org.idempiere.cache.ImmutablePOSupport;
/** /**
* Client Info Model * Client Info Model
@ -33,16 +34,25 @@ import org.compiere.util.Env;
* @author Jorg Janke * @author Jorg Janke
* @version $Id: MClientInfo.java,v 1.2 2006/07/30 00:58:37 jjanke Exp $ * @version $Id: MClientInfo.java,v 1.2 2006/07/30 00:58:37 jjanke Exp $
*/ */
public class MClientInfo extends X_AD_ClientInfo public class MClientInfo extends X_AD_ClientInfo implements ImmutablePOSupport
{ {
/** /**
* *
*/ */
private static final long serialVersionUID = 4861006368856890116L; private static final long serialVersionUID = 4707948832203223893L;
/** /**
* Get Client Info * Get Client Info from cache (immutable)
* @param AD_Client_ID id
* @return Client Info
*/
public static MClientInfo get (int AD_Client_ID)
{
return get(Env.getCtx(), AD_Client_ID);
}
/**
* Get Client Info from cache (immutable)
* @param ctx context * @param ctx context
* @param AD_Client_ID id * @param AD_Client_ID id
* @return Client Info * @return Client Info
@ -53,7 +63,7 @@ public class MClientInfo extends X_AD_ClientInfo
} // get } // get
/** /**
* Get Client Info * Get Client Info from cache (immutable)
* @param ctx context * @param ctx context
* @param AD_Client_ID id * @param AD_Client_ID id
* @param trxName optional trx * @param trxName optional trx
@ -62,7 +72,7 @@ public class MClientInfo extends X_AD_ClientInfo
public static MClientInfo get (Properties ctx, int AD_Client_ID, String trxName) public static MClientInfo get (Properties ctx, int AD_Client_ID, String trxName)
{ {
Integer key = Integer.valueOf(AD_Client_ID); Integer key = Integer.valueOf(AD_Client_ID);
MClientInfo info = (MClientInfo)s_cache.get(key); MClientInfo info = s_cache.get(ctx, key, e -> new MClientInfo(ctx, e));
if (info != null) if (info != null)
return info; return info;
// //
@ -76,9 +86,8 @@ public class MClientInfo extends X_AD_ClientInfo
rs = pstmt.executeQuery (); rs = pstmt.executeQuery ();
if (rs.next ()) if (rs.next ())
{ {
info = new MClientInfo (ctx, rs, null); info = new MClientInfo (ctx, rs, trxName);
if (trxName == null) s_cache.put (key, info, e -> new MClientInfo(Env.getCtx(), e));
s_cache.put (key, info);
} }
} }
catch (SQLException ex) catch (SQLException ex)
@ -95,6 +104,15 @@ public class MClientInfo extends X_AD_ClientInfo
return info; return info;
} // get } // get
/**
* Get optionally cached client
* @return client
*/
public static MClientInfo get ()
{
return get(Env.getCtx());
}
/** /**
* Get optionally cached client * Get optionally cached client
* @param ctx context * @param ctx context
@ -105,8 +123,23 @@ public class MClientInfo extends X_AD_ClientInfo
return get (ctx, Env.getAD_Client_ID(ctx), null); return get (ctx, Env.getAD_Client_ID(ctx), null);
} // get } // get
/**
* Get updateable copy of MClientInfo from cache
* @param ctx
* @param AD_Client_ID
* @param trxName
* @return MClientInfo
*/
public static MClientInfo getCopy(Properties ctx, int AD_Client_ID, String trxName)
{
MClientInfo ci = get(ctx, AD_Client_ID, trxName);
if (ci != null)
ci = new MClientInfo(ctx, ci, trxName);
return ci;
}
/** Cache */ /** Cache */
private static CCache<Integer,MClientInfo> s_cache = new CCache<Integer,MClientInfo>(Table_Name, 2); private static ImmutableIntPOCache<Integer,MClientInfo> s_cache = new ImmutableIntPOCache<Integer,MClientInfo>(Table_Name, 2);
/** Logger */ /** Logger */
private static CLogger s_log = CLogger.getCLogger (MClientInfo.class); private static CLogger s_log = CLogger.getCLogger (MClientInfo.class);
@ -169,6 +202,37 @@ public class MClientInfo extends X_AD_ClientInfo
m_createNew = true; m_createNew = true;
} // MClientInfo } // MClientInfo
/**
*
* @param copy
*/
public MClientInfo(MClientInfo copy)
{
this(Env.getCtx(), copy);
}
/**
*
* @param ctx
* @param copy
*/
public MClientInfo(Properties ctx, MClientInfo copy)
{
this(ctx, copy, (String) null);
}
/**
*
* @param ctx
* @param copy
* @param trxName
*/
public MClientInfo(Properties ctx, MClientInfo copy, String trxName)
{
this(ctx, 0, trxName);
copyPO(copy);
this.m_acctSchema = copy.m_acctSchema != null ? new MAcctSchema(ctx, copy.m_acctSchema, trxName) : null;
}
/** Account Schema */ /** Account Schema */
private MAcctSchema m_acctSchema = null; private MAcctSchema m_acctSchema = null;
@ -182,7 +246,11 @@ public class MClientInfo extends X_AD_ClientInfo
public MAcctSchema getMAcctSchema1() public MAcctSchema getMAcctSchema1()
{ {
if (m_acctSchema == null && getC_AcctSchema1_ID() != 0) if (m_acctSchema == null && getC_AcctSchema1_ID() != 0)
m_acctSchema = new MAcctSchema (getCtx(), getC_AcctSchema1_ID(), null); {
m_acctSchema = new MAcctSchema (getCtx(), getC_AcctSchema1_ID(), get_TrxName());
if (is_Immutable())
m_acctSchema.markImmutable();
}
return m_acctSchema; return m_acctSchema;
} // getMAcctSchema1 } // getMAcctSchema1
@ -214,4 +282,15 @@ public class MClientInfo extends X_AD_ClientInfo
return saveUpdate(); return saveUpdate();
} // save } // save
@Override
public MClientInfo markImmutable() {
if (is_Immutable())
return this;
makeImmutable();
if (m_acctSchema != null)
m_acctSchema.markImmutable();
return this;
}
} // MClientInfo } // MClientInfo

View File

@ -24,6 +24,7 @@ import java.util.logging.Level;
import org.compiere.util.CCache; import org.compiere.util.CCache;
import org.compiere.util.CLogger; import org.compiere.util.CLogger;
import org.compiere.util.DB; import org.compiere.util.DB;
import org.compiere.util.Env;
/** /**
* Client Share Info * Client Share Info
@ -142,6 +143,38 @@ public class MClientShare extends X_AD_ClientShare
super (ctx, rs, trxName); super (ctx, rs, trxName);
} // MClientShare } // MClientShare
/**
*
* @param copy
*/
public MClientShare(MClientShare copy)
{
this(Env.getCtx(), copy);
}
/**
*
* @param ctx
* @param copy
*/
public MClientShare(Properties ctx, MClientShare copy)
{
this(ctx, copy, (String) null);
}
/**
*
* @param ctx
* @param copy
* @param trxName
*/
public MClientShare(Properties ctx, MClientShare copy, String trxName)
{
this(ctx, 0, trxName);
copyPO(copy);
this.m_table = copy.m_table != null ? new MTable(ctx, copy.m_table, trxName) : null;
}
/** The Table */ /** The Table */
private MTable m_table = null; private MTable m_table = null;
@ -170,7 +203,7 @@ public class MClientShare extends X_AD_ClientShare
public MTable getTable() public MTable getTable()
{ {
if (m_table == null) if (m_table == null)
m_table = MTable.get(getCtx(), getAD_Table_ID()); m_table = MTable.getCopy(getCtx(), getAD_Table_ID(), get_TrxName());
return m_table; return m_table;
} // getTable } // getTable

View File

@ -23,8 +23,9 @@ import java.sql.ResultSet;
import java.util.Properties; import java.util.Properties;
import org.compiere.print.MPrintColor; import org.compiere.print.MPrintColor;
import org.compiere.util.CCache;
import org.compiere.util.Env; import org.compiere.util.Env;
import org.idempiere.cache.ImmutableIntPOCache;
import org.idempiere.cache.ImmutablePOSupport;
/** /**
* Performance Color Schema * Performance Color Schema
@ -32,12 +33,12 @@ import org.compiere.util.Env;
* @author Jorg Janke * @author Jorg Janke
* @version $Id: MColorSchema.java,v 1.2 2006/07/30 00:51:02 jjanke Exp $ * @version $Id: MColorSchema.java,v 1.2 2006/07/30 00:51:02 jjanke Exp $
*/ */
public class MColorSchema extends X_PA_ColorSchema public class MColorSchema extends X_PA_ColorSchema implements ImmutablePOSupport
{ {
/** /**
* *
*/ */
private static final long serialVersionUID = 4645092884363283719L; private static final long serialVersionUID = -3730457542399382168L;
/** /**
* Get Color * Get Color
@ -74,6 +75,15 @@ public class MColorSchema extends X_PA_ColorSchema
return cs.getColor(percent); return cs.getColor(percent);
} // getColor } // getColor
/**
* Get MColorSchema from Cache
* @param PA_ColorSchema_ID id
* @return MColorSchema
*/
public static MColorSchema get (int PA_ColorSchema_ID)
{
return get(Env.getCtx(), PA_ColorSchema_ID);
}
/** /**
* Get MColorSchema from Cache * Get MColorSchema from Cache
@ -90,18 +100,36 @@ public class MColorSchema extends X_PA_ColorSchema
return retValue; return retValue;
} }
Integer key = Integer.valueOf(PA_ColorSchema_ID); Integer key = Integer.valueOf(PA_ColorSchema_ID);
MColorSchema retValue = (MColorSchema)s_cache.get (key); MColorSchema retValue = s_cache.get (ctx, key, e -> new MColorSchema(ctx, e));
if (retValue != null) if (retValue != null)
return retValue; return retValue;
retValue = new MColorSchema (ctx, PA_ColorSchema_ID, null); retValue = new MColorSchema (ctx, PA_ColorSchema_ID, (String)null);
if (retValue.get_ID() != 0) if (retValue.get_ID() == PA_ColorSchema_ID)
s_cache.put (key, retValue); {
s_cache.put (key, retValue, e -> new MColorSchema(Env.getCtx(), e));
return retValue; return retValue;
}
return null;
} // get } // get
/**
* Get updateable copy of MColorSchema from cache
* @param ctx
* @param PA_ColorSchema_ID
* @param trxName
* @return MColorSchema
*/
public static MColorSchema getCopy(Properties ctx, int PA_ColorSchema_ID, String trxName)
{
MColorSchema cs = get(PA_ColorSchema_ID);
if (cs != null)
cs = new MColorSchema(ctx, cs, trxName);
return cs;
}
/** Cache */ /** Cache */
private static CCache<Integer, MColorSchema> s_cache private static ImmutableIntPOCache<Integer, MColorSchema> s_cache
= new CCache<Integer, MColorSchema> (Table_Name, 20); = new ImmutableIntPOCache<Integer, MColorSchema> (Table_Name, 20);
/** /**
* Standard Constructor * Standard Constructor
@ -133,6 +161,37 @@ public class MColorSchema extends X_PA_ColorSchema
super (ctx, rs, trxName); super (ctx, rs, trxName);
} // MColorSchema } // MColorSchema
/**
*
* @param copy
*/
public MColorSchema(MColorSchema copy)
{
this(Env.getCtx(), copy);
}
/**
*
* @param ctx
* @param copy
*/
public MColorSchema(Properties ctx, MColorSchema copy)
{
this(ctx, copy, (String) null);
}
/**
*
* @param ctx
* @param copy
* @param trxName
*/
public MColorSchema(Properties ctx, MColorSchema copy, String trxName)
{
this(ctx, 0, trxName);
copyPO(copy);
}
/** /**
* Set Default. * Set Default.
* Red (50) - Yellow (100) - Green * Red (50) - Yellow (100) - Green
@ -210,4 +269,13 @@ public class MColorSchema extends X_PA_ColorSchema
return sb.toString (); return sb.toString ();
} // toString } // toString
@Override
public MColorSchema markImmutable() {
if (is_Immutable())
return this;
makeImmutable();
return this;
}
} // MColorSchema } // MColorSchema

View File

@ -34,13 +34,14 @@ import java.util.logging.Level;
import org.adempiere.exceptions.DBException; import org.adempiere.exceptions.DBException;
import org.compiere.db.AdempiereDatabase; import org.compiere.db.AdempiereDatabase;
import org.compiere.db.Database; import org.compiere.db.Database;
import org.compiere.util.CCache;
import org.compiere.util.CLogger; import org.compiere.util.CLogger;
import org.compiere.util.DB; import org.compiere.util.DB;
import org.compiere.util.DisplayType; import org.compiere.util.DisplayType;
import org.compiere.util.Env; import org.compiere.util.Env;
import org.compiere.util.Msg; import org.compiere.util.Msg;
import org.compiere.util.Util; import org.compiere.util.Util;
import org.idempiere.cache.ImmutableIntPOCache;
import org.idempiere.cache.ImmutablePOSupport;
/** /**
* Persistent Column Model * Persistent Column Model
@ -48,20 +49,36 @@ import org.compiere.util.Util;
* @author Jorg Janke * @author Jorg Janke
* @version $Id: MColumn.java,v 1.6 2006/08/09 05:23:49 jjanke Exp $ * @version $Id: MColumn.java,v 1.6 2006/08/09 05:23:49 jjanke Exp $
*/ */
public class MColumn extends X_AD_Column public class MColumn extends X_AD_Column implements ImmutablePOSupport
{ {
/** /**
* *
*/ */
private static final long serialVersionUID = 5934334786732835926L; private static final long serialVersionUID = -1841918268550762201L;
/**
* Get MColumn from Cache (immutable)
* @param AD_Column_ID id
* @return MColumn
*/
public static MColumn get (int AD_Column_ID)
{
return get(Env.getCtx(), AD_Column_ID);
}
/**
* Get MColumn from Cache (immutable)
* @param ctx context
* @param AD_Column_ID id
* @return MColumn
*/
public static MColumn get (Properties ctx, int AD_Column_ID) public static MColumn get (Properties ctx, int AD_Column_ID)
{ {
return get(ctx, AD_Column_ID, null); return get(ctx, AD_Column_ID, null);
} }
/** /**
* Get MColumn from Cache * Get MColumn from Cache (immutable)
* @param ctx context * @param ctx context
* @param AD_Column_ID id * @param AD_Column_ID id
* @param trxName trx * @param trxName trx
@ -70,17 +87,34 @@ public class MColumn extends X_AD_Column
public static MColumn get(Properties ctx, int AD_Column_ID, String trxName) public static MColumn get(Properties ctx, int AD_Column_ID, String trxName)
{ {
Integer key = Integer.valueOf(AD_Column_ID); Integer key = Integer.valueOf(AD_Column_ID);
MColumn retValue = (MColumn) s_cache.get (key); MColumn retValue = (MColumn) s_cache.get (ctx, key, e -> new MColumn(ctx, e));
if (retValue != null) { if (retValue != null)
retValue.set_TrxName(trxName); return retValue;
retValue = new MColumn (ctx, AD_Column_ID, trxName);
if (retValue.get_ID () == AD_Column_ID)
{
s_cache.put (key, retValue, e -> new MColumn(Env.getCtx(), e));
return retValue; return retValue;
} }
retValue = new MColumn (ctx, AD_Column_ID, trxName); return null;
if (retValue.get_ID () != 0)
s_cache.put (key, retValue);
return retValue;
} // get } // get
/**
* Get updateable copy of MColumn from cache
* @param ctx
* @param AD_Column_ID
* @param trxName
* @return MColumn
*/
public static MColumn getCopy(Properties ctx, int AD_Column_ID, String trxName)
{
MColumn column = get(ctx, AD_Column_ID, trxName);
if (column != null)
column = new MColumn(ctx, column, trxName);
return column;
}
/** /**
* Get MColumn given TableName and ColumnName * Get MColumn given TableName and ColumnName
* @param ctx context * @param ctx context
@ -115,7 +149,7 @@ public class MColumn extends X_AD_Column
} // getColumnName } // getColumnName
/** Cache */ /** Cache */
private static CCache<Integer,MColumn> s_cache = new CCache<Integer,MColumn>(Table_Name, 20); private static ImmutableIntPOCache<Integer,MColumn> s_cache = new ImmutableIntPOCache<Integer,MColumn>(Table_Name, 20);
/** Static Logger */ /** Static Logger */
private static CLogger s_log = CLogger.getCLogger (MColumn.class); private static CLogger s_log = CLogger.getCLogger (MColumn.class);
@ -172,7 +206,36 @@ public class MColumn extends X_AD_Column
setEntityType(parent.getEntityType()); setEntityType(parent.getEntityType());
} // MColumn } // MColumn
/**
*
* @param copy
*/
public MColumn(MColumn copy)
{
this(Env.getCtx(), copy);
}
/**
*
* @param ctx
* @param copy
*/
public MColumn(Properties ctx, MColumn copy)
{
this(ctx, copy, (String) null);
}
/**
*
* @param ctx
* @param copy
* @param trxName
*/
public MColumn(Properties ctx, MColumn copy, String trxName)
{
this(ctx, 0, trxName);
copyPO(copy);
}
/** /**
* Is Standard Column * Is Standard Column
* @return true for AD_Client_ID, etc. * @return true for AD_Client_ID, etc.
@ -867,7 +930,7 @@ public class MColumn extends X_AD_Column
@Override @Override
public I_AD_Table getAD_Table() throws RuntimeException { public I_AD_Table getAD_Table() throws RuntimeException {
MTable table = MTable.get(getCtx(), getAD_Table_ID(), get_TrxName()); MTable table = MTable.getCopy(getCtx(), getAD_Table_ID(), get_TrxName());
return table; return table;
} }
@ -1195,4 +1258,13 @@ public class MColumn extends X_AD_Column
return rvalue + " - " + sql; return rvalue + " - " + sql;
} }
@Override
public MColumn markImmutable() {
if (is_Immutable())
return this;
makeImmutable();
return this;
}
} // MColumn } // MColumn

View File

@ -112,6 +112,37 @@ public class MContactInterest extends X_R_ContactInterest
super(ctx, rs, trxName); super(ctx, rs, trxName);
} // MContactInterest } // MContactInterest
/**
*
* @param copy
*/
public MContactInterest(MContactInterest copy)
{
this(Env.getCtx(), copy);
}
/**
*
* @param ctx
* @param copy
*/
public MContactInterest(Properties ctx, MContactInterest copy)
{
this(ctx, copy, (String) null);
}
/**
*
* @param ctx
* @param copy
* @param trxName
*/
public MContactInterest(Properties ctx, MContactInterest copy, String trxName)
{
this(ctx, 0, trxName);
copyPO(copy);
}
/** Static Logger */ /** Static Logger */
private static CLogger s_log = CLogger.getCLogger (MContactInterest.class); private static CLogger s_log = CLogger.getCLogger (MContactInterest.class);

View File

@ -21,6 +21,7 @@ import java.util.Properties;
import org.compiere.util.CCache; import org.compiere.util.CCache;
import org.compiere.util.DB; import org.compiere.util.DB;
import org.compiere.util.Env;
/** /**
* Currency Conversion Type Model * Currency Conversion Type Model
@ -95,4 +96,34 @@ public class MConversionType extends X_C_ConversionType
super(ctx, rs, trxName); super(ctx, rs, trxName);
} // MConversionType } // MConversionType
/**
*
* @param copy
*/
public MConversionType(MConversionType copy)
{
this(Env.getCtx(), copy);
}
/**
*
* @param ctx
* @param copy
*/
public MConversionType(Properties ctx, MConversionType copy)
{
this(ctx, copy, (String) null);
}
/**
*
* @param ctx
* @param copy
* @param trxName
*/
public MConversionType(Properties ctx, MConversionType copy, String trxName)
{
this(ctx, 0, trxName);
copyPO(copy);
}
} // MConversionType } // MConversionType

View File

@ -1639,7 +1639,7 @@ public class MCost extends X_M_Cost
int M_CostElement_ID = getM_CostElement_ID(); int M_CostElement_ID = getM_CostElement_ID();
if (M_CostElement_ID == 0) if (M_CostElement_ID == 0)
return null; return null;
return MCostElement.get(getCtx(), M_CostElement_ID); return MCostElement.getCopy(getCtx(), M_CostElement_ID, get_TrxName());
} // getCostElement } // getCostElement
/** /**

View File

@ -21,11 +21,12 @@ import java.util.List;
import java.util.Properties; import java.util.Properties;
import java.util.logging.Level; import java.util.logging.Level;
import org.compiere.util.CCache;
import org.compiere.util.CLogger; import org.compiere.util.CLogger;
import org.compiere.util.DB; import org.compiere.util.DB;
import org.compiere.util.Env; import org.compiere.util.Env;
import org.compiere.util.Msg; import org.compiere.util.Msg;
import org.idempiere.cache.ImmutableIntPOCache;
import org.idempiere.cache.ImmutablePOSupport;
/** /**
* Cost Element Model * Cost Element Model
@ -38,14 +39,12 @@ import org.compiere.util.Msg;
* @author red1 * @author red1
* <li>FR: [ 2214883 ] Remove SQL code and Replace for Query -- JUnit tested * <li>FR: [ 2214883 ] Remove SQL code and Replace for Query -- JUnit tested
*/ */
public class MCostElement extends X_M_CostElement public class MCostElement extends X_M_CostElement implements ImmutablePOSupport
{ {
/** /**
* *
*/ */
private static final long serialVersionUID = 3423495977508725440L; private static final long serialVersionUID = 4914952212171251715L;
/** /**
* Get Material Cost Element or create it * Get Material Cost Element or create it
@ -179,7 +178,17 @@ public class MCostElement extends X_M_CostElement
// end MZ // end MZ
/** /**
* Get Cost Element from Cache * Get Cost Element from Cache (immutable)
* @param M_CostElement_ID id
* @return Cost Element
*/
public static MCostElement get (int M_CostElement_ID)
{
return get(Env.getCtx(), M_CostElement_ID);
}
/**
* Get Cost Element from Cache (immutable)
* @param ctx context * @param ctx context
* @param M_CostElement_ID id * @param M_CostElement_ID id
* @return Cost Element * @return Cost Element
@ -187,15 +196,32 @@ public class MCostElement extends X_M_CostElement
public static MCostElement get (Properties ctx, int M_CostElement_ID) public static MCostElement get (Properties ctx, int M_CostElement_ID)
{ {
Integer key = Integer.valueOf(M_CostElement_ID); Integer key = Integer.valueOf(M_CostElement_ID);
MCostElement retValue = (MCostElement) s_cache.get (key); MCostElement retValue = s_cache.get (ctx, key, e -> new MCostElement(ctx, e));
if (retValue != null) if (retValue != null)
return retValue; return retValue;
retValue = new MCostElement (ctx, M_CostElement_ID, null); retValue = new MCostElement (ctx, M_CostElement_ID, (String)null);
if (retValue.get_ID () != 0) if (retValue.get_ID () == M_CostElement_ID)
s_cache.put (key, retValue); {
s_cache.put (key, retValue, e -> new MCostElement(Env.getCtx(), e));
return retValue; return retValue;
}
return null;
} // get } // get
/**
* Get updateable copy of MCostElement from cache
* @param ctx
* @param M_CostElement_ID
* @param trxName
* @return MCostElement
*/
public static MCostElement getCopy(Properties ctx, int M_CostElement_ID, String trxName)
{
MCostElement ce = get(M_CostElement_ID);
if (ce != null)
ce = new MCostElement(ctx, ce, trxName);
return ce;
}
/** /**
* Get All Cost Elements for current AD_Client_ID * Get All Cost Elements for current AD_Client_ID
@ -232,7 +258,7 @@ public class MCostElement extends X_M_CostElement
} }
/** Cache */ /** Cache */
protected static CCache<Integer,MCostElement> s_cache = new CCache<Integer,MCostElement>(Table_Name, 20); protected static ImmutableIntPOCache<Integer,MCostElement> s_cache = new ImmutableIntPOCache<Integer,MCostElement>(Table_Name, 20);
/** Logger */ /** Logger */
private static CLogger s_log = CLogger.getCLogger (MCostElement.class); private static CLogger s_log = CLogger.getCLogger (MCostElement.class);
@ -266,6 +292,37 @@ public class MCostElement extends X_M_CostElement
super (ctx, rs, trxName); super (ctx, rs, trxName);
} // MCostElement } // MCostElement
/**
*
* @param copy
*/
public MCostElement(MCostElement copy)
{
this(Env.getCtx(), copy);
}
/**
*
* @param ctx
* @param copy
*/
public MCostElement(Properties ctx, MCostElement copy)
{
this(ctx, copy, (String) null);
}
/**
*
* @param ctx
* @param copy
* @param trxName
*/
public MCostElement(Properties ctx, MCostElement copy, String trxName)
{
this(ctx, 0, trxName);
copyPO(copy);
}
/** /**
* Before Save * Before Save
* @param newRecord new * @param newRecord new
@ -472,4 +529,13 @@ public class MCostElement extends X_M_CostElement
return sb.toString (); return sb.toString ();
} // toString } // toString
@Override
public MCostElement markImmutable() {
if (is_Immutable())
return this;
makeImmutable();
return this;
}
} // MCostElement } // MCostElement

View File

@ -23,15 +23,18 @@ import java.sql.ResultSet;
import java.text.Collator; import java.text.Collator;
import java.util.Arrays; import java.util.Arrays;
import java.util.Comparator; import java.util.Comparator;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.Map.Entry; import java.util.Map.Entry;
import java.util.Properties; import java.util.Properties;
import java.util.logging.Level; import java.util.logging.Level;
import org.compiere.util.CCache;
import org.compiere.util.CLogger; import org.compiere.util.CLogger;
import org.compiere.util.Env; import org.compiere.util.Env;
import org.compiere.util.Language; import org.compiere.util.Language;
import org.idempiere.cache.ImmutableIntPOCache;
import org.idempiere.cache.ImmutablePOSupport;
/** /**
* Location Country Model (Value Object) * Location Country Model (Value Object)
@ -43,29 +46,39 @@ import org.compiere.util.Language;
* <li>BF [ 2695078 ] Country is not translated on invoice * <li>BF [ 2695078 ] Country is not translated on invoice
*/ */
public class MCountry extends X_C_Country public class MCountry extends X_C_Country
implements Comparator<Object>, Serializable implements Comparator<Object>, Serializable, ImmutablePOSupport
{ {
/** /**
* *
*/ */
private static final long serialVersionUID = -4966707939803861163L; private static final long serialVersionUID = 6102749517340832365L;
/** /**
* Get Country (cached) * Get Country (cached) (immutable)
* @param C_Country_ID ID
* @return Country
*/
public static MCountry get (int C_Country_ID)
{
return get(Env.getCtx(), C_Country_ID);
}
/**
* Get Country (Immutable, cached)
* @param ctx context * @param ctx context
* @param C_Country_ID ID * @param C_Country_ID ID
* @return Country * @return Country
*/ */
public static MCountry get (Properties ctx, int C_Country_ID) public static MCountry get (Properties ctx, int C_Country_ID)
{ {
loadAllCountriesIfNeeded(ctx); loadAllCountriesIfNeeded();
MCountry c = s_countries.get(C_Country_ID); MCountry c = s_countries.get(ctx, C_Country_ID, e -> new MCountry(ctx, e));
if (c != null) if (c != null)
return c; return c;
c = new MCountry (ctx, C_Country_ID, null); c = new MCountry (ctx, C_Country_ID, (String)null);
if (c.getC_Country_ID() == C_Country_ID) if (c.getC_Country_ID() == C_Country_ID)
{ {
s_countries.put(C_Country_ID, c); s_countries.put(C_Country_ID, c, e -> new MCountry(Env.getCtx(), e));
return c; return c;
} }
return null; return null;
@ -73,54 +86,72 @@ public class MCountry extends X_C_Country
/** /**
* Get Default Country * Get Default Country
* @param ctx context * @param ctx ignore
* @return Country * @return Country
* @deprecated
*/ */
public static MCountry getDefault (Properties ctx) public static MCountry getDefault (Properties ctx)
{ {
int clientID = Env.getAD_Client_ID(ctx); return getDefault();
}
/**
* Get Default Country (immutable)
* @return Country
*/
public static MCountry getDefault ()
{
int clientID = Env.getAD_Client_ID(Env.getCtx());
MCountry c = s_default.get(clientID); MCountry c = s_default.get(clientID);
if (c != null) if (c != null)
return c; return c;
loadDefaultCountry(ctx); loadDefaultCountry();
c = s_default.get(clientID); c = s_default.get(clientID);
return c; return c;
} // get } // get
/** /**
* Return Countries as Array * Return Countries as Array
* @param ctx context * @param ctx ignore
* @return MCountry Array * @return MCountry Array
* @deprecated
*/ */
public static MCountry[] getCountries(Properties ctx) public static MCountry[] getCountries(Properties ctx)
{ {
loadAllCountriesIfNeeded(ctx); return getCountries();
MCountry[] retValue = new MCountry[s_countries.size()]; }
s_countries.values().toArray(retValue);
Arrays.sort(retValue, new MCountry(ctx, 0, null)); /**
* Return Countries as Array
* @return MCountry Array
*/
public static MCountry[] getCountries()
{
loadAllCountriesIfNeeded();
MCountry[] retValue = s_countries.values().toArray(new MCountry[0]);
Arrays.sort(retValue, new MCountry(Env.getCtx(), 0, null));
return retValue; return retValue;
} // getCountries } // getCountries
private static synchronized void loadAllCountriesIfNeeded(Properties ctx) { private static synchronized void loadAllCountriesIfNeeded() {
if (s_countries == null || s_countries.isEmpty()) { if (s_countries == null || s_countries.isEmpty()) {
loadAllCountries(ctx); loadAllCountries();
} }
} }
/** /**
* Load Countries. * Load Countries.
* Set Default Language to Client Language * Set Default Language to Client Language
* @param ctx context
*/ */
private static synchronized void loadAllCountries (Properties ctx) private static synchronized void loadAllCountries ()
{ {
MClient client = MClient.get (ctx); MClient client = MClient.get (Env.getCtx());
MLanguage lang = MLanguage.get(ctx, client.getAD_Language()); MLanguage lang = MLanguage.get(Env.getCtx(), client.getAD_Language());
// //
if (s_countries == null) if (s_countries == null)
s_countries = new CCache<Integer,MCountry>(Table_Name, 250); s_countries = new ImmutableIntPOCache<Integer,MCountry>(Table_Name, 250);
List<MCountry> countries = new Query(ctx, Table_Name, "", null) List<MCountry> countries = new Query(Env.getCtx(), Table_Name, "", null)
.setOnlyActiveRecords(true) .setOnlyActiveRecords(true)
.list(); .list();
for (MCountry c : countries) { for (MCountry c : countries) {
@ -135,19 +166,20 @@ public class MCountry extends X_C_Country
/** /**
* Load Default Country for actual client on context * Load Default Country for actual client on context
* @param ctx
*/ */
private static void loadDefaultCountry(Properties ctx) { private static void loadDefaultCountry() {
loadAllCountriesIfNeeded(ctx); loadAllCountriesIfNeeded();
MClient client = MClient.get (ctx); MClient client = MClient.get (Env.getCtx());
MCountry found = s_default.get(client.getAD_Client_ID()); MCountry found = s_default.get(client.getAD_Client_ID());
if (found != null) if (found != null)
return; return;
MLanguage lang = MLanguage.get(ctx, client.getAD_Language()); MLanguage lang = MLanguage.get(Env.getCtx(), client.getAD_Language());
MCountry usa = null; MCountry usa = null;
for (Entry<Integer, MCountry> cachedEntry : s_countries.entrySet()) { //create local instance to avoid concurrent modification exception
Map<Integer, MCountry> countries = new HashMap<Integer, MCountry>(s_countries);
for (Entry<Integer, MCountry> cachedEntry : countries.entrySet()) {
MCountry c = cachedEntry.getValue(); MCountry c = cachedEntry.getValue();
// Country code of Client Language // Country code of Client Language
if (lang != null && lang.getCountryCode().equals(c.getCountryCode())) { if (lang != null && lang.getCountryCode().equals(c.getCountryCode())) {
@ -161,7 +193,7 @@ public class MCountry extends X_C_Country
s_default.put(client.getAD_Client_ID(), found); s_default.put(client.getAD_Client_ID(), found);
else else
s_default.put(client.getAD_Client_ID(), usa); s_default.put(client.getAD_Client_ID(), usa);
if (s_log.isLoggable(Level.FINE)) s_log.fine("#" + s_countries.size() if (s_log.isLoggable(Level.FINE)) s_log.fine("#" + countries.size()
+ " - Default=" + s_default); + " - Default=" + s_default);
} }
@ -182,9 +214,9 @@ public class MCountry extends X_C_Country
private static String s_AD_Language = null; private static String s_AD_Language = null;
/** Country Cache */ /** Country Cache */
private static CCache<Integer,MCountry> s_countries = null; private static ImmutableIntPOCache<Integer,MCountry> s_countries = null;
/** Default Country */ /** Default Country */
private static CCache<Integer,MCountry> s_default = new CCache<Integer,MCountry>(Table_Name, Table_Name+"|Default", 3); private static ImmutableIntPOCache<Integer,MCountry> s_default = new ImmutableIntPOCache<Integer,MCountry>(Table_Name, Table_Name+"|Default", 3);
/** Static Logger */ /** Static Logger */
private static CLogger s_log = CLogger.getCLogger (MCountry.class); private static CLogger s_log = CLogger.getCLogger (MCountry.class);
// Default DisplaySequence */ // Default DisplaySequence */
@ -223,6 +255,37 @@ public class MCountry extends X_C_Country
super(ctx, rs, trxName); super(ctx, rs, trxName);
} // MCountry } // MCountry
/**
*
* @param copy
*/
public MCountry(MCountry copy)
{
this(Env.getCtx(), copy);
}
/**
*
* @param ctx
* @param copy
*/
public MCountry(Properties ctx, MCountry copy)
{
this(ctx, copy, (String) null);
}
/**
*
* @param ctx
* @param copy
* @param trxName
*/
public MCountry(Properties ctx, MCountry copy, String trxName)
{
this(ctx, 0, trxName);
copyPO(copy);
}
/** /**
* Return Name - translated if DisplayLanguage is set. * Return Name - translated if DisplayLanguage is set.
* @return Name * @return Name
@ -306,7 +369,7 @@ public class MCountry extends X_C_Country
|| getC_Country_ID() == 0 || getC_Country_ID() == 0
|| !isHasRegion()) || !isHasRegion())
return false; return false;
MRegion[] regions = MRegion.getRegions(getCtx(), getC_Country_ID()); MRegion[] regions = MRegion.getRegions(getC_Country_ID());
for (int i = 0; i < regions.length; i++) for (int i = 0; i < regions.length; i++)
{ {
if (C_Region_ID == regions[i].getC_Region_ID()) if (C_Region_ID == regions[i].getC_Region_ID())
@ -315,6 +378,15 @@ public class MCountry extends X_C_Country
return false; return false;
} // isValidRegion } // isValidRegion
@Override
public MCountry markImmutable() {
if (is_Immutable())
return this;
makeImmutable();
return this;
}
/************************************************************************** /**************************************************************************
* Insert Countries * Insert Countries
* @param args none * @param args none

View File

@ -27,42 +27,54 @@ package org.compiere.model;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.util.Properties; import java.util.Properties;
import org.compiere.util.CCache;
import org.compiere.util.CLogger; import org.compiere.util.CLogger;
import org.compiere.util.DB; import org.compiere.util.DB;
import org.compiere.util.Env;
import org.idempiere.cache.ImmutableIntPOCache;
import org.idempiere.cache.ImmutablePOSupport;
/** /**
* Country Group Model * Country Group Model
*/ */
public class MCountryGroup extends X_C_CountryGroup public class MCountryGroup extends X_C_CountryGroup implements ImmutablePOSupport
{ {
/** /**
* *
*/ */
private static final long serialVersionUID = 4986629677773273899L; private static final long serialVersionUID = 8489673276196368210L;
/** /**
* Get Country Group (cached) * Get Country Group (cached) (immutable)
* @param C_CountryGroup_ID ID
* @return Country Group
*/
public static MCountryGroup get (int C_CountryGroup_ID)
{
return get(Env.getCtx(), C_CountryGroup_ID);
}
/**
* Get Country Group (cached) (immutable)
* @param ctx context * @param ctx context
* @param C_CountryGroup_ID ID * @param C_CountryGroup_ID ID
* @return Country Group * @return Country Group
*/ */
public static MCountryGroup get (Properties ctx, int C_CountryGroup_ID) public static MCountryGroup get (Properties ctx, int C_CountryGroup_ID)
{ {
MCountryGroup c = s_cache.get(C_CountryGroup_ID); MCountryGroup c = s_cache.get(ctx, C_CountryGroup_ID, e -> new MCountryGroup(ctx, e));
if (c != null) if (c != null)
return c; return c;
c = new MCountryGroup (ctx, C_CountryGroup_ID, null); c = new MCountryGroup (ctx, C_CountryGroup_ID, (String)null);
if (c.getC_CountryGroup_ID() == C_CountryGroup_ID) if (c.getC_CountryGroup_ID() == C_CountryGroup_ID)
{ {
s_cache.put(C_CountryGroup_ID, c); s_cache.put(C_CountryGroup_ID, c, e -> new MCountryGroup(Env.getCtx(), e));
return c; return c;
} }
return null; return null;
} // get } // get
/** Cache */ /** Cache */
private static CCache<Integer,MCountryGroup> s_cache = new CCache<Integer,MCountryGroup>(Table_Name, 5); private static ImmutableIntPOCache<Integer,MCountryGroup> s_cache = new ImmutableIntPOCache<Integer,MCountryGroup>(Table_Name, 5);
/** Static Logger */ /** Static Logger */
@SuppressWarnings("unused") @SuppressWarnings("unused")
private static CLogger s_log = CLogger.getCLogger (MCountryGroup.class); private static CLogger s_log = CLogger.getCLogger (MCountryGroup.class);
@ -89,6 +101,46 @@ public class MCountryGroup extends X_C_CountryGroup
super(ctx, rs, trxName); super(ctx, rs, trxName);
} // MCountryGroup } // MCountryGroup
/**
*
* @param copy
*/
public MCountryGroup(MCountryGroup copy)
{
this(Env.getCtx(), copy);
}
/**
*
* @param ctx
* @param copy
*/
public MCountryGroup(Properties ctx, MCountryGroup copy)
{
this(ctx, copy, (String) null);
}
/**
*
* @param ctx
* @param copy
* @param trxName
*/
public MCountryGroup(Properties ctx, MCountryGroup copy, String trxName)
{
this(ctx, 0, trxName);
copyPO(copy);
}
@Override
public MCountryGroup markImmutable() {
if (is_Immutable())
return this;
makeImmutable();
return this;
}
public static boolean countryGroupContains(int c_CountryGroup_ID, int c_Country_ID) { public static boolean countryGroupContains(int c_CountryGroup_ID, int c_Country_ID) {
if (c_CountryGroup_ID == 0 || c_Country_ID == 0) if (c_CountryGroup_ID == 0 || c_Country_ID == 0)

View File

@ -29,26 +29,26 @@ import java.sql.ResultSet;
import java.util.Properties; import java.util.Properties;
import java.util.logging.Level; import java.util.logging.Level;
import org.compiere.util.CCache;
import org.compiere.util.CLogger; import org.compiere.util.CLogger;
import org.compiere.util.DB; import org.compiere.util.DB;
import org.compiere.util.Env; import org.compiere.util.Env;
import org.idempiere.cache.ImmutablePOSupport;
import org.idempiere.cache.ImmutablePOCache;
/** /**
* Context Help Message Model * Context Help Message Model
* *
* @author Carlos Ruiz * @author Carlos Ruiz
*/ */
public class MCtxHelpMsg extends X_AD_CtxHelpMsg { public class MCtxHelpMsg extends X_AD_CtxHelpMsg implements ImmutablePOSupport {
/** /**
* *
*/ */
private static final long serialVersionUID = -7208965344525556184L; private static final long serialVersionUID = 3148838750037103261L;
/** Logging */ /** Logging */
private static CLogger s_log = CLogger.getCLogger(MCtxHelpMsg.class); private static CLogger s_log = CLogger.getCLogger(MCtxHelpMsg.class);
/** Context Help Message Cache */ /** Context Help Message Cache */
private static CCache<String, MCtxHelpMsg> s_cache = new CCache<String, MCtxHelpMsg>(Table_Name, 10); private static ImmutablePOCache<String, MCtxHelpMsg> s_cache = new ImmutablePOCache<String, MCtxHelpMsg>(Table_Name, 10);
/** /**
* Standard Constructor * Standard Constructor
@ -71,12 +71,49 @@ public class MCtxHelpMsg extends X_AD_CtxHelpMsg {
} // MCtxHelpMsg } // MCtxHelpMsg
/** /**
* Get the context help message defined for the type, recordid, client, org *
* @param copy
*/
public MCtxHelpMsg(MCtxHelpMsg copy) {
this(Env.getCtx(), copy);
}
/**
*
* @param ctx * @param ctx
* @param copy
*/
public MCtxHelpMsg(Properties ctx, MCtxHelpMsg copy) {
this(ctx, copy, (String) null);
}
/**
*
* @param ctx
* @param copy
* @param trxName
*/
public MCtxHelpMsg(Properties ctx, MCtxHelpMsg copy, String trxName) {
this(ctx, 0, trxName);
copyPO(copy);
}
/**
* Get the context help message defined for the type, recordid, client, org (immutable)
* @param ctxtype * @param ctxtype
* @param recordId * @param recordId
* @return the context message record * @return the context message record
*/ */
public static MCtxHelpMsg get(String ctxType, int recordId) {
return get(Env.getCtx(), ctxType, recordId);
}
/**
* Get the context help message defined for the type, recordid, client, org (immutable)
* @param ctxtype
* @param recordId
* @return an immutable instance of context message record (if any)
*/
public static MCtxHelpMsg get(Properties ctx, String ctxType, int recordId) { public static MCtxHelpMsg get(Properties ctx, String ctxType, int recordId) {
StringBuilder key = new StringBuilder() StringBuilder key = new StringBuilder()
.append(ctxType).append("|") .append(ctxType).append("|")
@ -85,7 +122,7 @@ public class MCtxHelpMsg extends X_AD_CtxHelpMsg {
.append(Env.getAD_Org_ID(ctx)); .append(Env.getAD_Org_ID(ctx));
MCtxHelpMsg retValue = null; MCtxHelpMsg retValue = null;
if (s_cache.containsKey(key.toString())) { if (s_cache.containsKey(key.toString())) {
retValue = s_cache.get(key.toString()); retValue = s_cache.get(ctx, key.toString(), e -> new MCtxHelpMsg(ctx, e));
if (s_log.isLoggable(Level.FINEST)) s_log.finest("Cache: " + retValue); if (s_log.isLoggable(Level.FINEST)) s_log.finest("Cache: " + retValue);
return retValue; return retValue;
} }
@ -97,7 +134,7 @@ public class MCtxHelpMsg extends X_AD_CtxHelpMsg {
.setParameters(Env.getAD_Client_ID(ctx), Env.getAD_Org_ID(ctx), AD_CtxHelp_ID) .setParameters(Env.getAD_Client_ID(ctx), Env.getAD_Org_ID(ctx), AD_CtxHelp_ID)
.first(); .first();
} }
s_cache.put(key.toString(), retValue); s_cache.put(key.toString(), retValue, e -> new MCtxHelpMsg(Env.getCtx(), e));
return retValue; return retValue;
} }
@ -159,5 +196,13 @@ public class MCtxHelpMsg extends X_AD_CtxHelpMsg {
super.setClientOrg(AD_Client_ID, AD_Org_ID); super.setClientOrg(AD_Client_ID, AD_Org_ID);
} }
@Override
public MCtxHelpMsg markImmutable() {
if (is_Immutable())
return this;
super.makeImmutable();
return this;
}
} // MCtxHelpMsg } // MCtxHelpMsg

View File

@ -19,19 +19,22 @@ package org.compiere.model;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.util.Properties; import java.util.Properties;
import org.compiere.util.CCache; import org.compiere.util.Env;
import org.idempiere.cache.ImmutableIntPOCache;
import org.idempiere.cache.ImmutablePOSupport;
import org.idempiere.cache.ImmutablePOCache;
/** /**
* Currency Model. * Currency Model.
* *
* @author Jorg Janke * @author Jorg Janke
*/ */
public class MCurrency extends X_C_Currency public class MCurrency extends X_C_Currency implements ImmutablePOSupport
{ {
/** /**
* *
*/ */
private static final long serialVersionUID = 2262097171335518186L; private static final long serialVersionUID = 4325153934518648373L;
/** /**
* Currency Constructor * Currency Constructor
@ -85,14 +88,54 @@ public class MCurrency extends X_C_Currency
setIsEuro (false); setIsEuro (false);
} // MCurrency } // MCurrency
/**
/** Store System Currencies **/ *
private static CCache<Integer,MCurrency> s_currencies = new CCache<Integer,MCurrency>(Table_Name, 50); * @param copy
/** Cache System Currencies by using ISO code as key **/ */
private static CCache<String,MCurrency> s_currenciesISO = new CCache<String,MCurrency>(Table_Name, "C_CurrencyISO", 50); public MCurrency(MCurrency copy)
{
this(Env.getCtx(), copy);
}
/** /**
* Get Currency using ISO code *
* @param ctx
* @param copy
*/
public MCurrency(Properties ctx, MCurrency copy)
{
this(ctx, copy, (String) null);
}
/**
*
* @param ctx
* @param copy
* @param trxName
*/
public MCurrency(Properties ctx, MCurrency copy, String trxName)
{
this(ctx, 0, trxName);
copyPO(copy);
}
/** Store System Currencies **/
private static ImmutableIntPOCache<Integer,MCurrency> s_currencies = new ImmutableIntPOCache<Integer,MCurrency>(Table_Name, 50);
/** Cache System Currencies by using ISO code as key **/
private static ImmutablePOCache<String,MCurrency> s_currenciesISO = new ImmutablePOCache<String,MCurrency>(Table_Name, "C_CurrencyISO", 50);
/**
* Get Currency using ISO code from cache (immutable)
* @param ISOcode Iso code
* @return MCurrency
*/
public static MCurrency get (String ISOcode)
{
return get(Env.getCtx(), ISOcode);
}
/**
* Get Currency using ISO code from cache (immutable)
* @param ctx Context * @param ctx Context
* @param ISOcode Iso code * @param ISOcode Iso code
* @return MCurrency * @return MCurrency
@ -100,24 +143,34 @@ public class MCurrency extends X_C_Currency
public static MCurrency get (Properties ctx, String ISOcode) public static MCurrency get (Properties ctx, String ISOcode)
{ {
// Try Cache // Try Cache
MCurrency retValue = (MCurrency)s_currenciesISO.get(ISOcode); MCurrency retValue = (MCurrency)s_currenciesISO.get(ctx, ISOcode, e -> new MCurrency(ctx, e));
if (retValue != null) if (retValue != null)
return retValue; return retValue;
// Try database // Try database
Query query = new Query(ctx, I_C_Currency.Table_Name, "ISO_Code=?", null); Query query = new Query(ctx, I_C_Currency.Table_Name, "ISO_Code=?", (String)null);
query.setParameters(ISOcode); query.setParameters(ISOcode);
retValue = (MCurrency)query.firstOnly(); retValue = (MCurrency)query.firstOnly();
// Save // Save
if (retValue!=null) if (retValue!=null) {
s_currenciesISO.put(ISOcode, retValue); s_currenciesISO.put(ISOcode, retValue, e -> new MCurrency(Env.getCtx(), e));
}
return retValue; return retValue;
} }
/**
* Get Currency (immutable)
* @param C_Currency_ID currency
* @return ISO Code
*/
public static MCurrency get (int C_Currency_ID)
{
return get(Env.getCtx(), C_Currency_ID);
}
/** /**
* Get Currency * Get Currency (immutable)
* @param ctx Context * @param ctx Context
* @param C_Currency_ID currency * @param C_Currency_ID currency
* @return ISO Code * @return ISO Code
@ -126,16 +179,20 @@ public class MCurrency extends X_C_Currency
{ {
// Try Cache // Try Cache
Integer key = Integer.valueOf(C_Currency_ID); Integer key = Integer.valueOf(C_Currency_ID);
MCurrency retValue = (MCurrency)s_currencies.get(key); MCurrency retValue = s_currencies.get(ctx, key, e -> new MCurrency(ctx, e));
if (retValue != null) if (retValue != null)
return retValue; return retValue;
// Create it // Create it
retValue = new MCurrency(ctx, C_Currency_ID, null); retValue = new MCurrency(ctx, C_Currency_ID, (String)null);
// Save in System // Save in System
if (retValue.get_ID() == C_Currency_ID)
{
if (retValue.getAD_Client_ID() == 0) if (retValue.getAD_Client_ID() == 0)
s_currencies.put(key, retValue); s_currencies.put(key, retValue, e -> new MCurrency(Env.getCtx(), e));
return retValue; return (MCurrency) retValue.markImmutable();
}
return null;
} // get } // get
/** /**
@ -194,6 +251,15 @@ public class MCurrency extends X_C_Currency
return c.getCostingPrecision(); return c.getCostingPrecision();
} }
@Override
public MCurrency markImmutable() {
if (is_Immutable())
return this;
makeImmutable();
return this;
}
/*************************************************************************/ /*************************************************************************/

View File

@ -7,10 +7,12 @@ import java.util.Properties;
import java.util.logging.Level; import java.util.logging.Level;
import java.util.logging.Logger; import java.util.logging.Logger;
import org.compiere.util.CCache;
import org.compiere.util.CLogMgt; import org.compiere.util.CLogMgt;
import org.compiere.util.CLogger; import org.compiere.util.CLogger;
import org.compiere.util.Env; import org.compiere.util.Env;
import org.idempiere.cache.ImmutablePOSupport;
import org.idempiere.cache.IntPOCopyCache;
import org.idempiere.cache.POCopyCache;
import org.idempiere.fa.exceptions.AssetNotImplementedException; import org.idempiere.fa.exceptions.AssetNotImplementedException;
import org.idempiere.fa.exceptions.AssetNotSupportedException; import org.idempiere.fa.exceptions.AssetNotSupportedException;
import org.idempiere.fa.service.api.DepreciationDTO; import org.idempiere.fa.service.api.DepreciationDTO;
@ -21,13 +23,12 @@ import org.idempiere.fa.service.api.IDepreciationMethod;
* Depreciation Engine (eg. SL, ARH_VAR ...) * Depreciation Engine (eg. SL, ARH_VAR ...)
* @author Teo Sarca, SC ARHIPAC SERVICE SRL * @author Teo Sarca, SC ARHIPAC SERVICE SRL
*/ */
public class MDepreciation extends X_A_Depreciation public class MDepreciation extends X_A_Depreciation implements ImmutablePOSupport
{ {
/** /**
* *
*/ */
private static final long serialVersionUID = -632058079835100100L; private static final long serialVersionUID = -4366354698409595086L;
/** Standard Constructor */ /** Standard Constructor */
public MDepreciation (Properties ctx, int A_Depreciation_ID, String trxName) public MDepreciation (Properties ctx, int A_Depreciation_ID, String trxName)
@ -45,12 +46,43 @@ public class MDepreciation extends X_A_Depreciation
super (ctx, rs, trxName); super (ctx, rs, trxName);
} // MDepreciation } // MDepreciation
/**
*
* @param copy
*/
public MDepreciation(MDepreciation copy)
{
this(Env.getCtx(), copy);
}
/**
*
* @param ctx
* @param copy
*/
public MDepreciation(Properties ctx, MDepreciation copy)
{
this(ctx, copy, (String) null);
}
/**
*
* @param ctx
* @param copy
* @param trxName
*/
public MDepreciation(Properties ctx, MDepreciation copy, String trxName)
{
this(ctx, 0, trxName);
copyPO(copy);
}
/** Cache */ /** Cache */
private static CCache<Integer,MDepreciation> private static IntPOCopyCache<Integer,MDepreciation>
s_cache = new CCache<Integer,MDepreciation>(Table_Name, 5); s_cache = new IntPOCopyCache<Integer,MDepreciation>(Table_Name, 5);
/** Cache for type */ /** Cache for type */
private static CCache<String,MDepreciation> private static POCopyCache<String,MDepreciation>
s_cache_forType = new CCache<String,MDepreciation>(Table_Name, Table_Name+"_DepreciationType", 5); s_cache_forType = new POCopyCache<String,MDepreciation>(Table_Name, Table_Name+"_DepreciationType", 5);
/** Static logger */ /** Static logger */
private static Logger s_log = CLogger.getCLogger(MDepreciation.class); private static Logger s_log = CLogger.getCLogger(MDepreciation.class);
/** The accuracy of calculation on depreciation */ /** The accuracy of calculation on depreciation */
@ -66,37 +98,51 @@ public class MDepreciation extends X_A_Depreciation
return ; return ;
} }
s_cache.put(depr.get_ID(), depr); s_cache.put(depr.get_ID(), depr, e -> new MDepreciation(Env.getCtx(), e));
String key = "" + depr.getAD_Client_ID() + "_" + depr.getDepreciationType(); String key = "" + depr.getAD_Client_ID() + "_" + depr.getDepreciationType();
s_cache_forType.put(key, depr); s_cache_forType.put(key, depr, e -> new MDepreciation(Env.getCtx(), e));
} }
/** /**
* Get Depreciation method * Get Depreciation method from cache
* @param A_Depreciation_ID depreciation id
*/
public static MDepreciation get(int A_Depreciation_ID)
{
return get(Env.getCtx(), A_Depreciation_ID);
}
/**
* Get Depreciation method from cache
* @param ctx * @param ctx
* @param A_Depreciation_ID depreciation id * @param A_Depreciation_ID depreciation id
*/ */
public static MDepreciation get(Properties ctx, int A_Depreciation_ID) public static MDepreciation get(Properties ctx, int A_Depreciation_ID)
{ {
MDepreciation depr = s_cache.get(A_Depreciation_ID); MDepreciation depr = s_cache.get(A_Depreciation_ID, e -> new MDepreciation(ctx, e));
if (depr != null) if (depr != null)
{
return depr; return depr;
}
depr = new MDepreciation(ctx, A_Depreciation_ID, null); depr = new MDepreciation(ctx, A_Depreciation_ID, (String)null);
if (depr.get_ID() > 0) if (depr.get_ID() == A_Depreciation_ID)
{ {
addToCache(depr); addToCache(depr);
}
else
{
depr = null;
}
return depr; return depr;
}
return null;
} // get } // get
/** /**
* Get Depreciation method * Get Depreciation method
* @param depreciationType depreciation type (e.g. SL)
*/
public static MDepreciation get(String depreciationType)
{
return get(Env.getCtx(), depreciationType);
}
/**
* Get Depreciation method (immutable)
* @param ctx * @param ctx
* @param depreciationType depreciation type (e.g. SL) * @param depreciationType depreciation type (e.g. SL)
*/ */
@ -104,11 +150,9 @@ public class MDepreciation extends X_A_Depreciation
{ {
int AD_Client_ID = Env.getAD_Client_ID(ctx); int AD_Client_ID = Env.getAD_Client_ID(ctx);
String key = "" + AD_Client_ID + "_" + depreciationType; String key = "" + AD_Client_ID + "_" + depreciationType;
MDepreciation depr = s_cache_forType.get(key); MDepreciation depr = s_cache_forType.get(key, e -> new MDepreciation(ctx, e));
if (depr != null) if (depr != null)
{
return depr; return depr;
}
final String whereClause = COLUMNNAME_DepreciationType+"=?" final String whereClause = COLUMNNAME_DepreciationType+"=?"
+" AND AD_Client_ID IN (0,?)"; +" AND AD_Client_ID IN (0,?)";
@ -117,7 +161,7 @@ public class MDepreciation extends X_A_Depreciation
.setParameters(new Object[]{depreciationType, AD_Client_ID}) .setParameters(new Object[]{depreciationType, AD_Client_ID})
.firstOnly(); .firstOnly();
addToCache(depr); addToCache(depr);
return depr; return (MDepreciation) depr.markImmutable();
} // get } // get
/** /**
@ -482,4 +526,14 @@ public class MDepreciation extends X_A_Depreciation
// TODO: Adding this method to compile correctly and future research // TODO: Adding this method to compile correctly and future research
return 0; return 0;
} }
@Override
public MDepreciation markImmutable() {
if (is_Immutable())
return this;
makeImmutable();
return this;
}
} }

View File

@ -5,19 +5,21 @@ import java.sql.ResultSet;
import java.util.Properties; import java.util.Properties;
import java.util.logging.Level; import java.util.logging.Level;
import org.compiere.util.CCache;
import org.compiere.util.DB; import org.compiere.util.DB;
import org.compiere.util.Env;
import org.idempiere.cache.ImmutableIntPOCache;
import org.idempiere.cache.ImmutablePOSupport;
/** Convention for the first year of depreciation (ex. FMCON, FYCON ...) /** Convention for the first year of depreciation (ex. FMCON, FYCON ...)
* @author Teo Sarca, SC Arhipac SRL * @author Teo Sarca, SC Arhipac SRL
* @version $Id$ * @version $Id$
*/ */
public class MDepreciationConvention extends X_A_Depreciation_Convention public class MDepreciationConvention extends X_A_Depreciation_Convention implements ImmutablePOSupport
{ {
/** /**
* *
*/ */
private static final long serialVersionUID = 2274629486216430723L; private static final long serialVersionUID = -3735111030292424391L;
/** /**
* Default Constructor * Default Constructor
@ -43,24 +45,69 @@ public class MDepreciationConvention extends X_A_Depreciation_Convention
super (ctx, rs, trxName); super (ctx, rs, trxName);
} // MDepreciationConvention } // MDepreciationConvention
/**
*
* @param copy
*/
public MDepreciationConvention(MDepreciationConvention copy)
{
this(Env.getCtx(), copy);
}
/**
*
* @param ctx
* @param copy
*/
public MDepreciationConvention(Properties ctx, MDepreciationConvention copy)
{
this(ctx, copy, (String) null);
}
/**
*
* @param ctx
* @param copy
* @param trxName
*/
public MDepreciationConvention(Properties ctx, MDepreciationConvention copy, String trxName)
{
this(ctx, 0, trxName);
copyPO(copy);
}
/** Cache */ /** Cache */
private static CCache<Integer,MDepreciationConvention> s_cache = new CCache<Integer,MDepreciationConvention>(Table_Name, 5); private static ImmutableIntPOCache<Integer,MDepreciationConvention> s_cache = new ImmutableIntPOCache<Integer,MDepreciationConvention>(Table_Name, 5);
//~ /** Static logger */ //~ /** Static logger */
//~ private static Logger s_log = CLogger.getCLogger(MDepreciationConvention.class); //~ private static Logger s_log = CLogger.getCLogger(MDepreciationConvention.class);
/**
* Get MDepreciationConvention from cache (immutable)
* @param A_Depreciation_Convention_ID
* @return MDepreciationConvention
*/
public static MDepreciationConvention get(int A_Depreciation_Convention_ID) {
return get(Env.getCtx(), A_Depreciation_Convention_ID);
}
/**
* Get MDepreciationConvention from cache (immutable)
* @param ctx context
* @param A_Depreciation_Convention_ID
* @return MDepreciationConvention
*/
public static MDepreciationConvention get(Properties ctx, int A_Depreciation_Convention_ID) { public static MDepreciationConvention get(Properties ctx, int A_Depreciation_Convention_ID) {
Integer key = Integer.valueOf(A_Depreciation_Convention_ID); Integer key = Integer.valueOf(A_Depreciation_Convention_ID);
MDepreciationConvention conv = s_cache.get(key); MDepreciationConvention conv = s_cache.get(ctx, key, e -> new MDepreciationConvention(ctx, e));
if (conv != null) { if (conv != null)
return conv;
conv = new MDepreciationConvention(ctx, A_Depreciation_Convention_ID, (String)null);
if (conv.get_ID() == A_Depreciation_Convention_ID) {
s_cache.put(key, conv, e -> new MDepreciationConvention(Env.getCtx(), e));
return conv; return conv;
} }
conv = new MDepreciationConvention(ctx, A_Depreciation_Convention_ID, null); return null;
if (conv.get_ID() > 0) {
s_cache.put(key, conv);
} else {
conv = null;
}
return conv;
} // get } // get
/** */ /** */
@ -114,4 +161,14 @@ public class MDepreciationConvention extends X_A_Depreciation_Convention
public BigDecimal apply_FMCON(int A_Asset_ID, String PostingType, int A_Asset_Acct_ID, int Flag, int Period) { public BigDecimal apply_FMCON(int A_Asset_ID, String PostingType, int A_Asset_Acct_ID, int Flag, int Period) {
return BigDecimal.ONE; return BigDecimal.ONE;
} }
@Override
public MDepreciationConvention markImmutable() {
if (is_Immutable())
return this;
makeImmutable();
return this;
}
} }

View File

@ -8,21 +8,24 @@ import java.util.Properties;
import java.util.logging.Level; import java.util.logging.Level;
import org.adempiere.exceptions.DBException; import org.adempiere.exceptions.DBException;
import org.compiere.util.CCache;
import org.compiere.util.CLogMgt; import org.compiere.util.CLogMgt;
import org.compiere.util.DB; import org.compiere.util.DB;
import org.compiere.util.Env;
import org.idempiere.cache.ImmutableIntPOCache;
import org.idempiere.cache.ImmutablePOSupport;
import org.idempiere.cache.ImmutablePOCache;
/** /**
* Method of adjusting the difference between depreciation (Calculated) and registered as (booked). * Method of adjusting the difference between depreciation (Calculated) and registered as (booked).
* ex. MDI, LDI, YDI ... * ex. MDI, LDI, YDI ...
* @author Teo Sarca, SC ARHIPAC SERVICE SRL * @author Teo Sarca, SC ARHIPAC SERVICE SRL
*/ */
public class MDepreciationMethod extends X_A_Depreciation_Method public class MDepreciationMethod extends X_A_Depreciation_Method implements ImmutablePOSupport
{ {
/** /**
* *
*/ */
private static final long serialVersionUID = 4622027905888469713L; private static final long serialVersionUID = -7477974832683140825L;
/** Standard Constructor */ /** Standard Constructor */
public MDepreciationMethod (Properties ctx, int A_Depreciation_Method_ID, String trxName) public MDepreciationMethod (Properties ctx, int A_Depreciation_Method_ID, String trxName)
@ -40,12 +43,43 @@ public class MDepreciationMethod extends X_A_Depreciation_Method
super (ctx, rs, trxName); super (ctx, rs, trxName);
} // MDepreciationMethod } // MDepreciationMethod
/**
*
* @param copy
*/
public MDepreciationMethod(MDepreciationMethod copy)
{
this(Env.getCtx(), copy);
}
/**
*
* @param ctx
* @param copy
*/
public MDepreciationMethod(Properties ctx, MDepreciationMethod copy)
{
this(ctx, copy, (String) null);
}
/**
*
* @param ctx
* @param copy
* @param trxName
*/
public MDepreciationMethod(Properties ctx, MDepreciationMethod copy, String trxName)
{
this(ctx, 0, trxName);
copyPO(copy);
}
/** Cache */ /** Cache */
private static CCache<Integer,MDepreciationMethod> private static ImmutableIntPOCache<Integer,MDepreciationMethod>
s_cache = new CCache<Integer,MDepreciationMethod>(Table_Name, 5); s_cache = new ImmutableIntPOCache<Integer,MDepreciationMethod>(Table_Name, 5);
/** Cache for type */ /** Cache for type */
private static CCache<String,MDepreciationMethod> private static ImmutablePOCache<String,MDepreciationMethod>
s_cache_forType = new CCache<String,MDepreciationMethod>(Table_Name, Table_Name+"_DepreciationType", 5); s_cache_forType = new ImmutablePOCache<String,MDepreciationMethod>(Table_Name, Table_Name+"_DepreciationType", 5);
/** /**
* *
@ -56,8 +90,8 @@ public class MDepreciationMethod extends X_A_Depreciation_Method
{ {
return; return;
} }
s_cache.put(depr.get_ID(), depr); s_cache.put(depr.get_ID(), depr, e -> new MDepreciationMethod(Env.getCtx(), e));
s_cache_forType.put(depr.getDepreciationType(), depr); s_cache_forType.put(depr.getDepreciationType(), depr, e -> new MDepreciationMethod(Env.getCtx(), e));
} }
/** /**
@ -69,43 +103,64 @@ public class MDepreciationMethod extends X_A_Depreciation_Method
} }
/** /**
* * Get MDepreciationMethod from cache (immutable)
* @param A_Depreciation_Method_ID
* @return MDepreciationMethod
*/
public static MDepreciationMethod get(int A_Depreciation_Method_ID)
{
return get(Env.getCtx(), A_Depreciation_Method_ID);
}
/**
* Get MDepreciationMethod from cache (immutable)
* @param ctx
* @param A_Depreciation_Method_ID
* @return MDepreciationMethod
*/ */
public static MDepreciationMethod get(Properties ctx, int A_Depreciation_Method_ID) public static MDepreciationMethod get(Properties ctx, int A_Depreciation_Method_ID)
{ {
MDepreciationMethod depr = s_cache.get(A_Depreciation_Method_ID); MDepreciationMethod depr = s_cache.get(ctx, A_Depreciation_Method_ID, e -> new MDepreciationMethod(ctx, e));
if (depr != null) if (depr != null)
{
return depr; return depr;
}
depr = new MDepreciationMethod(ctx, A_Depreciation_Method_ID, null); depr = new MDepreciationMethod(ctx, A_Depreciation_Method_ID, (String)null);
if (depr.get_ID() > 0) if (depr.get_ID() == A_Depreciation_Method_ID)
{ {
addToCache(depr); addToCache(depr);
}
else
{
depr = null;
}
return depr; return depr;
}
return null;
} // get } // get
/** /**
* * Get MDepreciationMethod from cache
* @param depreciationType
* @return MDepreciationMethod
*/
public static MDepreciationMethod get(String depreciationType)
{
return get(Env.getCtx(), depreciationType);
}
/**
* Get MDepreciationMethod from cache (immutable)
* @param ctx
* @param depreciationType
* @return MDepreciationMethod
*/ */
public static MDepreciationMethod get(Properties ctx, String depreciationType) public static MDepreciationMethod get(Properties ctx, String depreciationType)
{ {
String key = depreciationType; String key = depreciationType;
MDepreciationMethod depr = s_cache_forType.get(key); MDepreciationMethod depr = s_cache_forType.get(ctx, key, e -> new MDepreciationMethod(ctx, e));
if (depr != null) if (depr != null)
{
return depr; return depr;
}
depr = new Query(ctx, Table_Name, COLUMNNAME_DepreciationType+"=?", null) depr = new Query(ctx, Table_Name, COLUMNNAME_DepreciationType+"=?", null)
.setParameters(new Object[]{depreciationType}) .setParameters(new Object[]{depreciationType})
.firstOnly(); .firstOnly();
addToCache(depr); addToCache(depr);
return depr; return (MDepreciationMethod) depr.markImmutable();
} }
@ -246,4 +301,14 @@ public class MDepreciationMethod extends X_A_Depreciation_Method
} }
return periodAdjustment; return periodAdjustment;
} }
@Override
public MDepreciationMethod markImmutable() {
if (is_Immutable())
return this;
makeImmutable();
return this;
}
} }

View File

@ -9,8 +9,6 @@ import java.util.Properties;
import java.util.logging.Level; import java.util.logging.Level;
import org.adempiere.base.Core; import org.adempiere.base.Core;
import org.apache.commons.collections.keyvalue.MultiKey;
import org.compiere.util.CCache;
import org.compiere.util.CLogMgt; import org.compiere.util.CLogMgt;
import org.compiere.util.CLogger; import org.compiere.util.CLogger;
import org.compiere.util.DB; import org.compiere.util.DB;
@ -276,6 +274,38 @@ public class MDepreciationWorkfile extends X_A_Depreciation_Workfile
dump(); dump();
} }
/**
*
* @param copy
*/
public MDepreciationWorkfile(MDepreciationWorkfile copy)
{
this(Env.getCtx(), copy);
}
/**
*
* @param ctx
* @param copy
*/
public MDepreciationWorkfile(Properties ctx, MDepreciationWorkfile copy)
{
this(ctx, copy, (String) null);
}
/**
*
* @param ctx
* @param copy
* @param trxName
*/
public MDepreciationWorkfile(Properties ctx, MDepreciationWorkfile copy, String trxName)
{
this(ctx, 0, trxName);
copyPO(copy);
this.m_asset = copy.m_asset != null ? new MAsset(ctx, copy.m_asset, trxName) : null;
}
/** Logger */ /** Logger */
private CLogger log = CLogger.getCLogger(getClass()); private CLogger log = CLogger.getCLogger(getClass());
@ -316,20 +346,6 @@ public class MDepreciationWorkfile extends X_A_Depreciation_Workfile
return null; return null;
} }
final MultiKey key = new MultiKey(A_Asset_ID, postingType);
if (trxName == null)
{
MDepreciationWorkfile wk = s_cacheAsset.get(key);
if (wk != null)
return wk;
}
/* @win temporary change as this code is causing duplicate create MDepreciationWorkfile on asset addition
final String whereClause = COLUMNNAME_A_Asset_ID+"=?"
+" AND "+COLUMNNAME_PostingType+"=? AND "+COLUMNNAME_A_QTY_Current+">?";
MDepreciationWorkfile wk = new Query(ctx, MDepreciationWorkfile.Table_Name, whereClause, trxName)
.setParameters(new Object[]{A_Asset_ID, postingType, 0})
.firstOnly();
*/
final String whereClause = COLUMNNAME_A_Asset_ID+"=?" final String whereClause = COLUMNNAME_A_Asset_ID+"=?"
+" AND "+COLUMNNAME_PostingType+"=? AND " + COLUMNNAME_C_AcctSchema_ID + "=?" ; +" AND "+COLUMNNAME_PostingType+"=? AND " + COLUMNNAME_C_AcctSchema_ID + "=?" ;
@ -338,11 +354,6 @@ public class MDepreciationWorkfile extends X_A_Depreciation_Workfile
.setParameters(new Object[]{A_Asset_ID, postingType,acctSchemaId}) .setParameters(new Object[]{A_Asset_ID, postingType,acctSchemaId})
.firstOnly(); .firstOnly();
if (trxName == null && wk != null)
{
s_cacheAsset.put(key, wk);
}
return wk; return wk;
} }
@ -358,9 +369,6 @@ public class MDepreciationWorkfile extends X_A_Depreciation_Workfile
{ {
return get(ctx, A_Asset_ID, postingType, trxName, 0); return get(ctx, A_Asset_ID, postingType, trxName, 0);
} }
/** Static cache: Asset/PostingType -> Workfile */
private static CCache<MultiKey, MDepreciationWorkfile>
s_cacheAsset = new CCache<MultiKey, MDepreciationWorkfile>(Table_Name, Table_Name+"_Asset", 10);
/** Returns the date of the last action /** Returns the date of the last action
*/ */

View File

@ -21,13 +21,15 @@ import java.math.RoundingMode;
import java.sql.PreparedStatement; import java.sql.PreparedStatement;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays;
import java.util.Properties; import java.util.Properties;
import java.util.logging.Level; import java.util.logging.Level;
import org.compiere.util.CCache;
import org.compiere.util.DB; import org.compiere.util.DB;
import org.compiere.util.Env; import org.compiere.util.Env;
import org.compiere.util.TimeUtil; import org.compiere.util.TimeUtil;
import org.idempiere.cache.ImmutableIntPOCache;
import org.idempiere.cache.ImmutablePOSupport;
/** /**
* Discount Schema Model * Discount Schema Model
@ -35,16 +37,25 @@ import org.compiere.util.TimeUtil;
* @author Jorg Janke * @author Jorg Janke
* @version $Id: MDiscountSchema.java,v 1.3 2006/07/30 00:51:04 jjanke Exp $ * @version $Id: MDiscountSchema.java,v 1.3 2006/07/30 00:51:04 jjanke Exp $
*/ */
public class MDiscountSchema extends X_M_DiscountSchema public class MDiscountSchema extends X_M_DiscountSchema implements ImmutablePOSupport
{ {
/** /**
* *
*/ */
private static final long serialVersionUID = -3314884382853756019L; private static final long serialVersionUID = 4916780751688051566L;
/** /**
* Get Discount Schema from Cache * Get Discount Schema from Cache (immutable)
* @param M_DiscountSchema_ID id
* @return MDiscountSchema
*/
public static MDiscountSchema get (int M_DiscountSchema_ID)
{
return get(Env.getCtx(), M_DiscountSchema_ID);
}
/**
* Get Discount Schema from Cache (immutable)
* @param ctx context * @param ctx context
* @param M_DiscountSchema_ID id * @param M_DiscountSchema_ID id
* @return MDiscountSchema * @return MDiscountSchema
@ -52,18 +63,21 @@ public class MDiscountSchema extends X_M_DiscountSchema
public static MDiscountSchema get (Properties ctx, int M_DiscountSchema_ID) public static MDiscountSchema get (Properties ctx, int M_DiscountSchema_ID)
{ {
Integer key = Integer.valueOf(M_DiscountSchema_ID); Integer key = Integer.valueOf(M_DiscountSchema_ID);
MDiscountSchema retValue = (MDiscountSchema) s_cache.get (key); MDiscountSchema retValue = s_cache.get (ctx, key, e -> new MDiscountSchema(ctx, e));
if (retValue != null) if (retValue != null)
return retValue; return retValue;
retValue = new MDiscountSchema (ctx, M_DiscountSchema_ID, null); retValue = new MDiscountSchema (ctx, M_DiscountSchema_ID, (String)null);
if (retValue.get_ID () != 0) if (retValue.get_ID () == M_DiscountSchema_ID)
s_cache.put (key, retValue); {
s_cache.put (key, retValue, e -> new MDiscountSchema(Env.getCtx(), e));
return retValue; return retValue;
}
return null;
} // get } // get
/** Cache */ /** Cache */
private static CCache<Integer,MDiscountSchema> s_cache private static ImmutableIntPOCache<Integer,MDiscountSchema> s_cache
= new CCache<Integer,MDiscountSchema>(Table_Name, 20); = new ImmutableIntPOCache<Integer,MDiscountSchema>(Table_Name, 20);
/************************************************************************** /**************************************************************************
@ -98,6 +112,39 @@ public class MDiscountSchema extends X_M_DiscountSchema
super(ctx, rs, trxName); super(ctx, rs, trxName);
} // MDiscountSchema } // MDiscountSchema
/**
*
* @param copy
*/
public MDiscountSchema(MDiscountSchema copy)
{
this(Env.getCtx(), copy);
}
/**
*
* @param ctx
* @param copy
*/
public MDiscountSchema(Properties ctx, MDiscountSchema copy)
{
this(ctx, copy, (String) null);
}
/**
*
* @param ctx
* @param copy
* @param trxName
*/
public MDiscountSchema(Properties ctx, MDiscountSchema copy, String trxName)
{
this(ctx, 0, trxName);
copyPO(copy);
this.m_breaks = copy.m_breaks != null ? Arrays.stream(copy.m_breaks).map(e -> {return new MDiscountSchemaBreak(ctx, e, trxName);}).toArray(MDiscountSchemaBreak[]::new) : null;
this.m_lines = copy.m_lines != null ? Arrays.stream(copy.m_lines).map(e -> {return new MDiscountSchemaLine(ctx, e, trxName);}).toArray(MDiscountSchemaLine[]::new) : null;
}
/** Breaks */ /** Breaks */
private MDiscountSchemaBreak[] m_breaks = null; private MDiscountSchemaBreak[] m_breaks = null;
/** Lines */ /** Lines */
@ -123,7 +170,12 @@ public class MDiscountSchema extends X_M_DiscountSchema
pstmt.setInt (1, getM_DiscountSchema_ID()); pstmt.setInt (1, getM_DiscountSchema_ID());
rs = pstmt.executeQuery (); rs = pstmt.executeQuery ();
while (rs.next ()) while (rs.next ())
list.add(new MDiscountSchemaBreak(getCtx(), rs, get_TrxName())); {
MDiscountSchemaBreak dsb = new MDiscountSchemaBreak(getCtx(), rs, get_TrxName());
if (is_Immutable())
dsb.markImmutable();
list.add(dsb);
}
} }
catch (Exception e) catch (Exception e)
{ {
@ -162,7 +214,12 @@ public class MDiscountSchema extends X_M_DiscountSchema
pstmt.setInt (1, getM_DiscountSchema_ID()); pstmt.setInt (1, getM_DiscountSchema_ID());
rs = pstmt.executeQuery (); rs = pstmt.executeQuery ();
while (rs.next ()) while (rs.next ())
list.add(new MDiscountSchemaLine(getCtx(), rs, get_TrxName())); {
MDiscountSchemaLine dsl = new MDiscountSchemaLine(getCtx(), rs, get_TrxName());
if (is_Immutable())
dsl.markImmutable();
list.add(dsl);
}
} }
catch (Exception e) catch (Exception e)
{ {
@ -338,4 +395,16 @@ public class MDiscountSchema extends X_M_DiscountSchema
return count; return count;
} // reSeq } // reSeq
@Override
public MDiscountSchema markImmutable() {
if (is_Immutable())
return this;
makeImmutable();
if (m_lines != null)
Arrays.stream(m_lines).forEach(e -> {e.markImmutable();});
if (m_breaks != null)
Arrays.stream(m_breaks).forEach(e -> {e.markImmutable();});
return this;
}
} // MDiscountSchema } // MDiscountSchema

View File

@ -20,6 +20,9 @@ import java.math.BigDecimal;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.util.Properties; import java.util.Properties;
import org.compiere.util.Env;
import org.idempiere.cache.ImmutablePOSupport;
/** /**
* Discount Break Schema (Model) * Discount Break Schema (Model)
@ -30,13 +33,13 @@ import java.util.Properties;
* @author Teo Sarca, SC ARHIPAC SERVICE SRL * @author Teo Sarca, SC ARHIPAC SERVICE SRL
* <li>BF [ 2012439 ] DiscountSchemaBreak: setting product & category is allowed * <li>BF [ 2012439 ] DiscountSchemaBreak: setting product & category is allowed
*/ */
public class MDiscountSchemaBreak extends X_M_DiscountSchemaBreak public class MDiscountSchemaBreak extends X_M_DiscountSchemaBreak implements ImmutablePOSupport
{ {
/** /**
* *
*/ */
private static final long serialVersionUID = 6413962940750128351L; private static final long serialVersionUID = -5405425697628869517L;
/** /**
* Standard Constructor * Standard Constructor
@ -60,6 +63,36 @@ public class MDiscountSchemaBreak extends X_M_DiscountSchemaBreak
super(ctx, rs, trxName); super(ctx, rs, trxName);
} // MDiscountSchemaBreak } // MDiscountSchemaBreak
/**
*
* @param copy
*/
public MDiscountSchemaBreak(MDiscountSchemaBreak copy)
{
this(Env.getCtx(), copy);
}
/**
*
* @param ctx
* @param copy
*/
public MDiscountSchemaBreak(Properties ctx, MDiscountSchemaBreak copy)
{
this(ctx, copy, (String) null);
}
/**
*
* @param ctx
* @param copy
* @param trxName
*/
public MDiscountSchemaBreak(Properties ctx, MDiscountSchemaBreak copy, String trxName)
{
this(ctx, 0, trxName);
copyPO(copy);
}
/** /**
* Criteria apply * Criteria apply
@ -124,4 +157,13 @@ public class MDiscountSchemaBreak extends X_M_DiscountSchemaBreak
return sb.toString (); return sb.toString ();
} // toString } // toString
@Override
public MDiscountSchemaBreak markImmutable() {
if (is_Immutable())
return this;
makeImmutable();
return this;
}
} // MDiscountSchemaBreak } // MDiscountSchemaBreak

View File

@ -19,6 +19,9 @@ package org.compiere.model;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.util.Properties; import java.util.Properties;
import org.compiere.util.Env;
import org.idempiere.cache.ImmutablePOSupport;
/** /**
* Discount Schema Line (Price List) Model * Discount Schema Line (Price List) Model
@ -26,13 +29,12 @@ import java.util.Properties;
* @author Jorg Janke * @author Jorg Janke
* @version $Id: MDiscountSchemaLine.java,v 1.3 2006/07/30 00:51:03 jjanke Exp $ * @version $Id: MDiscountSchemaLine.java,v 1.3 2006/07/30 00:51:03 jjanke Exp $
*/ */
public class MDiscountSchemaLine extends X_M_DiscountSchemaLine public class MDiscountSchemaLine extends X_M_DiscountSchemaLine implements ImmutablePOSupport
{ {
/** /**
* *
*/ */
private static final long serialVersionUID = 1632154004024021493L; private static final long serialVersionUID = 5145958821951855437L;
/** /**
* Standard Constructor * Standard Constructor
@ -56,4 +58,44 @@ public class MDiscountSchemaLine extends X_M_DiscountSchemaLine
super(ctx, rs, trxName); super(ctx, rs, trxName);
} // MDiscountSchemaLine } // MDiscountSchemaLine
/**
*
* @param copy
*/
public MDiscountSchemaLine(MDiscountSchemaLine copy)
{
this(Env.getCtx(), copy);
}
/**
*
* @param ctx
* @param copy
*/
public MDiscountSchemaLine(Properties ctx, MDiscountSchemaLine copy)
{
this(ctx, copy, (String) null);
}
/**
*
* @param ctx
* @param copy
* @param trxName
*/
public MDiscountSchemaLine(Properties ctx, MDiscountSchemaLine copy, String trxName)
{
this(ctx, 0, trxName);
copyPO(copy);
}
@Override
public MDiscountSchemaLine markImmutable() {
if (is_Immutable())
return this;
makeImmutable();
return this;
}
} // MDiscountSchemaLine } // MDiscountSchemaLine

View File

@ -20,6 +20,7 @@ import java.math.BigDecimal;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.sql.Timestamp; import java.sql.Timestamp;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays;
import java.util.List; import java.util.List;
import java.util.Properties; import java.util.Properties;
import java.util.logging.Level; import java.util.logging.Level;
@ -65,7 +66,6 @@ public class MDistribution extends X_GL_Distribution
/** /**
* Get Distributions for combination * Get Distributions for combination
* @param ctx context
* @param C_AcctSchema_ID schema * @param C_AcctSchema_ID schema
* @param PostingType posting type * @param PostingType posting type
* @param C_DocType_ID document type * @param C_DocType_ID document type
@ -85,6 +85,39 @@ public class MDistribution extends X_GL_Distribution
* @param User2_ID user 2 * @param User2_ID user 2
* @return array of distributions or null * @return array of distributions or null
*/ */
public static MDistribution[] get (int C_AcctSchema_ID,
String PostingType, int C_DocType_ID, Timestamp dateAcct,
int AD_Org_ID, int Account_ID,
int M_Product_ID, int C_BPartner_ID, int C_Project_ID,
int C_Campaign_ID, int C_Activity_ID, int AD_OrgTrx_ID,
int C_SalesRegion_ID, int C_LocTo_ID, int C_LocFrom_ID,
int User1_ID, int User2_ID)
{
return get(Env.getCtx(), C_AcctSchema_ID, PostingType, C_DocType_ID, dateAcct, AD_Org_ID, Account_ID, M_Product_ID, C_BPartner_ID,
C_Project_ID, C_Campaign_ID, C_Activity_ID, AD_OrgTrx_ID, C_SalesRegion_ID, C_LocTo_ID, C_LocFrom_ID, User1_ID, User2_ID);
}
/**
* Get Distributions for combination
* @param ctx context
* @param C_AcctSchema_ID schema
* @param PostingType posting type
* @param C_DocType_ID document type
* @param AD_Org_ID org
* @param Account_ID account
* @param M_Product_ID product
* @param C_BPartner_ID partner
* @param C_Project_ID project
* @param C_Campaign_ID campaign
* @param C_Activity_ID activity
* @param AD_OrgTrx_ID trx org
* @param C_SalesRegion_ID
* @param C_LocTo_ID location to
* @param C_LocFrom_ID location from
* @param User1_ID user 1
* @param User2_ID user 2
* @return array of distributions or null
*/
public static MDistribution[] get (Properties ctx, int C_AcctSchema_ID, public static MDistribution[] get (Properties ctx, int C_AcctSchema_ID,
String PostingType, int C_DocType_ID, Timestamp dateAcct, String PostingType, int C_DocType_ID, Timestamp dateAcct,
int AD_Org_ID, int Account_ID, int AD_Org_ID, int Account_ID,
@ -93,7 +126,7 @@ public class MDistribution extends X_GL_Distribution
int C_SalesRegion_ID, int C_LocTo_ID, int C_LocFrom_ID, int C_SalesRegion_ID, int C_LocTo_ID, int C_LocFrom_ID,
int User1_ID, int User2_ID) int User1_ID, int User2_ID)
{ {
MDistribution[] acctList = getAll(ctx); MDistribution[] acctList = getAll();
if (acctList == null || acctList.length == 0) if (acctList == null || acctList.length == 0)
return null; return null;
// //
@ -154,12 +187,23 @@ public class MDistribution extends X_GL_Distribution
/** /**
* Get Distributions for Account * Get Distributions for Account
* @param ctx context * @param ctx ignore
* @param Account_ID id * @param Account_ID id
* @return array of distributions * @return array of distributions
*/ */
public static MDistribution[] get (Properties ctx, int Account_ID) public static MDistribution[] get (Properties ctx, int Account_ID)
{ {
return get(Account_ID);
}
/**
* Get Distributions for Account
* @param Account_ID id
* @return array of distributions
*/
public static MDistribution[] get (int Account_ID)
{
Properties ctx = Env.getCtx();
Integer key = Integer.valueOf(Account_ID); Integer key = Integer.valueOf(Account_ID);
MDistribution[] retValue = (MDistribution[])s_accounts.get(key); MDistribution[] retValue = (MDistribution[])s_accounts.get(key);
if (retValue != null) if (retValue != null)
@ -177,20 +221,31 @@ public class MDistribution extends X_GL_Distribution
.list(); .list();
// //
retValue = new MDistribution[list.size ()]; retValue = new MDistribution[list.size ()];
list.toArray (retValue); retValue = list.toArray (retValue);
s_accounts.put(key, retValue); s_accounts.put(key, retValue);
return retValue; return retValue;
} // get } // get
/** /**
* Get All Distributions * Get All Distributions
* @param ctx context * @param ctx ignore
* @param Account_ID id * @param Account_ID id
* @return array of distributions * @return array of distributions
* @deprecated
*/ */
public static MDistribution[] getAll (Properties ctx) public static MDistribution[] getAll (Properties ctx)
{ {
return get(ctx, -1); return getAll();
}
/**
* Get All Distributions
* @param Account_ID id
* @return array of distributions
*/
public static MDistribution[] getAll ()
{
return get(-1);
} // get } // get
/** Static Logger */ /** Static Logger */
@ -245,6 +300,38 @@ public class MDistribution extends X_GL_Distribution
super(ctx, rs, trxName); super(ctx, rs, trxName);
} // MDistribution } // MDistribution
/**
*
* @param copy
*/
public MDistribution(MDistribution copy)
{
this(Env.getCtx(), copy);
}
/**
*
* @param ctx
* @param copy
*/
public MDistribution(Properties ctx, MDistribution copy)
{
this(ctx, copy, (String) null);
}
/**
*
* @param ctx
* @param copy
* @param trxName
*/
public MDistribution(Properties ctx, MDistribution copy, String trxName)
{
this(ctx, 0, trxName);
copyPO(copy);
this.m_lines = copy.m_lines != null ? Arrays.stream(copy.m_lines).map(e -> {var v = new MDistributionLine(ctx, e, trxName); v.setParent(this); return v;}).toArray(MDistributionLine[]::new) : null;
}
/** The Lines */ /** The Lines */
private MDistributionLine[] m_lines = null; private MDistributionLine[] m_lines = null;

View File

@ -81,6 +81,41 @@ public class MDistributionLine extends X_GL_DistributionLine
super(ctx, rs, trxName); super(ctx, rs, trxName);
} // MDistributionLine } // MDistributionLine
/**
*
* @param copy
*/
public MDistributionLine(MDistributionLine copy)
{
this(Env.getCtx(), copy);
}
/**
*
* @param ctx
* @param copy
*/
public MDistributionLine(Properties ctx, MDistributionLine copy)
{
this(ctx, copy, (String) null);
}
/**
*
* @param ctx
* @param copy
* @param trxName
*/
public MDistributionLine(Properties ctx, MDistributionLine copy, String trxName)
{
this(ctx, 0, trxName);
copyPO(copy);
this.m_parent = null;
this.m_amt = copy.m_amt;
this.m_qty = copy.m_qty;
this.m_account = copy.m_account != null ? new MAccount(ctx, copy.m_account, trxName) : null;
}
/** The Parent */ /** The Parent */
private MDistribution m_parent = null; private MDistribution m_parent = null;
/** The Amount */ /** The Amount */

View File

@ -215,7 +215,7 @@ public class MDistributionRunLine extends X_M_DistributionRunLine
public MProduct getProduct() public MProduct getProduct()
{ {
if (m_product == null) if (m_product == null)
m_product = MProduct.get(getCtx(), getM_Product_ID()); m_product = MProduct.getCopy(getCtx(), getM_Product_ID(), get_TrxName());
return m_product; return m_product;
} // getProduct } // getProduct

View File

@ -21,9 +21,10 @@ import java.util.List;
import java.util.Properties; import java.util.Properties;
import java.util.logging.Level; import java.util.logging.Level;
import org.compiere.util.CCache;
import org.compiere.util.DB; import org.compiere.util.DB;
import org.compiere.util.Env; import org.compiere.util.Env;
import org.idempiere.cache.ImmutableIntPOCache;
import org.idempiere.cache.ImmutablePOSupport;
/** /**
* Document Type Model * Document Type Model
@ -36,12 +37,12 @@ import org.compiere.util.Env;
* See https://sourceforge.net/forum/message.php?msg_id=6499893 * See https://sourceforge.net/forum/message.php?msg_id=6499893
* @version $Id: MDocType.java,v 1.3 2006/07/30 00:54:54 jjanke Exp $ * @version $Id: MDocType.java,v 1.3 2006/07/30 00:54:54 jjanke Exp $
*/ */
public class MDocType extends X_C_DocType public class MDocType extends X_C_DocType implements ImmutablePOSupport
{ {
/** /**
* *
*/ */
private static final long serialVersionUID = -6556521509479670059L; private static final long serialVersionUID = -7313617271586412889L;
/** /**
* Return the first Doc Type for this BaseType * Return the first Doc Type for this BaseType
@ -86,24 +87,38 @@ public class MDocType extends X_C_DocType
} // getOfClient } // getOfClient
/** /**
* Get Document Type (cached) * Get Document Type (cached) (immutable)
* @param C_DocType_ID id
* @return document type
*/
static public MDocType get (int C_DocType_ID)
{
return get(Env.getCtx(), C_DocType_ID);
}
/**
* Get Document Type (cached) (immutable)
* @param ctx context * @param ctx context
* @param C_DocType_ID id * @param C_DocType_ID id
* @return document type * @return document type
*/ */
static public MDocType get (Properties ctx, int C_DocType_ID) static public MDocType get (Properties ctx, int C_DocType_ID)
{ {
MDocType retValue = (MDocType)s_cache.get(C_DocType_ID); MDocType retValue = s_cache.get(ctx, C_DocType_ID, e -> new MDocType(ctx, e));
if (retValue == null) if (retValue != null)
{
retValue = new MDocType (ctx, C_DocType_ID, null);
s_cache.put(C_DocType_ID, retValue);
}
return retValue; return retValue;
retValue = new MDocType (ctx, C_DocType_ID, (String)null);
if (retValue.getC_DocType_ID() == C_DocType_ID)
{
s_cache.put(C_DocType_ID, retValue, e -> new MDocType(Env.getCtx(), e));
return retValue;
}
return null;
} // get } // get
/** Cache */ /** Cache */
static private CCache<Integer,MDocType> s_cache = new CCache<Integer,MDocType>(Table_Name, 20); static private ImmutableIntPOCache<Integer,MDocType> s_cache = new ImmutableIntPOCache<Integer,MDocType>(Table_Name, 20);
/************************************************************************** /**************************************************************************
* Standard Constructor * Standard Constructor
@ -163,6 +178,37 @@ public class MDocType extends X_C_DocType
setGL_Category_ID (); setGL_Category_ID ();
} // MDocType } // MDocType
/**
*
* @param copy
*/
public MDocType(MDocType copy)
{
this(Env.getCtx(), copy);
}
/**
*
* @param ctx
* @param copy
*/
public MDocType(Properties ctx, MDocType copy)
{
this(ctx, copy, (String) null);
}
/**
*
* @param ctx
* @param copy
* @param trxName
*/
public MDocType(Properties ctx, MDocType copy, String trxName)
{
this(ctx, 0, trxName);
copyPO(copy);
}
/** /**
* Set Default GL Category * Set Default GL Category
*/ */
@ -314,7 +360,7 @@ public class MDocType extends X_C_DocType
int relatedDocTypeId = 0; int relatedDocTypeId = 0;
if (docTypeId != 0) if (docTypeId != 0)
{ {
MDocType docType = MDocType.get(Env.getCtx(), docTypeId); MDocType docType = MDocType.get(docTypeId);
// FIXME: Should refactor code and remove the hard coded name // FIXME: Should refactor code and remove the hard coded name
// Should change document type to allow query the value // Should change document type to allow query the value
if ("Return Material".equals(docType.getName()) || if ("Return Material".equals(docType.getName()) ||
@ -368,4 +414,13 @@ public class MDocType extends X_C_DocType
return get_Translation (COLUMNNAME_Name, Env.getAD_Language(getCtx())); return get_Translation (COLUMNNAME_Name, Env.getAD_Language(getCtx()));
} // getNameTrl } // getNameTrl
@Override
public MDocType markImmutable() {
if (is_Immutable())
return this;
makeImmutable();
return this;
}
} // MDocType } // MDocType

View File

@ -21,9 +21,11 @@ import java.sql.ResultSet;
import java.util.Properties; import java.util.Properties;
import java.util.logging.Level; import java.util.logging.Level;
import org.compiere.util.CCache;
import org.compiere.util.CLogger; import org.compiere.util.CLogger;
import org.compiere.util.DB; import org.compiere.util.DB;
import org.compiere.util.Env;
import org.idempiere.cache.ImmutableIntPOCache;
import org.idempiere.cache.ImmutablePOSupport;
/** /**
@ -32,13 +34,12 @@ import org.compiere.util.DB;
* @author Jorg Janke * @author Jorg Janke
* @version $Id: MDocTypeCounter.java,v 1.3 2006/07/30 00:51:05 jjanke Exp $ * @version $Id: MDocTypeCounter.java,v 1.3 2006/07/30 00:51:05 jjanke Exp $
*/ */
public class MDocTypeCounter extends X_C_DocTypeCounter public class MDocTypeCounter extends X_C_DocTypeCounter implements ImmutablePOSupport
{ {
/** /**
* *
*/ */
private static final long serialVersionUID = 3469046560457430527L; private static final long serialVersionUID = 3999273279386464393L;
/** /**
* Get Counter document for document type * Get Counter document for document type
@ -59,7 +60,7 @@ public class MDocTypeCounter extends X_C_DocTypeCounter
// Indirect Relationship // Indirect Relationship
int Counter_C_DocType_ID = 0; int Counter_C_DocType_ID = 0;
MDocType dt = MDocType.get(ctx, C_DocType_ID); MDocType dt = MDocType.get(C_DocType_ID);
if (!dt.isCreateCounter()) if (!dt.isCreateCounter())
return -1; return -1;
String cDocBaseType = getCounterDocBaseType(dt.getDocBaseType()); String cDocBaseType = getCounterDocBaseType(dt.getDocBaseType());
@ -82,15 +83,23 @@ public class MDocTypeCounter extends X_C_DocTypeCounter
return Counter_C_DocType_ID; return Counter_C_DocType_ID;
} // getCounterDocType_ID } // getCounterDocType_ID
/** /**
* Get (first) valid Counter document for document type * Get (first) valid Counter document for document type
* @param ctx context * @param ctx ignore
* @param C_DocType_ID base document * @param C_DocType_ID base document
* @return counter document (may be invalid) or null * @return counter document (may be invalid) or null
*/ */
public static MDocTypeCounter getCounterDocType (Properties ctx, int C_DocType_ID) public static MDocTypeCounter getCounterDocType (Properties ctx, int C_DocType_ID)
{
return getCounterDocType(C_DocType_ID);
}
/**
* Get (first) valid Counter document for document type
* @param C_DocType_ID base document
* @return counter document (may be invalid) or null
*/
public static MDocTypeCounter getCounterDocType (int C_DocType_ID)
{ {
Integer key = Integer.valueOf(C_DocType_ID); Integer key = Integer.valueOf(C_DocType_ID);
MDocTypeCounter retValue = (MDocTypeCounter)s_counter.get(key); MDocTypeCounter retValue = (MDocTypeCounter)s_counter.get(key);
@ -109,12 +118,16 @@ public class MDocTypeCounter extends X_C_DocTypeCounter
rs = pstmt.executeQuery (); rs = pstmt.executeQuery ();
while (rs.next () && retValue == null) while (rs.next () && retValue == null)
{ {
retValue = new MDocTypeCounter (ctx, rs, null); retValue = new MDocTypeCounter (Env.getCtx(), rs, null);
if (!retValue.isCreateCounter() || !retValue.isValid()) if (!retValue.isCreateCounter() || !retValue.isValid())
{ {
temp = retValue; temp = retValue;
retValue = null; retValue = null;
} }
else
{
s_counter.put(key, retValue);
}
} }
} }
catch (Exception e) catch (Exception e)
@ -136,21 +149,46 @@ public class MDocTypeCounter extends X_C_DocTypeCounter
/** /**
* Get MDocTypeCounter from Cache * Get MDocTypeCounter from Cache
* @param ctx context
* @param C_DocTypeCounter_ID id * @param C_DocTypeCounter_ID id
* @return MDocTypeCounter * @return MDocTypeCounter
*/
public static MDocTypeCounter get (int C_DocTypeCounter_ID)
{
return get(C_DocTypeCounter_ID, (String)null);
}
/**
* Get MDocTypeCounter from Cache
* @param C_DocTypeCounter_ID id
* @param trxName transaction * @param trxName transaction
* @return MDocTypeCounter
*/
public static MDocTypeCounter get (int C_DocTypeCounter_ID, String trxName)
{
return get(Env.getCtx(), C_DocTypeCounter_ID, trxName);
}
/**
* Get MDocTypeCounter from Cache
* @param ctx context
* @param C_DocTypeCounter_ID id
* @param trxName
* @return MDocTypeCounter
*/ */
public static MDocTypeCounter get (Properties ctx, int C_DocTypeCounter_ID, String trxName) public static MDocTypeCounter get (Properties ctx, int C_DocTypeCounter_ID, String trxName)
{ {
Integer key = Integer.valueOf(C_DocTypeCounter_ID); Integer key = Integer.valueOf(C_DocTypeCounter_ID);
MDocTypeCounter retValue = (MDocTypeCounter) s_cache.get (key); MDocTypeCounter retValue = (MDocTypeCounter) s_cache.get (ctx, key, e -> new MDocTypeCounter(ctx, e));
if (retValue != null) if (retValue != null)
return retValue; return retValue;
retValue = new MDocTypeCounter (ctx, C_DocTypeCounter_ID, trxName); retValue = new MDocTypeCounter (ctx, C_DocTypeCounter_ID, trxName);
if (retValue.get_ID () != 0) if (retValue.get_ID () == C_DocTypeCounter_ID)
s_cache.put (key, retValue); {
s_cache.put(key, retValue, e -> new MDocTypeCounter(Env.getCtx(), e));
return retValue; return retValue;
}
return null;
} // get } // get
/** /**
@ -196,9 +234,9 @@ public class MDocTypeCounter extends X_C_DocTypeCounter
/** Object Cache */ /** Object Cache */
private static CCache<Integer,MDocTypeCounter> s_cache = new CCache<Integer,MDocTypeCounter>(Table_Name, 20); private static ImmutableIntPOCache<Integer,MDocTypeCounter> s_cache = new ImmutableIntPOCache<Integer,MDocTypeCounter>(Table_Name, 20);
/** Counter Relationship Cache */ /** Counter Relationship Cache */
private static CCache<Integer,MDocTypeCounter> s_counter = new CCache<Integer,MDocTypeCounter>(Table_Name, "C_DocTypeCounter_Relation", 20); private static ImmutableIntPOCache<Integer,MDocTypeCounter> s_counter = new ImmutableIntPOCache<Integer,MDocTypeCounter>(Table_Name, "C_DocTypeCounter_Relation", 20);
/** Static Logger */ /** Static Logger */
private static CLogger s_log = CLogger.getCLogger (MDocTypeCounter.class); private static CLogger s_log = CLogger.getCLogger (MDocTypeCounter.class);
@ -230,6 +268,36 @@ public class MDocTypeCounter extends X_C_DocTypeCounter
super(ctx, rs, trxName); super(ctx, rs, trxName);
} // MDocTypeCounter } // MDocTypeCounter
/**
*
* @param copy
*/
public MDocTypeCounter(MDocTypeCounter copy)
{
this(Env.getCtx(), copy);
}
/**
*
* @param ctx
* @param copy
*/
public MDocTypeCounter(Properties ctx, MDocTypeCounter copy)
{
this(ctx, copy, (String) null);
}
/**
*
* @param ctx
* @param copy
* @param trxName
*/
public MDocTypeCounter(Properties ctx, MDocTypeCounter copy, String trxName)
{
this(ctx, 0, trxName);
copyPO(copy);
}
/** /**
* Set C_DocType_ID * Set C_DocType_ID
@ -255,7 +323,7 @@ public class MDocTypeCounter extends X_C_DocTypeCounter
} // setCounter_C_DocType_ID } // setCounter_C_DocType_ID
/** /**
* Get Doc Type * Get Doc Type (immutable)
* @return doc type or null if not existing * @return doc type or null if not existing
*/ */
public MDocType getDocType() public MDocType getDocType()
@ -271,7 +339,7 @@ public class MDocTypeCounter extends X_C_DocTypeCounter
} // getDocType } // getDocType
/** /**
* Get Counter Doc Type * Get Counter Doc Type (immutable)
* @return counter doc type or null if not existing * @return counter doc type or null if not existing
*/ */
public MDocType getCounterDocType() public MDocType getCounterDocType()
@ -380,4 +448,13 @@ public class MDocTypeCounter extends X_C_DocTypeCounter
return true; return true;
} // beforeSave } // beforeSave
@Override
public MDocTypeCounter markImmutable() {
if (is_Immutable())
return this;
makeImmutable();
return this;
}
} // MDocTypeCounter } // MDocTypeCounter

View File

@ -32,13 +32,17 @@ package org.compiere.model;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.sql.SQLException; import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.List; import java.util.List;
import java.util.Properties; import java.util.Properties;
import java.util.stream.Collectors;
import org.compiere.util.CCache;
import org.compiere.util.CLogger; import org.compiere.util.CLogger;
import org.compiere.util.Env;
import org.idempiere.cache.ImmutableIntPOCache;
import org.idempiere.cache.ImmutablePOSupport;
import org.idempiere.cache.POCopyCache;
/** /**
* @author Trifon N. Trifonov * @author Trifon N. Trifonov
@ -50,18 +54,19 @@ import org.compiere.util.CLogger;
* <li>https://sourceforge.net/tracker/?func=detail&atid=879332&aid=2936561&group_id=176962 * <li>https://sourceforge.net/tracker/?func=detail&atid=879332&aid=2936561&group_id=176962
* *
*/ */
public class MEXPFormat extends X_EXP_Format { public class MEXPFormat extends X_EXP_Format implements ImmutablePOSupport {
/** /**
* *
*/ */
private static final long serialVersionUID = -5011042965945626099L; private static final long serialVersionUID = -2749091471654364602L;
/** Static Logger */ /** Static Logger */
@SuppressWarnings("unused") @SuppressWarnings("unused")
private static CLogger s_log = CLogger.getCLogger (MEXPFormat.class); private static CLogger s_log = CLogger.getCLogger (MEXPFormat.class);
private static CCache<String,MEXPFormat> s_cache = new CCache<String,MEXPFormat>(MEXPFormat.Table_Name, 50 ); private static POCopyCache<String,MEXPFormat> s_cache = new POCopyCache<String,MEXPFormat>(MEXPFormat.Table_Name, 50 );
private static CCache<Integer,MEXPFormat> exp_format_by_id_cache = new CCache<Integer,MEXPFormat>(MEXPFormat.Table_Name, 50); private static ImmutableIntPOCache<Integer,MEXPFormat> exp_format_by_id_cache = new ImmutableIntPOCache<Integer,MEXPFormat>(MEXPFormat.Table_Name, 50);
private List<MEXPFormatLine> m_lines = null; private List<MEXPFormatLine> m_lines = null;
private List<MEXPFormatLine> m_lines_unique = null; private List<MEXPFormatLine> m_lines_unique = null;
@ -75,6 +80,36 @@ public class MEXPFormat extends X_EXP_Format {
super (ctx, rs, trxName); super (ctx, rs, trxName);
} }
/**
*
* @param copy
*/
public MEXPFormat(MEXPFormat copy) {
this(Env.getCtx(), copy);
}
/**
*
* @param ctx
* @param copy
*/
public MEXPFormat(Properties ctx, MEXPFormat copy) {
this(ctx, copy, (String) null);
}
/**
*
* @param ctx
* @param copy
* @param trxName
*/
public MEXPFormat(Properties ctx, MEXPFormat copy, String trxName) {
this(ctx, 0, trxName);
copyPO(copy);
this.m_lines = copy.m_lines != null ? copy.m_lines.stream().map(e -> {return new MEXPFormatLine(ctx, e, trxName);}).collect(Collectors.toCollection(ArrayList::new)) : null;
this.m_lines_unique = copy.m_lines_unique != null ? copy.m_lines_unique.stream().map(e -> {return new MEXPFormatLine(ctx, e, trxName);}).collect(Collectors.toCollection(ArrayList::new)) : null;
}
public List<MEXPFormatLine> getFormatLines() { public List<MEXPFormatLine> getFormatLines() {
return getFormatLinesOrderedBy(X_EXP_FormatLine.COLUMNNAME_Position); return getFormatLinesOrderedBy(X_EXP_FormatLine.COLUMNNAME_Position);
} }
@ -92,6 +127,8 @@ public class MEXPFormat extends X_EXP_Format {
.setParameters(getEXP_Format_ID()) .setParameters(getEXP_Format_ID())
.setOrderBy(orderBy) .setOrderBy(orderBy)
.list(); .list();
if (is_Immutable() && m_lines.size() > 0)
m_lines.stream().forEach(e -> e.markImmutable());
return m_lines; return m_lines;
} }
@ -107,30 +144,62 @@ public class MEXPFormat extends X_EXP_Format {
.setParameters(getEXP_Format_ID(), "Y") .setParameters(getEXP_Format_ID(), "Y")
.setOrderBy(X_EXP_FormatLine.COLUMNNAME_Position) .setOrderBy(X_EXP_FormatLine.COLUMNNAME_Position)
.list(); .list();
if (is_Immutable() && m_lines_unique.size() > 0)
m_lines_unique.stream().forEach(e -> e.markImmutable());
return m_lines_unique; return m_lines_unique;
} }
/**
* Get MEXPFormat from cache (immutable)
* @param EXP_Format_ID
* @return MEXPFormat
*/
public static MEXPFormat get(int EXP_Format_ID)
{
return get(EXP_Format_ID, (String)null);
}
/**
* Get MEXPFormat from cache (immutable)
* @param EXP_Format_ID
* @param trxName
* @return MEXPFormat
*/
public static MEXPFormat get(int EXP_Format_ID, String trxName)
{
return get(Env.getCtx(), EXP_Format_ID, trxName);
}
/**
* Get MEXPFormat from cache (immutable)
* @param ctx
* @param EXP_Format_ID
* @param trxName
* @return MEXPFormat
*/
public static MEXPFormat get(Properties ctx, int EXP_Format_ID, String trxName) public static MEXPFormat get(Properties ctx, int EXP_Format_ID, String trxName)
{ {
MEXPFormat exp_format = exp_format_by_id_cache.get(EXP_Format_ID); MEXPFormat exp_format = exp_format_by_id_cache.get(ctx, EXP_Format_ID, e -> new MEXPFormat(ctx, e));
if(exp_format != null) if(exp_format != null)
return exp_format; return exp_format;
exp_format = new MEXPFormat(ctx, EXP_Format_ID , trxName); exp_format = new MEXPFormat(ctx, EXP_Format_ID , trxName);
if(exp_format!=null) if(exp_format.getEXP_Format_ID() == EXP_Format_ID)
{ {
exp_format.getFormatLines(); exp_format.getFormatLines();
exp_format_by_id_cache.put(EXP_Format_ID, exp_format); exp_format_by_id_cache.put(EXP_Format_ID, exp_format, e -> new MEXPFormat(Env.getCtx(), e));
}
return exp_format; return exp_format;
} }
return null;
}
public static MEXPFormat getFormatByValueAD_Client_IDAndVersion(Properties ctx, String value, int AD_Client_ID, String version, String trxName) public static MEXPFormat getFormatByValueAD_Client_IDAndVersion(Properties ctx, String value, int AD_Client_ID, String version, String trxName)
throws SQLException throws SQLException
{ {
String key = new String(value+version); String key = new String(value+version);
MEXPFormat retValue=null; MEXPFormat retValue=s_cache.get(key, e -> new MEXPFormat(ctx, e, trxName));
//if(retValue!=null) if (retValue != null)
// return retValue; return retValue;
StringBuilder whereClause = new StringBuilder(X_EXP_Format.COLUMNNAME_Value).append("=?") StringBuilder whereClause = new StringBuilder(X_EXP_Format.COLUMNNAME_Value).append("=?")
.append(" AND AD_Client_ID = ?") .append(" AND AD_Client_ID = ?")
@ -139,22 +208,21 @@ public class MEXPFormat extends X_EXP_Format {
retValue = (MEXPFormat) new Query(ctx,X_EXP_Format.Table_Name,whereClause.toString(),trxName) retValue = (MEXPFormat) new Query(ctx,X_EXP_Format.Table_Name,whereClause.toString(),trxName)
.setParameters(value,AD_Client_ID,version).first(); .setParameters(value,AD_Client_ID,version).first();
if(retValue != null) if (retValue != null)
{ {
retValue.getFormatLines(); retValue.getFormatLines();
s_cache.put (key, retValue); s_cache.put (key, retValue, e -> new MEXPFormat(Env.getCtx(), e));
exp_format_by_id_cache.put(retValue.getEXP_Format_ID(), retValue); exp_format_by_id_cache.put(retValue.getEXP_Format_ID(), new MEXPFormat(Env.getCtx(), retValue));
return retValue;
} }
return retValue; return null;
} }
public static MEXPFormat getFormatByAD_Client_IDAD_Table_IDAndVersion(Properties ctx, int AD_Client_ID, int AD_Table_ID, String version, String trxName) throws SQLException public static MEXPFormat getFormatByAD_Client_IDAD_Table_IDAndVersion(Properties ctx, int AD_Client_ID, int AD_Table_ID, String version, String trxName) throws SQLException
{ {
String key = new String(MTable.getTableName(ctx, AD_Table_ID)+version); String key = new String(MTable.getTableName(ctx, AD_Table_ID)+version);
MEXPFormat retValue=null; MEXPFormat retValue = s_cache.get(key, e -> new MEXPFormat(ctx, e, trxName));
retValue = (MEXPFormat)s_cache.get(key);
if(retValue!=null) if(retValue!=null)
return retValue; return retValue;
@ -168,11 +236,12 @@ public class MEXPFormat extends X_EXP_Format {
if(retValue!=null) if(retValue!=null)
{ {
retValue.getFormatLines(); retValue.getFormatLines();
s_cache.put (key, retValue); s_cache.put (key, retValue, e -> new MEXPFormat(Env.getCtx(), e));
exp_format_by_id_cache.put(retValue.getEXP_Format_ID(), retValue); exp_format_by_id_cache.put(retValue.getEXP_Format_ID(), new MEXPFormat(Env.getCtx(), retValue));
return retValue.markImmutable();
} }
return retValue; return null;
} }
@Override @Override
@ -196,4 +265,19 @@ public class MEXPFormat extends X_EXP_Format {
} }
return true; return true;
} // beforeDelete } // beforeDelete
@Override
public MEXPFormat markImmutable() {
if (is_Immutable())
return this;
makeImmutable();
if (m_lines != null && m_lines.size() > 0)
m_lines.stream().forEach(e -> e.markImmutable());
if (m_lines_unique != null && m_lines_unique.size() > 0)
m_lines_unique.stream().forEach(e -> e.markImmutable());
return this;
}
} }

View File

@ -37,15 +37,17 @@ import java.util.logging.Level;
import org.compiere.util.CLogger; import org.compiere.util.CLogger;
import org.compiere.util.DB; import org.compiere.util.DB;
import org.compiere.util.Env;
import org.idempiere.cache.ImmutablePOSupport;
/** /**
* @author Trifon N. Trifonov * @author Trifon N. Trifonov
*/ */
public class MEXPFormatLine extends X_EXP_FormatLine { public class MEXPFormatLine extends X_EXP_FormatLine implements ImmutablePOSupport {
/** /**
* *
*/ */
private static final long serialVersionUID = 1855089248134520749L; private static final long serialVersionUID = 2125885766063286714L;
/** Static Logger */ /** Static Logger */
private static CLogger s_log = CLogger.getCLogger (X_EXP_FormatLine.class); private static CLogger s_log = CLogger.getCLogger (X_EXP_FormatLine.class);
@ -59,6 +61,34 @@ public class MEXPFormatLine extends X_EXP_FormatLine {
super (ctx, rs, trxName); super (ctx, rs, trxName);
} }
/**
*
* @param copy
*/
public MEXPFormatLine(MEXPFormatLine copy) {
this(Env.getCtx(), copy);
}
/**
*
* @param ctx
* @param copy
*/
public MEXPFormatLine(Properties ctx, MEXPFormatLine copy) {
this(ctx, copy, (String) null);
}
/**
*
* @param ctx
* @param copy
* @param trxName
*/
public MEXPFormatLine(Properties ctx, MEXPFormatLine copy, String trxName) {
this(ctx, 0, trxName);
copyPO(copy);
}
@Override @Override
public String toString() { public String toString() {
StringBuilder sb = new StringBuilder ("X_EXP_FormatLine[ID=").append(get_ID()).append("; Value=").append(getValue()).append("; Type=").append(getType()).append("]"); StringBuilder sb = new StringBuilder ("X_EXP_FormatLine[ID=").append(get_ID()).append("; Value=").append(getValue()).append("; Type=").append(getType()).append("]");
@ -98,4 +128,14 @@ public class MEXPFormatLine extends X_EXP_FormatLine {
return result; return result;
} }
@Override
public MEXPFormatLine markImmutable() {
if (is_Immutable())
return this;
makeImmutable();
return this;
}
} }

View File

@ -22,6 +22,7 @@ import java.util.Properties;
import org.adempiere.exceptions.AdempiereException; import org.adempiere.exceptions.AdempiereException;
import org.compiere.util.DB; import org.compiere.util.DB;
import org.compiere.util.Env; import org.compiere.util.Env;
import org.idempiere.cache.ImmutablePOSupport;
/** /**
* Natural Account * Natural Account
@ -33,12 +34,12 @@ import org.compiere.util.Env;
* BF [ 1883533 ] Change to summary - valid combination issue * BF [ 1883533 ] Change to summary - valid combination issue
* BF [ 2320411 ] Translate "Already posted to" message * BF [ 2320411 ] Translate "Already posted to" message
*/ */
public class MElementValue extends X_C_ElementValue public class MElementValue extends X_C_ElementValue implements ImmutablePOSupport
{ {
/** /**
* *
*/ */
private static final long serialVersionUID = 4765839867934329276L; private static final long serialVersionUID = 6352667759697380460L;
/** /**
* Standard Constructor * Standard Constructor
@ -116,6 +117,37 @@ public class MElementValue extends X_C_ElementValue
set(imp); set(imp);
} // MElementValue } // MElementValue
/**
*
* @param copy
*/
public MElementValue(MElementValue copy)
{
this(Env.getCtx(), copy);
}
/**
*
* @param ctx
* @param copy
*/
public MElementValue(Properties ctx, MElementValue copy)
{
this(ctx, copy, (String) null);
}
/**
*
* @param ctx
* @param copy
* @param trxName
*/
public MElementValue(Properties ctx, MElementValue copy, String trxName)
{
this(ctx, 0, trxName);
copyPO(copy);
}
/** /**
* Set/Update Settings from import * Set/Update Settings from import
* @param imp import * @param imp import
@ -279,4 +311,13 @@ public class MElementValue extends X_C_ElementValue
return success; return success;
} // afterDelete } // afterDelete
@Override
public MElementValue markImmutable() {
if (is_Immutable())
return this;
makeImmutable();
return this;
}
} // MElementValue } // MElementValue

View File

@ -22,8 +22,10 @@ import static org.compiere.model.SystemIDs.ENTITYTYPE_DICTIONARY;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.util.Properties; import java.util.Properties;
import org.compiere.util.CCache;
import org.compiere.util.CLogger; import org.compiere.util.CLogger;
import org.compiere.util.Env;
import org.idempiere.cache.ImmutablePOSupport;
import org.idempiere.cache.ImmutablePOCache;
/** /**
* Enitity Type Model * Enitity Type Model
@ -39,34 +41,47 @@ import org.compiere.util.CLogger;
* <li>BF [ 2861194 ] EntityType is not using normal PO framework for getting IDs * <li>BF [ 2861194 ] EntityType is not using normal PO framework for getting IDs
* https://sourceforge.net/tracker/?func=detail&aid=2861194&group_id=176962&atid=879332 * https://sourceforge.net/tracker/?func=detail&aid=2861194&group_id=176962&atid=879332
*/ */
public class MEntityType extends X_AD_EntityType public class MEntityType extends X_AD_EntityType implements ImmutablePOSupport
{ {
/** /**
* *
*/ */
private static final long serialVersionUID = -8449015496292546851L; private static final long serialVersionUID = -7160389442572466581L;
/** /**
* Get EntityType object by name * Get EntityType object by name (immutable)
* @param entityType
* @return entity type
*/
public static MEntityType get(String entityType)
{
return get(Env.getCtx(), entityType);
}
/**
* Get EntityType object by name (immutable)
* @param ctx * @param ctx
* @param entityType * @param entityType
* @return * @return entity type
*/ */
public static MEntityType get(Properties ctx, String entityType) public static MEntityType get(Properties ctx, String entityType)
{ {
MEntityType retValue = (MEntityType) s_cache.get (entityType); MEntityType retValue = s_cache.get (ctx, entityType, e -> new MEntityType(ctx, e));
if (retValue != null) if (retValue != null)
return retValue; return retValue;
retValue = new Query(ctx, Table_Name, "EntityType=?", null) retValue = new Query(ctx, Table_Name, "EntityType=?", null)
.setParameters(entityType) .setParameters(entityType)
.firstOnly(); .firstOnly();
if (retValue != null) if (retValue != null)
s_cache.put (entityType, retValue); s_cache.put (entityType, retValue, e -> new MEntityType(Env.getCtx(), e));
return retValue; return retValue;
} }
/** Cached EntityTypes */ /** Cached EntityTypes */
private static CCache<String,MEntityType> s_cache = new CCache<String,MEntityType>(Table_Name, 20); private static ImmutablePOCache<String,MEntityType> s_cache = new ImmutablePOCache<String,MEntityType>(Table_Name, 20);
/** Logger */ /** Logger */
@SuppressWarnings("unused") @SuppressWarnings("unused")
private static CLogger s_log = CLogger.getCLogger (MEntityType.class); private static CLogger s_log = CLogger.getCLogger (MEntityType.class);
@ -93,6 +108,37 @@ public class MEntityType extends X_AD_EntityType
super (ctx, rs, trxName); super (ctx, rs, trxName);
} // MEntityType } // MEntityType
/**
*
* @param copy
*/
public MEntityType(MEntityType copy)
{
this(Env.getCtx(), copy);
}
/**
*
* @param ctx
* @param copy
*/
public MEntityType(Properties ctx, MEntityType copy)
{
this(ctx, copy, (String) null);
}
/**
*
* @param ctx
* @param copy
* @param trxName
*/
public MEntityType(Properties ctx, MEntityType copy, String trxName)
{
this(ctx, 0, trxName);
copyPO(copy);
}
/** /**
* First Not System Entity ID * First Not System Entity ID
* 10=D, 20=C, 100=U, 110=CUST, 200=A, 210=EXT, 220=XX etc * 10=D, 20=C, 100=U, 110=CUST, 200=A, 210=EXT, 220=XX etc
@ -183,4 +229,13 @@ public class MEntityType extends X_AD_EntityType
return true; return true;
} // beforeDelete } // beforeDelete
@Override
public MEntityType markImmutable() {
if (is_Immutable())
return this;
makeImmutable();
return this;
}
} // MEntityType } // MEntityType

View File

@ -19,7 +19,9 @@ package org.compiere.model;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.util.Properties; import java.util.Properties;
import org.compiere.util.CCache; import org.compiere.util.Env;
import org.idempiere.cache.ImmutableIntPOCache;
import org.idempiere.cache.ImmutablePOSupport;
/** /**
@ -28,36 +30,45 @@ import org.compiere.util.CCache;
* @author Jorg Janke * @author Jorg Janke
* @version $Id: MField.java,v 1.2 2006/07/30 00:58:04 jjanke Exp $ * @version $Id: MField.java,v 1.2 2006/07/30 00:58:04 jjanke Exp $
*/ */
public class MField extends X_AD_Field public class MField extends X_AD_Field implements ImmutablePOSupport
{ {
/** /**
* *
*/ */
private static final long serialVersionUID = 7243492167390659946L; private static final long serialVersionUID = -7382459987895129752L;
/** Cache */ /** Cache */
private static CCache<Integer,MField> s_cache = new CCache<Integer,MField>(Table_Name, 20); private static ImmutableIntPOCache<Integer,MField> s_cache = new ImmutableIntPOCache<Integer,MField>(Table_Name, 20);
/** /**
* *
* @param ctx
* @param AD_Field_ID * @param AD_Field_ID
* @return MField * @return MField (immutable)
*/
public static MField get(int AD_Field_ID)
{
return get(Env.getCtx(), AD_Field_ID);
}
/**
* @param ctx context
* @param AD_Field_ID
* @return Immutable instance of MField
*/ */
public static MField get(Properties ctx, int AD_Field_ID) public static MField get(Properties ctx, int AD_Field_ID)
{ {
Integer key = Integer.valueOf(AD_Field_ID); Integer key = Integer.valueOf(AD_Field_ID);
MField retValue = s_cache.get (key); MField retValue = s_cache.get (ctx, key, e -> new MField(ctx, e));
if (retValue != null && retValue.getCtx() == ctx) { if (retValue != null)
return retValue; return retValue;
}
retValue = new MField (ctx, AD_Field_ID, null); retValue = new MField (ctx, AD_Field_ID, (String)null);
if (retValue.get_ID () == AD_Field_ID) { if (retValue.get_ID () == AD_Field_ID) {
s_cache.put (key, retValue); s_cache.put (key, retValue, e -> new MField(Env.getCtx(), e));
}
return retValue; return retValue;
} }
return null;
}
/** /**
* Standard Constructor * Standard Constructor
@ -122,6 +133,37 @@ public class MField extends X_AD_Field
setEntityType(parent.getEntityType()); setEntityType(parent.getEntityType());
} // M_Field } // M_Field
/**
*
* @param copy
*/
public MField(MField copy)
{
this(Env.getCtx(), copy);
}
/**
*
* @param ctx
* @param copy
*/
public MField(Properties ctx, MField copy)
{
this(ctx, copy, (String) null);
}
/**
*
* @param ctx
* @param copy
* @param trxName
*/
public MField(Properties ctx, MField copy, String trxName)
{
this(ctx, 0, trxName);
copyPO(copy);
}
/** /**
* Set Column Values * Set Column Values
* @param column column * @param column column
@ -185,4 +227,13 @@ public class MField extends X_AD_Field
return true; return true;
} // beforeSave } // beforeSave
@Override
public MField markImmutable() {
if (is_Immutable())
return this;
makeImmutable();
return this;
}
} // MField } // MField

View File

@ -21,10 +21,11 @@ import java.sql.ResultSet;
import java.util.Properties; import java.util.Properties;
import java.util.logging.Level; import java.util.logging.Level;
import org.compiere.util.CCache;
import org.compiere.util.CLogger; import org.compiere.util.CLogger;
import org.compiere.util.DB; import org.compiere.util.DB;
import org.compiere.util.Env; import org.compiere.util.Env;
import org.idempiere.cache.ImmutableIntPOCache;
import org.idempiere.cache.ImmutablePOSupport;
/** /**
* GL Category * GL Category
@ -32,30 +33,42 @@ import org.compiere.util.Env;
* @author Jorg Janke * @author Jorg Janke
* @version $Id: MGLCategory.java,v 1.3 2006/07/30 00:51:03 jjanke Exp $ * @version $Id: MGLCategory.java,v 1.3 2006/07/30 00:51:03 jjanke Exp $
*/ */
public class MGLCategory extends X_GL_Category public class MGLCategory extends X_GL_Category implements ImmutablePOSupport
{ {
/** /**
* *
*/ */
private static final long serialVersionUID = -272365151811522531L; private static final long serialVersionUID = 7294511214194057235L;
/** /**
* Get MGLCategory from Cache * Get MGLCategory from Cache (immutable)
* @param ctx context
* @param GL_Category_ID id * @param GL_Category_ID id
* @return MGLCategory * @return MGLCategory
*/ */
public static MGLCategory get (int GL_Category_ID)
{
return get(Env.getCtx(), GL_Category_ID);
}
/**
* Get MGLCategory from Cache (immutable)
* @param ctx context
* @param GL_Category_ID id
* @return immutable instance of MGLCategory
*/
public static MGLCategory get (Properties ctx, int GL_Category_ID) public static MGLCategory get (Properties ctx, int GL_Category_ID)
{ {
Integer key = Integer.valueOf(GL_Category_ID); Integer key = Integer.valueOf(GL_Category_ID);
MGLCategory retValue = (MGLCategory)s_cache.get (key); MGLCategory retValue = s_cache.get (ctx, key, e -> new MGLCategory(ctx, e));
if (retValue != null) if (retValue != null)
return retValue; return retValue;
retValue = new MGLCategory (ctx, GL_Category_ID, null); retValue = new MGLCategory (ctx, GL_Category_ID, (String)null);
if (retValue.get_ID () != 0) if (retValue.get_ID () == GL_Category_ID)
s_cache.put (key, retValue); {
s_cache.put (key, retValue, e -> new MGLCategory(Env.getCtx(), e));
return retValue; return retValue;
}
return null;
} // get } // get
/** /**
@ -126,8 +139,8 @@ public class MGLCategory extends X_GL_Category
/** Logger */ /** Logger */
private static CLogger s_log = CLogger.getCLogger (MGLCategory.class); private static CLogger s_log = CLogger.getCLogger (MGLCategory.class);
/** Cache */ /** Cache */
private static CCache<Integer, MGLCategory> s_cache private static ImmutableIntPOCache<Integer, MGLCategory> s_cache
= new CCache<Integer, MGLCategory> (Table_Name, 5); = new ImmutableIntPOCache<Integer, MGLCategory> (Table_Name, 5);
/************************************************************************** /**************************************************************************
@ -158,6 +171,37 @@ public class MGLCategory extends X_GL_Category
super(ctx, rs, trxName); super(ctx, rs, trxName);
} // MGLCategory } // MGLCategory
/**
*
* @param copy
*/
public MGLCategory(MGLCategory copy)
{
this(Env.getCtx(), copy);
}
/**
*
* @param ctx
* @param copy
*/
public MGLCategory(Properties ctx, MGLCategory copy)
{
this(ctx, copy, (String) null);
}
/**
*
* @param ctx
* @param copy
* @param trxName
*/
public MGLCategory(Properties ctx, MGLCategory copy, String trxName)
{
this(ctx, 0, trxName);
copyPO(copy);
}
@Override @Override
public String toString() public String toString()
{ {
@ -169,4 +213,14 @@ public class MGLCategory extends X_GL_Category
.append("]"); .append("]");
return msgreturn.toString(); return msgreturn.toString();
} }
@Override
public MGLCategory markImmutable() {
if (is_Immutable())
return this;
makeImmutable();
return this;
}
} // MGLCategory } // MGLCategory

View File

@ -359,7 +359,7 @@ public class MGoal extends X_PA_Goal
public MMeasure getMeasure() public MMeasure getMeasure()
{ {
if (getPA_Measure_ID() != 0) if (getPA_Measure_ID() != 0)
return MMeasure.get(getCtx(), getPA_Measure_ID()); return MMeasure.get(getPA_Measure_ID());
return null; return null;
} // getMeasure } // getMeasure
@ -372,7 +372,7 @@ public class MGoal extends X_PA_Goal
public boolean updateGoal(boolean force) public boolean updateGoal(boolean force)
{ {
if (log.isLoggable(Level.CONFIG)) log.config("Force=" + force); if (log.isLoggable(Level.CONFIG)) log.config("Force=" + force);
MMeasure measure = MMeasure.get(getCtx(), getPA_Measure_ID()); MMeasure measure = MMeasure.get(getPA_Measure_ID());
boolean isUpdateByInterfal = false; boolean isUpdateByInterfal = false;
if (getDateLastRun() != null){ if (getDateLastRun() != null){
@ -385,7 +385,7 @@ public class MGoal extends X_PA_Goal
|| getDateLastRun() == null || getDateLastRun() == null
|| isUpdateByInterfal) || isUpdateByInterfal)
{ {
measure.set_TrxName(get_TrxName()); measure = new MMeasure(Env.getCtx(), measure, get_TrxName());
if (measure.updateGoals()) // saves if (measure.updateGoals()) // saves
{ {
load(get_ID(), get_TrxName()); load(get_ID(), get_TrxName());
@ -464,7 +464,7 @@ public class MGoal extends X_PA_Goal
*/ */
public MColorSchema getColorSchema() public MColorSchema getColorSchema()
{ {
return MColorSchema.get(getCtx(), getPA_ColorSchema_ID()); return MColorSchema.getCopy(getCtx(), getPA_ColorSchema_ID(), get_TrxName());
} }
/** /**

View File

@ -19,41 +19,70 @@ package org.compiere.model;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.util.Properties; import java.util.Properties;
import org.compiere.util.CCache; import org.compiere.util.Env;
import org.idempiere.cache.ImmutableIntPOCache;
import org.idempiere.cache.ImmutablePOSupport;
/** /**
* Request Group Model * Request Group Model
* @author Jorg Janke * @author Jorg Janke
* @version $Id: MGroup.java,v 1.2 2006/07/30 00:51:05 jjanke Exp $ * @version $Id: MGroup.java,v 1.2 2006/07/30 00:51:05 jjanke Exp $
*/ */
public class MGroup extends X_R_Group public class MGroup extends X_R_Group implements ImmutablePOSupport
{ {
/** /**
* *
*/ */
private static final long serialVersionUID = 3218102715154328611L; private static final long serialVersionUID = 9013217403211341916L;
/** /**
* Get MGroup from Cache * Get MGroup from Cache (immutable)
* @param ctx context
* @param R_Group_ID id * @param R_Group_ID id
* @return MGroup * @return MGroup
*/ */
public static MGroup get (int R_Group_ID)
{
return get(Env.getCtx(), R_Group_ID);
}
/**
* Get MGroup from Cache (immutable)
* @param ctx context
* @param R_Group_ID id
* @return Immutable instance of MGroup
*/
public static MGroup get (Properties ctx, int R_Group_ID) public static MGroup get (Properties ctx, int R_Group_ID)
{ {
Integer key = Integer.valueOf(R_Group_ID); Integer key = Integer.valueOf(R_Group_ID);
MGroup retValue = (MGroup) s_cache.get (key); MGroup retValue = s_cache.get (ctx, key, e -> new MGroup(ctx, e));
if (retValue != null) if (retValue != null)
return retValue; return retValue;
retValue = new MGroup (ctx, R_Group_ID, null); retValue = new MGroup (ctx, R_Group_ID, (String)null);
if (retValue.get_ID () != 0) if (retValue.get_ID () == R_Group_ID)
s_cache.put (key, retValue); {
s_cache.put (key, retValue, e -> new MGroup(Env.getCtx(), e));
return retValue; return retValue;
}
return null;
} // get } // get
/**
* Get updateable copy of MGroup from cache
* @param ctx
* @param R_Group_ID
* @param trxName
* @return MGroup
*/
public static MGroup getCopy(Properties ctx, int R_Group_ID, String trxName)
{
MGroup grp = get(ctx, R_Group_ID);
if (grp != null)
grp = new MGroup(ctx, grp, trxName);
return grp;
}
/** Cache */ /** Cache */
private static CCache<Integer,MGroup> s_cache = new CCache<Integer,MGroup>(Table_Name, 20); private static ImmutableIntPOCache<Integer,MGroup> s_cache = new ImmutableIntPOCache<Integer,MGroup>(Table_Name, 20);
/************************************************************************** /**************************************************************************
@ -78,4 +107,44 @@ public class MGroup extends X_R_Group
super (ctx, rs, trxName); super (ctx, rs, trxName);
} // MGroup } // MGroup
/**
*
* @param copy
*/
public MGroup(MGroup copy)
{
this(Env.getCtx(), copy);
}
/**
*
* @param ctx
* @param copy
*/
public MGroup(Properties ctx, MGroup copy)
{
this(ctx, copy, (String) null);
}
/**
*
* @param ctx
* @param copy
* @param trxName
*/
public MGroup(Properties ctx, MGroup copy, String trxName)
{
this(ctx, 0, trxName);
copyPO(copy);
}
@Override
public MGroup markImmutable() {
if (is_Immutable())
return this;
makeImmutable();
return this;
}
} // MGroup } // MGroup

View File

@ -19,7 +19,9 @@ package org.compiere.model;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.util.Properties; import java.util.Properties;
import org.compiere.util.CCache; import org.compiere.util.Env;
import org.idempiere.cache.ImmutableIntPOCache;
import org.idempiere.cache.ImmutablePOSupport;
/** /**
* Reporting Hierarchy Model * Reporting Hierarchy Model
@ -27,15 +29,25 @@ import org.compiere.util.CCache;
* @author Jorg Janke * @author Jorg Janke
* @version $Id: MHierarchy.java,v 1.2 2006/07/30 00:51:05 jjanke Exp $ * @version $Id: MHierarchy.java,v 1.2 2006/07/30 00:51:05 jjanke Exp $
*/ */
public class MHierarchy extends X_PA_Hierarchy public class MHierarchy extends X_PA_Hierarchy implements ImmutablePOSupport
{ {
/** /**
* *
*/ */
private static final long serialVersionUID = 3278979908976853690L; private static final long serialVersionUID = 7862096742442159952L;
/** /**
* Get MHierarchy from Cache * Get MHierarchy from Cache (immutable)
* @param PA_Hierarchy_ID id
* @return MHierarchy
*/
public static MHierarchy get (int PA_Hierarchy_ID)
{
return get(Env.getCtx(), PA_Hierarchy_ID);
}
/**
* Get MHierarchy (Immutable) from Cache
* @param ctx context * @param ctx context
* @param PA_Hierarchy_ID id * @param PA_Hierarchy_ID id
* @return MHierarchy * @return MHierarchy
@ -43,18 +55,21 @@ public class MHierarchy extends X_PA_Hierarchy
public static MHierarchy get (Properties ctx, int PA_Hierarchy_ID) public static MHierarchy get (Properties ctx, int PA_Hierarchy_ID)
{ {
Integer key = Integer.valueOf(PA_Hierarchy_ID); Integer key = Integer.valueOf(PA_Hierarchy_ID);
MHierarchy retValue = (MHierarchy)s_cache.get (key); MHierarchy retValue = (MHierarchy)s_cache.get (ctx, key, e -> new MHierarchy(ctx, e));
if (retValue != null) if (retValue != null)
return retValue; return retValue;
retValue = new MHierarchy (ctx, PA_Hierarchy_ID, null); retValue = new MHierarchy (ctx, PA_Hierarchy_ID, (String)null);
if (retValue.get_ID () != 0) if (retValue.get_ID () == PA_Hierarchy_ID)
s_cache.put (key, retValue); {
s_cache.put (key, retValue, e -> new MHierarchy(Env.getCtx(), e));
return retValue; return retValue;
}
return null;
} // get } // get
/** Cache */ /** Cache */
private static CCache<Integer, MHierarchy> s_cache private static ImmutableIntPOCache<Integer, MHierarchy> s_cache
= new CCache<Integer, MHierarchy> (Table_Name, 20); = new ImmutableIntPOCache<Integer, MHierarchy> (Table_Name, 20);
/** /**
* Default Constructor * Default Constructor
@ -78,6 +93,37 @@ public class MHierarchy extends X_PA_Hierarchy
super (ctx, rs, trxName); super (ctx, rs, trxName);
} // MHierarchy } // MHierarchy
/**
*
* @param copy
*/
public MHierarchy(MHierarchy copy)
{
this(Env.getCtx(), copy);
}
/**
*
* @param ctx
* @param copy
*/
public MHierarchy(Properties ctx, MHierarchy copy)
{
this(ctx, copy, (String) null);
}
/**
*
* @param ctx
* @param copy
* @param trxName
*/
public MHierarchy(Properties ctx, MHierarchy copy, String trxName)
{
this(ctx, 0, trxName);
copyPO(copy);
}
/** /**
* Get AD_Tree_ID based on tree type * Get AD_Tree_ID based on tree type
* @param TreeType Tree Type * @param TreeType Tree Type
@ -106,4 +152,13 @@ public class MHierarchy extends X_PA_Hierarchy
return 0; return 0;
} // getAD_Tree_ID } // getAD_Tree_ID
@Override
public MHierarchy markImmutable() {
if (is_Immutable())
return this;
makeImmutable();
return this;
}
} // MHierarchy } // MHierarchy

View File

@ -33,8 +33,9 @@ import javax.swing.Icon;
import javax.swing.ImageIcon; import javax.swing.ImageIcon;
import org.adempiere.base.Core; import org.adempiere.base.Core;
import org.compiere.util.CCache; import org.compiere.util.Env;
import org.compiere.util.Ini; import org.idempiere.cache.ImmutableIntPOCache;
import org.idempiere.cache.ImmutablePOSupport;
/** /**
* Image Model * Image Model
@ -43,17 +44,27 @@ import org.compiere.util.Ini;
* @author Jorg Janke * @author Jorg Janke
* @version $Id: MImage.java,v 1.5 2006/07/30 00:51:02 jjanke Exp $ * @version $Id: MImage.java,v 1.5 2006/07/30 00:51:02 jjanke Exp $
*/ */
public class MImage extends X_AD_Image public class MImage extends X_AD_Image implements ImmutablePOSupport
{ {
/** /**
* *
*/ */
private static final long serialVersionUID = -7361463683427300715L; private static final long serialVersionUID = 1850627989276185947L;
private MStorageProvider provider; private MStorageProvider provider;
/** /**
* Get MImage from Cache * Get MImage from Cache (immutable)
* @param AD_Image_ID id
* @return MImage
*/
public static MImage get (int AD_Image_ID)
{
return get(Env.getCtx(), AD_Image_ID);
}
/**
* Get MImage (Immutable) from Cache
* @param ctx context * @param ctx context
* @param AD_Image_ID id * @param AD_Image_ID id
* @return MImage * @return MImage
@ -64,17 +75,36 @@ public class MImage extends X_AD_Image
return new MImage (ctx, AD_Image_ID, null); return new MImage (ctx, AD_Image_ID, null);
// //
Integer key = Integer.valueOf(AD_Image_ID); Integer key = Integer.valueOf(AD_Image_ID);
MImage retValue = (MImage) s_cache.get (key); MImage retValue = s_cache.get (ctx, key, e -> new MImage(ctx, e));
if (retValue != null) if (retValue != null)
return retValue; return retValue;
retValue = new MImage (ctx, AD_Image_ID, null); retValue = new MImage (ctx, AD_Image_ID, (String)null);
if (retValue.get_ID () != 0 && Ini.isClient()) if (retValue.get_ID () == AD_Image_ID)
s_cache.put (key, retValue); {
s_cache.put (key, retValue, e -> new MImage(Env.getCtx(), e));
return retValue; return retValue;
}
return null;
} // get } // get
/**
* Get updateable copy of MImage from cache
* @param ctx context
* @param AD_Image_ID
* @param trxName transaction name
* @return MImage
*/
public static MImage getCopy(Properties ctx, int AD_Image_ID, String trxName)
{
MImage img = get(AD_Image_ID);
if (img != null && img.getAD_Image_ID() > 0)
img = new MImage(ctx, img, trxName);
return img;
}
/** Cache */ /** Cache */
private static CCache<Integer,MImage> s_cache = new CCache<Integer,MImage>(Table_Name, 20, 10); private static ImmutableIntPOCache<Integer,MImage> s_cache = new ImmutableIntPOCache<Integer,MImage>(Table_Name, 20, 10);
/** /**
* Constructor * Constructor
@ -102,6 +132,36 @@ public class MImage extends X_AD_Image
initImageStoreDetails(ctx, trxName); initImageStoreDetails(ctx, trxName);
} // MImage } // MImage
/**
*
* @param copy
*/
public MImage(MImage copy)
{
this(Env.getCtx(), copy);
}
/**
*
* @param ctx
* @param copy
*/
public MImage(Properties ctx, MImage copy)
{
this(ctx, copy, (String) null);
}
/**
*
* @param ctx
* @param copy
* @param trxName
*/
public MImage(Properties ctx, MImage copy, String trxName)
{
this(ctx, 0, trxName);
copyPO(copy);
}
/** The Image */ /** The Image */
private Image m_image = null; private Image m_image = null;
@ -375,4 +435,14 @@ public class MImage extends X_AD_Image
if (prov != null && prov.isPendingFlush()) if (prov != null && prov.isPendingFlush())
prov.flush(this, provider); prov.flush(this, provider);
} }
@Override
public MImage markImmutable() {
if (is_Immutable())
return this;
makeImmutable();
return this;
}
} // MImage } // MImage

View File

@ -32,18 +32,19 @@ import org.compiere.util.CLogger;
import org.compiere.util.DB; import org.compiere.util.DB;
import org.compiere.util.Env; import org.compiere.util.Env;
import org.compiere.util.Msg; import org.compiere.util.Msg;
import org.idempiere.cache.ImmutablePOSupport;
/** /**
* Import Template Model * Import Template Model
* *
* @author Carlos Ruiz - GlobalQSS * @author Carlos Ruiz - GlobalQSS
*/ */
public class MImportTemplate extends X_AD_ImportTemplate public class MImportTemplate extends X_AD_ImportTemplate implements ImmutablePOSupport
{ {
/** /**
* *
*/ */
private static final long serialVersionUID = -1207697938690504067L; private static final long serialVersionUID = -4681075469110529774L;
/** Logger */ /** Logger */
@SuppressWarnings("unused") @SuppressWarnings("unused")
@ -71,6 +72,37 @@ public class MImportTemplate extends X_AD_ImportTemplate
super(ctx, rs, trxName); super(ctx, rs, trxName);
} // MImportTemplate } // MImportTemplate
/**
*
* @param copy
*/
public MImportTemplate(MImportTemplate copy)
{
this(Env.getCtx(), copy);
}
/**
*
* @param ctx
* @param copy
*/
public MImportTemplate(Properties ctx, MImportTemplate copy)
{
this(ctx, copy, (String) null);
}
/**
*
* @param ctx
* @param copy
* @param trxName
*/
public MImportTemplate(Properties ctx, MImportTemplate copy, String trxName)
{
this(ctx, 0, trxName);
copyPO(copy);
}
@Override @Override
protected boolean beforeSave(boolean newRecord) { protected boolean beforeSave(boolean newRecord) {
// Validate character set vs supported // Validate character set vs supported
@ -112,6 +144,8 @@ public class MImportTemplate extends X_AD_ImportTemplate
.setParameters(Env.getAD_Client_ID(Env.getCtx()), tabid, roleid, roleid) .setParameters(Env.getAD_Client_ID(Env.getCtx()), tabid, roleid, roleid)
.setOrderBy("Name") .setOrderBy("Name")
.list(); .list();
if (retValue.size() > 0)
retValue.stream().forEach(e -> e.markImmutable());
s_cacheRoleTab.put(key, retValue); s_cacheRoleTab.put(key, retValue);
return retValue; return retValue;
} }
@ -202,4 +236,13 @@ public class MImportTemplate extends X_AD_ImportTemplate
return is; return is;
} }
@Override
public MImportTemplate markImmutable() {
if (is_Immutable())
return this;
makeImmutable();
return this;
}
} // MImportTemplate } // MImportTemplate

View File

@ -363,7 +363,7 @@ public class MInOutLine extends X_M_InOutLine
public MProduct getProduct() public MProduct getProduct()
{ {
if (m_product == null && getM_Product_ID() != 0) if (m_product == null && getM_Product_ID() != 0)
m_product = MProduct.get (getCtx(), getM_Product_ID()); m_product = MProduct.getCopy(getCtx(), getM_Product_ID(), get_TrxName());
return m_product; return m_product;
} // getProduct } // getProduct

View File

@ -224,9 +224,6 @@ public class MInfoColumn extends X_AD_InfoColumn implements IInfoColumn
@Override @Override
public I_AD_Val_Rule getAD_Val_Rule() throws RuntimeException { public I_AD_Val_Rule getAD_Val_Rule() throws RuntimeException {
if (get_TrxName() != null) return MValRule.getCopy(getCtx(), getAD_Val_Rule_ID(), get_TrxName());
return new MValRule(getCtx(), getAD_Val_Rule_ID(), get_TrxName());
else
return MValRule.get(getCtx(), getAD_Val_Rule_ID());
} }
} // MInfoColumn } // MInfoColumn

View File

@ -23,9 +23,11 @@ import java.util.ArrayList;
import java.util.Properties; import java.util.Properties;
import java.util.logging.Level; import java.util.logging.Level;
import org.compiere.util.CCache;
import org.compiere.util.CLogger; import org.compiere.util.CLogger;
import org.compiere.util.DB; import org.compiere.util.DB;
import org.compiere.util.Env;
import org.idempiere.cache.ImmutableIntPOCache;
import org.idempiere.cache.ImmutablePOSupport;
/** /**
* Interest Area. * Interest Area.
@ -36,13 +38,12 @@ import org.compiere.util.DB;
* @author Jorg Janke * @author Jorg Janke
* @version $Id: MInterestArea.java,v 1.3 2006/07/30 00:51:05 jjanke Exp $ * @version $Id: MInterestArea.java,v 1.3 2006/07/30 00:51:05 jjanke Exp $
*/ */
public class MInterestArea extends X_R_InterestArea public class MInterestArea extends X_R_InterestArea implements ImmutablePOSupport
{ {
/** /**
* *
*/ */
private static final long serialVersionUID = -6910076559329764930L; private static final long serialVersionUID = -8171678779149295978L;
/** /**
* Get all active interest areas * Get all active interest areas
@ -80,9 +81,18 @@ public class MInterestArea extends X_R_InterestArea
return retValue; return retValue;
} // getAll } // getAll
/**
* Get MInterestArea from Cache (immutable)
* @param R_InterestArea_ID id
* @return MInterestArea
*/
public static MInterestArea get (int R_InterestArea_ID)
{
return get(Env.getCtx(), R_InterestArea_ID);
}
/** /**
* Get MInterestArea from Cache * Get MInterestArea from Cache (immutable)
* @param ctx context * @param ctx context
* @param R_InterestArea_ID id * @param R_InterestArea_ID id
* @return MInterestArea * @return MInterestArea
@ -90,18 +100,21 @@ public class MInterestArea extends X_R_InterestArea
public static MInterestArea get (Properties ctx, int R_InterestArea_ID) public static MInterestArea get (Properties ctx, int R_InterestArea_ID)
{ {
Integer key = Integer.valueOf(R_InterestArea_ID); Integer key = Integer.valueOf(R_InterestArea_ID);
MInterestArea retValue = (MInterestArea) s_cache.get (key); MInterestArea retValue = s_cache.get (ctx, key, e -> new MInterestArea(ctx, e));
if (retValue != null) if (retValue != null)
return retValue; return retValue;
retValue = new MInterestArea (ctx, R_InterestArea_ID, null); retValue = new MInterestArea (Env.getCtx(), R_InterestArea_ID, (String)null);
if (retValue.get_ID () != 0) if (retValue.get_ID () == R_InterestArea_ID)
s_cache.put (key, retValue); {
s_cache.put (key, retValue, e -> new MInterestArea(Env.getCtx(), e));
return retValue; return retValue;
}
return null;
} // get } // get
/** Cache */ /** Cache */
private static CCache<Integer,MInterestArea> s_cache = private static ImmutableIntPOCache<Integer,MInterestArea> s_cache =
new CCache<Integer,MInterestArea>(Table_Name, 5); new ImmutableIntPOCache<Integer,MInterestArea>(Table_Name, 5);
/** Logger */ /** Logger */
private static CLogger s_log = CLogger.getCLogger (MInterestArea.class); private static CLogger s_log = CLogger.getCLogger (MInterestArea.class);
@ -134,6 +147,39 @@ public class MInterestArea extends X_R_InterestArea
super(ctx, rs, trxName); super(ctx, rs, trxName);
} // MInterestArea } // MInterestArea
/**
*
* @param copy
*/
public MInterestArea(MInterestArea copy)
{
this(Env.getCtx(), copy);
}
/**
*
* @param ctx
* @param copy
*/
public MInterestArea(Properties ctx, MInterestArea copy)
{
this(ctx, copy, (String) null);
}
/**
*
* @param ctx
* @param copy
* @param trxName
*/
public MInterestArea(Properties ctx, MInterestArea copy, String trxName)
{
this(ctx, 0, trxName);
copyPO(copy);
this.m_AD_User_ID = copy.m_AD_User_ID;
this.m_ci = copy.m_ci != null ? new MContactInterest(ctx, copy.m_ci, trxName) : null;
}
/** /**
* Get Value * Get Value
@ -228,4 +274,13 @@ public class MInterestArea extends X_R_InterestArea
return m_ci.isSubscribed(); return m_ci.isSubscribed();
} // isSubscribed } // isSubscribed
@Override
public MInterestArea markImmutable() {
if (is_Immutable())
return this;
makeImmutable();
return this;
}
} // MInterestArea } // MInterestArea

View File

@ -20,6 +20,7 @@ import java.io.File;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.sql.Timestamp; import java.sql.Timestamp;
import java.util.Arrays;
import java.util.List; import java.util.List;
import java.util.Properties; import java.util.Properties;
import java.util.logging.Level; import java.util.logging.Level;
@ -28,7 +29,6 @@ import org.adempiere.exceptions.NegativeInventoryDisallowedException;
import org.adempiere.exceptions.PeriodClosedException; import org.adempiere.exceptions.PeriodClosedException;
import org.compiere.process.DocAction; import org.compiere.process.DocAction;
import org.compiere.process.DocumentEngine; import org.compiere.process.DocumentEngine;
import org.compiere.util.CCache;
import org.compiere.util.CLogger; import org.compiere.util.CLogger;
import org.compiere.util.DB; import org.compiere.util.DB;
import org.compiere.util.Env; import org.compiere.util.Env;
@ -54,32 +54,36 @@ public class MInventory extends X_M_Inventory implements DocAction
/** /**
* *
*/ */
private static final long serialVersionUID = 4395759120481570701L; private static final long serialVersionUID = 3877357565525655884L;
/** Reversal Indicator */ /** Reversal Indicator */
public static String REVERSE_INDICATOR = "^"; public static String REVERSE_INDICATOR = "^";
/** /**
* Get Inventory from Cache * Get Inventory
* @param M_Inventory_ID id
* @return MInventory
*/
public static MInventory get (int M_Inventory_ID)
{
return get(Env.getCtx(), M_Inventory_ID);
}
/**
* Get Inventory
* @param ctx context * @param ctx context
* @param M_Inventory_ID id * @param M_Inventory_ID id
* @return MInventory * @return MInventory
*/ */
public static MInventory get (Properties ctx, int M_Inventory_ID) public static MInventory get (Properties ctx, int M_Inventory_ID)
{ {
Integer key = Integer.valueOf(M_Inventory_ID); MInventory inventory = new MInventory(ctx, M_Inventory_ID, (String)null);
MInventory retValue = (MInventory) s_cache.get (key); if (inventory.get_ID() == M_Inventory_ID)
if (retValue != null) return inventory;
return retValue; else
retValue = new MInventory (ctx, M_Inventory_ID, null); return null;
if (retValue.get_ID () != 0)
s_cache.put (key, retValue);
return retValue;
} // get } // get
/** Cache */
protected static CCache<Integer,MInventory> s_cache = new CCache<Integer,MInventory>(Table_Name, 5, 5);
/** /**
* Standard Constructor * Standard Constructor
* @param ctx context * @param ctx context
@ -136,6 +140,37 @@ public class MInventory extends X_M_Inventory implements DocAction
setM_Warehouse_ID(wh.getM_Warehouse_ID()); setM_Warehouse_ID(wh.getM_Warehouse_ID());
} }
/**
*
* @param copy
*/
public MInventory(MInventory copy)
{
this(Env.getCtx(), copy);
}
/**
*
* @param ctx
* @param copy
*/
public MInventory(Properties ctx, MInventory copy)
{
this(ctx, copy, (String) null);
}
/**
*
* @param ctx
* @param copy
* @param trxName
*/
public MInventory(Properties ctx, MInventory copy, String trxName)
{
this(ctx, 0, trxName);
copyPO(copy);
this.m_lines = copy.m_lines != null ? Arrays.stream(copy.m_lines).map(e -> {var v = new MInventoryLine(ctx, e, trxName); v.setParent(this); return v;}).toArray(MInventoryLine[]::new) : null;
}
/** Lines */ /** Lines */
protected MInventoryLine[] m_lines = null; protected MInventoryLine[] m_lines = null;
@ -205,7 +240,7 @@ public class MInventory extends X_M_Inventory implements DocAction
*/ */
public String getDocumentInfo() public String getDocumentInfo()
{ {
MDocType dt = MDocType.get(getCtx(), getC_DocType_ID()); MDocType dt = MDocType.get(getC_DocType_ID());
StringBuilder msgreturn = new StringBuilder().append(dt.getNameTrl()).append(" ").append(getDocumentNo()); StringBuilder msgreturn = new StringBuilder().append(dt.getNameTrl()).append(" ").append(getDocumentNo());
return msgreturn.toString(); return msgreturn.toString();
} // getDocumentInfo } // getDocumentInfo
@ -353,7 +388,7 @@ public class MInventory extends X_M_Inventory implements DocAction
if (product != null && product.isASIMandatory(line.isSOTrx())) if (product != null && product.isASIMandatory(line.isSOTrx()))
{ {
if (product.getAttributeSet() != null && !product.getAttributeSet().excludeTableEntry(MInventoryLine.Table_ID, line.isSOTrx())) { if (product.getAttributeSet() != null && !product.getAttributeSet().excludeTableEntry(MInventoryLine.Table_ID, line.isSOTrx())) {
MDocType dt = MDocType.get(getCtx(), getC_DocType_ID()); MDocType dt = MDocType.get(getC_DocType_ID());
String docSubTypeInv = dt.getDocSubTypeInv(); String docSubTypeInv = dt.getDocSubTypeInv();
BigDecimal qtyDiff = line.getQtyInternalUse(); BigDecimal qtyDiff = line.getQtyInternalUse();
if (MDocType.DOCSUBTYPEINV_PhysicalInventory.equals(docSubTypeInv)) if (MDocType.DOCSUBTYPEINV_PhysicalInventory.equals(docSubTypeInv))
@ -417,7 +452,7 @@ public class MInventory extends X_M_Inventory implements DocAction
*/ */
public String completeIt() public String completeIt()
{ {
MDocType dt = MDocType.get(getCtx(), getC_DocType_ID()); MDocType dt = MDocType.get(getC_DocType_ID());
String docSubTypeInv = dt.getDocSubTypeInv(); String docSubTypeInv = dt.getDocSubTypeInv();
if (Util.isEmpty(docSubTypeInv)) { if (Util.isEmpty(docSubTypeInv)) {
m_processMsg = "Document inventory subtype not configured, cannot complete"; m_processMsg = "Document inventory subtype not configured, cannot complete";
@ -665,7 +700,7 @@ public class MInventory extends X_M_Inventory implements DocAction
* Set the definite document number after completed * Set the definite document number after completed
*/ */
protected void setDefiniteDocumentNo() { protected void setDefiniteDocumentNo() {
MDocType dt = MDocType.get(getCtx(), getC_DocType_ID()); MDocType dt = MDocType.get(getC_DocType_ID());
if (dt.isOverwriteDateOnComplete()) { if (dt.isOverwriteDateOnComplete()) {
setMovementDate(TimeUtil.getDay(0)); setMovementDate(TimeUtil.getDay(0));
MPeriod.testPeriodOpen(getCtx(), getMovementDate(), MDocType.DOCBASETYPE_MaterialPhysicalInventory, getAD_Org_ID()); MPeriod.testPeriodOpen(getCtx(), getMovementDate(), MDocType.DOCBASETYPE_MaterialPhysicalInventory, getAD_Org_ID());
@ -958,7 +993,7 @@ public class MInventory extends X_M_Inventory implements DocAction
reversalDate = new Timestamp(System.currentTimeMillis()); reversalDate = new Timestamp(System.currentTimeMillis());
} }
MDocType dt = MDocType.get(getCtx(), getC_DocType_ID()); MDocType dt = MDocType.get(getC_DocType_ID());
MPeriod.testPeriodOpen(getCtx(), reversalDate, dt.getDocBaseType(), getAD_Org_ID()); MPeriod.testPeriodOpen(getCtx(), reversalDate, dt.getDocBaseType(), getAD_Org_ID());
// Deep Copy // Deep Copy

View File

@ -41,7 +41,7 @@ public class MInventoryLine extends X_M_InventoryLine
/** /**
* *
*/ */
private static final long serialVersionUID = 7083622834698840042L; private static final long serialVersionUID = 3973418005721380194L;
/** /**
* Get Inventory Line with parameters * Get Inventory Line with parameters
@ -137,6 +137,39 @@ public class MInventoryLine extends X_M_InventoryLine
this(inventory, M_Locator_ID, M_Product_ID, M_AttributeSetInstance_ID, QtyBook, QtyCount, null); this(inventory, M_Locator_ID, M_Product_ID, M_AttributeSetInstance_ID, QtyBook, QtyCount, null);
} }
/**
*
* @param copy
*/
public MInventoryLine(MInventoryLine copy)
{
this(Env.getCtx(), copy);
}
/**
*
* @param ctx
* @param copy
*/
public MInventoryLine(Properties ctx, MInventoryLine copy)
{
this(ctx, copy, (String) null);
}
/**
*
* @param ctx
* @param copy
* @param trxName
*/
public MInventoryLine(Properties ctx, MInventoryLine copy, String trxName)
{
this(ctx, 0, trxName);
copyPO(copy);
this.m_parent = null;
this.m_product = copy.m_product != null ? new MProduct(ctx, copy.m_product, trxName) : null;
}
/** Manually created */ /** Manually created */
//protected boolean m_isManualEntry = true; //protected boolean m_isManualEntry = true;
/** Parent */ /** Parent */
@ -156,7 +189,9 @@ public class MInventoryLine extends X_M_InventoryLine
if (m_product != null && m_product.getM_Product_ID() != M_Product_ID) if (m_product != null && m_product.getM_Product_ID() != M_Product_ID)
m_product = null; // reset m_product = null; // reset
if (m_product == null) if (m_product == null)
m_product = MProduct.get(getCtx(), M_Product_ID); {
m_product = MProduct.getCopy(getCtx(), M_Product_ID, get_TrxName());
}
return m_product; return m_product;
} // getProduct } // getProduct
@ -461,4 +496,5 @@ public class MInventoryLine extends X_M_InventoryLine
public boolean isSOTrx() { public boolean isSOTrx() {
return getMovementQty().signum() < 0; return getMovementQty().signum() < 0;
} }
} // MInventoryLine } // MInventoryLine

View File

@ -24,6 +24,7 @@ import java.sql.ResultSet;
import java.sql.SQLException; import java.sql.SQLException;
import java.sql.Timestamp; import java.sql.Timestamp;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays;
import java.util.Hashtable; import java.util.Hashtable;
import java.util.List; import java.util.List;
import java.util.Properties; import java.util.Properties;
@ -41,7 +42,6 @@ import org.compiere.process.DocAction;
import org.compiere.process.DocumentEngine; import org.compiere.process.DocumentEngine;
import org.compiere.process.ProcessInfo; import org.compiere.process.ProcessInfo;
import org.compiere.process.ServerProcessCtl; import org.compiere.process.ServerProcessCtl;
import org.compiere.util.CCache;
import org.compiere.util.CLogger; import org.compiere.util.CLogger;
import org.compiere.util.DB; import org.compiere.util.DB;
import org.compiere.util.Env; import org.compiere.util.Env;
@ -69,7 +69,7 @@ public class MInvoice extends X_C_Invoice implements DocAction
/** /**
* *
*/ */
private static final long serialVersionUID = 5581441980246794522L; private static final long serialVersionUID = -261338363319970683L;
/** /**
* Get Payments Of BPartner * Get Payments Of BPartner
@ -163,7 +163,7 @@ public class MInvoice extends X_C_Invoice implements DocAction
if (counter) if (counter)
{ {
to.setRef_Invoice_ID(from.getC_Invoice_ID()); to.setRef_Invoice_ID(from.getC_Invoice_ID());
MOrg org = MOrg.get(from.getCtx(), from.getAD_Org_ID()); MOrg org = MOrg.get(from.getAD_Org_ID());
int counterC_BPartner_ID = org.getLinkedC_BPartner_ID(trxName); int counterC_BPartner_ID = org.getLinkedC_BPartner_ID(trxName);
if (counterC_BPartner_ID == 0) if (counterC_BPartner_ID == 0)
return null; return null;
@ -239,29 +239,31 @@ public class MInvoice extends X_C_Invoice implements DocAction
return sb.toString(); return sb.toString();
} // getPDFFileName } // getPDFFileName
/**
* Get MInvoice from db
* @param C_Invoice_ID id
* @return MInvoice
*/
public static MInvoice get (int C_Invoice_ID)
{
return get(Env.getCtx(), C_Invoice_ID);
}
/** /**
* Get MInvoice from Cache * Get MInvoice from db
* @param ctx context
* @param C_Invoice_ID id * @param C_Invoice_ID id
* @return MInvoice * @return MInvoice
*/ */
public static MInvoice get (Properties ctx, int C_Invoice_ID) public static MInvoice get (Properties ctx, int C_Invoice_ID)
{ {
Integer key = Integer.valueOf(C_Invoice_ID); MInvoice retValue = new MInvoice(ctx, C_Invoice_ID, (String)null);
MInvoice retValue = (MInvoice) s_cache.get (key); if (retValue.get_ID () == C_Invoice_ID)
if (retValue != null) {
return retValue;
retValue = new MInvoice (ctx, C_Invoice_ID, null);
if (retValue.get_ID () != 0)
s_cache.put (key, retValue);
return retValue; return retValue;
}
return null;
} // get } // get
/** Cache */
private static CCache<Integer,MInvoice> s_cache = new CCache<Integer,MInvoice>(Table_Name, 20, 2); // 2 minutes
/************************************************************************** /**************************************************************************
* Invoice Constructor * Invoice Constructor
* @param ctx context * @param ctx context
@ -327,7 +329,7 @@ public class MInvoice extends X_C_Invoice implements DocAction
// //
if (C_DocTypeTarget_ID <= 0) if (C_DocTypeTarget_ID <= 0)
{ {
MDocType odt = MDocType.get(order.getCtx(), order.getC_DocType_ID()); MDocType odt = MDocType.get(order.getC_DocType_ID());
if (odt != null) if (odt != null)
{ {
C_DocTypeTarget_ID = odt.getC_DocTypeInvoice_ID(); C_DocTypeTarget_ID = odt.getC_DocTypeInvoice_ID();
@ -410,6 +412,40 @@ public class MInvoice extends X_C_Invoice implements DocAction
setAD_User_ID(line.getAD_User_ID()); setAD_User_ID(line.getAD_User_ID());
} // MInvoice } // MInvoice
/**
*
* @param copy
*/
public MInvoice(MInvoice copy)
{
this(Env.getCtx(), copy);
}
/**
*
* @param ctx
* @param copy
*/
public MInvoice(Properties ctx, MInvoice copy)
{
this(ctx, copy, (String) null);
}
/**
*
* @param ctx
* @param copy
* @param trxName
*/
public MInvoice(Properties ctx, MInvoice copy, String trxName)
{
this(ctx, 0, trxName);
copyPO(copy);
this.m_openAmt = copy.m_openAmt;
this.m_lines = copy.m_lines != null ? Arrays.stream(copy.m_lines).map(e -> {var v = new MInvoiceLine(ctx, e, trxName); v.m_parent=this; return v;}).toArray(MInvoiceLine[]::new) : null;
this.m_taxes = copy.m_taxes != null ? Arrays.stream(copy.m_taxes).map(e -> {return new MInvoiceTax(ctx, e, trxName);}).toArray(MInvoiceTax[]::new) : null;
}
/** Open Amount */ /** Open Amount */
private BigDecimal m_openAmt = null; private BigDecimal m_openAmt = null;
@ -559,7 +595,7 @@ public class MInvoice extends X_C_Invoice implements DocAction
setPaymentRule(order.getPaymentRule()); setPaymentRule(order.getPaymentRule());
setC_PaymentTerm_ID(order.getC_PaymentTerm_ID()); setC_PaymentTerm_ID(order.getC_PaymentTerm_ID());
// //
MDocType dt = MDocType.get(getCtx(), order.getC_DocType_ID()); MDocType dt = MDocType.get(order.getC_DocType_ID());
if (dt.getC_DocTypeInvoice_ID() != 0) if (dt.getC_DocTypeInvoice_ID() != 0)
setC_DocTypeTarget_ID(dt.getC_DocTypeInvoice_ID()); setC_DocTypeTarget_ID(dt.getC_DocTypeInvoice_ID());
// Overwrite Invoice BPartner // Overwrite Invoice BPartner
@ -577,7 +613,7 @@ public class MInvoice extends X_C_Invoice implements DocAction
MRMA rma = new MRMA(getCtx(), ship.getM_RMA_ID(), get_TrxName()); MRMA rma = new MRMA(getCtx(), ship.getM_RMA_ID(), get_TrxName());
// Retrieves the invoice DocType // Retrieves the invoice DocType
MDocType dt = MDocType.get(getCtx(), rma.getC_DocType_ID()); MDocType dt = MDocType.get(rma.getC_DocType_ID());
if (dt.getC_DocTypeInvoice_ID() != 0) if (dt.getC_DocTypeInvoice_ID() != 0)
{ {
setC_DocTypeTarget_ID(dt.getC_DocTypeInvoice_ID()); setC_DocTypeTarget_ID(dt.getC_DocTypeInvoice_ID());
@ -694,7 +730,9 @@ public class MInvoice extends X_C_Invoice implements DocAction
public MInvoiceLine[] getLines (boolean requery) public MInvoiceLine[] getLines (boolean requery)
{ {
if (m_lines == null || m_lines.length == 0 || requery) if (m_lines == null || m_lines.length == 0 || requery)
{
m_lines = getLines(null); m_lines = getLines(null);
}
set_TrxName(m_lines, get_TrxName()); set_TrxName(m_lines, get_TrxName());
return m_lines; return m_lines;
} // getLines } // getLines
@ -873,8 +911,7 @@ public class MInvoice extends X_C_Invoice implements DocAction
*/ */
public boolean isCreditMemo() public boolean isCreditMemo()
{ {
MDocType dt = MDocType.get(getCtx(), MDocType dt = MDocType.get(getC_DocType_ID()==0 ? getC_DocTypeTarget_ID() : getC_DocType_ID());
getC_DocType_ID()==0 ? getC_DocTypeTarget_ID() : getC_DocType_ID());
return MDocType.DOCBASETYPE_APCreditMemo.equals(dt.getDocBaseType()) return MDocType.DOCBASETYPE_APCreditMemo.equals(dt.getDocBaseType())
|| MDocType.DOCBASETYPE_ARCreditMemo.equals(dt.getDocBaseType()); || MDocType.DOCBASETYPE_ARCreditMemo.equals(dt.getDocBaseType());
} // isCreditMemo } // isCreditMemo
@ -2236,7 +2273,7 @@ public class MInvoice extends X_C_Invoice implements DocAction
private void setDefiniteDocumentNo() { private void setDefiniteDocumentNo() {
if (isReversal() && ! MSysConfig.getBooleanValue(MSysConfig.Invoice_ReverseUseNewNumber, true, getAD_Client_ID())) // IDEMPIERE-1771 if (isReversal() && ! MSysConfig.getBooleanValue(MSysConfig.Invoice_ReverseUseNewNumber, true, getAD_Client_ID())) // IDEMPIERE-1771
return; return;
MDocType dt = MDocType.get(getCtx(), getC_DocType_ID()); MDocType dt = MDocType.get(getC_DocType_ID());
if (dt.isOverwriteDateOnComplete()) { if (dt.isOverwriteDateOnComplete()) {
setDateInvoiced(TimeUtil.getDay(0)); setDateInvoiced(TimeUtil.getDay(0));
if (getDateAcct().before(getDateInvoiced())) { if (getDateAcct().before(getDateInvoiced())) {
@ -2262,7 +2299,7 @@ public class MInvoice extends X_C_Invoice implements DocAction
return null; return null;
// Org Must be linked to BPartner // Org Must be linked to BPartner
MOrg org = MOrg.get(getCtx(), getAD_Org_ID()); MOrg org = MOrg.get(getAD_Org_ID());
int counterC_BPartner_ID = org.getLinkedC_BPartner_ID(get_TrxName()); int counterC_BPartner_ID = org.getLinkedC_BPartner_ID(get_TrxName());
if (counterC_BPartner_ID == 0) if (counterC_BPartner_ID == 0)
return null; return null;

View File

@ -162,6 +162,49 @@ public class MInvoiceLine extends X_C_InvoiceLine
super(ctx, rs, trxName); super(ctx, rs, trxName);
} // MInvoiceLine } // MInvoiceLine
/**
*
* @param copy
*/
public MInvoiceLine(MInvoiceLine copy)
{
this(Env.getCtx(), copy);
}
/**
*
* @param ctx
* @param copy
*/
public MInvoiceLine(Properties ctx, MInvoiceLine copy)
{
this(ctx, copy, (String) null);
}
/**
*
* @param ctx
* @param copy
* @param trxName
*/
public MInvoiceLine(Properties ctx, MInvoiceLine copy, String trxName)
{
this(ctx, 0, trxName);
copyPO(copy);
this.m_tax = copy.m_tax != null ? new MTax(ctx, copy.m_tax, trxName) : null;
this.m_M_PriceList_ID = copy.m_M_PriceList_ID;
this.m_DateInvoiced = copy.m_DateInvoiced;
this.m_C_BPartner_ID = copy.m_C_BPartner_ID;
this.m_C_BPartner_Location_ID = copy.m_C_BPartner_Location_ID;
this.m_IsSOTrx = copy.m_IsSOTrx;
this.m_product = copy.m_product != null ? new MProduct(ctx, copy.m_product, trxName) : null;
this.m_charge = copy.m_charge != null ? new MCharge(ctx, copy.m_charge, trxName) : null;
this.m_name = copy.m_name;
this.m_precision = copy.m_precision;
this.m_parent = null;
this.m_priceSet = copy.m_priceSet;
}
protected int m_M_PriceList_ID = 0; protected int m_M_PriceList_ID = 0;
protected Timestamp m_DateInvoiced = null; protected Timestamp m_DateInvoiced = null;
protected int m_C_BPartner_ID = 0; protected int m_C_BPartner_ID = 0;
@ -489,11 +532,11 @@ public class MInvoiceLine extends X_C_InvoiceLine
public MCharge getCharge() public MCharge getCharge()
{ {
if (m_charge == null && getC_Charge_ID() != 0) if (m_charge == null && getC_Charge_ID() != 0)
m_charge = MCharge.get (getCtx(), getC_Charge_ID()); m_charge = MCharge.getCopy(getCtx(), getC_Charge_ID(), get_TrxName());
return m_charge; return m_charge;
} }
/** /**
* Get Tax * Get Tax (immutable)
* @return tax * @return tax
*/ */
protected MTax getTax() protected MTax getTax()
@ -605,7 +648,7 @@ public class MInvoiceLine extends X_C_InvoiceLine
public MProduct getProduct() public MProduct getProduct()
{ {
if (m_product == null && getM_Product_ID() != 0) if (m_product == null && getM_Product_ID() != 0)
m_product = MProduct.get (getCtx(), getM_Product_ID()); m_product = MProduct.getCopy(getCtx(), getM_Product_ID(), get_TrxName());
return m_product; return m_product;
} // getProduct } // getProduct

View File

@ -23,8 +23,10 @@ import java.util.Calendar;
import java.util.Properties; import java.util.Properties;
import java.util.logging.Level; import java.util.logging.Level;
import org.compiere.util.CCache; import org.compiere.util.Env;
import org.compiere.util.TimeUtil; import org.compiere.util.TimeUtil;
import org.idempiere.cache.ImmutableIntPOCache;
import org.idempiere.cache.ImmutablePOSupport;
/** /**
* Invoice Schedule Model * Invoice Schedule Model
@ -32,16 +34,36 @@ import org.compiere.util.TimeUtil;
* @author Jorg Janke * @author Jorg Janke
* @version $Id: MInvoiceSchedule.java,v 1.3 2006/07/30 00:51:05 jjanke Exp $ * @version $Id: MInvoiceSchedule.java,v 1.3 2006/07/30 00:51:05 jjanke Exp $
*/ */
public class MInvoiceSchedule extends X_C_InvoiceSchedule public class MInvoiceSchedule extends X_C_InvoiceSchedule implements ImmutablePOSupport
{ {
/** /**
* *
*/ */
private static final long serialVersionUID = -1750020695983938895L; private static final long serialVersionUID = -2480759794244343907L;
/** /**
* Get MInvoiceSchedule from Cache * Get MInvoiceSchedule (Immutable) from Cache
* @param C_InvoiceSchedule_ID id
* @param trxName transaction
* @return MInvoiceSchedule
*/
public static MInvoiceSchedule get (int C_InvoiceSchedule_ID, String trxName)
{
return get(Env.getCtx(), C_InvoiceSchedule_ID, trxName);
}
/**
* Get MInvoiceSchedule (Immutable) from Cache
* @param C_InvoiceSchedule_ID id
* @return MInvoiceSchedule
*/
public static MInvoiceSchedule get (int C_InvoiceSchedule_ID)
{
return get(C_InvoiceSchedule_ID, (String)null);
}
/**
* Get MInvoiceSchedule (Immutable) from Cache
* @param ctx context * @param ctx context
* @param C_InvoiceSchedule_ID id * @param C_InvoiceSchedule_ID id
* @param trxName transaction * @param trxName transaction
@ -50,17 +72,20 @@ public class MInvoiceSchedule extends X_C_InvoiceSchedule
public static MInvoiceSchedule get (Properties ctx, int C_InvoiceSchedule_ID, String trxName) public static MInvoiceSchedule get (Properties ctx, int C_InvoiceSchedule_ID, String trxName)
{ {
Integer key = Integer.valueOf(C_InvoiceSchedule_ID); Integer key = Integer.valueOf(C_InvoiceSchedule_ID);
MInvoiceSchedule retValue = (MInvoiceSchedule) s_cache.get (key); MInvoiceSchedule retValue = (MInvoiceSchedule) s_cache.get (ctx, key, e -> new MInvoiceSchedule(ctx, e));
if (retValue != null) if (retValue != null)
return retValue; return retValue;
retValue = new MInvoiceSchedule (ctx, C_InvoiceSchedule_ID, trxName); retValue = new MInvoiceSchedule (Env.getCtx(), C_InvoiceSchedule_ID, trxName);
if (retValue.get_ID () != 0) if (retValue.get_ID () == C_InvoiceSchedule_ID)
s_cache.put (key, retValue); {
s_cache.put (key, retValue, e -> new MInvoiceSchedule(Env.getCtx(), e));
return retValue; return retValue;
}
return null;
} // get } // get
/** Cache */ /** Cache */
private static CCache<Integer,MInvoiceSchedule> s_cache = new CCache<Integer,MInvoiceSchedule>(Table_Name, 5); private static ImmutableIntPOCache<Integer,MInvoiceSchedule> s_cache = new ImmutableIntPOCache<Integer,MInvoiceSchedule>(Table_Name, 5);
/************************************************************************** /**************************************************************************
@ -85,6 +110,37 @@ public class MInvoiceSchedule extends X_C_InvoiceSchedule
super(ctx, rs, trxName); super(ctx, rs, trxName);
} // MInvoiceSchedule } // MInvoiceSchedule
/**
*
* @param copy
*/
public MInvoiceSchedule(MInvoiceSchedule copy)
{
this(Env.getCtx(), copy);
}
/**
*
* @param ctx
* @param copy
*/
public MInvoiceSchedule(Properties ctx, MInvoiceSchedule copy)
{
this(ctx, copy, (String) null);
}
/**
*
* @param ctx
* @param copy
* @param trxName
*/
public MInvoiceSchedule(Properties ctx, MInvoiceSchedule copy, String trxName)
{
this(ctx, 0, trxName);
copyPO(copy);
}
/** /**
* Can I send Invoice * Can I send Invoice
* @param xDate date * @param xDate date
@ -220,4 +276,13 @@ public class MInvoiceSchedule extends X_C_InvoiceSchedule
return Calendar.THURSDAY; return Calendar.THURSDAY;
} // getCalendarDay } // getCalendarDay
@Override
public MInvoiceSchedule markImmutable() {
if (is_Immutable())
return this;
makeImmutable();
return this;
}
} // MInvoiceSchedule } // MInvoiceSchedule

View File

@ -136,6 +136,39 @@ public class MInvoiceTax extends X_C_InvoiceTax
super(ctx, rs, trxName); super(ctx, rs, trxName);
} // MInvoiceTax } // MInvoiceTax
/**
*
* @param copy
*/
public MInvoiceTax(MInvoiceTax copy)
{
this(Env.getCtx(), copy);
}
/**
*
* @param ctx
* @param copy
*/
public MInvoiceTax(Properties ctx, MInvoiceTax copy)
{
this(ctx, copy, (String) null);
}
/**
*
* @param ctx
* @param copy
* @param trxName
*/
public MInvoiceTax(Properties ctx, MInvoiceTax copy, String trxName)
{
this(ctx, 0, trxName);
copyPO(copy);
this.m_precision = copy.m_precision;
this.m_tax = copy.m_tax != null ? new MTax(ctx, copy.m_tax, trxName) : null;
}
/** Tax */ /** Tax */
private MTax m_tax = null; private MTax m_tax = null;
/** Cached Precision */ /** Cached Precision */
@ -163,7 +196,7 @@ public class MInvoiceTax extends X_C_InvoiceTax
} // setPrecision } // setPrecision
/** /**
* Get Tax * Get Tax (immutable)
* @return tax * @return tax
*/ */
protected MTax getTax() protected MTax getTax()
@ -257,5 +290,4 @@ public class MInvoiceTax extends X_C_InvoiceTax
.append ("]"); .append ("]");
return sb.toString (); return sb.toString ();
} // toString } // toString
} // MInvoiceTax } // MInvoiceTax

View File

@ -23,13 +23,14 @@ import java.util.Comparator;
import java.util.Properties; import java.util.Properties;
import java.util.logging.Level; import java.util.logging.Level;
import org.compiere.util.CCache;
import org.compiere.util.CLogger; import org.compiere.util.CLogger;
import org.compiere.util.DB; import org.compiere.util.DB;
import org.compiere.util.Env; import org.compiere.util.Env;
import org.compiere.util.Msg; import org.compiere.util.Msg;
import org.compiere.util.Trx; import org.compiere.util.Trx;
import org.compiere.util.Util; import org.compiere.util.Util;
import org.idempiere.cache.ImmutableIntPOCache;
import org.idempiere.cache.ImmutablePOSupport;
/** /**
* Location (Address) * Location (Address)
@ -45,12 +46,13 @@ import org.compiere.util.Util;
* <li>BF [ 3002736 ] MLocation.get cache all MLocations * <li>BF [ 3002736 ] MLocation.get cache all MLocations
* https://sourceforge.net/tracker/?func=detail&aid=3002736&group_id=176962&atid=879332 * https://sourceforge.net/tracker/?func=detail&aid=3002736&group_id=176962&atid=879332
*/ */
public class MLocation extends X_C_Location implements Comparator<Object> public class MLocation extends X_C_Location implements Comparator<Object>, ImmutablePOSupport
{ {
/** /**
* *
*/ */
private static final long serialVersionUID = -4100591609253985073L; private static final long serialVersionUID = -3421958100626539835L;
// http://jira.idempiere.com/browse/IDEMPIERE-147 // http://jira.idempiere.com/browse/IDEMPIERE-147
public static String LOCATION_MAPS_URL_PREFIX = MSysConfig.getValue(MSysConfig.LOCATION_MAPS_URL_PREFIX); public static String LOCATION_MAPS_URL_PREFIX = MSysConfig.getValue(MSysConfig.LOCATION_MAPS_URL_PREFIX);
public static String LOCATION_MAPS_ROUTE_PREFIX = MSysConfig.getValue(MSysConfig.LOCATION_MAPS_ROUTE_PREFIX); public static String LOCATION_MAPS_ROUTE_PREFIX = MSysConfig.getValue(MSysConfig.LOCATION_MAPS_ROUTE_PREFIX);
@ -59,6 +61,27 @@ public class MLocation extends X_C_Location implements Comparator<Object>
/** /**
* Get Location from Cache * Get Location from Cache
* @param C_Location_ID id
* @param trxName transaction
* @return MLocation
*/
public static MLocation get (int C_Location_ID, String trxName)
{
return get(Env.getCtx(), C_Location_ID, trxName);
}
/**
* Get Location from Cache (immutable)
* @param C_Location_ID id
* @return MLocation
*/
public static MLocation get (int C_Location_ID)
{
return get(C_Location_ID, (String)null);
}
/**
* Get Location from Cache (immutable)
* @param ctx context * @param ctx context
* @param C_Location_ID id * @param C_Location_ID id
* @param trxName transaction * @param trxName transaction
@ -68,24 +91,36 @@ public class MLocation extends X_C_Location implements Comparator<Object>
{ {
// New // New
if (C_Location_ID == 0) if (C_Location_ID == 0)
return new MLocation(ctx, C_Location_ID, trxName); return new MLocation(Env.getCtx(), C_Location_ID, trxName);
// //
Integer key = Integer.valueOf(C_Location_ID); Integer key = Integer.valueOf(C_Location_ID);
MLocation retValue = null; MLocation retValue = s_cache.get (ctx, key, e -> new MLocation(ctx, e));
if (trxName == null)
retValue = (MLocation) s_cache.get (key);
if (retValue != null) if (retValue != null)
return retValue; return retValue;
retValue = new MLocation (ctx, C_Location_ID, trxName); retValue = new MLocation (ctx, C_Location_ID, trxName);
if (retValue.get_ID () != 0) // found if (retValue.get_ID () == C_Location_ID) // found
{ {
if (trxName == null) s_cache.put (key, retValue, e -> new MLocation(Env.getCtx(), e));
s_cache.put (key, retValue);
return retValue; return retValue;
} }
return null; // not found return null; // not found
} // get } // get
/**
* Get updateable copy of MLocation from cache
* @param ctx context
* @param C_Location_ID
* @param trxName
* @return MLocation
*/
public static MLocation getCopy(Properties ctx, int C_Location_ID, String trxName)
{
MLocation loc = get(C_Location_ID, trxName);
if (loc != null && loc.getC_Location_ID() > 0)
loc = new MLocation(ctx, loc, trxName);
return loc;
}
/** /**
* Load Location with ID if Business Partner Location * Load Location with ID if Business Partner Location
* @param ctx context * @param ctx context
@ -126,7 +161,7 @@ public class MLocation extends X_C_Location implements Comparator<Object>
} // getBPLocation } // getBPLocation
/** Cache */ /** Cache */
private static CCache<Integer,MLocation> s_cache = new CCache<Integer,MLocation>(Table_Name, 100, 30); private static ImmutableIntPOCache<Integer,MLocation> s_cache = new ImmutableIntPOCache<Integer,MLocation>(Table_Name, 100, 30);
/** Static Logger */ /** Static Logger */
private static CLogger s_log = CLogger.getCLogger(MLocation.class); private static CLogger s_log = CLogger.getCLogger(MLocation.class);
@ -142,9 +177,9 @@ public class MLocation extends X_C_Location implements Comparator<Object>
super (ctx, C_Location_ID, trxName); super (ctx, C_Location_ID, trxName);
if (C_Location_ID == 0) if (C_Location_ID == 0)
{ {
MCountry defaultCountry = MCountry.getDefault(getCtx()); MCountry defaultCountry = MCountry.getDefault();
setCountry(defaultCountry); setCountry(defaultCountry);
MRegion defaultRegion = MRegion.getDefault(getCtx()); MRegion defaultRegion = MRegion.getDefault();
if (defaultRegion != null if (defaultRegion != null
&& defaultRegion.getC_Country_ID() == defaultCountry.getC_Country_ID()) && defaultRegion.getC_Country_ID() == defaultCountry.getC_Country_ID())
setRegion(defaultRegion); setRegion(defaultRegion);
@ -190,6 +225,39 @@ public class MLocation extends X_C_Location implements Comparator<Object>
super(ctx, rs, trxName); super(ctx, rs, trxName);
} // MLocation } // MLocation
/**
*
* @param copy
*/
public MLocation(MLocation copy)
{
this(Env.getCtx(), copy);
}
/**
*
* @param ctx
* @param copy
*/
public MLocation(Properties ctx, MLocation copy)
{
this(ctx, copy, (String) null);
}
/**
*
* @param ctx
* @param copy
* @param trxName
*/
public MLocation(Properties ctx, MLocation copy, String trxName)
{
this(ctx, 0, trxName);
copyPO(copy);
this.m_c = copy.m_c != null ? new MCountry(ctx, copy.m_c, trxName) : null;
this.m_r = copy.m_r != null ? new MRegion(ctx, copy.m_r, trxName) : null;
}
private MCountry m_c = null; private MCountry m_c = null;
private MRegion m_r = null; private MRegion m_r = null;
@ -202,7 +270,7 @@ public class MLocation extends X_C_Location implements Comparator<Object>
if (country != null) if (country != null)
m_c = country; m_c = country;
else else
m_c = MCountry.getDefault(getCtx()); m_c = MCountry.getDefault();
super.setC_Country_ID (m_c.getC_Country_ID()); super.setC_Country_ID (m_c.getC_Country_ID());
} // setCountry } // setCountry
@ -214,11 +282,11 @@ public class MLocation extends X_C_Location implements Comparator<Object>
{ {
if (getC_Country_ID() != C_Country_ID) if (getC_Country_ID() != C_Country_ID)
setRegion(null); setRegion(null);
setCountry (MCountry.get(getCtx(), C_Country_ID)); setCountry (MCountry.get(C_Country_ID));
} // setCountry } // setCountry
/** /**
* Get Country * Get Country (immutable)
* @return country * @return country
*/ */
public MCountry getCountry() public MCountry getCountry()
@ -230,9 +298,9 @@ public class MLocation extends X_C_Location implements Comparator<Object>
if (m_c == null) if (m_c == null)
{ {
if (getC_Country_ID() != 0) if (getC_Country_ID() != 0)
m_c = MCountry.get(getCtx(), getC_Country_ID()); m_c = MCountry.get(getC_Country_ID());
else else
m_c = MCountry.getDefault(getCtx()); m_c = MCountry.getDefault();
} }
return m_c; return m_c;
} // getCountry } // getCountry
@ -254,7 +322,7 @@ public class MLocation extends X_C_Location implements Comparator<Object>
public String getCountry (boolean local) public String getCountry (boolean local)
{ {
if (local if (local
&& getC_Country_ID() == MCountry.getDefault(getCtx()).getC_Country_ID()) && getC_Country_ID() == MCountry.getDefault().getC_Country_ID())
return null; return null;
return getCountryName(); return getCountryName();
} // getCountry } // getCountry
@ -266,7 +334,7 @@ public class MLocation extends X_C_Location implements Comparator<Object>
public String getCountry (boolean local, String language) public String getCountry (boolean local, String language)
{ {
if (local if (local
&& getC_Country_ID() == MCountry.getDefault(getCtx()).getC_Country_ID()) && getC_Country_ID() == MCountry.getDefault().getC_Country_ID())
return null; return null;
MCountry mc = getCountry(); MCountry mc = getCountry();
return mc.getTrlName(language); return mc.getTrlName(language);
@ -316,7 +384,7 @@ public class MLocation extends X_C_Location implements Comparator<Object>
setRegion(null); setRegion(null);
} }
else else
setRegion (MRegion.get(getCtx(), C_Region_ID)); setRegion (MRegion.get(C_Region_ID));
} // setC_Region_ID } // setC_Region_ID
/** /**
@ -330,7 +398,7 @@ public class MLocation extends X_C_Location implements Comparator<Object>
m_r = null; m_r = null;
// //
if (m_r == null && getC_Region_ID() != 0) if (m_r == null && getC_Region_ID() != 0)
m_r = MRegion.get(getCtx(), getC_Region_ID()); m_r = MRegion.get(getC_Region_ID());
return m_r; return m_r;
} // getRegion } // getRegion
@ -438,7 +506,7 @@ public class MLocation extends X_C_Location implements Comparator<Object>
public boolean isAddressLinesReverse() public boolean isAddressLinesReverse()
{ {
// Local // Local
if (MCountry.getDefault(getCtx()) != null && getC_Country_ID() == MCountry.getDefault(getCtx()).getC_Country_ID()) if (MCountry.getDefault() != null && getC_Country_ID() == MCountry.getDefault().getC_Country_ID())
return getCountry().isAddressLinesLocalReverse(); return getCountry().isAddressLinesLocalReverse();
return getCountry().isAddressLinesReverse(); return getCountry().isAddressLinesReverse();
} // isAddressLinesReverse } // isAddressLinesReverse
@ -464,7 +532,7 @@ public class MLocation extends X_C_Location implements Comparator<Object>
if (c == null) if (c == null)
return "CountryNotFound"; return "CountryNotFound";
boolean local = MCountry.getDefault(getCtx()) != null && getC_Country_ID() == MCountry.getDefault(getCtx()).getC_Country_ID(); boolean local = MCountry.getDefault() != null && getC_Country_ID() == MCountry.getDefault().getC_Country_ID();
String inStr = local ? c.getDisplaySequenceLocal() : c.getDisplaySequence(); String inStr = local ? c.getDisplaySequenceLocal() : c.getDisplaySequence();
StringBuilder outStr = new StringBuilder(); StringBuilder outStr = new StringBuilder();
@ -821,6 +889,15 @@ public class MLocation extends X_C_Location implements Comparator<Object>
return ok; return ok;
} }
@Override
public MLocation markImmutable() {
if (is_Immutable())
return this;
makeImmutable();
return this;
}
/** /**
* Create address transaction instance * Create address transaction instance
* @param ctx * @param ctx

View File

@ -127,7 +127,7 @@ public final class MLocationLookup extends Lookup
*/ */
public MLocation getLocation (int C_Location_ID, String trxName) public MLocation getLocation (int C_Location_ID, String trxName)
{ {
return MLocation.get(m_ctx, C_Location_ID, trxName); return MLocation.getCopy(m_ctx, C_Location_ID, trxName);
} // getC_Location_ID } // getC_Location_ID
/** /**

View File

@ -22,9 +22,11 @@ import java.sql.SQLException;
import java.util.Properties; import java.util.Properties;
import java.util.logging.Level; import java.util.logging.Level;
import org.compiere.util.CCache;
import org.compiere.util.CLogger; import org.compiere.util.CLogger;
import org.compiere.util.DB; import org.compiere.util.DB;
import org.compiere.util.Env;
import org.idempiere.cache.ImmutableIntPOCache;
import org.idempiere.cache.ImmutablePOSupport;
/** /**
* Warehouse Locator Object * Warehouse Locator Object
@ -34,12 +36,12 @@ import org.compiere.util.DB;
* @see [ 1966333 ] New Method to get the Default Locator based in Warehouse http://sourceforge.net/tracker/index.php?func=detail&aid=1966333&group_id=176962&atid=879335 * @see [ 1966333 ] New Method to get the Default Locator based in Warehouse http://sourceforge.net/tracker/index.php?func=detail&aid=1966333&group_id=176962&atid=879335
* @version $Id: MLocator.java,v 1.3 2006/07/30 00:58:37 jjanke Exp $ * @version $Id: MLocator.java,v 1.3 2006/07/30 00:58:37 jjanke Exp $
*/ */
public class MLocator extends X_M_Locator public class MLocator extends X_M_Locator implements ImmutablePOSupport
{ {
/** /**
* *
*/ */
private static final long serialVersionUID = -4502919527066173270L; private static final long serialVersionUID = 539879105479299988L;
/** /**
* Get oldest Default Locator of warehouse with locator * Get oldest Default Locator of warehouse with locator
@ -171,27 +173,53 @@ public class MLocator extends X_M_Locator
} // get } // get
/** /**
* Get Locator from Cache * Get Locator from Cache (immutable)
* @param M_Locator_ID id
* @return MLocator
*/
public static MLocator get (int M_Locator_ID)
{
return get(Env.getCtx(), M_Locator_ID);
}
/**
* Get Locator from Cache (immutable)
* @param ctx context * @param ctx context
* @param M_Locator_ID id * @param M_Locator_ID id
* @return MLocator * @return MLocator
*/ */
public static MLocator get (Properties ctx, int M_Locator_ID) public static MLocator get (Properties ctx, int M_Locator_ID)
{ {
if (s_cache == null)
s_cache = new CCache<Integer,MLocator>(Table_Name, 20);
Integer key = Integer.valueOf(M_Locator_ID); Integer key = Integer.valueOf(M_Locator_ID);
MLocator retValue = (MLocator) s_cache.get (key); MLocator retValue = s_cache.get (ctx, key, e -> new MLocator(ctx, e));
if (retValue != null) if (retValue != null)
return retValue; return retValue;
retValue = new MLocator (ctx, M_Locator_ID, null); retValue = new MLocator (ctx, M_Locator_ID, (String)null);
if (retValue.get_ID () != 0) if (retValue.get_ID () == M_Locator_ID)
s_cache.put (key, retValue); {
s_cache.put (key, retValue, e -> new MLocator(Env.getCtx(), e));
return retValue; return retValue;
}
return null;
} // get } // get
/**
* Get updateable copy of MLocator from cache
* @param ctx
* @param M_Locator_ID
* @param trxName
* @return MLocator
*/
public static MLocator getCopy(Properties ctx, int M_Locator_ID, String trxName)
{
MLocator locator = get(M_Locator_ID);
if (locator != null)
locator = new MLocator(ctx, locator, trxName);
return locator;
}
/** Cache */ /** Cache */
protected volatile static CCache<Integer,MLocator> s_cache; private final static ImmutableIntPOCache<Integer,MLocator> s_cache = new ImmutableIntPOCache<Integer,MLocator>(Table_Name, 20);
/** Logger */ /** Logger */
private static CLogger s_log = CLogger.getCLogger (MLocator.class); private static CLogger s_log = CLogger.getCLogger (MLocator.class);
@ -244,6 +272,37 @@ public class MLocator extends X_M_Locator
super(ctx, rs, trxName); super(ctx, rs, trxName);
} // MLocator } // MLocator
/**
*
* @param copy
*/
public MLocator(MLocator copy)
{
this(Env.getCtx(), copy);
}
/**
*
* @param ctx
* @param copy
*/
public MLocator(Properties ctx, MLocator copy)
{
this(ctx, copy, (String) null);
}
/**
*
* @param ctx
* @param copy
* @param trxName
*/
public MLocator(Properties ctx, MLocator copy, String trxName)
{
this(ctx, 0, trxName);
copyPO(copy);
}
/** /**
* Get String Representation * Get String Representation
* @return Value * @return Value
@ -358,4 +417,13 @@ public class MLocator extends X_M_Locator
*/ */
} // isCanStoreProduct } // isCanStoreProduct
@Override
public MLocator markImmutable() {
if (is_Immutable())
return this;
makeImmutable();
return this;
}
} // MLocator } // MLocator

View File

@ -272,7 +272,7 @@ public final class MLocatorLookup extends Lookup implements Serializable
return null; return null;
} }
// //
return Util.isEmpty(trxName) ? MLocator.get(m_ctx, M_Locator_ID) : new MLocator (m_ctx, M_Locator_ID, trxName); return MLocator.getCopy(m_ctx, M_Locator_ID, trxName);
} // getMLocator } // getMLocator
/** /**

View File

@ -27,41 +27,52 @@ package org.compiere.model;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.util.Properties; import java.util.Properties;
import org.compiere.util.CCache;
import org.compiere.util.CLogger; import org.compiere.util.CLogger;
import org.compiere.util.Env;
import org.idempiere.cache.ImmutableIntPOCache;
import org.idempiere.cache.ImmutablePOSupport;
/** /**
* Warehouse Locator Type Object * Warehouse Locator Type Object
* *
* @author Carlos Ruiz - Quality Systems & Solutions - globalqss * @author Carlos Ruiz - Quality Systems & Solutions - globalqss
*/ */
public class MLocatorType extends X_M_LocatorType { public class MLocatorType extends X_M_LocatorType implements ImmutablePOSupport {
/** /**
* *
*/ */
private static final long serialVersionUID = -7567584133468332781L; private static final long serialVersionUID = 3021833597380696668L;
/** /**
* Get Locator Type from Cache * Get Locator Type from Cache (immutable)
* @param M_LocatorType_ID id
* @return MLocator
*/
public static MLocatorType get (int M_LocatorType_ID) {
return get(Env.getCtx(), M_LocatorType_ID);
}
/**
* Get Locator Type from Cache (immutable)
* @param ctx context * @param ctx context
* @param M_LocatorType_ID id * @param M_LocatorType_ID id
* @return MLocator * @return MLocator
*/ */
public static MLocatorType get (Properties ctx, int M_LocatorType_ID) { public static MLocatorType get (Properties ctx, int M_LocatorType_ID) {
if (s_cache == null)
s_cache = new CCache<Integer,MLocatorType>(Table_Name, 20);
Integer key = Integer.valueOf(M_LocatorType_ID); Integer key = Integer.valueOf(M_LocatorType_ID);
MLocatorType retValue = (MLocatorType) s_cache.get (key); MLocatorType retValue = s_cache.get (ctx, key, e -> new MLocatorType(ctx, e));
if (retValue != null) if (retValue != null)
return retValue; return retValue;
retValue = new MLocatorType (ctx, M_LocatorType_ID, null); retValue = new MLocatorType (ctx, M_LocatorType_ID, (String)null);
if (retValue.get_ID () != 0) if (retValue.get_ID () == M_LocatorType_ID) {
s_cache.put (key, retValue); s_cache.put (key, retValue, e -> new MLocatorType(Env.getCtx(), e));
return retValue; return retValue;
}
return null;
} // get } // get
/** Cache */ /** Cache */
private volatile static CCache<Integer,MLocatorType> s_cache; private final static ImmutableIntPOCache<Integer,MLocatorType> s_cache = new ImmutableIntPOCache<Integer,MLocatorType>(Table_Name, 20);
/** Logger */ /** Logger */
@SuppressWarnings("unused") @SuppressWarnings("unused")
@ -92,6 +103,34 @@ public class MLocatorType extends X_M_LocatorType {
super(ctx, rs, trxName); super(ctx, rs, trxName);
} // MLocatorType } // MLocatorType
/**
*
* @param copy
*/
public MLocatorType(MLocatorType copy) {
this(Env.getCtx(), copy);
}
/**
*
* @param ctx
* @param copy
*/
public MLocatorType(Properties ctx, MLocatorType copy) {
this(ctx, copy, (String) null);
}
/**
*
* @param ctx
* @param copy
* @param trxName
*/
public MLocatorType(Properties ctx, MLocatorType copy, String trxName) {
this(ctx, 0, trxName);
copyPO(copy);
}
/** /**
* Get String Representation * Get String Representation
* @return Name * @return Name
@ -100,4 +139,13 @@ public class MLocatorType extends X_M_LocatorType {
return getName(); return getName();
} // toString } // toString
@Override
public MLocatorType markImmutable() {
if (is_Immutable())
return this;
makeImmutable();
return this;
}
} // MLocatorType } // MLocatorType

View File

@ -0,0 +1,89 @@
/**********************************************************************
* This file is part of iDempiere ERP Open Source *
* http://www.idempiere.org *
* *
* 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: *
* - Trek Global Corporation *
* - Heng Sin Low *
**********************************************************************/
package org.compiere.model;
import java.sql.ResultSet;
import java.util.Properties;
import org.compiere.util.Env;
/**
* @author hengsin
*
*/
public class MLotCtlExclude extends X_M_LotCtlExclude {
/**
*
*/
private static final long serialVersionUID = -7189245472896373850L;
/**
* @param ctx
* @param M_LotCtlExclude_ID
* @param trxName
*/
public MLotCtlExclude(Properties ctx, int M_LotCtlExclude_ID, String trxName) {
super(ctx, M_LotCtlExclude_ID, trxName);
}
/**
* @param ctx
* @param rs
* @param trxName
*/
public MLotCtlExclude(Properties ctx, ResultSet rs, String trxName) {
super(ctx, rs, trxName);
}
/**
*
* @param copy
*/
public MLotCtlExclude(MLotCtlExclude copy) {
this(Env.getCtx(), copy);
}
/**
*
* @param ctx
* @param copy
*/
public MLotCtlExclude(Properties ctx, MLotCtlExclude copy) {
this(ctx, copy, (String) null);
}
/**
*
* @param ctx
* @param copy
* @param trxName
*/
public MLotCtlExclude(Properties ctx, MLotCtlExclude copy, String trxName) {
this(ctx, 0, trxName);
copyPO(copy);
}
}

View File

@ -30,12 +30,13 @@ import javax.script.ScriptEngine;
import org.adempiere.apps.graph.GraphColumn; import org.adempiere.apps.graph.GraphColumn;
import org.adempiere.exceptions.AdempiereException; import org.adempiere.exceptions.AdempiereException;
import org.adempiere.util.MeasureInterface; import org.adempiere.util.MeasureInterface;
import org.compiere.util.CCache;
import org.compiere.util.DB; import org.compiere.util.DB;
import org.compiere.util.Env; import org.compiere.util.Env;
import org.compiere.util.Msg; import org.compiere.util.Msg;
import org.compiere.util.TimeUtil; import org.compiere.util.TimeUtil;
import org.compiere.util.Util; import org.compiere.util.Util;
import org.idempiere.cache.ImmutableIntPOCache;
import org.idempiere.cache.ImmutablePOSupport;
/** /**
@ -50,15 +51,25 @@ import org.compiere.util.Util;
* <li>FR [ 2905227 ] Calculate Measure based on the script to PA * <li>FR [ 2905227 ] Calculate Measure based on the script to PA
* <li>https://sourceforge.net/tracker/?func=detail&aid=2905227&group_id=176962&atid=879335 * <li>https://sourceforge.net/tracker/?func=detail&aid=2905227&group_id=176962&atid=879335
*/ */
public class MMeasure extends X_PA_Measure public class MMeasure extends X_PA_Measure implements ImmutablePOSupport
{ {
/** /**
* *
*/ */
private static final long serialVersionUID = 6274990637485210675L; private static final long serialVersionUID = -3584012092877837973L;
/** /**
* Get MMeasure from Cache * Get MMeasure from Cache (immutable)
* @param PA_Measure_ID id
* @return MMeasure
*/
public static MMeasure get (int PA_Measure_ID)
{
return get(Env.getCtx(), PA_Measure_ID);
}
/**
* Get MMeasure from Cache (immutable)
* @param ctx context * @param ctx context
* @param PA_Measure_ID id * @param PA_Measure_ID id
* @return MMeasure * @return MMeasure
@ -66,18 +77,21 @@ public class MMeasure extends X_PA_Measure
public static MMeasure get (Properties ctx, int PA_Measure_ID) public static MMeasure get (Properties ctx, int PA_Measure_ID)
{ {
Integer key = Integer.valueOf(PA_Measure_ID); Integer key = Integer.valueOf(PA_Measure_ID);
MMeasure retValue = (MMeasure)s_cache.get (key); MMeasure retValue = s_cache.get (ctx, key, e -> new MMeasure(ctx, e));
if (retValue != null) if (retValue != null)
return retValue; return retValue;
retValue = new MMeasure (ctx, PA_Measure_ID, null); retValue = new MMeasure (ctx, PA_Measure_ID, (String)null);
if (retValue.get_ID() != 0) if (retValue.get_ID() == PA_Measure_ID)
s_cache.put (key, retValue); {
s_cache.put (key, retValue, e -> new MMeasure(Env.getCtx(), e));
return retValue; return retValue;
}
return null;
} // get } // get
/** Cache */ /** Cache */
private static CCache<Integer, MMeasure> s_cache private static ImmutableIntPOCache<Integer, MMeasure> s_cache
= new CCache<Integer, MMeasure> (Table_Name, 10); = new ImmutableIntPOCache<Integer, MMeasure> (Table_Name, 10);
/** /**
* Standard Constructor * Standard Constructor
@ -101,12 +115,43 @@ public class MMeasure extends X_PA_Measure
super (ctx, rs, trxName); super (ctx, rs, trxName);
} // MMeasure } // MMeasure
/**
*
* @param copy
*/
public MMeasure(MMeasure copy)
{
this(Env.getCtx(), copy);
}
/**
*
* @param ctx
* @param copy
*/
public MMeasure(Properties ctx, MMeasure copy)
{
this(ctx, copy, (String) null);
}
/**
*
* @param ctx
* @param copy
* @param trxName
*/
public MMeasure(Properties ctx, MMeasure copy, String trxName)
{
this(ctx, 0, trxName);
copyPO(copy);
}
public ArrayList<GraphColumn> getGraphColumnList(MGoal goal) public ArrayList<GraphColumn> getGraphColumnList(MGoal goal)
{ {
ArrayList<GraphColumn> list = new ArrayList<GraphColumn>(); ArrayList<GraphColumn> list = new ArrayList<GraphColumn>();
if (MMeasure.MEASURETYPE_Calculated.equals(getMeasureType())) if (MMeasure.MEASURETYPE_Calculated.equals(getMeasureType()))
{ {
MMeasureCalc mc = MMeasureCalc.get(getCtx(), getPA_MeasureCalc_ID()); MMeasureCalc mc = MMeasureCalc.get(getPA_MeasureCalc_ID());
String sql = mc.getSqlBarChart(goal.getRestrictions(false), String sql = mc.getSqlBarChart(goal.getRestrictions(false),
goal.getMeasureDisplay(), goal.getDateFrom(), goal.getMeasureDisplay(), goal.getDateFrom(),
MRole.getDefault()); // logged in role MRole.getDefault()); // logged in role
@ -465,7 +510,7 @@ public class MMeasure extends X_PA_Measure
if (role == null) if (role == null)
role = MRole.getDefault(getCtx(), false); // could result in wrong data role = MRole.getDefault(getCtx(), false); // could result in wrong data
// //
MMeasureCalc mc = MMeasureCalc.get(getCtx(), getPA_MeasureCalc_ID()); MMeasureCalc mc = MMeasureCalc.get(getPA_MeasureCalc_ID());
if (mc == null || mc.get_ID() == 0 || mc.get_ID() != getPA_MeasureCalc_ID()) if (mc == null || mc.get_ID() == 0 || mc.get_ID() != getPA_MeasureCalc_ID())
{ {
log.log(Level.SEVERE, "Not found PA_MeasureCalc_ID=" + getPA_MeasureCalc_ID()); log.log(Level.SEVERE, "Not found PA_MeasureCalc_ID=" + getPA_MeasureCalc_ID());
@ -669,4 +714,14 @@ public class MMeasure extends X_PA_Measure
} }
return true; return true;
} // updateUserDefinedGoals } // updateUserDefinedGoals
@Override
public MMeasure markImmutable() {
if (is_Immutable())
return this;
makeImmutable();
return this;
}
} // MMeasure } // MMeasure

View File

@ -23,9 +23,10 @@ import java.util.ArrayList;
import java.util.Properties; import java.util.Properties;
import java.util.logging.Level; import java.util.logging.Level;
import org.compiere.util.CCache;
import org.compiere.util.DB; import org.compiere.util.DB;
import org.compiere.util.Env; import org.compiere.util.Env;
import org.idempiere.cache.ImmutableIntPOCache;
import org.idempiere.cache.ImmutablePOSupport;
/** /**
* Performance Measure Calculation * Performance Measure Calculation
@ -33,15 +34,25 @@ import org.compiere.util.Env;
* @author Jorg Janke * @author Jorg Janke
* @version $Id: MMeasureCalc.java,v 1.4 2006/09/25 00:59:41 jjanke Exp $ * @version $Id: MMeasureCalc.java,v 1.4 2006/09/25 00:59:41 jjanke Exp $
*/ */
public class MMeasureCalc extends X_PA_MeasureCalc public class MMeasureCalc extends X_PA_MeasureCalc implements ImmutablePOSupport
{ {
/** /**
* *
*/ */
private static final long serialVersionUID = 4720674127987683534L; private static final long serialVersionUID = 3143013490477454559L;
/** /**
* Get MMeasureCalc from Cache * Get MMeasureCalc from Cache (immutable)
* @param PA_MeasureCalc_ID id
* @return MMeasureCalc
*/
public static MMeasureCalc get (int PA_MeasureCalc_ID)
{
return get(Env.getCtx(), PA_MeasureCalc_ID);
}
/**
* Get MMeasureCalc from Cache (immutable)
* @param ctx context * @param ctx context
* @param PA_MeasureCalc_ID id * @param PA_MeasureCalc_ID id
* @return MMeasureCalc * @return MMeasureCalc
@ -49,18 +60,21 @@ public class MMeasureCalc extends X_PA_MeasureCalc
public static MMeasureCalc get (Properties ctx, int PA_MeasureCalc_ID) public static MMeasureCalc get (Properties ctx, int PA_MeasureCalc_ID)
{ {
Integer key = Integer.valueOf(PA_MeasureCalc_ID); Integer key = Integer.valueOf(PA_MeasureCalc_ID);
MMeasureCalc retValue = (MMeasureCalc)s_cache.get (key); MMeasureCalc retValue = s_cache.get (ctx, key, e -> new MMeasureCalc(ctx, e));
if (retValue != null) if (retValue != null)
return retValue; return retValue;
retValue = new MMeasureCalc (ctx, PA_MeasureCalc_ID, null); retValue = new MMeasureCalc (ctx, PA_MeasureCalc_ID, (String)null);
if (retValue.get_ID() != 0) if (retValue.get_ID() == PA_MeasureCalc_ID)
s_cache.put (key, retValue); {
s_cache.put (key, retValue, e -> new MMeasureCalc(Env.getCtx(), e));
return retValue; return retValue;
}
return null;
} // get } // get
/** Cache */ /** Cache */
private static CCache<Integer, MMeasureCalc> s_cache private static ImmutableIntPOCache<Integer, MMeasureCalc> s_cache
= new CCache<Integer, MMeasureCalc> (Table_Name, 10); = new ImmutableIntPOCache<Integer, MMeasureCalc> (Table_Name, 10);
/************************************************************************** /**************************************************************************
* Standard Constructor * Standard Constructor
@ -84,6 +98,36 @@ public class MMeasureCalc extends X_PA_MeasureCalc
super (ctx, rs, trxName); super (ctx, rs, trxName);
} // MMeasureCalc } // MMeasureCalc
/**
*
* @param copy
*/
public MMeasureCalc(MMeasureCalc copy)
{
this(Env.getCtx(), copy);
}
/**
*
* @param ctx
* @param copy
*/
public MMeasureCalc(Properties ctx, MMeasureCalc copy)
{
this(ctx, copy, (String) null);
}
/**
*
* @param ctx
* @param copy
* @param trxName
*/
public MMeasureCalc(Properties ctx, MMeasureCalc copy, String trxName)
{
this(ctx, 0, trxName);
copyPO(copy);
}
/** /**
* Get Sql to return single value for the Performance Indicator * Get Sql to return single value for the Performance Indicator
@ -465,5 +509,13 @@ public class MMeasureCalc extends X_PA_MeasureCalc
return sb.toString (); return sb.toString ();
} // toString } // toString
@Override
public MMeasureCalc markImmutable() {
if (is_Immutable())
return this;
makeImmutable();
return this;
}
} // MMeasureCalc } // MMeasureCalc

View File

@ -21,9 +21,11 @@ import java.sql.ResultSet;
import java.util.Properties; import java.util.Properties;
import java.util.logging.Level; import java.util.logging.Level;
import org.compiere.util.CCache;
import org.compiere.util.CLogger; import org.compiere.util.CLogger;
import org.compiere.util.DB; import org.compiere.util.DB;
import org.compiere.util.Env;
import org.idempiere.cache.ImmutablePOSupport;
import org.idempiere.cache.ImmutablePOCache;
/** /**
* Message Model * Message Model
@ -31,15 +33,25 @@ import org.compiere.util.DB;
* @author Jorg Janke * @author Jorg Janke
* @version $Id: MMessage.java,v 1.3 2006/07/30 00:54:54 jjanke Exp $ * @version $Id: MMessage.java,v 1.3 2006/07/30 00:54:54 jjanke Exp $
*/ */
public class MMessage extends X_AD_Message public class MMessage extends X_AD_Message implements ImmutablePOSupport
{ {
/** /**
* *
*/ */
private static final long serialVersionUID = -7362947218094337783L; private static final long serialVersionUID = -7983736322524189608L;
/** /**
* Get Message (cached) * Get Message (cached) (immutable)
* @param Value message value
* @return message
*/
public static MMessage get (String Value)
{
return get(Env.getCtx(), Value);
}
/**
* Get Message (cached) (immutable)
* @param ctx context * @param ctx context
* @param Value message value * @param Value message value
* @return message * @return message
@ -48,7 +60,7 @@ public class MMessage extends X_AD_Message
{ {
if (Value == null || Value.length() == 0) if (Value == null || Value.length() == 0)
return null; return null;
MMessage retValue = (MMessage)s_cache.get(Value); MMessage retValue = (MMessage)s_cache.get(ctx, Value, e -> new MMessage(ctx, e));
// //
if (retValue == null) if (retValue == null)
{ {
@ -61,7 +73,7 @@ public class MMessage extends X_AD_Message
pstmt.setString(1, Value); pstmt.setString(1, Value);
rs = pstmt.executeQuery(); rs = pstmt.executeQuery();
if (rs.next()) if (rs.next())
retValue = new MMessage (ctx, rs, null); retValue = new MMessage (Env.getCtx(), rs, null);
} }
catch (Exception e) catch (Exception e)
{ {
@ -74,13 +86,20 @@ public class MMessage extends X_AD_Message
pstmt = null; pstmt = null;
} }
if (retValue != null) if (retValue != null)
s_cache.put(Value, retValue); {
s_cache.put(Value, retValue, e -> new MMessage(Env.getCtx(), e));
} }
return retValue; return retValue;
}
else
{
return retValue;
}
} // get } // get
/** /**
* Get Message (cached) * Get Message (cached) (immutable)
* @param ctx context * @param ctx context
* @param AD_Message_ID id * @param AD_Message_ID id
* @return message * @return message
@ -88,15 +107,25 @@ public class MMessage extends X_AD_Message
public static MMessage get (Properties ctx, int AD_Message_ID) public static MMessage get (Properties ctx, int AD_Message_ID)
{ {
String key = String.valueOf(AD_Message_ID); String key = String.valueOf(AD_Message_ID);
MMessage retValue = (MMessage)s_cache.get(key); MMessage retValue = s_cache.get(ctx, key, e -> new MMessage(ctx, e));
if (retValue == null) if (retValue == null)
{ {
retValue = new MMessage (ctx, AD_Message_ID, null); retValue = new MMessage (ctx, AD_Message_ID, null);
s_cache.put(key, retValue); s_cache.put(key, retValue, e -> new MMessage(Env.getCtx(), e));
} }
return retValue; return retValue;
} // get } // get
/**
* Get Message ID (cached)
* @param Value message value
* @return AD_Message_ID
*/
public static int getAD_Message_ID (String Value)
{
return getAD_Message_ID(Env.getCtx(), Value);
}
/** /**
* Get Message ID (cached) * Get Message ID (cached)
* @param ctx context * @param ctx context
@ -112,7 +141,7 @@ public class MMessage extends X_AD_Message
} // getAD_Message_ID } // getAD_Message_ID
/** Cache */ /** Cache */
static private CCache<String,MMessage> s_cache = new CCache<String,MMessage>(Table_Name, 100); static private ImmutablePOCache<String,MMessage> s_cache = new ImmutablePOCache<String,MMessage>(Table_Name, 100);
/** Static Logger */ /** Static Logger */
private static CLogger s_log = CLogger.getCLogger(MMessage.class); private static CLogger s_log = CLogger.getCLogger(MMessage.class);
@ -138,4 +167,44 @@ public class MMessage extends X_AD_Message
super(ctx, rs, trxName); super(ctx, rs, trxName);
} // MMessage } // MMessage
/**
*
* @param copy
*/
public MMessage(MMessage copy)
{
this(Env.getCtx(), copy);
}
/**
*
* @param ctx
* @param copy
*/
public MMessage(Properties ctx, MMessage copy)
{
this(ctx, copy, (String) null);
}
/**
*
* @param ctx
* @param copy
* @param trxName
*/
public MMessage(Properties ctx, MMessage copy, String trxName)
{
this(ctx, 0, trxName);
copyPO(copy);
}
@Override
public MMessage markImmutable() {
if (is_Immutable())
return this;
makeImmutable();
return this;
}
} // MMessage } // MMessage

View File

@ -121,7 +121,7 @@ public class MMovementLine extends X_M_MovementLine
public MProduct getProduct() public MProduct getProduct()
{ {
if (getM_Product_ID() != 0) if (getM_Product_ID() != 0)
return MProduct.get(getCtx(), getM_Product_ID()); return MProduct.getCopy(getCtx(), getM_Product_ID(), get_TrxName());
return null; return null;
} // getProduct } // getProduct

View File

@ -369,11 +369,11 @@ public class MOrderLine extends X_C_OrderLine
public MCharge getCharge() public MCharge getCharge()
{ {
if (m_charge == null && getC_Charge_ID() != 0) if (m_charge == null && getC_Charge_ID() != 0)
m_charge = MCharge.get (getCtx(), getC_Charge_ID()); m_charge = MCharge.getCopy(getCtx(), getC_Charge_ID(), get_TrxName());
return m_charge; return m_charge;
} }
/** /**
* Get Tax * Get Tax (immutable)
* @return tax * @return tax
*/ */
protected MTax getTax() protected MTax getTax()
@ -472,7 +472,7 @@ public class MOrderLine extends X_C_OrderLine
public MProduct getProduct() public MProduct getProduct()
{ {
if (m_product == null && getM_Product_ID() != 0) if (m_product == null && getM_Product_ID() != 0)
m_product = MProduct.get (getCtx(), getM_Product_ID()); m_product = MProduct.getCopy(getCtx(), getM_Product_ID(), get_TrxName());
return m_product; return m_product;
} // getProduct } // getProduct

View File

@ -182,7 +182,7 @@ public class MOrderTax extends X_C_OrderTax
} // setPrecision } // setPrecision
/** /**
* Get Tax * Get Tax (immutable)
* @return tax * @return tax
*/ */
protected MTax getTax() protected MTax getTax()

View File

@ -20,9 +20,10 @@ import java.sql.ResultSet;
import java.util.List; import java.util.List;
import java.util.Properties; import java.util.Properties;
import org.compiere.util.CCache;
import org.compiere.util.DB; import org.compiere.util.DB;
import org.compiere.util.Env; import org.compiere.util.Env;
import org.idempiere.cache.ImmutableIntPOCache;
import org.idempiere.cache.ImmutablePOSupport;
/** /**
* Organization Model * Organization Model
@ -30,13 +31,12 @@ import org.compiere.util.Env;
* @author Jorg Janke * @author Jorg Janke
* @version $Id: MOrg.java,v 1.3 2006/07/30 00:58:04 jjanke Exp $ * @version $Id: MOrg.java,v 1.3 2006/07/30 00:58:04 jjanke Exp $
*/ */
public class MOrg extends X_AD_Org public class MOrg extends X_AD_Org implements ImmutablePOSupport
{ {
/** /**
* *
*/ */
private static final long serialVersionUID = -5604686137606338725L; private static final long serialVersionUID = -696173265471741122L;
/** /**
* Get Active Organizations Of Client * Get Active Organizations Of Client
@ -58,24 +58,36 @@ public class MOrg extends X_AD_Org
} // getOfClient } // getOfClient
/** /**
* Get Org from Cache * Get Org from Cache (immutable)
* @param ctx context * @param AD_Org_ID id
* @return MOrg
*/
public static MOrg get (int AD_Org_ID)
{
return get(Env.getCtx(), AD_Org_ID);
}
/**
* Get Org from Cache (immutable)
* @param AD_Org_ID id * @param AD_Org_ID id
* @return MOrg * @return MOrg
*/ */
public static MOrg get (Properties ctx, int AD_Org_ID) public static MOrg get (Properties ctx, int AD_Org_ID)
{ {
MOrg retValue = s_cache.get (AD_Org_ID); MOrg retValue = s_cache.get (ctx, AD_Org_ID, e -> new MOrg(ctx, e));
if (retValue != null) if (retValue != null)
return retValue; return retValue;
retValue = new MOrg (ctx, AD_Org_ID, null); retValue = new MOrg (ctx, AD_Org_ID, (String)null);
if (retValue.get_ID () != 0) if (retValue.get_ID () == AD_Org_ID)
s_cache.put (AD_Org_ID, retValue); {
s_cache.put (AD_Org_ID, retValue, e -> new MOrg(Env.getCtx(), e));
return retValue; return retValue;
}
return null;
} // get } // get
/** Cache */ /** Cache */
private static CCache<Integer,MOrg> s_cache = new CCache<Integer,MOrg>(Table_Name, 50); private static ImmutableIntPOCache<Integer,MOrg> s_cache = new ImmutableIntPOCache<Integer,MOrg>(Table_Name, 50);
/************************************************************************** /**************************************************************************
@ -119,6 +131,38 @@ public class MOrg extends X_AD_Org
setName (name); setName (name);
} // MOrg } // MOrg
/**
*
* @param copy
*/
public MOrg(MOrg copy)
{
this(Env.getCtx(), copy);
}
/**
*
* @param ctx
* @param copy
*/
public MOrg(Properties ctx, MOrg copy)
{
this(ctx, copy, (String) null);
}
/**
*
* @param ctx
* @param copy
* @param trxName
*/
public MOrg(Properties ctx, MOrg copy, String trxName)
{
this(ctx, 0, trxName);
copyPO(copy);
this.m_linkedBPartner = copy.m_linkedBPartner;
}
/** Linked Business Partner */ /** Linked Business Partner */
private Integer m_linkedBPartner = null; private Integer m_linkedBPartner = null;
@ -128,7 +172,8 @@ public class MOrg extends X_AD_Org
*/ */
public MOrgInfo getInfo() public MOrgInfo getInfo()
{ {
return MOrgInfo.get(getCtx(), getAD_Org_ID(), get_TrxName()); MOrgInfo orgInfo = MOrgInfo.getCopy(Env.getCtx(), getAD_Org_ID(), get_TrxName());
return orgInfo;
} // getMOrgInfo } // getMOrgInfo
@ -151,7 +196,7 @@ public class MOrg extends X_AD_Org
// Access // Access
MRoleOrgAccess.createForOrg (this); MRoleOrgAccess.createForOrg (this);
MRole role = MRole.getDefault(getCtx(), true); // reload MRole role = MRole.getDefault(getCtx(), true); // reload
role.set_TrxName(get_TrxName()); role = new MRole(getCtx(), role, get_TrxName());
role.loadAccess(true); // reload org access within transaction role.loadAccess(true); // reload org access within transaction
// TreeNode // TreeNode
insert_Tree(MTree_Base.TREETYPE_Organization); insert_Tree(MTree_Base.TREETYPE_Organization);
@ -200,4 +245,13 @@ public class MOrg extends X_AD_Org
return m_linkedBPartner.intValue(); return m_linkedBPartner.intValue();
} // getLinkedC_BPartner_ID } // getLinkedC_BPartner_ID
@Override
public MOrg markImmutable() {
if (is_Immutable())
return this;
makeImmutable();
return this;
}
} // MOrg } // MOrg

View File

@ -19,7 +19,9 @@ package org.compiere.model;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.util.Properties; import java.util.Properties;
import org.compiere.util.CCache; import org.compiere.util.Env;
import org.idempiere.cache.ImmutableIntPOCache;
import org.idempiere.cache.ImmutablePOSupport;
/** /**
* Organization Info Model * Organization Info Model
@ -30,27 +32,46 @@ import org.compiere.util.CCache;
* @author Teo Sarca, www.arhipac.ro * @author Teo Sarca, www.arhipac.ro
* <li>BF [ 2107083 ] Caching of MOrgInfo issue * <li>BF [ 2107083 ] Caching of MOrgInfo issue
*/ */
public class MOrgInfo extends X_AD_OrgInfo public class MOrgInfo extends X_AD_OrgInfo implements ImmutablePOSupport
{ {
/** /**
* *
*/ */
private static final long serialVersionUID = 2496591466841600079L; private static final long serialVersionUID = -6257741576762100779L;
/** /**
* Load Constructor * Get MOrgInfo from cache (immutable)
* @param ctx context
* @param AD_Org_ID id * @param AD_Org_ID id
* @return Org Info * @return Org Info
* @deprecated
*/ */
public static MOrgInfo get (Properties ctx, int AD_Org_ID) public static MOrgInfo get (Properties ctx, int AD_Org_ID)
{ {
return get(ctx, AD_Org_ID, null); return get(ctx, AD_Org_ID, (String)null);
} // get } // get
/** /**
* Load Constructor * Get MOrgInfo from cache (immutable)
* @param AD_Org_ID id
* @param trxName
* @return Org Info
*/
public static MOrgInfo get (int AD_Org_ID, String trxName)
{
return get(Env.getCtx(), AD_Org_ID, trxName);
}
/**
* Get MOrgInfo from cache (immutable)
* @param AD_Org_ID id
* @return Org Info
*/
public static MOrgInfo get (int AD_Org_ID)
{
return get(AD_Org_ID, (String)null);
}
/**
* Get MOrgInfo from cache (immutable)
* @param ctx context * @param ctx context
* @param AD_Org_ID id * @param AD_Org_ID id
* @param trxName * @param trxName
@ -58,23 +79,39 @@ public class MOrgInfo extends X_AD_OrgInfo
*/ */
public static MOrgInfo get (Properties ctx, int AD_Org_ID, String trxName) public static MOrgInfo get (Properties ctx, int AD_Org_ID, String trxName)
{ {
MOrgInfo retValue = s_cache.get(AD_Org_ID); MOrgInfo retValue = s_cache.get(ctx, AD_Org_ID, e -> new MOrgInfo(ctx, e));
if (retValue != null) if (retValue != null)
{
return retValue; return retValue;
}
retValue = new Query(ctx, Table_Name, "AD_Org_ID=?", trxName) retValue = new Query(Env.getCtx(), Table_Name, "AD_Org_ID=?", trxName)
.setParameters(AD_Org_ID) .setParameters(AD_Org_ID)
.firstOnly(); .firstOnly();
if (retValue != null) if (retValue != null)
{ {
s_cache.put(AD_Org_ID, retValue); s_cache.put(AD_Org_ID, retValue, e -> new MOrgInfo(Env.getCtx(), e));
}
return retValue; return retValue;
}
return null;
} // get } // get
/**
* Get updateable copy of MOrgInfo from cache
* @param ctx
* @param AD_Org_ID
* @param trxName
* @return MOrgInfo
*/
public static MOrgInfo getCopy(Properties ctx, int AD_Org_ID, String trxName)
{
MOrgInfo oi = get(ctx, AD_Org_ID, trxName);
if (oi != null)
oi = new MOrgInfo(ctx, oi, trxName);
return oi;
}
/** Cache */ /** Cache */
private static CCache<Integer,MOrgInfo> s_cache = new CCache<Integer, MOrgInfo>(Table_Name, 50); private static ImmutableIntPOCache<Integer,MOrgInfo> s_cache = new ImmutableIntPOCache<Integer, MOrgInfo>(Table_Name, 50);
/************************************************************************** /**************************************************************************
@ -100,4 +137,44 @@ public class MOrgInfo extends X_AD_OrgInfo
setTaxID ("?"); setTaxID ("?");
} // MOrgInfo } // MOrgInfo
/**
*
* @param copy
*/
public MOrgInfo(MOrgInfo copy)
{
this(Env.getCtx(), copy);
}
/**
*
* @param ctx
* @param copy
*/
public MOrgInfo(Properties ctx, MOrgInfo copy)
{
this(ctx, copy, (String) null);
}
/**
*
* @param ctx
* @param copy
* @param trxName
*/
public MOrgInfo(Properties ctx, MOrgInfo copy, String trxName)
{
super(ctx, 0, trxName);
copyPO(copy);
}
@Override
public MOrgInfo markImmutable() {
if (is_Immutable())
return this;
makeImmutable();
return this;
}
} }

View File

@ -21,8 +21,10 @@ import java.util.Properties;
import java.util.List; import java.util.List;
import java.util.logging.Level; import java.util.logging.Level;
import org.compiere.util.CCache; import org.compiere.util.Env;
import org.compiere.util.Msg; import org.compiere.util.Msg;
import org.idempiere.cache.ImmutableIntPOCache;
import org.idempiere.cache.ImmutablePOSupport;
/** /**
@ -31,15 +33,25 @@ import org.compiere.util.Msg;
* @author Jorg Janke * @author Jorg Janke
* @version $Id: MPOS.java,v 1.3 2006/07/30 00:51:05 jjanke Exp $ * @version $Id: MPOS.java,v 1.3 2006/07/30 00:51:05 jjanke Exp $
*/ */
public class MPOS extends X_C_POS public class MPOS extends X_C_POS implements ImmutablePOSupport
{ {
/** /**
* *
*/ */
private static final long serialVersionUID = -1568195843844720536L; private static final long serialVersionUID = 2499679269059812831L;
/** /**
* Get POS from Cache * Get POS from Cache (immutable)
* @param C_POS_ID id
* @return MPOS
*/
public static MPOS get (int C_POS_ID)
{
return get(Env.getCtx(), C_POS_ID);
}
/**
* Get POS from Cache (immutable)
* @param ctx context * @param ctx context
* @param C_POS_ID id * @param C_POS_ID id
* @return MPOS * @return MPOS
@ -47,13 +59,16 @@ public class MPOS extends X_C_POS
public static MPOS get (Properties ctx, int C_POS_ID) public static MPOS get (Properties ctx, int C_POS_ID)
{ {
Integer key = Integer.valueOf(C_POS_ID); Integer key = Integer.valueOf(C_POS_ID);
MPOS retValue = (MPOS) s_cache.get (key); MPOS retValue = (MPOS) s_cache.get (ctx, key, e -> new MPOS(ctx, e));
if (retValue != null) if (retValue != null)
return retValue; return retValue;
retValue = new MPOS (ctx, C_POS_ID, null); retValue = new MPOS (ctx, C_POS_ID, (String)null);
if (retValue.get_ID () != 0) if (retValue.get_ID () == C_POS_ID)
s_cache.put (key, retValue); {
s_cache.put (key, retValue, e -> new MPOS(Env.getCtx(), e));
return retValue; return retValue;
}
return null;
} // get } // get
/** /**
@ -74,7 +89,7 @@ public class MPOS extends X_C_POS
} // get } // get
/** Cache */ /** Cache */
private static CCache<Integer,MPOS> s_cache = new CCache<Integer,MPOS>(Table_Name, 20); private static ImmutableIntPOCache<Integer,MPOS> s_cache = new ImmutableIntPOCache<Integer,MPOS>(Table_Name, 20);
/** /**
* Standard Constructor * Standard Constructor
@ -107,6 +122,38 @@ public class MPOS extends X_C_POS
super(ctx, rs, trxName); super(ctx, rs, trxName);
} // MPOS } // MPOS
/**
*
* @param copy
*/
public MPOS(MPOS copy)
{
this(Env.getCtx(), copy);
}
/**
*
* @param ctx
* @param copy
*/
public MPOS(Properties ctx, MPOS copy)
{
this(ctx, copy, (String) null);
}
/**
*
* @param ctx
* @param copy
* @param trxName
*/
public MPOS(Properties ctx, MPOS copy, String trxName)
{
this(ctx, 0, trxName);
copyPO(copy);
this.m_template = copy.m_template != null ? new MBPartner(ctx, copy.m_template, trxName) : null;
}
/** Cash Business Partner */ /** Cash Business Partner */
private MBPartner m_template = null; private MBPartner m_template = null;
@ -154,11 +201,24 @@ public class MPOS extends X_C_POS
m_template = MBPartner.getBPartnerCashTrx (getCtx(), getAD_Client_ID()); m_template = MBPartner.getBPartnerCashTrx (getCtx(), getAD_Client_ID());
else else
m_template = new MBPartner(getCtx(), getC_BPartnerCashTrx_ID(), get_TrxName()); m_template = new MBPartner(getCtx(), getC_BPartnerCashTrx_ID(), get_TrxName());
if (is_Immutable() && m_template != null)
m_template.markImmutable();
if (log.isLoggable(Level.FINE)) log.fine("getBPartner - " + m_template); if (log.isLoggable(Level.FINE)) log.fine("getBPartner - " + m_template);
} }
return m_template; return m_template;
} // getBPartner } // getBPartner
@Override
public MPOS markImmutable() {
if (is_Immutable())
return this;
makeImmutable();
if (m_template != null)
m_template.markImmutable();
return this;
}
@Override @Override
public String toString() { public String toString() {
return super.getName(); return super.getName();

Some files were not shown because too many files have changed in this diff Show More