/** * Copyright 2007-2015, Kaazing Corporation. All rights reserved. * * Licensed 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.kaazing.k3po.driver.internal.behavior.handler.command; import static org.jboss.netty.buffer.ChannelBuffers.copiedBuffer; import static org.jboss.netty.buffer.ChannelBuffers.wrappedBuffer; import static org.jboss.netty.channel.Channels.write; import static org.kaazing.k3po.driver.internal.behavior.handler.codec.Masker.IDENTITY_MASKER; import java.util.List; import org.jboss.netty.buffer.ChannelBuffer; import org.jboss.netty.channel.ChannelHandlerContext; import org.kaazing.k3po.driver.internal.behavior.handler.codec.Masker; import org.kaazing.k3po.driver.internal.behavior.handler.codec.MessageEncoder; public class WriteHandler extends AbstractCommandHandler { private final List<MessageEncoder> encoders; private final Masker masker; public WriteHandler(List<MessageEncoder> encoders, Masker masker) { if (encoders == null) { throw new NullPointerException("encoders"); } else if (encoders.size() == 0) { throw new IllegalArgumentException("must have at least one encoder"); } this.encoders = encoders; this.masker = masker; } @Override protected void invokeCommand(ChannelHandlerContext ctx) throws Exception { ChannelBuffer[] buffers = new ChannelBuffer[encoders.size()]; int idx = 0; for (MessageEncoder encoder : encoders) { buffers[idx] = encoder.encode(); idx++; } if (masker == IDENTITY_MASKER) { // avoid unnecessary copy when masking disabled ChannelBuffer bytes = wrappedBuffer(buffers); write(ctx, getHandlerFuture(), bytes); } else { ChannelBuffer bytes = copiedBuffer(buffers); ChannelBuffer maskedBytes = masker.applyMask(bytes); write(ctx, getHandlerFuture(), maskedBytes); } } @Override protected StringBuilder describe(StringBuilder sb) { sb.append("write "); for (MessageEncoder encoder : encoders) { sb.append(encoder).append(' '); } sb.setLength(sb.length() - 1); return sb; } }