1 /*
2 * Copyright 2010 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 package org.apache.hadoop.hbase.util;
21
22 /**
23 * Manages a singleton instance of the environment edge. This class shall
24 * implement static versions of the interface {@link EnvironmentEdge}, then
25 * defer to the delegate on invocation.
26 */
27 public class EnvironmentEdgeManager {
28 private static volatile EnvironmentEdge delegate = new DefaultEnvironmentEdge();
29
30 private EnvironmentEdgeManager() {
31
32 }
33
34 /**
35 * Retrieves the singleton instance of the {@link EnvironmentEdge} that is
36 * being managed.
37 *
38 * @return the edge.
39 */
40 public static EnvironmentEdge getDelegate() {
41 return delegate;
42 }
43
44 /**
45 * Resets the managed instance to the default instance: {@link
46 * DefaultEnvironmentEdge}.
47 */
48 static void reset() {
49 injectEdge(new DefaultEnvironmentEdge());
50 }
51
52 /**
53 * Injects the given edge such that it becomes the managed entity. If null is
54 * passed to this method, the default type is assigned to the delegate.
55 *
56 * @param edge the new edge.
57 */
58 static void injectEdge(EnvironmentEdge edge) {
59 if (edge == null) {
60 reset();
61 } else {
62 delegate = edge;
63 }
64 }
65
66 /**
67 * Defers to the delegate and calls the
68 * {@link EnvironmentEdge#currentTimeMillis()} method.
69 *
70 * @return current time in millis according to the delegate.
71 */
72 public static long currentTimeMillis() {
73 return getDelegate().currentTimeMillis();
74 }
75 }