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 * Data type representing the getValue of the {@code ver} attribute of the 21d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * {@code bosh} element. 22d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */ 23d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenfinal class AttrVersion extends AbstractAttr<String> implements Comparable { 24d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 25d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen /** 26d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Default value if none is provided. 27d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */ 28d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen private static final AttrVersion DEFAULT; 29d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen static { 30d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen try { 31d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen DEFAULT = createFromString("1.8"); 32d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } catch (BOSHException boshx) { 33d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen throw(new IllegalStateException(boshx)); 34d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 35d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 36d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 37d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen /** 38d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Major portion of the version. 39d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */ 40d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen private final int major; 41d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 42d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen /** 43d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Minor portion of the version. 44d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */ 45d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen private final int minor; 46d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 47d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen /** 48d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Creates a new attribute object. 49d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * 50d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @param val attribute getValue 51d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @throws BOSHException on parse or validation failure 52d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */ 53d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen private AttrVersion(final String val) throws BOSHException { 54d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen super(val); 55d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 56d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen int idx = val.indexOf('.'); 57d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen if (idx <= 0) { 58d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen throw(new BOSHException( 59d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen "Illegal ver attribute value (not in major.minor form): " 60d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen + val)); 61d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 62d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 63d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen String majorStr = val.substring(0, idx); 64d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen try { 65d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen major = Integer.parseInt(majorStr); 66d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } catch (NumberFormatException nfx) { 67d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen throw(new BOSHException( 68d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen "Could not parse ver attribute value (major ver): " 69d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen + majorStr, 70d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen nfx)); 71d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 72d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen if (major < 0) { 73d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen throw(new BOSHException( 74d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen "Major version may not be < 0")); 75d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 76d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 77d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen String minorStr = val.substring(idx + 1); 78d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen try { 79d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen minor = Integer.parseInt(minorStr); 80d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } catch (NumberFormatException nfx) { 81d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen throw(new BOSHException( 82d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen "Could not parse ver attribute value (minor ver): " 83d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen + minorStr, 84d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen nfx)); 85d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 86d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen if (minor < 0) { 87d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen throw(new BOSHException( 88d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen "Minor version may not be < 0")); 89d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 90d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 91d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 92d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen /** 93d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Get the version of specifcation that we support. 94d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * 95d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @return max spec version the code supports 96d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */ 97d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen static AttrVersion getSupportedVersion() { 98d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen return DEFAULT; 99d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 100d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 101d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen /** 102d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Creates a new attribute instance from the provided String. 103d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * 104d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @param str string representation of the attribute 105d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @return attribute instance or {@code null} if provided string is 106d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * {@code null} 107d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @throws BOSHException on parse or validation failure 108d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */ 109d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen static AttrVersion createFromString(final String str) 110d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen throws BOSHException { 111d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen if (str == null) { 112d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen return null; 113d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } else { 114d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen return new AttrVersion(str); 115d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 116d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 117d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 118d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen /** 119d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Returns the 'major' portion of the version number. 120d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * 121d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @return major digits only 122d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */ 123d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen int getMajor() { 124d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen return major; 125d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 126d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 127d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen /** 128d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Returns the 'minor' portion of the version number. 129d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * 130d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @return minor digits only 131d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */ 132d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen int getMinor() { 133d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen return minor; 134d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 135d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 136d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen /////////////////////////////////////////////////////////////////////////// 137d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen // Comparable interface: 138d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 139d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen /** 140d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * {@inheritDoc} 141d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * 142d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @param otherObj object to compare to 143d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @return -1, 0, or 1 144d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */ 145d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen @Override 146d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen public int compareTo(final Object otherObj) { 147d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen if (otherObj instanceof AttrVersion) { 148d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen AttrVersion other = (AttrVersion) otherObj; 149d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen if (major < other.major) { 150d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen return -1; 151d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } else if (major > other.major) { 152d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen return 1; 153d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } else if (minor < other.minor) { 154d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen return -1; 155d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } else if (minor > other.minor) { 156d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen return 1; 157d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } else { 158d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen return 0; 159d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 160d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } else { 161d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen return 0; 162d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 163d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 164d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 165d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen} 166