Author: ruwan
Date: Mon Oct 20 07:25:09 2008
New Revision: 706305

URL: http://svn.apache.org/viewvc?rev=706305&view=rev
Log:
Resolving the dynamic loadbalancing issues, which has been commented after 
asnkha's commit to improve endpoints

Modified:
    
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/config/xml/endpoints/DynamicLoadbalanceEndpointFactory.java
    
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/config/xml/endpoints/EndpointFactory.java
    
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/core/LoadBalanceMembershipHandler.java
    
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/core/axis2/Axis2LoadBalanceMembershipHandler.java
    
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/endpoints/DynamicLoadbalanceEndpoint.java
    
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/endpoints/algorithms/AlgorithmContext.java
    
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/endpoints/algorithms/LoadbalanceAlgorithm.java
    
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/endpoints/algorithms/RoundRobin.java

Modified: 
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/config/xml/endpoints/DynamicLoadbalanceEndpointFactory.java
URL: 
http://svn.apache.org/viewvc/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/config/xml/endpoints/DynamicLoadbalanceEndpointFactory.java?rev=706305&r1=706304&r2=706305&view=diff
==============================================================================
--- 
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/config/xml/endpoints/DynamicLoadbalanceEndpointFactory.java
 (original)
+++ 
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/config/xml/endpoints/DynamicLoadbalanceEndpointFactory.java
 Mon Oct 20 07:25:09 2008
@@ -49,85 +49,85 @@
  * </endpoint>
  * </pre>
  */
-//public class DynamicLoadbalanceEndpointFactory extends EndpointFactory {
-//    TODO FIX-RUWAN
-//    private static final Log log = 
LogFactory.getLog(DynamicLoadbalanceEndpointFactory.class);
-//    private static DynamicLoadbalanceEndpointFactory instance =
-//            new DynamicLoadbalanceEndpointFactory();
-//
-//    private DynamicLoadbalanceEndpointFactory() {
-//    }
-//
-//    public static DynamicLoadbalanceEndpointFactory getInstance() {
-//        return instance;
-//    }
-//
-//    protected Endpoint createEndpoint(OMElement epConfig, boolean 
anonymousEndpoint) {
-//
-//        OMElement loadbalanceElement =
-//                epConfig.getFirstChildWithName(new 
QName(SynapseConstants.SYNAPSE_NAMESPACE,
-//                                                         
"dynamicLoadbalance"));
-//
-//        if (loadbalanceElement != null) {
-//
-//            DynamicLoadbalanceEndpoint loadbalanceEndpoint = new 
DynamicLoadbalanceEndpoint();
-//
-//            // set endpoint name
-//            OMAttribute name =
-//                    epConfig.getAttribute(new 
QName(XMLConfigConstants.NULL_NAMESPACE, "name"));
-//
-//            if (name != null) {
-//                loadbalanceEndpoint.setName(name.getAttributeValue());
-//            }
-//
-//            //TODO: Handle session affinity
-//
-//            // set if failover is turned off
-//            String failover = loadbalanceElement.getAttributeValue(new 
QName("failover"));
-//            if (failover != null && failover.equalsIgnoreCase("false")) {
-//                loadbalanceEndpoint.setFailover(false);
-//            }
-//
-//            OMElement eventHandler =
-//                    loadbalanceElement.
-//                            getFirstChildWithName(new 
QName(SynapseConstants.SYNAPSE_NAMESPACE,
-//                                                            
"membershipHandler"));
-//            if (eventHandler != null) {
-//                String clazz =
-//                        eventHandler.getAttributeValue(new 
QName(XMLConfigConstants.NULL_NAMESPACE,
-//                                                                 
"class")).trim();
-//                try {
-//                    LoadBalanceMembershipHandler lbMembershipHandler =
-//                            (LoadBalanceMembershipHandler) 
Class.forName(clazz).newInstance();
-//                    Properties properties = new Properties();
-//                    for (Iterator props = 
eventHandler.getChildrenWithName(new QName(
-//                            SynapseConstants.SYNAPSE_NAMESPACE, 
"property")); props.hasNext();) {
-//                        OMElement prop = (OMElement) props.next();
-//                        String propName =
-//                                prop.getAttributeValue(new 
QName(XMLConfigConstants.NULL_NAMESPACE,
-//                                                                 
"name")).trim();
-//                        String propValue =
-//                                prop.getAttributeValue(new 
QName(XMLConfigConstants.NULL_NAMESPACE,
-//                                                                 
"value")).trim();
-//                        properties.put(propName, propValue);
-//                    }
-//
-//                    // Set load balance algorithm
-//                    LoadbalanceAlgorithm algorithm =
-//                            LoadbalanceAlgorithmFactory.
-//                                    
createLoadbalanceAlgorithm(loadbalanceElement);
-//                    lbMembershipHandler.init(properties, algorithm);
-//                    
loadbalanceEndpoint.setLoadBalanceMembershipHandler(lbMembershipHandler);
-//                } catch (Exception e) {
-//                    String msg = "Could not instantiate " +
-//                            "LoadBalanceMembershipHandler implementation " + 
clazz;
-//                    log.error(msg, e);
-//                    throw new SynapseException(msg, e);
-//                }
-//            }
-//
-//            return loadbalanceEndpoint;
-//        }
-//        return null;
-//    }
-//}
+public class DynamicLoadbalanceEndpointFactory extends EndpointFactory {
+
+    private static final Log log = 
LogFactory.getLog(DynamicLoadbalanceEndpointFactory.class);
+    private static DynamicLoadbalanceEndpointFactory instance =
+            new DynamicLoadbalanceEndpointFactory();
+
+    private DynamicLoadbalanceEndpointFactory() {
+    }
+
+    public static DynamicLoadbalanceEndpointFactory getInstance() {
+        return instance;
+    }
+
+    protected Endpoint createEndpoint(OMElement epConfig, boolean 
anonymousEndpoint) {
+
+        OMElement loadbalanceElement =
+                epConfig.getFirstChildWithName(new 
QName(SynapseConstants.SYNAPSE_NAMESPACE,
+                                                         
"dynamicLoadbalance"));
+
+        if (loadbalanceElement != null) {
+
+            DynamicLoadbalanceEndpoint loadbalanceEndpoint = new 
DynamicLoadbalanceEndpoint();
+
+            // set endpoint name
+            OMAttribute name =
+                    epConfig.getAttribute(new 
QName(XMLConfigConstants.NULL_NAMESPACE, "name"));
+
+            if (name != null) {
+                loadbalanceEndpoint.setName(name.getAttributeValue());
+            }
+
+            //TODO: Handle session affinity
+
+            // set if failover is turned off
+            String failover = loadbalanceElement.getAttributeValue(new 
QName("failover"));
+            if (failover != null && failover.equalsIgnoreCase("false")) {
+                loadbalanceEndpoint.setFailover(false);
+            }
+
+            OMElement eventHandler =
+                    loadbalanceElement.
+                            getFirstChildWithName(new 
QName(SynapseConstants.SYNAPSE_NAMESPACE,
+                                                            
"membershipHandler"));
+            if (eventHandler != null) {
+                String clazz =
+                        eventHandler.getAttributeValue(new 
QName(XMLConfigConstants.NULL_NAMESPACE,
+                                                                 
"class")).trim();
+                try {
+                    LoadBalanceMembershipHandler lbMembershipHandler =
+                            (LoadBalanceMembershipHandler) 
Class.forName(clazz).newInstance();
+                    Properties properties = new Properties();
+                    for (Iterator props = eventHandler.getChildrenWithName(new 
QName(
+                            SynapseConstants.SYNAPSE_NAMESPACE, "property")); 
props.hasNext();) {
+                        OMElement prop = (OMElement) props.next();
+                        String propName =
+                                prop.getAttributeValue(new 
QName(XMLConfigConstants.NULL_NAMESPACE,
+                                                                 
"name")).trim();
+                        String propValue =
+                                prop.getAttributeValue(new 
QName(XMLConfigConstants.NULL_NAMESPACE,
+                                                                 
"value")).trim();
+                        properties.put(propName, propValue);
+                    }
+
+                    // Set load balance algorithm
+                    LoadbalanceAlgorithm algorithm =
+                            LoadbalanceAlgorithmFactory.
+                                    
createLoadbalanceAlgorithm(loadbalanceElement, null);
+                    lbMembershipHandler.init(properties, algorithm);
+                    
loadbalanceEndpoint.setLoadBalanceMembershipHandler(lbMembershipHandler);
+                } catch (Exception e) {
+                    String msg = "Could not instantiate " +
+                            "LoadBalanceMembershipHandler implementation " + 
clazz;
+                    log.error(msg, e);
+                    throw new SynapseException(msg, e);
+                }
+            }
+
+            return loadbalanceEndpoint;
+        }
+        return null;
+    }
+}

Modified: 
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/config/xml/endpoints/EndpointFactory.java
URL: 
http://svn.apache.org/viewvc/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/config/xml/endpoints/EndpointFactory.java?rev=706305&r1=706304&r2=706305&view=diff
==============================================================================
--- 
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/config/xml/endpoints/EndpointFactory.java
 (original)
+++ 
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/config/xml/endpoints/EndpointFactory.java
 Mon Oct 20 07:25:09 2008
@@ -427,8 +427,7 @@
                 (new QName(SynapseConstants.SYNAPSE_NAMESPACE, 
"dynamicLoadbalance"));
         if (dlbElement != null) {
             //TODO: Handle Session affinitiy & failover
-//            TODO FIX-RUWAN
-//            return DynamicLoadbalanceEndpointFactory.getInstance();
+            return DynamicLoadbalanceEndpointFactory.getInstance();
         }
 
         OMElement foElement = configElement.getFirstChildWithName

Modified: 
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/core/LoadBalanceMembershipHandler.java
URL: 
http://svn.apache.org/viewvc/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/core/LoadBalanceMembershipHandler.java?rev=706305&r1=706304&r2=706305&view=diff
==============================================================================
--- 
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/core/LoadBalanceMembershipHandler.java
 (original)
+++ 
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/core/LoadBalanceMembershipHandler.java
 Mon Oct 20 07:25:09 2008
@@ -30,35 +30,35 @@
  * Generally, this interface will work with a GCF or other membership 
discovery mechanism
  */
 public interface LoadBalanceMembershipHandler {
-//    TODO FIX-RUWAN
-//    /**
-//     * Initialize this
-//     *
-//     * @param properties The properties specific to this 
LoadBalanceMembershipHandler
-//     * @param algorithm  The load balancing algorithm
-//     */
-//    void init(Properties properties, LoadbalanceAlgorithm algorithm);
-//
-//    /**
-//     * Set the Axis2 ConfigurationContext
-//     *
-//     * @param configCtx Axis2 ConfigurationContext
-//     */
-//    void setConfigurationContext(ConfigurationContext configCtx);
-//
-//    /**
-//     * Get the Axis2 ConfigurationContext
-//     *
-//     * @return Axis2 ConfigurationContext
-//     */
-//    ConfigurationContext getConfigurationContext();
-//
-//    /**
-//     * Get the next application member to whom the message has to be sent to
-//     *
-//     * @param context The AlgorithmContext which holds information needed 
for the algorithm
-//     * @return Next application member to whom the message has to be sent to
-//     */
-//     Member getNextApplicationMember(AlgorithmContext context);
-//
+
+    /**
+     * Initialize this
+     *
+     * @param properties The properties specific to this 
LoadBalanceMembershipHandler
+     * @param algorithm  The load balancing algorithm
+     */
+    void init(Properties properties, LoadbalanceAlgorithm algorithm);
+
+    /**
+     * Set the Axis2 ConfigurationContext
+     *
+     * @param configCtx Axis2 ConfigurationContext
+     */
+    void setConfigurationContext(ConfigurationContext configCtx);
+
+    /**
+     * Get the Axis2 ConfigurationContext
+     *
+     * @return Axis2 ConfigurationContext
+     */
+    ConfigurationContext getConfigurationContext();
+
+    /**
+     * Get the next application member to whom the message has to be sent to
+     *
+     * @param context The AlgorithmContext which holds information needed for 
the algorithm
+     * @return Next application member to whom the message has to be sent to
+     */
+     Member getNextApplicationMember(AlgorithmContext context);
+
 }

Modified: 
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/core/axis2/Axis2LoadBalanceMembershipHandler.java
URL: 
http://svn.apache.org/viewvc/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/core/axis2/Axis2LoadBalanceMembershipHandler.java?rev=706305&r1=706304&r2=706305&view=diff
==============================================================================
--- 
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/core/axis2/Axis2LoadBalanceMembershipHandler.java
 (original)
+++ 
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/core/axis2/Axis2LoadBalanceMembershipHandler.java
 Mon Oct 20 07:25:09 2008
@@ -34,7 +34,7 @@
 /**
  * Bridge between Axis2 membership notification and Synapse load balancing
  */
-public class Axis2LoadBalanceMembershipHandler implements 
LoadBalanceMembershipHandler{
+public class Axis2LoadBalanceMembershipHandler implements 
LoadBalanceMembershipHandler {
     private static final Log log = 
LogFactory.getLog(Axis2LoadBalanceMembershipHandler.class);
 
     private String lbDomain;
@@ -86,9 +86,8 @@
      * @param context The AlgorithmContext
      * @return The current member
      */
-//    TODO FIX-RUWAN
-//    public Member getNextApplicationMember(AlgorithmContext context) {
-//        algorithm.setApplicationMembers(lbEventHandler.getMembers());
-//        return algorithm.getNextApplicationMember(context);
-//    }
+    public Member getNextApplicationMember(AlgorithmContext context) {
+        algorithm.setApplicationMembers(lbEventHandler.getMembers());
+        return algorithm.getNextApplicationMember(context);
+    }
 }

Modified: 
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/endpoints/DynamicLoadbalanceEndpoint.java
URL: 
http://svn.apache.org/viewvc/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/endpoints/DynamicLoadbalanceEndpoint.java?rev=706305&r1=706304&r2=706305&view=diff
==============================================================================
--- 
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/endpoints/DynamicLoadbalanceEndpoint.java
 (original)
+++ 
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/endpoints/DynamicLoadbalanceEndpoint.java
 Mon Oct 20 07:25:09 2008
@@ -39,114 +39,123 @@
  */
 public class DynamicLoadbalanceEndpoint extends LoadbalanceEndpoint {
 
-//    TODO FIX-RUWAN
-//    private static final Log log = 
LogFactory.getLog(DynamicLoadbalanceEndpoint.class);
-//
-//    /**
-//     * The algorithm context , place holder for keep any runtime states 
related to the load balance
-//     * algorithm
-//     */
-//    private final AlgorithmContext algorithmContext = new AlgorithmContext();
-//
-//    private LoadBalanceMembershipHandler lbMembershipHandler;
-//
-//    public DynamicLoadbalanceEndpoint() {
-//    }
-//
-//    public void setLoadBalanceMembershipHandler(LoadBalanceMembershipHandler 
lbMembershipHandler) {
-//        this.lbMembershipHandler = lbMembershipHandler;
-//    }
-//
-//    public void send(MessageContext synCtx) {
-//        EndpointReference to = synCtx.getTo();
-//        DynamicLoadbalanceFaultHandler faultHandler = new 
DynamicLoadbalanceFaultHandler(to);
-//        if (failover) {
-//            synCtx.pushFaultHandler(faultHandler);
-//        }
-//        ConfigurationContext configCtx =
-//                ((Axis2MessageContext) 
synCtx).getAxis2MessageContext().getConfigurationContext();
-//        if (lbMembershipHandler.getConfigurationContext() == null) {
-//            lbMembershipHandler.setConfigurationContext(configCtx);
-//        }
+    private static final Log log = 
LogFactory.getLog(DynamicLoadbalanceEndpoint.class);
+
+    /**
+     * The algorithm context , place holder for keep any runtime states 
related to the load balance
+     * algorithm
+     */
+    private AlgorithmContext algorithmContext;
+
+    public void init(ConfigurationContext cc) {
+        if (!initialized) {
+            super.init(cc);
+            if (algorithmContext == null) {
+                algorithmContext = new AlgorithmContext(isClusteringEnabled, 
cc, getName());
+            }
+        }
+    }
+
+    private LoadBalanceMembershipHandler lbMembershipHandler;
+
+    public DynamicLoadbalanceEndpoint() {
+    }
+
+    public void setLoadBalanceMembershipHandler(LoadBalanceMembershipHandler 
lbMembershipHandler) {
+        this.lbMembershipHandler = lbMembershipHandler;
+    }
+
+    public void send(MessageContext synCtx) {
+        EndpointReference to = synCtx.getTo();
+        DynamicLoadbalanceFaultHandler faultHandler = new 
DynamicLoadbalanceFaultHandler(to);
+        if (isFailover()) {
+            synCtx.pushFaultHandler(faultHandler);
+        }
+        ConfigurationContext configCtx =
+                ((Axis2MessageContext) 
synCtx).getAxis2MessageContext().getConfigurationContext();
+        if (lbMembershipHandler.getConfigurationContext() == null) {
+            lbMembershipHandler.setConfigurationContext(configCtx);
+        }
 //        algorithmContext.setConfigurationContext(configCtx);
-//        sendToApplicationMember(synCtx, to, faultHandler);
-//    }
-//
-//    public void setName(String name) {
-//        super.setName(name);
+        sendToApplicationMember(synCtx, to, faultHandler);
+    }
+
+    public void setName(String name) {
+        super.setName(name);
 //        algorithmContext.setContextID(name);
-//    }
-//
-//    private void sendToApplicationMember(MessageContext synCtx,
-//                                         EndpointReference to,
-//                                         DynamicLoadbalanceFaultHandler 
faultHandler) {
-//        org.apache.axis2.context.MessageContext axis2MsgCtx =
-//                ((Axis2MessageContext) synCtx).getAxis2MessageContext();
-//
-//        String transport = axis2MsgCtx.getTransportIn().getName();
-//        Member currentMember =
-//                
lbMembershipHandler.getNextApplicationMember(algorithmContext);
-//        faultHandler.setCurrentMember(currentMember);
-//        if (currentMember != null) {
-//
-//            // URL rewrite
-//            if (transport.equals("http") || transport.equals("https")) {
-//                String address = to.getAddress();
-//                if (address.indexOf(":") != -1) {
-//                    try {
-//                        address = new URL(address).getPath();
-//                    } catch (MalformedURLException e) {
-//                        String msg = "URL " + address + " is malformed";
-//                        log.error(msg, e);
-//                        throw new SynapseException(msg, e);
-//                    }
-//                }
-//                EndpointReference epr =
-//                        new EndpointReference(transport + "://" + 
currentMember.getHostName() +
-//                                              ":" + 
currentMember.getHttpPort() + address);
-//                synCtx.setTo(epr);
-//                if (failover) {
-//                    synCtx.getEnvelope().build();
-//                }
-//
-//                AddressEndpoint endpoint = new AddressEndpoint();
-//                EndpointDefinition definition = new EndpointDefinition();
-//                endpoint.setEndpoint(definition);
-//                endpoint.send(synCtx);
-//            } else {
-//                log.error("Cannot load balance for non-HTTP/S transport " + 
transport);
-//            }
-//        } else {
-//            synCtx.getFaultStack().pop(); // Remove the 
DynamicLoadbalanceFaultHandler
-//            String msg = "No application members available";
-//            log.error(msg);
-//            throw new SynapseException(msg);
-//        }
-//    }
-//
-//    /**
-//     * This FaultHandler will try to resend the message to another member if 
an error occurs
-//     * while sending to some member. This is a failover mechanism
-//     */
-//    private class DynamicLoadbalanceFaultHandler extends FaultHandler {
-//
-//        private EndpointReference to;
-//        private Member currentMember;
-//
-//        public void setCurrentMember(Member currentMember) {
-//            this.currentMember = currentMember;
-//        }
-//
-//        private DynamicLoadbalanceFaultHandler(EndpointReference to) {
-//            this.to = to;
-//        }
-//
-//        public void onFault(MessageContext synCtx) {
-//            if (currentMember == null) {
-//                return;
-//            }
-//            synCtx.pushFaultHandler(this);
-//            sendToApplicationMember(synCtx, to, this);
-//        }
-//    }
+    }
+
+    private void sendToApplicationMember(MessageContext synCtx,
+                                         EndpointReference to,
+                                         DynamicLoadbalanceFaultHandler 
faultHandler) {
+        org.apache.axis2.context.MessageContext axis2MsgCtx =
+                ((Axis2MessageContext) synCtx).getAxis2MessageContext();
+
+        String transport = axis2MsgCtx.getTransportIn().getName();
+        Member currentMember =
+                lbMembershipHandler.getNextApplicationMember(algorithmContext);
+        faultHandler.setCurrentMember(currentMember);
+        if (currentMember != null) {
+
+            // URL rewrite
+            if (transport.equals("http") || transport.equals("https")) {
+                String address = to.getAddress();
+                if (address.indexOf(":") != -1) {
+                    try {
+                        address = new URL(address).getPath();
+                    } catch (MalformedURLException e) {
+                        String msg = "URL " + address + " is malformed";
+                        log.error(msg, e);
+                        throw new SynapseException(msg, e);
+                    }
+                }
+                EndpointReference epr =
+                        new EndpointReference(transport + "://" + 
currentMember.getHostName() +
+                                              ":" + 
currentMember.getHttpPort() + address);
+                synCtx.setTo(epr);
+                if (isFailover()) {
+                    synCtx.getEnvelope().build();
+                }
+
+                AddressEndpoint endpoint = new AddressEndpoint();
+                EndpointDefinition definition = new EndpointDefinition();
+                endpoint.setDefinition(definition);
+                endpoint.send(synCtx);
+            } else {
+                log.error("Cannot load balance for non-HTTP/S transport " + 
transport);
+            }
+        } else {
+            synCtx.getFaultStack().pop(); // Remove the 
DynamicLoadbalanceFaultHandler
+            String msg = "No application members available";
+            log.error(msg);
+            throw new SynapseException(msg);
+        }
+    }
+
+    /**
+     * This FaultHandler will try to resend the message to another member if 
an error occurs
+     * while sending to some member. This is a failover mechanism
+     */
+    private class DynamicLoadbalanceFaultHandler extends FaultHandler {
+
+        private EndpointReference to;
+        private Member currentMember;
+
+        public void setCurrentMember(Member currentMember) {
+            this.currentMember = currentMember;
+        }
+
+        private DynamicLoadbalanceFaultHandler(EndpointReference to) {
+            this.to = to;
+        }
+
+        public void onFault(MessageContext synCtx) {
+            if (currentMember == null) {
+                return;
+            }
+            synCtx.pushFaultHandler(this);
+            sendToApplicationMember(synCtx, to, this);
+        }
+    }
 }
+

Modified: 
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/endpoints/algorithms/AlgorithmContext.java
URL: 
http://svn.apache.org/viewvc/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/endpoints/algorithms/AlgorithmContext.java?rev=706305&r1=706304&r2=706305&view=diff
==============================================================================
--- 
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/endpoints/algorithms/AlgorithmContext.java
 (original)
+++ 
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/endpoints/algorithms/AlgorithmContext.java
 Mon Oct 20 07:25:09 2008
@@ -81,7 +81,7 @@
      *
      * @param currentEPR The current position
      */
-    public void setCurrentEPR(int currentEPR) {
+    public void setCurrentEndpointIndex(int currentEPR) {
 
         if (Boolean.TRUE.equals(isClusteringEnabled)) {
 

Modified: 
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/endpoints/algorithms/LoadbalanceAlgorithm.java
URL: 
http://svn.apache.org/viewvc/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/endpoints/algorithms/LoadbalanceAlgorithm.java?rev=706305&r1=706304&r2=706305&view=diff
==============================================================================
--- 
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/endpoints/algorithms/LoadbalanceAlgorithm.java
 (original)
+++ 
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/endpoints/algorithms/LoadbalanceAlgorithm.java
 Mon Oct 20 07:25:09 2008
@@ -36,15 +36,14 @@
      *
      * @param members The application members
      */
-//    TODO FIX-RUWAN
-//    void setApplicationMembers(List<Member> members);
-//
-//    /**
-//     * Set the endpoints
-//     *
-//     * @param endpoints The endpoints
-//     */
-//    void setEndpoints(List<Endpoint> endpoints);
+    void setApplicationMembers(List<Member> members);
+
+    /**
+     * Set the endpoints
+     *
+     * @param endpoints The endpoints
+     */
+    void setEndpoints(List<Endpoint> endpoints);
 
     /**
      * This method returns the next node according to the algorithm 
implementation.
@@ -64,8 +63,7 @@
      * @param algorithmContext The context in which holds run time states 
related to the algorithm
      * @return Next application member to which the request has to be sent to
      */
-//    TODO FIX-RUWAN
-//    Member getNextApplicationMember(AlgorithmContext algorithmContext);
+    Member getNextApplicationMember(AlgorithmContext algorithmContext);
 
     /**
      * Resets the algorithm to its initial position. Initial position depends 
on the implementation.

Modified: 
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/endpoints/algorithms/RoundRobin.java
URL: 
http://svn.apache.org/viewvc/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/endpoints/algorithms/RoundRobin.java?rev=706305&r1=706304&r2=706305&view=diff
==============================================================================
--- 
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/endpoints/algorithms/RoundRobin.java
 (original)
+++ 
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/endpoints/algorithms/RoundRobin.java
 Mon Oct 20 07:25:09 2008
@@ -19,6 +19,7 @@
 
 package org.apache.synapse.endpoints.algorithms;
 
+import org.apache.axis2.clustering.Member;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.synapse.MessageContext;
@@ -41,10 +42,20 @@
      */
     private List endpoints = null;
 
+    private List<Member> members;
+
     public RoundRobin(List endpoints) {
         this.endpoints = endpoints;
     }
 
+    public void setApplicationMembers(List<Member> members) {
+        this.members = members;
+    }
+
+    public void setEndpoints(List<Endpoint> endpoints) {
+        //To change body of implemented methods use File | Settings | File 
Templates.
+    }
+
     /**
      * Choose an active endpoint using the round robin algorithm. If there are 
no active endpoints
      * available, returns null.
@@ -69,7 +80,7 @@
                 } else {
                     currentEPR++;
                 }
-                algorithmContext.setCurrentEPR(currentEPR);
+                algorithmContext.setCurrentEndpointIndex(currentEPR);
             }
 
             attempts++;
@@ -82,11 +93,33 @@
         return nextEndpoint;
     }
 
+    public Member getNextApplicationMember(AlgorithmContext algorithmContext) {
+        if (members.size() == 0) {
+            return null;
+        }
+        int currentMemberIndex = algorithmContext.getCurrentEndpointIndex();
+        if (currentMemberIndex >= members.size()) {
+            currentMemberIndex = 0;
+        }
+        Member current = members.get(currentMemberIndex);
+        if (currentMemberIndex == members.size() - 1) {
+            currentMemberIndex = 0;
+        } else {
+            currentMemberIndex++;
+        }
+        algorithmContext.setCurrentEndpointIndex(currentMemberIndex);
+        if(log.isDebugEnabled()) {
+            log.debug("Members       : " + members.size());
+            log.debug("Current member: " + current);
+        }
+        return current;
+    }
+
     public void reset(AlgorithmContext algorithmContext) {
         if (log.isDebugEnabled()) {
             log.debug("Resetting the Round Robin loadbalancing algorithm ...");
         }
-        algorithmContext.setCurrentEPR(0);
+        algorithmContext.setCurrentEndpointIndex(0);
     }
 
     public String getName() {


Reply via email to