| /* |
| ******************************************************************************* |
| * Copyright (C) 2009, International Business Machines Corporation and * |
| * others. All Rights Reserved. * |
| ******************************************************************************* |
| */ |
| package com.ibm.icu.impl.locale; |
| |
| import com.ibm.icu.impl.locale.LanguageTag.ParseStatus; |
| |
| public class Extension { |
| private char _key; |
| protected String _value; |
| |
| protected Extension(char key) { |
| _key = key; |
| } |
| |
| public char getKey() { |
| return _key; |
| } |
| |
| public String getValue() { |
| return _value; |
| } |
| |
| public String getID() { |
| return _key + LanguageTag.SEP + _value; |
| } |
| |
| public String toString() { |
| return getID(); |
| } |
| |
| public static Extension create(StringTokenIterator itr, ParseStatus sts) { |
| if (sts.isError() || itr.isDone()) { |
| return null; |
| } |
| |
| Extension ext = null; |
| String key = itr.current(); |
| if (LanguageTag.isExtensionSingleton(key) || LanguageTag.isPrivateuseSingleton(key)) { |
| itr.next(); |
| ext = create(key.charAt(0), itr, sts); |
| } |
| |
| return ext; |
| } |
| |
| public static Extension create(char key, StringTokenIterator val, ParseStatus sts) { |
| if (sts.isError()) { |
| return null; |
| } |
| if (val.isDone()) { |
| sts.errorIndex = val.currentStart(); |
| sts.errorMsg = "Missing extension subtag for extension :" + key; |
| return null; |
| } |
| |
| Extension ext = null; |
| key = AsciiUtil.toLower(key); |
| |
| switch (key) { |
| case UnicodeLocaleExtension.SINGLETON: |
| ext = new UnicodeLocaleExtension(); |
| break; |
| case PrivateuseExtension.SINGLETON: |
| ext = new PrivateuseExtension(); |
| break; |
| default: |
| ext = new Extension(key); |
| break; |
| } |
| |
| ext.setExtensionValue(val, sts); |
| |
| if (ext.getValue() == null) { |
| // return null only when nothing parsed. |
| return null; |
| } |
| |
| return ext; |
| } |
| |
| protected void setExtensionValue(StringTokenIterator itr, ParseStatus sts) { |
| if (sts.isError() || itr.isDone()) { |
| _value = null; |
| return; |
| } |
| |
| StringBuilder buf = new StringBuilder(); |
| while (!itr.isDone()) { |
| String s = itr.current(); |
| if (!LanguageTag.isExtensionSubtag(s)) { |
| break; |
| } |
| s = LanguageTag.canonicalizeExtensionSubtag(s); |
| if (buf.length() != 0) { |
| buf.append(LanguageTag.SEP); |
| } |
| buf.append(s); |
| sts.parseLength = itr.currentEnd(); |
| itr.next(); |
| } |
| |
| if (buf.length() == 0) { |
| sts.errorIndex = itr.currentStart(); |
| sts.errorMsg = "Invalid extension subtag: " + itr.current(); |
| _value = null; |
| } else { |
| _value = buf.toString(); |
| } |
| } |
| } |