1d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen/* 2d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Copyright 2009 Mike Cumings 3d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * 4d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Licensed under the Apache License, Version 2.0 (the "License"); 5d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * you may not use this file except in compliance with the License. 6d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * You may obtain a copy of the License at 7d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * 8d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * http://www.apache.org/licenses/LICENSE-2.0 9d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * 10d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Unless required by applicable law or agreed to in writing, software 11d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * distributed under the License is distributed on an "AS IS" BASIS, 12d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * See the License for the specific language governing permissions and 14d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * limitations under the License. 15d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */ 16d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 17d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpackage com.kenai.jbosh; 18d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 19d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen/** 20d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Abstract base class for attribute implementations based on {@code Integer} 21d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * types. Additional support for parsing of integer values from their 22d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * {@code String} representations as well as callback handling of value 23d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * validity checks are also provided. 24d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */ 25d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenabstract class AbstractIntegerAttr extends AbstractAttr<Integer> { 26d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 27d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen /** 28d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Creates a new attribute object. 29d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * 30d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @param val attribute value 31d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @throws BOSHException on parse or validation failure 32d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */ 33d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen protected AbstractIntegerAttr(final int val) throws BOSHException { 34d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen super(Integer.valueOf(val)); 35d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 36d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 37d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen /** 38d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Creates a new attribute object. 39d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * 40d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @param val attribute value in string form 41d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @throws BOSHException on parse or validation failure 42d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */ 43d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen protected AbstractIntegerAttr(final String val) throws BOSHException { 44d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen super(parseInt(val)); 45d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 46d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 47d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen /** 48d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Utility method intended to be called by concrete implementation 49d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * classes from within the {@code check()} method when the concrete 50d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * class needs to ensure that the integer value does not drop below 51d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * the specified minimum value. 52d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * 53d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @param minVal minimum value to allow 54d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @throws BOSHException if the integer value is below the specific 55d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * minimum 56d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */ 57d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen protected final void checkMinValue(int minVal) throws BOSHException { 58d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen int intVal = getValue(); 59d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen if (intVal < minVal) { 60d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen throw(new BOSHException( 61d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen "Illegal attribute value '" + intVal + "' provided. " 62d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen + "Must be >= " + minVal)); 63d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 64d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 65d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 66d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen /** 67d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Utility method to parse a {@code String} into an {@code Integer}, 68d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * converting any possible {@code NumberFormatException} thrown into 69d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * a {@code BOSHException}. 70d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * 71d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @param str string to parse 72d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @return integer value 73d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @throws BOSHException on {@code NumberFormatException} 74d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */ 75d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen private static int parseInt(final String str) throws BOSHException { 76d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen try { 77d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen return Integer.parseInt(str); 78d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } catch (NumberFormatException nfx) { 79d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen throw(new BOSHException( 80d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen "Could not parse an integer from the value provided: " 81d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen + str, 82d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen nfx)); 83d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 84d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 85d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 86d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen /** 87d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Returns the native {@code int} value of the underlying {@code Integer}. 88d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Will throw {@code NullPointerException} if the underlying 89d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * integer was {@code null}. 90d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * 91d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @return native {@code int} value 92d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */ 93d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen public int intValue() { 94d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen return getValue().intValue(); 95d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 96d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 97d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen} 98