private static Map<String, String> createAuthorizationAttributeMap(
      String snaaName, Properties props) {
    Map<String, String> attributes = new HashMap<String, String>();

    List<String> keys = new LinkedList<String>();
    // getting keys from properties
    for (Object o : props.keySet()) {
      if (((String) o).startsWith(snaaName + authorizationAtt)
          && ((String) o).endsWith(authorizationKeyAtt)) {
        keys.add((String) o);
      }
    }

    for (String k : keys) {
      String key = props.getProperty(k);
      // getting plain key-number from properties
      String plainKeyProperty = k.replaceAll(snaaName + authorizationAtt + ".", "");
      plainKeyProperty = plainKeyProperty.replaceAll(authorizationKeyAtt, "");

      String keyPrefix = snaaName + authorizationAtt + "." + plainKeyProperty;

      // building value-property-string
      String value = props.getProperty(keyPrefix + authorizationValAtt);

      // finally put key and values
      attributes.put(key, value);
    }

    return attributes;
  }
  private static AuthorizationDataSource getAuthorizationDataSource(
      String snaaName, Properties props)
      throws ClassNotFoundException, IllegalAccessException, InstantiationException {
    for (Object o : props.keySet()) {
      String dataSourceName = snaaName + authorizationAtt + authorizationDataSource;
      if (o.equals(dataSourceName)) {
        AuthorizationDataSource dataSource =
            (AuthorizationDataSource) Class.forName(props.getProperty((String) o)).newInstance();

        String dataSourceUsername =
            props.getProperty(dataSourceName + authorizationDataSourceUsername);
        String dataSourcePassword =
            props.getProperty(dataSourceName + authorizationDataSourcePassword);
        String dataSourceUrl = props.getProperty(dataSourceName + authorizationDataSourceUrl);

        if (dataSourceUsername != null) {
          dataSource.setUsername(dataSourceUsername);
        }
        if (dataSourcePassword != null) {
          dataSource.setPassword(dataSourcePassword);
        }
        if (dataSourceUrl != null) {
          dataSource.setUrl(dataSourceUrl);
        }

        return dataSource;
      }
    }
    // set default
    return new ShibbolethDataSource();
  }
  public static void main(String[] args) throws Exception {

    String propertyFile = null;

    // create the command line parser
    CommandLineParser parser = new PosixParser();
    Options options = new Options();
    options.addOption("f", "file", true, "The properties file");
    options.addOption("v", "verbose", false, "Verbose logging output");
    options.addOption("h", "help", false, "Help output");

    try {
      CommandLine line = parser.parse(options, args);

      if (line.hasOption('v')) {
        org.apache.log4j.Logger.getRootLogger().setLevel(org.apache.log4j.Level.DEBUG);
      }

      if (line.hasOption('h')) {
        usage(options);
      }

      if (line.hasOption('f')) {
        propertyFile = line.getOptionValue('f');
      } else {
        throw new Exception("Please supply -f");
      }

    } catch (Exception e) {
      log.error("Invalid command line: " + e, e);
      usage(options);
    }

    Properties props = new Properties();
    props.load(new FileReader(propertyFile));
    startFromProperties(props);

    Runtime.getRuntime()
        .addShutdownHook(
            new Thread(
                new Runnable() {
                  @Override
                  public void run() {
                    log.info("Received shutdown signal. Shutting down...");
                    server.stop(3);
                  }
                }));
  }
 private static ShibbolethProxy setOptionalShibbolethProxy(Properties props) {
   String shibbolethProxyHost = props.getProperty("config.shibboleth.proxyHost");
   String shibbolethProxyPort = props.getProperty("config.shibboleth.proxyPort");
   if (shibbolethProxyHost != null && shibbolethProxyPort != null) {
     return new ShibbolethProxy(shibbolethProxyHost, Integer.parseInt(shibbolethProxyPort));
   }
   return null;
 }
  public static HttpServer startFromProperties(Properties props) throws Exception {
    org.apache.log4j.Logger.getRootLogger().setLevel(org.apache.log4j.Level.DEBUG);
    int port = Integer.parseInt(props.getProperty("config.port", "8080"));

    startHttpServer(port);

    Set<String> snaaNames = parseCSV(props.getProperty("config.snaas", ""));

    // set optional proxy for shibboleth
    ShibbolethProxy shibbolethProxy;
    shibbolethProxy = setOptionalShibbolethProxy(props);

    String type, urnprefix, path;
    for (String snaaName : snaaNames) {

      type = props.getProperty(snaaName + ".type", "");
      path = props.getProperty(snaaName + ".path", "/snaa/" + snaaName);

      if ("dummy".equals(type)) {

        urnprefix = props.getProperty(snaaName + ".urnprefix", "urn:default:" + snaaName);
        startDummySNAA(path, urnprefix);

      } else if ("shibboleth".equals(type)) {

        urnprefix = props.getProperty(snaaName + ".urnprefix", "urn:default:" + snaaName);

        String authorizationClassName =
            props.getProperty(
                snaaName + ".authorization_class",
                "eu.wisebed.testbed.api.snaa.authorization.AlwaysAllowAuthorization");

        IUserAuthorization authorization = getAuthorizationModule(authorizationClassName);

        if (authorizationClassName.endsWith(".AttributeBasedAuthorization")) {
          createAndSetAuthenticationAttributes(snaaName, props, authorization);
        }

        String secretAuthkeyUrl = props.getProperty(snaaName + ".authorization.url");

        startShibbolethSNAA(
            path, urnprefix, secretAuthkeyUrl, authorization, shibbolethInjector, shibbolethProxy);

      } else if ("jaas".equals(type)) {

        urnprefix = props.getProperty(snaaName + ".urnprefix", "urn:default:" + snaaName);
        String jaasModuleName = props.getProperty(snaaName + ".module", null);
        String jaasConfigFile = props.getProperty(snaaName + ".configfile", null);
        String authorizationClassName =
            props.getProperty(
                snaaName + ".authorization_class",
                "eu.wisebed.testbed.api.snaa.authorization.AlwaysAllowAuthorization");

        IUserAuthorization authorization = getAuthorizationModule(authorizationClassName);

        if (authorizationClassName.endsWith(".AttributeBasedAuthorization")) {
          createAndSetAuthenticationAttributes(snaaName, props, authorization);
        }

        if (jaasConfigFile == null) {
          throw new Exception(("Supply a value for " + snaaName + ".configfile"));
        }

        if (jaasModuleName == null) {
          throw new Exception(("Supply a value for " + snaaName + ".module"));
        }

        startJAASSNAA(
            path,
            urnprefix,
            jaasModuleName,
            jaasConfigFile,
            getAuthorizationModule(authorizationClassName));

      } else if ("wisebed-federator".equals(type) || "federator".equals(type)) {
        FederatorType fedType = FederatorType.GENERIC;
        String secretAuthkeyUrl = null;

        if ("wisebed-federator".equals(type)) {
          fedType = FederatorType.WISEBED;
          secretAuthkeyUrl = props.getProperty(snaaName + ".authentication.url");
        }

        // endpoint url -> set<urnprefix>
        Map<String, Set<String>> federatedUrnPrefixes = new HashMap<String, Set<String>>();

        Set<String> federates = parseCSV(props.getProperty(snaaName + ".federates", ""));
        for (String federatedName : federates) {

          Set<String> urnPrefixes =
              parseCSV(props.getProperty(snaaName + "." + federatedName + ".urnprefixes"));
          String endpointUrl = props.getProperty(snaaName + "." + federatedName + ".endpointurl");

          federatedUrnPrefixes.put(endpointUrl, urnPrefixes);
        }

        startFederator(
            fedType,
            path,
            secretAuthkeyUrl,
            shibbolethInjector,
            shibbolethProxy,
            federatedUrnPrefixes);

      } else {
        log.error("Found unknown type " + type + " for snaa name " + snaaName + ". Ignoring...");
      }
    }

    return server;
  }