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 }