/*
 * 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.
 */

#include "GetQueueInfoRequest.h"

namespace libyarn {

GetQueueInfoRequest::GetQueueInfoRequest() {
	requestProto = GetQueueInfoRequestProto::default_instance();
}

GetQueueInfoRequest::GetQueueInfoRequest(const GetQueueInfoRequestProto &proto) :
		requestProto(proto) {
}

GetQueueInfoRequest::~GetQueueInfoRequest() {
}

GetQueueInfoRequestProto& GetQueueInfoRequest::getProto() {
	return requestProto;
}

void GetQueueInfoRequest::setQueueName(string &name) {
	requestProto.set_queuename(name);
}

string GetQueueInfoRequest::getQueueName() {
	return requestProto.queuename();
}

void GetQueueInfoRequest::setIncludeApplications(bool includeApplications) {
	requestProto.set_includeapplications(includeApplications);
}

bool GetQueueInfoRequest::getIncludeApplications() {
	return requestProto.includeapplications();
}

void GetQueueInfoRequest::setIncludeChildQueues(bool includeChildQueues) {
	requestProto.set_includechildqueues(includeChildQueues);
}

bool GetQueueInfoRequest::getIncludeChildQueues() {
	return requestProto.includechildqueues();
}

void GetQueueInfoRequest::setRecursive(bool recursive) {
	requestProto.set_recursive(recursive);
}

bool GetQueueInfoRequest::getRecursive() {
	return requestProto.recursive();
}

} /* namespace libyarn */
