/**
  * Play a specific IPlayItem. The strategy for now is VOD first, Live second.
  *
  * @param item Item to play
  */
 protected void play(IPlayItem item) {
   // dont play unless we are stopped
   if (state == StreamState.STOPPED) {
     // assume this is not live stream
     boolean isLive = false;
     if (providerService != null) {
       msgIn = providerService.getVODProviderInput(getScope(), item.getName());
       if (msgIn == null) {
         msgIn = providerService.getLiveProviderInput(getScope(), item.getName(), true);
         isLive = true;
       }
       if (msgIn == null) {
         log.warn("ABNORMAL Can't get both VOD and Live input from providerService");
         return;
       }
     }
     setState(StreamState.PLAYING);
     currentItem = item;
     sendResetMessage();
     if (msgIn != null) {
       msgIn.subscribe(this, null);
     }
     if (isLive) {
       if (item.getLength() >= 0) {
         liveJobName =
             scheduler.addScheduledOnceJob(
                 item.getLength(),
                 new IScheduledJob() {
                   public void execute(ISchedulingService service) {
                     if (liveJobName == null) {
                       return;
                     }
                     liveJobName = null;
                     onItemEnd();
                   }
                 });
       }
     } else {
       long start = item.getStart();
       if (start < 0) {
         start = 0;
       }
       sendVODInitCM(msgIn, (int) start);
       startBroadcastVOD();
     }
   }
 }
  @Transactional(readOnly = true)
  public void fetchDataForTransactionCreation(
      Consumer<Map<String, Object>> sender, Integer entityId) {

    List<Provider> providerList = providerService.findProvidersByEntity(entityId);
    List<Practice> practiceList = practiseDao.findAllByEntity(entityId);
    List<Payer> payerList =
        payerService.executeListQuery("select P from Payer P left join fetch P.plans");
    //				payerService.executeListQuery("select P from Payer P left join fetch P.plans");
    Map<String, Object> response = new HashMap<>();
    response.put("practiceList", practiceList);
    response.put("providerList", providerList);
    response.put("payerList", payerList);

    sender.accept(response);
  }
 /** Start this server-side stream */
 public void start() {
   if (state != StreamState.UNINIT) {
     throw new IllegalStateException("State " + state + " not valid to start");
   }
   if (items.size() == 0) {
     throw new IllegalStateException("At least one item should be specified to start");
   }
   if (publishedName == null) {
     throw new IllegalStateException("A published name is needed to start");
   }
   try {
     IScope scope = getScope();
     IContext context = scope.getContext();
     providerService = (IProviderService) context.getBean(IProviderService.BEAN_NAME);
     // publish this server-side stream
     providerService.registerBroadcastStream(scope, publishedName, this);
     scheduler = (ISchedulingService) context.getBean(ISchedulingService.BEAN_NAME);
   } catch (NullPointerException npe) {
     log.warn("Context beans were not available; this is ok during unit testing", npe);
   }
   setState(StreamState.STOPPED);
   currentItemIndex = -1;
   nextItem();
 }
 /** {@inheritDoc} */
 public void publish(String name, String mode) {
   Map<String, String> params = null;
   if (name != null && name.contains("?")) {
     // read and utilize the query string values
     params = new HashMap<String, String>();
     String tmp = name;
     // check if we start with '?' or not
     if (name.charAt(0) != '?') {
       tmp = name.split("\\?")[1];
     } else if (name.charAt(0) == '?') {
       tmp = name.substring(1);
     }
     // now break up into key/value blocks
     String[] kvs = tmp.split("&");
     // take each key/value block and break into its key value parts
     for (String kv : kvs) {
       String[] split = kv.split("=");
       params.put(split[0], split[1]);
     }
     // grab the streams name
     name = name.substring(0, name.indexOf("?"));
   }
   log.debug("publish called with name {} and mode {}", name, mode);
   IConnection conn = Red5.getConnectionLocal();
   if (conn instanceof IStreamCapableConnection) {
     IScope scope = conn.getScope();
     IStreamCapableConnection streamConn = (IStreamCapableConnection) conn;
     int streamId = conn.getStreamId();
     if (StringUtils.isEmpty(name)) {
       sendNSFailed(
           streamConn, StatusCodes.NS_FAILED, "The stream name may not be empty.", name, streamId);
       log.error("The stream name may not be empty.");
       return;
     }
     IStreamSecurityService security =
         (IStreamSecurityService) ScopeUtils.getScopeService(scope, IStreamSecurityService.class);
     if (security != null) {
       Set<IStreamPublishSecurity> handlers = security.getStreamPublishSecurity();
       for (IStreamPublishSecurity handler : handlers) {
         if (!handler.isPublishAllowed(scope, name, mode)) {
           sendNSFailed(
               streamConn,
               StatusCodes.NS_PUBLISH_BADNAME,
               "You are not allowed to publish the stream.",
               name,
               streamId);
           log.error("You are not allowed to publish the stream {}", name);
           return;
         }
       }
     }
     IBroadcastScope bsScope = getBroadcastScope(scope, name);
     if (bsScope != null && !bsScope.getProviders().isEmpty()) {
       // another stream with that name is already published
       sendNSFailed(streamConn, StatusCodes.NS_PUBLISH_BADNAME, name, name, streamId);
       log.error("Bad name {}", name);
       return;
     }
     IClientStream stream = streamConn.getStreamById(streamId);
     if (stream != null && !(stream instanceof IClientBroadcastStream)) {
       log.error(
           "Stream not found or is not instance of IClientBroadcastStream, name: {}, streamId: {}",
           name,
           streamId);
       return;
     }
     boolean created = false;
     if (stream == null) {
       stream = streamConn.newBroadcastStream(streamId);
       created = true;
     }
     IClientBroadcastStream bs = (IClientBroadcastStream) stream;
     try {
       // set publish name
       bs.setPublishedName(name);
       // set stream parameters if they exist
       if (params != null) {
         bs.setParameters(params);
       }
       IContext context = conn.getScope().getContext();
       IProviderService providerService =
           (IProviderService) context.getBean(IProviderService.BEAN_NAME);
       // TODO handle registration failure
       if (providerService.registerBroadcastStream(conn.getScope(), name, bs)) {
         bsScope = getBroadcastScope(conn.getScope(), name);
         bsScope.setClientBroadcastStream(bs);
         if (conn instanceof BaseConnection) {
           ((BaseConnection) conn).registerBasicScope(bsScope);
         }
       }
       log.debug("Mode: {}", mode);
       if (IClientStream.MODE_RECORD.equals(mode)) {
         bs.start();
         bs.saveAs(name, false);
       } else if (IClientStream.MODE_APPEND.equals(mode)) {
         bs.start();
         bs.saveAs(name, true);
       } else {
         bs.start();
       }
       bs.startPublishing();
     } catch (IOException e) {
       log.warn("Stream I/O exception", e);
       sendNSFailed(
           streamConn,
           StatusCodes.NS_RECORD_NOACCESS,
           "The file could not be created/written to.",
           name,
           streamId);
       bs.close();
       if (created) {
         streamConn.deleteStreamById(streamId);
       }
     } catch (Exception e) {
       log.warn("Exception on publish", e);
     }
   }
 }