/* ================================================================== * GeneralNodeDatumSamples.java - Aug 22, 2014 6:26:13 AM * * Copyright 2007-2014 SolarNetwork.net Dev Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of * the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA * 02111-1307 USA * ================================================================== */ package net.solarnetwork.domain; import java.io.Serializable; import java.math.BigDecimal; import java.util.LinkedHashMap; import java.util.LinkedHashSet; import java.util.Map; import net.solarnetwork.util.SerializeIgnore; import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonPropertyOrder; /** * Metadata about general node datum streams of data. * * @author matt * @version 1.1 */ @JsonPropertyOrder({ "m", "pm", "t" }) public class GeneralDatumMetadata extends GeneralDatumSupport implements Serializable { private static final long serialVersionUID = -2571643375746163527L; private Map<String, Object> info; private Map<String, Map<String, Object>> propertyInfo; /** * Default constructor. */ public GeneralDatumMetadata() { super(); } /** * Copy constructor. */ public GeneralDatumMetadata(GeneralDatumMetadata other) { super(); if ( other.getTags() != null ) { setTags(new LinkedHashSet<String>(other.getTags())); } if ( other.info != null ) { info = new LinkedHashMap<String, Object>(other.info); } if ( other.propertyInfo != null ) { propertyInfo = new LinkedHashMap<String, Map<String, Object>>(other.propertyInfo); } } /** * Merge the values from another {@link GeneralDatumMetadata} instance into * this one. Existing values will <b>not</b> be replaced by values in the * provided instance, only new values will be merged. * * @param meta * the metadata to merge into this object * @param replace * if <em>true</em> then replace values in this object with * equivalent ones in the provided object, otherwise keep the values * from this object */ public void merge(final GeneralDatumMetadata meta, final boolean replace) { if ( meta.getTags() != null ) { for ( String tag : meta.getTags() ) { addTag(tag); } } if ( meta.getInfo() != null ) { for ( Map.Entry<String, Object> me : meta.getInfo().entrySet() ) { // only overwrite keys, if replace is true if ( replace || getInfo() == null || getInfo().containsKey(me.getKey()) == false ) { putInfoValue(me.getKey(), me.getValue()); } } } if ( meta.getPropertyInfo() != null ) { Map<String, Map<String, Object>> gdmPropertyMeta = getPropertyInfo(); if ( gdmPropertyMeta == null ) { setPropertyInfo(meta.getPropertyInfo()); } else { for ( Map.Entry<String, Map<String, Object>> me : meta.getPropertyInfo().entrySet() ) { if ( gdmPropertyMeta.get(me.getKey()) == null ) { gdmPropertyMeta.put(me.getKey(), me.getValue()); } else { for ( Map.Entry<String, Object> pme : me.getValue().entrySet() ) { if ( replace == false && gdmPropertyMeta.get(me.getKey()).containsKey(pme.getKey()) ) { continue; } putInfoValue(me.getKey(), pme.getKey(), pme.getValue()); } } } } } } /** * Construct with values. * * @param info * the info data */ public GeneralDatumMetadata(Map<String, Object> info) { super(); this.info = info; } /** * Construct with values. * * @param info * the info data * @param propertyInfo * the property info data */ public GeneralDatumMetadata(Map<String, Object> info, Map<String, Map<String, Object>> propertyInfo) { super(); this.info = info; this.propertyInfo = propertyInfo; } /** * Put a value into or remove a value from the {@link #getInfo()} map, * creating the map if it doesn't exist. * * @param key * the key to put * @param value * the value to put, or <em>null</em> to remove the key */ public void putInfoValue(String key, Object value) { Map<String, Object> m = info; if ( m == null ) { if ( value == null ) { return; } m = new LinkedHashMap<String, Object>(4); info = m; } if ( value == null ) { m.remove(key); } else { m.put(key, value); } } /** * Get an Integer value from the {@link #getInfo()} map, or <em>null</em> if * not available. * * @param key * the key of the value to get * @return the value as an Integer, or <em>null</em> if not available */ public Integer getInfoInteger(String key) { return getMapInteger(key, info); } /** * Get a Long value from the {@link #getInfo()} map, or <em>null</em> if not * available. * * @param key * the key of the value to get * @return the value as an Long, or <em>null</em> if not available */ public Long getInfoLong(String key) { return getMapLong(key, info); } /** * Get a Float value from the {@link #getInfo()} map, or <em>null</em> if * not available. * * @param key * the key of the value to get * @return the value as an Float, or <em>null</em> if not available */ public Float getInfoFloat(String key) { return getMapFloat(key, info); } /** * Get a Double value from the {@link #getInfo()} map, or <em>null</em> if * not available. * * @param key * the key of the value to get * @return the value as an Double, or <em>null</em> if not available */ public Double getInfoDouble(String key) { return getMapDouble(key, info); } /** * Get a BigDecimal value from the {@link #getInfo()} map, or <em>null</em> * if not available. * * @param key * the key of the value to get * @return the value as an BigDecimal, or <em>null</em> if not available */ public BigDecimal getInfoBigDecimal(String key) { return getMapBigDecimal(key, info); } /** * Get a String value from the {@link #getInfo()} map, or <em>null</em> if * not available. * * @param key * the key of the value to get * @return the value as a String, or <em>null</em> if not available */ public String getInfoString(String key) { return getMapString(key, info); } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((info == null) ? 0 : info.hashCode()); result = prime * result + ((propertyInfo == null) ? 0 : propertyInfo.hashCode()); result = prime * result + ((getTags() == null) ? 0 : getTags().hashCode()); return result; } @Override public boolean equals(Object obj) { if ( this == obj ) { return true; } if ( obj == null ) { return false; } if ( getClass() != obj.getClass() ) { return false; } GeneralDatumMetadata other = (GeneralDatumMetadata) obj; if ( info == null ) { if ( other.info != null ) { return false; } } else if ( !info.equals(other.info) ) { return false; } if ( propertyInfo == null ) { if ( other.propertyInfo != null ) { return false; } } else if ( !propertyInfo.equals(other.propertyInfo) ) { return false; } if ( getTags() == null ) { if ( other.getTags() != null ) { return false; } } else if ( !getTags().equals(other.getTags()) ) { return false; } return true; } /** * Get a map of <em>info</em> values. These are arbitrary values. * * @return map of info values */ @JsonIgnore @SerializeIgnore public Map<String, Object> getInfo() { return info; } public void setInfo(Map<String, Object> info) { this.info = info; } /** * Shortcut for {@link #getInfo()}. * * @return map */ public Map<String, Object> getM() { return getInfo(); } /** * Shortcut for {@link #setInfo(Map)}. * * @param map * the Map to set */ public void setM(Map<String, Object> map) { setInfo(map); } /** * Get a map of <em>property info</em> maps. Each top-level key represents a * property name and the associated map the metadata for that property. * * @return map */ @JsonIgnore @SerializeIgnore public Map<String, Map<String, Object>> getPropertyInfo() { return propertyInfo; } public void setPropertyInfo(Map<String, Map<String, Object>> propertyInfo) { this.propertyInfo = propertyInfo; } /** * Shortcut for {@link #getPropertyInfo()}. * * @return the map */ public Map<String, Map<String, Object>> getPm() { return getPropertyInfo(); } /** * Shortcut for {@link GeneralDatumMetadata#setPropertyInfo(Map)}. * * @param map * the map to set */ public void setPm(Map<String, Map<String, Object>> map) { setPropertyInfo(map); } /** * Put a value into or remove a value from the {@link #getPropertyInfo()} * map, creating the map if it doesn't exist. * * @param property * the property name * @param key * the key to put * @param value * the value to put, or <em>null</em> to remove the key */ public void putInfoValue(String property, String key, Object value) { Map<String, Map<String, Object>> pm = propertyInfo; if ( pm == null ) { if ( value == null ) { return; } pm = new LinkedHashMap<String, Map<String, Object>>(4); propertyInfo = pm; } Map<String, Object> m = pm.get(property); if ( m == null ) { if ( value == null ) { return; } m = new LinkedHashMap<String, Object>(4); pm.put(property, m); } if ( value == null ) { m.remove(key); } else { m.put(key, value); } } /** * Get an Integer value from the {@link #getPropertyInfo()} map, or * <em>null</em> if not available. * * @param property * the property name * @param key * the key of the value to get * @return the value as an Integer, or <em>null</em> if not available */ public Integer getInfoInteger(String property, String key) { return getMapInteger(key, (propertyInfo == null ? null : propertyInfo.get(property))); } /** * Get a Long value from the {@link #getPropertyInfo()} map, or * <em>null</em> if not available. * * @param property * the property name * @param key * the key of the value to get * @return the value as an Long, or <em>null</em> if not available */ public Long getInfoLong(String property, String key) { return getMapLong(key, (propertyInfo == null ? null : propertyInfo.get(property))); } /** * Get a Float value from the {@link #getPropertyInfo()} map, or * <em>null</em> if not available. * * @param property * the property name * @param key * the key of the value to get * @return the value as an Float, or <em>null</em> if not available */ public Float getInfoFloat(String property, String key) { return getMapFloat(key, (propertyInfo == null ? null : propertyInfo.get(property))); } /** * Get a Double value from the {@link #getPropertyInfo()} map, or * <em>null</em> if not available. * * @param property * the property name * @param key * the key of the value to get * @return the value as an Double, or <em>null</em> if not available */ public Double getInfoDouble(String property, String key) { return getMapDouble(key, (propertyInfo == null ? null : propertyInfo.get(property))); } /** * Get a BigDecimal value from the {@link #getPropertyInfo()} map, or * <em>null</em> if not available. * * @param property * the property name * @param key * the key of the value to get * @return the value as an BigDecimal, or <em>null</em> if not available */ public BigDecimal getInfoBigDecimal(String property, String key) { return getMapBigDecimal(key, (propertyInfo == null ? null : propertyInfo.get(property))); } /** * Get a String value from the {@link #getPropertyInfo()} map, or * <em>null</em> if not available. * * @param property * the property name * @param key * the key of the value to get * @return the value as a String, or <em>null</em> if not available */ public String getInfoString(String property, String key) { return getMapString(key, (propertyInfo == null ? null : propertyInfo.get(property))); } }