/* (non-Javadoc)
   * @see sif3.common.interfaces.Provider#updateSingle(java.lang.Object, java.lang.String, sif3.common.model.SIFZone, sif3.common.model.SIFContext)
   */
  @Override
  public boolean updateSingle(
      Object data,
      String resourceID,
      SIFZone zone,
      SIFContext context,
      RequestMetadata metadata,
      ResponseParameters customResponseParams)
      throws IllegalArgumentException, PersistenceException {
    if (StringUtils.isEmpty(resourceID)) {
      throw new IllegalArgumentException(
          "Resource ID is null or empty. It must be provided to update an entity.");
    }

    // Must be of type StudentPersonalType
    if (data instanceof StudentPersonalType) {
      logger.debug(
          "Update student with Resoucre ID = "
              + resourceID
              + ", "
              + getZoneAndContext(zone, context)
              + " and RequestMetadata = "
              + metadata);

      // In the real implementation we would call a BL method here to modify the Student.
      return true;
    } else {
      throw new IllegalArgumentException(
          "Expected Object Type  = StudentPersonalType. Received Object Type = "
              + data.getClass().getSimpleName());
    }
  }
  /* (non-Javadoc)
   * @see sif3.common.interfaces.Provider#retrieveByPrimaryKey(java.lang.String, sif3.common.model.SIFZone, sif3.common.model.SIFContext)
   */
  @Override
  public Object retrieveByPrimaryKey(
      String resourceID,
      SIFZone zone,
      SIFContext context,
      RequestMetadata metadata,
      ResponseParameters customResponseParams)
      throws IllegalArgumentException, PersistenceException {
    if (StringUtils.isEmpty(resourceID)) {
      throw new IllegalArgumentException(
          "Resource ID is null or empty. It must be provided to retrieve an entity.");
    }

    logger.debug(
        "Retrieve student with Resoucre ID = "
            + resourceID
            + ", "
            + getZoneAndContext(zone, context)
            + " and RequestMetadata = "
            + metadata);

    StudentPersonalType student = students.get(resourceID);
    //    	logger.debug("Student to return: "+((student != null) ?
    // student.getPersonInfo().getName().getGivenName().getValue() : student));

    return student;
  }
 /* Null is returned if there is an error. Error is logged. */
 private Boolean getIsConsumer(AdvancedProperties props) {
   String adapterType = props.getPropertyAsString("adapter.type", null);
   if (StringUtils.isEmpty(adapterType)) {
     logger.error(
         "Property 'adapter.type' is null or empty in "
             + getAdapterFileNameWithoutExt()
             + ".properties. This property MUST be defined.");
     return null;
   }
   return adapterType.equalsIgnoreCase("consumer");
 }
 /* Null is returned if there is an error. Error is logged. */
 private String getServiceName(AdvancedProperties props) {
   String serviceName = props.getPropertyAsString("adapter.id", null);
   if (StringUtils.isEmpty(serviceName)) {
     logger.error(
         "Property 'adapter.id' is null or empty in "
             + getAdapterFileNameWithoutExt()
             + ".properties. This property MUST be defined.");
     serviceName = null;
   }
   return serviceName;
 }
  /*
   * This method load information in relation to existing environments. If bits are missing or don't make sense then
   * an error is logged and false is returned.
   */
  private boolean loadExistingEnvInfo(AdvancedProperties adapterProperties) {
    environment.setUseExistingEnv(adapterProperties.getPropertyAsBool("env.use.existing", false));
    environment.setExistingSessionToken(
        adapterProperties.getPropertyAsString("env.existing.sessionToken", null));
    String envURI = adapterProperties.getPropertyAsString("env.existing.environmentURI", null);

    boolean allOK = true;
    if (environment.getUseExistingEnv()) {
      if (StringUtils.isEmpty(environment.getExistingSessionToken())) {
        logger.error(
            "env.use.existing is set to true but no sessionToken has been provided. This is an invalid configuration in "
                + adapterProperties.getPropFileNameFull());
        allOK = false;
      }
      if (StringUtils.isEmpty(envURI)) {
        logger.error(
            "env.use.existing is set to true but no existing environment URI has been provided. This is an invalid configuration in "
                + adapterProperties.getPropFileNameFull());
        allOK = false;
      }
      if (allOK) {
        environment.setExistingEnvURI(envURI);
        if (environment.getExistingEnvURI() == null) {
          logger.error(
              "The URI given in the property env.existing.environmentURI appears to be invalid in "
                  + adapterProperties.getPropFileNameFull());
          allOK = false;
        }
      }
    } else {
      if (StringUtils.notEmpty(envURI)) {
        environment.setExistingEnvURI(envURI);
      }
    }
    return allOK;
  }
 private boolean checkAndCreateDir(String fullDirName) {
   if (StringUtils.isEmpty(fullDirName)) // Directory not required
   {
     return true;
   }
   if (!FileAndFolderUtils.doesFolderExist(fullDirName)) {
     logger.info("Folder " + fullDirName + " does not exist. Creating it now.");
     try {
       if (!FileAndFolderUtils.createFolder(fullDirName, true)) {
         logger.error("Failed to create folder: " + fullDirName);
         return false;
       }
     } catch (Exception ex) {
       logger.error("Failed to create folder: " + fullDirName);
       return false;
     }
   }
   return true;
 }
 private boolean loadEnvironmentProperties() {
   AdvancedProperties props = getProperties(CommonConstants.ENV_PROP_FILE_NAME);
   if (props == null) {
     logger.error(
         "Properties file 'environment.properties' could not be read. Ensure it exists and is on the classpath.");
     return false;
   }
   setEnvironmentBaseDirName(props.getPropertyAsString("env.store.dir", null));
   if (StringUtils.isEmpty(getEnvironmentBaseDirName())) {
     logger.error(
         "Property 'env.store.dir' is null or empty in environment.properties. It MUST be defined!");
     return false;
   } else {
     if (!FileAndFolderUtils.doesFolderExist(getEnvironmentBaseDirName(), true, true)) {
       logger.error(
           "Folder "
               + getEnvironmentBaseDirName()
               + " may not exist or it is not readable and writable. Please create it and/or make it read/write.");
       return false;
     }
   }
   return true;
 }
 /* Null is returned if there is an error. Error is logged. */
 private EnvironmentType getEnvironmentType(AdvancedProperties props, boolean isConsumer) {
   String envType = props.getPropertyAsString("env.type", null);
   if (StringUtils.isEmpty(envType)) {
     // for Providers we must have this value
     if (!isConsumer) {
       logger.error(
           "Property 'env.type' is null or empty in "
               + getAdapterFileNameWithoutExt()
               + ".properties. This property MUST be defined.");
     }
     return null;
   } else {
     try {
       return EnvironmentType.valueOf(envType.toUpperCase());
     } catch (Exception ex) {
       logger.error(
           "Invalid property 'env.type' in "
               + getAdapterFileNameWithoutExt()
               + ".properties. Valid values are 'DIRECT' & 'BROKERED'.");
       return null;
     }
   }
 }
  /* (non-Javadoc)
   * @see sif3.common.interfaces.Provider#createSingle(java.lang.Object, sif3.common.model.SIFZone, sif3.common.model.SIFContext)
   */
  @Override
  public Object createSingle(
      Object data,
      boolean useAdvisory,
      SIFZone zone,
      SIFContext context,
      RequestMetadata metadata,
      ResponseParameters customResponseParams)
      throws IllegalArgumentException, PersistenceException {
    logger.debug(
        "Create Single Student for "
            + getZoneAndContext(zone, context)
            + " and RequestMetadata = "
            + metadata);

    //    	return null; // test return null value

    // Must be of type StudentPersonalType
    if (data instanceof StudentPersonalType) {
      StudentPersonalType student = (StudentPersonalType) data;
      if (StringUtils.isEmpty(student.getRefId())) {
        // In future this should be a UUID instead of a GUID
        if (!useAdvisory) {
          // Create new UUID because the advisory shall not be used.
          student.setRefId(UUIDGenerator.getSIF2GUIDUpperCase());
        }
        // else leave student UUID untouched.
      }

      // In the real implementation we would call a BL method here to create the Student.
      return student;
    } else {
      throw new IllegalArgumentException(
          "Expected Object Type  = StudentPersonalType. Received Object Type = "
              + data.getClass().getSimpleName());
    }
  }
  /* (non-Javadoc)
   * @see sif3.common.interfaces.Provider#deleteSingle(java.lang.String, sif3.common.model.SIFZone, sif3.common.model.SIFContext)
   */
  @Override
  public boolean deleteSingle(
      String resourceID,
      SIFZone zone,
      SIFContext context,
      RequestMetadata metadata,
      ResponseParameters customResponseParams)
      throws IllegalArgumentException, PersistenceException {
    if (StringUtils.isEmpty(resourceID)) {
      throw new IllegalArgumentException(
          "Resource ID is null or empty. It must be provided to delete an entity.");
    }

    logger.debug(
        "Remove student with Resoucre ID = "
            + resourceID
            + ", "
            + getZoneAndContext(zone, context)
            + " and RequestMetadata = "
            + metadata);

    // In the real implementation we would call a BL method here to remove the Student.
    return ((numDeletes++ % 3) != 0); // every third time of the call I return false.
  }
 private MediaType convertMediaType(String mediaType) {
   mediaType = (StringUtils.isEmpty(mediaType) ? XML : mediaType.toUpperCase().trim());
   return (mediaType.equals(JSON)
       ? MediaType.APPLICATION_JSON_TYPE
       : MediaType.APPLICATION_XML_TYPE);
 }
  private boolean loadProviderInfo(AdvancedProperties props, ProviderEnvironment envInfo) {
    boolean errorsFound = false;

    envInfo.setEventsSupported(props.getPropertyAsBool("env.events.supported", false));

    // The following properties are required if it is a BROKERED environment. For DIRECT
    // environments these values
    // are read from the SIF_APP_TEMPLATE table!
    if (envInfo.getEnvironmentType() == EnvironmentType.BROKERED) {
      // Application Key
      envInfo
          .getEnvironmentKey()
          .setApplicationKey(adapterProperties.getPropertyAsString("env.application.key", null));
      if (StringUtils.isEmpty(envInfo.getEnvironmentKey().getApplicationKey())) {
        logger.error(
            "Property 'env.application.key' is null or empty in "
                + getAdapterFileNameWithoutExt()
                + ".properties. Application Key must be set!");
        errorsFound = true;
      }

      // Password
      envInfo.setPassword(adapterProperties.getPropertyAsString("env.pwd", null));
      if (StringUtils.isEmpty(envInfo.getPassword())) {
        logger.error(
            "Property 'env.pwd' is null or empty in "
                + getAdapterFileNameWithoutExt()
                + ".properties. Password for this application must be set!");
        errorsFound = true;
      }

      // Authentication Method
      envInfo.setAuthMethod(
          adapterProperties.getPropertyAsString(
              "env.authentication.method", AuthenticationMethod.Basic.name()));

      envInfo.setTemplateXMLFileName(props.getPropertyAsString("env.xml.file.name", null));
      if (StringUtils.isEmpty(envInfo.getTemplateXMLFileName())) {
        logger.error(
            "Property 'env.xml.file.name' is null or empty in "
                + getAdapterFileNameWithoutExt()
                + ".properties. File name for environment XML template must be set!");
        errorsFound = true;
      }
    }

    // Base URL for connectors
    String connectorBaseURLStr = props.getPropertyAsString("env.connector.url", null);

    // Secure URL Base URL for connectors
    String secureConnectorBaseURLStr = props.getPropertyAsString("env.connector.url.secure", null);

    if (StringUtils.isEmpty(connectorBaseURLStr)
        && StringUtils.isEmpty(secureConnectorBaseURLStr)) {
      logger.error(
          "env.connector.url AND env.connector.url.secure for "
              + getAdapterFileNameWithoutExt()
              + ".properties is missing. You must provide at least one of these URLs for them.");
      errorsFound = true;
    } else {
      if (StringUtils.notEmpty(connectorBaseURLStr)) {
        envInfo.setConnectorBaseURI(cleanURI(connectorBaseURLStr, "env.connector.url"));
        if (envInfo.getConnectorBaseURI() == null) {
          errorsFound = true;
        }
      }
      if (StringUtils.notEmpty(secureConnectorBaseURLStr)) {
        envInfo.setSecureConnectorBaseURI(
            cleanURI(secureConnectorBaseURLStr, "env.connector.url.secure"));
        if (envInfo.getSecureConnectorBaseURI() == null) {
          errorsFound = true;
        }
      }
    }

    envInfo.setBaseURI(cleanURI(props.getPropertyAsString("env.baseURI", null), "env.baseURI"));
    if (envInfo.getEnvironmentType() == EnvironmentType.BROKERED) // The baseURI is required
    {
      if (envInfo.getBaseURI() == null) {
        logger.error(
            "Property 'env.baseURI' is null, empty or invalid in "
                + getAdapterFileNameWithoutExt()
                + ".properties. Base URI must be set for brokered environments!");
        errorsFound = true;
      }
    }

    envInfo.setDefaultUpdateType(getUpdateType(props));

    // The properties below might only be applicable for DIRECT environments but this remains to be
    // seen. Since they all have a default
    // value it should not matter if they are set or not and what environment we are in.
    envInfo.setAutoCreateEnvironment(props.getPropertyAsBool("env.allow.autoCreate", false));

    // Authentication Method
    envInfo.setAccessTokenAuthMethod(
        adapterProperties.getPropertyAsString(
            "adapter.default.accessToken.authentication.method",
            AuthenticationMethod.Bearer.name()));

    if (errorsFound) {
      logger.error(
          "Errors found in reading environment information from "
              + getAdapterFileNameWithoutExt()
              + ".properties. See previous log entries for details and please correct them.");
    }
    return errorsFound;
  }
  /*
   * This method read the following Consumer Adapter specific properties:
   * adapter.mustUseAdvisoryIDs=true
   * env.xml.file.name=devLocal.xml
   * env.userToken=
   * env.instanceID=
   * env.baseURI=http://localhost:9080/SIF3InfraREST/sif3
   * events.enabled=true
   * events.queue.strategy=ADAPTER_LEVEL
   * events.queue.name=StudentConsumer
   * events.queue.subscribers=3
   * events.queue.type=IMMEDIATE
   * events.polling.frequency=30
   * events.longPolling.timeout=120
   */
  private boolean loadConsumerInfo(AdvancedProperties props, ConsumerEnvironment envInfo) {
    boolean errorsFound = false;

    // Application Key
    envInfo
        .getEnvironmentKey()
        .setApplicationKey(adapterProperties.getPropertyAsString("env.application.key", null));
    if (StringUtils.isEmpty(envInfo.getEnvironmentKey().getApplicationKey())) {
      logger.error(
          "Property 'env.application.key' is null or empty in "
              + getAdapterFileNameWithoutExt()
              + ".properties. Application Key must be set!");
      errorsFound = true;
    }

    // Password
    envInfo.setPassword(adapterProperties.getPropertyAsString("env.pwd", null));
    if (StringUtils.isEmpty(envInfo.getPassword())) {
      logger.error(
          "Property 'env.pwd' is null or empty in "
              + getAdapterFileNameWithoutExt()
              + ".properties. Password for this application must be set!");
      errorsFound = true;
    }

    // Authentication Method
    envInfo.setAuthMethod(
        adapterProperties.getPropertyAsString(
            "env.authentication.method", AuthenticationMethod.Basic.name()));

    envInfo.getEnvironmentKey().setUserToken(props.getPropertyAsString("env.userToken", null));
    envInfo.getEnvironmentKey().setInstanceID(props.getPropertyAsString("env.instanceID", null));

    envInfo.setUseAdvisory(props.getPropertyAsBool("adapter.mustUseAdvisoryIDs", false));
    // System.out.println("Used Advisory: "+envInfo.getUseAdvisory());

    envInfo.setBaseURI(cleanURI(props.getPropertyAsString("env.baseURI", null), "env.baseURI"));
    if (envInfo.getBaseURI() == null) {
      logger.error(
          "Property 'env.baseURI' is null, empty or invalid in "
              + getAdapterFileNameWithoutExt()
              + ".properties. Base URI must be set!");
      errorsFound = true;
    }

    envInfo.setTemplateXMLFileName(props.getPropertyAsString("env.xml.file.name", null));
    if (StringUtils.isEmpty(envInfo.getTemplateXMLFileName())) {
      logger.error(
          "Property 'env.xml.file.name' is null or empty in "
              + getAdapterFileNameWithoutExt()
              + ".properties. File name for environment XML template must be set!");
      errorsFound = true;
    }

    envInfo.setEventsEnabled(props.getPropertyAsBool("events.enabled", false));
    loadRemoteQueueConfigData(
        envInfo.getEventConfig(),
        props,
        "events",
        getDefaultQueueName(envInfo.getAdapterName(), true));

    envInfo.setDelayedEnabled(props.getPropertyAsBool("delayed.enabled", false));
    loadRemoteQueueConfigData(
        envInfo.getDelayedConfig(),
        props,
        "delayed",
        getDefaultQueueName(envInfo.getAdapterName(), false));

    if (errorsFound) {
      logger.error(
          "Errors found in reading environment information from "
              + getAdapterFileNameWithoutExt()
              + ".properties. See previous log entries for details and please correct them.");
    }

    return errorsFound;
  }