View Javadoc

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    public 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    public 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  }