package org.nightlabs.jfire.trade.ui.articlecontainer.header.recurring;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.jdo.FetchPlan;
import javax.jdo.JDOHelper;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Display;
import org.nightlabs.jdo.NLJDOHelper;
import org.nightlabs.jfire.jdo.notification.DirtyObjectID;
import org.nightlabs.jfire.trade.ArticleContainerUtil;
import org.nightlabs.jfire.trade.Offer;
import org.nightlabs.jfire.trade.Order;
import org.nightlabs.jfire.trade.dao.OfferDAO;
import org.nightlabs.jfire.trade.id.OfferID;
import org.nightlabs.jfire.trade.id.OrderID;
import org.nightlabs.jfire.trade.recurring.RecurringOffer;
import org.nightlabs.jfire.trade.recurring.RecurringOrder;
import org.nightlabs.jfire.trade.recurring.dao.RecurringOrderDAO;
import org.nightlabs.jfire.trade.ui.articlecontainer.header.HeaderTreeNode;
import org.nightlabs.progress.ProgressMonitor;
import org.nightlabs.util.CollectionUtil;
/**
* @author Fitas Amine - fitas at nightlabs dot de
*/
public class RecurringOrderTreeNode extends HeaderTreeNode.ArticleContainerNode {
private RecurringOrder recurringOrder;
public static final String[] FETCH_GROUPS_ORDER = new String[] {
FetchPlan.DEFAULT,
Order.FETCH_GROUP_OFFERS
};
public static final String[] FETCH_GROUPS_OFFER = new String[] {
FetchPlan.DEFAULT,
Offer.FETCH_GROUP_ORDER
};
private Set<OfferID> offerIDsLoaded = new HashSet<OfferID>();
public RecurringOrderTreeNode(HeaderTreeNode parent, byte position ,RecurringOrder recurringOrder) {
super(parent, position);
this.recurringOrder = recurringOrder;
init();
}
@Override
protected List<HeaderTreeNode> createChildNodes(List<Object> childData) {
// TODO Auto-generated method stub
ArrayList<HeaderTreeNode> res = new ArrayList<HeaderTreeNode>();
for (Iterator<Object> it = childData.iterator(); it.hasNext(); ) {
Offer offer = (Offer) it.next();
OfferID offerID = (OfferID) JDOHelper.getObjectId(offer);
synchronized (offerIDsLoaded) {
if (!offerIDsLoaded.contains(offerID)) {
offerIDsLoaded.add(offerID);
res.add(new RecurringOfferTreeNode(this, POSITION_LAST_CHILD, (RecurringOffer) offer));
}
}
}
return res;
}
@Override
public Image getColumnImage(int columnIndex)
{
switch (columnIndex) {
case 0:
return getHeaderTreeComposite().getImageOrderTreeNode();
default:
return null;
}
}
@Override
public String getColumnText(int columnIndex)
{
switch (columnIndex) {
case 0: return ArticleContainerUtil.getArticleContainerID(recurringOrder);
default:
return null;
}
}
@Override
protected List<Object> loadChildData(ProgressMonitor monitor) {
try {
OrderID orderID = (OrderID) JDOHelper.getObjectId(recurringOrder);
RecurringOrder o = RecurringOrderDAO.sharedInstance().getRecurringOrder(orderID, FETCH_GROUPS_ORDER,
NLJDOHelper.MAX_FETCH_DEPTH_NO_LIMIT, monitor);
ArrayList<Offer> res = new ArrayList<Offer>(o.getOffers());
Collections.sort(res, new Comparator<Offer>() {
public int compare(Offer o0, Offer o1)
{
long id0 = o0.getOfferID();
long id1 = o1.getOfferID();
if (id0 == id1)
return 0;
if (id0 > id1)
return 1;
else
return -1;
}
});
return CollectionUtil.castList(res);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
@Override
public Collection<DirtyObjectID> onNewElementsCreated(Collection<DirtyObjectID> dirtyObjectIDs, ProgressMonitor monitor)
{
if (children != null) {
Map<Object, DirtyObjectID> objectID2DirtyObjectIDMap = new HashMap<Object, DirtyObjectID>(dirtyObjectIDs.size());
Set<OfferID> offerIDsToLoad = new HashSet<OfferID>();
for (Iterator<DirtyObjectID> itD = dirtyObjectIDs.iterator(); itD.hasNext(); ) {
DirtyObjectID dirtyObjectID = itD.next();
objectID2DirtyObjectIDMap.put(dirtyObjectID.getObjectID(), dirtyObjectID);
if (dirtyObjectID.getObjectID() instanceof OfferID) {
OfferID offerID = (OfferID) dirtyObjectID.getObjectID();
itD.remove();
synchronized (offerIDsLoaded) {
if (!offerIDsLoaded.contains(offerID))
offerIDsToLoad.add(offerID);
}
}
}
if (!offerIDsToLoad.isEmpty()) {
final List<Offer> offers = new OfferDAO().getOffers(offerIDsToLoad, FETCH_GROUPS_OFFER,
NLJDOHelper.MAX_FETCH_DEPTH_NO_LIMIT, monitor);
OrderID orderID = (OrderID) JDOHelper.getObjectId(getArticleContainer());
for (Iterator<Offer> it = offers.iterator(); it.hasNext(); ) {
Offer offer = it.next();
if (!orderID.equals(JDOHelper.getObjectId(offer.getOrder()))) {
it.remove();
dirtyObjectIDs.add(objectID2DirtyObjectIDMap.get(JDOHelper.getObjectId(offer)));
}
}
Display.getDefault().asyncExec(new Runnable()
{
public void run()
{
if (children == null)
return;
for (Offer offer : offers) {
OfferID offerID = (OfferID) JDOHelper.getObjectId(offer);
synchronized (offerIDsLoaded) {
if (!offerIDsLoaded.contains(offerID)) {
offerIDsLoaded.add(offerID);
new RecurringOfferTreeNode(RecurringOrderTreeNode.this, POSITION_FIRST_CHILD, (RecurringOffer) offer);
}
}
}
}
});
}
} // if (children != null) {
return super.onNewElementsCreated(dirtyObjectIDs, monitor);
}
@Override
public RecurringOrder getArticleContainer() {
return recurringOrder;
}
}