/*
 *
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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.apache.qpid.server.store;

import org.apache.qpid.server.bytebuffer.QpidByteBuffer;
import org.apache.qpid.server.message.AMQMessageHeader;
import org.apache.qpid.server.message.MessageReference;
import org.apache.qpid.server.message.ServerMessage;
import org.apache.qpid.server.plugin.MessageMetaDataType;

public class TestMessageMetaDataType implements MessageMetaDataType<TestMessageMetaData>
{
    //largest metadata type value the BDBMessageStore can store (it uses a byte)
    private static final byte TYPE = 7;
    public static final String V0_8 = "v0_8";

    @Override
    public int ordinal()
    {
        return TYPE;
    }

    @Override
    public TestMessageMetaData createMetaData(QpidByteBuffer buf)
    {
        return TestMessageMetaData.FACTORY.createMetaData(buf);
    }

    @Override
    public ServerMessage<TestMessageMetaData> createMessage(StoredMessage<TestMessageMetaData> msg)
    {
        return new TestServerMessage(msg);
    }

    @Override
    public int hashCode()
    {
        return ordinal();
    }

    @Override
    public boolean equals(Object o)
    {
        return o != null && o.getClass() == getClass();
    }

    @Override
    public String getType()
    {
        return V0_8;
    }


    private static class TestServerMessage implements ServerMessage<TestMessageMetaData>
    {
        private final StoredMessage<TestMessageMetaData> _storedMsg;

        private final MessageReference<ServerMessage> _messageReference = new MessageReference<ServerMessage>()
        {

            @Override
            public void close()
            {
                release();
            }

            @Override
            public ServerMessage getMessage()
            {
                return TestServerMessage.this;
            }

            @Override
            public void release()
            {
            }
        };

        public TestServerMessage(StoredMessage<TestMessageMetaData> storedMsg)
        {
            _storedMsg = storedMsg;
        }
        @Override
        public long getArrivalTime()
        {
            return 0;
        }

        @Override
        public QpidByteBuffer getContent()
        {
            return null;
        }

        @Override
        public QpidByteBuffer getContent(int offset, int length)
        {
            return null;
        }


        @Override
        public Object getConnectionReference()
        {
            return null;
        }

        @Override
        public boolean isResourceAcceptable(final TransactionLogResource resource)
        {
            return true;
        }

        @Override
        public boolean checkValid()
        {
            return true;
        }

        @Override
        public ValidationStatus getValidationStatus()
        {
            return ValidationStatus.VALID;
        }

        @Override
        public long getExpiration()
        {
            return 0;
        }

        @Override
        public String getMessageType()
        {
            return "test";
        }

        @Override
        public AMQMessageHeader getMessageHeader()
        {
            return null;
        }

        @Override
        public long getMessageNumber()
        {
            return _storedMsg.getMessageNumber();
        }

        @Override
        public String getInitialRoutingAddress()
        {
            return "";
        }

        @Override
        public String getTo()
        {
            return null;
        }

        @Override
        public long getSize()
        {
            return 0;
        }

        @Override
        public long getSizeIncludingHeader()
        {
            return 0;
        }

        @Override
        public StoredMessage<TestMessageMetaData> getStoredMessage()
        {
            return _storedMsg;
        }


        @Override
        public boolean isPersistent()
        {
            return _storedMsg.getMetaData().isPersistent();
        }

        @Override
        public MessageReference newReference()
        {
            return _messageReference;
        }

        @Override
        public MessageReference newReference(final TransactionLogResource object)
        {
            return _messageReference;
        }

        @Override
        public boolean isReferenced(final TransactionLogResource resource)
        {
            return false;
        }

        @Override
        public boolean isReferenced()
        {
            return false;
        }

        @Override
        public int hashCode()
        {
            final int prime = 31;
            int result = 1;
            result = prime * result + ((_storedMsg == null) ? 0 : _storedMsg.hashCode());
            return result;
        }

        @Override
        public boolean equals(Object obj)
        {
            if (this == obj)
            {
                return true;
            }
            if (obj == null)
            {
                return false;
            }
            if (getClass() != obj.getClass())
            {
                return false;
            }
            TestServerMessage other = (TestServerMessage) obj;
            if (_storedMsg == null)
            {
                if (other._storedMsg != null)
                {
                    return false;
                }
            }
            else if (!_storedMsg.equals(other._storedMsg))
            {
                return false;
            }
            return true;
        }


    }
}
