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 GMonthValue extends DateValue { 22 23 private static Pattern regex = 24 Pattern.compile("--([0-9][0-9])(--)?(Z|[+-][0-9][0-9]:[0-9][0-9])?"); 25 27 public GMonthValue(){}; 28 29 public GMonthValue(CharSequence value) throws XPathException { 30 Matcher m = regex.matcher(value); 31 if (!m.matches()) { 32 throw new DynamicError("Cannot convert '" + value + "' to a gMonth"); 33 } 34 String base = m.group(1); 35 String tz = m.group(3); 36 String date = "2000-" + base + "-01" + (tz==null ? "" : tz); 37 setLexicalValue(date); 38 } 39 40 public GMonthValue(GregorianCalendar calendar, boolean timezoneSpecified, int tzoffset) { 41 super(calendar, timezoneSpecified, tzoffset); 42 } 43 44 48 49 public ItemType getItemType() { 50 return Type.G_MONTH_TYPE; 51 } 52 53 59 60 public AtomicValue convertPrimitive(BuiltInAtomicType requiredType, boolean validate, ConversionContext conversion) { 61 switch(requiredType.getPrimitiveType()) { 62 case Type.G_MONTH: 63 case Type.ATOMIC: 64 case Type.ITEM: 65 return this; 66 67 case Type.STRING: 68 return new StringValue(getStringValueCS()); 69 case Type.UNTYPED_ATOMIC: 70 return new UntypedAtomicValue(getStringValueCS()); 71 default: 72 ValidationException err = new ValidationException("Cannot convert gMonth to " + 73 requiredType.getDisplayName()); 74 err.setErrorCode("FORG0001"); 75 return new ValidationErrorValue(err); 76 } 77 } 78 79 public String getStringValue() { 80 81 FastStringBuffer sb = new FastStringBuffer(16); 82 83 sb.append("--"); 84 DateTimeValue.appendString(sb, calendar.get(Calendar.MONTH)+1, 2); 85 86 if (zoneSpecified) { 87 DateTimeValue.appendTimezone(tzOffset, sb); 88 } 89 90 return sb.toString(); 91 92 } 93 } 94 95 | Popular Tags |