| | |
| | | * |
| | | * |
| | | * Copyright 2006-2009 Sun Microsystems, Inc. |
| | | * Portions copyright 2012 ForgeRock AS. |
| | | */ |
| | | |
| | | package org.opends.server.extensions; |
| | | |
| | | |
| | | |
| | | import java.io.IOException; |
| | | import java.nio.ByteBuffer; |
| | | import java.nio.channels.ByteChannel; |
| | | |
| | | |
| | | |
| | | /** |
| | | * This class redirects read and write requests either to a child byte channel, |
| | | * or a byte channel to be redirected to. |
| | | * |
| | | */ |
| | | public class RedirectingByteChannel implements ByteChannel { |
| | | private final ByteChannel child; |
| | | private volatile ByteChannel redirect = null; |
| | | |
| | | private RedirectingByteChannel(ByteChannel child) { |
| | | this.child = child; |
| | | } |
| | | |
| | | public class RedirectingByteChannel implements ByteChannel |
| | | { |
| | | /** |
| | | * Create an instance of a redirecting byte channel using the specified |
| | | * byte channel as the child. |
| | | * Create an instance of a redirecting byte channel using the specified byte |
| | | * channel as the child. |
| | | * |
| | | * @param bc A byte channel to use as the child. |
| | | * @param bc |
| | | * A byte channel to use as the child. |
| | | * @return A redirecting byte channel. |
| | | */ |
| | | public static |
| | | RedirectingByteChannel getRedirectingByteChannel(ByteChannel bc) { |
| | | public static RedirectingByteChannel getRedirectingByteChannel( |
| | | final ByteChannel bc) |
| | | { |
| | | return new RedirectingByteChannel(bc); |
| | | } |
| | | |
| | | /** |
| | | * {@inheritDoc} |
| | | */ |
| | | public int read(ByteBuffer buffer) throws IOException { |
| | | if (redirect != null) |
| | | return redirect.read(buffer); |
| | | else |
| | | return child.read(buffer); |
| | | |
| | | |
| | | private final ByteChannel child; |
| | | |
| | | private volatile ByteChannel redirect = null; |
| | | |
| | | |
| | | |
| | | private RedirectingByteChannel(final ByteChannel child) |
| | | { |
| | | this.child = child; |
| | | } |
| | | |
| | | |
| | | |
| | | /** |
| | | * {@inheritDoc} |
| | | */ |
| | | public void close() throws IOException { |
| | | public void close() throws IOException |
| | | { |
| | | if(redirect != null) |
| | | { |
| | | redirect.close(); |
| | | } |
| | | else |
| | | { |
| | | child.close(); |
| | | } |
| | | } |
| | | |
| | | |
| | | |
| | | /** |
| | | * Disable redirection. |
| | | */ |
| | | public final void disable() |
| | | { |
| | | redirect = null; |
| | | } |
| | | |
| | | |
| | | |
| | | /** |
| | | * {@inheritDoc} |
| | | */ |
| | | public boolean isOpen() { |
| | | public boolean isOpen() |
| | | { |
| | | if(redirect != null) |
| | | { |
| | | return redirect.isOpen(); |
| | | } |
| | | return child.isOpen(); |
| | | } |
| | | |
| | | |
| | | |
| | | /** |
| | | * {@inheritDoc} |
| | | */ |
| | | public int write(ByteBuffer buffer) throws IOException { |
| | | public int read(final ByteBuffer buffer) throws IOException |
| | | { |
| | | if (redirect != null) |
| | | return redirect.write(buffer); |
| | | else |
| | | return child.write(buffer); |
| | | { |
| | | return redirect.read(buffer); |
| | | } |
| | | else |
| | | { |
| | | return child.read(buffer); |
| | | } |
| | | } |
| | | |
| | | |
| | | |
| | | /** |
| | | * Redirects a byte channel to a byte channel associated with the specified |
| | | * provider. |
| | | * |
| | | * @param provider The provider to redirect to. |
| | | * @param provider |
| | | * The provider to redirect to. |
| | | */ |
| | | public final void redirect(ConnectionSecurityProvider provider) { |
| | | public final void redirect(final ConnectionSecurityProvider provider) |
| | | { |
| | | redirect = provider.wrapChannel(child); |
| | | } |
| | | |
| | | |
| | | |
| | | /** |
| | | * Disable redirection. |
| | | * {@inheritDoc} |
| | | */ |
| | | public final void disable() { |
| | | redirect = null; |
| | | public int write(final ByteBuffer buffer) throws IOException |
| | | { |
| | | if (redirect != null) |
| | | { |
| | | return redirect.write(buffer); |
| | | } |
| | | else |
| | | { |
| | | return child.write(buffer); |
| | | } |
| | | } |
| | | } |