/*
* #%L
* Abstract base class for Service Locator Selection Strategy
* %%
* Copyright (C) 2011 - 2012 Talend Inc.
* %%
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* #L%
*/
package org.talend.esb.servicelocator.cxf.internal;
import java.util.List;
import java.util.Random;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.xml.namespace.QName;
import org.apache.cxf.clustering.FailoverStrategy;
import org.apache.cxf.endpoint.Endpoint;
import org.apache.cxf.message.Exchange;
import org.talend.esb.servicelocator.client.SLPropertiesMatcher;
import org.talend.esb.servicelocator.client.ServiceLocator;
public abstract class LocatorSelectionStrategy implements FailoverStrategy {
protected static final Logger LOG = Logger
.getLogger(LocatorSelectionStrategy.class.getName());
protected LocatorCache locatorCache = new LocatorCache();
private Random random = new Random();
/*
* (non-Javadoc)
*
* @see
* org.apache.cxf.clustering.FailoverStrategy#selectAlternateAddress(java
* .util.List)
*/
@Override
public String selectAlternateAddress(List<String> alternates) {
String alternateAddress = null;
if (alternates != null && !alternates.isEmpty()) {
int index = random.nextInt(alternates.size());
alternateAddress = alternates.remove(index);
}
LOG.log(Level.INFO, "selectAlternateAddress " + " alternates = "
+ alternates + " alternateAddress = " + alternateAddress);
return alternateAddress;
}
/*
* (non-Javadoc)
*
* @see
* org.apache.cxf.clustering.FailoverStrategy#getAlternateAddresses(org.
* apache.cxf.message.Exchange)
*/
@Override
public List<String> getAlternateAddresses(Exchange exchange) {
return locatorCache.getFailoverEndpoints(getServiceName(exchange));
}
/*
* (non-Javadoc)
*
* @see
* org.apache.cxf.clustering.FailoverStrategy#getAlternateEndpoints(org.
* apache.cxf.message.Exchange)
*/
@Override
public List<Endpoint> getAlternateEndpoints(Exchange exchange) {
return null;
}
/*
* (non-Javadoc)
*
* @see
* org.apache.cxf.clustering.FailoverStrategy#selectAlternateEndpoint(java
* .util.List)
*/
@Override
public Endpoint selectAlternateEndpoint(List<Endpoint> alternates) {
return null;
}
/**
* @param exchange
* @return
*/
public abstract String getPrimaryAddress(Exchange exchange);
synchronized public void setMatcher(SLPropertiesMatcher propertiesMatcher) {
if (propertiesMatcher != null) {
locatorCache.setMatcher(propertiesMatcher);
}
}
public void setServiceLocator(ServiceLocator serviceLocator) {
locatorCache.setServiceLocator(serviceLocator);
}
public void setReloadAdressesCount(int reloadAdressesCount) {
locatorCache.setReloadCount(reloadAdressesCount);
}
protected QName getServiceName(Exchange exchange) {
return exchange.getEndpoint().getService().getName();
}
}