1 /** 2 * Licensed to the Apache Software Foundation (ASF) under one 3 * or more contributor license agreements. See the NOTICE file 4 * distributed with this work for additional information 5 * regarding copyright ownership. The ASF licenses this file 6 * to you under the Apache License, Version 2.0 (the 7 * "License"); you may not use this file except in compliance 8 * with the License. You may obtain a copy of the License at 9 * 10 * http://www.apache.org/licenses/LICENSE-2.0 11 * 12 * Unless required by applicable law or agreed to in writing, software 13 * distributed under the License is distributed on an "AS IS" BASIS, 14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 15 * See the License for the specific language governing permissions and 16 * limitations under the License. 17 */ 18 19 package org.apache.hadoop.mapreduce.v2.api.records.impl.pb; 20 21 import org.apache.hadoop.mapreduce.v2.api.records.JobId; 22 import org.apache.hadoop.mapreduce.v2.proto.MRProtos.JobIdProto; 23 import org.apache.hadoop.mapreduce.v2.proto.MRProtos.JobIdProtoOrBuilder; 24 import org.apache.hadoop.yarn.api.records.ApplicationId; 25 import org.apache.hadoop.yarn.api.records.impl.pb.ApplicationIdPBImpl; 26 import org.apache.hadoop.yarn.proto.YarnProtos.ApplicationIdProto; 27 28 public class JobIdPBImpl extends JobId { 29 30 JobIdProto proto = JobIdProto.getDefaultInstance(); 31 JobIdProto.Builder builder = null; 32 boolean viaProto = false; 33 34 private ApplicationId applicationId = null; 35 JobIdPBImpl()36 public JobIdPBImpl() { 37 builder = JobIdProto.newBuilder(); 38 } 39 JobIdPBImpl(JobIdProto proto)40 public JobIdPBImpl(JobIdProto proto) { 41 this.proto = proto; 42 viaProto = true; 43 } 44 getProto()45 public synchronized JobIdProto getProto() { 46 mergeLocalToProto(); 47 proto = viaProto ? proto : builder.build(); 48 viaProto = true; 49 return proto; 50 } 51 mergeLocalToBuilder()52 private synchronized void mergeLocalToBuilder() { 53 if (this.applicationId != null 54 && !((ApplicationIdPBImpl) this.applicationId).getProto().equals( 55 builder.getAppId())) { 56 builder.setAppId(convertToProtoFormat(this.applicationId)); 57 } 58 } 59 mergeLocalToProto()60 private synchronized void mergeLocalToProto() { 61 if (viaProto) 62 maybeInitBuilder(); 63 mergeLocalToBuilder(); 64 proto = builder.build(); 65 viaProto = true; 66 } 67 maybeInitBuilder()68 private synchronized void maybeInitBuilder() { 69 if (viaProto || builder == null) { 70 builder = JobIdProto.newBuilder(proto); 71 } 72 viaProto = false; 73 } 74 75 76 @Override getAppId()77 public synchronized ApplicationId getAppId() { 78 JobIdProtoOrBuilder p = viaProto ? proto : builder; 79 if (applicationId != null) { 80 return applicationId; 81 } // Else via proto 82 if (!p.hasAppId()) { 83 return null; 84 } 85 applicationId = convertFromProtoFormat(p.getAppId()); 86 return applicationId; 87 } 88 89 @Override setAppId(ApplicationId appId)90 public synchronized void setAppId(ApplicationId appId) { 91 maybeInitBuilder(); 92 if (appId == null) { 93 builder.clearAppId(); 94 } 95 this.applicationId = appId; 96 } 97 @Override getId()98 public synchronized int getId() { 99 JobIdProtoOrBuilder p = viaProto ? proto : builder; 100 return (p.getId()); 101 } 102 103 @Override setId(int id)104 public synchronized void setId(int id) { 105 maybeInitBuilder(); 106 builder.setId((id)); 107 } 108 convertFromProtoFormat( ApplicationIdProto p)109 private ApplicationIdPBImpl convertFromProtoFormat( 110 ApplicationIdProto p) { 111 return new ApplicationIdPBImpl(p); 112 } 113 convertToProtoFormat(ApplicationId t)114 private ApplicationIdProto convertToProtoFormat(ApplicationId t) { 115 return ((ApplicationIdPBImpl) t).getProto(); 116 } 117 }