0 Replies Latest reply on Jul 9, 2004 12:58 PM by khumes86

    Passing a Session Bean reference to a Java Class.  Design Qu

    khumes86

      I have a session bean that I am using to get Categories from the ebay API for my
      application. The categories are returned as an XML stream. I used SAX to write a
      parser to parse the XML stream and then insert the categories into a database. I have
      an entity bean that handles the insertion. What I did was pass a reference to the bean
      class of the session bean in the constructor for the XML parser so I could call the method
      to insert into the database after the parser has seen each category. My question is, is
      this considered bad design passing a reference to the bean to the java class. It is
      packaged in the same JAR with the beans. Here is the code.

      ***********************
      THE XML PARSER
      ***********************
      package ebaycategories;

      import org.xml.sax.SAXException;
      import org.xml.sax.helpers.DefaultHandler;
      import javax.xml.parsers.SAXParserFactory;
      import javax.xml.parsers.SAXParser;
      import org.xml.sax.Attributes;
      import java.io.*;

      public class EbayCategoryParser extends DefaultHandler
      {

      //this is the bean reference
      private EbayCategoryUpdaterBean updaterRef;
      private SAXParserFactory factory;
      private SAXParser parser;

      private CategoryElement ebay;
      private CategoryElement ebaytime;
      private CategoryElement categories;
      private CategoryElement version;
      private CategoryElement updategmttime;
      private CategoryElement updatetime;
      private CategoryElement category;
      private CategoryElement categoryid;
      private CategoryElement categorylevel;
      private CategoryElement categoryname;
      private CategoryElement categoryparentid;
      private CategoryElement isexpired;
      private CategoryElement isintlautosfixed;
      private CategoryElement isvirtual;
      private CategoryElement leafcategory;

      private EbayCategory ebayCategory;

      public EbayCategoryParser(EbayCategoryUpdaterBean ref)
      {
      updaterRef=ref;

      try
      {
      factory=SAXParserFactory.newInstance();
      parser=factory.newSAXParser();
      }
      catch(Exception EX)
      {
      }

      ebay=new CategoryElement("eBay");
      ebaytime=new CategoryElement("EbayTime");
      categories=new CategoryElement("Categories");
      version=new CategoryElement("Version");
      updategmttime=new CategoryElement("UpdateGMTTime");
      updatetime=new CategoryElement("UpdateTime");
      category=new CategoryElement("Category");
      categoryid=new CategoryElement("CategoryId");
      categorylevel=new CategoryElement("CategoryLevel");
      categoryname=new CategoryElement("CategoryName");
      categoryparentid=new CategoryElement("CategoryParentId");
      isexpired=new CategoryElement("IsExpired");
      isintlautosfixed=new CategoryElement("IsIntlAutosFixed");
      isvirtual=new CategoryElement("IsVirtual");
      leafcategory=new CategoryElement("LeafCategory");
      }

      public void parseCategories(InputStream is)
      {
      try
      {
      parser.parse(is,this);
      }
      catch(Exception EX)
      {
      }
      }

      public void startElement(String URI, String localName,
      String qName, Attributes attributes)
      throws SAXException
      {
      if(qName==ebay.getName())ebay.changeState();
      if(qName==ebaytime.getName())ebaytime.changeState();
      if(qName==categories.getName())categories.changeState();
      if(qName==version.getName())version.changeState();
      if(qName==updategmttime.getName())updategmttime.changeState();
      if(qName==updatetime.getName())updatetime.changeState();
      if(qName==category.getName())
      {
      ebayCategory=new EbayCategory();
      category.changeState();
      }
      if(qName==categoryid.getName())categoryid.changeState();
      if(qName==categorylevel.getName())categorylevel.changeState();
      if(qName==categoryname.getName())categoryname.changeState();
      if(qName==categoryparentid.getName())categoryparentid.changeState();
      if(qName==isexpired.getName())isexpired.changeState();
      if(qName==isintlautosfixed.getName())isintlautosfixed.changeState();
      if(qName==isvirtual.getName())isvirtual.changeState();
      if(qName==leafcategory.getName())leafcategory.changeState();
      }

      public void endElement(String URI, String localName, String qName)
      throws SAXException
      {
      if(qName==ebay.getName())ebay.changeState();
      if(qName==ebaytime.getName())ebaytime.changeState();
      if(qName==categories.getName())categories.changeState();
      if(qName==version.getName())version.changeState();
      if(qName==updategmttime.getName())updategmttime.changeState();
      if(qName==updatetime.getName())updatetime.changeState();
      if(qName==category.getName())
      {
      //here is where it calls the method on the bean to insert the Category
      updaterRef.addEbayCategory(ebayCategory);
      category.changeState();
      ebayCategory=null;
      }
      if(qName==categoryid.getName())categoryid.changeState();
      if(qName==categorylevel.getName())categorylevel.changeState();
      if(qName==categoryname.getName())categoryname.changeState();
      if(qName==categoryparentid.getName())categoryparentid.changeState();
      if(qName==isexpired.getName())isexpired.changeState();
      if(qName==isintlautosfixed.getName())isintlautosfixed.changeState();
      if(qName==isvirtual.getName())isvirtual.changeState();
      if(qName==leafcategory.getName())leafcategory.changeState();
      }

      public void characters(char [] ch, int start, int length)
      throws SAXException
      {
      String chars=new String(ch,start,length);

      if(ebay.in())
      {
      if(categories.in())
      {
      if(category.in())
      {
      if(categoryid.in())
      {
      ebayCategory=new EbayCategory();
      ebayCategory.setCategoryId(chars);
      }

      if(categorylevel.in())
      {
      ebayCategory.setCategoryLevel(chars);
      }

      if(categoryname.in())
      {
      ebayCategory.setCategoryName(chars);
      }

      if(categoryparentid.in())
      {
      ebayCategory.setCategoryParentId(chars);
      }

      if(isexpired.in())
      {
      if(Integer.parseInt(chars)==0)
      ebayCategory.setIsExpired(false);
      else
      ebayCategory.setIsExpired(true);
      }

      if(isintlautosfixed.in())
      {
      if(Integer.parseInt(chars)==0)
      ebayCategory.setIsIntlAutosFixedCat(false);
      else
      ebayCategory.setIsIntlAutosFixedCat(true);
      }

      if(isvirtual.in())
      {
      if(Integer.parseInt(chars)==0)
      ebayCategory.setIsVirtual(false);
      else
      ebayCategory.setIsVirtual(true);
      }

      if(leafcategory.in())
      {
      if(Integer.parseInt(chars)==0)
      ebayCategory.setLeafCategory(false);
      else
      ebayCategory.setLeafCategory(true);
      }
      }
      }
      }
      }
      }

      class CategoryElement
      {
      private String name;
      private boolean flag;

      public CategoryElement(String name)
      {
      this.name=name;
      flag=false;
      }

      public String getName()
      {
      return name;
      }

      public boolean in()
      {
      return flag;
      }

      public void changeState()
      {
      flag=!flag;
      }
      }


      *****************************************
      The session bean
      *****************************************
      package ebaycategories;

      import javax.ejb.SessionBean;
      import javax.ejb.SessionContext;
      import javax.naming.InitialContext;
      import javax.naming.NamingException;
      import javax.net.ssl.HttpsURLConnection;
      import java.net.*;
      import java.io.*;

      public class EbayCategoryUpdaterBean implements SessionBean
      {
      private EbayCategoryLocalHome ebayCategoryLocalHome;

      //here is the parser
      private EbayCategoryParser ebayCategoryParser;

      private URL sandbox;
      private HttpsURLConnection sandboxConn;

      public void updateEbayCategories()
      {
      try
      {
      sandbox=new URL(sandboxURL);
      sandboxConn=(HttpsURLConnection)sandbox.openConnection();

      sandboxConn.setDoInput(true);
      sandboxConn.setDoOutput(true);

      sandboxConn.setRequestMethod("POST");

      sandboxConn.addRequestProperty("X-EBAY-API-COMPATIBILITY-LEVEL",compatibilityLevel);
      sandboxConn.addRequestProperty("X-EBAY-API-SESSION-CERTIFICATE",sessionCertificate);
      sandboxConn.addRequestProperty("X-EBAY-API-DEV-NAME",devName);
      sandboxConn.addRequestProperty("X-EBAY-API-APP-NAME",appName);
      sandboxConn.addRequestProperty("X-EBAY-API-CERT-NAME",certName);
      sandboxConn.addRequestProperty("X-EBAY-API-CALL-NAME",callName);
      sandboxConn.addRequestProperty("X-EBAY-API-DETAIL-LEVEL",detailLevel);
      sandboxConn.addRequestProperty("X-EBAY-API-SITEID",siteID);
      sandboxConn.addRequestProperty("Content-Type",contentType);

      OutputStream output = sandboxConn.getOutputStream();
      PrintStream sendToSandbox = new PrintStream(output);

      sendToSandbox.print(xmlFunctionCall);
      sendToSandbox.close();

      InputStream input = sandboxConn.getInputStream();

      ebayCategoryParser.parseCategories(input);
      //BufferedInputStream fromSandbox = new BufferedInputStream(input);
      }
      catch(Exception EX)
      {
      }
      }

      public void addEbayCategory(EbayCategory ebayCategory)
      {
      EbayCategoryLocal ebayCategoryLocal=null;
      try
      {
      ebayCategoryLocal=ebayCategoryLocalHome.create(ebayCategory.getCategoryId(),
      ebayCategory.getCategoryLevel(),ebayCategory.getCategoryName(),
      ebayCategory.getCategoryParentId(),""+ebayCategory.isIsExpired(),
      ""+ebayCategory.isIsIntlAutosFixedCat(),""+ebayCategory.isIsVirtual(),
      ""+ebayCategory.isLeafCategory());
      }
      catch(javax.ejb.CreateException CEX)
      {
      }
      }

      public void ejbCreate()
      {
      try
      {
      ebayCategoryLocalHome=getEbayCategoryLocalHome();
      }
      catch(NamingException NEX)
      {
      }
      //construct the parser with a reference to this bean class
      ebayCategoryParser=new EbayCategoryParser(this);
      }

      public void ejbActivate()
      {
      }

      public void ejbPassivate()
      {
      }

      public void ejbRemove()
      {
      }

      public void setSessionContext(SessionContext ctx)
      {
      }

      private EbayCategoryLocalHome getEbayCategoryLocalHome() throws NamingException
      {
      final InitialContext context = new InitialContext();
      return (EbayCategoryLocalHome)context.lookup("java:comp/env/ejb/local/EbayCategory");
      }



      //for connecting to ebay
      static final String sandboxURL = "https://api.sandbox.ebay.com/ws/api.dll";

      static final String DevID = "devid";
      static final String AppID = "appid";
      static final String CertID = "certid";
      static final String compatibilityLevel = "305";
      static final String sessionCertificate = DevID + ";" + AppID + ";" + CertID;
      static final String devName = DevID;
      static final String appName = AppID;
      static final String certName = CertID;
      static final String callName = "GetCategories";
      static final String siteID = "0";
      static final String detailLevel = "1";
      static final String contentType = "text/xml";

      static final String authToken = "authtoken";

      static final String xmlFunctionCall =
      "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
      "" +
      ""+authToken+"" +
      "1" +
      "1" +
      "0" +
      "GetCategories" +
      "1" +
      "0" +
      "";
      }


      If anyone has an opinion on this or knows a better design I would greatly
      appreciate it.