/** * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.ambari.server.controller.metrics; import static org.apache.ambari.server.controller.metrics.MetricsPaddingMethod.ZERO_PADDING_PARAM; import java.util.Map; import java.util.Set; import java.util.regex.Pattern; import org.apache.ambari.server.configuration.ComponentSSLConfiguration; import org.apache.ambari.server.controller.internal.AbstractPropertyProvider; import org.apache.ambari.server.controller.internal.PropertyInfo; import org.apache.ambari.server.controller.internal.URLStreamProvider; import org.apache.ambari.server.controller.metrics.timeline.cache.TimelineMetricCacheProvider; import org.apache.ambari.server.controller.spi.Predicate; import org.apache.ambari.server.controller.spi.Request; import org.apache.ambari.server.controller.spi.Resource; import org.apache.ambari.server.controller.spi.SystemException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public abstract class MetricsPropertyProvider extends AbstractPropertyProvider { protected final static Logger LOG = LoggerFactory.getLogger(MetricsPropertyProvider.class); protected static final Pattern questionMarkPattern = Pattern.compile("\\?"); protected final URLStreamProvider streamProvider; protected final MetricHostProvider hostProvider; protected final String clusterNamePropertyId; protected final String hostNamePropertyId; protected final String componentNamePropertyId; protected final ComponentSSLConfiguration configuration; protected MetricsPaddingMethod metricsPaddingMethod; private static final MetricsPaddingMethod DEFAULT_PADDING_METHOD = new MetricsPaddingMethod(MetricsPaddingMethod.PADDING_STRATEGY.ZEROS); protected MetricsPropertyProvider(Map<String, Map<String, PropertyInfo>> componentPropertyInfoMap, URLStreamProvider streamProvider, ComponentSSLConfiguration configuration, MetricHostProvider hostProvider, String clusterNamePropertyId, String hostNamePropertyId, String componentNamePropertyId) { super(componentPropertyInfoMap); this.streamProvider = streamProvider; this.configuration = configuration; this.hostProvider = hostProvider; this.clusterNamePropertyId = clusterNamePropertyId; this.hostNamePropertyId = hostNamePropertyId; this.componentNamePropertyId = componentNamePropertyId; } public static MetricsPropertyProviderProxy createInstance( Resource.Type type, Map<String, Map<String, PropertyInfo>> componentPropertyInfoMap, URLStreamProvider streamProvider, ComponentSSLConfiguration configuration, TimelineMetricCacheProvider cacheProvider, MetricHostProvider hostProvider, MetricsServiceProvider serviceProvider, String clusterNamePropertyId, String hostNamePropertyId, String componentNamePropertyId) { if (type.isInternalType()) { return new MetricsPropertyProviderProxy( type.getInternalType(), componentPropertyInfoMap, streamProvider, configuration, cacheProvider, hostProvider, serviceProvider, clusterNamePropertyId, hostNamePropertyId, componentNamePropertyId ); } return null; } /** * Get the host name for the given resource. * * @param resource the resource * * @return the host name */ protected abstract String getHostName(Resource resource); /** * Get the component name for the given resource. * * @param resource the resource * * @return the component name */ protected abstract String getComponentName(Resource resource); @Override public Set<Resource> populateResources(Set<Resource> resources, Request request, Predicate predicate) throws SystemException { Set<String> ids = getRequestPropertyIds(request, predicate); if (ids.isEmpty()) { return resources; } if (!checkAuthorizationForMetrics(resources, clusterNamePropertyId)) { return resources; } // Re-initialize in case of reuse. metricsPaddingMethod = DEFAULT_PADDING_METHOD; Set<String> requestPropertyIds = request.getPropertyIds(); if (requestPropertyIds != null && !requestPropertyIds.isEmpty()) { for (String propertyId : requestPropertyIds) { if (propertyId.startsWith(ZERO_PADDING_PARAM)) { String paddingStrategyStr = propertyId.substring(ZERO_PADDING_PARAM.length() + 1); metricsPaddingMethod = new MetricsPaddingMethod( MetricsPaddingMethod.PADDING_STRATEGY.valueOf(paddingStrategyStr)); } } } return populateResourcesWithProperties(resources, request, ids); } /** * Delegate implementation of populating resources to concrete providers. * * @param resources @Resource * @param request @Request * @param propertyIds Set of ids * @return @Set of resources * @throws SystemException */ protected abstract Set<Resource> populateResourcesWithProperties(Set<Resource> resources, Request request, Set<String> propertyIds) throws SystemException; /** * Get a comma delimited string from the given set of strings or * an empty string if the size of the given set is greater than * the given limit. * * @param set the set of strings * @param limit the upper size limit for the list * * @return a comma delimited string of strings */ public static String getSetString(Set<String> set, int limit) { StringBuilder sb = new StringBuilder(); if (limit == -1 || set.size() <= limit) { for (String cluster : set) { if (sb.length() > 0) { sb.append(','); } sb.append(cluster); } } return sb.toString(); } }