View Javadoc

1   /*
2    * Copyright (c) 2011.  The Apache Software Foundation
3    *
4    * Licensed to the Apache Software Foundation (ASF) under one
5    * or more contributor license agreements.  See the NOTICE file
6    * distributed with this work for additional information
7    * regarding copyright ownership.  The ASF licenses this file
8    * to you under the Apache License, Version 2.0 (the
9    * "License"); you may not use this file except in compliance
10   * with the License.  You may obtain a copy of the License at
11   *
12   *     http://www.apache.org/licenses/LICENSE-2.0
13   *
14   * Unless required by applicable law or agreed to in writing, software
15   * distributed under the License is distributed on an "AS IS" BASIS,
16   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17   * See the License for the specific language governing permissions and
18   * limitations under the License.
19   */
20  
21  package org.apache.hadoop.hbase.hbql.impl;
22  
23  import org.apache.hadoop.hbase.hbql.util.AtomicReferences;
24  
25  import java.util.NavigableMap;
26  import java.util.TreeMap;
27  import java.util.concurrent.atomic.AtomicReference;
28  
29  public class CurrentAndVersionValue<T> extends Value {
30  
31      private final AtomicReference<NavigableMap<Long, T>> atomicVersionMap      = AtomicReferences.newAtomicReference();
32      private       boolean                                currentValueSet       = false;
33      private       T                                      currentValue          = null;
34      private       long                                   currentValueTimestamp = -1;
35  
36      public CurrentAndVersionValue(final String name) {
37          super(name);
38      }
39  
40      public T getCurrentValue() {
41          return this.currentValue;
42      }
43  
44      public boolean isValueSet() {
45          return currentValueSet;
46      }
47  
48      private AtomicReference<NavigableMap<Long, T>> getAtomicVersionMap() {
49          return this.atomicVersionMap;
50      }
51  
52      public void setCurrentValue(final long timestamp, final T val) {
53          if (timestamp >= this.currentValueTimestamp) {
54              this.currentValueSet = true;
55              this.currentValueTimestamp = timestamp;
56              this.currentValue = val;
57          }
58      }
59  
60      public NavigableMap<Long, T> getVersionMap() {
61          if (this.getAtomicVersionMap().get() == null) {
62              synchronized (this) {
63                  if (this.getAtomicVersionMap().get() == null)
64                      this.setVersionMap(new TreeMap<Long, T>());
65              }
66          }
67  
68          return this.getAtomicVersionMap().get();
69      }
70  
71      public void setVersionMap(final NavigableMap<Long, T> versionMap) {
72          this.getAtomicVersionMap().set(versionMap);
73      }
74  }