protected void createListener(
      Service service,
      Map<Integer, LoadBalancerListener> listeners,
      LoadBalancerListenerPort port) {
    LoadBalancerListener listenerObj =
        objectManager.findOne(
            LoadBalancerListener.class,
            LOAD_BALANCER_LISTENER.SERVICE_ID,
            service.getId(),
            LOAD_BALANCER_LISTENER.SOURCE_PORT,
            port.getSourcePort(),
            LOAD_BALANCER_LISTENER.PRIVATE_PORT,
            port.getPrivatePort(),
            LOAD_BALANCER_LISTENER.TARGET_PORT,
            port.getTargetPort(),
            LOAD_BALANCER_LISTENER.REMOVED,
            null,
            LOAD_BALANCER_LISTENER.ACCOUNT_ID,
            service.getAccountId());

    if (listenerObj == null) {
      listenerObj =
          objectManager.create(
              LoadBalancerListener.class,
              LOAD_BALANCER_LISTENER.NAME,
              getLoadBalancerName(service) + "_" + port.getPrivatePort(),
              LOAD_BALANCER_LISTENER.ACCOUNT_ID,
              service.getAccountId(),
              LOAD_BALANCER_LISTENER.SOURCE_PORT,
              port.getSourcePort(),
              LOAD_BALANCER_LISTENER.PRIVATE_PORT,
              port.getPrivatePort(),
              LOAD_BALANCER_LISTENER.TARGET_PORT,
              port.getTargetPort(),
              LOAD_BALANCER_LISTENER.SOURCE_PROTOCOL,
              port.getProtocol(),
              LOAD_BALANCER_LISTENER.TARGET_PROTOCOL,
              port.getProtocol(),
              LoadBalancerConstants.FIELD_LB_LISTENER_ALGORITHM,
              "roundrobin",
              LOAD_BALANCER_LISTENER.ACCOUNT_ID,
              service.getAccountId(),
              LOAD_BALANCER_LISTENER.SERVICE_ID,
              service.getId());
    }
    objectProcessManager.executeProcess(
        LoadBalancerConstants.PROCESS_LB_LISTENER_CREATE, listenerObj, null);

    listeners.put(listenerObj.getPrivatePort(), listenerObj);
  }
  @SuppressWarnings("unchecked")
  private void createListeners(
      Service service, LoadBalancerConfig lbConfig, Map<String, Object> launchConfigData) {
    Map<Integer, LoadBalancerListener> listeners = new HashMap<>();

    // 1. create listeners
    Map<String, Boolean> portDefs = new HashMap<>();

    if (launchConfigData.get(InstanceConstants.FIELD_PORTS) != null) {
      for (String port : (List<String>) launchConfigData.get(InstanceConstants.FIELD_PORTS)) {
        portDefs.put(port, true);
      }
    }

    if (launchConfigData.get(InstanceConstants.FIELD_EXPOSE) != null) {
      for (String port : (List<String>) launchConfigData.get(InstanceConstants.FIELD_EXPOSE)) {
        portDefs.put(port, false);
      }
    }

    List<String> sslPorts = getSslPorts(launchConfigData);

    for (String port : portDefs.keySet()) {
      PortSpec spec = new PortSpec(port);
      String protocol;
      if (!port.contains("tcp")) {
        // default to http unless defined otherwise in the compose file
        protocol = "http";
      } else {
        protocol = "tcp";
      }

      if (listeners.containsKey(spec.getPrivatePort())) {
        continue;
      }

      int targetPort = spec.getPrivatePort();
      Integer sourcePort = null;
      Integer privatePort = null;
      // set sourcePort only for ports defined in "ports" param
      // the ones defined in expose, will get translated to private listeners
      if (portDefs.get(port)) {
        if (spec.getPublicPort() == null) {
          sourcePort = targetPort;
        } else {
          sourcePort = spec.getPublicPort();
        }
        privatePort = sourcePort;
      } else {
        if (spec.getPublicPort() == null) {
          privatePort = targetPort;
        } else {
          privatePort = spec.getPublicPort();
        }
      }

      String sourceProtocol = protocol;
      if (sslPorts.contains(privatePort.toString())) {
        if (protocol.equals("tcp")) {
          sourceProtocol = "ssl";
        } else {
          sourceProtocol = "https";
        }
      }

      createListener(
          service,
          listeners,
          new LoadBalancerListenerPort(privatePort, sourcePort, sourceProtocol, targetPort));
    }

    for (LoadBalancerListener listener : listeners.values()) {
      lbService.addListenerToConfig(lbConfig, listener.getId());
    }
  }