RE: Overriding the ProxyList class

"Robert Giddings" <[email protected]> Sat, 15 Sep 2007 14:33:14 +0100
Newsgroups gmane.comp.jakarta.ojb.user
Message-ID <000c01c7f79c$f7fbc660$0600a8c0@zaphod>
Hi Armin,

I solved my problem. It was the protected method loadData() I needed to
override. It worked but suffered from infinite loop problems when
decrypting/encrypting because of a reference to the collection owner
object in each of the collection element objects. I have since looked at
other ideas and ways to resolve that issue.

Thanks,

Robert Giddings

-----Original Message-----
From: Armin Waibel [mailto:[email protected]] 
Sent: 15 September 2007 00:10
To: OJB Users List
Subject: Re: Overriding the ProxyList class

Hi Robert,

Robert Giddings wrote:
> 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?
> 

I think OJB doesn't know about the List proxy class or do you declare 
this class as List/Collection/(Set) proxy in OJB.properties file?
You can't declare specific collection proxy classes per 1:n, m:n 
reference only a general for all Collection, List and Set references.

regards,
Armin



> 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]
> 
> 
> 
> 

---------------------------------------------------------------------
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.487 / Virus Database: 269.13.19/1008 - Release Date:
14/09/2007 08:59