001/**
002 *
003 * Licensed to the Apache Software Foundation (ASF) under one
004 * or more contributor license agreements.  See the NOTICE file
005 * distributed with this work for additional information
006 * regarding copyright ownership.  The ASF licenses this file
007 * to you under the Apache License, Version 2.0 (the
008 * "License"); you may not use this file except in compliance
009 * with the License.  You may obtain a copy of the License at
010 *
011 *     http://www.apache.org/licenses/LICENSE-2.0
012 *
013 * Unless required by applicable law or agreed to in writing, software
014 * distributed under the License is distributed on an "AS IS" BASIS,
015 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
016 * See the License for the specific language governing permissions and
017 * limitations under the License.
018 */
019
020package org.apache.hadoop.hbase.ipc;
021
022import java.util.HashMap;
023import java.util.Locale;
024
025import org.apache.yetus.audience.InterfaceAudience;
026
027@InterfaceAudience.Private
028public class MetricsHBaseServerSourceFactoryImpl extends MetricsHBaseServerSourceFactory {
029  private enum SourceStorage {
030    INSTANCE;
031    HashMap<String, MetricsHBaseServerSource> sources = new HashMap<>();
032  }
033
034  @Override
035  public MetricsHBaseServerSource create(String serverName, MetricsHBaseServerWrapper wrapper) {
036    return getSource(serverName, wrapper);
037  }
038
039  private static synchronized MetricsHBaseServerSource getSource(String serverName,
040                                                                 MetricsHBaseServerWrapper wrap) {
041    String context = createContextName(serverName);
042    MetricsHBaseServerSource source = SourceStorage.INSTANCE.sources.get(context);
043
044    if (source == null) {
045      //Create the source.
046      source = new MetricsHBaseServerSourceImpl(
047          context,
048          METRICS_DESCRIPTION,
049          context.toLowerCase(Locale.ROOT),
050          context + METRICS_JMX_CONTEXT_SUFFIX, wrap);
051
052      //Store back in storage
053      SourceStorage.INSTANCE.sources.put(context, source);
054    }
055
056    return source;
057
058  }
059
060}