/* * ==================================================================== * * TORPEDO * A Testbed of Object Relational Products for Enterprise Distributed Objects * Copyright (c) 2004 The Middleware Company All Rights Reserved * @author Bruce Martin * @version 8.25.04 * * ==================================================================== */ package com.middleware_company.torpedo.auction.jdo; import javax.jdo.*; import javax.rmi.PortableRemoteObject; import javax.naming.NamingException; import javax.naming.Context; import javax.naming.InitialContext; import java.util.Collection; import java.util.Iterator; import java.util.ArrayList; import com.middleware_company.torpedo.auction.Auction; import com.middleware_company.torpedo.auction.User; import com.middleware_company.torpedo.auction.Bid; import com.riflexo.jcredo.core.*; import javax.resource.cci.ConnectionFactory; import javax.resource.*; import com.riflexo.jcredo.pub.*; import javax.jdo.spi.PersistenceCapable; import javax.jdo.JDOUserException; import java.util.*; public class Persistence extends com.middleware_company.torpedo.auction.Persistence { private static Context _context=null; public Bid createBid( String ID, Auction auction, User buyer, Float amount, Float maxAmount) throws NamingException { PersistenceManager pm = getPersistenceManager(buyer); Bid newBid = new JDOBid(ID,auction,buyer,amount,maxAmount); pm.makePersistent(newBid); return newBid; } public Object getObjectById(Object o, Object id){ JCredoPersistenceManager pm = null; try { pm = getPersistenceManager(o); } catch (NamingException ex) { throw new JDOFatalException("PersistenceManager not found", ex); } if (isAllowHollowEnabled(pm)){ pm.getFetchManager().setAllowHollow(true); } return pm.getObjectById(id, false); } public static boolean isAllowHollowEnabled(Object o){ return Boolean.TRUE.equals(getContext(o).get("requestAllHollow")); } public static void requestAllHollow(Object o) { Map m=getContext(o); m.put("requestAllHollow", Boolean.TRUE); } public static Map getContext(Object o){ PersistenceManager pm = null; try { pm = getPersistenceManager(o); } catch (NamingException ex) { throw new JDOFatalException("PersistenceManager not found", ex); } Object ctx=pm.getUserObject(); Map map=null; if (ctx==null){ map=new HashMap(); pm.setUserObject(map); } else { if (!(ctx instanceof Map)){ throw new JDOUserException("User object already in use but not Map"); } else{ map=(Map) ctx; } } return map; } public static JCredoPersistenceManager getPersistenceManager(Object o) throws NamingException{ if (o==null) return getPersistenceManager(); if (o instanceof JCredoPersistenceManager) return (JCredoPersistenceManager)o; Object pm=null; if (o instanceof JcredoPersistenceManagerFactory) pm=((JcredoPersistenceManagerFactory)o).getPersistenceManager(); else if (PersistenceCapable.class.isInstance(o)){ pm=JDOHelper.getPersistenceManager(o); } if (pm!=null) return (JCredoPersistenceManager)pm; return getPersistenceManager(); } public Auction getAuction(String auctionID) throws NamingException { JCredoPersistenceManager pm = getPersistenceManager(); Object oid = pm.newObjectIdInstance(JDOAuction.class,auctionID); Object o = getObjectById(pm, oid); return (Auction) o; } public Auction getPartialAuction(String auctionID) throws NamingException { JCredoPersistenceManager pm = getPersistenceManager(); pm.getFetchManager().addFetchGroup(JDOAuction.class, "auction-detail"); Object oid = pm.newObjectIdInstance(JDOAuction.class,auctionID); Object o = pm.getObjectById(oid,false); return (Auction) o; } public Auction getDetailAuction(String auctionID) throws NamingException { JCredoPersistenceManager pm = getPersistenceManager(); FetchManager fm=pm.getFetchManager(); fm.addFetchGroup(JDOAuction.class, "auction-detail"); fm.addFetchGroup(JDOAuction.class, "bid-detail"); fm.addFetchGroup(JDOBid.class, "bid-detail"); fm.setEagerFetchMode(JDBCFetchManager.EAGER_FETCH_MODE_MULTI); ((JDBCFetchManager)fm).forceSuperEagerFetchOnNextGetById(); Object oid = pm.newObjectIdInstance(JDOAuction.class, auctionID); Object o = pm.getObjectById(oid,false); return (Auction) o; } public User getUser(String ID) throws NamingException { JCredoPersistenceManager pm = getPersistenceManager(); Object o = getObjectById(pm, pm.newObjectIdInstance(JDOUser.class,ID)); return (User) o; } public Collection findAllAuctions() throws NamingException { JCredoPersistenceManager pm = getPersistenceManager(); FetchManager fm=pm.getFetchManager(); fm.addFetchGroup(JDOAuction.class,"auction-detail"); fm.addFetchGroup(JDOAuction.class,"bid-detail"); fm.addFetchGroup(JDOBid.class, "bid-detail"); fm.setEagerFetchMode(FetchManager.EAGER_FETCH_MODE_MULTI); Query q = pm.newQuery (JDOAuction.class); Collection auctions = (Collection) q.execute(); return auctions; } public Collection findHighBids(String auctionID) throws NamingException { JCredoPersistenceManager pm = getPersistenceManager(); JCredoQuery q = (JCredoQuery) pm.newQuery(JDOBid.class, "this.auction == auction"); q.declareParameters("JDOAuction auction"); q.setOrdering("this.amount descending"); JDBCFetchManager fm=(JDBCFetchManager) q.getFetchManager(); fm.addFetchGroup(JDOBid.class, "bid-detail"); fm.setLargeResultSetSupportEnabled(true); fm.setPrefetchCount(3); fm.setResultSetSizeMethod(JDBCFetchManager.SIZE_METHOD_RESULT_SET_LAST); Object aucID = pm.newObjectIdInstance(JDOAuction.class, auctionID); pm.getFetchManager().setAllowHollow(true); JDOAuction auction=(JDOAuction) pm.getObjectById(aucID, false); pm.getFetchManager().setAllowHollow(false); Collection allBids = (Collection) q.execute(auction); Collection highBids = new ArrayList(); Number n = null; for (Iterator i = allBids.iterator(); i.hasNext(); ) { Bid bid = (Bid) i.next(); Number bidAmount = bid.getAmount(); if (n == null) n = bidAmount; if (bidAmount.equals(n)) highBids.add(bid); } q.closeAll(); return highBids; } private static JCredoPersistenceManager getPersistenceManager () throws NamingException { return (JCredoPersistenceManager)getPersistenceManagerFactory ().getPersistenceManager (); } private static PersistenceManagerFactory getPersistenceManagerFactory () throws NamingException { ConnectionFactory eeFactory=(ConnectionFactory)getContext().lookup("jcredo"); try { JcredoPersistenceManagerFactory pmf= (JcredoPersistenceManagerFactory) eeFactory.getRecordFactory(); return pmf; } catch (ResourceException ex) { throw new NamingException("Unexpected resource exception : "+ ex.getMessage()); } } private static Context getContext () throws NamingException { if (_context == null) _context = new InitialContext (); return _context; } public void close() { try { JCredoPersistenceManager pm = getPersistenceManager(); pm.close(); } catch (NamingException ex) { throw new JDOFatalException("Can not find persistence manager : ", ex); } } }