/*
 * 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 "GetNewApplicationResponse.h"

namespace libyarn {

GetNewApplicationResponse::GetNewApplicationResponse() {
	this->responseProto = GetNewApplicationResponseProto::default_instance();
}

GetNewApplicationResponse::GetNewApplicationResponse(
		const GetNewApplicationResponseProto &proto) :
		responseProto(proto) {
}

GetNewApplicationResponse::~GetNewApplicationResponse() {
}

void GetNewApplicationResponse::setApplicationId(ApplicationId &appId) {
	ApplicationIdProto *proto = new ApplicationIdProto();
	proto->CopyFrom(appId.getProto());
	responseProto.set_allocated_application_id(proto);
}

ApplicationId GetNewApplicationResponse::getApplicationId() {
	return ApplicationId(responseProto.application_id());
}

void GetNewApplicationResponse::setResource(Resource &resource) {
	ResourceProto* rProto = new ResourceProto();
	rProto->CopyFrom(resource.getProto());
	responseProto.set_allocated_maximumcapability(rProto);
}

Resource GetNewApplicationResponse::getResource() {
	return Resource(responseProto.maximumcapability());
}

} /* namespace libyarn */
