blob: 74a647d24d26d88280a9690d9ab33f924f5ca13b [file] [log] [blame]
/*
* Copyright (c) 2008-2012, 2015, 2016, 2019 Eike Stepper (Loehne, Germany) and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Eike Stepper - initial API and implementation
*/
package org.eclipse.spi.net4j;
import org.eclipse.net4j.buffer.IBufferProvider;
import org.eclipse.net4j.channel.IChannel;
import org.eclipse.net4j.protocol.IProtocol2;
import org.eclipse.net4j.util.ReflectUtil.ExcludeFromDump;
import org.eclipse.net4j.util.concurrent.ConcurrencyUtil;
import org.eclipse.net4j.util.concurrent.IExecutorServiceProvider;
import org.eclipse.net4j.util.event.IListener;
import org.eclipse.net4j.util.lifecycle.ILifecycle;
import org.eclipse.net4j.util.lifecycle.Lifecycle;
import org.eclipse.net4j.util.lifecycle.LifecycleEventAdapter;
import org.eclipse.net4j.util.lifecycle.LifecycleUtil;
import org.eclipse.net4j.util.om.log.OMLogger;
import java.util.concurrent.ExecutorService;
/**
* If the meaning of this type isn't clear, there really should be more of a description here...
*
* @author Eike Stepper
* @since 2.0
*/
public abstract class Protocol<INFRA_STRUCTURE> extends Lifecycle implements IProtocol2<INFRA_STRUCTURE>, IExecutorServiceProvider
{
private String type;
private ExecutorService executorService;
private IBufferProvider bufferProvider;
private INFRA_STRUCTURE infraStructure;
private IChannel channel;
@ExcludeFromDump
private transient IListener channelListener = new LifecycleEventAdapter()
{
@Override
protected void onDeactivated(ILifecycle lifecycle)
{
handleChannelDeactivation();
}
};
private String userID;
public Protocol(String type)
{
this.type = type;
}
@Override
public final String getType()
{
return type;
}
/**
* @since 4.2
*/
@Override
public int getVersion()
{
return UNSPECIFIED_VERSION;
}
@Override
public ExecutorService getExecutorService()
{
return executorService;
}
@Override
public void setExecutorService(ExecutorService executorService)
{
this.executorService = executorService;
}
@Override
public IBufferProvider getBufferProvider()
{
return bufferProvider;
}
@Override
public INFRA_STRUCTURE getInfraStructure()
{
return infraStructure;
}
@Override
public void setInfraStructure(INFRA_STRUCTURE infraStructure)
{
this.infraStructure = infraStructure;
}
/**
* @since 2.0
*/
@Override
public Location getLocation()
{
return channel.getLocation();
}
/**
* @since 2.0
*/
@Override
public boolean isClient()
{
return channel.isClient();
}
/**
* @since 2.0
*/
@Override
public boolean isServer()
{
return channel.isServer();
}
@Override
public IChannel getChannel()
{
return channel;
}
@Override
public void setChannel(IChannel newChannel)
{
if (channel != newChannel)
{
executorService = null;
bufferProvider = null;
if (channel != null)
{
channel.removeListener(channelListener);
}
channel = newChannel;
if (channel != null)
{
channel.addListener(channelListener);
executorService = ConcurrencyUtil.getExecutorService(channel);
bufferProvider = (InternalChannel)channel;
}
}
}
@Override
public String getUserID()
{
if (userID == null && channel != null)
{
return channel.getUserID();
}
return userID;
}
protected void setUserID(String userID)
{
this.userID = userID;
}
/**
* @since 2.0
*/
protected void handleChannelDeactivation()
{
LifecycleUtil.deactivate(this, OMLogger.Level.DEBUG);
}
@Override
protected void doBeforeActivate() throws Exception
{
super.doBeforeActivate();
checkState(channel, "channel"); //$NON-NLS-1$
checkState(bufferProvider, "bufferProvider"); //$NON-NLS-1$
checkState(executorService, "executorService"); //$NON-NLS-1$
}
@Override
protected void doDeactivate() throws Exception
{
setChannel(null);
super.doDeactivate();
}
}