/* ================================================================== * GeneralDatumSupport.java - Oct 3, 2014 7:41:01 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.LinkedHashSet; import java.util.Map; import java.util.Set; import net.solarnetwork.util.SerializeIgnore; import com.fasterxml.jackson.annotation.JsonIgnore; /** * Supporting abstract class for general node datum related objects. * * @author matt * @version 1.0 */ public abstract class GeneralDatumSupport implements Serializable { private static final long serialVersionUID = -4264640101068495508L; private Set<String> tags; /** * Get a String value out of a Map. If the key exists but is not a String, * {@link Object#toString()} will be called on that object. * * @param key * the key of the object to get * @param map * the map to inspect, <em>null</em> is allowed * @return the value, or <em>null</em> if not found */ protected String getMapString(String key, Map<String, ?> map) { if ( map == null ) { return null; } Object s = map.get(key); if ( s == null ) { return null; } if ( s instanceof String ) { return (String) s; } return s.toString(); } /** * Get an Integer value out of a Map. If the key exists, is not an Integer, * but is a Number, {@link Number#intValue()} will be called on that object. * * @param key * the key of the object to get * @param map * the map to inspect, <em>null</em> is allowed * @return the value, or <em>null</em> if not found */ protected Integer getMapInteger(String key, Map<String, ?> map) { if ( map == null ) { return null; } Object n = map.get(key); if ( n == null ) { return null; } if ( n instanceof Integer ) { return (Integer) n; } if ( n instanceof Number ) { return ((Number) n).intValue(); } try { return Integer.valueOf(n.toString()); } catch ( NumberFormatException e ) { return null; } } /** * Get a Long value out of a Map. If the key exists, is not a Long, but is a * Number, {@link Number#longValue()} will be called on that object. * * @param key * the key of the object to get * @param map * the map to inspect, <em>null</em> is allowed * @return the value, or <em>null</em> if not found */ protected Long getMapLong(String key, Map<String, ?> map) { if ( map == null ) { return null; } Object n = map.get(key); if ( n == null ) { return null; } if ( n instanceof Long ) { return (Long) n; } if ( n instanceof Number ) { return ((Number) n).longValue(); } try { return Long.valueOf(n.toString()); } catch ( NumberFormatException e ) { return null; } } /** * Get a Float value out of a Map. If the key exists, is not a Float, but is * a Number, {@link Number#floatValue()} will be called on that object. * * @param key * the key of the object to get * @param map * the map to inspect, <em>null</em> is allowed * @return the value, or <em>null</em> if not found */ protected Float getMapFloat(String key, Map<String, ?> map) { if ( map == null ) { return null; } Object n = map.get(key); if ( n == null ) { return null; } if ( n instanceof Float ) { return (Float) n; } if ( n instanceof Number ) { return ((Number) n).floatValue(); } try { return Float.valueOf(n.toString()); } catch ( NumberFormatException e ) { return null; } } /** * Get a Double value out of a Map. If the key exists, is not a Double, but * is a Number, {@link Number#doubleValue()} will be called on that object. * * @param key * the key of the object to get * @param map * the map to inspect, <em>null</em> is allowed * @return the value, or <em>null</em> if not found */ protected Double getMapDouble(String key, Map<String, ?> map) { if ( map == null ) { return null; } Object n = map.get(key); if ( n == null ) { return null; } if ( n instanceof Double ) { return (Double) n; } if ( n instanceof Number ) { return ((Number) n).doubleValue(); } try { return Double.valueOf(n.toString()); } catch ( NumberFormatException e ) { return null; } } /** * Get a BigDecimal value out of a Map. If the key exists but is not a * BigDecimal, {@link Object#toString()} will be called on that object and * {@link BigDecimal#BigDecimal(String)} will be returned. * * @param key * the key of the object to get * @param map * the map to inspect, <em>null</em> is allowed * @return the value, or <em>null</em> if not found */ protected BigDecimal getMapBigDecimal(String key, Map<String, ?> map) { if ( map == null ) { return null; } Object n = map.get(key); if ( n == null ) { return null; } if ( n instanceof BigDecimal ) { return (BigDecimal) n; } try { return new BigDecimal(n.toString()); } catch ( NumberFormatException e ) { return null; } } /** * Get an array of <em>tags</em>. * * @return array of tags */ @JsonIgnore @SerializeIgnore public Set<String> getTags() { return tags; } public void setTags(Set<String> tags) { this.tags = tags; } /** * Shortcut for {@link #getTags()}. * * @return map */ public Set<String> getT() { return getTags(); } public void setT(Set<String> set) { setTags(set); } /** * Return <em>true</em> if {@code tags} contains {@code tag}. * * @param tag * the tag value to test for existence * @return boolean */ public boolean hasTag(String tag) { return (tags != null && tags.contains(tag)); } /** * Add a tag value. * * @param tag * the tag value to add */ public void addTag(String tag) { if ( tag == null ) { return; } Set<String> set = tags; if ( set == null ) { set = new LinkedHashSet<String>(2); tags = set; } set.add(tag); } /** * Remove a tag value. * * @param tag * the tag value to add */ public void removeTag(String tag) { if ( tag == null ) { return; } Set<String> set = tags; if ( set != null ) { set.remove(tag); } } }