blob: bed4be181f5cea29d52bdf70f40db45361e5acd7 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2008, 2011 Attensity Europe GmbH and brox IT Solutions GmbH. 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
*
* Contributors: Andreas Schank (Attensity Europe GmbH) - initial implementation
**********************************************************************************************************************/
package org.eclipse.smila.datamodel.impl;
import java.util.Date;
import java.util.Iterator;
import org.apache.commons.collections.iterators.SingletonIterator;
import org.eclipse.smila.datamodel.Any;
import org.eclipse.smila.datamodel.InvalidValueTypeException;
import org.eclipse.smila.datamodel.Value;
import org.eclipse.smila.datamodel.ValueFormatHelper;
/**
* Any holding a value.
*/
public final class ValueImpl extends AbstractAny implements Value {
/** version. */
private static final long serialVersionUID = 1L;
/**
* the value object.
*/
private final Object _value;
/**
* create new empty ValueImpl instance.
*
* @param valueType
* the type of the Value
* @param value
* the value of the Value
*/
public ValueImpl(final ValueType valueType, final Object value) {
super(valueType);
if (value == null) {
throw new IllegalArgumentException("The value of any Any must not be null.");
}
_value = value;
}
/**
* create new empty ValueImpl instance as a copy of a given Value.
*
* @param object
* the vlaue to be copied
*/
public ValueImpl(final Value object) {
super(object.getValueType());
if (object instanceof ValueImpl) {
_value = ((ValueImpl) object)._value;
} else {
switch (object.getValueType()) {
case BOOLEAN:
_value = object.asBoolean();
break;
case DATE:
_value = object.asDate();
break;
case DATETIME:
_value = object.asDateTime();
break;
case DOUBLE:
_value = object.asDouble();
break;
case LONG:
_value = object.asLong();
break;
case STRING:
_value = object.asString();
break;
default:
throw new InvalidValueTypeException("Value of type '" + object.getValueType() + "' cannot be copied.");
}
}
}
/**
* {@inheritDoc}
*/
@Override
public Double asDouble() {
if (_valueType == ValueType.DOUBLE) {
return (Double) _value;
} else if (_valueType == ValueType.LONG) {
return new Double(((Number) _value).doubleValue());
} else {
throw new InvalidValueTypeException("Value of type '" + _valueType + "' cannot be converted to double.");
}
}
/**
* {@inheritDoc}
*/
@Override
public Long asLong() {
if (_valueType == ValueType.LONG) {
return (Long) _value;
} else if (_valueType == ValueType.DOUBLE) {
return new Long(((Number) _value).longValue());
} else {
throw new InvalidValueTypeException("Value of type '" + _valueType + "' cannot be converted to long.");
}
}
/** {@inheritDoc} */
@Override
public Boolean asBoolean() {
if (_valueType == ValueType.BOOLEAN) {
return (Boolean) _value;
} else {
throw new InvalidValueTypeException("Value of type '" + _valueType + "' cannot be converted to boolean.");
}
}
/** {@inheritDoc} */
@Override
public Date asDate() {
if ((_valueType == ValueType.DATE) || (_valueType == ValueType.DATETIME)) {
return new Date(((Date) _value).getTime());
} else {
throw new InvalidValueTypeException("Value of type '" + _valueType + "' cannot be converted to Date.");
}
}
/** {@inheritDoc} */
@Override
public Date asDateTime() {
if ((_valueType == ValueType.DATE) || (_valueType == ValueType.DATETIME)) {
return new Date(((Date) _value).getTime());
} else {
throw new InvalidValueTypeException("Value of type '" + _valueType + "' cannot be converted to DateTime.");
}
}
/** {@inheritDoc} */
@Override
public String asString() {
if (_value == null) {
return null;
} else {
switch (_valueType) {
case STRING:
return (String) _value;
case DATE:
return ValueFormatHelper.INSTANCE.formatDate((Date) _value);
case DATETIME:
return ValueFormatHelper.INSTANCE.formatDateTime((Date) _value);
default:
return _value.toString();
}
}
}
/** {@inheritDoc} */
@Override
public Object getObject() {
return _value;
}
/**
* {@inheritDoc}
*
* @see java.lang.Object#toString()
*/
@Override
public String toString() {
if (_value == null) {
return "(void)";
}
return asString();
}
/**
* {@inheritDoc}
*/
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + (_value == null ? 0 : _value.hashCode());
result = prime * result + (_valueType == null ? 0 : _valueType.hashCode());
return result;
}
/** {@inheritDoc} */
@Override
public boolean equals(final Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
final ValueImpl other = (ValueImpl) obj;
if (_value == null) {
if (other._value != null) {
return false;
}
} else if (!_value.equals(other._value)) {
return false;
}
if (_valueType == null) {
if (other._valueType != null) {
return false;
}
} else if (!_valueType.equals(other._valueType)) {
return false;
}
return true;
}
/** {@inheritDoc} */
@Override
@SuppressWarnings("unchecked")
public Iterator<Any> iterator() {
return new SingletonIterator(this);
}
/** {@inheritDoc} */
@Override
public boolean isEmpty() {
return false;
}
/** {@inheritDoc} */
@Override
public int size() {
return 1;
}
/**
* {@inheritDoc}
*
* @see org.eclipse.smila.datamodel.Any#asValue()
*/
@Override
public Value asValue() {
return this;
}
}