
com.brettonw.bag.Bag Maven / Gradle / Ivy
package com.brettonw.bag;
import com.brettonw.bag.json.FormatReaderJson;
import com.brettonw.bag.json.FormatWriterJson;
import org.apache.logging.log4j.util.Supplier;
import java.io.File;
import java.util.function.Function;
abstract class Bag {
Object objectify (Object value) {
if (value != null) {
Class type = value.getClass ();
String typeName = type.getName ();
switch (typeName) {
case "java.lang.String":
// is this the right place to do a transformation that converts quotes to some
// escape character?
return value;
case "java.lang.Long": case "java.lang.Integer": case "java.lang.Short": case "java.lang.Byte":
case "java.lang.Character":
case "java.lang.Boolean":
case "java.lang.Double": case "java.lang.Float":
return value.toString ();
case "com.brettonw.bag.BagObject":
case "com.brettonw.bag.BagArray":
return value;
default:
// no other type should be stored in the bag classes
//log.error ("Unhandled type: " + typeName);
throw new UnsupportedTypeException (type);
}
}
return null;
}
abstract public Object getObject (String key);
/**
* Retrieve a mapped element and return it as a String.
*
* @param key A string value used to index the element.
* @return The element as a string, or null if the element is not found (or not a String).
*/
public String getString (String key) {
return getString (key, () -> null);
}
/**
* Retrieve a mapped element and return it as a String.
*
* @param key A string value used to index the element.
* @param notFound A function to create a new String if the requested key was not found
* @return The element as a string, or notFound if the element is not found.
*/
public String getString (String key, Supplier notFound) {
Object object = getObject (key);
return (object instanceof String) ? (String) object : notFound.get ();
}
/**
* Retrieve a mapped element and return it as a BagObject.
*
* @param key A string value used to index the element.
* @return The element as a BagObject, or null if the element is not found.
*/
public BagObject getBagObject (String key) {
return getBagObject (key, () -> null);
}
/**
* Retrieve a mapped element and return it as a BagObject.
*
* @param key A string value used to index the element.
* @param notFound A function to create a new BagObject if the requested key was not found
* @return The element as a BagObject, or notFound if the element is not found.
*/
public BagObject getBagObject (String key, Supplier notFound) {
Object object = getObject (key);
return (object instanceof BagObject) ? (BagObject) object : notFound.get ();
}
/**
* Retrieve a mapped element and return it as a BagArray.
*
* @param key A string value used to index the element.
* @return The element as a BagArray, or null if the element is not found.
*/
public BagArray getBagArray (String key) {
return getBagArray (key, () -> null);
}
/**
* Retrieve a mapped element and return it as a BagArray.
*
* @param key A string value used to index the element.
* @param notFound A function to create a new BagArray if the requested key was not found
* @return The element as a BagArray, or notFound if the element is not found.
*/
public BagArray getBagArray (String key, Supplier notFound) {
Object object = getObject (key);
return (object instanceof BagArray) ? (BagArray) object : notFound.get ();
}
private T getParsed (String key, Function parser, Supplier notFound) {
Object object = getObject (key);
return (object instanceof String) ? parser.apply ((String) object) : notFound.get ();
}
/**
* Retrieve a mapped element and return it as a Boolean.
*
* @param key A string value used to index the element.
* @return The element as a Boolean, or null if the element is not found.
*/
public Boolean getBoolean (String key) {
return getBoolean (key, () -> null);
}
/**
* Retrieve a mapped element and return it as a Boolean.
*
* @param key A string value used to index the element.
* @param notFound A function to create a new Boolean if the requested key was not found
* @return The element as a Boolean, or notFound if the element is not found.
*/
public Boolean getBoolean (String key, Supplier notFound) {
return getParsed (key, Boolean::new, notFound);
}
/**
* Retrieve a mapped element and return it as a Long.
*
* @param key A string value used to index the element.
* @return The element as a Long, or null if the element is not found.
*/
public Long getLong (String key) {
return getLong (key, () -> null);
}
/**
* Retrieve a mapped element and return it as a Long.
*
* @param key A string value used to index the element.
* @param notFound A function to create a new Long if the requested key was not found
* @return The element as a Long, or notFound if the element is not found.
*/
public Long getLong (String key, Supplier notFound) {
return getParsed (key, Long::new, notFound);
}
/**
* Retrieve a mapped element and return it as an Integer.
*
* @param key A string value used to index the element.
* @return The element as an Integer, or null if the element is not found.
*/
public Integer getInteger (String key) {
return getInteger (key, () -> null);
}
/**
* Retrieve a mapped element and return it as an Integer.
*
* @param key A string value used to index the element.
* @param notFound A function to create a new Integer if the requested key was not found
* @return The element as an Integer, or notFound if the element is not found.
*/
public Integer getInteger (String key, Supplier notFound) {
return getParsed (key, Integer::new, notFound);
}
/**
* Retrieve a mapped element and return it as a Double.
*
* @param key A string value used to index the element.
* @return The element as a Double, or null if the element is not found.
*/
public Double getDouble (String key) {
return getDouble (key, () -> null);
}
/**
* Retrieve a mapped element and return it as a Double.
*
* @param key A string value used to index the element.
* @param notFound A function to create a new Double if the requested key was not found
* @return The element as a Double, or notFound if the element is not found.
*/
public Double getDouble (String key, Supplier notFound) {
return getParsed (key, Double::new, notFound);
}
/**
* Retrieve a mapped element and return it as a Float.
*
* @param key A string value used to index the element.
* @return The element as a Float, or null if the element is not found.
*/
public Float getFloat (String key) {
return getFloat (key, () -> null);
}
/**
* Retrieve a mapped element and return it as a Float.
*
* @param key A string value used to index the element.
* @param notFound A function to create a new Float if the requested key was not found
* @return The element as a Float, or notFound if the element is not found.
*/
public Float getFloat (String key, Supplier notFound) {
return getParsed (key, Float::new, notFound);
}
@Override
public boolean equals (Object object) {
return (getClass ().equals (object.getClass ())) &&
toString ().equals (object.toString ());
}
@Override
public int hashCode () {
return toString ().hashCode ();
}
abstract public String toString (String format);
@Override
public String toString () {
// JSON is the default format
return toString(FormatWriterJson.JSON_FORMAT);
}
// make sure we can read and/or write JSON formatted data
static {
FormatWriter.registerFormatWriter (FormatWriterJson.JSON_FORMAT, false, FormatWriterJson::new);
FormatReader.registerFormatReader (FormatReaderJson.JSON_FORMAT, false, FormatReaderJson::new);
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy