private void doXslTransform(
      ServiceBinding binding,
      XSLTServiceBindingValueSourceConfig config,
      Reader reader,
      Writer writer) {
    Source xmlSource = new StreamSource(reader);
    Result xmlResult = new StreamResult(writer);
    Source xslSource = new StreamSource(new StringReader(config.getXslt()));

    TransformerFactory factory = TransformerFactory.newInstance();
    try {
      Transformer transformer = factory.newTransformer(xslSource);

      transformer.setParameter("port", new Integer(binding.getPort()));
      String host = binding.getHostName();
      if (host != null) {
        transformer.setParameter("host", host);
      }

      // Check for any arbitrary attributes
      Map<String, String> attributes = config.getAdditionalAttributes();
      for (Map.Entry<String, String> entry : attributes.entrySet()) {
        String attrValue = StringPropertyReplacer.replaceProperties(entry.getValue());
        transformer.setParameter(entry.getKey(), attrValue);
      }

      transformer.transform(xmlSource, xmlResult);
    } catch (TransformerException e) {
      throw new RuntimeException("Caught TransformerException during transformation", e);
    }
  }
  public void testSetServiceBindingSets() throws Exception {
    Set<ServiceBindingMetadata> set = new HashSet<ServiceBindingMetadata>();
    set.addAll(Arrays.asList(AA, AB, Anull));

    Set<ServiceBindingSet> sbs = new HashSet<ServiceBindingSet>();
    ServiceBindingSet setA = new ServiceBindingSet(A, null, 10);
    sbs.add(setA);
    ServiceBindingSet setB = new ServiceBindingSet(B, "localhost", 20);
    sbs.add(setB);

    PojoServiceBindingStore store = new PojoServiceBindingStore(sbs, set);
    store.start();

    Set<ServiceBindingSet> updated = new HashSet<ServiceBindingSet>(store.getServiceBindingSets());

    Set<ServiceBindingMetadata> overrides = new HashSet<ServiceBindingMetadata>();
    overrides.add(BA);
    ServiceBindingSet newSet = new ServiceBindingSet(C, "192.168.0.10", 30, overrides);
    updated.add(newSet);
    ServiceBindingSet replaced = new ServiceBindingSet(B, "localhost", 50);
    updated.remove(setB);
    updated.add(replaced);
    assertEquals(3, updated.size());

    store.setServiceBindingSets(updated);

    Set<ServiceBindingSet> result = store.getServiceBindingSets();
    assertNotNull(result);
    assertTrue("has setA", result.contains(setA));
    assertTrue("has setB", result.contains(replaced));
    assertTrue("has newSet", result.contains(newSet));

    Set<ServiceBinding> bindings = store.getServiceBindings(C);
    assertNotNull(bindings);
    Map<String, ServiceBinding> byFQN = new HashMap<String, ServiceBinding>();
    for (ServiceBinding binding : bindings) {
      byFQN.put(binding.getFullyQualifiedName(), binding);
    }

    ServiceBinding aa = byFQN.get(AA.getFullyQualifiedName());
    assertNotNull(aa);
    assertEquals(AA.getServiceName(), aa.getServiceName());
    assertEquals(AA.getBindingName(), aa.getBindingName());
    assertEquals(AA.getDescription(), aa.getDescription());
    assertEquals("192.168.0.10", aa.getHostName());
    assertEquals(AA.getPort() + 30, aa.getPort());

    ServiceBinding ab = byFQN.get(AB.getFullyQualifiedName());
    assertNotNull(aa);
    assertEquals(AB.getServiceName(), ab.getServiceName());
    assertEquals(AB.getBindingName(), ab.getBindingName());
    assertEquals(AB.getDescription(), ab.getDescription());
    assertEquals("192.168.0.10", ab.getHostName());
    assertEquals(AB.getPort() + 30, ab.getPort());

    ServiceBinding anull = byFQN.get(Anull.getFullyQualifiedName());
    assertNotNull(anull);
    assertEquals(Anull.getServiceName(), anull.getServiceName());
    assertEquals(Anull.getBindingName(), anull.getBindingName());
    assertEquals(Anull.getDescription(), anull.getDescription());
    assertEquals("192.168.0.10", anull.getHostName());
    assertEquals(Anull.getPort() + 30, anull.getPort());

    ServiceBinding newOne = byFQN.get(BA.getFullyQualifiedName());
    assertNotNull(newOne);
    assertEquals(BA.getServiceName(), newOne.getServiceName());
    assertEquals(BA.getBindingName(), newOne.getBindingName());
    assertEquals(BA.getDescription(), newOne.getDescription());
    assertEquals("192.168.0.10", newOne.getHostName());
    assertEquals(BA.getPort() + 30, newOne.getPort());

    bindings = store.getServiceBindings(B);
    assertNotNull(bindings);
    byFQN = new HashMap<String, ServiceBinding>();
    for (ServiceBinding binding : bindings) {
      byFQN.put(binding.getFullyQualifiedName(), binding);
    }

    aa = byFQN.get(AA.getFullyQualifiedName());
    assertNotNull(aa);
    assertEquals(AA.getServiceName(), aa.getServiceName());
    assertEquals(AA.getBindingName(), aa.getBindingName());
    assertEquals(AA.getDescription(), aa.getDescription());
    assertEquals("localhost", aa.getHostName());
    assertEquals(AA.getPort() + 50, aa.getPort());

    ab = byFQN.get(AB.getFullyQualifiedName());
    assertNotNull(aa);
    assertEquals(AB.getServiceName(), ab.getServiceName());
    assertEquals(AB.getBindingName(), ab.getBindingName());
    assertEquals(AB.getDescription(), ab.getDescription());
    assertEquals("localhost", ab.getHostName());
    assertEquals(AB.getPort() + 50, ab.getPort());

    anull = byFQN.get(Anull.getFullyQualifiedName());
    assertNotNull(anull);
    assertEquals(Anull.getServiceName(), anull.getServiceName());
    assertEquals(Anull.getBindingName(), anull.getBindingName());
    assertEquals(Anull.getDescription(), anull.getDescription());
    assertEquals("localhost", anull.getHostName());
    assertEquals(Anull.getPort() + 50, anull.getPort());
  }
  public void testSetStandardBindings() throws Exception {
    Set<ServiceBindingMetadata> set = new HashSet<ServiceBindingMetadata>();
    set.addAll(Arrays.asList(AA, AB, Anull));

    Set<ServiceBindingSet> sbs = new HashSet<ServiceBindingSet>();
    ServiceBindingSet setB = new ServiceBindingSet(B, "localhost", 20);
    sbs.add(setB);
    ServiceBindingSet setC = new ServiceBindingSet(C, "192.168.0.10", 30);
    sbs.add(setC);

    PojoServiceBindingStore store = new PojoServiceBindingStore(sbs, set);
    store.start();

    Set<ServiceBindingMetadata> updatedSet =
        new HashSet<ServiceBindingMetadata>(store.getStandardBindings());
    assertEquals(3, updatedSet.size());
    ServiceBindingMetadata updated = new ServiceBindingMetadata(AA);
    updated.setPort(9999);
    updated.setDescription("updated");
    updatedSet.remove(AA);
    updatedSet.add(updated);
    updatedSet.add(BA);
    assertEquals(4, updatedSet.size());

    store.setStandardBindings(updatedSet);

    Set<ServiceBindingMetadata> result = store.getStandardBindings();
    assertNotNull(result);
    assertTrue("has updated", result.contains(updated));
    assertTrue("has AB", result.contains(AB));
    assertTrue("has Anull", result.contains(Anull));
    assertTrue("has BA", result.contains(BA));

    for (ServiceBindingSet bindingSet : sbs) {
      String setName = bindingSet.getName();
      Set<ServiceBinding> bindings = store.getServiceBindings(setName);
      assertNotNull(bindings);
      assertEquals(4, bindings.size());
      Map<String, ServiceBinding> byFQN = new HashMap<String, ServiceBinding>();
      for (ServiceBinding binding : bindings) {
        byFQN.put(binding.getFullyQualifiedName(), binding);
      }

      ServiceBinding aa = byFQN.get(updated.getFullyQualifiedName());
      assertNotNull(aa);
      assertEquals(setName + "/updated/serviceName", updated.getServiceName(), aa.getServiceName());
      assertEquals(setName + "/updated/bindingName", updated.getBindingName(), aa.getBindingName());
      assertEquals(setName + "/updated/description", updated.getDescription(), aa.getDescription());
      assertEquals(
          setName + "/updated/hostName", bindingSet.getDefaultHostName(), aa.getHostName());
      assertEquals(
          setName + "/updated/port", updated.getPort() + bindingSet.getPortOffset(), aa.getPort());

      ServiceBinding ab = byFQN.get(AB.getFullyQualifiedName());
      assertNotNull(aa);
      assertEquals(setName + "/AB/serviceName", AB.getServiceName(), ab.getServiceName());
      assertEquals(setName + "/AB/bindingName", AB.getBindingName(), ab.getBindingName());
      assertEquals(setName + "/AB/description", AB.getDescription(), ab.getDescription());
      assertEquals(setName + "/AB/hostName", bindingSet.getDefaultHostName(), ab.getHostName());
      assertEquals(setName + "/AB/port", AB.getPort() + bindingSet.getPortOffset(), ab.getPort());

      ServiceBinding anull = byFQN.get(Anull.getFullyQualifiedName());
      assertNotNull(anull);
      assertEquals(setName + "/Anull/serviceName", Anull.getServiceName(), anull.getServiceName());
      assertEquals(setName + "/Anull/bindingName", Anull.getBindingName(), anull.getBindingName());
      assertEquals(setName + "/Anull/description", Anull.getDescription(), anull.getDescription());
      assertEquals(
          setName + "/Anull/hostName", bindingSet.getDefaultHostName(), anull.getHostName());
      assertEquals(
          setName + "/Anull/port", Anull.getPort() + bindingSet.getPortOffset(), anull.getPort());

      ServiceBinding newOne = byFQN.get(BA.getFullyQualifiedName());
      assertNotNull(newOne);
      assertEquals(setName + "/BA/serviceName", BA.getServiceName(), newOne.getServiceName());
      assertEquals(setName + "/BA/bindingName", BA.getBindingName(), newOne.getBindingName());
      assertEquals(setName + "/BA/description", BA.getDescription(), newOne.getDescription());
      assertEquals(setName + "/BA/hostName", bindingSet.getDefaultHostName(), newOne.getHostName());
      assertEquals(
          setName + "/BA/port", BA.getPort() + bindingSet.getPortOffset(), newOne.getPort());
    }
  }
  public void testAddServiceBindingToAll() throws Exception {
    Set<ServiceBindingMetadata> set = new HashSet<ServiceBindingMetadata>();
    set.addAll(Arrays.asList(AA, AB, Anull));

    Set<ServiceBindingSet> ourSets = new HashSet<ServiceBindingSet>();
    ServiceBindingSet newSetA = new ServiceBindingSet(A, null, 10, set);
    ourSets.add(newSetA);
    ServiceBindingSet newSetB = new ServiceBindingSet(B, "localhost", 20, set);
    ourSets.add(newSetB);
    ServiceBindingSet newSetC = new ServiceBindingSet(C, "192.168.0.10", 30, set);
    ourSets.add(newSetC);

    PojoServiceBindingStore store = new PojoServiceBindingStore();
    store.setServiceBindingSets(ourSets);
    store.start();

    ServiceBindingMetadata new1 = new ServiceBindingMetadata(B, A, "192.168.0.22", 1, false, true);
    store.addServiceBinding(new1);

    InetAddress address = InetAddress.getByName("192.168.0.22");

    ServiceBinding got = store.getServiceBinding(A, B, A);
    assertEquals(getServiceBinding(new1, newSetA), got);
    assertEquals(11, got.getPort());
    assertEquals("192.168.0.22", got.getHostName());
    assertEquals(address, got.getBindAddress());

    got = store.getServiceBinding(B, B, A);
    assertEquals(getServiceBinding(new1, newSetB), got);
    assertEquals(21, got.getPort());
    assertEquals("192.168.0.22", got.getHostName());
    assertEquals(address, got.getBindAddress());

    got = store.getServiceBinding(C, B, A);
    assertEquals(getServiceBinding(new1, newSetC), got);
    assertEquals(31, got.getPort());
    assertEquals("192.168.0.22", got.getHostName());
    assertEquals(address, got.getBindAddress());

    ServiceBindingMetadata new2 = new ServiceBindingMetadata(B, A, "localhost", 2, false, false);
    try {
      store.addServiceBinding(new2);
      fail("duplicate add succeeded");
    } catch (DuplicateServiceException good) {
    }

    ServiceBindingMetadata new3 = new ServiceBindingMetadata(C, C, null, 3, false, false);
    store.addServiceBinding(new3);

    got = store.getServiceBinding(A, C, C);
    assertEquals(getServiceBinding(new3, newSetA), got);
    assertEquals(13, got.getPort());
    assertNull(got.getHostName());
    assertEquals(InetAddress.getByName(null), got.getBindAddress());

    got = store.getServiceBinding(B, C, C);
    assertEquals(getServiceBinding(new3, newSetB), got);
    assertEquals(23, got.getPort());
    assertEquals("localhost", got.getHostName());
    assertEquals(InetAddress.getByName("localhost"), got.getBindAddress());

    got = store.getServiceBinding(C, C, C);
    assertEquals(getServiceBinding(new3, newSetC), got);
    assertEquals(33, got.getPort());
    assertEquals("192.168.0.10", got.getHostName());
    assertEquals(InetAddress.getByName("192.168.0.10"), got.getBindAddress());
  }