1 /* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License, Version 1.0 only 6 * (the "License"). You may not use this file except in compliance 7 * with the License. 8 * 9 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 10 * or http://www.opensolaris.org/os/licensing. 11 * See the License for the specific language governing permissions 12 * and limitations under the License. 13 * 14 * When distributing Covered Code, include this CDDL HEADER in each 15 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 16 * If applicable, add the following below this CDDL HEADER, with the 17 * fields enclosed by brackets "[]" replaced with your own identifying 18 * information: Portions Copyright [yyyy] [name of copyright owner] 19 * 20 * CDDL HEADER END 21 */ 22 /* 23 * ident "%Z%%M% %I% %E% SMI" 24 * 25 * Copyright 2002 Sun Microsystems, Inc. All rights reserved. 26 * Use is subject to license terms. 27 */ 28 29 package com.sun.dhcpmgr.data.qualifier; 30 31 import java.util.*; 32 import java.util.regex.*; 33 34 /** 35 * An implementation of the qualifier type that provides a string type 36 * where values must be a valid IPv6 address. 37 */ 38 public class QualifierIPv6 extends QualifierString { 39 40 private static final String fieldRegex = "0*[0-9a-fA-F]{1,4}"; 41 42 private static Pattern pattern; 43 44 public Object parseValue(String value) { 45 if (value == null) { 46 return null; 47 } 48 49 value = value.trim(); 50 51 if (value.equals("::")) { 52 return value; 53 } 54 55 QualifierIPv4 ipv4 = new QualifierIPv4(); 56 Matcher matcher; 57 int numFields = 0; 58 int numZeroFields = 0; 59 int numAdjacentZeroFields = 0; 60 StringTokenizer tokenizer = new StringTokenizer(value, ":", true); 61 62 while (tokenizer.hasMoreTokens()) { 63 String field = tokenizer.nextToken(); 64 65 if (field == null) { 66 return null; 67 } else if (field.equals(":")) { 68 numAdjacentZeroFields++; 69 70 if (numAdjacentZeroFields > 2) { 71 return null; 72 } else if (numAdjacentZeroFields == 2) { 73 numZeroFields++; 74 75 if (numZeroFields > 1) { 76 return null; 77 } 78 } 79 } else { 80 numAdjacentZeroFields = 0; 81 matcher = pattern.matcher(field); 82 83 if (!matcher.matches()) { 84 Object ipv4Field = ipv4.parseValue(field); 85 86 if ((ipv4Field != null && tokenizer.countTokens() > 0) || 87 ipv4Field == null) { 88 return null; 89 } 90 } 91 92 numFields++; 93 } 94 } 95 96 if ((numFields > 0 && numFields < 9) || value.equals("::")) { 97 return value; 98 } else { 99 return null; 100 } 101 } 102 103 static { 104 pattern = Pattern.compile(fieldRegex); 105 } 106 }