/*
* Copyright (c) 2007-2012, 2016 Eike Stepper (Berlin, 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.net4j.internal.jvm;
import org.eclipse.net4j.Net4jUtil;
import org.eclipse.net4j.buffer.IBuffer;
import org.eclipse.net4j.channel.ChannelException;
import org.eclipse.net4j.internal.jvm.bundle.OM;
import org.eclipse.net4j.internal.jvm.messages.Messages;
import org.eclipse.net4j.jvm.IJVMConnector;
import org.eclipse.net4j.protocol.IProtocol;
import org.eclipse.net4j.util.om.trace.ContextTracer;
import org.eclipse.net4j.util.security.INegotiationContext;
import org.eclipse.spi.net4j.Connector;
import org.eclipse.spi.net4j.InternalChannel;
import java.nio.ByteBuffer;
import java.util.Queue;
/**
* TODO Remove peer channels
*
* @author Eike Stepper
*/
public abstract class JVMConnector extends Connector implements IJVMConnector
{
private static final ContextTracer TRACER = new ContextTracer(OM.DEBUG, JVMConnector.class);
private JVMConnector peer;
private String name;
public JVMConnector()
{
}
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
public JVMConnector getPeer()
{
return peer;
}
public void setPeer(JVMConnector peer)
{
this.peer = peer;
}
@Override
public String getURL()
{
return "jvm://" + name; //$NON-NLS-1$
}
public void multiplexChannel(InternalChannel localChannel)
{
short channelID = localChannel.getID();
InternalChannel peerChannel = peer.getChannel(channelID);
if (peerChannel == null)
{
throw new IllegalStateException("peerChannel == null"); //$NON-NLS-1$
}
Queue<IBuffer> localQueue = localChannel.getSendQueue();
IBuffer buffer = localQueue.poll();
ByteBuffer byteBuffer = buffer.getByteBuffer();
if (byteBuffer.position() == IBuffer.HEADER_SIZE)
{
// Just release this empty buffer has been written
buffer.release();
return;
}
if (TRACER.isEnabled())
{
TRACER.trace("Multiplexing " + buffer.formatContent(true)); //$NON-NLS-1$
}
buffer.flip();
peerChannel.handleBufferFromMultiplexer(buffer);
}
@Override
protected INegotiationContext createNegotiationContext()
{
throw new UnsupportedOperationException();
}
@Override
protected InternalChannel createChannel()
{
return new JVMChannel();
}
@Override
protected void registerChannelWithPeer(short channelID, long timeoutIgnored, IProtocol<?> protocol) throws ChannelException
{
try
{
String protocolID = Net4jUtil.getProtocolID(protocol);
int protocolVersion = Net4jUtil.getProtocolVersion(protocol);
JVMChannel peerChannel = (JVMChannel)peer.inverseOpenChannel(channelID, protocolID, protocolVersion);
if (peerChannel == null)
{
throw new ChannelException(Messages.getString("JVMConnector.2")); //$NON-NLS-1$
}
JVMChannel c = (JVMChannel)getChannel(channelID);
c.setPeer(peerChannel);
peerChannel.setPeer(c);
}
catch (ChannelException ex)
{
throw ex;
}
catch (Exception ex)
{
throw new ChannelException(ex);
}
}
@Override
protected void deregisterChannelFromPeer(InternalChannel channel) throws ChannelException
{
try
{
getPeer().inverseCloseChannel(channel.getID());
}
catch (ChannelException ex)
{
throw ex;
}
catch (Exception ex)
{
throw new ChannelException(ex);
}
}
@Override
protected void doBeforeActivate() throws Exception
{
super.doBeforeActivate();
checkState(name, "name"); //$NON-NLS-1$
}
@Override
protected void doActivate() throws Exception
{
super.doActivate();
leaveConnecting();
}
}