blob: f94d4529622996cafeece59f9640d4b937dc5119 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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.
*/
package org.apache.axis2.transport.base.datagram;
import java.io.IOException;
import java.net.SocketException;
import org.apache.axis2.AxisFault;
import org.apache.axis2.transport.base.AbstractTransportListenerEx;
public abstract class AbstractDatagramTransportListener<E extends DatagramEndpoint>
extends AbstractTransportListenerEx<E> {
private DatagramDispatcher<E> dispatcher;
private String defaultIp;
@Override
protected void doInit() throws AxisFault {
DatagramDispatcherCallback callback = new DatagramDispatcherCallback() {
public void receive(DatagramEndpoint endpoint,
byte[] data,
int length,
DatagramOutTransportInfo outInfo) {
workerPool.execute(new ProcessPacketTask(endpoint, data, length, outInfo));
}
};
try {
dispatcher = createDispatcher(callback);
} catch (IOException ex) {
throw new AxisFault("Unable to create selector", ex);
}
try {
defaultIp = org.apache.axis2.util.Utils.getIpAddress(cfgCtx.getAxisConfiguration());
} catch (SocketException ex) {
throw new AxisFault("Unable to determine the host's IP address", ex);
}
}
@Override
protected final E createEndpoint() {
E endpoint = doCreateEndpoint();
endpoint.setMetrics(metrics);
return endpoint;
}
protected abstract E doCreateEndpoint();
@Override
protected void startEndpoint(E endpoint) throws AxisFault {
try {
dispatcher.addEndpoint(endpoint);
} catch (IOException ex) {
// TODO: passing endpoint.getService() is not correct because it may be null
throw new AxisFault("Unable to listen on endpoint " + endpoint.getDescription(), ex);
}
if (log.isDebugEnabled()) {
log.debug("Started listening on endpoint " + endpoint.getDescription() +
" [contentType=" + endpoint.getContentType() +
"; service=" + endpoint.getServiceName() + "]");
}
}
@Override
protected void stopEndpoint(E endpoint) {
try {
dispatcher.removeEndpoint(endpoint);
} catch (IOException ex) {
log.error("I/O exception while stopping listener for service " +
endpoint.getServiceName(), ex);
}
}
@Override
public void destroy() {
super.destroy();
try {
dispatcher.stop();
} catch (IOException ex) {
log.error("Failed to stop dispatcher", ex);
}
}
protected abstract DatagramDispatcher<E> createDispatcher(DatagramDispatcherCallback callback)
throws IOException;
}