[jboss-cvs] JBossAS SVN: r81879 - in trunk: varia/src/main/org/jboss/services/binding and 2 other directories.

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Sun Nov 30 23:43:06 EST 2008


Author: bstansberry at jboss.com
Date: 2008-11-30 23:43:06 -0500 (Sun, 30 Nov 2008)
New Revision: 81879

Added:
   trunk/varia/src/main/org/jboss/services/binding/ServiceBindingMetadata.java
   trunk/varia/src/tests/org/jboss/test/services/binding/test/ServiceBindingMetadataTestCase.java
Removed:
   trunk/varia/src/main/org/jboss/services/binding/ManagedServiceBinding.java
Modified:
   trunk/server/src/etc/conf/default/bootstrap/bindings.xml
   trunk/varia/src/main/org/jboss/services/binding/ServiceBinding.java
   trunk/varia/src/main/org/jboss/services/binding/ServiceBindingManager.java
   trunk/varia/src/main/org/jboss/services/binding/ServiceBindingStore.java
   trunk/varia/src/main/org/jboss/services/binding/impl/PojoServiceBindingStore.java
   trunk/varia/src/main/org/jboss/services/binding/impl/ServiceBindingSet.java
   trunk/varia/src/tests/org/jboss/test/services/binding/test/DefaultServiceBindingValueSourceUnitTestCase.java
   trunk/varia/src/tests/org/jboss/test/services/binding/test/MockServiceBindingStore.java
   trunk/varia/src/tests/org/jboss/test/services/binding/test/PojoServiceBindingStoreUnitTestCase.java
   trunk/varia/src/tests/org/jboss/test/services/binding/test/ServiceBindingManagerUnitTestCase.java
   trunk/varia/src/tests/org/jboss/test/services/binding/test/ServiceBindingSetUnitTestCase.java
   trunk/varia/src/tests/org/jboss/test/services/binding/test/ServiceBindingTestBase.java
   trunk/varia/src/tests/org/jboss/test/services/binding/test/ServiceBindingUnitTestCase.java
   trunk/varia/src/tests/org/jboss/test/services/binding/test/SimpleServiceBindingValueSourceUnitTestCase.java
   trunk/varia/src/tests/org/jboss/test/services/binding/test/StringReplacementServiceBindingValueSourceUnitTestCase.java
   trunk/varia/src/tests/org/jboss/test/services/binding/test/XSLTServiceBindingValueSourceUnitTestCase.java
Log:
[JBAS-6259] Separate the metadata object from the runtime object

Modified: trunk/server/src/etc/conf/default/bootstrap/bindings.xml
===================================================================
--- trunk/server/src/etc/conf/default/bootstrap/bindings.xml	2008-12-01 03:07:05 UTC (rev 81878)
+++ trunk/server/src/etc/conf/default/bootstrap/bindings.xml	2008-12-01 04:43:06 UTC (rev 81879)
@@ -20,17 +20,9 @@
          <parameter>
             <bean name="ServiceBindingStore" class="org.jboss.services.binding.impl.PojoServiceBindingStore">
 
-               <!-- Base bindings that are used to create bindings for each set
-                    by adding the set's port offset to the base binding's port value -->
-               <property name="portOffsetBindings"><inject bean="PortOffsetBindings"/></property>
+               <!-- Base bindings that are used to create bindings for each set -->
+               <property name="standardBindings"><inject bean="StandardBindings"/></property>
                
-               <!-- Base bindings that are used to create bindings for each set
-                    but without altering the base binding's port value.  
-                    Typically used for multicast socket bindings, which do not 
-                    lead to port conflicts if multiple sockets are opened on 
-                    the same machine.-->
-               <property name="fixedBindings"><null/></property>
-               
                <!-- The sets of bindings -->
                <property name="serviceBindingSets">
                   <set>
@@ -102,160 +94,123 @@
       </constructor>
    </bean>
 
-   <!-- Base bindings that ServiceBindingStore uses to create bindings for each set
-        by adding the set's port offset to the base binding's port value -->
-   <bean name="PortOffsetBindings" class="java.util.HashSet" 
-         elementClass="org.jboss.services.binding.ManagedServiceBinding">
+   <!-- Base binding metadata that ServiceBindingStore uses to create bindings for each set -->
+   <bean name="StandardBindings" class="java.util.HashSet" 
+         elementClass="org.jboss.services.binding.ServiceBindingMetadata">
       <constructor>
          <parameter>
             <set>
             <!-- ********************* conf/jboss-service.xml ****************** -->
 
             <!-- Naming Service -->
-            <bean class="org.jboss.services.binding.ManagedServiceBinding">
-               <constructor>
-                  <parameter>jboss:service=Naming</parameter>
-                  <parameter>Port</parameter>
-                  <parameter><null/></parameter>
-                  <parameter>1099</parameter>
-               </constructor>
+            <bean class="org.jboss.services.binding.ServiceBindingMetadata">
+               <property name="serviceName">jboss:service=Naming</property>
+               <property name="bindingName">Port</property>
+               <property name="port">1099</property>
             </bean>
 
-            <bean class="org.jboss.services.binding.ManagedServiceBinding">
-               <constructor>
-                  <parameter>jboss:service=Naming</parameter>
-                  <parameter>RmiPort</parameter>
-                  <parameter><null/></parameter>
-                  <parameter>1098</parameter>
-               </constructor>
+            <bean class="org.jboss.services.binding.ServiceBindingMetadata">
+               <property name="serviceName">jboss:service=Naming</property>
+               <property name="bindingName">RmiPort</property>
+               <property name="port">1098</property>
             </bean>
 
             <!-- Remote classloading service -->
-            <bean class="org.jboss.services.binding.ManagedServiceBinding">
-               <constructor>
-                  <parameter>jboss:service=WebService</parameter>
-                  <parameter>8083</parameter>
-               </constructor>
+            <bean class="org.jboss.services.binding.ServiceBindingMetadata">
+               <property name="serviceName">jboss:service=WebService</property>
+               <property name="port">8083</property>
             </bean>
 
             <!-- Remoting Connector -->
-            <bean class="org.jboss.services.binding.ManagedServiceBinding">
-               <constructor>
-                  <parameter>UnifiedInvokerConnector</parameter>
-                  <parameter>4446</parameter>
-               </constructor>
+            <bean class="org.jboss.services.binding.ServiceBindingMetadata">
+               <property name="serviceName">UnifiedInvokerConnector</property>
+               <property name="port">4446</property>
             </bean>
             
             <!-- Used to create a multihome Remoting server.   See -->
             <!-- deploy/remoting-jboss-beans.xml for more details. -->
-            <!--bean class="org.jboss.services.binding.ManagedServiceBinding">
-               <constructor>
-                  <parameter>UnifiedInvokerConnector:bindingHome1</parameter>
-                  <parameter>192.168.2.2</parameter>
-                  <parameter>7777</parameter>
-               </constructor>
+            <!--bean class="org.jboss.services.binding.ServiceBindingMetadata">
+               <property name="serviceName">UnifiedInvokerConnector:bindingHome1</property>
+               <parameter>192.168.2.2</property>
+               <property name="port">7777</property>
             </bean-->
             
             <!-- Used to create a multihome Remoting server.   See -->
             <!-- deploy/remoting-jboss-beans.xml for more details. -->
-            <!--bean class="org.jboss.services.binding.ManagedServiceBinding">
-               <constructor>
-                  <parameter>UnifiedInvokerConnector:bindingHome2</parameter>
-                  <parameter>10.11.12.238</parameter>
-                  <parameter>8888</parameter>
-               </constructor>
+            <!--bean class="org.jboss.services.binding.ServiceBindingMetadata">
+               <property name="serviceName">UnifiedInvokerConnector:bindingHome2</property>
+               <parameter>10.11.12.238</property>
+               <property name="port">8888</property>
             </bean-->
 
             <!-- ********************* deploy/remoting-service.xml ****************** -->
 
             <!-- RMI/JRMP invoker -->
-            <bean class="org.jboss.services.binding.ManagedServiceBinding">
-               <constructor>
-                  <parameter>jboss:service=invoker,type=jrmp</parameter>
-                  <parameter>4444</parameter>
-               </constructor>
+            <bean class="org.jboss.services.binding.ServiceBindingMetadata">
+               <property name="serviceName">jboss:service=invoker,type=jrmp</property>
+               <property name="port">4444</property>
             </bean>
 
             <!-- Pooled invoker -->
-            <bean class="org.jboss.services.binding.ManagedServiceBinding">
-               <constructor>
-                  <parameter>jboss:service=invoker,type=pooled</parameter>
-                  <parameter>4445</parameter>
-               </constructor>
+            <bean class="org.jboss.services.binding.ServiceBindingMetadata">
+               <property name="serviceName">jboss:service=invoker,type=pooled</property>
+               <property name="port">4445</property>
             </bean>
 
             <!-- ********************* deploy/cluster/hajndi-service.xml ****************** -->
 
-            <bean class="org.jboss.services.binding.ManagedServiceBinding">
-               <constructor>
-                  <parameter>jboss:service=HAJNDI</parameter>
-                  <parameter>Port</parameter>
-                  <parameter><null/></parameter>
-                  <parameter>1100</parameter>
-               </constructor>
+            <bean class="org.jboss.services.binding.ServiceBindingMetadata">
+               <property name="serviceName">jboss:service=HAJNDI</property>
+               <property name="bindingName">Port</property>
+               <property name="port">1100</property>
             </bean>
 
-            <bean class="org.jboss.services.binding.ManagedServiceBinding">
-               <constructor>
-                  <parameter>jboss:service=HAJNDI</parameter>
-                  <parameter>RmiPort</parameter>
-                  <parameter><null/></parameter>
-                  <parameter>1101</parameter>
-               </constructor>
+            <bean class="org.jboss.services.binding.ServiceBindingMetadata">
+               <property name="serviceName">jboss:service=HAJNDI</property>
+               <property name="bindingName">RmiPort</property>
+               <property name="port">1101</property>
             </bean>
 
             <!-- ********************* deploy/cluster/ha-legacy-service.xml ****************** -->
 
             <!-- HA RMI/JRMP invoker -->
-            <bean class="org.jboss.services.binding.ManagedServiceBinding">
-               <constructor>
-                  <parameter>jboss:service=invoker,type=jrmpha</parameter>
-                  <parameter>4447</parameter>
-               </constructor>
+            <bean class="org.jboss.services.binding.ServiceBindingMetadata">
+               <property name="serviceName">jboss:service=invoker,type=jrmpha</property>
+               <property name="port">4447</property>
             </bean>
 
             <!-- HA Pooled invoker -->
-            <bean class="org.jboss.services.binding.ManagedServiceBinding">
-               <constructor>
-                  <parameter>jboss:service=invoker,type=pooledha</parameter>
-                  <parameter>4448</parameter>
-               </constructor>
+            <bean class="org.jboss.services.binding.ServiceBindingMetadata">
+               <property name="serviceName">jboss:service=invoker,type=pooledha</property>
+               <property name="port">4448</property>
             </bean>
 
             <!-- ********************* deploy/iiop-service.xml ****************** -->
 
-            <bean class="org.jboss.services.binding.ManagedServiceBinding">
-               <constructor>
-                  <parameter>jboss:service=CorbaORB</parameter>
-                  <parameter>3528</parameter>
-               </constructor>
+            <bean class="org.jboss.services.binding.ServiceBindingMetadata">
+               <property name="serviceName">jboss:service=CorbaORB</property>
+               <property name="port">3528</property>
             </bean>
 
             <!-- ********************* deploy/snmp-adaptor.sar **************** -->
 
             <!-- Trap receiver that acts as an SNMP Manager -->
-            <bean class="org.jboss.services.binding.ManagedServiceBinding">
-               <constructor>
-                  <parameter>jboss.jmx:name=SnmpAgent,service=trapd,type=logger</parameter>
-                  <parameter>1162</parameter>
-               </constructor>
+            <bean class="org.jboss.services.binding.ServiceBindingMetadata">
+               <property name="serviceName">jboss.jmx:name=SnmpAgent,service=trapd,type=logger</property>
+               <property name="port">1162</property>
             </bean>
 
             <!-- The SNMP adaptor MBean -->
-            <bean class="org.jboss.services.binding.ManagedServiceBinding">
-               <constructor>
-                  <parameter>jboss.jmx:name=SnmpAgent,service=snmp,type=adaptor</parameter>
-                  <parameter>1161</parameter>
-               </constructor>
+            <bean class="org.jboss.services.binding.ServiceBindingMetadata">
+               <property name="serviceName">jboss.jmx:name=SnmpAgent,service=snmp,type=adaptor</property>
+               <property name="port">1161</property>
             </bean>
 
             <!-- ********************* deploy/jmx-remoting.sar **************** -->
 
-            <bean class="org.jboss.services.binding.ManagedServiceBinding">
-               <constructor>
-                  <parameter>jboss.remoting:service=JMXConnectorServer,protocol=rmi</parameter>
-                  <parameter>1090</parameter>
-               </constructor>
+            <bean class="org.jboss.services.binding.ServiceBindingMetadata">
+               <property name="serviceName">jboss.remoting:service=JMXConnectorServer,protocol=rmi</property>
+               <property name="port">1090</property>
             </bean>
 
             <!-- ********************* deploy/ejb3-connectors-service.xml **************** -->
@@ -281,11 +236,9 @@
                 jboss:service=invoker,type=http,target=HAJNDI
                 jboss.ws:service=ServiceEndpointManager
             -->
-            <bean class="org.jboss.services.binding.ManagedServiceBinding">
-               <constructor>
-                  <parameter>jboss.web:service=WebServer</parameter>
-                  <parameter>8080</parameter>
-               </constructor>
+            <bean class="org.jboss.services.binding.ServiceBindingMetadata">
+               <property name="serviceName">jboss.web:service=WebServer</property>
+               <property name="port">8080</property>
 
                <!--
                    Inject a XSLT transform configuration (see below) that describes
@@ -298,56 +251,42 @@
 
             <!-- For services like those listed above that need to know the
                  port of the HTTPS connector -->
-            <bean class="org.jboss.services.binding.ManagedServiceBinding">
-               <constructor>
-                  <parameter>jboss.web:service=WebServer</parameter>
-                  <parameter>HttpsConnector</parameter>
-                  <parameter><null/></parameter>
-                  <parameter>8443</parameter>
-               </constructor>
+            <bean class="org.jboss.services.binding.ServiceBindingMetadata">
+               <property name="serviceName">jboss.web:service=WebServer</property>
+               <property name="bindingName">HttpsConnector</property>
+               <property name="port">8443</property>
             </bean>
 
             <!-- ********************* deploy/messaging/remoting-bisocket-service.xml ********************** -->
 
             <!-- Standard JBM bisocket connector -->
-            <bean class="org.jboss.services.binding.ManagedServiceBinding">
-               <constructor>
-                  <parameter>jboss.messaging:service=Connector,transport=bisocket</parameter>
-                  <parameter>4457</parameter>
-               </constructor>
+            <bean class="org.jboss.services.binding.ServiceBindingMetadata">
+               <property name="serviceName">jboss.messaging:service=Connector,transport=bisocket</property>
+               <property name="port">4457</property>
             </bean>
 
             <!-- ********************* deploy/transaction-jboss-beans.xml ********************** -->
 
             <!-- JBossTS Recovery Manager -->
-            <bean class="org.jboss.services.binding.ManagedServiceBinding">
-                <constructor>
-                    <parameter>TransactionManager</parameter>
-                    <parameter>recoveryManager</parameter>
-                    <parameter><null/></parameter>
-                    <parameter>4712</parameter>
-                </constructor>
+            <bean class="org.jboss.services.binding.ServiceBindingMetadata">
+                <property name="serviceName">TransactionManager</property>
+                <property name="bindingName">recoveryManager</property>
+                <property name="port">4712</property>
             </bean>
 
             <!-- JBossTS Transaction Status Manager -->
-            <bean class="org.jboss.services.binding.ManagedServiceBinding">
-                <constructor>
-                    <parameter>TransactionManager</parameter>
-                    <parameter>transactionStatusManager</parameter>
-                    <parameter><null/></parameter>
-                    <parameter>4713</parameter>
-                </constructor>
+            <bean class="org.jboss.services.binding.ServiceBindingMetadata">
+                <property name="serviceName">TransactionManager</property>
+                <property name="bindingName">transactionStatusManager</property>
+                <property name="port">4713</property>
             </bean>
 
             <!-- JBossTS SocketProcessId.  The address part is ignored,
                 it will always use localhost/127.0.0.1. -->
-            <bean class="org.jboss.services.binding.ManagedServiceBinding">
-                <constructor>
-                    <parameter>TransactionManager</parameter>
-                    <parameter>socketProcessId</parameter>
-                    <parameter><null/></parameter>
-                    <parameter>4714</parameter>
-                </constructor>
+            <bean class="org.jboss.services.binding.ServiceBindingMetadata">
+                <property name="serviceName">TransactionManager</property>
+                <property name="bindingName">socketProcessId</property>
+                <property name="port">4714</property>
             </bean>
 
 
@@ -355,11 +294,9 @@
 
             <!-- Commented out as tcp/ip access to Hypersonic is not enabled by default -->
             <!--
-            <bean class="org.jboss.services.binding.ManagedServiceBinding">
-               <constructor>
-                  <parameter>jboss:service=Hypersonic</parameter>
-                  <parameter>1701</parameter>
-               </constructor>
+            <bean class="org.jboss.services.binding.ServiceBindingMetadata">
+               <property name="serviceName">jboss:service=Hypersonic</property>
+               <property name="port">1701</property>
             </bean>
             -->
 
@@ -370,11 +307,9 @@
                  configure the http invocation layer using the jboss.web:service=WebServer binding above
              -->
             <!--
-            <bean class="org.jboss.services.binding.ManagedServiceBinding">
-               <constructor>
-                  <parameter>jboss.mq:service=InvocationLayer,type=UIL2</parameter>
-                  <parameter>8093</parameter>
-               </constructor>
+            <bean class="org.jboss.services.binding.ServiceBindingMetadata">
+               <property name="serviceName">jboss.mq:service=InvocationLayer,type=UIL2</property>
+               <property name="port">8093</property>
             </bean>
             -->
          </set>

Deleted: trunk/varia/src/main/org/jboss/services/binding/ManagedServiceBinding.java
===================================================================
--- trunk/varia/src/main/org/jboss/services/binding/ManagedServiceBinding.java	2008-12-01 03:07:05 UTC (rev 81878)
+++ trunk/varia/src/main/org/jboss/services/binding/ManagedServiceBinding.java	2008-12-01 04:43:06 UTC (rev 81879)
@@ -1,141 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source.
- * Copyright 2008, Red Hat Middleware LLC, and individual contributors
- * as indicated by the @author tags. See the copyright.txt file in the
- * distribution for a full listing of individual contributors.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-
-package org.jboss.services.binding;
-
-import java.net.UnknownHostException;
-
-import org.jboss.managed.api.annotation.ManagementComponent;
-import org.jboss.managed.api.annotation.ManagementObject;
-import org.jboss.managed.api.annotation.ManagementProperties;
-import org.jboss.managed.api.annotation.ManagementProperty;
-import org.jboss.managed.api.annotation.ViewUse;
-
-/**
- * {@link ServiceBinding} subclass that exposes an editing interface that
- * management tools can use.
- * @author Brian Stansberry
- */
- at ManagementObject(componentType=@ManagementComponent(type="MCBean", subtype="ManagedServiceBinding"),
-      properties=ManagementProperties.EXPLICIT)
-public class ManagedServiceBinding extends ServiceBinding
-{
-   // ------------------------------------------------------------ Constructors
-   
-   /**
-    * Create a new ManagedServiceBinding.
-    * 
-    * @param serviceName
-    * @param port
-    * @throws UnknownHostException
-    */
-   public ManagedServiceBinding(String serviceName, int port) throws UnknownHostException
-   {
-      super(serviceName, port);
-   }
-
-   /**
-    * Create a new ManagedServiceBinding.
-    * 
-    * @param serviceName
-    * @param hostName
-    * @param port
-    * @throws UnknownHostException
-    */
-   public ManagedServiceBinding(String serviceName, String hostName, int port) throws UnknownHostException
-   {
-      super(serviceName, hostName, port);
-   }
-
-   /**
-    * Create a new ManagedServiceBinding.
-    * 
-    * @param serviceName
-    * @param bindingName
-    * @param hostName
-    * @param port
-    * @throws UnknownHostException
-    */
-   public ManagedServiceBinding(String serviceName, String bindingName, String hostName, int port)
-         throws UnknownHostException
-   {
-      super(serviceName, bindingName, hostName, port);
-   } 
-   
-   /**
-    * Copy constructor.
-    * 
-    * @param source
-    * @throws UnknownHostException
-    * @throws NullPointerException if source is null
-    */
-   public ManagedServiceBinding(ServiceBinding source) throws UnknownHostException
-   {
-      this(source.getServiceName(), source.getBindingName(), source.getHostName(), source.getPort());
-      setServiceBindingValueSource(source.getServiceBindingValueSource());
-      setServiceBindingValueSourceConfig(source.getServiceBindingValueSourceConfig());
-   }
-   
-   // ------------------------------------------------------------  Properties
-
-   @Override
-   @ManagementProperty(description="the host name or " +
-         "string notation IP address to use for the binding",
-         use={ViewUse.CONFIGURATION}) // overrides superclass annotation's use attribute
-   public String getHostName()
-   {
-      return super.getHostName();
-   }
-
-   @Override
-   @ManagementProperty(description="the port to use for the binding",
-         use={ViewUse.CONFIGURATION}) // overrides superclass annotation's use attribute
-   public int getPort()
-   {
-      return super.getPort();
-   }
-
-   /**
-    * {@inheritDoc}
-    * 
-    * Exposes the superclass method as public.
-    */
-   @Override
-   public void setHostName(String hostName)
-   {
-      // TODO Auto-generated method stub
-      super.setHostName(hostName);
-   }
-
-   /**
-    * {@inheritDoc}
-    * 
-    * Exposes the superclass method as public.
-    */
-   @Override
-   public void setPort(int port)
-   {
-      // TODO Auto-generated method stub
-      super.setPort(port);
-   }  
-   
-}

Modified: trunk/varia/src/main/org/jboss/services/binding/ServiceBinding.java
===================================================================
--- trunk/varia/src/main/org/jboss/services/binding/ServiceBinding.java	2008-12-01 03:07:05 UTC (rev 81878)
+++ trunk/varia/src/main/org/jboss/services/binding/ServiceBinding.java	2008-12-01 04:43:06 UTC (rev 81879)
@@ -23,10 +23,9 @@
 
 import java.net.InetAddress;
 import java.net.UnknownHostException;
+import java.security.AccessController;
+import java.security.PrivilegedExceptionAction;
 
-import javax.management.MalformedObjectNameException;
-import javax.management.ObjectName;
-
 import org.jboss.managed.api.annotation.ManagementComponent;
 import org.jboss.managed.api.annotation.ManagementObject;
 import org.jboss.managed.api.annotation.ManagementObjectID;
@@ -34,7 +33,8 @@
 import org.jboss.managed.api.annotation.ManagementProperty;
 import org.jboss.managed.api.annotation.ViewUse;
 
-/** A ServiceBinding is a {name,virtualHost,port,interfaceAddress}
+/** 
+ * A ServiceBinding is a {name,virtualHost,port,interfaceAddress}
  * quad specifying a named binding for a service.
  *
  * @author <a href="mailto:bitpushr at rochester.rr.com">Mike Finn</a>.
@@ -42,30 +42,9 @@
  * @version $Revision$
  */
 @ManagementObject(componentType=@ManagementComponent(type="MCBean", subtype="ServiceBinding"),
-      properties=ManagementProperties.EXPLICIT)
-public class ServiceBinding
+                  properties=ManagementProperties.EXPLICIT)
+public class ServiceBinding implements Comparable<ServiceBinding>
 {
-   /**
-    * Checks if <code>serviceName</code> can be converted into an
-    * ObjectName; if it can, converts it and returns its canonical form.
-    * 
-    * @param serviceName the service name
-    * @return the canonicalized form, or <code>serviceName</code> if it
-    *         cannot be converted into an ObjectName.
-    */
-   public static String canonicalizeServiceName(String serviceName)
-   {      
-      // If the serviceName looks like an object name, canonicalize it
-      try
-      {
-         ObjectName oname = new ObjectName(serviceName);
-         return oname.getCanonicalName();
-      }
-      catch (MalformedObjectNameException e)
-      {
-         return serviceName;
-      }      
-   }
    
    // ----------------------------------------------------------------- Fields
    
@@ -87,109 +66,114 @@
     construct the bindAddress value. A null value implies bind on any
     interface.
     */
-   private String hostName;
+   private final String hostName;
    
    /** The port the service should listen on. A 0 value implies an
     anonymous port.
     */
-   private int port;
+   private final int port;
    
    /** The interface on which the service should bind its listening port. A
     null address implies bind on any interface.
     */
-   private InetAddress bindAddress;
+   private final InetAddress bindAddress;
    
    /** The ServiceBindingValueSource implementation class
     */
-   private String serviceBindingValueSourceClassName;
+   private final String serviceBindingValueSourceClassName;
    
    /** The ServiceBindingValueSource 
     */
-   private ServiceBindingValueSource serviceBindingValueSource;
+   private final ServiceBindingValueSource serviceBindingValueSource;
    
    /** An aribtrary object used to configure the behavior of
     the ServiceBindingValueSource. An example would be an XML Element.
     */
-   private Object serviceBindingValueSourceConfig;
+   private final Object serviceBindingValueSourceConfig;
 
    // -----------------------------------------------------------  Constructors
-
-   /**
-    * Creates a new instance of ServiceBinding with a host name indicating
-    * the loopback interface.
-    *
-    * @param serviceName the name of the service to which this binding applies.
-    *                    Cannot be <code>null</code>.
-    * @param port The port the service should listen on. A 0 value implies an
-    * ephemeral port.
-    *                                   
-    * @throws UnknownHostException if no IP address for the loopback interface could be found 
-    */
-   public ServiceBinding(String serviceName, int port)
-      throws UnknownHostException
-   {
-      this(serviceName, null, port);
-   }   
-
-   /**
-    * Creates a new instance of ServiceBinding
-    *
-    * @param serviceName the name of the service to which this binding applies.
-    *                    Cannot be <code>null</code>.
-    * @param hostName The virtual host name. This is the interface name used to
-    * construct the bindAddress value. A null value implies bind on the loopback interface.
-    * @param port The port the service should listen on. A 0 value implies an
-    * ephemeral port.
-    *                                   
-    * @throws UnknownHostException if no IP address for the <code>hostName</code> could be found 
-    */
-   public ServiceBinding(String serviceName, String hostName, int port)
-      throws UnknownHostException
-   {
-      this(serviceName, null, hostName, port);
-   }
-
-   /**
-    * Creates a new instance of ServiceBinding
-    *
-    * @param serviceName the name of the service to which this binding applies.
-    *                    Cannot be <code>null</code>.
-    * @param bindingName The name qualifier for the binding. A null or empty name
-    * implies the default binding for a service.
-    * @param hostName The virtual host name. This is the interface name used to
-    * construct the bindAddress value. A null value implies bind on the loopback interface.
-    * @param port The port the service should listen on. A 0 value implies an
-    * ephemeral port.
-    *                                   
-    * @throws UnknownHostException if no IP address for the <code>hostName</code> could be found 
-    */
-   public ServiceBinding(String serviceName, String bindingName, String hostName, int port)
-      throws UnknownHostException
-   {
-      if (serviceName == null)
-         throw new IllegalArgumentException("serviceName is null");
-      
-      // If the serviceName looks like an object name, canonicalize it      
-      this.serviceName = canonicalizeServiceName(serviceName);
-      this.bindingName = bindingName;
-      this.fullyQualifiedName = (bindingName == null) ? serviceName : serviceName + ":" + bindingName;
-      this.port = port;
-      this.hostName = hostName;
-      this.bindAddress = InetAddress.getByName(hostName);
-   } 
    
    /**
-    * Copy constructor.
+    * Build a ServiceBinding from metadata.
     * 
-    * @param source
-    * @throws UnknownHostException
-    * @throws NullPointerException if source is null
+    * @param metadata the binding metadata. Cannot be <code>null</code>
+    * @param defaultHostName host name to use if the metadata's hostname is not
+    *                    {@link ServiceBindingMetadata#isFixedHostName() fixed}
+    * @param portOffset offset to apply to the metadata port value if it is not 
+    *                    {@link ServiceBindingMetadata#isFixedPort() fixed}
+    *                                           
+    * @throws UnknownHostException  if no IP address for the <code>hostName</code> could be found
+    * 
+    * @throws IllegalArgumentException if {@code metadata} is <code>null</code>ll
+    * @throws IllegalStateException if metadata's {@code serviceName} is <code>null</code>
+    * @throws RuntimeException if a {@code serviceBindingValueSourceClassName} 
+    *                          is provided but there is a problem instantiating
+    *                          an instance of it via {@link Class#newInstance()}
     */
-   public ServiceBinding(ServiceBinding source) throws UnknownHostException
+   public ServiceBinding(ServiceBindingMetadata metadata, String defaulHostName, int portOffset) 
+         throws UnknownHostException
    {
-      this(source.getServiceName(), source.getBindingName(), source.getHostName(), source.getPort());
-      setServiceBindingValueSource(source.getServiceBindingValueSource());
-      setServiceBindingValueSourceConfig(source.getServiceBindingValueSourceConfig());
+      if (metadata == null)
+      {
+         throw new IllegalArgumentException("metadata is null");
+      }      
+      
+      if (metadata.getServiceName() == null)
+      {
+         throw new IllegalStateException("metadata's serviceName is null");
+      }
+      
+      this.serviceName = metadata.getServiceName();
+      this.bindingName = metadata.getBindingName();
+      this.fullyQualifiedName = (bindingName == null) ? serviceName : serviceName + ":" + bindingName;
+      this.port = metadata.isFixedPort() ? metadata.getPort() : metadata.getPort() + portOffset;
+      this.hostName = metadata.isFixedHostName() ? metadata.getHostName() : defaulHostName;
+      this.bindAddress = InetAddress.getByName(this.hostName);
+      
+      this.serviceBindingValueSourceConfig = metadata.getServiceBindingValueSourceConfig();
+
+      ServiceBindingValueSource valueSource = metadata.getServiceBindingValueSource();
+      if (valueSource == null)
+      {
+         this.serviceBindingValueSourceClassName = metadata.getServiceBindingValueSourceClassName();
+         if (this.serviceBindingValueSourceClassName != null)
+         {
+            // Try and instantiate the value source
+            try
+            {
+               this.serviceBindingValueSource = AccessController.doPrivileged(
+                     new PrivilegedExceptionAction<ServiceBindingValueSource>() {
+      
+                  public ServiceBindingValueSource run() throws Exception
+                  {
+                     ClassLoader loader = Thread.currentThread().getContextClassLoader();
+                     Class<?> delegateClass = loader.loadClass(serviceBindingValueSourceClassName);
+                     return (ServiceBindingValueSource) delegateClass.newInstance();
+                  }               
+               });
+            }
+            catch (RuntimeException e)
+            {
+               throw e;
+            }
+            catch (Exception e)
+            {
+               throw new RuntimeException("Failed creating ServiceBindingValueSource of type " + 
+                     serviceBindingValueSourceClassName, e);
+            }
+         }
+         else
+         {
+            // The standard case; just not configured at all
+            this.serviceBindingValueSource = null;
+         }
+      }
+      else
+      {
+         this.serviceBindingValueSource = valueSource;
+         this.serviceBindingValueSourceClassName = valueSource.getClass().getName();
+      }
+
    }
 
    // -------------------------------------------------------------  Properties
@@ -273,49 +257,12 @@
     * reasonable defaults based on the format requested by the consumer.
     * 
     * @return the ServiceBindingValueSource; may be <code>null</code>
-    * 
-    * @throws ClassNotFoundException
-    * @throws InstantiationException
-    * @throws IllegalAccessException
     */
    public synchronized ServiceBindingValueSource getServiceBindingValueSource()
    {
-      if (this.serviceBindingValueSource == null && this.serviceBindingValueSourceClassName != null)
-      {
-         ClassLoader loader = Thread.currentThread().getContextClassLoader();
-         try
-         {
-            Class<?> delegateClass = loader.loadClass(serviceBindingValueSourceClassName);
-            this.serviceBindingValueSource = (ServiceBindingValueSource) delegateClass.newInstance();
-         }
-         catch (RuntimeException e)
-         {
-            throw e;
-         }
-         catch (Exception e)
-         {
-            throw new RuntimeException("Failed creating ServiceBindingValueSource of type " + 
-                  serviceBindingValueSourceClassName, e);
-         }
-      }
       return this.serviceBindingValueSource;
    }
 
-   /**
-    * Sets the object that can return this ServiceBinding's values in formats
-    * usable by consumers.
-    * 
-    * @param serviceBindingValueSource the ServiceBindingValueSource; may be <code>null</code>
-    */
-   public void setServiceBindingValueSource(ServiceBindingValueSource serviceBindingValueSource)
-   {
-      this.serviceBindingValueSource = serviceBindingValueSource;
-      if (serviceBindingValueSource != null)
-      {
-         setServiceBindingValueSourceClassName(serviceBindingValueSource.getClass().getName());
-      }
-   }
-
    /** 
     * Gets the fully qualified class name of the {@link #getServiceBindingValueSource() serviceBindingValueSource}.
     * 
@@ -327,16 +274,6 @@
    }
 
    /** 
-    * Sets the fully qualified class name of the {@link #getServiceBindingValueSource() serviceBindingValueSource}.
-    * 
-    * @param serviceBindingValueSourceClassName the binding value source class, or <code>null</code>
-    */
-   public void setServiceBindingValueSourceClassName(String serviceBindingValueSourceClassName)
-   {
-      this.serviceBindingValueSourceClassName = serviceBindingValueSourceClassName;
-   }
-
-   /** 
     * Gets the configuration object the {@link #getServiceBindingValueSource() serviceBindingValueSource}
     * should use.
     * 
@@ -346,52 +283,18 @@
    {
       return serviceBindingValueSourceConfig;
    }
-   
-   /** 
-    * Sets the configuration object the {@link #getServiceBindingValueSource() serviceBindingValueSource}
-    * should use.
-    * 
-    * @param serviceBindingValueSourceConfig the configuration object, or <code>null</code>
-    */
-   public void setServiceBindingValueSourceConfig(Object serviceBindingValueSourceConfig)
-   {
-      this.serviceBindingValueSourceConfig = serviceBindingValueSourceConfig;
-   }
 
-   // ----------------------------------------------------------------   Public
-   
-   /**
-    * Gets a <code>ServiceBinding</code> that matches this one except the
-    * binding port has been adjusted by <code>offset</code>.
-    * 
-    * @param offset amount to adjust the binding port
-    */
-   public ServiceBinding getOffsetBinding(int offset) throws UnknownHostException
-   {
-      return getOffsetBinding(offset, this.hostName);
+   // -------------------------------------------------------------  Comparable
+
+   public int compareTo(ServiceBinding o)
+   {      
+      return getFullyQualifiedName().compareTo(o.getFullyQualifiedName());
    }
-   
-   /**
-    * Gets a <code>ServiceBinding</code> that matches this one except the
-    * binding port has been adjusted by <code>offset</code> and the hostname
-    * has been changed to defaultHostName if this object's hostName is null.
-    * 
-    * @param offset amount to adjust the binding port
-    */
-   public ServiceBinding getOffsetBinding(int offset, String defaultHostName) throws UnknownHostException
-   {
-      String newHost = this.hostName == null ? defaultHostName : this.hostName;
-      ServiceBinding result = new ServiceBinding(serviceName, bindingName, newHost, port + offset);
-      result.setServiceBindingValueSourceClassName(serviceBindingValueSourceClassName);
-      result.setServiceBindingValueSource(serviceBindingValueSource);
-      result.setServiceBindingValueSourceConfig(serviceBindingValueSourceConfig);
-      return result;
-   }
 
    // --------------------------------------------------------------  Overrides
    
    /**
-    * Equality is based on our ServiceConfig's serviceName and our bindingName.
+    * Equality is based on our serviceName and our bindingName.
     */
    @Override
    public boolean equals(Object obj)
@@ -410,7 +313,7 @@
    }
 
    /**
-    * Hashcode is based on our ServiceConfig's serviceName and our bindingName.
+    * Hashcode is based on our serviceName and our bindingName.
     */
    @Override
    public int hashCode()
@@ -449,26 +352,6 @@
       return sBuf.toString();
    }
 
-   // ------------------------------------------------------------ -  Protected
-
-   protected void setHostName(String hostName)
-   {
-      this.hostName = hostName;
-      try
-      {
-         this.bindAddress = InetAddress.getByName(hostName);
-      }
-      catch (UnknownHostException e)
-      {
-         throw new RuntimeException("Unknown hostName " + hostName, e);
-      }
-   }
-
-   protected void setPort(int port)
-   {
-      this.port = port;
-   }
-
    // ----------------------------------------------------------------  Private
    
    private boolean safeEquals(Object a, Object b)

Modified: trunk/varia/src/main/org/jboss/services/binding/ServiceBindingManager.java
===================================================================
--- trunk/varia/src/main/org/jboss/services/binding/ServiceBindingManager.java	2008-12-01 03:07:05 UTC (rev 81878)
+++ trunk/varia/src/main/org/jboss/services/binding/ServiceBindingManager.java	2008-12-01 04:43:06 UTC (rev 81879)
@@ -246,13 +246,46 @@
    public int getIntBinding(String serviceName, String bindingName, 
          String hostName, int basePort) throws UnknownHostException, DuplicateServiceException
    {
+      return getIntBinding(serviceName, bindingName, hostName, basePort, false, hostName != null);
+   }
+   
+   /**
+    * Same as {@link #getIntBinding(String, String)} but, if no matching
+    * service binding is found, creates a new one using the given
+    * <code>hostName</code> and <code>basePort</code>.
+    *  
+    * @param serviceName value to match to {@link ServiceBinding#getServiceName()}
+    *                    to identify the appropriate binding. Cannot be <code>null</code>.
+    * @param bindingName value to match to {@link ServiceBinding#getBindingName()}
+    *                    to identify the appropriate binding. May be <code>null</code>.
+    * @param hostName    Host name to use for new service binding if one is
+    *                    created.
+    * @param basePort    base port to use for the binding; ServiceBindingStore
+    *                    may adjust this.
+    * @param fixedPort whether runtime @{link ServiceBinding}s created from this 
+    *                  metadata can alter the port value based on the server 
+    *                  on which the binding is running.
+    * @param fixedHostName whether runtime @{link ServiceBinding}s created from 
+    *                      this metadata can alter the hostName value based on 
+    *                      the server on which the binding is running. 
+    *                  
+    * @return the binding value as an <code>int</code>
+    * 
+    * @throws DuplicateServiceException in unlikely event of concurrent attempts
+    *                                   to create same binding with different
+    *                                   binding values                                   
+    * @throws UnknownHostException if no IP address for the <code>hostName</code> could be found 
+    */
+   public int getIntBinding(String serviceName, String bindingName, 
+         String hostName, int basePort, boolean fixedPort, boolean fixedHostName) throws UnknownHostException, DuplicateServiceException
+   {
       try
       {
          return getIntBinding(serviceName, bindingName);
       }
       catch (NoSuchBindingException e)
       {
-         createBindingFromDefaults(serviceName, bindingName, hostName, basePort, false);
+         createBindingFromDefaults(serviceName, bindingName, hostName, basePort, fixedPort, fixedHostName);
          
          try
          {
@@ -342,13 +375,47 @@
    public InetAddress getInetAddressBinding(String serviceName, String bindingName, 
          String hostName, int basePort) throws UnknownHostException, DuplicateServiceException
    {
+      return getInetAddressBinding(serviceName, bindingName, hostName, basePort, false, hostName != null);
+   }
+   
+   /**
+    * Same as {@link #getInetAddressBinding(String, String)} but, if no matching
+    * service binding is found, creates a new one using the given
+    * <code>hostName</code> and <code>basePort</code>.
+    *  
+    * @param serviceName value to match to {@link ServiceBinding#getServiceName()}
+    *                    to identify the appropriate binding. Cannot be <code>null</code>.
+    * @param bindingName value to match to {@link ServiceBinding#getBindingName()}
+    *                    to identify the appropriate binding. May be <code>null</code>.
+    * @param hostName    Host name to use for new service binding if one is
+    *                    created.
+    * @param basePort    base port to use for the binding; ServiceBindingStore
+    *                    may adjust this.
+    * @param fixedPort whether runtime @{link ServiceBinding}s created from this 
+    *                  metadata can alter the port value based on the server 
+    *                  on which the binding is running.
+    * @param fixedHostName whether runtime @{link ServiceBinding}s created from 
+    *                      this metadata can alter the hostName value based on 
+    *                      the server on which the binding is running. 
+    *                  
+    * @return the binding value as an <code>InetAddress</code>
+    * 
+    * @throws DuplicateServiceException in unlikely event of concurrent attempts
+    *                                   to create same binding with different
+    *                                   binding values
+    *                                   
+    * @throws UnknownHostException if no IP address for the <code>hostName</code> could be found
+    */
+   public InetAddress getInetAddressBinding(String serviceName, String bindingName, 
+         String hostName, int basePort, boolean fixedPort, boolean fixedHostName) throws UnknownHostException, DuplicateServiceException
+   {
       try
       {
          return getInetAddressBinding(serviceName, bindingName);
       }
       catch (NoSuchBindingException e)
       {
-         createBindingFromDefaults(serviceName, bindingName, hostName, basePort, false);
+         createBindingFromDefaults(serviceName, bindingName, hostName, basePort, fixedPort, fixedHostName);
          
          try
          {
@@ -454,13 +521,51 @@
    public String getStringBinding(String serviceName, String bindingName, String input, 
          String hostName, int basePort) throws UnknownHostException, DuplicateServiceException
    {
+      return getStringBinding(serviceName, bindingName, input, hostName, basePort, false, hostName != null);
+   }
+   
+   /**
+    * Same as {@link #getStringBinding(String, String, String)} but, if no matching
+    * service binding is found, creates a new one using the given
+    * <code>hostName</code> and <code>basePort</code>.
+    *  
+    * @param serviceName value to match to {@link ServiceBinding#getServiceName()}
+    *                    to identify the appropriate binding. Cannot be <code>null</code>.
+    * @param bindingName value to match to {@link ServiceBinding#getBindingName()}
+    *                    to identify the appropriate binding. May be <code>null</code>.
+    * @param input string that should be used as a source for transformations 
+    *              (e.g. string replacement), or <code>null</code> if no
+    *              transformation is needed
+    * @param hostName    Host name to use for new service binding if one is
+    *                    created.
+    * @param basePort    base port to use for the binding; ServiceBindingStore
+    *                    may adjust this.
+    * @param fixedPort whether runtime @{link ServiceBinding}s created from this 
+    *                  metadata can alter the port value based on the server 
+    *                  on which the binding is running.
+    * @param fixedHostName whether runtime @{link ServiceBinding}s created from 
+    *                      this metadata can alter the hostName value based on 
+    *                      the server on which the binding is running. 
+    *              
+    * @return the raw binding value, or a transformed string based on the raw
+    *         binding value and <code>input</code>.
+    * 
+    * @throws DuplicateServiceException in unlikely event of concurrent attempts
+    *                                   to create same binding with different
+    *                                   binding values
+    *                                   
+    * @throws UnknownHostException if no IP address for the <code>hostName</code> could be found 
+    */
+   public String getStringBinding(String serviceName, String bindingName, String input, 
+         String hostName, int basePort, boolean fixedPort, boolean fixedHostName) throws UnknownHostException, DuplicateServiceException
+   {
       try
       {
          return getStringBinding(serviceName, bindingName, input);
       }
       catch (NoSuchBindingException e)
       {
-         createBindingFromDefaults(serviceName, bindingName, hostName, basePort, false);
+         createBindingFromDefaults(serviceName, bindingName, hostName, basePort, fixedPort, fixedHostName);
          
          try
          {
@@ -559,13 +664,50 @@
    public Element getElementBinding(String serviceName, String bindingName, Element input, 
          String hostName, int basePort) throws UnknownHostException, DuplicateServiceException
    {
+      return getElementBinding(serviceName, bindingName, input, hostName, basePort, false, hostName != null);
+   }
+   
+   /**
+    * Same as {@link #getElementBinding(String, String, Element)} but, if no matching
+    * service binding is found, creates a new one using the given
+    * <code>hostName</code> and <code>basePort</code>.
+    *  
+    * @param serviceName value to match to {@link ServiceBinding#getServiceName()}
+    *                    to identify the appropriate binding. Cannot be <code>null</code>.
+    * @param bindingName value to match to {@link ServiceBinding#getBindingName()}
+    *                    to identify the appropriate binding. May be <code>null</code>.
+    * @param input string that should be used as a source for transformations 
+    *              (e.g. string replacement), or <code>null</code> if no
+    *              transformation is needed
+    * @param hostName    Host name to use for new service binding if one is
+    *                    created.
+    * @param basePort    base port to use for the binding; ServiceBindingStore
+    *                    may adjust this.
+    * @param fixedPort whether runtime @{link ServiceBinding}s created from this 
+    *                  metadata can alter the port value based on the server 
+    *                  on which the binding is running.
+    * @param fixedHostName whether runtime @{link ServiceBinding}s created from 
+    *                      this metadata can alter the hostName value based on 
+    *                      the server on which the binding is running.
+    *              
+    * @return transformed element based on the raw binding value(s) and <code>input</code>.
+    * 
+    * @throws DuplicateServiceException in unlikely event of concurrent attempts
+    *                                   to create same binding with different
+    *                                   binding values
+    *                                   
+    * @throws UnknownHostException if no IP address for the <code>hostName</code> could be found 
+    */
+   public Element getElementBinding(String serviceName, String bindingName, Element input, 
+         String hostName, int basePort, boolean fixedPort, boolean fixedHostName) throws UnknownHostException, DuplicateServiceException
+   {
       try
       {
          return getElementBinding(serviceName, bindingName, input);
       }
       catch (NoSuchBindingException e)
       {
-         createBindingFromDefaults(serviceName, bindingName, hostName, basePort, false);
+         createBindingFromDefaults(serviceName, bindingName, hostName, basePort, fixedPort, fixedHostName);
          
          try
          {
@@ -668,13 +810,50 @@
    public URL getURLBinding(String serviceName, String bindingName, URL input, 
          String hostName, int basePort) throws UnknownHostException, DuplicateServiceException
    {
+      return getURLBinding(serviceName, bindingName, input, hostName, basePort, false, hostName != null);
+   }
+   
+   /**
+    * Same as {@link #getURLBinding(String, String, URL)} but, if no matching
+    * service binding is found, creates a new one using the given
+    * <code>hostName</code> and <code>basePort</code>.
+    *  
+    * @param serviceName value to match to {@link ServiceBinding#getServiceName()}
+    *                    to identify the appropriate binding. Cannot be <code>null</code>.
+    * @param bindingName value to match to {@link ServiceBinding#getBindingName()}
+    *                    to identify the appropriate binding. May be <code>null</code>.
+    * @param input string that should be used as a source for transformations 
+    *              (e.g. string replacement), or <code>null</code> if no
+    *              transformation is needed
+    * @param hostName    Host name to use for new service binding if one is
+    *                    created.
+    * @param basePort    base port to use for the binding; ServiceBindingStore
+    *                    may adjust this.
+    * @param fixedPort whether runtime @{link ServiceBinding}s created from this 
+    *                  metadata can alter the port value based on the server 
+    *                  on which the binding is running.
+    * @param fixedHostName whether runtime @{link ServiceBinding}s created from 
+    *                      this metadata can alter the hostName value based on 
+    *                      the server on which the binding is running.
+    *              
+    * @return URL pointing to the output of the transformation.
+    * 
+    * @throws DuplicateServiceException in unlikely event of concurrent attempts
+    *                                   to create same binding with different
+    *                                   binding values
+    *                                   
+    * @throws UnknownHostException if no IP address for the <code>hostName</code> could be found 
+    */
+   public URL getURLBinding(String serviceName, String bindingName, URL input, 
+         String hostName, int basePort, boolean fixedPort, boolean fixedHostName) throws UnknownHostException, DuplicateServiceException
+   {
       try
       {
          return getURLBinding(serviceName, bindingName, input);
       }
       catch (NoSuchBindingException e)
       {
-         createBindingFromDefaults(serviceName, bindingName, hostName, basePort, false);
+         createBindingFromDefaults(serviceName, bindingName, hostName, basePort, fixedPort, fixedHostName);
          
          try
          {
@@ -786,13 +965,51 @@
    public String getResourceBinding(String serviceName, String bindingName, String input, 
          String hostName, int basePort) throws UnknownHostException, DuplicateServiceException
    {
+      return getResourceBinding(serviceName, bindingName, input, hostName, basePort, false, hostName != null);
+   }
+   
+   /**
+    * Same as {@link #getResourceBinding(String, String, String)} but, if no matching
+    * service binding is found, creates a new one using the given
+    * <code>hostName</code> and <code>basePort</code>.
+    *  
+    * @param serviceName value to match to {@link ServiceBinding#getServiceName()}
+    *                    to identify the appropriate binding. Cannot be <code>null</code>.
+    * @param bindingName value to match to {@link ServiceBinding#getBindingName()}
+    *                    to identify the appropriate binding. May be <code>null</code>.
+    * @param input string that should be used as a source for transformations 
+    *              (e.g. string replacement), or <code>null</code> if no
+    *              transformation is needed
+    * @param hostName    Host name to use for new service binding if one is
+    *                    created.
+    * @param basePort    base port to use for the binding; ServiceBindingStore
+    *                    may adjust this.
+    * @param fixedPort whether runtime @{link ServiceBinding}s created from this 
+    *                  metadata can alter the port value based on the server 
+    *                  on which the binding is running.
+    * @param fixedHostName whether runtime @{link ServiceBinding}s created from 
+    *                      this metadata can alter the hostName value based on 
+    *                      the server on which the binding is running. 
+    *              
+    * @return a filesystem path pointing to the output of the transformation. 
+    *         May return <code>null</code>.
+    * 
+    * @throws DuplicateServiceException in unlikely event of concurrent attempts
+    *                                   to create same binding with different
+    *                                   binding values
+    *                                   
+    * @throws UnknownHostException if no IP address for the <code>hostName</code> could be found 
+    */
+   public String getResourceBinding(String serviceName, String bindingName, String input, 
+         String hostName, int basePort, boolean fixedPort, boolean fixedHostName) throws UnknownHostException, DuplicateServiceException
+   {
       try
       {
          return getResourceBinding(serviceName, bindingName, input);
       }
       catch (NoSuchBindingException e)
       {
-         createBindingFromDefaults(serviceName, bindingName, hostName, basePort, false);
+         createBindingFromDefaults(serviceName, bindingName, hostName, basePort, fixedPort, fixedHostName);
          
          try
          {
@@ -857,12 +1074,10 @@
    // ----------------------------------------------------------------- Private
    
    private void createBindingFromDefaults(String serviceName, String bindingName, 
-         String hostName, int basePort, boolean fixedPort) throws UnknownHostException, DuplicateServiceException
+         String hostName, int basePort, boolean fixedPort, boolean fixedHostName) throws UnknownHostException, DuplicateServiceException
    {
-      String host = hostName == null ? store.getDefaultHostName(getServerName()) : hostName;
-      int port = fixedPort ? basePort : basePort + store.getDefaultPortOffset(getServerName());
-      ServiceBinding sb = new ServiceBinding(serviceName, bindingName, host, port);
-      store.addServiceBinding(getServerName(), sb);
+      ServiceBindingMetadata md = new ServiceBindingMetadata(serviceName, bindingName, hostName, basePort, fixedPort, fixedHostName);
+      store.addServiceBinding(getServerName(), md);
    }
    
 }

Copied: trunk/varia/src/main/org/jboss/services/binding/ServiceBindingMetadata.java (from rev 81834, trunk/varia/src/main/org/jboss/services/binding/ManagedServiceBinding.java)
===================================================================
--- trunk/varia/src/main/org/jboss/services/binding/ServiceBindingMetadata.java	                        (rev 0)
+++ trunk/varia/src/main/org/jboss/services/binding/ServiceBindingMetadata.java	2008-12-01 04:43:06 UTC (rev 81879)
@@ -0,0 +1,539 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2008, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+
+package org.jboss.services.binding;
+
+import javax.management.MalformedObjectNameException;
+import javax.management.ObjectName;
+
+import org.jboss.managed.api.annotation.ManagementComponent;
+import org.jboss.managed.api.annotation.ManagementObject;
+import org.jboss.managed.api.annotation.ManagementObjectID;
+import org.jboss.managed.api.annotation.ManagementProperties;
+import org.jboss.managed.api.annotation.ManagementProperty;
+import org.jboss.managed.api.annotation.ViewUse;
+
+/**
+ * Metadata about a {@link ServiceBinding} that management tools can use. Does
+ * not represent the runtime binding information, but rather the metadata
+ * used to create the binding. 
+ * 
+ * @author Brian Stansberry
+ */
+ at ManagementObject(componentType=@ManagementComponent(type="MCBean", subtype="ServiceBindingMetadata"),
+      properties=ManagementProperties.EXPLICIT)
+public class ServiceBindingMetadata implements Comparable<ServiceBindingMetadata>
+{
+   /**
+    * Checks if <code>serviceName</code> can be converted into an
+    * ObjectName; if it can, converts it and returns its canonical form.
+    * 
+    * @param serviceName the service name
+    * @return the canonicalized form, or <code>serviceName</code> if it
+    *         cannot be converted into an ObjectName.
+    */
+   public static String canonicalizeServiceName(String serviceName)
+   {      
+      // If the serviceName looks like an object name, canonicalize it
+      try
+      {
+         ObjectName oname = new ObjectName(serviceName);
+         return oname.getCanonicalName();
+      }
+      catch (MalformedObjectNameException e)
+      {
+         return serviceName;
+      }      
+   }
+   
+   // ----------------------------------------------------------------- Fields
+   
+   /**
+    * The name of the service to which the binding applies.
+    */
+   private String serviceName;
+   
+   /** 
+    * The name of the binding. A null or empty name implies the default
+    * binding for a service.
+    */
+   private String bindingName;
+   
+   /** The virtual host name. This is the interface name used to
+    construct the bindAddress value. A null value implies bind on any
+    interface.
+    */
+   private String hostName;
+   
+   /** The port the service should listen on. A 0 value implies an
+    anonymous port.
+    */
+   private int port;
+   
+   /** The ServiceBindingValueSource implementation class
+    */
+   private String serviceBindingValueSourceClassName;
+   
+   /** The ServiceBindingValueSource 
+    */
+   private ServiceBindingValueSource serviceBindingValueSource;
+   
+   /** An aribtrary object used to configure the behavior of
+    the ServiceBindingValueSource. An example would be an XML Element.
+    */
+   private Object serviceBindingValueSourceConfig;
+   
+   /**
+    * Whether runtime @{link ServiceBinding}s created from this metadata
+    * can alter the port value based on the server on which the binding
+    * is running. 
+    */
+   private boolean fixedPort;
+   
+   /**
+    * Whether runtime @{link ServiceBinding}s created from this metadata
+    * can alter the hostName value based on the server on which the binding
+    * is running. 
+    */
+   private Boolean fixedHostName;
+   
+   // ------------------------------------------------------------ Constructors
+   
+   /**
+    * Create a new ServiceBindingMetadata.
+    */
+   public ServiceBindingMetadata() {}
+   
+   /**
+    * Create a new ServiceBindingMetadata with given service name.
+    * 
+    * @param serviceName the name of the service to which this binding applies.
+    *                    Cannot be <code>null</code>
+    * 
+    * @throws IllegalArgumentException if {@code serviceName} is <code>null</code>
+    */
+   public ServiceBindingMetadata(String serviceName) 
+   {
+      this(serviceName, null, null, 0, false, false);
+   }
+   
+   /**
+    * Create a new ServiceBindingMetadata with given service and binding names.
+    * 
+    * @param serviceName the name of the service to which this binding applies.
+    *                    Cannot be <code>null</code>
+    * @param bindingName qualifier identifying which particular binding within 
+    *                    the service this is. May be <code>null</code>
+    * 
+    * @throws IllegalArgumentException if {@code serviceName} is <code>null</code>
+    */
+   public ServiceBindingMetadata(String serviceName, String bindingName) 
+   {
+      this(serviceName, bindingName, null, 0, false, false);
+   }
+   
+   /**
+    * Create a new ServiceBindingMetadata with given property values and a
+    * non-fixed {@link #isFixedPort() port}. The 
+    * {@link #isFixedHostName() hostname is fixed} if the provided {@code hostName}
+    * is not <code>null</code>.
+    * 
+    * @param serviceName the name of the service to which this binding applies.
+    *                    Cannot be <code>null</code>
+    * @param bindingName qualifier identifying which particular binding within 
+    *                    the service this is. May be <code>null</code>
+    * @param hostName  the host name or string notation IP address of the 
+    *                  interface to bind to
+    * @param port      the port to bind to 
+    * 
+    * @throws IllegalArgumentException if {@code serviceName} is <code>null</code>
+    */
+   public ServiceBindingMetadata(String serviceName, String bindingName, 
+         String hostName, int port) 
+   {
+      this(serviceName, bindingName, hostName, port, false, hostName != null);
+   }
+   
+   /**
+    * Create a new ServiceBindingMetadata with given property values.
+    * 
+    * @param serviceName the name of the service to which this binding applies.
+    *                    Cannot be <code>null</code>
+    * @param bindingName qualifier identifying which particular binding within 
+    *                    the service this is. May be <code>null</code>
+    * @param hostName  the host name or string notation IP address of the 
+    *                  interface to bind to
+    * @param port      the port to bind to
+    * @param fixedPort whether runtime @{link ServiceBinding}s created from this 
+    *                  metadata can alter the port value based on the server 
+    *                  on which the binding is running.
+    * @param fixedHostName whether runtime @{link ServiceBinding}s created from 
+    *                      this metadata can alter the hostName value based on 
+    *                      the server on which the binding is running. 
+    * 
+    * @throws IllegalArgumentException if {@code serviceName} is <code>null</code>
+    */
+   public ServiceBindingMetadata(String serviceName, String bindingName, 
+         String hostName, int port, boolean fixedPort, boolean fixedHostName) 
+   {
+      setServiceName(serviceName);
+      setBindingName(bindingName);
+      setHostName(hostName);
+      setPort(port);
+      setFixedPort(fixedPort);
+      setFixedHostName(fixedHostName);
+   }
+   
+   /**
+    * Create a new ServiceBindingMetadata from a runtime ServiceBinding. The
+    * resulting object has a fixed port and host name.
+    * 
+    * @param binding the binding. Cannot be <code>null</code>
+    */
+   public ServiceBindingMetadata(ServiceBinding binding)
+   {
+      this(binding.getServiceName(), binding.getBindingName(), 
+            binding.getHostName(), binding.getPort(), true, true);
+      setServiceBindingValueSource(binding.getServiceBindingValueSource());
+      if (this.serviceBindingValueSourceClassName == null)
+      {
+         setServiceBindingValueSourceClassName(binding.getServiceBindingValueSourceClassName());
+      }
+      setServiceBindingValueSourceConfig(binding.getServiceBindingValueSourceConfig());
+   }
+   
+   // ------------------------------------------------------------  Properties
+   
+   /**
+    * Gets the name of the service to which this binding applies.
+    * 
+    * @return the name.
+    */
+   @ManagementProperty(description="the name of the service to which this binding applies")
+   public String getServiceName()
+   {
+      return serviceName;
+   }
+
+   /**
+    * Sets the name of the service to which this binding applies.
+    * 
+    * @param serviceName the name. Cannot be <code>null</code>.
+    * 
+    * @throws IllegalArgumentException if {@code serviceName} is <code>null</code>
+    */
+   public void setServiceName(String serviceName)
+   {
+      if (serviceName == null)
+      {
+         throw new IllegalArgumentException("serviceName is null");
+      }
+      this.serviceName = canonicalizeServiceName(serviceName);
+   }
+
+   /**
+    * Gets a qualifier identifying which particular binding within 
+    * {@link #getServiceName() the service} this is.
+    *
+    * @return the name, or <code>null</code> if this is an unnamed default binding
+    *         for the service.
+    */
+   @ManagementProperty(description="a qualifier identifying which particular " +
+                                   "binding within the service this is")
+   public String getBindingName()
+   {
+      return this.bindingName;
+   }
+
+   /**
+    * Sets a qualifier identifying which particular binding within 
+    * {@link #getServiceName() the service} this is.
+    *
+    * @param bindingName the name, or <code>null</code> if this is an unnamed 
+    *                    default binding for the service.
+    */
+   public void setBindingName(String bindingName)
+   {
+      this.bindingName = bindingName;
+   }  
+   
+   /**
+    * Gets the fully qualified binding name.
+    * 
+    * @return the {@link #getServiceName() serviceName}:{@link #getBindingName() bindingName} or
+    *         just the service name if the binding name is <code>null</code>.
+    *         
+    * @throws IllegalStateException if {@link #getServiceName() serviceName} is <code>null</code>
+    */
+   @ManagementProperty(description="the fully qualified binding name")
+   @ManagementObjectID(type="ServiceBinding")
+   public String getFullyQualifiedName()
+   {      
+      if (this.serviceName == null)
+      {
+         throw new IllegalStateException("Must set serviceName");
+      }
+      return (this.bindingName == null ? this.serviceName : (this.serviceName + ":" + this.bindingName));
+   }
+
+   /**
+    * Gets the host name or string notation IP address to use for the binding.
+    *
+    * @return the hostname or address. May be <code>null</code>
+    */
+   @ManagementProperty(description="the host name or " +
+         "string notation IP address to use for the binding",
+         use={ViewUse.CONFIGURATION}) // overrides superclass annotation's use attribute
+   public String getHostName()
+   {
+      return hostName;
+   }
+
+   /**
+    * Sets the host name or string notation IP address to use for the binding.
+    *
+    * @param hostName the hostname or address. May be <code>null</code>
+    */
+   public void setHostName(String hostName)
+   {
+      this.hostName = hostName;
+      // Assume that setting a host name means it's meant to be fixed
+      if (this.fixedHostName == null)
+      {
+         setFixedHostName(hostName == null);
+      }
+   }
+
+   @ManagementProperty(description="the port to use for the binding",
+         use={ViewUse.CONFIGURATION}) // overrides superclass annotation's use attribute
+   public int getPort()
+   {
+      return port;
+   }
+
+   /**
+    * Sets the port to use for the binding.
+    *
+    * @param port the port
+    */
+   public void setPort(int port)
+   {
+      this.port = port;
+   }
+
+   /**
+    * Gets the object that can return this ServiceBinding's values in formats
+    * usable by consumers. If unset (the norm), {@link ServiceBindingManager} will use
+    * reasonable defaults based on the format requested by the consumer.
+    * 
+    * @return the ServiceBindingValueSource; may be <code>null</code>
+    */
+   public synchronized ServiceBindingValueSource getServiceBindingValueSource()
+   {
+      return this.serviceBindingValueSource;
+   }
+
+   /**
+    * Sets the object that can return this ServiceBinding's values in formats
+    * usable by consumers.
+    * 
+    * @param serviceBindingValueSource the ServiceBindingValueSource; may be <code>null</code>
+    */
+   public void setServiceBindingValueSource(ServiceBindingValueSource serviceBindingValueSource)
+   {
+      this.serviceBindingValueSource = serviceBindingValueSource;
+      if (serviceBindingValueSource != null)
+      {
+         setServiceBindingValueSourceClassName(serviceBindingValueSource.getClass().getName());
+      }
+   }
+
+   /** 
+    * Gets the fully qualified class name of the {@link #getServiceBindingValueSource() serviceBindingValueSource}.
+    * 
+    * @return the binding value source class, or <code>null</code>
+    */
+   public String getServiceBindingValueSourceClassName()
+   {
+      return serviceBindingValueSourceClassName;
+   }
+
+   /** 
+    * Sets the fully qualified class name of the {@link #getServiceBindingValueSource() serviceBindingValueSource}.
+    * 
+    * @param serviceBindingValueSourceClassName the binding value source class, or <code>null</code>
+    */
+   public void setServiceBindingValueSourceClassName(String serviceBindingValueSourceClassName)
+   {
+      this.serviceBindingValueSourceClassName = serviceBindingValueSourceClassName;
+   }
+
+   /** 
+    * Gets the configuration object the {@link #getServiceBindingValueSource() serviceBindingValueSource}
+    * should use.
+    * 
+    * @return the configuration object, or <code>null</code>
+    */
+   public Object getServiceBindingValueSourceConfig()
+   {
+      return serviceBindingValueSourceConfig;
+   }
+   
+   /** 
+    * Sets the configuration object the {@link #getServiceBindingValueSource() serviceBindingValueSource}
+    * should use.
+    * 
+    * @param serviceBindingValueSourceConfig the configuration object, or <code>null</code>
+    */
+   public void setServiceBindingValueSourceConfig(Object serviceBindingValueSourceConfig)
+   {
+      this.serviceBindingValueSourceConfig = serviceBindingValueSourceConfig;
+   }
+
+   /**
+    * Gets whether runtime @{link ServiceBinding}s created from this metadata
+    * can alter the port value based on the server on which the binding
+    * is running.
+    * 
+    * @return <code>true</code> if the {@link #getPort()} value from this
+    *         object must be respected; <code>false</code> if it can be
+    *         altered.
+    */
+   public boolean isFixedPort()
+   {
+      return fixedPort;
+   }
+
+   /**
+    * Sets whether runtime @{link ServiceBinding}s created from this metadata
+    * can alter the port value based on the server on which the binding
+    * is running.
+    * 
+    * param fixedPort <code>true</code> if the {@link #getPort()} value from this
+    *                 object must be respected; <code>false</code> if it can be
+    *                 altered.
+    */
+   public void setFixedPort(boolean fixedPort)
+   {
+      this.fixedPort = fixedPort;
+   }
+
+   /**
+    * Gets whether runtime @{link ServiceBinding}s created from this metadata
+    * can alter the hostName value based on the server on which the binding
+    * is running. 
+    * 
+    * @return <code>true</code> if the {@link #getHostName()} value from this
+    *         object must be respected; <code>false</code> if it can be
+    *         altered.
+    */
+   public boolean isFixedHostName()
+   {
+      return (this.fixedHostName == null ? this.hostName != null : this.fixedHostName.booleanValue());
+   }
+
+   /**
+    * Sets whether runtime @{link ServiceBinding}s created from this metadata
+    * can alter the hostName value based on the server on which the binding
+    * is running. 
+    * 
+    * param fixedHostName <code>true</code> if the {@link #getHostName()} value 
+    *                     from this object must be respected; <code>false</code> 
+    *                     if it can be altered.
+    */
+   public void setFixedHostName(boolean fixedHostName)
+   {
+      this.fixedHostName = Boolean.valueOf(fixedHostName);
+   }
+
+   // -------------------------------------------------------------  Comparable
+
+   public int compareTo(ServiceBindingMetadata other)
+   {      
+      return getFullyQualifiedName().compareTo(other.getFullyQualifiedName());
+   }
+   
+   // --------------------------------------------------------------  Overrides
+   
+   /**
+    * Equality is based on our serviceName and our bindingName.
+    */
+   @Override
+   public boolean equals(Object obj)
+   {
+      if (this == obj)
+         return true;
+      
+      if (obj instanceof ServiceBindingMetadata)
+      {
+         ServiceBindingMetadata other = (ServiceBindingMetadata) obj;
+         return (safeEquals(this.getFullyQualifiedName(), other.getFullyQualifiedName()));
+      }
+      
+      return false;
+   }
+
+   /**
+    * Hashcode is based on our serviceName and our bindingName.
+    */
+   @Override
+   public int hashCode()
+   {
+      int result = 19;
+      result += 29 * this.getFullyQualifiedName().hashCode();
+      return result;
+   }
+
+   /**
+    * Create string representation of the service descriptor
+    *
+    * @return  String containing service descriptor properties
+    */
+   public String toString()
+   {
+      StringBuffer sBuf = new StringBuffer("ServiceBindingMetadata [serviceName=");
+      sBuf.append(this.serviceName);
+      sBuf.append(";bindingName=");
+
+      sBuf.append(this.getBindingName());
+      sBuf.append(";hostName=");
+      String host = getHostName();
+
+      if (hostName == null)
+      {
+         host = "<ANY>";
+      }
+      sBuf.append(host);
+      sBuf.append(";port=");
+      sBuf.append(this.getPort());
+      sBuf.append("]");
+      return sBuf.toString();
+   }
+
+   // ----------------------------------------------------------------  Private
+   
+   private boolean safeEquals(Object a, Object b)
+   {
+      return (a == b || (a != null && a.equals(b)));
+   }
+   
+}


Property changes on: trunk/varia/src/main/org/jboss/services/binding/ServiceBindingMetadata.java
___________________________________________________________________
Name: svn:mergeinfo
   + 

Modified: trunk/varia/src/main/org/jboss/services/binding/ServiceBindingStore.java
===================================================================
--- trunk/varia/src/main/org/jboss/services/binding/ServiceBindingStore.java	2008-12-01 03:07:05 UTC (rev 81878)
+++ trunk/varia/src/main/org/jboss/services/binding/ServiceBindingStore.java	2008-12-01 04:43:06 UTC (rev 81879)
@@ -21,7 +21,7 @@
  */
 package org.jboss.services.binding;
 
-import java.net.InetAddress;
+import java.net.UnknownHostException;
 import java.util.Set;
 
 
@@ -72,27 +72,27 @@
     *
     * @param serverName the name identifying the JBoss server instance in
     *    which the service is running.
-    * @param serviceName the JMX ObjectName of the service
-    * @param serviceConfig the configuration to add
+    * @param binding metadata for the binding to add
     * 
     * @throws DuplicateServiceException thrown if a configuration for the
     *    <serverName, serviceName> pair already exists.
+    * @throws UnknownHostException if the host specified by the metadata is unknown 
     * 
     * @throws IllegalArgumentException if serverName is unknown to the store.
     */
-   void addServiceBinding(String serverName, ServiceBinding binding)
-      throws DuplicateServiceException;
+   void addServiceBinding(String serverName, ServiceBindingMetadata binding)
+      throws DuplicateServiceException, UnknownHostException;
 
    /** 
     * Remove a ServiceBinding from the store for the given serverName.
     *
     * @param serverName the name identifying the JBoss server instance in
     *    which the service is running.
-    * @param serviceBinding the binding
+    * @param binding the binding
     * 
     * @throws IllegalArgumentException if serverName is unknown to the store.
     */
-   void removeServiceBinding(String serverName, ServiceBinding binding);
+   void removeServiceBinding(String serverName, ServiceBindingMetadata binding);
    
    /**
     * Gets the offset from a base value that by default should be added to

Modified: trunk/varia/src/main/org/jboss/services/binding/impl/PojoServiceBindingStore.java
===================================================================
--- trunk/varia/src/main/org/jboss/services/binding/impl/PojoServiceBindingStore.java	2008-12-01 03:07:05 UTC (rev 81878)
+++ trunk/varia/src/main/org/jboss/services/binding/impl/PojoServiceBindingStore.java	2008-12-01 04:43:06 UTC (rev 81879)
@@ -24,7 +24,6 @@
 
 import java.net.UnknownHostException;
 import java.util.HashSet;
-import java.util.Iterator;
 import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
@@ -38,9 +37,9 @@
 import org.jboss.managed.api.annotation.ManagementProperties;
 import org.jboss.managed.api.annotation.ManagementProperty;
 import org.jboss.services.binding.DuplicateServiceException;
-import org.jboss.services.binding.ManagedServiceBinding;
 import org.jboss.services.binding.NoSuchBindingException;
 import org.jboss.services.binding.ServiceBinding;
+import org.jboss.services.binding.ServiceBindingMetadata;
 import org.jboss.services.binding.ServiceBindingStore;
 
 /**
@@ -68,13 +67,9 @@
       new ConcurrentHashMap<String, ServiceBindingSet>(16, (float) .75, 2);
    
    /** Injected base bindings whose ports are incremented for each set */
-   private final Map<ManagedServiceBinding, Object> portOffsetBindings = 
-      new ConcurrentHashMap<ManagedServiceBinding, Object>(16, (float) .75, 2);
+   private final Map<ServiceBindingMetadata, Object> standardBindings = 
+      new ConcurrentHashMap<ServiceBindingMetadata, Object>(16, (float) .75, 2);
    
-   /** Injected base bindings whose ports are fixed for each set */
-   private final Map<ManagedServiceBinding, Object> fixedBindings = 
-      new ConcurrentHashMap<ManagedServiceBinding, Object>(16, (float) .75, 2);
-   
    private boolean started;
    
    // ------------------------------------------------------------ Constructors
@@ -86,12 +81,13 @@
    
    // ----------------------------------------------------- ServiceBindingStore
    
-   public void addServiceBinding(String serverName, ServiceBinding binding) 
-      throws DuplicateServiceException
+   public void addServiceBinding(String serverName, ServiceBindingMetadata metadata) 
+      throws DuplicateServiceException, UnknownHostException
    {      
       validateServerName(serverName);
-      ServiceBinding masked = maskManagedBinding(binding);
-      ServiceBinding oldBinding = bindings.putIfAbsent(new ServiceBindingKey(serverName, binding), masked);
+      ServiceBindingSet bindingSet = bindingSets.get(serverName);
+      ServiceBinding binding = new ServiceBinding(metadata, bindingSet.getDefaultHostName(), bindingSet.getPortOffset());
+      ServiceBinding oldBinding = bindings.putIfAbsent(new ServiceBindingKey(serverName, metadata), binding);
       if (oldBinding != null && 
             (safeEquals(oldBinding.getHostName(), binding.getHostName()) == false
                || oldBinding.getPort() != binding.getPort()))
@@ -100,8 +96,7 @@
       }
       
       // For management purposes, treat this as an override
-      ServiceBindingSet bindingSet = bindingSets.get(serverName);
-      bindingSet.getOverrideBindings().add(getManagedServiceBinding(binding));
+      bindingSet.getOverrideBindings().add(metadata);
    }
 
    public ServiceBinding getServiceBinding(String serverName, String serviceName, String bindingName)
@@ -131,14 +126,14 @@
       return result;
    }
 
-   public void removeServiceBinding(String serverName, ServiceBinding binding)
+   public void removeServiceBinding(String serverName, ServiceBindingMetadata metadata)
    {
       validateServerName(serverName);
-      bindings.remove(new ServiceBindingKey(serverName, binding));
+      bindings.remove(new ServiceBindingKey(serverName, metadata));
       
       // For management purposes, treat this as an override
       ServiceBindingSet bindingSet = bindingSets.get(serverName);
-      bindingSet.getOverrideBindings().remove(getManagedServiceBinding(binding));
+      bindingSet.getOverrideBindings().remove(metadata);
    }
 
    public String getDefaultHostName(String serverName)
@@ -157,56 +152,28 @@
    
    /**
     * Sets the base set of bindings that should be associated with each binding set,
-    * but with that binding set's {@link ServiceBindingSet#getPortOffset() port offset}
-    * applied to the port value.
+    * adjusted to conform to the binding set's defaultHostName and offset.
     * 
     * @param bindings the set of base bindings. May be <code>null</code>
     * 
     * @throws IllegalStateException if invoked after {@link #start()}
     */
-   public void setPortOffsetBindings(Set<ManagedServiceBinding> bindings)
+   public void setStandardBindings(Set<ServiceBindingMetadata> bindings)
    {
       if (started)
       {
          throw new IllegalStateException("Cannot call setPortOffsetBindings() after start()");
       }
-      portOffsetBindings.clear();
+      standardBindings.clear();
       if (bindings != null)
       {
-         for (ManagedServiceBinding binding : bindings)
+         for (ServiceBindingMetadata binding : bindings)
          {
-            portOffsetBindings.put(binding, VALUE);
+            standardBindings.put(binding, VALUE);
          }
       }
    }
    
-   /**
-    * Sets the set of bindings that should be associated with each binding set,
-    * but whose hostname/port/bindAddress should not vary. Typically used for
-    * multicast socket bindings, which do not lead to port conflicts if multiple
-    * sockets are opened on the same machine.
-    * 
-    * @param bindings the set of fixed bindings. May be <code>null</code>
-    * 
-    * @throws IllegalStateException if invoked after {@link #start()}
-    */
-   public void setFixedBindings(Set<ManagedServiceBinding> bindings)
-   {
-      if (started)
-      {
-         throw new IllegalStateException("Cannot call setFixedBindings() after start()");
-      }
-      
-      fixedBindings.clear();
-      if (bindings != null)
-      {
-         for (ManagedServiceBinding binding : bindings)
-         {
-            fixedBindings.put(binding, VALUE);
-         }
-      }
-   }
-   
    public void setServiceBindingSets(Set<ServiceBindingSet> sets)
    {
       if (started)
@@ -239,52 +206,29 @@
       // fixed and portOffset, we get DuplicateServiceException
       for (ServiceBindingSet bindingSet : bindingSets.values())
       {
-         for (ServiceBinding binding : bindingSet.getOverrideBindings())
+         for (ServiceBindingMetadata binding : bindingSet.getOverrideBindings())
          {
             addServiceBinding(bindingSet.getName(), binding);
          }
       }
       
-      // Establish the portOffset bindings   
-      for (ManagedServiceBinding fixed : portOffsetBindings.keySet())
+      // Establish the standard bindings   
+      for (ServiceBindingMetadata metadata : standardBindings.keySet())
       {
          for (ServiceBindingSet bindingSet : bindingSets.values())
          {
-            ServiceBinding binding = fixed.getOffsetBinding(bindingSet.getPortOffset(), 
-                                                            bindingSet.getDefaultHostName());
             try
             {
-               addServiceBinding(bindingSet.getName(), binding);
+               addServiceBinding(bindingSet.getName(), metadata);
             }
             catch (DuplicateServiceException e)
             {
-               if (bindingSet.getOverrideBindings().contains(binding) == false)
+               if (bindingSet.getOverrideBindings().contains(metadata) == false)
                {
                   throw e;
                }
             }
          }
-      } 
-      
-      // Establish the fixed bindings 
-      for (ManagedServiceBinding fixed : fixedBindings.keySet())
-      {
-         for (ServiceBindingSet bindingSet : bindingSets.values())
-         {
-            // We use getOffsetBinding(0) as a form of copy constructor
-            ServiceBinding binding = fixed.getOffsetBinding(0, bindingSet.getDefaultHostName());
-            try
-            {
-               addServiceBinding(bindingSet.getName(), binding);
-            }
-            catch (DuplicateServiceException e)
-            {
-               if (bindingSet.getOverrideBindings().contains(binding) == false)
-               {
-                  throw e;
-               }
-            }
-         }
       }
       
       this.started = true;
@@ -306,28 +250,12 @@
     * @return the set of base bindings
     */
    @ManagementProperty(description="the base set of bindings that should be associated " +
-        "with each binding set, but with that binding set's port offset applied " +
-        "to the port value.")
-   public Set<ManagedServiceBinding> getPortOffsetBindings()
+        "with each binding set")
+   public Set<ServiceBindingMetadata> getStandardBindings()
    {
-      return new HashSet<ManagedServiceBinding>(portOffsetBindings.keySet());
+      return new HashSet<ServiceBindingMetadata>(standardBindings.keySet());
    }
    
-   /**
-    * Gets the set of bindings that should be associated with each binding set,
-    * but whose hostname/port/bindAddress should not vary. Typically used for
-    * multicast socket bindings, which do not lead to port conflicts if multiple
-    * sockets are opened on the same machine.
-    * 
-    * @return the set of fixed bindings
-    */
-   @ManagementProperty(description="the set of bindings that should be associated " +
-         "with each binding set, whose hostname/port/bindAddress should not vary")
-   public Set<ManagedServiceBinding> getFixedBindings()
-   {
-      return new HashSet<ManagedServiceBinding>(fixedBindings.keySet());
-   }
-   
    @ManagementProperty(description="the named binding sets")
    public Set<ServiceBindingSet> getBindingSets()
    {
@@ -338,17 +266,14 @@
     * Add a ServiceBinding to all binding sets in the store. For each binding 
     * set, a new ServiceBinding is added whose serviceName and bindingName
     * properties match the passed binding. If <the given <code>binding</code>'s
-    * <code>hostName</code> property is <code>null</code>, the new binding's 
+    * <code>fixeHostName</code> property is <code>false</code>, the new binding's 
     * hostName matches the target set's {@link #getDefaultHostName(String) default host name}.
-    * If <code>fixed</code> is <code>false</code>, the new binding's port is 
-    * derived by taking the port from the passed binding and incrementing it 
-    * by the target set's {@link #getDefaultPortOffset(String) default port offset}.
+    * If <code>binding</code>'s <code>fixedPort</code> property is <code>false</code>, 
+    * the new binding's port is derived by taking the port from the passed binding 
+    * and incrementing it by the target set's 
+    * {@link #getDefaultPortOffset(String) default port offset}.
     *
-    * @param serviceName the JMX ObjectName of the service
-    * @param serviceConfig the configuration to add
-    * @param fixed <code>true</code> if the binding's port should remain fixed
-    *              when added to each binding set; <code>false</code> if it 
-    *              should be offset by the binding set's port offset
+    * @param metadata metadata about the binding to add
     * 
     * @throws DuplicateServiceException thrown if a configuration for the
     *    <serverName, serviceName> pair already exists.
@@ -356,42 +281,36 @@
    @ManagementOperation(description="adds a service binding", impact=Impact.WriteOnly,
                         params={@ManagementParameter(name="binding"),
                                 @ManagementParameter(name="fixed")})
-   public void addServiceBinding(ManagedServiceBinding binding, boolean fixed) throws DuplicateServiceException
+   public void addServiceBinding(ServiceBindingMetadata metadata) throws DuplicateServiceException
    {
       // Add to the runtime objects
-      for (String serverName : bindingSets.keySet())
+      for (ServiceBindingSet bindingSet : bindingSets.values())
       {
-         int port = fixed ? binding.getPort() : binding.getPort() + getDefaultPortOffset(serverName);
-         String hostName = binding.getHostName();
-         if (hostName == null)
-            hostName = getDefaultHostName(serverName);
-         
          try
          {
-            addServiceBinding(serverName, new ServiceBinding(binding.getServiceName(), binding.getBindingName(), hostName, port));
+            addServiceBinding(bindingSet.getName(), metadata);
          }
          catch (UnknownHostException e)
          {
+            String hostName = metadata.isFixedHostName() ? metadata.getHostName() : bindingSet.getDefaultHostName();
             throw new IllegalStateException("Cannot convert " + hostName + " into an InetAddress");
          }
       }
       
       // Add to the managed object map
-      Map<ManagedServiceBinding, Object> map = fixed ? fixedBindings : portOffsetBindings;
-      map.put(getManagedServiceBinding(binding), VALUE);
+      standardBindings.put(metadata, VALUE);
    }
    
    /** 
-    * Adds a ServiceBinding to all binding sets in the store. For each binding 
-    * set, a new ServiceBinding is added whose serviceName and bindingName
-    * properties match the passed values. If <code>hostName</code>
-    * is <code>null</code>, the new binding's hostName matches
-    * the target set's {@link #getDefaultHostName(String) default host name}.
-    * If <code>fixed</code> is false, the new binding's port is derived by 
-    * taking the given <code>port</code> and incrementing it by the target set's 
-    * {@link #getDefaultPortOffset(String) default port offset}.
+    * Creates a new {@link ServiceBindingMetadata} from the given params
+    * and calls {@link #addServiceBinding(ServiceBindingMetadata)}.
     *
-    * @param serviceName the JMX ObjectName of the service
+    * @param serviceName the name of the service. Cannot be <code>null</code>
+    * @param bindingName name qualifier for the binding within the service.
+    *                    May be <code>null</code>
+    * @param hostName hostname or IP address to which the binding should be
+    *                 bound. Use <code>null</code> to indicate the host name
+    *                 should be the default host name for each binding set
     * @param serviceConfig the configuration to add
     * @param fixed <code>true</code> if the binding's port should remain fixed
     *              when added to each binding set; <code>false</code> if it 
@@ -405,35 +324,36 @@
                                 @ManagementParameter(name="bindingName"),
                                 @ManagementParameter(name="hostName"),
                                 @ManagementParameter(name="port"),
-                                @ManagementParameter(name="fixed")})
-   public void addServiceBinding(String serviceName, String bindingName, String hostName, int port, boolean fixed) 
+                                @ManagementParameter(name="fixedPort")})
+   public void addServiceBinding(String serviceName, String bindingName, String hostName, int port, boolean fixedPort) 
       throws DuplicateServiceException, UnknownHostException
    {
-      addServiceBinding(new ManagedServiceBinding(serviceName, bindingName, hostName, port), fixed);
+      ServiceBindingMetadata metadata = new ServiceBindingMetadata();
+      metadata.setServiceName(serviceName);
+      metadata.setBindingName(bindingName);
+      metadata.setHostName(hostName);
+      metadata.setPort(port);
+      metadata.setFixedPort(fixedPort);
+      addServiceBinding(metadata);
    }
 
    /** 
     * Remove a service configuration from all binding sets in the store.
     *
-    * @param serviceBinding the binding
+    * @param metadata the binding
     */
    @ManagementOperation(description="removes a service binding", impact=Impact.WriteOnly,
                         params={@ManagementParameter(name="binding")})
-   public void removeServiceBinding(ManagedServiceBinding binding)
+   public void removeServiceBinding(ServiceBindingMetadata metadata)
    {
       // Remove from runtime sets
       for (String serverName : bindingSets.keySet())
       {
-         removeServiceBinding(serverName, binding);
+         removeServiceBinding(serverName, metadata);
       }
       
-      // Remove from managed sets
-      ManagedServiceBinding msb = getManagedServiceBinding(binding);
-      if (fixedBindings.remove(msb) == null)
-      {
-         portOffsetBindings.remove(msb);
-      }
-      
+      // Remove from managed set
+      standardBindings.remove(metadata);    
    }
 
    /** 
@@ -446,92 +366,12 @@
                  @ManagementParameter(name="bindingName")})
    public void removeServiceBinding(String serviceName, String bindingName)
    {
-      try
-      {
-         ManagedServiceBinding binding = new ManagedServiceBinding(serviceName, bindingName, null, 0);
-         removeServiceBinding(binding);         
-      }
-      catch (UnknownHostException e)
-      {
-         // Do it by hand
-         for (ServiceBindingSet bindingSet : bindingSets.values())
-         {
-            bindings.remove(new ServiceBindingKey(bindingSet.getName(), serviceName, bindingName));
-
-            for (Iterator<ManagedServiceBinding> iter = bindingSet.getOverrideBindings().iterator(); iter.hasNext(); )
-            {
-               ServiceBinding b = iter.next();
-               if (b.getServiceName().equals(serviceName) && safeEquals(b.getBindingName(), bindingName))
-               {
-                  iter.remove();
-                  break;
-               }
-            }
-         }
-         
-         boolean removed = false;
-         for (Iterator<ManagedServiceBinding> iter = fixedBindings.keySet().iterator(); iter.hasNext(); )
-         {
-            ManagedServiceBinding b = iter.next();
-            if (b.getServiceName().equals(serviceName) && safeEquals(b.getBindingName(), bindingName))
-            {
-               iter.remove();
-               removed = true;
-               break;
-            }
-         }
-         if (!removed)
-         {
-            for (Iterator<ManagedServiceBinding> iter = portOffsetBindings.keySet().iterator(); iter.hasNext(); )
-            {
-               ManagedServiceBinding b = iter.next();
-               if (b.getServiceName().equals(serviceName) && safeEquals(b.getBindingName(), bindingName))
-               {
-                  iter.remove();
-                  break;
-               }
-            }
-         }
-      }
+      ServiceBindingMetadata metadata = new ServiceBindingMetadata(serviceName, bindingName);
+      removeServiceBinding(metadata); 
    }
    
    // ------------------------------------------------------------------ Private
 
-   private static ServiceBinding maskManagedBinding(ServiceBinding toMask)
-   {
-      ServiceBinding masked = toMask;
-      if (toMask instanceof ManagedServiceBinding)
-      {
-         try
-         {
-            masked = new ServiceBinding(toMask);
-         }
-         catch (UnknownHostException e)
-         {
-            throw new IllegalStateException("Cannot create unmanaged binding from " + toMask, e);
-         }
-      }
-      return masked;
-   }
-   
-   private static ManagedServiceBinding getManagedServiceBinding(ServiceBinding source)
-   {
-      if (source instanceof ManagedServiceBinding)
-      {
-         return (ManagedServiceBinding) source;
-      }
-      
-      try
-      {
-         ManagedServiceBinding managed = new ManagedServiceBinding(source);          
-         return managed;
-      }
-      catch (UnknownHostException e)
-      {
-         throw new IllegalStateException("Cannot create managed binding from " + source, e);
-      }
-   }
-
    private static boolean safeEquals(Object a, Object b)
    {      
       return (a == b || (a != null && a.equals(b)));
@@ -549,18 +389,40 @@
       private final String serviceName;
       private final String bindingName;
       
-      private ServiceBindingKey(String serverName, ServiceBinding binding)
+      private ServiceBindingKey(String serverName, ServiceBindingMetadata binding)
       {
-         this(serverName, binding.getServiceName(), binding.getBindingName());
+         if (serverName == null)
+         {
+            throw new IllegalArgumentException("serverName is null");
+         }
+         if (binding == null)
+         {
+            throw new IllegalArgumentException("binding is null");
+         }
+         if (binding.getServiceName() == null)
+         {
+            throw new IllegalStateException("binding's serviceName is null");
+         }
+         
+         this.serverName = serverName;
+         this.serviceName = binding.getServiceName();
+         this.bindingName = binding.getBindingName();
       }
       
       private ServiceBindingKey(String serverName, String serviceName, String bindingName)
       {
-         assert serverName != null : "serverName is null";
-         assert serviceName != null : "serviceName is null";
+         if (serverName == null)
+         {
+            throw new IllegalArgumentException("serverName is null");
+         }
+
+         if (serviceName == null)
+         {
+            throw new IllegalArgumentException("serviceName is null");
+         }
          
          this.serverName  = serverName;
-         this.serviceName = ServiceBinding.canonicalizeServiceName(serviceName);
+         this.serviceName = ServiceBindingMetadata.canonicalizeServiceName(serviceName);
          this.bindingName = bindingName;
       }
 

Modified: trunk/varia/src/main/org/jboss/services/binding/impl/ServiceBindingSet.java
===================================================================
--- trunk/varia/src/main/org/jboss/services/binding/impl/ServiceBindingSet.java	2008-12-01 03:07:05 UTC (rev 81878)
+++ trunk/varia/src/main/org/jboss/services/binding/impl/ServiceBindingSet.java	2008-12-01 04:43:06 UTC (rev 81879)
@@ -31,7 +31,7 @@
 import org.jboss.managed.api.annotation.ManagementObjectID;
 import org.jboss.managed.api.annotation.ManagementProperties;
 import org.jboss.managed.api.annotation.ManagementProperty;
-import org.jboss.services.binding.ManagedServiceBinding;
+import org.jboss.services.binding.ServiceBindingMetadata;
 
 /**
  * Encapsulates information used to configure a unique set of bindings.
@@ -49,7 +49,7 @@
    private final String bindingSetName;
    private String defaultHostName;
    private int portOffset;
-   private final Set<ManagedServiceBinding> overrides;
+   private final Set<ServiceBindingMetadata> overrides;
    
    // ------------------------------------------------------------ Constructors
    
@@ -64,7 +64,7 @@
    /**
     * Same as ServiceBindingSet(name, null, 0, overrides)
     */
-   public ServiceBindingSet(String name, Set<ManagedServiceBinding> overrides)
+   public ServiceBindingSet(String name, Set<ServiceBindingMetadata> overrides)
    {
       this(name, null, 0, overrides);
    }
@@ -98,14 +98,14 @@
     */
    public ServiceBindingSet(String name, String defaultHostName, 
                             int offset, 
-                            Set<ManagedServiceBinding> overrides)
+                            Set<ServiceBindingMetadata> overrides)
    {
       if (name == null)
       {
          throw new IllegalArgumentException("name is null");
       }
       
-      this.overrides =  overrides == null ? new HashSet<ManagedServiceBinding>(0) : overrides; 
+      this.overrides =  overrides == null ? new HashSet<ServiceBindingMetadata>(0) : overrides; 
       
       this.bindingSetName = name;
       this.defaultHostName = defaultHostName;
@@ -147,10 +147,10 @@
    
    @ManagementProperty(description="bindings that either override or are additions " +
    		"to the base bindings configured in the ServiceBindingStore")
-   public Set<ManagedServiceBinding> getOverrideBindings()
+   public Set<ServiceBindingMetadata> getOverrideBindings()
    {
       @SuppressWarnings("unchecked")      
-      Set<ManagedServiceBinding> result = overrides == null ? Collections.EMPTY_SET : overrides;
+      Set<ServiceBindingMetadata> result = overrides == null ? Collections.EMPTY_SET : overrides;
       return result;
    }
    

Modified: trunk/varia/src/tests/org/jboss/test/services/binding/test/DefaultServiceBindingValueSourceUnitTestCase.java
===================================================================
--- trunk/varia/src/tests/org/jboss/test/services/binding/test/DefaultServiceBindingValueSourceUnitTestCase.java	2008-12-01 03:07:05 UTC (rev 81878)
+++ trunk/varia/src/tests/org/jboss/test/services/binding/test/DefaultServiceBindingValueSourceUnitTestCase.java	2008-12-01 04:43:06 UTC (rev 81879)
@@ -22,6 +22,7 @@
 
 package org.jboss.test.services.binding.test;
 
+import org.jboss.services.binding.ServiceBinding;
 import org.jboss.services.binding.ServiceBindingManager;
 import org.jboss.services.binding.ServiceBindingManager.BindingType;
 import org.jboss.services.binding.impl.SimpleServiceBindingValueSourceImpl;
@@ -50,13 +51,15 @@
    public void testInjectedSource() throws Exception
    {
       MockServiceBindingValueSource source = new MockServiceBindingValueSource("test");
-      binding.setServiceBindingValueSource(source);
+      bindingMetadata.setServiceBindingValueSource(source);
+      binding = new ServiceBinding(bindingMetadata, HOST, 0);
       assertEquals(source, ServiceBindingManager.getServiceBindingValueSource(binding, BindingType.GENERIC));
    }
    
    public void testInjectedSourceClassName() throws Exception
    {
-      binding.setServiceBindingValueSourceClassName(MockServiceBindingValueSource.class.getName());
+      bindingMetadata.setServiceBindingValueSourceClassName(MockServiceBindingValueSource.class.getName());
+      binding = new ServiceBinding(bindingMetadata, HOST, 0);
       assertTrue(ServiceBindingManager.getServiceBindingValueSource(binding, BindingType.GENERIC) instanceof MockServiceBindingValueSource);
    }
    
@@ -92,19 +95,22 @@
    
    public void testElementXSLT() throws Exception
    {
-      binding.setServiceBindingValueSourceConfig(new XSLTServiceBindingValueSourceConfig("test"));
+      bindingMetadata.setServiceBindingValueSourceConfig(new XSLTServiceBindingValueSourceConfig("test"));
+      binding = new ServiceBinding(bindingMetadata, HOST, 0);
       assertTrue(ServiceBindingManager.getServiceBindingValueSource(binding, BindingType.ELEMENT) instanceof XSLTServiceBindingValueSourceImpl);
    }
    
    public void testResourceXSLT() throws Exception
    {
-      binding.setServiceBindingValueSourceConfig(new XSLTServiceBindingValueSourceConfig("test"));
+      bindingMetadata.setServiceBindingValueSourceConfig(new XSLTServiceBindingValueSourceConfig("test"));
+      binding = new ServiceBinding(bindingMetadata, HOST, 0);
       assertTrue(ServiceBindingManager.getServiceBindingValueSource(binding, BindingType.RESOURCE) instanceof XSLTServiceBindingValueSourceImpl);
    }
    
    public void testURLXSLT() throws Exception
    {
-      binding.setServiceBindingValueSourceConfig(new XSLTServiceBindingValueSourceConfig("test"));
+      bindingMetadata.setServiceBindingValueSourceConfig(new XSLTServiceBindingValueSourceConfig("test"));
+      binding = new ServiceBinding(bindingMetadata, HOST, 0);
       assertTrue(ServiceBindingManager.getServiceBindingValueSource(binding, BindingType.URL) instanceof XSLTServiceBindingValueSourceImpl);
    }
    

Modified: trunk/varia/src/tests/org/jboss/test/services/binding/test/MockServiceBindingStore.java
===================================================================
--- trunk/varia/src/tests/org/jboss/test/services/binding/test/MockServiceBindingStore.java	2008-12-01 03:07:05 UTC (rev 81878)
+++ trunk/varia/src/tests/org/jboss/test/services/binding/test/MockServiceBindingStore.java	2008-12-01 04:43:06 UTC (rev 81879)
@@ -22,12 +22,14 @@
 
 package org.jboss.test.services.binding.test;
 
+import java.net.UnknownHostException;
 import java.util.Collections;
 import java.util.Set;
 
 import org.jboss.services.binding.DuplicateServiceException;
 import org.jboss.services.binding.NoSuchBindingException;
 import org.jboss.services.binding.ServiceBinding;
+import org.jboss.services.binding.ServiceBindingMetadata;
 import org.jboss.services.binding.ServiceBindingStore;
 
 /**
@@ -70,24 +72,20 @@
       return Collections.singleton(binding);
    }
 
-   public void removeServiceBinding(String serverName, ServiceBinding binding)
+   public void removeServiceBinding(String serverName, ServiceBindingMetadata binding)
    {
       throw new UnsupportedOperationException("unimplemented");
    }
 
-   public void removeServiceBinding(String serverName, String serviceName, String bindingName)
+   public void addServiceBinding(String serverName, ServiceBindingMetadata binding) 
+     throws DuplicateServiceException, UnknownHostException
    {
-      throw new UnsupportedOperationException("unimplemented");
-   }
-
-   public void addServiceBinding(String serverName, ServiceBinding binding) throws DuplicateServiceException
-   {
       if (this.binding != null)
          throw new IllegalStateException("MockServiceBindingStore already has a binding");
       if (this.serverName.equals(serverName) == false)
          throw new IllegalArgumentException("Invalid serverName " + serverName);
       
-      this.binding = binding;
+      this.binding = new ServiceBinding(binding, getDefaultHostName(serverName), getDefaultPortOffset(serverName));
    }
 
    public String getDefaultHostName(String serverName)

Modified: trunk/varia/src/tests/org/jboss/test/services/binding/test/PojoServiceBindingStoreUnitTestCase.java
===================================================================
--- trunk/varia/src/tests/org/jboss/test/services/binding/test/PojoServiceBindingStoreUnitTestCase.java	2008-12-01 03:07:05 UTC (rev 81878)
+++ trunk/varia/src/tests/org/jboss/test/services/binding/test/PojoServiceBindingStoreUnitTestCase.java	2008-12-01 04:43:06 UTC (rev 81879)
@@ -23,6 +23,7 @@
 package org.jboss.test.services.binding.test;
 
 import java.net.InetAddress;
+import java.net.UnknownHostException;
 import java.util.Arrays;
 import java.util.HashSet;
 import java.util.Set;
@@ -30,7 +31,7 @@
 import junit.framework.TestCase;
 
 import org.jboss.services.binding.DuplicateServiceException;
-import org.jboss.services.binding.ManagedServiceBinding;
+import org.jboss.services.binding.ServiceBindingMetadata;
 import org.jboss.services.binding.NoSuchBindingException;
 import org.jboss.services.binding.ServiceBinding;
 import org.jboss.services.binding.impl.PojoServiceBindingStore;
@@ -49,12 +50,16 @@
    private static final String C = "C";
    private static final String D = "D";
    
-   private static ManagedServiceBinding AA;
-   private static ManagedServiceBinding AB;
-   private static ManagedServiceBinding Anull;
-   private static ManagedServiceBinding BA;
+   private static ServiceBindingMetadata AA;
+   private static ServiceBindingMetadata AB;
+   private static ServiceBindingMetadata Anull;
+   private static ServiceBindingMetadata BA;
    
-   private Set<ManagedServiceBinding> bindings = new HashSet<ManagedServiceBinding>();
+   private static ServiceBindingSet SET_A;   
+   private static ServiceBindingSet SET_B;   
+   private static ServiceBindingSet SET_C;
+   
+   private Set<ServiceBindingMetadata> bindings = new HashSet<ServiceBindingMetadata>();
    private Set<ServiceBindingSet> bindingSets = new HashSet<ServiceBindingSet>();
    
    /**
@@ -72,39 +77,51 @@
    {
       super.setUp();
       
-      AA = new ManagedServiceBinding(A, A, "localhost", 1);
+      AA = new ServiceBindingMetadata(A, A, null, 1, false, false);
       bindings.add(AA);
-      AB = new ManagedServiceBinding(A, B, "localhost", 1);
+      AB = new ServiceBindingMetadata(A, B, null, 1, false, false);
       bindings.add(AB);
-      Anull = new ManagedServiceBinding(A, null, "localhost", 1);
+      Anull = new ServiceBindingMetadata(A, null, null, 1, false, false);
       bindings.add(Anull);
       
       // This one doesn't go in the standard bindings set
-      BA = new ManagedServiceBinding(B, A, "localhost", 1);
+      BA = new ServiceBindingMetadata(B, A, null, 1, false, false);
       
-      bindingSets.add(new ServiceBindingSet(A));
-      bindingSets.add(new ServiceBindingSet(B));
-      bindingSets.add(new ServiceBindingSet(C));
+      SET_A = new ServiceBindingSet(A);
+      SET_A.setDefaultHostName("localhost");
+      bindingSets.add(SET_A);
+      SET_B = new ServiceBindingSet(B);
+      SET_B.setDefaultHostName("localhost");
+      bindingSets.add(SET_B);
+      SET_C = new ServiceBindingSet(C);
+      SET_C.setDefaultHostName("localhost");
+      bindingSets.add(SET_C);
    }
    
+   private static ServiceBinding getServiceBinding(ServiceBindingMetadata md, ServiceBindingSet set) throws UnknownHostException
+   {
+      return new ServiceBinding(md, set.getDefaultHostName(), set.getPortOffset());
+   }
+   
+   
    public void testGetServiceBinding() throws Exception
    {
       PojoServiceBindingStore store = new PojoServiceBindingStore();      
       store.setServiceBindingSets(bindingSets);
-      store.setPortOffsetBindings(bindings);
+      store.setStandardBindings(bindings);
       store.start();
       
-      assertEquals(AA, store.getServiceBinding(A, A, A));      
-      assertEquals(AA, store.getServiceBinding(B, A, A));     
-      assertEquals(AA, store.getServiceBinding(C, A, A));
+      assertEquals(getServiceBinding(AA, SET_A), store.getServiceBinding(A, A, A));      
+      assertEquals(getServiceBinding(AA, SET_B), store.getServiceBinding(B, A, A));     
+      assertEquals(getServiceBinding(AA, SET_C), store.getServiceBinding(C, A, A));
       
-      assertEquals(AB, store.getServiceBinding(A, A, B));      
-      assertEquals(AB, store.getServiceBinding(B, A, B));     
-      assertEquals(AB, store.getServiceBinding(C, A, B));
+      assertEquals(getServiceBinding(AB, SET_A), store.getServiceBinding(A, A, B));      
+      assertEquals(getServiceBinding(AB, SET_B), store.getServiceBinding(B, A, B));     
+      assertEquals(getServiceBinding(AB, SET_C), store.getServiceBinding(C, A, B));
       
-      assertEquals(Anull, store.getServiceBinding(A, A, null));      
-      assertEquals(Anull, store.getServiceBinding(B, A, null));     
-      assertEquals(Anull, store.getServiceBinding(C, A, null));
+      assertEquals(getServiceBinding(Anull, SET_A), store.getServiceBinding(A, A, null));      
+      assertEquals(getServiceBinding(Anull, SET_B), store.getServiceBinding(B, A, null));     
+      assertEquals(getServiceBinding(Anull, SET_C), store.getServiceBinding(C, A, null));
       
       try
       {
@@ -132,19 +149,19 @@
    {
       PojoServiceBindingStore store = new PojoServiceBindingStore();      
       store.setServiceBindingSets(bindingSets);
-      store.setPortOffsetBindings(bindings);
+      store.setStandardBindings(bindings);
       store.start();
       
-      ServiceBinding new1 = new ServiceBinding(B, A, "localhost", 1);
+      ServiceBindingMetadata new1 = new ServiceBindingMetadata(B, A, "localhost", 1, false, false);
       store.addServiceBinding(A, new1);
       store.addServiceBinding(B, new1);
       store.addServiceBinding(C, new1);
       
-      assertEquals(new1, store.getServiceBinding(A, B, A));      
-      assertEquals(new1, store.getServiceBinding(B, B, A));      
-      assertEquals(new1, store.getServiceBinding(C, B, A));
+      assertEquals(getServiceBinding(new1, SET_A), store.getServiceBinding(A, B, A));      
+      assertEquals(getServiceBinding(new1, SET_B), store.getServiceBinding(B, B, A));      
+      assertEquals(getServiceBinding(new1, SET_C), store.getServiceBinding(C, B, A));
       
-      ServiceBinding new2 = new ServiceBinding(B, A, "localhost", 2);
+      ServiceBindingMetadata new2 = new ServiceBindingMetadata(B, A, "localhost", 2, false, false);
       try
       {
          store.addServiceBinding(D, new2);      
@@ -164,7 +181,7 @@
    {
       PojoServiceBindingStore store = new PojoServiceBindingStore();      
       store.setServiceBindingSets(bindingSets);
-      store.setPortOffsetBindings(bindings);
+      store.setStandardBindings(bindings);
       store.start();
       
       store.removeServiceBinding(A, AA);
@@ -203,7 +220,7 @@
       }
       catch (NoSuchBindingException e) {}
       
-      ServiceBinding new1 = new ServiceBinding(B, A, "localhost", 1);
+      ServiceBindingMetadata new1 = new ServiceBindingMetadata(B, A, "localhost", 1, false, false);
       store.removeServiceBinding(A, new1);
       store.removeServiceBinding(A, BA);
    }
@@ -211,66 +228,69 @@
    
    public void testAddServiceBindingToAll() throws Exception
    {
-      Set<ManagedServiceBinding> set = new HashSet<ManagedServiceBinding>();
+      Set<ServiceBindingMetadata> set = new HashSet<ServiceBindingMetadata>();
       set.addAll(Arrays.asList(AA, AB, Anull));
       
       Set<ServiceBindingSet> ourSets = new HashSet<ServiceBindingSet>();
-      ourSets.add(new ServiceBindingSet(A, null, 10, set));      
-      ourSets.add(new ServiceBindingSet(B, "localhost", 20, set));
-      ourSets.add(new ServiceBindingSet(C, "192.168.0.10", 30, set));
+      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();
       
-      ManagedServiceBinding new1 = new ManagedServiceBinding(B, A, "192.168.0.22", 1);
-      store.addServiceBinding(new1, false);
+      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(new1, got);    
+      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(new1, got);    
+      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(new1, got);
+      assertEquals(getServiceBinding(new1, newSetC), got);
       assertEquals(31, got.getPort());
       assertEquals("192.168.0.22", got.getHostName());
       assertEquals(address, got.getBindAddress());
       
-      ManagedServiceBinding new2 = new ManagedServiceBinding(B, A, "localhost", 2);
+      ServiceBindingMetadata new2 = new ServiceBindingMetadata(B, A, "localhost", 2, false, false);
       try
       {
-         store.addServiceBinding(new2, false); 
+         store.addServiceBinding(new2); 
          fail("duplicate add succeeded");
       }
       catch (DuplicateServiceException good) {}
       
-      ManagedServiceBinding new3 = new ManagedServiceBinding(C, C, null, 3);
-      store.addServiceBinding(new3, false);
+      ServiceBindingMetadata new3 = new ServiceBindingMetadata(C, C, null, 3, false, false);
+      store.addServiceBinding(new3);
       
       got = store.getServiceBinding(A, C, C);
-      assertEquals(new3, got);    
+      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(new3, got);    
+      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(new3, got);    
+      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());
@@ -281,7 +301,7 @@
    {
       PojoServiceBindingStore store = new PojoServiceBindingStore();      
       store.setServiceBindingSets(bindingSets);
-      store.setPortOffsetBindings(bindings);
+      store.setStandardBindings(bindings);
       store.start();
       
       store.removeServiceBinding(AA);
@@ -333,7 +353,7 @@
       }
       catch (NoSuchBindingException e) {}
       
-      ManagedServiceBinding new1 = new ManagedServiceBinding(B, A, "localhost", 1);
+      ServiceBindingMetadata new1 = new ServiceBindingMetadata(B, A, "localhost", 1, false, false);
       store.removeServiceBinding(new1);
       store.removeServiceBinding(B, A);
    }
@@ -342,21 +362,21 @@
    {
       PojoServiceBindingStore store = new PojoServiceBindingStore();      
       store.setServiceBindingSets(bindingSets);
-      store.setPortOffsetBindings(bindings);
+      store.setStandardBindings(bindings);
       store.start();
       
       String[] names = {A, B, C};
       
       for (String name :names)
       {
-         assertNull(store.getDefaultHostName(name));
+         assertEquals("localhost", store.getDefaultHostName(name));
          assertEquals(0, store.getDefaultPortOffset(name));
       }
    }
    
    public void testDefaults() throws Exception
    {
-      Set<ManagedServiceBinding> set = new HashSet<ManagedServiceBinding>();
+      Set<ServiceBindingMetadata> set = new HashSet<ServiceBindingMetadata>();
       set.addAll(Arrays.asList(AA, AB, Anull));
       
       Set<ServiceBindingSet> sbs = new HashSet<ServiceBindingSet>();
@@ -382,14 +402,19 @@
    {
       PojoServiceBindingStore store = new PojoServiceBindingStore();      
       store.setServiceBindingSets(bindingSets);
-      store.setPortOffsetBindings(bindings);
+      store.setStandardBindings(bindings);
       store.start();
       
       String[] servers = {A, B, C};
       for (String server : servers)
       {
          Set<ServiceBinding> set = store.getServiceBindings(server);
-         assertEquals(bindings, set);
+         assertEquals(bindings.size(), set.size());
+         for (ServiceBinding binding : set)
+         {
+            ServiceBindingMetadata metadata = new ServiceBindingMetadata(binding);
+            assertTrue(server + " includes " + metadata, bindings.contains(metadata));
+         }
       }      
    }
    

Modified: trunk/varia/src/tests/org/jboss/test/services/binding/test/ServiceBindingManagerUnitTestCase.java
===================================================================
--- trunk/varia/src/tests/org/jboss/test/services/binding/test/ServiceBindingManagerUnitTestCase.java	2008-12-01 03:07:05 UTC (rev 81878)
+++ trunk/varia/src/tests/org/jboss/test/services/binding/test/ServiceBindingManagerUnitTestCase.java	2008-12-01 04:43:06 UTC (rev 81879)
@@ -31,6 +31,7 @@
 
 import org.jboss.services.binding.ServiceBinding;
 import org.jboss.services.binding.ServiceBindingManager;
+import org.jboss.services.binding.ServiceBindingMetadata;
 import org.w3c.dom.Element;
 
 /**
@@ -45,6 +46,7 @@
    private static final String INPUT = "${host}";
    
    private ServiceBindingManager testee;
+   private ServiceBindingMetadata noNameMetadata;
    private ServiceBinding noNameBinding;
    private MockServiceBindingStore mockStore;
    private InetAddress address;
@@ -65,7 +67,8 @@
       
       mockStore = new MockServiceBindingStore(binding, SERVER);
       testee = new ServiceBindingManager(SERVER, mockStore);
-      noNameBinding = new ServiceBinding(SVC_NAME, null, HOST, PORT);
+      noNameMetadata = new ServiceBindingMetadata(SVC_NAME, null, null, PORT);
+      noNameBinding = new ServiceBinding(noNameMetadata, HOST, 0);
       address = InetAddress.getByName(HOST);
    }
    
@@ -100,7 +103,9 @@
    {
       Integer result = new Integer(5);
       MockServiceBindingValueSource source = new MockServiceBindingValueSource(result);
-      binding.setServiceBindingValueSource(source);
+      bindingMetadata.setServiceBindingValueSource(source);
+      binding = new ServiceBinding(bindingMetadata, HOST, 0); 
+      mockStore.setBinding(binding);
       assertEquals(5, testee.getIntBinding(SVC_NAME, BINDING_NAME));
       Object[] params = source.getParams();
       assertNull(params);
@@ -112,6 +117,9 @@
       assertEquals(binding.getPort() + mockStore.getDefaultPortOffset(SERVER), testee.getIntBinding(SVC_NAME, BINDING_NAME, binding.getHostName(), binding.getPort()));
       mockStore.setBinding(null);
       assertEquals(binding.getPort() + mockStore.getDefaultPortOffset(SERVER), testee.getIntBinding(SVC_NAME, BINDING_NAME, null, binding.getPort()));
+      mockStore.setBinding(null);
+      assertEquals(binding.getPort(), testee.getIntBinding(SVC_NAME, BINDING_NAME, binding.getHostName(), binding.getPort(), true, true));
+      
    }
 
 
@@ -136,7 +144,9 @@
    {
       InetAddress result = InetAddress.getByName("localhost");
       MockServiceBindingValueSource source = new MockServiceBindingValueSource(result);
-      binding.setServiceBindingValueSource(source);
+      bindingMetadata.setServiceBindingValueSource(source);
+      binding = new ServiceBinding(bindingMetadata, HOST, 0); 
+      mockStore.setBinding(binding);
       assertEquals(result, testee.getInetAddressBinding(SVC_NAME, BINDING_NAME));
       Object[] params = source.getParams();
       assertNull(params);
@@ -148,6 +158,10 @@
       assertEquals(binding.getBindAddress(), testee.getInetAddressBinding(SVC_NAME, BINDING_NAME, binding.getHostName(), binding.getPort()));
       mockStore.setBinding(null);
       assertEquals(InetAddress.getByName(mockStore.getDefaultHostName(SERVER)), testee.getInetAddressBinding(SVC_NAME, BINDING_NAME, null, binding.getPort()));
+      mockStore.setBinding(null);
+      assertEquals(InetAddress.getByName(mockStore.getDefaultHostName(SERVER)), testee.getInetAddressBinding(SVC_NAME, BINDING_NAME, binding.getHostName(), binding.getPort(), false, false));
+      mockStore.setBinding(null);
+      assertEquals(InetAddress.getByName(null), testee.getInetAddressBinding(SVC_NAME, BINDING_NAME, null, binding.getPort(), true, true));
    }
 
    /**
@@ -170,7 +184,9 @@
    public void testGetStringBindingViaGeneric() throws Exception
    {
       MockServiceBindingValueSource source = new MockServiceBindingValueSource(SVC_NAME);
-      binding.setServiceBindingValueSource(source);
+      bindingMetadata.setServiceBindingValueSource(source);
+      binding = new ServiceBinding(bindingMetadata, HOST, 0); 
+      mockStore.setBinding(binding);
       assertEquals(SVC_NAME, testee.getStringBinding(SVC_NAME, BINDING_NAME, INPUT));
       Object[] params = source.getParams();
       assertNotNull(params);
@@ -184,6 +200,10 @@
       assertEquals(binding.getHostName(), testee.getStringBinding(SVC_NAME, BINDING_NAME, INPUT, binding.getHostName(), binding.getPort()));
       mockStore.setBinding(null);
       assertEquals(InetAddress.getByName(mockStore.getDefaultHostName(SERVER)).getHostName(), testee.getStringBinding(SVC_NAME, BINDING_NAME, INPUT, null, binding.getPort()));
+      mockStore.setBinding(null);
+      assertEquals(InetAddress.getByName(mockStore.getDefaultHostName(SERVER)).getHostName(), testee.getStringBinding(SVC_NAME, BINDING_NAME, INPUT, binding.getHostName(), binding.getPort(), false, false));
+      mockStore.setBinding(null);
+      assertEquals(InetAddress.getByName(null).getHostName(), testee.getStringBinding(SVC_NAME, BINDING_NAME, INPUT, null, binding.getPort(), true, true));
    }
 
    /**
@@ -217,7 +237,9 @@
       editor.setAsText(ELEMENT_INPUT);
       Element result = (Element) editor.getValue();
       MockServiceBindingValueSource source = new MockServiceBindingValueSource(result);
-      binding.setServiceBindingValueSource(source);
+      bindingMetadata.setServiceBindingValueSource(source);
+      binding = new ServiceBinding(bindingMetadata, HOST, 0); 
+      mockStore.setBinding(binding);
       assertEquals(result, testee.getElementBinding(SVC_NAME, BINDING_NAME, result));
       Object[] params = source.getParams();
       assertNotNull(params);
@@ -227,7 +249,9 @@
    
    public void testGetElementBindingViaXSLT() throws Exception
    {
-      binding.setServiceBindingValueSourceConfig(getXSLTConfig());
+      bindingMetadata.setServiceBindingValueSourceConfig(getXSLTConfig());
+      binding = new ServiceBinding(bindingMetadata, HOST, 0); 
+      mockStore.setBinding(binding);
       
       Element input = getDocumentElementFromClasspath(XSL_INPUT);
       Element output = testee.getElementBinding(SVC_NAME, BINDING_NAME, input);
@@ -279,7 +303,9 @@
    {
       URL result = new File(getFullyQualifiedResourceName("input.xml")).toURL();
       MockServiceBindingValueSource source = new MockServiceBindingValueSource(result);
-      binding.setServiceBindingValueSource(source);
+      bindingMetadata.setServiceBindingValueSource(source);
+      binding = new ServiceBinding(bindingMetadata, HOST, 0); 
+      mockStore.setBinding(binding);
       assertEquals(result, testee.getURLBinding(SVC_NAME, BINDING_NAME, result));
       Object[] params = source.getParams();
       assertNotNull(params);
@@ -289,7 +315,9 @@
    
    public void testGetURLBindingViaXSLT() throws Exception
    {
-      binding.setServiceBindingValueSourceConfig(getXSLTConfig());
+      bindingMetadata.setServiceBindingValueSourceConfig(getXSLTConfig());
+      binding = new ServiceBinding(bindingMetadata, HOST, 0); 
+      mockStore.setBinding(binding);
       
       URL input = Thread.currentThread().getContextClassLoader().getResource(XSL_INPUT);
       URL output = testee.getURLBinding(SVC_NAME, BINDING_NAME, input);
@@ -310,9 +338,14 @@
       
       mockStore.setBinding(null);
       output = testee.getURLBinding(SVC_NAME, BINDING_NAME, input, null, binding.getPort());
-
       assertNotNull(output);
       element = getDocumentElement(output);
+      validateOutputElement(element, true, true);      
+      
+      mockStore.setBinding(null);
+      output = testee.getURLBinding(SVC_NAME, BINDING_NAME, input, binding.getHostName(), binding.getPort(), false, false);
+      assertNotNull(output);
+      element = getDocumentElement(output);
       validateOutputElement(element, true, true);  
    }
 
@@ -344,7 +377,9 @@
    public void testGetResourceBindingViaGeneric() throws Exception
    {
       MockServiceBindingValueSource source = new MockServiceBindingValueSource(SVC_NAME);
-      binding.setServiceBindingValueSource(source);
+      bindingMetadata.setServiceBindingValueSource(source);
+      binding = new ServiceBinding(bindingMetadata, HOST, 0); 
+      mockStore.setBinding(binding);
       assertEquals(SVC_NAME, testee.getResourceBinding(SVC_NAME, BINDING_NAME, INPUT));
       Object[] params = source.getParams();
       assertNotNull(params);
@@ -354,7 +389,9 @@
    
    public void testGetResourceBindingViaXSLT() throws Exception
    {
-      binding.setServiceBindingValueSourceConfig(getXSLTConfig());
+      bindingMetadata.setServiceBindingValueSourceConfig(getXSLTConfig());
+      binding = new ServiceBinding(bindingMetadata, HOST, 0); 
+      mockStore.setBinding(binding);
       
       String output = testee.getResourceBinding(SVC_NAME, BINDING_NAME, XSL_INPUT);
       assertNotNull(output);
@@ -373,9 +410,14 @@
       
       mockStore.setBinding(null);
       output = testee.getResourceBinding(SVC_NAME, BINDING_NAME, input, null, binding.getPort());
-
       assertNotNull(output);
       element = getDocumentElement(output);
+      validateOutputElement(element, true, true);       
+      
+      mockStore.setBinding(null);
+      output = testee.getResourceBinding(SVC_NAME, BINDING_NAME, input, binding.getHostName(), binding.getPort(), false, false);
+      assertNotNull(output);
+      element = getDocumentElement(output);
       validateOutputElement(element, true, true);  
    }
 
@@ -384,9 +426,10 @@
     */
    public void testGetGenericBindingStringObjectArray() throws Exception
    {
+      MockServiceBindingValueSource source = new MockServiceBindingValueSource(SVC_NAME);
+      noNameMetadata.setServiceBindingValueSource(source);
+      noNameBinding = new ServiceBinding(noNameMetadata, HOST, 0); 
       mockStore.setBinding(noNameBinding);
-      MockServiceBindingValueSource source = new MockServiceBindingValueSource(SVC_NAME);
-      noNameBinding.setServiceBindingValueSource(source);
       assertEquals(SVC_NAME, testee.getGenericBinding(SVC_NAME, null, INPUT));
       Object[] params = source.getParams();
       assertNotNull(params);
@@ -400,7 +443,9 @@
    public void testGetGenericBindingStringStringObjectArray() throws Exception
    {
       MockServiceBindingValueSource source = new MockServiceBindingValueSource(SVC_NAME);
-      binding.setServiceBindingValueSource(source);
+      bindingMetadata.setServiceBindingValueSource(source);
+      binding = new ServiceBinding(bindingMetadata, HOST, 0); 
+      mockStore.setBinding(binding);
       assertEquals(SVC_NAME, testee.getGenericBinding(SVC_NAME, BINDING_NAME, INPUT));
       Object[] params = source.getParams();
       assertNotNull(params);

Added: trunk/varia/src/tests/org/jboss/test/services/binding/test/ServiceBindingMetadataTestCase.java
===================================================================
--- trunk/varia/src/tests/org/jboss/test/services/binding/test/ServiceBindingMetadataTestCase.java	                        (rev 0)
+++ trunk/varia/src/tests/org/jboss/test/services/binding/test/ServiceBindingMetadataTestCase.java	2008-12-01 04:43:06 UTC (rev 81879)
@@ -0,0 +1,334 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2008, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+
+package org.jboss.test.services.binding.test;
+
+import junit.framework.TestCase;
+
+import org.jboss.services.binding.ServiceBindingMetadata;
+
+/**
+ * @author Brian Stansberry
+ *
+ */
+public class ServiceBindingMetadataTestCase extends TestCase
+{
+   private static final String S = "S";
+   private static final String B = "B";
+   private static final String H = "H";
+   private static final String FQN = S + ":" + B;
+   
+   /**
+    * Test method for {@link org.jboss.services.binding.ServiceBindingMetadata#ServiceBindingMetadata(java.lang.String)}.
+    */
+   public void testServiceBindingMetadataString()
+   {
+      ServiceBindingMetadata md = new ServiceBindingMetadata(S);
+      assertEquals(S, md.getServiceName());
+      
+      assertFalse(md.isFixedHostName());
+      assertFalse(md.isFixedPort());
+    
+      try
+      {
+         String svcName = null;
+         md = new ServiceBindingMetadata(svcName);
+         fail("null serviceName allowed");
+      }
+      catch (IllegalArgumentException good) {}
+   }
+   
+   /**
+    * Test method for {@link org.jboss.services.binding.ServiceBindingMetadata#ServiceBindingMetadata(java.lang.String, java.lang.String)}.
+    */
+   public void testServiceBindingMetadataStringString()
+   {
+      ServiceBindingMetadata md = new ServiceBindingMetadata(S, B);
+      assertEquals(S, md.getServiceName());
+      assertEquals(B, md.getBindingName());
+      
+      assertFalse(md.isFixedHostName());
+      assertFalse(md.isFixedPort());
+      
+      md = new ServiceBindingMetadata(S, null);
+      assertEquals(S, md.getServiceName());
+      assertEquals(null, md.getBindingName());
+      
+      assertFalse(md.isFixedHostName());
+      assertFalse(md.isFixedPort());
+    
+      try
+      {
+         md = new ServiceBindingMetadata(null, B);
+         fail("null serviceName allowed");
+      }
+      catch (IllegalArgumentException good) {}
+   }
+
+   /**
+    * Test method for {@link org.jboss.services.binding.ServiceBindingMetadata#ServiceBindingMetadata(java.lang.String, java.lang.String, java.lang.String, int)}.
+    */
+   public void testServiceBindingMetadataStringStringStringInt()
+   {
+      ServiceBindingMetadata md = new ServiceBindingMetadata(S, B, H, 1);
+      assertEquals(S, md.getServiceName());
+      assertEquals(B, md.getBindingName());
+      assertEquals(H, md.getHostName());
+      assertEquals(1, md.getPort());
+      assertFalse(md.isFixedPort());
+      assertTrue(md.isFixedHostName());
+      
+      md = new ServiceBindingMetadata(S, null, null, 1);
+      assertEquals(S, md.getServiceName());
+      assertEquals(null, md.getBindingName());
+      assertEquals(null, md.getHostName());
+      assertEquals(1, md.getPort());
+      assertFalse(md.isFixedPort());
+      assertFalse(md.isFixedHostName());
+    
+      try
+      {
+         md = new ServiceBindingMetadata(null, B, H, 1);
+         fail("null serviceName allowed");
+      }
+      catch (IllegalArgumentException good) {}
+   }
+
+   /**
+    * Test method for {@link org.jboss.services.binding.ServiceBindingMetadata#ServiceBindingMetadata(java.lang.String, java.lang.String, java.lang.String, int, boolean, boolean)}.
+    */
+   public void testServiceBindingMetadataStringStringStringIntBooleanBoolean()
+   {
+      ServiceBindingMetadata md = new ServiceBindingMetadata(S, B, H, 1, true, true);
+      assertEquals(S, md.getServiceName());
+      assertEquals(B, md.getBindingName());
+      assertEquals(H, md.getHostName());
+      assertEquals(1, md.getPort());
+      assertTrue(md.isFixedPort());
+      assertTrue(md.isFixedHostName());
+      
+      md = new ServiceBindingMetadata(S, null, null, 1, true, true);
+      assertEquals(S, md.getServiceName());
+      assertEquals(null, md.getBindingName());
+      assertEquals(null, md.getHostName());
+      assertEquals(1, md.getPort());
+      assertTrue(md.isFixedPort());
+      assertTrue(md.isFixedHostName());
+    
+      try
+      {
+         md = new ServiceBindingMetadata(null, B, H, 1, true, true);
+         fail("null serviceName allowed");
+      }
+      catch (IllegalArgumentException good) {}
+   }
+
+   /**
+    * Test method for {@link org.jboss.services.binding.ServiceBindingMetadata#setServiceName(java.lang.String)}.
+    */
+   public void testSetServiceName()
+   {
+      ServiceBindingMetadata md = new ServiceBindingMetadata();
+      md.setServiceName(S);
+      assertEquals(S, md.getServiceName());
+    
+      try
+      {
+         md.setServiceName(null);
+         fail("null serviceName allowed");
+      }
+      catch (IllegalArgumentException good) {}
+   }
+
+   /**
+    * Test method for {@link org.jboss.services.binding.ServiceBindingMetadata#setBindingName(java.lang.String)}.
+    */
+   public void testSetBindingName()
+   {
+      ServiceBindingMetadata md = new ServiceBindingMetadata();
+      md.setBindingName(B);
+      assertEquals(B, md.getBindingName());
+      md.setBindingName(null);
+      assertEquals(null, md.getBindingName());
+   }
+
+   /**
+    * Test method for {@link org.jboss.services.binding.ServiceBindingMetadata#getFullyQualifiedName()}.
+    */
+   public void testGetFullyQualifiedName()
+   {
+      ServiceBindingMetadata md = new ServiceBindingMetadata(S, B);
+      assertEquals(FQN, md.getFullyQualifiedName());
+      
+      md = new ServiceBindingMetadata(S, null);
+      assertEquals(S,md.getFullyQualifiedName());
+      
+      md = new ServiceBindingMetadata();
+      try
+      {
+         md.getFullyQualifiedName();
+         fail("getFullyQualifiedName should fail with no serviceName set");
+      }
+      catch (IllegalStateException good) {}
+   }
+
+   /**
+    * Test method for {@link org.jboss.services.binding.ServiceBindingMetadata#setHostName(java.lang.String)}.
+    */
+   public void testSetHostName()
+   {
+      ServiceBindingMetadata md = new ServiceBindingMetadata();
+      md.setHostName(H);
+      assertEquals(H, md.getHostName());
+   }
+
+   /**
+    * Test method for {@link org.jboss.services.binding.ServiceBindingMetadata#setPort(int)}.
+    */
+   public void testSetPort()
+   {
+      ServiceBindingMetadata md = new ServiceBindingMetadata();
+      md.setPort(2);
+      assertEquals(2, md.getPort());
+   }
+
+   /**
+    * Test method for {@link org.jboss.services.binding.ServiceBindingMetadata#setServiceBindingValueSource(org.jboss.services.binding.ServiceBindingValueSource)}.
+    */
+   public void testSetServiceBindingValueSource()
+   {
+      ServiceBindingMetadata md = new ServiceBindingMetadata();
+      MockServiceBindingValueSource mock = new MockServiceBindingValueSource();
+      md.setServiceBindingValueSource(mock);
+      assertSame(mock, md.getServiceBindingValueSource());
+      assertEquals(mock.getClass().getName(), md.getServiceBindingValueSourceClassName());
+   }
+
+   /**
+    * Test method for {@link org.jboss.services.binding.ServiceBindingMetadata#setServiceBindingValueSourceClassName(java.lang.String)}.
+    */
+   public void testSetServiceBindingValueSourceClassName()
+   {
+      ServiceBindingMetadata md = new ServiceBindingMetadata();
+      md.setServiceBindingValueSourceClassName(S);
+      assertEquals(S, md.getServiceBindingValueSourceClassName());
+   }
+
+   /**
+    * Test method for {@link org.jboss.services.binding.ServiceBindingMetadata#setServiceBindingValueSourceConfig(java.lang.Object)}.
+    */
+   public void testSetServiceBindingValueSourceConfig()
+   {
+      ServiceBindingMetadata md = new ServiceBindingMetadata();
+      Object config = new Object();
+      md.setServiceBindingValueSourceConfig(config);
+      assertSame(config, md.getServiceBindingValueSourceConfig());
+   }
+
+   /**
+    * Test method for {@link org.jboss.services.binding.ServiceBindingMetadata#setFixedPort(boolean)}.
+    */
+   public void testSetFixedPort()
+   {
+      ServiceBindingMetadata md = new ServiceBindingMetadata();
+      assertFalse(md.isFixedPort());
+      md.setFixedPort(true);
+      assertTrue(md.isFixedPort());
+   }
+
+   /**
+    * Test method for {@link org.jboss.services.binding.ServiceBindingMetadata#setFixedHostName(boolean)}.
+    */
+   public void testSetFixedHostName()
+   {
+      ServiceBindingMetadata md = new ServiceBindingMetadata();
+      assertFalse(md.isFixedHostName());
+      md.setFixedHostName(true);
+      assertTrue(md.isFixedHostName());
+   }
+
+   /**
+    * Test method for {@link org.jboss.services.binding.ServiceBindingMetadata#equals(java.lang.Object)}.
+    */
+   public void testEqualsObject()
+   {
+      ServiceBindingMetadata md1 = new ServiceBindingMetadata();
+      ServiceBindingMetadata md2 = new ServiceBindingMetadata();
+      try
+      {
+         md1.equals(md2);
+         fail("equals should fail with unset serviceName");
+      }
+      catch (IllegalStateException good) {}
+      
+      md1 = new ServiceBindingMetadata(S, B);
+      md2 = new ServiceBindingMetadata(S, null);
+      assertFalse(md1.equals(md2));
+      assertFalse(md2.equals(md1));
+      
+      md2 = new ServiceBindingMetadata(B, B);
+      assertFalse(md1.equals(md2));
+      assertFalse(md2.equals(md1));
+      
+      md2 = new ServiceBindingMetadata(S, B);
+      md2.setHostName(H);
+      md2.setPort(10);
+      md2.setServiceBindingValueSource(new MockServiceBindingValueSource());
+      md2.setServiceBindingValueSourceConfig(new Object());
+      assertTrue(md1.equals(md2));
+      assertTrue(md2.equals(md1));
+   }
+   
+   /**
+    * Test method for {@link ServiceBindingMetadata#compareTo(ServiceBindingMetadata)}
+    */
+   public void testCompareTo()
+   {
+      ServiceBindingMetadata md1 = new ServiceBindingMetadata();
+      ServiceBindingMetadata md2 = new ServiceBindingMetadata();
+      try
+      {
+         md1.compareTo(md2);
+         fail("compareTo should fail with unset serviceName");
+      }
+      catch (IllegalStateException good) {}
+      
+      md1 = new ServiceBindingMetadata(S, B);
+      md2 = new ServiceBindingMetadata(S, null);
+      assertTrue(md1.compareTo(md2) > 0);
+      assertTrue(md2.compareTo(md1) < 0);
+      
+      md2 = new ServiceBindingMetadata(B, B);
+      assertTrue(md1.compareTo(md2) > 0);
+      assertTrue(md2.compareTo(md1) < 0);
+      
+      md2 = new ServiceBindingMetadata(S, B);
+      md2.setHostName(H);
+      md2.setPort(10);
+      md2.setServiceBindingValueSource(new MockServiceBindingValueSource());
+      md2.setServiceBindingValueSourceConfig(new Object());
+      assertEquals(0, md1.compareTo(md2));
+      assertEquals(0, md2.compareTo(md1));
+      
+   }
+
+}

Modified: trunk/varia/src/tests/org/jboss/test/services/binding/test/ServiceBindingSetUnitTestCase.java
===================================================================
--- trunk/varia/src/tests/org/jboss/test/services/binding/test/ServiceBindingSetUnitTestCase.java	2008-12-01 03:07:05 UTC (rev 81878)
+++ trunk/varia/src/tests/org/jboss/test/services/binding/test/ServiceBindingSetUnitTestCase.java	2008-12-01 04:43:06 UTC (rev 81879)
@@ -29,8 +29,7 @@
 
 import junit.framework.TestCase;
 
-import org.jboss.services.binding.ManagedServiceBinding;
-import org.jboss.services.binding.ServiceBinding;
+import org.jboss.services.binding.ServiceBindingMetadata;
 import org.jboss.services.binding.impl.ServiceBindingSet;
 
 /**
@@ -44,11 +43,11 @@
    private static final String A = "A";
    private static final String B = "B";
    
-   private static ManagedServiceBinding AA;
-   private static ManagedServiceBinding AB;
-   private static ManagedServiceBinding Anull;
+   private static ServiceBindingMetadata AA;
+   private static ServiceBindingMetadata AB;
+   private static ServiceBindingMetadata Anull;
 
-   private Set<ManagedServiceBinding> bindings = new HashSet<ManagedServiceBinding>();
+   private Set<ServiceBindingMetadata> bindings = new HashSet<ServiceBindingMetadata>();
    
    /**
     * Create a new ServiceBindingSetUnitTestCase.
@@ -64,20 +63,20 @@
    {
       super.setUp();
       
-      AA = new ManagedServiceBinding(A, A, "localhost", 1);
-      AB = new ManagedServiceBinding(A, B, "localhost", 1);
-      Anull = new ManagedServiceBinding(A, null, "localhost", 1);
+      AA = new ServiceBindingMetadata(A, A, "localhost", 1, false, false);
+      AB = new ServiceBindingMetadata(A, B, "localhost", 1, false, false);
+      Anull = new ServiceBindingMetadata(A, null, "localhost", 1, false, false);
       
       bindings.addAll(Arrays.asList(AA, AB, Anull));
    }
    
    public void testBasicConstructor() throws UnknownHostException
    {
-      ServiceBindingSet set = new ServiceBindingSet(A, new HashSet<ManagedServiceBinding>(bindings));
+      ServiceBindingSet set = new ServiceBindingSet(A, new HashSet<ServiceBindingMetadata>(bindings));
       
       assertEquals(A, set.getName());
       
-      for (ServiceBinding binding : set.getOverrideBindings())
+      for (ServiceBindingMetadata binding : set.getOverrideBindings())
       {
          assertEquals(1, binding.getPort());
          assertTrue(bindings.remove(binding));
@@ -107,11 +106,11 @@
    
    public void testOffsetConstructorWithDefaultHost() throws UnknownHostException
    {
-      ServiceBindingSet set = new ServiceBindingSet(A, "192.168.0.10", 5, new HashSet<ManagedServiceBinding>(bindings));
+      ServiceBindingSet set = new ServiceBindingSet(A, "192.168.0.10", 5, new HashSet<ServiceBindingMetadata>(bindings));
       
       assertEquals(A, set.getName());
       
-      for (ServiceBinding binding : set.getOverrideBindings())
+      for (ServiceBindingMetadata binding : set.getOverrideBindings())
       {
          assertEquals(1, binding.getPort());
          assertTrue(bindings.remove(binding));
@@ -129,8 +128,8 @@
     */
    public void testOverrideConstructor() throws UnknownHostException
    {
-      ServiceBindingSet set = new ServiceBindingSet(A, new HashSet<ManagedServiceBinding>(bindings));
-      for (ServiceBinding binding : set.getOverrideBindings())
+      ServiceBindingSet set = new ServiceBindingSet(A, new HashSet<ServiceBindingMetadata>(bindings));
+      for (ServiceBindingMetadata binding : set.getOverrideBindings())
       {         
          assertTrue(bindings.remove(binding));
          

Modified: trunk/varia/src/tests/org/jboss/test/services/binding/test/ServiceBindingTestBase.java
===================================================================
--- trunk/varia/src/tests/org/jboss/test/services/binding/test/ServiceBindingTestBase.java	2008-12-01 03:07:05 UTC (rev 81878)
+++ trunk/varia/src/tests/org/jboss/test/services/binding/test/ServiceBindingTestBase.java	2008-12-01 04:43:06 UTC (rev 81879)
@@ -35,8 +35,12 @@
 import javax.xml.parsers.DocumentBuilder;
 import javax.xml.parsers.DocumentBuilderFactory;
 
+import junit.framework.Assert;
+import junit.framework.TestCase;
+
 import org.jboss.bootstrap.spi.ServerConfig;
 import org.jboss.services.binding.ServiceBinding;
+import org.jboss.services.binding.ServiceBindingMetadata;
 import org.jboss.services.binding.impl.XSLTServiceBindingValueSourceConfig;
 import org.jboss.util.propertyeditor.ElementEditor;
 import org.jboss.util.xml.JBossEntityResolver;
@@ -45,9 +49,6 @@
 import org.w3c.dom.NodeList;
 import org.xml.sax.InputSource;
 
-import junit.framework.Assert;
-import junit.framework.TestCase;
-
 /**
  * Base class for service binding manager related test classes.
  * 
@@ -68,6 +69,7 @@
    protected static final String OTHER_VALUE = "ABC";
    protected static final String XSL_INPUT = getFullyQualifiedResourceName("xslt_input.xml");
    
+   protected ServiceBindingMetadata bindingMetadata;
    protected ServiceBinding binding;
    
    private PropertyEditor existingElementEditor;
@@ -96,7 +98,8 @@
       if (serverTempDir == null)
          System.setProperty(ServerConfig.SERVER_TEMP_DIR, System.getProperty("java.io.tmpdir"));
       
-      binding = new ServiceBinding(SVC_NAME, BINDING_NAME, HOST, PORT);
+      bindingMetadata = new ServiceBindingMetadata(SVC_NAME, BINDING_NAME, HOST, PORT, false, false);
+      binding = new ServiceBinding(bindingMetadata, HOST, 0);
    }
 
    @Override

Modified: trunk/varia/src/tests/org/jboss/test/services/binding/test/ServiceBindingUnitTestCase.java
===================================================================
--- trunk/varia/src/tests/org/jboss/test/services/binding/test/ServiceBindingUnitTestCase.java	2008-12-01 03:07:05 UTC (rev 81878)
+++ trunk/varia/src/tests/org/jboss/test/services/binding/test/ServiceBindingUnitTestCase.java	2008-12-01 04:43:06 UTC (rev 81879)
@@ -25,6 +25,7 @@
 import java.net.InetAddress;
 
 import org.jboss.services.binding.ServiceBinding;
+import org.jboss.services.binding.ServiceBindingMetadata;
 import org.jboss.services.binding.impl.XSLTServiceBindingValueSourceImpl;
 
 import junit.framework.TestCase;
@@ -48,26 +49,46 @@
       super(name);
    }
    
+   public void testNullMetadata() throws Exception
+   {
+      try
+      {
+         new ServiceBinding(null, "host", 0);
+         fail("null metadata should fail");
+      }
+      catch (IllegalArgumentException good) {}
+   }
+   
    public void testNullServiceName() throws Exception
    {
       try
       {
-         new ServiceBinding(null, 1);
+         new ServiceBinding(new ServiceBindingMetadata(), "host", 0);
          fail("null serviceName should fail");
       }
-      catch (IllegalArgumentException good) {}
+      catch (IllegalStateException good) {}
    }
 
    /**
     * Test method for {@link org.jboss.services.binding.ServiceBinding#getServiceBindingValueSource()}.
     */
-   public void testServiceBindingValueSourceClassName() throws Exception
+   public void testServiceBindingValueSource() throws Exception
    {
-      ServiceBinding binding = new ServiceBinding("test", 1);
+      ServiceBindingMetadata metadata = new ServiceBindingMetadata("svc");
       String className = XSLTServiceBindingValueSourceImpl.class.getName();
-      binding.setServiceBindingValueSourceClassName(className);
+      metadata.setServiceBindingValueSourceClassName(className);
+      ServiceBinding binding = new ServiceBinding(metadata, "localhost", 1);
       assertEquals(className, binding.getServiceBindingValueSourceClassName());
       assertTrue(binding.getServiceBindingValueSource() instanceof XSLTServiceBindingValueSourceImpl);
+      
+      MockServiceBindingValueSource mock = new MockServiceBindingValueSource();
+      metadata.setServiceBindingValueSource(mock);
+      Object config = new Object();
+      metadata.setServiceBindingValueSourceConfig(config);
+      binding = new ServiceBinding(metadata, "localhost", 1);
+      assertSame(mock, binding.getServiceBindingValueSource());
+      assertEquals(mock.getClass().getName(), binding.getServiceBindingValueSourceClassName());
+      assertSame(config, binding.getServiceBindingValueSourceConfig());
    }
 
    /**
@@ -75,18 +96,18 @@
     */
    public void testGetOffsetBinding() throws Exception
    {
-      ServiceBinding binding = new ServiceBinding("svc", "binding", "192.168.0.2", 1);
+      ServiceBindingMetadata metadata = new ServiceBindingMetadata("svc", "binding", "192.168.0.2", 1, false, true);
       String className = XSLTServiceBindingValueSourceImpl.class.getName();
-      binding.setServiceBindingValueSourceClassName(className);
+      metadata.setServiceBindingValueSourceClassName(className);
       
-      ServiceBinding binding2 = binding.getOffsetBinding(10);
-      assertEquals(binding.getServiceName(), binding2.getServiceName());
-      assertEquals(binding.getBindingName(), binding2.getBindingName());
-      assertEquals(binding.getHostName(), binding2.getHostName());
-      assertEquals(binding.getBindAddress(), binding2.getBindAddress());
+      ServiceBinding binding = new ServiceBinding(metadata, "192.168.0.2", 10);
+      assertEquals(metadata.getServiceName(), binding.getServiceName());
+      assertEquals(metadata.getBindingName(), binding.getBindingName());
+      assertEquals(metadata.getHostName(), binding.getHostName());
+      assertEquals(InetAddress.getByName(metadata.getHostName()), binding.getBindAddress());
       
-      assertEquals(1, binding.getPort());
-      assertEquals(11, binding2.getPort());
+      assertEquals(1, metadata.getPort());
+      assertEquals(11, binding.getPort());
    }
 
    /**
@@ -94,31 +115,25 @@
     */
    public void testGetOffsetBindingWithHost() throws Exception
    {
-      ServiceBinding binding = new ServiceBinding("svc", "binding", "192.168.0.2", 1);
-      String className = XSLTServiceBindingValueSourceImpl.class.getName();
-      binding.setServiceBindingValueSourceClassName(className);
+      ServiceBindingMetadata metadata = new ServiceBindingMetadata("svc", "binding", "192.168.0.2", 1, false, true);
+      ServiceBinding binding = new ServiceBinding(metadata, "192.168.0.3", 10);
+      assertEquals(metadata.getServiceName(), binding.getServiceName());
+      assertEquals(metadata.getBindingName(), binding.getBindingName());
+      assertEquals(metadata.getHostName(), binding.getHostName());
+      assertEquals(InetAddress.getByName(metadata.getHostName()), binding.getBindAddress());
       
-      ServiceBinding binding2 = binding.getOffsetBinding(10, "192.168.0.3");
-      assertEquals(binding.getServiceName(), binding2.getServiceName());
-      assertEquals(binding.getBindingName(), binding2.getBindingName());
-      assertEquals(binding.getHostName(), binding2.getHostName());
-      assertEquals(binding.getBindAddress(), binding2.getBindAddress());
+      assertEquals(1, metadata.getPort());
+      assertEquals(11, binding.getPort());
       
-      assertEquals(1, binding.getPort());
-      assertEquals(11, binding2.getPort());
+      metadata = new ServiceBindingMetadata("svc", "binding", "192.168.0.2", 1, false, false);
+      binding =  new ServiceBinding(metadata, "192.168.0.3", 10);
+      assertEquals(metadata.getServiceName(), binding.getServiceName());
+      assertEquals(metadata.getBindingName(), binding.getBindingName());
+      assertEquals("192.168.0.3", binding.getHostName());
+      assertEquals(InetAddress.getByName("192.168.0.3"), binding.getBindAddress());
       
-      binding = new ServiceBinding("svc", "binding", null, 1);
-      className = XSLTServiceBindingValueSourceImpl.class.getName();
-      binding.setServiceBindingValueSourceClassName(className);
-      
-      binding2 = binding.getOffsetBinding(10, "192.168.0.3");
-      assertEquals(binding.getServiceName(), binding2.getServiceName());
-      assertEquals(binding.getBindingName(), binding2.getBindingName());
-      assertEquals("192.168.0.3", binding2.getHostName());
-      assertEquals(InetAddress.getByName("192.168.0.3"), binding2.getBindAddress());
-      
-      assertEquals(1, binding.getPort());
-      assertEquals(11, binding2.getPort());
+      assertEquals(1, metadata.getPort());
+      assertEquals(11, binding.getPort());
    }
 
    /**
@@ -126,14 +141,14 @@
     */
    public void testEquals() throws Exception
    {
-      ServiceBinding bindingAA0 = new ServiceBinding("A", "A", "192.168.0.2", 1);
-      ServiceBinding bindingAA1 = new ServiceBinding("A", "A", "192.168.0.2", 2);
-      ServiceBinding bindingAA2 = new ServiceBinding("A", "A", "192.168.0.1", 1);
-      ServiceBinding bindingAB = new ServiceBinding("A", "B", "192.168.0.2", 1);
-      ServiceBinding bindingBA = new ServiceBinding("B", "A", "192.168.0.2", 1);
-      ServiceBinding bindingAnull = new ServiceBinding("A", null, "192.168.0.2", 1);
-      ServiceBinding bindingBnull = new ServiceBinding("B", null, "192.168.0.2", 1);
-      ServiceBinding bindingBnull1 = new ServiceBinding("B", null, "192.168.0.2", 2);
+      ServiceBinding bindingAA0 = new ServiceBinding(new ServiceBindingMetadata("A", "A"), "192.168.0.2", 1);
+      ServiceBinding bindingAA1 = new ServiceBinding(new ServiceBindingMetadata("A", "A"), "192.168.0.2", 2);
+      ServiceBinding bindingAA2 = new ServiceBinding(new ServiceBindingMetadata("A", "A"), "192.168.0.1", 1);
+      ServiceBinding bindingAB = new ServiceBinding(new ServiceBindingMetadata("A", "B"), "192.168.0.2", 1);
+      ServiceBinding bindingBA = new ServiceBinding(new ServiceBindingMetadata("B", "A"), "192.168.0.2", 1);
+      ServiceBinding bindingAnull = new ServiceBinding(new ServiceBindingMetadata("A", null), "192.168.0.2", 1);
+      ServiceBinding bindingBnull = new ServiceBinding(new ServiceBindingMetadata("B", null), "192.168.0.2", 1);
+      ServiceBinding bindingBnull1 = new ServiceBinding(new ServiceBindingMetadata("B", null), "192.168.0.2", 2);
       
       assertEquals(bindingAA0, bindingAA1);
       assertEquals(bindingAA0, bindingAA2);
@@ -155,14 +170,14 @@
     */
    public void testHashCode() throws Exception
    {
-      ServiceBinding bindingAA0 = new ServiceBinding("A", "A", "192.168.0.2", 1);
-      ServiceBinding bindingAA1 = new ServiceBinding("A", "A", "192.168.0.2", 2);
-      ServiceBinding bindingAA2 = new ServiceBinding("A", "A", "192.168.0.1", 1);
-      ServiceBinding bindingAB = new ServiceBinding("A", "B", "192.168.0.2", 1);
-      ServiceBinding bindingBA = new ServiceBinding("B", "A", "192.168.0.2", 1);
-      ServiceBinding bindingAnull = new ServiceBinding("A", null, "192.168.0.2", 1);
-      ServiceBinding bindingBnull = new ServiceBinding("B", null, "192.168.0.2", 1);
-      ServiceBinding bindingBnull1 = new ServiceBinding("B", null, "192.168.0.2", 2);
+      ServiceBinding bindingAA0 = new ServiceBinding(new ServiceBindingMetadata("A", "A"), "192.168.0.2", 1);
+      ServiceBinding bindingAA1 = new ServiceBinding(new ServiceBindingMetadata("A", "A"), "192.168.0.2", 2);
+      ServiceBinding bindingAA2 = new ServiceBinding(new ServiceBindingMetadata("A", "A"), "192.168.0.1", 1);
+      ServiceBinding bindingAB = new ServiceBinding(new ServiceBindingMetadata("A", "B"), "192.168.0.2", 1);
+      ServiceBinding bindingBA = new ServiceBinding(new ServiceBindingMetadata("B", "A"), "192.168.0.2", 1);
+      ServiceBinding bindingAnull = new ServiceBinding(new ServiceBindingMetadata("A", null), "192.168.0.2", 1);
+      ServiceBinding bindingBnull = new ServiceBinding(new ServiceBindingMetadata("B", null), "192.168.0.2", 1);
+      ServiceBinding bindingBnull1 = new ServiceBinding(new ServiceBindingMetadata("B", null), "192.168.0.2", 2);
       
       assertEquals(bindingAA0.hashCode(), bindingAA1.hashCode());
       assertEquals(bindingAA0.hashCode(), bindingAA2.hashCode());

Modified: trunk/varia/src/tests/org/jboss/test/services/binding/test/SimpleServiceBindingValueSourceUnitTestCase.java
===================================================================
--- trunk/varia/src/tests/org/jboss/test/services/binding/test/SimpleServiceBindingValueSourceUnitTestCase.java	2008-12-01 03:07:05 UTC (rev 81878)
+++ trunk/varia/src/tests/org/jboss/test/services/binding/test/SimpleServiceBindingValueSourceUnitTestCase.java	2008-12-01 04:43:06 UTC (rev 81879)
@@ -24,6 +24,7 @@
 
 import java.net.InetAddress;
 
+import org.jboss.services.binding.ServiceBinding;
 import org.jboss.services.binding.impl.SimpleServiceBindingValueSourceImpl;
 
 /**
@@ -92,7 +93,8 @@
    
    public void testUnknownConfigObject() throws Exception
    {
-      binding.setServiceBindingValueSourceConfig(new Object());
+      bindingMetadata.setServiceBindingValueSourceConfig(new Object());
+      binding = new ServiceBinding(bindingMetadata, HOST, 0);
       assertEquals(PORT, testee.getIntServiceBindingValue(binding));
    }
 

Modified: trunk/varia/src/tests/org/jboss/test/services/binding/test/StringReplacementServiceBindingValueSourceUnitTestCase.java
===================================================================
--- trunk/varia/src/tests/org/jboss/test/services/binding/test/StringReplacementServiceBindingValueSourceUnitTestCase.java	2008-12-01 03:07:05 UTC (rev 81878)
+++ trunk/varia/src/tests/org/jboss/test/services/binding/test/StringReplacementServiceBindingValueSourceUnitTestCase.java	2008-12-01 04:43:06 UTC (rev 81879)
@@ -26,6 +26,7 @@
 import java.beans.PropertyEditorManager;
 import java.net.URL;
 
+import org.jboss.services.binding.ServiceBinding;
 import org.jboss.services.binding.impl.StringReplacementServiceBindingValueSourceConfig;
 import org.jboss.services.binding.impl.StringReplacementServiceBindingValueSourceImpl;
 import org.w3c.dom.Element;
@@ -82,7 +83,8 @@
     */
    public void testGetStringServiceBindingValueOverrideMarkers() throws Exception
    {
-      binding.setServiceBindingValueSourceConfig(config);
+      bindingMetadata.setServiceBindingValueSourceConfig(config);
+      binding = new ServiceBinding(bindingMetadata, HOST, 0);
       assertEquals(OUTPUT, testee.getStringServiceBindingValue(binding, ALT_INPUT));
    }
 
@@ -106,7 +108,8 @@
    
    public void testGetElementServiceBindingValueOverrideMarkers() throws Exception
    {
-      binding.setServiceBindingValueSourceConfig(config);
+      bindingMetadata.setServiceBindingValueSourceConfig(config);
+      binding = new ServiceBinding(bindingMetadata, HOST, 0);
       elementBindingTest(ALT_ELEMENT_INPUT);
    }
    
@@ -139,7 +142,8 @@
    
    public void testGetResourceServiceBindingValueOverrideMarkers() throws Exception
    {
-      binding.setServiceBindingValueSourceConfig(config);
+      bindingMetadata.setServiceBindingValueSourceConfig(config);
+      binding = new ServiceBinding(bindingMetadata, HOST, 0);
       resourceBindingTest("alt_input.xml");
    }
    
@@ -172,7 +176,8 @@
    
    public void testGetURLServiceBindingValueOverrideMarkers() throws Exception
    {
-      binding.setServiceBindingValueSourceConfig(config);
+      bindingMetadata.setServiceBindingValueSourceConfig(config);
+      binding = new ServiceBinding(bindingMetadata, HOST, 0);
       urlBindingTest("alt_input.xml");
    }
    
@@ -228,13 +233,15 @@
    
    public void testGetServiceBindingValueOverrideMarkers() throws Exception
    {
-      binding.setServiceBindingValueSourceConfig(config);
+      bindingMetadata.setServiceBindingValueSourceConfig(config);
+      binding = new ServiceBinding(bindingMetadata, HOST, 0);
       assertEquals(OUTPUT, testee.getServiceBindingValue(binding, ALT_INPUT));
    }
    
    public void testUnknownConfigObject() throws Exception
    {
-      binding.setServiceBindingValueSourceConfig(new Object());
+      bindingMetadata.setServiceBindingValueSourceConfig(new Object());
+      binding = new ServiceBinding(bindingMetadata, HOST, 0);
       assertEquals(HOST, testee.getStringServiceBindingValue(binding, null));
    }
 

Modified: trunk/varia/src/tests/org/jboss/test/services/binding/test/XSLTServiceBindingValueSourceUnitTestCase.java
===================================================================
--- trunk/varia/src/tests/org/jboss/test/services/binding/test/XSLTServiceBindingValueSourceUnitTestCase.java	2008-12-01 03:07:05 UTC (rev 81878)
+++ trunk/varia/src/tests/org/jboss/test/services/binding/test/XSLTServiceBindingValueSourceUnitTestCase.java	2008-12-01 04:43:06 UTC (rev 81879)
@@ -24,6 +24,7 @@
 
 import java.net.URL;
 
+import org.jboss.services.binding.ServiceBinding;
 import org.jboss.services.binding.impl.XSLTServiceBindingValueSourceConfig;
 import org.jboss.services.binding.impl.XSLTServiceBindingValueSourceImpl;
 import org.w3c.dom.Element;
@@ -56,7 +57,8 @@
       
       testee = new XSLTServiceBindingValueSourceImpl();      
       xsltConfig = getXSLTConfig();
-      binding.setServiceBindingValueSourceConfig(xsltConfig);
+      bindingMetadata.setServiceBindingValueSourceConfig(xsltConfig);
+      binding = new ServiceBinding(bindingMetadata, HOST, 0);
    }
 
    /**
@@ -169,7 +171,8 @@
    
    public void testNullConfigObject() throws Exception
    {
-      binding.setServiceBindingValueSourceConfig(null);
+      bindingMetadata.setServiceBindingValueSourceConfig(null);
+      binding = new ServiceBinding(bindingMetadata, HOST, 0);
       String input = getFullyQualifiedResourceName("xlst_input.xml");
       try
       {
@@ -181,7 +184,8 @@
    
    public void testUnknownConfigObject() throws Exception
    {
-      binding.setServiceBindingValueSourceConfig(new Object());
+      bindingMetadata.setServiceBindingValueSourceConfig(new Object());
+      binding = new ServiceBinding(bindingMetadata, HOST, 0);
       String input = getFullyQualifiedResourceName("xlst_input.xml");
       try
       {




More information about the jboss-cvs-commits mailing list