| /** |
| * 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.hadoop.yarn.api.records.impl.pb; |
| |
| import java.util.ArrayList; |
| import java.util.Iterator; |
| import java.util.List; |
| |
| import org.apache.hadoop.yarn.api.records.ApplicationReport; |
| import org.apache.hadoop.yarn.api.records.ProtoBase; |
| import org.apache.hadoop.yarn.api.records.QueueInfo; |
| import org.apache.hadoop.yarn.api.records.QueueState; |
| import org.apache.hadoop.yarn.proto.YarnProtos.ApplicationReportProto; |
| import org.apache.hadoop.yarn.proto.YarnProtos.QueueInfoProto; |
| import org.apache.hadoop.yarn.proto.YarnProtos.QueueInfoProtoOrBuilder; |
| import org.apache.hadoop.yarn.proto.YarnProtos.QueueStateProto; |
| import org.apache.hadoop.yarn.util.ProtoUtils; |
| |
| public class QueueInfoPBImpl extends ProtoBase<QueueInfoProto> implements |
| QueueInfo { |
| |
| QueueInfoProto proto = QueueInfoProto.getDefaultInstance(); |
| QueueInfoProto.Builder builder = null; |
| boolean viaProto = false; |
| |
| List<ApplicationReport> applicationsList; |
| List<QueueInfo> childQueuesList; |
| |
| public QueueInfoPBImpl() { |
| builder = QueueInfoProto.newBuilder(); |
| } |
| |
| public QueueInfoPBImpl(QueueInfoProto proto) { |
| this.proto = proto; |
| viaProto = true; |
| } |
| |
| @Override |
| public List<ApplicationReport> getApplications() { |
| initLocalApplicationsList(); |
| return this.applicationsList; |
| } |
| |
| @Override |
| public float getCapacity() { |
| QueueInfoProtoOrBuilder p = viaProto ? proto : builder; |
| return (p.hasCapacity()) ? p.getCapacity() : -1; |
| } |
| |
| @Override |
| public List<QueueInfo> getChildQueues() { |
| initLocalChildQueuesList(); |
| return this.childQueuesList; |
| } |
| |
| @Override |
| public float getCurrentCapacity() { |
| QueueInfoProtoOrBuilder p = viaProto ? proto : builder; |
| return (p.hasCurrentCapacity()) ? p.getCurrentCapacity() : 0; |
| } |
| |
| @Override |
| public float getMaximumCapacity() { |
| QueueInfoProtoOrBuilder p = viaProto ? proto : builder; |
| return (p.hasMaximumCapacity()) ? p.getMaximumCapacity() : -1; |
| } |
| |
| @Override |
| public String getQueueName() { |
| QueueInfoProtoOrBuilder p = viaProto ? proto : builder; |
| return (p.hasQueueName()) ? p.getQueueName() : null; |
| } |
| |
| @Override |
| public QueueState getQueueState() { |
| QueueInfoProtoOrBuilder p = viaProto ? proto : builder; |
| if (!p.hasState()) { |
| return null; |
| } |
| return convertFromProtoFormat(p.getState()); |
| } |
| |
| @Override |
| public void setApplications(List<ApplicationReport> applications) { |
| if (applications == null) { |
| builder.clearApplications(); |
| } |
| this.applicationsList = applications; |
| } |
| |
| @Override |
| public void setCapacity(float capacity) { |
| maybeInitBuilder(); |
| builder.setCapacity(capacity); |
| } |
| |
| @Override |
| public void setChildQueues(List<QueueInfo> childQueues) { |
| if (childQueues == null) { |
| builder.clearChildQueues(); |
| } |
| this.childQueuesList = childQueues; |
| } |
| |
| @Override |
| public void setCurrentCapacity(float currentCapacity) { |
| maybeInitBuilder(); |
| builder.setCurrentCapacity(currentCapacity); |
| } |
| |
| @Override |
| public void setMaximumCapacity(float maximumCapacity) { |
| maybeInitBuilder(); |
| builder.setMaximumCapacity(maximumCapacity); |
| } |
| |
| @Override |
| public void setQueueName(String queueName) { |
| maybeInitBuilder(); |
| if (queueName == null) { |
| builder.clearQueueName(); |
| return; |
| } |
| builder.setQueueName(queueName); |
| } |
| |
| @Override |
| public void setQueueState(QueueState queueState) { |
| maybeInitBuilder(); |
| if (queueState == null) { |
| builder.clearState(); |
| return; |
| } |
| builder.setState(convertToProtoFormat(queueState)); |
| } |
| |
| @Override |
| public QueueInfoProto getProto() { |
| mergeLocalToProto(); |
| proto = viaProto ? proto : builder.build(); |
| viaProto = true; |
| return proto; |
| } |
| |
| private void initLocalApplicationsList() { |
| if (this.applicationsList != null) { |
| return; |
| } |
| QueueInfoProtoOrBuilder p = viaProto ? proto : builder; |
| List<ApplicationReportProto> list = p.getApplicationsList(); |
| applicationsList = new ArrayList<ApplicationReport>(); |
| |
| for (ApplicationReportProto a : list) { |
| applicationsList.add(convertFromProtoFormat(a)); |
| } |
| } |
| |
| private void addApplicationsToProto() { |
| maybeInitBuilder(); |
| builder.clearApplications(); |
| if (applicationsList == null) |
| return; |
| Iterable<ApplicationReportProto> iterable = new Iterable<ApplicationReportProto>() { |
| @Override |
| public Iterator<ApplicationReportProto> iterator() { |
| return new Iterator<ApplicationReportProto>() { |
| |
| Iterator<ApplicationReport> iter = applicationsList.iterator(); |
| |
| @Override |
| public boolean hasNext() { |
| return iter.hasNext(); |
| } |
| |
| @Override |
| public ApplicationReportProto next() { |
| return convertToProtoFormat(iter.next()); |
| } |
| |
| @Override |
| public void remove() { |
| throw new UnsupportedOperationException(); |
| |
| } |
| }; |
| |
| } |
| }; |
| builder.addAllApplications(iterable); |
| } |
| |
| private void initLocalChildQueuesList() { |
| if (this.childQueuesList != null) { |
| return; |
| } |
| QueueInfoProtoOrBuilder p = viaProto ? proto : builder; |
| List<QueueInfoProto> list = p.getChildQueuesList(); |
| childQueuesList = new ArrayList<QueueInfo>(); |
| |
| for (QueueInfoProto a : list) { |
| childQueuesList.add(convertFromProtoFormat(a)); |
| } |
| } |
| |
| private void addChildQueuesInfoToProto() { |
| maybeInitBuilder(); |
| builder.clearChildQueues(); |
| if (childQueuesList == null) |
| return; |
| Iterable<QueueInfoProto> iterable = new Iterable<QueueInfoProto>() { |
| @Override |
| public Iterator<QueueInfoProto> iterator() { |
| return new Iterator<QueueInfoProto>() { |
| |
| Iterator<QueueInfo> iter = childQueuesList.iterator(); |
| |
| @Override |
| public boolean hasNext() { |
| return iter.hasNext(); |
| } |
| |
| @Override |
| public QueueInfoProto next() { |
| return convertToProtoFormat(iter.next()); |
| } |
| |
| @Override |
| public void remove() { |
| throw new UnsupportedOperationException(); |
| |
| } |
| }; |
| |
| } |
| }; |
| builder.addAllChildQueues(iterable); |
| } |
| |
| private void mergeLocalToBuilder() { |
| if (this.childQueuesList != null) { |
| addChildQueuesInfoToProto(); |
| } |
| if (this.applicationsList != null) { |
| addApplicationsToProto(); |
| } |
| } |
| |
| private void mergeLocalToProto() { |
| if (viaProto) |
| maybeInitBuilder(); |
| mergeLocalToBuilder(); |
| proto = builder.build(); |
| viaProto = true; |
| } |
| |
| private void maybeInitBuilder() { |
| if (viaProto || builder == null) { |
| builder = QueueInfoProto.newBuilder(proto); |
| } |
| viaProto = false; |
| } |
| |
| |
| private ApplicationReportPBImpl convertFromProtoFormat(ApplicationReportProto a) { |
| return new ApplicationReportPBImpl(a); |
| } |
| |
| private ApplicationReportProto convertToProtoFormat(ApplicationReport t) { |
| return ((ApplicationReportPBImpl)t).getProto(); |
| } |
| |
| private QueueInfoPBImpl convertFromProtoFormat(QueueInfoProto a) { |
| return new QueueInfoPBImpl(a); |
| } |
| |
| private QueueInfoProto convertToProtoFormat(QueueInfo q) { |
| return ((QueueInfoPBImpl)q).getProto(); |
| } |
| |
| private QueueState convertFromProtoFormat(QueueStateProto q) { |
| return ProtoUtils.convertFromProtoFormat(q); |
| } |
| |
| private QueueStateProto convertToProtoFormat(QueueState queueState) { |
| return ProtoUtils.convertToProtoFormat(queueState); |
| } |
| |
| } |