/*
* Copyright 2013 Esri.
*
* Licensed 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 com.esri.gpt.framework.dcat.json;
/**
* Raw DCAT attribute.
*/
public class JsonAttribute {
private TYPE type;
private getter getter;
/**
* Creates instance of the string attribute.
* @param value value
*/
public JsonAttribute(String value) {
this.type = TYPE.STRING;
this.getter = new FromStringGetter(value);
}
/**
* Creates instance of the double attribute.
* @param value value
*/
public JsonAttribute(Double value) {
this.type = TYPE.NUMBER;
this.getter = new FromNumberGetter(value);
}
/**
* Creates instance of the boolean attribute.
* @param value value
*/
public JsonAttribute(Boolean value) {
this.type = TYPE.BOOLEAN;
this.getter = new FromBooleanGetter(value);
}
/**
* Gets value as number.
* @return number
*/
public Double getNumber() {
return getter.getNumericValue();
}
/**
* Gets value as string.
* @return string
*/
public String getString() {
return getter.getStringValue();
}
/**
* Gets value as boolean.
* @return boolean
*/
public Boolean getBoolean() {
return getter.getBooleanValue();
}
/**
* Gets original value type.
* @return type
*/
public TYPE getType() {
return type;
}
private interface getter {
String getStringValue();
Double getNumericValue();
Boolean getBooleanValue();
}
private class FromBooleanGetter implements getter {
private Boolean booleanValue;
public FromBooleanGetter(Boolean booleanValue) {
this.booleanValue = booleanValue;
}
@Override
public String getStringValue() {
return booleanValue.toString();
}
@Override
public Double getNumericValue() {
return Double.NaN;
}
@Override
public Boolean getBooleanValue() {
return booleanValue;
}
@Override
public String toString() {
return booleanValue.toString();
}
}
private class FromStringGetter implements getter {
private String stringValue;
public FromStringGetter(String stringValue) {
this.stringValue = stringValue;
}
@Override
public String getStringValue() {
return stringValue;
}
@Override
public Double getNumericValue() {
try {
return Double.parseDouble(stringValue);
} catch (NumberFormatException ex) {
return Double.NaN;
}
}
@Override
public String toString() {
return "\"" + stringValue + "\"";
}
@Override
public Boolean getBooleanValue() {
return Boolean.parseBoolean(stringValue);
}
}
private class FromNumberGetter implements getter {
private Double numericValue;
public FromNumberGetter(Double numericValue) {
this.numericValue = numericValue;
}
@Override
public String getStringValue() {
return numericValue.toString();
}
@Override
public Double getNumericValue() {
return numericValue;
}
@Override
public String toString() {
long longValue = numericValue.longValue();
double doubleValue = numericValue.doubleValue();
return longValue<doubleValue? numericValue.toString(): ""+longValue;
}
@Override
public Boolean getBooleanValue() {
return Boolean.FALSE;
}
}
@Override
public String toString() {
return getter.toString();
}
/**
* Type.
*/
public static enum TYPE {
/** string */
STRING,
/** number */
NUMBER,
/** boolean */
BOOLEAN
}
}