/******************************************************************************* * Copyright (c) 2011 Oak Ridge National Laboratory. * 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 ******************************************************************************/ package org.csstudio.data.values.internal; import org.csstudio.data.values.IMetaData; import org.csstudio.data.values.ISeverity; import org.csstudio.data.values.ITimestamp; import org.csstudio.data.values.IValue; import org.csstudio.data.values.Messages; /** Implementation of the {@link IValue} interface. * @author Kay Kasemir */ abstract public class Value implements IValue { private static final long serialVersionUID = 1L; /** Time stamp of this value. */ private final ITimestamp time; /** Severity code of this value. */ private final ISeverity severity; /** Status text for this value's severity. */ private final String status; /** Meta data (may be null). */ private final IMetaData meta_data; /** The data quality. */ private final Quality quality; /** * The max count of values to be formatted into string. * The value beyond this count will be omitted. */ public final static int MAX_FORMAT_VALUE_COUNT = 20; /** Construct a new value from pieces. */ public Value(final ITimestamp time, final ISeverity severity, final String status, final IMetaData meta_data, final Quality quality) { this.time = time; this.severity = severity; this.status = status; this.meta_data = meta_data; this.quality = quality; } /** {@inheritDoc} */ @Override final public ITimestamp getTime() { return time; } /** {@inheritDoc} */ @Override final public ISeverity getSeverity() { return severity; } /** {@inheritDoc} */ @Override final public String getStatus() { return status; } /** {@inheritDoc} */ @Override final public Quality getQuality() { return quality; } /** {@inheritDoc} */ @Override public IMetaData getMetaData() { return meta_data; } /** {@inheritDoc} */ @Override abstract public String format(Format how, int precision); /** {@inheritDoc} */ @Override final public String format() { return format(Format.Default, -1); } /** {@inheritDoc} */ @Override final public String toString() { final StringBuilder buffer = new StringBuilder(); buffer.append(getTime().toString()); buffer.append(Messages.ColumnSeperator); buffer.append(format(Format.Default, -1)); final String sevr = getSeverity().toString(); final String stat = getStatus(); if (sevr.length() > 0 || stat.length() > 0) { buffer.append(Messages.ColumnSeperator); buffer.append(sevr); buffer.append(Messages.SevrStatSeparator); buffer.append(stat); } return buffer.toString(); } /** Convert char into printable character for Format.String * @param c Char, 0 for end-of-string * @return Printable version */ protected char getDisplayChar(final char c) { if (c == 0) { return 0; } if (Character.getType(c) != Character.CONTROL) { return c; } return '?'; } /** {@inheritDoc} */ @Override public boolean equals(final Object obj) { if (! (obj instanceof Value)) { return false; } final Value rhs = (Value) obj; if (! (rhs.time.equals(time) && rhs.quality == quality && rhs.status.equals(status) && rhs.severity.toString().equals(severity.toString()))) { return false; } // Meta_data might be null final IMetaData rhs_meta = rhs.getMetaData(); if (meta_data == null) { // OK if both are null return rhs_meta == null; } return rhs.meta_data.equals(meta_data); } /** {@inheritDoc} */ @Override public int hashCode() { return time.hashCode() + status.hashCode() + severity.hashCode(); } }