/* * 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.mina.service; import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.CopyOnWriteArrayList; import org.apache.mina.api.IoFilter; import org.apache.mina.api.IoService; import org.apache.mina.api.IoServiceListener; import org.apache.mina.api.IoSession; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * Base implementation for {@link IoService}s. * * @author <a href="http://mina.apache.org">Apache MINA Project</a> */ public abstract class AbstractIoService implements IoService { /** A logger for this class */ static final Logger LOG = LoggerFactory.getLogger(AbstractIoService.class); /** The service state */ private ServiceState state; private final Map<Long, IoSession> managedSessions = new ConcurrentHashMap<Long, IoSession>(); /** * The handler, the interface with the application part. */ private IoHandler handler; /** * Placeholder for storing all the listeners added */ private final List<IoServiceListener> listeners = new CopyOnWriteArrayList<IoServiceListener>(); /** * The Service states */ protected enum ServiceState { /** Initial state */ NONE, /** The service has been created */ CREATED, /** The service is started */ ACTIVE, /** The service has been suspended */ SUSPENDED, /** The service is being stopped */ DISPOSING, /** The service is stopped */ DISPOSED } /** * Create an AbstractIoService */ protected AbstractIoService() { state = ServiceState.NONE; } @Override public Map<Long, IoSession> getManagedSessions() { return managedSessions; } /** * * {@inheritDoc} */ @Override public void addListener(IoServiceListener listener) { if (listener != null) { listeners.add(listener); return; } LOG.warn("Trying to add Null Listener"); } /** * * {@inheritDoc} */ @Override public void removeListener(IoServiceListener listener) { if (listener != null) { listeners.remove(listener); } } /** * {@inheritDoc} */ public final IoHandler getHandler() { return handler; } /** * {@inheritDoc} */ public final void setHandler(IoHandler handler) { if (handler == null) { throw new IllegalArgumentException("handler cannot be null"); } // TODO: check the service state, we should not be able to set the handler // if the service is already started /* * if (isActive()) { throw new IllegalStateException( "handler cannot be set while the service is active."); } */ this.handler = handler; } /** * @return true if the IoService is active */ public boolean isActive() { return state == ServiceState.ACTIVE; } /** * @return true if the IoService is being disposed */ public boolean isDisposing() { return state == ServiceState.DISPOSING; } /** * @return true if the IoService is disposed */ public boolean isDisposed() { return state == ServiceState.DISPOSED; } /** * @return true if the IoService is suspended */ public boolean isSuspended() { return state == ServiceState.SUSPENDED; } /** * @return true if the IoService is created */ public boolean isCreated() { return state == ServiceState.CREATED; } /** * Sets the IoService state to CREATED. */ protected void setCreated() { state = ServiceState.CREATED; } /** * Sets the IoService state to ACTIVE. */ protected void setActive() { state = ServiceState.ACTIVE; } /** * Sets the IoService state to DISPOSED. */ protected void setDisposed() { state = ServiceState.DISPOSED; } /** * Sets the IoService state to DISPOSING. */ protected void setDisposing() { state = ServiceState.DISPOSING; } /** * Sets the IoService state to SUSPENDED. */ protected void setSuspended() { state = ServiceState.SUSPENDED; } /** * Initialize the IoService state */ protected void initState() { state = ServiceState.NONE; } /** * Inform all current the listeners of the service activation. */ protected void fireServiceActivated() { for (IoServiceListener listener : listeners) { listener.serviceActivated(this); } } /** * Inform all current the listeners of the service desactivation. */ protected void fireServiceInactivated() { for (IoServiceListener listener : listeners) { listener.serviceInactivated(this); } } public void fireSessionCreated(IoSession session) { for (IoServiceListener listener : listeners) { listener.sessionCreated(session); } } public void fireSessionDestroyed(IoSession session) { for (IoServiceListener listener : listeners) { listener.sessionDestroyed(session); } } private IoFilter[] filters; @Override public IoFilter[] getFilters() { return filters; } @Override public void setFilters(IoFilter... filters) { this.filters = filters; } }