001/**
002 * Licensed to the Apache Software Foundation (ASF) under one or more
003 * contributor license agreements.  See the NOTICE file distributed with
004 * this work for additional information regarding copyright ownership.
005 * The ASF licenses this file to You under the Apache License, Version 2.0
006 * (the "License"); you may not use this file except in compliance with
007 * the License.  You may obtain a copy of the License at
008 *
009 *      http://www.apache.org/licenses/LICENSE-2.0
010 *
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the License for the specific language governing permissions and
015 * limitations under the License.
016 */
017package org.apache.activemq.transport.protocol;
018
019import org.apache.activemq.command.WireFormatInfo;
020
021/**
022 *
023 *
024 */
025public class OpenWireProtocolVerifier implements ProtocolVerifier {
026
027    protected final boolean sizePrefixDisabled;
028
029    public OpenWireProtocolVerifier(final boolean sizePrefixDisabled) {
030        this.sizePrefixDisabled = sizePrefixDisabled;
031    }
032
033    /* (non-Javadoc)
034     * @see org.apache.activemq.broker.transport.protocol.ProtocolVerifier#isProtocol(byte[])
035     */
036    @Override
037    public boolean isProtocol(byte[] value) {
038        if (value.length < 8) {
039           throw new IllegalArgumentException("Protocol header length changed "
040                                                 + value.length);
041        }
042
043        int start = !sizePrefixDisabled ? 4 : 0;
044        int j = 0;
045        // type
046        if (value[start] != WireFormatInfo.DATA_STRUCTURE_TYPE) {
047           return false;
048        }
049        start++;
050        WireFormatInfo info = new WireFormatInfo();
051        final byte[] magic = info.getMagic();
052        int remainingLen = value.length - start;
053        int useLen = remainingLen > magic.length ? magic.length : remainingLen;
054        useLen += start;
055        // magic
056        for (int i = start; i < useLen; i++) {
057           if (value[i] != magic[j]) {
058              return false;
059           }
060           j++;
061        }
062        return true;
063    }
064
065}