/* IntegerDataSpec.java Copyright (c) 2016 NTT DOCOMO,INC. Released under the MIT license http://opensource.org/licenses/mit-license.php */ package org.deviceconnect.android.profile.spec; /** * Integer型データの仕様. * * @author NTT DOCOMO, INC. */ public class IntegerDataSpec extends DConnectDataSpec { private final DataFormat mFormat; private Long mMaximum; private Long mMinimum; private Boolean mExclusiveMaximum; private Boolean mExclusiveMinimum; private long[] mEnumList; /** * コンストラクタ. * * @param format データのフォーマット指定 */ IntegerDataSpec(final DataFormat format) { super(DataType.INTEGER); mFormat = format; } /** * データのフォーマット指定を取得する. * @return データのフォーマット指定 */ public DataFormat getFormat() { return mFormat; } /** * 最大値を取得する. * @return 最大値 */ public Long getMaximum() { return mMaximum; } /** * 最大値を設定する. * @param maximum 最大値 */ void setMaximum(final Long maximum) { mMaximum = maximum; } /** * 最小値を取得する. * @return 最小値 */ public Long getMinimum() { return mMinimum; } /** * 最小値を設定する. * @param minimum 最小値 */ void setMinimum(final Long minimum) { mMinimum = minimum; } /** * 最大値自体を指定可能かどうかのフラグを取得する. * @return 指定できない場合は<code>true</code>. それ以外の場合は<code>false</code> */ public boolean isExclusiveMaximum() { return mExclusiveMaximum != null ? mExclusiveMaximum : false; } /** * 最大値自体を指定可能かどうかのフラグを設定する. * @param exclusiveMaximum 指定できない場合は<code>true</code>. それ以外の場合は<code>false</code> */ void setExclusiveMaximum(final Boolean exclusiveMaximum) { mExclusiveMaximum = exclusiveMaximum; } /** * 最小値自体を指定可能かどうかのフラグを取得する * @return 指定できない場合は<code>true</code>. それ以外の場合は<code>false</code> */ public boolean isExclusiveMinimum() { return mExclusiveMinimum != null ? mExclusiveMinimum : false; } /** * 最小値自体を指定可能かどうかのフラグを設定する. * @param exclusiveMinimum 指定できない場合は<code>true</code>. それ以外の場合は<code>false</code> */ void setExclusiveMinimum(final Boolean exclusiveMinimum) { mExclusiveMinimum = exclusiveMinimum; } /** * 定数一覧を取得する. * @return 定数の配列 */ public long[] getEnumList() { return mEnumList; } /** * 定数一覧を設定する. * @param enumList 定数の配列 */ void setEnumList(final long[] enumList) { mEnumList = enumList; } @Override public boolean validate(final Object obj) { if (obj == null) { return true; } switch (getFormat()) { case INT32: return validateInt32(obj); case INT64: return validateInt64(obj); default: throw new IllegalStateException(); } } private boolean validateInt32(final Object param) { if (param instanceof String) { try { return validateRange(Integer.parseInt((String) param)); } catch (NumberFormatException e) { return false; } } else if (param instanceof Integer) { return validateRange((Integer) param); } else if (param instanceof Long) { return validateRange((Long) param); } else { return false; } } private boolean validateInt64(final Object param) { if (param instanceof String) { try { return validateRange(Long.parseLong((String) param)); } catch (NumberFormatException e) { return false; } } else if (param instanceof Long) { return validateRange((Long) param); } else if (param instanceof Integer) { return validateRange(((Integer) param).longValue()); } else { return false; } } private boolean validateRange(final long value) { if (getEnumList() != null) { for (long e : getEnumList()) { if (e == value) { return true; } } return false; } else { boolean isValid = true; if (getMaximum() != null) { isValid &= isExclusiveMaximum() ? (getMaximum() > value) : (getMaximum() >= value); } if (getMinimum() != null) { isValid &= isExclusiveMinimum() ? (getMinimum() < value) : (getMinimum() <= value); } return isValid; } } /** * {@link IntegerDataSpec}のビルダー. * * @author NTT DOCOMO, INC. */ public static class Builder { private DataFormat mFormat; private Long mMaximum; private Long mMinimum; private Boolean mExclusiveMaximum; private Boolean mExclusiveMinimum; private long[] mEnumList; /** * データのフォーマット指定を設定する. * @param format データのフォーマット指定 * @return ビルダー自身のインスタンス */ public Builder setFormat(final DataFormat format) { mFormat = format; return this; } /** * 最大値を設定する. * @param maximum 最大値 * @return ビルダー自身のインスタンス */ public Builder setMaximum(final Long maximum) { mMaximum = maximum; return this; } /** * 最小値を設定する. * @param minimum 最小値 * @return ビルダー自身のインスタンス */ public Builder setMinimum(final Long minimum) { mMinimum = minimum; return this; } /** * 最大値自体を指定可能かどうかのフラグを設定する. * @param exclusiveMaximum 指定できない場合は<code>true</code>. それ以外の場合は<code>false</code> * @return ビルダー自身のインスタンス */ public Builder setExclusiveMaximum(final Boolean exclusiveMaximum) { mExclusiveMaximum = exclusiveMaximum; return this; } /** * 最小値自体を指定可能かどうかのフラグを設定する. * @param exclusiveMinimum 指定できない場合は<code>true</code>. それ以外の場合は<code>false</code> * @return ビルダー自身のインスタンス */ public Builder setExclusiveMinimum(final Boolean exclusiveMinimum) { mExclusiveMinimum = exclusiveMinimum; return this; } /** * 定数一覧を取得する. * @param enumList 定数の配列 * @return ビルダー自身のインスタンス */ public Builder setEnumList(final long[] enumList) { mEnumList = enumList; return this; } /** * {@link IntegerDataSpec}のインスタンスを生成する. * @return {@link IntegerDataSpec}のインスタンス */ public IntegerDataSpec build() { if (mFormat == null) { mFormat = DataFormat.INT32; } IntegerDataSpec spec = new IntegerDataSpec(mFormat); spec.setEnumList(mEnumList); spec.setMaximum(mMaximum); spec.setExclusiveMaximum(mExclusiveMaximum); spec.setMinimum(mMinimum); spec.setExclusiveMinimum(mExclusiveMinimum); return spec; } } }