All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.fixprotocol.orchestra.session.quickfix.QuickFixSessionConfigurer Maven / Gradle / Ivy

/*
 * Copyright 2017-2020 FIX Protocol Ltd
 *
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
 * in compliance with the License. You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software distributed under the License
 * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
 * or implied. See the License for the specific language governing permissions and limitations under
 * the License.
 *
 */
package io.fixprotocol.orchestra.session.quickfix;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.time.ZonedDateTime;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;
import javax.xml.datatype.XMLGregorianCalendar;
import org.w3c.dom.Node;
import io.fixprotocol._2020.orchestra.interfaces.IdentifierType;
import io.fixprotocol._2020.orchestra.interfaces.InterfaceType;
import io.fixprotocol._2020.orchestra.interfaces.InterfaceType.Sessions;
import io.fixprotocol._2020.orchestra.interfaces.Interfaces;
import io.fixprotocol._2020.orchestra.interfaces.RoleT;
import io.fixprotocol._2020.orchestra.interfaces.SessionProtocolType;
import io.fixprotocol._2020.orchestra.interfaces.SessionType;
import io.fixprotocol._2020.orchestra.interfaces.TransportProtocolType;
import io.fixprotocol._2020.orchestra.interfaces.TransportUseEnum;
import quickfix.Acceptor;
import quickfix.ConfigError;
import quickfix.Dictionary;
import quickfix.FixVersions;
import quickfix.Initiator;
import quickfix.SessionFactory;
import quickfix.SessionID;
import quickfix.SessionSettings;

/**
 * @author Don Mendelson
 *
 */
public class QuickFixSessionConfigurer {

  private ZonedDateTime effectiveTime = ZonedDateTime.now();

  public static void main(String[] args) throws JAXBException, ConfigError, IOException {
    if (args.length < 2) {
      useage();
    } else {
      QuickFixSessionConfigurer configurer = new QuickFixSessionConfigurer();
      try (FileOutputStream out = new FileOutputStream(args[1]);
          FileInputStream in = new FileInputStream(args[0])) {
        configurer.configure(in, out);
      }
    }
  }


  public static void useage() {
    System.err.println(
        "Usage: java io.fixprotocol.orchestra.session.quickfix.QuickFixConfigurer  ");
  }

  /**
   * @return the effectiveTime
   */
  public ZonedDateTime getEffectiveTime() {
    return effectiveTime;
  }

  /**
   * @param effectiveTime the effectiveTime to set
   */
  public void setEffectiveTime(ZonedDateTime effectiveTime) {
    this.effectiveTime = effectiveTime;
  }

  public void configure(InputStream in, OutputStream out) throws JAXBException, ConfigError {
    SessionSettings quickFixSettings = new SessionSettings();

    Interfaces interfaces = unmarshal(in);
    List interfaceList = interfaces.getInterface();
    for (InterfaceType interfaceType : interfaceList) {
      boolean isFixSession = false;
      String interfaceVersion = null;
      List sessionProtocols = interfaceType.getSessionProtocol();
      for (SessionProtocolType sessionProtocolType : sessionProtocols) {
        String protocolName = sessionProtocolType.getName();
        if (protocolName.contains("FIX4") || protocolName.contains("FIXT")) {
          interfaceVersion = sessionProtocolType.getVersion();
          isFixSession = true;
          break;
        }
      }

      Sessions sessions = interfaceType.getSessions();
      List sessionList = sessions.getSession();
      for (SessionType sessionType : sessionList) {

        String version = null;
        sessionProtocols = sessionType.getSessionProtocol();
        for (SessionProtocolType sessionProtocolType : sessionProtocols) {
          String protocolName = sessionProtocolType.getName();
          if (protocolName.contains("FIX4") || protocolName.contains("FIXT")) {
            version = sessionProtocolType.getVersion();
            isFixSession = true;
            break;
          }
        }

        if (!isFixSession) {
          continue;
        }

        if (version == null) {
          version = interfaceVersion;
        }
        if (version == null) {
          System.err.println("FIX version unknown; skipping session");
          break;
        }

        final XMLGregorianCalendar activationTimeXml = sessionType.getActivationTime();
        if (activationTimeXml != null) {
          ZonedDateTime activationTime = activationTimeXml.toGregorianCalendar().toZonedDateTime();
          if (activationTime.isAfter(effectiveTime)) {
            continue;
          }
        }

        final XMLGregorianCalendar deactivationTimeXml = sessionType.getDeactivationTime();
        if (deactivationTimeXml != null) {
          ZonedDateTime deativationTime =
              deactivationTimeXml.toGregorianCalendar().toZonedDateTime();
          if (deativationTime.isBefore(effectiveTime)) {
            continue;
          }
        }

        String beginString = null;
        String applVersion = null;
        switch (version) {
          case FixVersions.BEGINSTRING_FIX42:
            beginString = FixVersions.BEGINSTRING_FIX42;
            break;
          case FixVersions.BEGINSTRING_FIX44:
            beginString = FixVersions.BEGINSTRING_FIX44;
            break;
          case FixVersions.BEGINSTRING_FIXT11:
          case FixVersions.FIX50SP2:
            beginString = FixVersions.BEGINSTRING_FIXT11;
            applVersion = FixVersions.FIX50SP2;
            break;
        }

        Map identifierMap = new HashMap<>();
        List identifierList = sessionType.getIdentifier();
        for (IdentifierType identifierType : identifierList) {
          String name = identifierType.getName();
          Node value = (Node) identifierType.getValue();
          String text = value.getFirstChild().getTextContent();
          identifierMap.put(name, text);
        }

        Dictionary dictionary = new Dictionary();
        dictionary.setString(SessionSettings.BEGINSTRING, beginString);
        dictionary.setString(SessionSettings.SENDERCOMPID,
            identifierMap.getOrDefault(SessionSettings.SENDERCOMPID, SessionID.NOT_SET));
        dictionary.setString(SessionSettings.SENDERSUBID,
            identifierMap.getOrDefault(SessionSettings.SENDERSUBID, SessionID.NOT_SET));
        dictionary.setString(SessionSettings.SENDERLOCID,
            identifierMap.getOrDefault(SessionSettings.SENDERLOCID, SessionID.NOT_SET));
        dictionary.setString(SessionSettings.TARGETCOMPID,
            identifierMap.getOrDefault(SessionSettings.TARGETCOMPID, SessionID.NOT_SET));
        dictionary.setString(SessionSettings.TARGETSUBID,
            identifierMap.getOrDefault(SessionSettings.TARGETSUBID, SessionID.NOT_SET));
        dictionary.setString(SessionSettings.TARGETLOCID,
            identifierMap.getOrDefault(SessionSettings.TARGETLOCID, SessionID.NOT_SET));

        if (FixVersions.FIX50SP2.equals(version)) {
          dictionary.setString(quickfix.Session.SETTING_DEFAULT_APPL_VER_ID, applVersion);
        }

        RoleT role = sessionType.getRole();
        List transportList = sessionType.getTransport();
        TransportProtocolType transport = null;
        int transportCount = transportList.size();
        if (transportCount == 1) {
          transport = transportList.get(0);
        } else {
          for (TransportProtocolType aTransport : transportList) {
            if (aTransport.getUse().equalsIgnoreCase(TransportUseEnum.PRIMARY.toString())) {
              transport = aTransport;
            }
          }
          if (transport == null) {
            System.err.println("Transport not configured; skipping session");
            continue;
          }

          String address = transport.getAddress();
          String[] addressParts = address.split(":");

          switch (role) {
            case INITIATOR:
              dictionary.setString(SessionFactory.SETTING_CONNECTION_TYPE,
                  SessionFactory.INITIATOR_CONNECTION_TYPE);
              dictionary.setString(Initiator.SETTING_SOCKET_CONNECT_HOST, addressParts[0]);
              dictionary.setString(Initiator.SETTING_SOCKET_CONNECT_PORT, addressParts[1]);
              break;
            case ACCEPTOR:
              dictionary.setString(SessionFactory.SETTING_CONNECTION_TYPE,
                  SessionFactory.ACCEPTOR_CONNECTION_TYPE);
              dictionary.setString(Acceptor.SETTING_SOCKET_ACCEPT_ADDRESS, addressParts[0]);
              dictionary.setString(Acceptor.SETTING_SOCKET_ACCEPT_PORT, addressParts[1]);
              break;
          }

          SessionID sessionId =
              new SessionID(beginString, identifierMap.get(SessionSettings.SENDERCOMPID),
                  identifierMap.get(SessionSettings.SENDERSUBID),
                  identifierMap.get(SessionSettings.SENDERLOCID),
                  identifierMap.get(SessionSettings.TARGETCOMPID),
                  identifierMap.get(SessionSettings.TARGETSUBID),
                  identifierMap.get(SessionSettings.TARGETLOCID), SessionID.NOT_SET);
          quickFixSettings.set(sessionId, dictionary);
        }

        quickFixSettings.toStream(out);

      }
    }
  }

  private Interfaces unmarshal(InputStream in) throws JAXBException {
    JAXBContext jaxbContext = JAXBContext.newInstance(Interfaces.class);
    Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
    return (Interfaces) jaxbUnmarshaller.unmarshal(in);
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy