/*********************************************************************** * 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. * **********************************************************************/ package org.idempiere.fa.util; import java.util.Properties; import org.adempiere.exceptions.AdempiereException; import org.compiere.model.MTable; import org.compiere.model.PO; /** * Load and cache instance of foreign key referenced PO.
* For e.g, parent is MOrderLine and referenced PO is MProduct. * @author Teo Sarca, SC ARHIPAC SERVICE SRL * @param Foreing key reference type */ public final class POCacheLocal { private final PO parent; private final String idColumnName; private final String po_tableName; private T po = null; /** * Create new instance of POCacheLocal * @param * @param parent * @param cl * @return POCacheLocal */ public static POCacheLocal newInstance(PO parent, Class cl) { return new POCacheLocal(parent, cl); } /** * Create new instance of POCacheLocal * @param * @param parent * @param cl * @param idColumnName * @return POCacheLocal */ public static POCacheLocal newInstance(PO parent, Class cl, String idColumnName) { return new POCacheLocal(parent, cl, idColumnName); } /** * @param parent * @param cl */ private POCacheLocal(PO parent, Class cl) { this(parent, cl, null); } /** * @param parent Parent PO * @param cl foreign key reference type * @param idColumnName optional foreign key reference column name in parent */ private POCacheLocal(PO parent, Class cl, String idColumnName) { this.parent = parent; try { this.po_tableName = (String)cl.getField("Table_Name").get(null); } catch (Exception e) { throw new AdempiereException(e); } if (idColumnName == null) { this.idColumnName = this.po_tableName + "_ID"; } else { this.idColumnName = idColumnName; } } /** * Get instance of referenced PO from cache or DB * @param requery true to always reload from DB * @return instance of referenced PO */ public T get(boolean requery) { int id = get_id(); if (id <= 0) { this.po = null; return null; } if (requery || !isValidPO(this.po)) { this.po = load(this.parent.getCtx(), id, this.parent.get_TrxName()); } return this.po; } /** * Set cached referenced PO * @param po */ public void set(T po) { if (isValidPO(po)) { this.po = po; } } /** * @param po * @return true if po is a valid instance of referenced PO */ private boolean isValidPO(T po) { int id = get_id(); return id > 0 && po != null && po.get_ID() == id && Util.equals(this.parent.get_TrxName(), po.get_TrxName()) ; } /** * Load referenced PO from DB * @param ctx * @param id * @param trxName * @return loaded referenced PO instance */ @SuppressWarnings("unchecked") protected T load(Properties ctx, int id, String trxName) { return (T)MTable.get(ctx, this.po_tableName).getPO(id, trxName); } /** * @return foreign key reference id value from parent PO */ private int get_id() { return parent.get_ValueAsInt(idColumnName); } }