/**
   * Test isExtramural method using two different connections with two different users. Note that
   * this users 2 different pre-defined users from the server keystore in two different Connections.
   */
  public void testIsExtramural1() throws Exception {

    Connection nikolaConnection = getConnection(AuthenticationServiceImpl.ALIAS_NIKOLA);
    DeclarativeQueryManagerImpl nikolaDQM =
        (DeclarativeQueryManagerImpl)
            nikolaConnection.getRegistryService().getDeclarativeQueryManager();
    BusinessQueryManager nikolaBQM =
        nikolaConnection.getRegistryService().getBusinessQueryManager();
    BusinessLifeCycleManager nikolaLCM =
        nikolaConnection.getRegistryService().getBusinessLifeCycleManager();

    Connection farrukhConnection = getConnection(AuthenticationServiceImpl.ALIAS_FARRUKH);
    DeclarativeQueryManagerImpl farrukhDQM =
        (DeclarativeQueryManagerImpl)
            farrukhConnection.getRegistryService().getDeclarativeQueryManager();
    BusinessQueryManager farrukhBQM =
        farrukhConnection.getRegistryService().getBusinessQueryManager();
    BusinessLifeCycleManager farrukhLCM =
        farrukhConnection.getRegistryService().getBusinessLifeCycleManager();

    RegistryObject nikolaUser = nikolaDQM.getCallersUser();
    RegistryObject farrukhUser = farrukhDQM.getCallersUser();

    Concept assocType =
        (Concept)
            farrukhDQM.getRegistryObject(
                BindingUtility.CANONICAL_ASSOCIATION_TYPE_ID_RelatedTo, LifeCycleManager.CONCEPT);

    // Create an extramural assoc
    Association extramuralAss = farrukhLCM.createAssociation(nikolaUser, assocType);
    farrukhUser.addAssociation(extramuralAss);

    assertTrue(
        "isExtraMural return false for extramural Association", (extramuralAss.isExtramural()));
  }
  /**
   * Establishes a connection to a registry.
   *
   * @param queryUrl the URL of the query registry
   * @param publishUrl the URL of the publish registry
   */
  public void makeConnection(String queryUrl, String publishUrl) {

    Context context = null;
    ConnectionFactory factory = null;

    /*
     * Define connection configuration properties.
     * To publish, you need both the query URL and the
     * publish URL.
     */
    Properties props = new Properties();
    props.setProperty("javax.xml.registry.queryManagerURL", queryUrl);
    props.setProperty("javax.xml.registry.lifeCycleManagerURL", publishUrl);

    try {
      // Create the connection, passing it the
      // configuration properties
      context = new InitialContext();
      factory = (ConnectionFactory) context.lookup("java:comp/env/eis/JAXR");
      factory.setProperties(props);
      connection = factory.createConnection();
      System.out.println("Created connection to registry");
    } catch (Exception e) {
      e.printStackTrace();
      if (connection != null) {
        try {
          connection.close();
        } catch (JAXRException je) {
        }
      }
    }
  }
  public CertificateAuthorityServiceBridge() {

    // //////////////////////////////////////////////////////
    // Connection to UDDI Registry
    // //////////////////////////////////////////////////////
    try {
      ConnectionFactory connFactory =
          org.apache.ws.scout.registry.ConnectionFactoryImpl.newInstance();

      // Properties
      Properties props = new Properties();
      props.setProperty("scout.juddi.client.config.file", "uddi.xml");
      props.setProperty(
          "javax.xml.registry.queryManagerURL", "http://localhost:8081/juddiv3/services/inquiry");
      props.setProperty(
          "javax.xml.registry.lifeCycleManagerURL",
          "http://localhost:8081/juddiv3/services/publish");
      props.setProperty(
          "javax.xml.registry.securityManagerURL",
          "http://localhost:8081/juddiv3/services/security");
      props.setProperty("scout.proxy.uddiVersion", "3.0");
      props.setProperty(
          "scout.proxy.transportClass", "org.apache.juddi.v3.client.transport.JAXWSTransport");
      connFactory.setProperties(props);
      Connection connection = connFactory.createConnection();

      // Authentication
      PasswordAuthentication passwdAuth =
          new PasswordAuthentication("username", "password".toCharArray());
      Set<PasswordAuthentication> creds = new HashSet<PasswordAuthentication>();
      creds.add(passwdAuth);
      connection.setCredentials(creds);

      // Get Query Manager
      registryService = connection.getRegistryService();
      businessQueryManager = registryService.getBusinessQueryManager();
      businessLifeCycleManager = registryService.getBusinessLifeCycleManager();
    } catch (Exception e) {
      System.err.println("[jUDDI-ERROR] Error while connecting to jUDDI: " + e.getMessage());
      e.printStackTrace();
    }
  }
  /**
   * Creates an organization, its classification, and its services, and saves it to the registry.
   */
  public String executePublish(String username, String password, String endpoint) {

    String id = null;
    RegistryService rs = null;
    BusinessLifeCycleManager blcm = null;
    BusinessQueryManager bqm = null;

    try {
      rs = connection.getRegistryService();
      blcm = rs.getBusinessLifeCycleManager();
      bqm = rs.getBusinessQueryManager();
      System.out.println("Got registry service, query " + "manager, and life cycle manager");

      // Get authorization from the registry
      PasswordAuthentication passwdAuth =
          new PasswordAuthentication(username, password.toCharArray());

      Set creds = new HashSet();
      creds.add(passwdAuth);
      connection.setCredentials(creds);
      System.out.println("Established security credentials");

      // Get hardcoded strings from a ResourceBundle
      ResourceBundle bundle = ResourceBundle.getBundle("com.sun.cb.CoffeeRegistry");

      // Create organization name and description
      Organization org = blcm.createOrganization(bundle.getString("org.name"));
      InternationalString s = blcm.createInternationalString(bundle.getString("org.description"));
      org.setDescription(s);

      // Create primary contact, set name
      User primaryContact = blcm.createUser();
      PersonName pName = blcm.createPersonName(bundle.getString("person.name"));
      primaryContact.setPersonName(pName);

      // Set primary contact phone number
      TelephoneNumber tNum = blcm.createTelephoneNumber();
      tNum.setNumber(bundle.getString("phone.number"));
      Collection phoneNums = new ArrayList();
      phoneNums.add(tNum);
      primaryContact.setTelephoneNumbers(phoneNums);

      // Set primary contact email address
      EmailAddress emailAddress = blcm.createEmailAddress(bundle.getString("email.address"));
      Collection emailAddresses = new ArrayList();
      emailAddresses.add(emailAddress);
      primaryContact.setEmailAddresses(emailAddresses);

      // Set primary contact for organization
      org.setPrimaryContact(primaryContact);

      // Set classification scheme to NAICS
      ClassificationScheme cScheme =
          bqm.findClassificationSchemeByName(null, bundle.getString("classification.scheme"));

      // Create and add classification
      Classification classification =
          (Classification)
              blcm.createClassification(
                  cScheme,
                  bundle.getString("classification.name"),
                  bundle.getString("classification.value"));
      Collection classifications = new ArrayList();
      classifications.add(classification);
      org.addClassifications(classifications);

      // Create services and service
      Collection services = new ArrayList();
      Service service = blcm.createService(bundle.getString("service.name"));
      InternationalString is =
          blcm.createInternationalString(bundle.getString("service.description"));
      service.setDescription(is);

      // Create service bindings
      Collection serviceBindings = new ArrayList();
      ServiceBinding binding = blcm.createServiceBinding();
      is = blcm.createInternationalString(bundle.getString("service.binding"));
      binding.setDescription(is);
      binding.setValidateURI(false);
      binding.setAccessURI(endpoint);
      serviceBindings.add(binding);

      // Add service bindings to service
      service.addServiceBindings(serviceBindings);

      // Add service to services, then add services to organization
      services.add(service);
      org.addServices(services);

      // Add organization and submit to registry
      // Retrieve key if successful
      Collection orgs = new ArrayList();
      orgs.add(org);
      BulkResponse response = blcm.saveOrganizations(orgs);
      Collection exceptions = response.getExceptions();
      if (exceptions == null) {
        System.out.println("Organization saved");

        Collection keys = response.getCollection();
        Iterator keyIter = keys.iterator();
        if (keyIter.hasNext()) {
          javax.xml.registry.infomodel.Key orgKey =
              (javax.xml.registry.infomodel.Key) keyIter.next();
          id = orgKey.getId();
          System.out.println("Organization key is " + id);
        }
      } else {
        Iterator excIter = exceptions.iterator();
        Exception exception = null;
        while (excIter.hasNext()) {
          exception = (Exception) excIter.next();
          System.err.println("Exception on save: " + exception.toString());
        }
      }
    } catch (Exception e) {
      e.printStackTrace();
      if (connection != null) {
        try {
          connection.close();
        } catch (JAXRException je) {
          System.err.println("Connection close failed");
        }
      }
    }
    return id;
  }
  public void testSaveUnownedAssociations() throws Exception {

    String folderId = null;
    String farrukhExtrinsicObjectId = null;
    String farrukhAssociationId = null;
    String nikolaExtrinsicObjectId = null;
    String nikolaAssociationId = null;

    String keystorePath =
        RegistryProperties.getInstance().getProperty("omar.security.keystoreFile");
    String storepass =
        RegistryProperties.getInstance().getProperty("omar.security.keystorePassword");

    ConnectionFactory connFactory = JAXRUtility.getConnectionFactory();
    Properties props = new Properties();
    props.put("javax.xml.registry.queryManagerURL", regSoapUrl);
    connFactory.setProperties(props);

    try {

      // create connection for Farrukh

      Connection farrukhConnection = connFactory.createConnection();
      String farrukhAlias = "urn:freebxml:registry:predefinedusers:registryoperator";
      Set farrukhCredentials =
          getCredentialsFromKeystore(keystorePath, storepass, farrukhAlias, farrukhAlias);
      farrukhConnection.setCredentials(farrukhCredentials);
      BusinessQueryManagerImpl farrukhBQM =
          (BusinessQueryManagerImpl)
              farrukhConnection.getRegistryService().getBusinessQueryManager();
      LifeCycleManager farrukhLCM =
          farrukhConnection.getRegistryService().getBusinessLifeCycleManager();

      // Create the folder as Farrukh

      RegistryPackage folder = farrukhLCM.createRegistryPackage("Farrukh's Folder");
      folderId = folder.getKey().getId();
      System.out.println("Created folder with id '" + folderId + "'");

      // using farrukh's connection, saveObjects() with extrinsic object and hasMember association
      File file = createTempFile(true);
      FileDataSource fds = new FileDataSource(file);
      DataHandler dataHandler = new DataHandler(fds);
      ExtrinsicObject farrukhExtrinsicObject =
          (ExtrinsicObject) farrukhLCM.createExtrinsicObject(dataHandler);
      String eoId = Utility.getInstance().createId();
      farrukhExtrinsicObject.getKey().setId(eoId);
      farrukhExtrinsicObject.setName(
          farrukhLCM.createInternationalString("Farrukh's Extrinsic Object"));

      Concept associationConcept =
          farrukhBQM.findConceptByPath(
              "/"
                  + BindingUtility.CANONICAL_CLASSIFICATION_SCHEME_LID_AssociationType
                  + "/"
                  + BindingUtility.CANONICAL_ASSOCIATION_TYPE_CODE_HasMember);
      Association farrukhAssociation =
          farrukhLCM.createAssociation(farrukhExtrinsicObject, associationConcept);
      farrukhAssociation.setSourceObject(folder);

      ArrayList objectsToSave = new ArrayList();
      objectsToSave.add(folder);
      objectsToSave.add(farrukhAssociation);
      objectsToSave.add(farrukhExtrinsicObject);
      System.out.println(
          "Saving farrukh's extrinsic object '"
              + farrukhExtrinsicObject.getKey().getId()
              + "' under folder '"
              + folderId
              + "' with hasMember association '"
              + farrukhAssociation.getKey().getId()
              + "'");
      BulkResponse br = farrukhLCM.saveObjects(objectsToSave);
      JAXRUtility.checkBulkResponse(br);
      farrukhExtrinsicObjectId = farrukhExtrinsicObject.getKey().getId();
      farrukhAssociationId = farrukhAssociation.getKey().getId();
      System.out.println(
          "Objects '"
              + farrukhExtrinsicObject.getKey().getId()
              + "' and '"
              + farrukhAssociation.getKey().getId()
              + "' saved successfully");

      // create connection for Nikola

      Connection nikolaConnection = connFactory.createConnection();
      String nikolaAlias = "urn:freebxml:registry:predefinedusers:nikola";
      Set nikolaCredentials =
          getCredentialsFromKeystore(keystorePath, storepass, nikolaAlias, nikolaAlias);
      nikolaConnection.setCredentials(nikolaCredentials);
      BusinessQueryManagerImpl nikolaBQM =
          (BusinessQueryManagerImpl)
              nikolaConnection.getRegistryService().getBusinessQueryManager();
      LifeCycleManager nikolaLCM =
          nikolaConnection.getRegistryService().getBusinessLifeCycleManager();

      // Get the folder

      /*RegistryPackage*/ folder = (RegistryPackage) nikolaBQM.getRegistryObject(folderId);
      Assert.assertNotNull("Could not find root folder", folder);

      // using nikola's connection, saveObjects() with extrinsic object and hasMember association
      file = createTempFile(true);
      fds = new FileDataSource(file);
      dataHandler = new DataHandler(fds);
      ExtrinsicObject nikolaExtrinsicObject =
          (ExtrinsicObject) nikolaLCM.createExtrinsicObject(dataHandler);
      eoId = Utility.getInstance().createId();
      nikolaExtrinsicObject.getKey().setId(eoId);
      nikolaExtrinsicObject.setName(
          nikolaLCM.createInternationalString("Nikola's Extrinsic Object"));

      associationConcept =
          nikolaBQM.findConceptByPath(
              "/"
                  + BindingUtility.CANONICAL_CLASSIFICATION_SCHEME_LID_AssociationType
                  + "/"
                  + BindingUtility.CANONICAL_ASSOCIATION_TYPE_CODE_HasMember);
      Association nikolaAssociation =
          nikolaLCM.createAssociation(nikolaExtrinsicObject, associationConcept);
      nikolaAssociation.setSourceObject(folder);

      objectsToSave = new ArrayList();
      objectsToSave.add(folder);
      objectsToSave.add(nikolaAssociation);
      System.out.println(
          "Saving nikola's extrinsic object '"
              + nikolaExtrinsicObject.getKey().getId()
              + "' under folder '"
              + folderId
              + "' with hasMember association '"
              + nikolaAssociation.getKey().getId()
              + "'");
      objectsToSave.add(nikolaExtrinsicObject);
      br = nikolaLCM.saveObjects(objectsToSave);
      JAXRUtility.checkBulkResponse(br);
      nikolaExtrinsicObjectId = nikolaExtrinsicObject.getKey().getId();
      nikolaAssociationId = nikolaAssociation.getKey().getId();
      System.out.println(
          "Objects '"
              + nikolaExtrinsicObject.getKey().getId()
              + "' and '"
              + nikolaAssociation.getKey().getId()
              + "' saved successfully");
    } finally {
      // remove extrinsic objects and associations as registry operator
      try {
        Connection roConnection = connFactory.createConnection();
        String roAlias = "urn:freebxml:registry:predefinedusers:registryoperator";
        Set roCredentials = getCredentialsFromKeystore(keystorePath, storepass, roAlias, roAlias);
        roConnection.setCredentials(roCredentials);
        LifeCycleManagerImpl roLCM =
            (LifeCycleManagerImpl) roConnection.getRegistryService().getBusinessLifeCycleManager();

        if (folderId != null) {
          System.out.println("Deleting '" + folderId + "'");
          HashSet keys = new HashSet();
          keys.add(roLCM.createKey(folderId));
          roLCM.deleteObjects(keys, null, forceRemoveRequestSlotsMap, null);
          System.out.println("Successfully deleted '" + folderId + "'");
        }

        if (farrukhExtrinsicObjectId != null) {
          System.out.println("Deleting '" + farrukhExtrinsicObjectId + "'");
          HashSet keys = new HashSet();
          keys.add(roLCM.createKey(farrukhExtrinsicObjectId));
          roLCM.deleteObjects(keys, null, forceRemoveRequestSlotsMap, null);
          System.out.println("Successfully deleted '" + farrukhExtrinsicObjectId + "'");
        }

        if (farrukhAssociationId != null) {
          System.out.println("Deleting '" + farrukhAssociationId + "'");
          HashSet keys = new HashSet();
          keys.add(roLCM.createKey(farrukhAssociationId));
          roLCM.deleteObjects(keys, null, forceRemoveRequestSlotsMap, null);
          System.out.println("Successfully deleted '" + farrukhAssociationId + "'");
        }

        if (nikolaExtrinsicObjectId != null) {
          System.out.println("Deleting '" + nikolaExtrinsicObjectId + "'");
          HashSet keys = new HashSet();
          keys.add(roLCM.createKey(nikolaExtrinsicObjectId));
          roLCM.deleteObjects(keys, null, forceRemoveRequestSlotsMap, null);
          System.out.println("Successfully deleted '" + nikolaExtrinsicObjectId + "'");
        }

        if (nikolaAssociationId != null) {
          System.out.println("Deleting '" + nikolaAssociationId + "'");
          HashSet keys = new HashSet();
          keys.add(roLCM.createKey(nikolaAssociationId));
          roLCM.deleteObjects(keys, null, forceRemoveRequestSlotsMap, null);
          System.out.println("Successfully deleted '" + nikolaAssociationId + "'");
        }

      } catch (Throwable t) {
        System.err.println(
            "Failed to remove some or all of the test objects. Exception: " + t.getMessage());
        t.printStackTrace();
      }
    }
  }