The line " but this isn't really practical as I can override methods such as indexOf(Object o) as they rely on equals."
Should read "can't override methods" because of relying on equals. Anyway, seems as if the ojb methods are never called as I put some System.out.println() statements in all the methods, and the constructor and getter/setters get called OK, but the ojb methods never print out anything. Why would they never get called? Robert Giddings -----Original Message----- From: Robert Giddings [mailto:[EMAIL PROTECTED] Sent: 13 September 2007 10:16 To: 'OJB Users List' Subject: Overriding the ProxyList class Hi, Can anyone please tell me why this code doesn't seem to have an effect? That is I get a class cast exception because an encrypted object for example EncryptedCostCentre does not get decrypted to a CostCentre. Both classes implement an interface called ICostCentre, but this interface has no method signatures etc as the structure of the two classes is different. I.e. CostCentre has getter/setters and EncryptedCostCentre has an encrypt and decrypt methods. The concept works fine, if I override the java.util.List methods and encrypt and decrypt there, but this isn't really practical as I can override methods such as indexOf(Object o) as they rely on equals. The cypherMachine and encryptedClassType are set in the decrypt method of the owner object, where a reference to the ICostCentre collection is passed to the decrypted version of that object. Also what changes am I likely to need to make to the afterStore method? Thanks, Robert Giddings The code: package com.netcase.database.ojb.proxy; import java.lang.reflect.Method; import java.util.Iterator; import org.apache.ojb.broker.ManageableCollection; import org.apache.ojb.broker.PBKey; import org.apache.ojb.broker.PersistenceBroker; import org.apache.ojb.broker.PersistenceBrokerException; import org.apache.ojb.broker.core.proxy.ListProxyDefaultImpl; import org.apache.ojb.broker.query.Query; import com.netcase.encryption.CypherMachine; public class EncryptableCollectionProxy extends ListProxyDefaultImpl { private CypherMachine cypherMachine; private Class encryptedClassType; public EncryptableCollectionProxy(PBKey brokerKey, java.lang.Class collClass, Query query) { super(brokerKey, collClass, query); cypherMachine = null; encryptedClassType = null; } public EncryptableCollectionProxy(PBKey brokerKey, Query query) { super(brokerKey, query); cypherMachine = null; encryptedClassType = null; } /** * @return the cypherMachine */ public CypherMachine getCypherMachine() { return cypherMachine; } /** * @param cypherMachine the cypherMachine to set */ public void setCypherMachine(CypherMachine cypherMachine) { this.cypherMachine = cypherMachine; } /** * @return the encryptedClassType */ public Class getEncryptedClassType() { return encryptedClassType; } /** * @param encryptedClassType the encryptedClassType to set */ public void setEncryptedClassType(Class encryptedClassType) { this.encryptedClassType = encryptedClassType; } private Object decryptObject(Object o) { try { Method decrypt = encryptedClassType.getMethod("decrypt", CypherMachine.class); return decrypt.invoke(o, cypherMachine); } catch(Exception e) { return null; } } private Object encryptObject(Object o) { try { Method encrypt = encryptedClassType.getMethod("encrypt", CypherMachine.class); return encrypt.invoke(o, cypherMachine); } catch(Exception e) { return null; } } public void ojbAdd(Object anObject) { super.ojbAdd(this.decryptObject(anObject)); } public void ojbAddAll(ManageableCollection otherCollection) { Iterator i = otherCollection.ojbIterator(); while(i.hasNext()) { this.ojbAdd(i.next()); } } public Iterator ojbIterator() { EncryptableCollectionProxy ecp = new EncryptableCollectionProxy(this.getBrokerKey(), this.getCollectionClass(), this.getQuery()); for(Object o: this) { ecp.add(this.encryptObject(o)); } return ecp.ojbIterator(); } public void afterStore(PersistenceBroker broker) throws PersistenceBrokerException { super.afterStore(broker); } } An example of the XDoclet code is: /** * @ojb.collection element-class-ref="com.netcase.netspat.recordSystem.encryption.encrypted Objects.EncryptedCostCentre" * foreignkey="clientId" * proxy="true" * auto-retrieve="true" * auto-update="none" * auto-delete="none" */ private Collection<ICostCentre> costCentres; Use of code: public Client decrypt(CypherMachine cm) throws FailedDecryptionException { Client c = new Client(this.id); try { ... EncryptableCollectionProxy costCentresProxy = (EncryptableCollectionProxy)costCentres; costCentresProxy.setCypherMachine(cm); costCentresProxy.setEncryptedClassType(EncryptedCostCentre.class); c.setCostCentres(costCentresProxy); ... return c; } catch(Exception e) { throw new FailedDecryptionException("Unable to decrypt encrypted client: " + this.toString(), e); } } --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED] -- No virus found in this incoming message. Checked by AVG Free Edition. Version: 7.5.485 / Virus Database: 269.13.16/1004 - Release Date: 12/09/2007 17:22 --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]