001/*
002 * Licensed to the Apache Software Foundation (ASF) under one
003 * or more contributor license agreements.  See the NOTICE file
004 * distributed with this work for additional information
005 * regarding copyright ownership.  The ASF licenses this file
006 * to you under the Apache License, Version 2.0 (the
007 * "License"); you may not use this file except in compliance
008 * with the License.  You may obtain a copy of the License at
009 *
010 *     http://www.apache.org/licenses/LICENSE-2.0
011 *
012 * Unless required by applicable law or agreed to in writing, software
013 * distributed under the License is distributed on an "AS IS" BASIS,
014 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
015 * See the License for the specific language governing permissions and
016 * limitations under the License.
017 */
018package org.apache.hadoop.hbase.ipc;
019
020import java.util.HashMap;
021import java.util.Locale;
022import org.apache.yetus.audience.InterfaceAudience;
023
024@InterfaceAudience.Private
025public class MetricsHBaseServerSourceFactoryImpl extends MetricsHBaseServerSourceFactory {
026
027  @SuppressWarnings("ImmutableEnumChecker")
028  private enum SourceStorage {
029    INSTANCE;
030
031    private final 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(context, METRICS_DESCRIPTION,
047        context.toLowerCase(Locale.ROOT), context + METRICS_JMX_CONTEXT_SUFFIX, wrap);
048
049      // Store back in storage
050      SourceStorage.INSTANCE.sources.put(context, source);
051    }
052
053    return source;
054
055  }
056
057}