/* * 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 SF 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.sling.hc.util; import java.util.Arrays; import java.util.LinkedList; import java.util.List; import org.apache.sling.hc.api.HealthCheck; import org.osgi.annotation.versioning.ProviderType; import org.osgi.framework.Constants; import org.osgi.framework.ServiceReference; /** * This class helps retrieving meta data information about a health check service. * @since 1.1 */ @ProviderType public class HealthCheckMetadata { private final String name; private final String mbeanName; private final String title; private final long serviceId; private final List<String> tags; private final String asyncCronExpression; private final transient ServiceReference serviceReference; private final Long resultCacheTtlInMs; public HealthCheckMetadata(final ServiceReference ref) { this.serviceId = (Long) ref.getProperty(Constants.SERVICE_ID); this.name = (String) ref.getProperty(HealthCheck.NAME); this.mbeanName = (String) ref.getProperty(HealthCheck.MBEAN_NAME); this.title = getHealthCheckTitle(ref); this.tags = arrayPropertyToListOfStr(ref.getProperty(HealthCheck.TAGS)); this.asyncCronExpression = (String) ref.getProperty(HealthCheck.ASYNC_CRON_EXPRESSION); this.resultCacheTtlInMs = (Long)ref.getProperty(HealthCheck.RESULT_CACHE_TTL_IN_MS); this.serviceReference = ref; } /** * The name of the health check as defined through the {@link HealthCheck#NAME} * property. * @return The name or <code>null</code> */ public String getName() { return name; } /** * The mbean name of the health check as defined through the {@link HealthCheck#MBEAN_NAME} * property. * @return The mbean name or <code>null</code> */ public String getMBeanName() { return mbeanName; } /** * The title of the health check. * If the health check has a name, this is used as the title. * Otherwise the description, PID and service ID are checked * for values. */ public String getTitle() { return title; } /** * Return the list of defined tags for this check as set * through {@link HealthCheckMetadata#tags} * @return */ public List<String> getTags() { return tags; } /** * Return the cron expression used for asynchronous execution. */ public String getAsyncCronExpression() { return asyncCronExpression; } /** * Return the service id. */ public long getServiceId() { return this.serviceId; } /** * Get the service reference. */ public ServiceReference getServiceReference() { return this.serviceReference; } /** * TTL for the result cache in ms. * * @return TTL for the result cache or <code>null</code> if not configured. */ public Long getResultCacheTtlInMs() { return resultCacheTtlInMs; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + (int) (serviceId ^ (serviceId >>> 32)); return result; } @Override public boolean equals(final Object obj) { if ( !(obj instanceof HealthCheckMetadata)) { return false; } final HealthCheckMetadata other = (HealthCheckMetadata) obj; return serviceId == other.serviceId; } @Override public String toString() { return "HealthCheck '" + name + "'"; } private String getHealthCheckTitle(final ServiceReference ref) { String name = (String) ref.getProperty(HealthCheck.NAME); if (name == null || name.isEmpty()) { final Object val = ref.getProperty(Constants.SERVICE_DESCRIPTION); if ( val != null ) { name = val.toString(); } } if (name == null || name.isEmpty()) { name = "HealthCheck:" + ref.getProperty(Constants.SERVICE_ID); final Object val = ref.getProperty(Constants.SERVICE_PID); String pid = null; if ( val instanceof String ) { pid = (String)val; } else if ( val instanceof String[]) { pid = Arrays.toString((String[])val); } if ( pid != null && !pid.isEmpty() ) { name = name + " (" + pid + ")"; } } return name; } private List<String> arrayPropertyToListOfStr(final Object arrayProp) { List<String> res = new LinkedList<>(); if (arrayProp instanceof String) { res.add((String) arrayProp); } else if (arrayProp instanceof String[]) { res.addAll(Arrays.asList((String[]) arrayProp)); } return res; } }