1 package net.sf.saxon.value; 2 3 import net.sf.saxon.om.FastStringBuffer; 4 import net.sf.saxon.trans.DynamicError; 5 import net.sf.saxon.trans.XPathException; 6 import net.sf.saxon.type.BuiltInAtomicType; 7 import net.sf.saxon.type.ItemType; 8 import net.sf.saxon.type.Type; 9 import net.sf.saxon.type.ValidationException; 10 import net.sf.saxon.ConversionContext; 11 12 import java.util.Calendar ; 13 import java.util.GregorianCalendar ; 14 import java.util.regex.Matcher ; 15 import java.util.regex.Pattern ; 16 17 20 21 public class GYearMonthValue extends DateValue { 22 23 private static Pattern regex = 24 Pattern.compile("(-?[0-9]+-[0-9][0-9])(Z|[+-][0-9][0-9]:[0-9][0-9])?"); 25 26 public GYearMonthValue(){}; 27 28 public GYearMonthValue(CharSequence value) throws XPathException { 29 Matcher m = regex.matcher(value); 30 if (!m.matches()) { 31 throw new DynamicError("Cannot convert '" + value + "' to a gYearMonth"); 32 } 33 String base = m.group(1); 34 String tz = m.group(2); 35 String date = base + "-01" + (tz==null ? "" : tz); 36 setLexicalValue(date); 37 } 38 39 public GYearMonthValue(GregorianCalendar calendar, boolean timezoneSpecified, int tzoffset) { 40 super(calendar, timezoneSpecified, tzoffset); 41 } 42 43 47 48 public ItemType getItemType() { 49 return Type.G_YEAR_MONTH_TYPE; 50 } 51 52 58 59 public AtomicValue convertPrimitive(BuiltInAtomicType requiredType, boolean validate, ConversionContext conversion) { 60 switch(requiredType.getPrimitiveType()) { 61 case Type.G_YEAR_MONTH: 62 case Type.ATOMIC: 63 case Type.ITEM: 64 return this; 65 66 case Type.STRING: 67 return new StringValue(getStringValueCS()); 68 case Type.UNTYPED_ATOMIC: 69 return new UntypedAtomicValue(getStringValueCS()); 70 default: 71 ValidationException err = new ValidationException("Cannot convert gYearMonth to " + 72 requiredType.getDisplayName()); 73 err.setErrorCode("FORG0001"); 74 return new ValidationErrorValue(err); 75 } 76 } 77 78 public String getStringValue() { 79 80 FastStringBuffer sb = new FastStringBuffer(16); 81 int era = calendar.get(GregorianCalendar.ERA); 82 int year = calendar.get(Calendar.YEAR); 83 if (era == GregorianCalendar.BC) { 84 sb.append('-'); 85 } 86 DateTimeValue.appendString(sb, year, (year>9999 ? (calendar.get(Calendar.YEAR)+"").length() : 4)); 87 88 sb.append('-'); 89 DateTimeValue.appendString(sb, calendar.get(Calendar.MONTH)+1, 2); 90 91 if (zoneSpecified) { 92 DateTimeValue.appendTimezone(tzOffset, sb); 93 } 94 95 return sb.toString(); 96 97 } 98 } 99 100 | Popular Tags |