/**
* Copyright (c) 2010-2016 by the respective copyright holders.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*/
package org.openhab.binding.astro.internal.common;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Dictionary;
import java.util.TimeZone;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.builder.ToStringBuilder;
import org.apache.commons.lang.builder.ToStringStyle;
import org.osgi.service.cm.ConfigurationException;
/**
* Parses the config in openhab.cfg.
*
* <pre>
* ############################## Astro Binding ##############################
* #
* # The latitude
* astro:latitude=nn.nnnnnn
*
* # The longitude
* astro:longitude=nn.nnnnnn
*
* # Refresh interval for sun azimuth/elevation and moon distance/illumination calculation in seconds (optional, defaults to disabled)
* astro:interval=nnn
* </pre>
*
* @author Gerhard Riegler
* @since 1.5.0
*/
public class AstroConfig {
private static final String CONFIG_KEY_LATITUDE = "latitude";
private static final String CONFIG_KEY_LONGITUDE = "longitude";
private static final String CONFIG_KEY_INTERVAL = "interval";
private double latitude;
private double longitude;
private int interval;
private boolean valid;
/**
* Parses and validates the properties in the openhab.cfg.
*/
public void parse(Dictionary<String, ?> properties) throws ConfigurationException {
valid = false;
String cfgLatitude = (String) properties.get(AstroConfig.CONFIG_KEY_LATITUDE);
String cfgLongitude = (String) properties.get(AstroConfig.CONFIG_KEY_LONGITUDE);
if (StringUtils.isBlank(cfgLatitude) || StringUtils.isBlank(cfgLongitude)) {
throw new ConfigurationException("astro",
"Parameters latitude and longitude are mandatory and must be configured. Please check your openhab.cfg!");
}
try {
latitude = Double.parseDouble(cfgLatitude);
longitude = Double.parseDouble(cfgLongitude);
} catch (NumberFormatException ex) {
throw new ConfigurationException("astro",
"Parameters latitude and/or longitude in wrong format. Please check your openhab.cfg!");
}
interval = parseInt(properties, CONFIG_KEY_INTERVAL, 0);
valid = true;
}
/**
* Parses a integer property.
*/
private Integer parseInt(Dictionary<String, ?> properties, String key, Integer defaultValue)
throws ConfigurationException {
String value = (String) properties.get(key);
if (StringUtils.isNotBlank(value)) {
try {
return Integer.parseInt(value);
} catch (NumberFormatException ex) {
throw new ConfigurationException("astro",
"Parameter " + key + " in wrong format. Please check your openhab.cfg!");
}
} else {
return defaultValue;
}
}
/**
* Returns true if the AstroConfig has valid parameters.
*/
public boolean isValid() {
return valid;
}
/**
* Returns the specified latitude.
*/
public double getLatitude() {
return latitude;
}
/**
* Returns the specified longitude.
*/
public double getLongitude() {
return longitude;
}
/**
* Returns the specified interval.
*/
public int getInterval() {
return interval;
}
@Override
public String toString() {
String intervallMessage = (interval == 0 ? "disabled" : String.valueOf(interval));
TimeZone tz = TimeZone.getDefault();
StringBuilder tzInfo = new StringBuilder();
tzInfo.append(tz.getID());
tzInfo.append(" (").append(tz.getDisplayName(false, TimeZone.SHORT)).append(" ")
.append(new SimpleDateFormat("Z").format(Calendar.getInstance().getTime()));
tzInfo.append(")");
return new ToStringBuilder(this, ToStringStyle.SHORT_PREFIX_STYLE).append("latitude", latitude)
.append("longitude", longitude).append("interval", intervallMessage)
.append("systemTimezone", tzInfo.toString())
.append("daylightSavings", Calendar.getInstance().get(Calendar.DST_OFFSET) != 0).toString();
}
}