blob: 4035aed0dd4436aa314b6d1bcfaf15898555a7c8 [file] [log] [blame]
/*
* 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.felix.hc.api.execution;
import java.util.Arrays;
import java.util.Collection;
import java.util.LinkedList;
import java.util.List;
import org.apache.felix.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 Long asyncIntervalInSec;
private final ServiceReference serviceReference;
private final Long resultCacheTtlInMs;
private final Long keepNonOkResultsStickyForSec;
@Deprecated
private final Long warningsStickForMinutes;
@Deprecated
private final String WARNINGS_STICK_FOR_MINUTES = "hc.warningsStickForMinutes";
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.asyncIntervalInSec = toLong(ref.getProperty(HealthCheck.ASYNC_INTERVAL_IN_SEC));
this.resultCacheTtlInMs = (Long) ref.getProperty(HealthCheck.RESULT_CACHE_TTL_IN_MS);
this.keepNonOkResultsStickyForSec = toLong(ref.getProperty(HealthCheck.KEEP_NON_OK_RESULTS_STICKY_FOR_SEC));
this.warningsStickForMinutes = toLong(ref.getProperty(WARNINGS_STICK_FOR_MINUTES));
this.serviceReference = ref;
}
private Long toLong(Object configValue) {
if (configValue == null) {
return null;
}
if (configValue instanceof Long) {
return (Long) configValue;
}
return Long.valueOf(configValue.toString());
}
/** 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 interval in sec used for asynchronous execution. */
public Long getAsyncIntervalInSec() {
return asyncIntervalInSec;
}
/** 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;
}
/** Makes non-ok results stick for the given amount of time.
*
* @return Time to make non-ok results sticky in seconds. */
public Long getKeepNonOkResultsStickyForSec() {
if(keepNonOkResultsStickyForSec==null && warningsStickForMinutes!=null) {
return warningsStickForMinutes * 60;
}
return keepNonOkResultsStickyForSec;
}
@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 '" + title + "'";
}
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));
} else if (arrayProp instanceof Collection) {
Collection<?> collectionProp = (Collection<?>) arrayProp;
for(Object tagObj: collectionProp) {
res.add(tagObj.toString());
}
}
return res;
}
}