/**
 * 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.
 */
// Generated by http://code.google.com/p/protostuff/ ... DO NOT EDIT!
// Generated from BitControl.Proto

package org.apache.drill.exec.proto;

import java.io.Externalizable;
import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectOutput;
import java.util.ArrayList;
import java.util.List;

import com.dyuproject.protostuff.GraphIOUtil;
import com.dyuproject.protostuff.Input;
import com.dyuproject.protostuff.Message;
import com.dyuproject.protostuff.Output;
import com.dyuproject.protostuff.Schema;

public final class BitStatus implements Externalizable, Message<BitStatus>, Schema<BitStatus>
{

    public static Schema<BitStatus> getSchema()
    {
        return DEFAULT_INSTANCE;
    }

    public static BitStatus getDefaultInstance()
    {
        return DEFAULT_INSTANCE;
    }

    static final BitStatus DEFAULT_INSTANCE = new BitStatus();

    
    private List<FragmentStatus> fragmentStatus;

    public BitStatus()
    {
        
    }

    // getters and setters

    // fragmentStatus

    public List<FragmentStatus> getFragmentStatusList()
    {
        return fragmentStatus;
    }

    public void setFragmentStatusList(List<FragmentStatus> fragmentStatus)
    {
        this.fragmentStatus = fragmentStatus;
    }

    // java serialization

    public void readExternal(ObjectInput in) throws IOException
    {
        GraphIOUtil.mergeDelimitedFrom(in, this, this);
    }

    public void writeExternal(ObjectOutput out) throws IOException
    {
        GraphIOUtil.writeDelimitedTo(out, this, this);
    }

    // message method

    public Schema<BitStatus> cachedSchema()
    {
        return DEFAULT_INSTANCE;
    }

    // schema methods

    public BitStatus newMessage()
    {
        return new BitStatus();
    }

    public Class<BitStatus> typeClass()
    {
        return BitStatus.class;
    }

    public String messageName()
    {
        return BitStatus.class.getSimpleName();
    }

    public String messageFullName()
    {
        return BitStatus.class.getName();
    }

    public boolean isInitialized(BitStatus message)
    {
        return true;
    }

    public void mergeFrom(Input input, BitStatus message) throws IOException
    {
        for(int number = input.readFieldNumber(this);; number = input.readFieldNumber(this))
        {
            switch(number)
            {
                case 0:
                    return;
                case 1:
                    if(message.fragmentStatus == null)
                        message.fragmentStatus = new ArrayList<FragmentStatus>();
                    message.fragmentStatus.add(input.mergeObject(null, FragmentStatus.getSchema()));
                    break;

                default:
                    input.handleUnknownField(number, this);
            }   
        }
    }


    public void writeTo(Output output, BitStatus message) throws IOException
    {
        if(message.fragmentStatus != null)
        {
            for(FragmentStatus fragmentStatus : message.fragmentStatus)
            {
                if(fragmentStatus != null)
                    output.writeObject(1, fragmentStatus, FragmentStatus.getSchema(), true);
            }
        }

    }

    public String getFieldName(int number)
    {
        switch(number)
        {
            case 1: return "fragmentStatus";
            default: return null;
        }
    }

    public int getFieldNumber(String name)
    {
        final Integer number = __fieldMap.get(name);
        return number == null ? 0 : number.intValue();
    }

    private static final java.util.HashMap<String,Integer> __fieldMap = new java.util.HashMap<String,Integer>();
    static
    {
        __fieldMap.put("fragmentStatus", 1);
    }
    
}
