package com.sun.j2ee.blueprints.opc.ejb;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.Iterator;
import java.net.URL;
import javax.ejb.EJBException;
import javax.ejb.CreateException;
import javax.ejb.FinderException;
import javax.ejb.MessageDrivenBean;
import javax.ejb.MessageDrivenContext;
import javax.naming.Context;
import javax.naming.NamingException;
import javax.jms.*;
import com.sun.j2ee.blueprints.xmldocuments.OrderApproval;
import com.sun.j2ee.blueprints.xmldocuments.ChangedOrder;
import com.sun.j2ee.blueprints.xmldocuments.XMLDocumentException;
import com.sun.j2ee.blueprints.xmldocuments.tpa.TPASupplierOrderXDE;
import com.sun.j2ee.blueprints.processmanager.ejb.ProcessManagerLocalHome;
import com.sun.j2ee.blueprints.processmanager.ejb.ProcessManagerLocal;
import com.sun.j2ee.blueprints.processmanager.ejb.OrderStatusNames;
import com.sun.j2ee.blueprints.contactinfo.ejb.ContactInfoLocal;
import com.sun.j2ee.blueprints.contactinfo.ejb.ContactInfoLocalHome;
import com.sun.j2ee.blueprints.address.ejb.AddressLocal;
import com.sun.j2ee.blueprints.address.ejb.AddressLocalHome;
import com.sun.j2ee.blueprints.lineitem.ejb.LineItemLocal;
import com.sun.j2ee.blueprints.lineitem.ejb.LineItemLocalHome;
import com.sun.j2ee.blueprints.lineitem.ejb.LineItem;
import com.sun.j2ee.blueprints.purchaseorder.ejb.PurchaseOrderLocalHome;
import com.sun.j2ee.blueprints.purchaseorder.ejb.PurchaseOrderLocal;
import com.sun.j2ee.blueprints.servicelocator.ServiceLocatorException;
import com.sun.j2ee.blueprints.servicelocator.ejb.ServiceLocator;
import com.sun.j2ee.blueprints.opc.transitions.*;
import com.sun.j2ee.blueprints.processmanager.transitions.*;
public class OrderApprovalMDB implements MessageDrivenBean, MessageListener {
private Context context;
private MessageDrivenContext mdc;
private TransitionDelegate transitionDelegate;
private ProcessManagerLocal processManager;
private TPASupplierOrderXDE supplierOrderXDE;
private PurchaseOrderLocalHome poHome;
private URL entityCatalogURL;
private boolean validateXmlOrderApproval;
private class WorkResult {
ArrayList supplierPoList;
String xmlMailOrderApprovals;
WorkResult(String xmlMailOrderApprovals, ArrayList supplierPoList) {
this.xmlMailOrderApprovals = xmlMailOrderApprovals;
this.supplierPoList = supplierPoList;
}
}
public OrderApprovalMDB() {
}
public void ejbCreate() {
try {
ServiceLocator serviceLocator = new ServiceLocator();
poHome = (PurchaseOrderLocalHome)serviceLocator.getLocalHome(JNDINames.PURCHASE_ORDER_EJB);
ProcessManagerLocalHome pmlh = (ProcessManagerLocalHome)serviceLocator.getLocalHome(JNDINames.PROCESS_MANAGER_EJB);
processManager = pmlh.create();
entityCatalogURL = serviceLocator.getUrl(JNDINames.XML_ENTITY_CATALOG_URL);
validateXmlOrderApproval = serviceLocator.getBoolean(JNDINames.XML_VALIDATION_ORDER_APPROVAL);
String tdClassName = serviceLocator.getString(JNDINames.TRANSITION_DELEGATE_ORDER_APPROVAL);
TransitionDelegateFactory tdf = new TransitionDelegateFactory();
transitionDelegate = tdf.getTransitionDelegate(tdClassName);
transitionDelegate.setup();
supplierOrderXDE = new TPASupplierOrderXDE(entityCatalogURL,
serviceLocator.getBoolean(JNDINames.XML_XSD_VALIDATION));
} catch (TransitionException te) {
throw new EJBException(te);
} catch (ServiceLocatorException se) {
throw new EJBException(se);
} catch (CreateException ce) {
throw new EJBException(ce);
} catch (XMLDocumentException xde) {
throw new EJBException(xde);
}
}
public void onMessage(Message recvMsg) {
TextMessage recdTM = null;
String recdText = null;
WorkResult result = null;
try {
recdTM = (TextMessage)recvMsg;
recdText = recdTM.getText();
result = doWork(recdText);
doTransition(result.supplierPoList, result.xmlMailOrderApprovals);
} catch(TransitionException te) {
throw new EJBException(te);
} catch(XMLDocumentException xde) {
throw new EJBException(xde);
}catch (JMSException je) {
throw new EJBException(je);
} catch(FinderException ce) {
throw new EJBException(ce);
}
}
public void setMessageDrivenContext(MessageDrivenContext mdc) {
this.mdc = mdc;
}
public void ejbRemove() {
}
private WorkResult doWork(String xmlMessage) throws XMLDocumentException, FinderException {
ArrayList supplierPoList = new ArrayList();
PurchaseOrderLocal po = null;
OrderApproval approval = null;
approval = OrderApproval.fromXML(xmlMessage, entityCatalogURL, validateXmlOrderApproval);
OrderApproval oaMailList = new OrderApproval();
String xmlMailOrderApprovals = null;
Collection coll = approval.getOrdersList();
Iterator it = coll.iterator();
while(it!= null && it.hasNext()) {
ChangedOrder co = (ChangedOrder) it.next();
String curStatus = processManager.getStatus(co.getOrderId());
if(!curStatus.equals(OrderStatusNames.PENDING)) {
continue;
}
oaMailList.addOrder(co);
processManager.updateStatus(co.getOrderId(), co.getOrderStatus());
if(co.getOrderStatus().equals(OrderStatusNames.APPROVED)) {
po = poHome.findByPrimaryKey(co.getOrderId());
String xmlPO = getXmlPO(po, supplierOrderXDE);
supplierPoList.add(xmlPO);
}
}
xmlMailOrderApprovals = oaMailList.toXML();
return new WorkResult(xmlMailOrderApprovals, supplierPoList);
}
private void doTransition(Collection supplierPoList, String xmlMailOrderApprovals) throws TransitionException {
TransitionInfo info = new TransitionInfo(xmlMailOrderApprovals, supplierPoList);
transitionDelegate.doTransition(info);
}
private String getXmlPO(PurchaseOrderLocal po, TPASupplierOrderXDE supplierOrderXDE) throws XMLDocumentException{
supplierOrderXDE.newDocument();
supplierOrderXDE.setOrderId(po.getPoId());
Date tmpDate = new Date(po.getPoDate());
supplierOrderXDE.setOrderDate(tmpDate);
ContactInfoLocal cinfo = po.getContactInfo();
AddressLocal addr = cinfo.getAddress();
supplierOrderXDE.setShippingAddress(cinfo.getGivenName(), cinfo.getFamilyName(),
addr.getStreetName1(), addr.getCity(),
addr.getState(), addr.getCountry(),
addr.getZipCode(), cinfo.getEmail(), cinfo.getTelephone());
Collection liColl = po.getData().getLineItems();
Iterator liIt = liColl.iterator();
while((liIt != null) && (liIt.hasNext())) {
LineItem li = (LineItem) liIt.next();
supplierOrderXDE.addLineItem(li.getCategoryId(), li.getProductId(), li.getItemId(),
li.getLineNumber(), li.getQuantity(), li.getUnitPrice());
}
return supplierOrderXDE.getDocumentAsString();
}
}