How to retrieve field values by passing field name using JPOS ISO8583 message format

2k views Asked by At

I want to retrieve field values by passing filed name .in order to achieve that i have implemented a method which loop through the ISOMsg object and then if it found a match to the passed filed name then it returns .my requirement is to read the .xml file once and have a static map using that then on the next time retrieve corresponding value by passing field name in order to achieve this is there a way to retrieve all field in config xml.

protected static void getISO8583ValueByFieldName(ISOMsg isoMsg, String fieldName) {

for (int i = 1; i <= isoMsg.getMaxField(); i++) {

  if (isoMsg.hasField(i)) {

    if (isoMsg.getPackager().getFieldDescription(isoMsg, i).equalsIgnoreCase(fieldName)) {
      System.out.println(
          "    FOUND FIELD -" + i + " : " + isoMsg.getString(i) + " " + isoMsg.getPackager()
              .getFieldDescription(isoMsg, i));
       break;

    } 
  } 
} 

}

3

There are 3 answers

0
Seth De On

Solution is to implement a own custom mapper.here is an memory implementation singleton class which reads all the configurations one time and then provide key id by name.

 /**
 * This is an memory implementation of singleton mapper class which contains ISO8583
 * field mappings as Key Value pairs [Field Name,Field Value]
 * in order
 *
 * Created on 12/16/2014.
 */
public class ISO8583MapperFactory {

  private static Logger logger= Logger.getLogger(ISO8583MapperFactory.class);

  private static ISO8583MapperFactory instance = null;
  private static HashMap<String,Integer> fieldMapper=null;



  /**
   *
   * @throws IOException
   * @throws SAXException
   * @throws ParserConfigurationException
   */
  private ISO8583MapperFactory() throws IOException, SAXException, ParserConfigurationException {
    fieldMapper =new HashMap<String, Integer>();
    mapFields();
  }

  /**
   *
   * @throws ParserConfigurationException
   * @throws IOException
   * @throws SAXException
   */
  private void mapFields() throws ParserConfigurationException, IOException, SAXException {
    DocumentBuilder dBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder();


    dBuilder.setEntityResolver(new GenericPackager.GenericEntityResolver());
    //InputStream in = new FileInputStream(ISO8583Constant.ISO8583_CONFIG_FILE_NAME);

    InputStream in =  getClass().getClassLoader().getResourceAsStream(ISO8583Constant.ISO8583_CONFIG_FILE_NAME);
    Document doc = dBuilder.parse(in);


    logger.info("Root element :" + doc.getDocumentElement().getNodeName());

    if (doc.hasChildNodes()) {

      loadNodes(doc.getChildNodes(), fieldMapper);

    }
  }

  /**
   *
   * @return
   * @throws ParserConfigurationException
   * @throws SAXException
   * @throws IOException
   */
  public static ISO8583MapperFactory getInstance()
      throws ParserConfigurationException, SAXException, IOException {
    if(instance==null){
      instance=new ISO8583MapperFactory();
    }
    return instance;
  }

  /**
   *
   * @param fieldName
   * @return
   */
  public Integer getFieldidByName(String fieldName){
    return fieldMapper.get(fieldName);
  }



  /**
   * Recursive method to read all the id and field name mappings
   * @param nodeList
   * @param fieldMapper
   */
  protected void loadNodes(NodeList nodeList,HashMap<String,Integer> fieldMapper) {
    logger.info(" Invoked loadNodes(NodeList nodeList,HashMap<String,Integer> fieldMapper)");

    for (int count = 0; count < nodeList.getLength(); count++) {

      Node tempNode = nodeList.item(count);

      // make sure it's element node.
      if (tempNode.getNodeType() == Node.ELEMENT_NODE) {

        // get node name and value
        logger.info("\nNode Name =" + tempNode.getNodeName() + " [OPEN]");
        logger.info("Node Value =" + tempNode.getTextContent());


        if (tempNode.hasAttributes()) {

          // get attributes names and values
          NamedNodeMap nodeMap = tempNode.getAttributes();

          fieldMapper.put(nodeMap.getNamedItem(ISO8583Constant.FIELD_NAME).getNodeValue(),Integer.valueOf( nodeMap.getNamedItem(ISO8583Constant.FIELD_ID).getNodeValue()));

        }

        if (tempNode.hasChildNodes()) {

          // loop again if has child nodes
          loadNodes(tempNode.getChildNodes(), fieldMapper);

        }
        logger.info("Node Name =" + tempNode.getNodeName() + " [CLOSE]");


      }

    }

  }

  /**
   *
   * @return
   */
  public static HashMap<String, Integer> getFieldMapper() {
    return fieldMapper;
  }

  /**
   *
   * @param fieldMapper
   */
  public static void setFieldMapper(HashMap<String, Integer> fieldMapper) {
    ISO8583MapperFactory.fieldMapper = fieldMapper;
  }


}

Example

public static void main(String[] args) throws IOException, ISOException, InterruptedException {
try {

  ISO8583MapperFactory.getInstance().getFieldidByName("NAME");

} catch (ParserConfigurationException e) {
  e.printStackTrace();
} catch (SAXException e) {
  e.printStackTrace();
}

}

1
apr On

You can also define an enum with the field names, mapped to field numbers. Please note the field names may vary from packager to packager, so your solution is kind of brittle, it's better to use an enum, or just constants.

0
Joe Mwa On

An enhancement to Seth's very helpful answer from above, to getFieldNameById instead of getFieldidByName:

// package ... 

import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.jpos.iso.packager.GenericPackager;
import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

import com.imohsenb.ISO8583.exceptions.ISOException;

import lombok.extern.slf4j.Slf4j;

@Slf4j
public class ISO8583MapperFactory {

private static ISO8583MapperFactory instance = null;
private static HashMap<Integer, String> fieldMapper = null;

/**
 *
 * @throws IOException
 * @throws SAXException
 * @throws ParserConfigurationException
 */
private ISO8583MapperFactory() throws IOException, SAXException, ParserConfigurationException {
    fieldMapper = new HashMap<Integer, String>();
    mapFields();
}

/**
 *
 * @throws ParserConfigurationException
 * @throws IOException
 * @throws SAXException
 */
private void mapFields() throws ParserConfigurationException, IOException, SAXException {
    DocumentBuilder dBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder();

    dBuilder.setEntityResolver(new GenericPackager.GenericEntityResolver());
    // InputStream in = new
    // FileInputStream(ISO8583Constant.ISO8583_CONFIG_FILE_NAME);

    InputStream in = getClass().getClassLoader().getResourceAsStream(ISO8583Constant.ISO8583_CONFIG_FILE_NAME);
    Document doc = dBuilder.parse(in);

    // log.info("Root element :" + doc.getDocumentElement().getNodeName());

    if (doc.hasChildNodes()) {

        loadNodes(doc.getChildNodes(), fieldMapper);

    }
}

/**
 *
 * @return
 * @throws ParserConfigurationException
 * @throws SAXException
 * @throws IOException
 */
public static ISO8583MapperFactory getInstance()
        throws ParserConfigurationException, SAXException, IOException {
    if (instance == null) {
        instance = new ISO8583MapperFactory();
    }
    return instance;
}

/**
 *
 * @param fieldName
 * @return
 */
public String getFieldNameById(int fieldId) {
    return fieldMapper.get(Integer.valueOf(fieldId));
}

/**
 * Recursive method to read all the id and field name mappings
 * 
 * @param nodeList
 * @param fieldMapper
 */
protected void loadNodes(NodeList nodeList, HashMap<Integer, String> fieldMapper) {
    // log.info(" Invoked loadNodes(NodeList nodeList,HashMap<String,Integer>
    // fieldMapper)");

    for (int count = 0; count < nodeList.getLength(); count++) {

        Node tempNode = nodeList.item(count);

        // make sure it's element node.
        if (tempNode.getNodeType() == Node.ELEMENT_NODE) {

            // get node name and value
            // log.info("\nNode Name =" + tempNode.getNodeName() + " [OPEN]");
            // log.info("Node Value =" + tempNode.getTextContent());

            if (tempNode.hasAttributes()) {

                // get attributes names and values
                NamedNodeMap nodeMap = tempNode.getAttributes();

                // fieldMapper.put(nodeMap.getNamedItem(ISO8583Constant.FIELD_NAME).getNodeValue(),
                // Integer.valueOf(nodeMap.getNamedItem(ISO8583Constant.FIELD_ID).getNodeValue()));

                fieldMapper.put(Integer.valueOf(nodeMap.getNamedItem(ISO8583Constant.FIELD_ID).getNodeValue()),
                        nodeMap.getNamedItem(ISO8583Constant.FIELD_NAME).getNodeValue());

            }

            if (tempNode.hasChildNodes()) {

                // loop again if has child nodes
                loadNodes(tempNode.getChildNodes(), fieldMapper);

            }
            // log.info("Node Name =" + tempNode.getNodeName() + " [CLOSE]");

        }

    }

}

/**
 *
 * @return
 */
public static HashMap<Integer, String> getFieldMapper() {
    return fieldMapper;
}

/**
 *
 * @param fieldMapper
 */
public static void setFieldMapper(HashMap<Integer, String> fieldMapper) {
    ISO8583MapperFactory.fieldMapper = fieldMapper;
}

public static void main(String[] args) throws IOException, ISOException, InterruptedException {
    try {
        String a = ISO8583MapperFactory.getInstance().getFieldNameById(2);
        System.out.println(a);
    } catch (ParserConfigurationException e) {
        e.printStackTrace();
    } catch (SAXException e) {
        e.printStackTrace();
        }
    }
}

enum ISO8583Constant {
    ;
    static String ISO8583_CONFIG_FILE_NAME = "iso8583map.xml";
    static String FIELD_NAME = "name";
    static String FIELD_ID = "id";
}