Example: Creating a Selector

This code was written by JD Edwards EnterpriseOne to build the Version 1 XML selector. This sample code uses the XTS.jar file. You can use this code as a sample for creating your selector:

File: XTSMJDETemplateSelector.java
////////////////////////////////////////////////////////////////////////////////
package com.jdedwards.xts.xtsm;
import com.jdedwards.xts.xtsr.IXTSRepository;
import com.jdedwards.xts.xtsr.IXTSRKey;
import com.jdedwards.xts.xtsr.XTSRException;
import com.jdedwards.xts.xtsr.XTSRInvalidKeyStringException;
import com.jdedwards.xts.xtsr.XTSRInvalidKeyFieldException;
import com.jdedwards.xts.xtsr.XTSRKeyNotFoundException;
import com.jdedwards.xts.XTSDocument;
import com.jdedwards.xts.XTSFactory;
import com.jdedwards.xts.XTSLog;
import com.jdedwards.xts.XTSConfigurationException;
import com.jdedwards.xts.XTSXMLParseException;
import com.jdedwards.xts.xtsm.IXTSMTemplateSelector;
import com.jdedwards.xts.xtse.IXTSEngine;
import com.jdedwards.xts.xtse.IXTSECompiledProcessor;
import java.util.List;
import org.w3c.dom.*;

/**
* This class is the  Template Selector. It recognizes
* JD Edwards EnterpriseOne standard XML documents and returns the
* appropriate XSL stylesheets necessary for transformation.
*/
public class XTSMJDETemplateSelector implements IXTSMTemplateSelector
{
 /** Class constructor. */
 public XTSMJDETemplateSelector()
 {
  XTSLog.trace(XTSMJDETemplateSelector()'', 3);
  // get repository reference
  XTSFactory factory = XTSFactory.getInstance();
  m_repository = factory.createXTSRepository();
 }

 /**
 * Fetch the appropriate XSLT documents and IXTSECompiledProcessors as
 * indicated by the TPT stored in the <code>info</code> parameter.
 * @param info - Selection Info that contains TPI and should be modified
 * by the selector to specify transformation information.
 * @exception IXTSMTemplateSelector.TemplateFetchException - thrown
 * if an error occurs when extracting information from the
 * inclement.
 */
 public void fetchTemplates(IXTSMSelectionInfo info)
    throws IXTSMTemplateSelector.TemplateFetchException
 {
  XTSLog.trace("XTSMJDETemplateSelector.fetchTemplates(XTSMSelectionResult)", 
3);
  NodeList nodes = info.getTPIElement().getElementsByTagName(JDE_TS_XTSR_KEY);
  int numNodes = nodes.getLength();
  for(int i = 0; i < numNodes; i++)
  {
    // extract key info & create a key
    IXTSRKey key = createKeyFromNode((Element)nodes.item(i));

    // fetch the doc and add it to the list
    try
    {
     info.getXSLList().add(m_repository.fetch(key));
    }
    catch (XTSRKeyNotFoundException e)
    {
     throw new IXTSMTemplateSelector.TemplateFetchException(
        "Selected XTSRKey not found in repository: "
        + JDE_TS_XTSR_KEY);
    }
    catch (XTSRException e)
    {
     throw new IXTSMTemplateSelector.TemplateFetchException(
        "Unable to fetch the XSL document specified within '"
        + JDE_TS_XTSR_KEY +
        "' from the XTSRepository");
    }
  }
 }

 /**
 * Fetch the appropriate XSLT documents and compiled processors for
 * the given document.
 * @param inXML - the XTSDocument to try to recognize.
 * @param info - Selection Info object to be modified by selector to
 * indicate transformation information.
 * @return - <code>true</code> if the selector has recognized the
 * document and specified the appropriate selection info using
 * <code>info</code>, <code>false</code> otherwise.
 * @exception TemplateFetchException - thrown when an error occurs
 * when trying to recognize the DOM.
 * @exception XTSXMLParseException - thrown if <inXML> could not be
 * parsed.
 */
 public boolean fetchTemplates(XTSDocument inXML,
                IXTSMSelectionInfo info)
  throws IXTSMTemplateSelector.TemplateFetchException,
      XTSXMLParseException
 {
  XTSLog.trace("XTSMJDETemplateSelector.fetchTemplates(Document, Element)", 3);
  boolean recognized = false;
  Document inDOM = inXML.getDOM();
  // see if an XTSR key is specified within the document:
  NodeList nodeList = inDOM.getElementsByTagName(JDE_XTSR_KEY);
  if (nodeList.getLength() > 0)
  {
    try
    {

     // extract key info & create a key
     IXTSRKey key = createKeyFromNode((Element)nodeList.item(0));

     // add transformation path information to outElement
     createNodeChildFromKey(info.getTPIElement(), key);

     // fetch the doc and add it to the list
     info.getXSLList().add(m_repository.fetch(key));

     info.setResultXML(true);
     info.setPathInfoStored(false);
     recognized = true;
    }
    catch (XTSRException e)
    {
     throw new IXTSMTemplateSelector.TemplateFetchException(
          "Unable to fetch the XSL document specified within '"
          + JDE_XTSR_KEY +
          "' from the XTSRepository");
    }
    catch (XTSRKeyNotFoundException e)
    {
     throw new IXTSMTemplateSelector.TemplateFetchException(
          "Key specified in TPI not found in repository"
          + JDE_XTSR_KEY);
    }
  }
  else // no XTSR key, so look for JDE information:
  {
    nodeList = inDOM.getElementsByTagName(JDE_INT_BPAPI);
    if (nodeList.getLength() != 0)
    {
     // add transformation path information to outElement
     createNodeChildFromKey(info.getTPIElement(), getVersion1toNativeKey());

     // fetch the doc and add it to the list
     info.getXSLList().add(getVersion1toNativeXSL());

     info.setResultXML(true);
     info.setPathInfoStored(true);
     recognized = true;
    }
  }
  return recognized;
 }
 /**
 * Extracts XTSRKey information from the given node, and creates an
 * instance of IXTSRKey based on that information.
 * @return - the new IXTSRKey.
 * @param element - Element that contains the key information.
 * @exception XTSMUnrecognizedElementException - thrown if the
 * Element format is unrecognized.
 */
 protected IXTSRKey createKeyFromNode(Element element)
      throws XTSMUnrecognizedElementException
 {
  XTSLog.trace("XTSMJDETemplateSelector.createKeyFromNode(Element)", 4);
  IXTSRKey key = null;
  boolean request = false;
  boolean response = false;
  if (element.getNodeName().equals(JDE_XTSR_KEY))
  {
    request = true;
  }
  else if (element.getNodeName().equals(JDE_TS_XTSR_KEY))
  {
    response = true;
  }
  if (request || response)
  {
    key = m_repository.createKey();
    try
    {
     String keyString = element.getAttribute(JDE_XTSR_KEY_ATTRIBUTE);
     key.setFieldsFromString(keyString);
     if (key.getFieldValue(SUBTYPE_FIELD).length() == 0)
     {
       if (request)
       {
        key.setFieldValue(SUBTYPE_FIELD, SUBTYPE_REQUEST);
       }
       else
       {
        key.setFieldValue(SUBTYPE_FIELD, SUBTYPE_RESPONSE);
       }
     }
    }
    catch (XTSRInvalidKeyStringException e)
    {
     throw new XTSMUnrecognizedElementException(
          "Specified '" + JDE_XTSR_KEY +
          "' element format is invalid for this XTSRepository");
    }
    catch (XTSRInvalidKeyFieldException e)
    {
     throw new XTSConfigurationException(
          "Specified '" + SUBTYPE_FIELD +
          "' field name not supported by repository key");
    }
  }
  return key;
 }
 /**
 * Creates a node that contains the key fields values and appends it
 * to the given parentNode.
 * @param parentNode - Node to which the key information should be
 * appended.
 * @param key - Key information to store in the node.*/

 protected void createNodeChildFromKey(Node parentNode, IXTSRKey key)
 {
  XTSLog.trace("XTSMJDETemplateSelector.createKeyFromNode(Node,IXTSRKey)", 4);
  try
  {
    IXTSRKey keyClone = key.getRepository().createKey();
    keyClone.setFieldsFromString(key.getFieldsString());

    // Do not store the sub type, clear it here:
    keyClone.setFieldValue(SUBTYPE_FIELD, "");

    // create new node and append it to the provided element:
    Element element = (Element)parentNode.getOwnerDocument().createElement
(JDE_TS_XTSR_KEY);
    element.setAttribute(JDE_XTSR_KEY_ATTRIBUTE, keyClone.getFieldsString());
    parentNode.appendChild(element);
  }
  catch (XTSRInvalidKeyStringException e)
  {
    XTSLog.log("Unexpected ");
    XTSLog.log(e);
    throw new RuntimeException("Unexpected Exception: " + e.toString());
  }
 }

 /**
 * Returns the key of the stylesheet to use in converting
 * JD Edwards EnterpriseOne version 1 documents into EnterpriseOne native
 * documents.
 * @return - The key for the XSL stylesheet.
 */
 protected IXTSRKey getVersion1toNativeKey()
 {
  XTSLog.trace("XTSMJDETemplateSelector.getVersion1toNativeKey()", 5);
  if (null == m_version1ToNativeKey)
  {
    try
    {
     // create standard xsl XTSRKey:
     m_version1ToNativeKey = m_repository.createKey();
     m_version1ToNativeKey.setFieldsFromString(V1_TO_NATIVE_KEY);
    }
    catch (XTSRInvalidKeyStringException e)
    {
     String error = "XTSRKey necessary for JDE template selection is invalid: "
           + V1_TO_NATIVE_KEY;
     XTSLog.log(error);
     XTSLog.log(e);
     throw new XTSConfigurationException(error);
    }
  }
  return m_version1ToNativeKey;
 }

 /**
 * Returns the XTSDocument which contains the XSL stylesheet for
 * converting JD Edwards EnterpriseOne version 1 documents into JD Edwards
 * EnterpriseOne native documents.
 * @return - XTSDocument containing the XSL stylesheet.
 */
 protected IXTSECompiledProcessor getVersion1toNativeXSL()
 {
  XTSLog.trace("XTSMJDETemplateSelector.getVersion1toNativeXSL()", 5);
  if (null == m_version1ToNativeXSL)
  {
    XTSDocument xsl = null;
    Try
    {
     xsl = m_repository.fetch(getVersion1toNativeKey());
     IXTSEngine engine = XTSFactory.getInstance().createXTSEngine();
     m_version1ToNativeXSL = engine.createCompiledProcessor(xsl);
    }
    catch (XTSRException e)
    {
     String error = "Unable to fetch selected template from the repository:";
     XTSLog.log(error);
     XTSLog.log(e);
     throw new XTSConfigurationException(error + e.toString());
    }
    catch (XTSRKeyNotFoundException knfe)
    {
     String error = "Selected template XTSRKey not found in repository:";
     XTSLog.log(error);
     XTSLog.log(knfe);
     throw new XTSConfigurationException(error + knfe.toString());
    }
    catch (XTSXMLParseException pe)
    {
     String error = "Invalid XSL document in repository";
     XTSLog.log(error);
     XTSLog.log(pe);
     throw new XTSConfigurationException(error + pe.toString());
    }
  }
  return m_version1ToNativeXSL;
 }

 /** Reference to the XTSRepository */
 private IXTSRepository m_repository = null;

 /** Key for converting version 1 documents to native documents. */
 private IXTSRKey m_version1ToNativeKey = null;

 /** Compiled XSL Stylesheet for converting version 1 docs to
  *  native docs. */
 private IXTSECompiledProcessor m_version1ToNativeXSL = null;

 /** Field Value for the XTSRKey that indicates the document is an XSL doc */
 private static final String DOC_TYPE_XSL = "XSL";

 /** Element name that indicates the DOM is a Version 1 document */
 private static final String JDE_INT_BPAPI = "intBPAPI";

 /** Element name that indicates the DOM is a request and not a
  *  response or error. */
 private static final String JDE_REQUEST = "jdeRequest";

 /** Element name that indicates the DOM is a response */
 private static final String RESPONSE = "jdeResponse";

 /** Element name that specifies an XTSRKey to use in transforming
  *  the document. */
 private static final String JDE_XTSR_KEY = "jdeXTSRKey";

 /** The attribute of the <code>JDE_XTSR_KEY</code> element that
  *  stores the XTSRKey string value */
 private static final String JDE_XTSR_KEY_ATTRIBUTE = "key";

 /** XTSRKey field name that specifies the sub-type of the XML
  * document. Normal values for the sub-type are defined by
  * <code>SUBTYPE_REQUEST</code> and <code>SUBTYPE_RESPONSE</code> */
 private static final String SUBTYPE_FIELD = "SUB_TYPE";

 /** XTSRKey field name which specifies the type of the XML document.
  *  The normal value is defined by <code>DOC_TYPE_XSL</code> */
 private static final String FIELD_TYPE = "TYPE";

 /** XTSRKey field name which specifies the format (or owner) of the
  *  XML document. The normal value recognized by this selector is
 * 'JDE' */
 private static final String FIELD_FORMAT = "FORMAT";

 /** XTSRKey field name that specifies the particular transformation
  *  that the XSL document will perform. This selector uses
  *  'V1_NATIVE' for transformations between JD Edwards EnterpriseOne Version 1
  *  XML documents and JD Edwards EnterpriseOne native version documents. */
 private static final String FIELD_ID = "ID";

 /** The string representation of the XTSRKey for the XSL document to
  *  format JD Edwards EnterpriseOne version 1 request documents into
  *  JD Edwards EnterpriseOne native request documents. */
 private static final String V1_TO_NATIVE_KEY = "XSL-JDE-V1_NATIVE-REQUEST";

 /** XTSRKey field <code>SUBTYPE_FIELD</code> value that indicates
  *  the XSL document will transform jdeRequest documents. */
 private static final String SUBTYPE_REQUEST = "REQUEST";

 /** XTSRKey field <code>SUBTYPE_FIELD</code> value that indicates
  *  the XSL document will transform jdeResponse documents. */
 private static final String SUBTYPE_RESPONSE = "RESPONSE";

 /** Element name stored within the Transformation Path Information
  * (TPI)that specifies the XTSRKey used to transform the document. */
 private static final String JDE_TS_XTSR_KEY = "XTSJDETemplateKey";

 private static class XTSMUnrecognizedElementException
     extends IXTSMTemplateSelector.TemplateFetchException
 {
  public XTSMUnrecognizedElementException(String text)
  {
    super(text);
  }
 }
}