/**
   * Execute a service call based on the data in the binder using the credentials of the supplied
   * user
   */
  public static void executeService(
      DataBinder binder, String userName, boolean suppressServiceError)
      throws DataException, ServiceException {

    // obtain a connection to the database
    Workspace workspace = getSystemWorkspace();
    // check for an IdcService value
    String cmd = binder.getLocal("IdcService");
    if (cmd == null) throw new DataException("!csIdcServiceMissing");
    // obtain the service definition
    ServiceData serviceData = ServiceManager.getFullService(cmd);
    if (serviceData == null)
      throw new DataException(LocaleUtils.encodeMessage("!csNoServiceDefined", null, cmd));
    // create the service object for this service
    Service service =
        ServiceManager.createService(serviceData.m_classID, workspace, null, binder, serviceData);
    // obtain the full user data for this user
    UserData fullUserData = getFullUserData(userName, service, workspace);
    service.setUserData(fullUserData);
    binder.m_environment.put("REMOTE_USER", userName);
    ServiceException error = null;
    try {
      // init the service to not send HTML back
      service.setSendFlags(true, true);
      // create all the ServiceHandlers and implementors
      service.initDelegatedObjects();
      // do a security check
      service.globalSecurityCheck();
      // prepare for the service
      service.preActions();
      // execute the service
      service.doActions();
      // do any cleanup
      service.postActions();
      // store any new personalization data

      service.updateSubjectInformation(true);
      service.updateTopicInformation(binder);
    } catch (ServiceException e) {
      error = e;
    } finally {
      // Remove all the temp files.
      service.cleanUp(true);
      workspace.releaseConnection();
    }
    // handle any error
    if (error != null) {
      if (suppressServiceError) {
        error.printStackTrace();
        if (binder.getLocal("StatusCode") == null) {
          binder.putLocal("StatusCode", String.valueOf(error.m_errorCode));
          binder.putLocal("StatusMessage", error.getMessage());
        }
      } else {
        throw new ServiceException(error.m_errorCode, error.getMessage());
      }
    }
  }
  /**
   * Simple wrapper to the WSU_COMBINE_SCRIPTS service
   *
   * @param type Content type: text/css or text/javascript
   * @param items Comma separated list of content items
   * @param compress Whether to compress the combined result
   * @return Html script tag
   * @throws ServiceException
   * @throws DataException
   */
  private static String combineScripts(
      DataBinder binder, int type, List<String> items, String group, boolean compress)
      throws IllegalArgumentException, DataException, ServiceException {
    DataBinder serviceBinder = new DataBinder();
    serviceBinder.putLocal("IdcService", "WSU_COMBINE_SCRIPTS");

    String dUser = binder.getLocal("dUser");

    if (dUser == null || dUser.equals("")) {
      dUser = "******";
    }

    if (compress) {
      serviceBinder.putLocal("compress", "true");
    } else {
      serviceBinder.putLocal("compress", "false");
    }

    serviceBinder.putLocal("items", StringUtils.join(items, ","));

    if (type == WSUServiceHandler.TYPE_CSS) {
      serviceBinder.putLocal("type", "css");
    } else {
      serviceBinder.putLocal("type", "js");
    }

    serviceBinder.putLocal("group", group);

    executeService(serviceBinder, dUser, false);

    String filePath = serviceBinder.getLocal("filePath");

    String groupClause = String.format(" id=\"wsu-combined-%d-group-%s\"", type, group);

    if (type == WSUServiceHandler.TYPE_CSS) {
      return String.format(TAG_TEMPLATE_CSS, filePath, groupClause);
    }

    return String.format(TAG_TEMPLATE_JS, filePath, groupClause);
  }