Coverage Report - uk.co.badgersinfoil.asxsd.components.DateTimeSimpleTypeComponent
 
Classes in this File Line Coverage Branch Coverage Complexity
DateTimeSimpleTypeComponent
98% 
100% 
1.667
 
 1  
 /*
 2  
  * Copyright (c) 2007 David Holroyd
 3  
  */
 4  
 
 5  
 package uk.co.badgersinfoil.asxsd.components;
 6  
 
 7  
 import org.eclipse.xsd.XSDConcreteComponent;
 8  
 import org.eclipse.xsd.XSDSimpleTypeDefinition;
 9  
 import org.eclipse.xsd.XSDVariety;
 10  
 import uk.co.badgersinfoil.asxsd.CodegenContext;
 11  
 import uk.co.badgersinfoil.asxsd.CodegenRole;
 12  
 import uk.co.badgersinfoil.asxsd.TypeDescriptor;
 13  
 import uk.co.badgersinfoil.metaas.dom.ASConstants;
 14  
 import uk.co.badgersinfoil.metaas.dom.ASIfStatement;
 15  
 import uk.co.badgersinfoil.metaas.dom.StatementContainer;
 16  
 
 17  
 
 18  16
 public class DateTimeSimpleTypeComponent extends AbstractSimpleTypeComponent {
 19  
 
 20  
         protected TypeDescriptor createTypeDescriptor(CodegenContext context,
 21  
                                                       XSDSimpleTypeDefinition simpleType)
 22  
         {
 23  1
                 return new TypeDescriptor(ASConstants.TYPE_DATE, false, null, simpleType);
 24  
         }
 25  
 
 26  
         protected boolean willAcceptType(XSDSimpleTypeDefinition simpleType) {
 27  695
                 return simpleType.getVariety() == XSDVariety.ATOMIC_LITERAL
 28  
                     && "dateTime".equals(simpleType.getName())
 29  
                     && "http://www.w3.org/2001/XMLSchema".equals(simpleType.getTargetNamespace());
 30  
         }
 31  
 
 32  
         public void generateCode(CodegenContext context,
 33  
                                  XSDConcreteComponent component)
 34  
         {
 35  2
                 CodegenRole role = context.getCurrentRole();
 36  2
                 if (role == CodegenRole.UNMARSHAL) {
 37  1
                         StatementContainer code = context.getCurrentMethodCode();
 38  1
                         String expr = "thisValue";
 39  1
                         code.addStmt("var _result:Date = new Date()");
 40  1
                         code.addStmt("var _rs:RegExp = /^(\\-?)(\\d+)\\-(\\d+)\\-(\\d+)[Tt](\\d+):(\\d+):(\\d+)(\\.\\d+)?\\s*(.+)?$/");
 41  1
                         code.addStmt("var _match:Object = _rs.exec("+expr+")");
 42  1
                         ASIfStatement yearSign = code.newIf("_match[1] == \"\"");
 43  1
                         yearSign.addStmt("_result.fullYearUTC = Number(_match[2])");
 44  1
                         yearSign.getElse().addStmt("_result.fullYearUTC = -Number(_match[2])");
 45  1
                         code.addStmt("_result.monthUTC = Number(_match[3])-1");
 46  1
                         code.addStmt("_result.dateUTC = Number(_match[4])");
 47  1
                         code.addStmt("_result.hoursUTC = Number(_match[5])");
 48  1
                         code.addStmt("_result.minutesUTC = Number(_match[6])");
 49  1
                         code.addStmt("_result.secondsUTC = Number(_match[7])");
 50  1
                         ASIfStatement secondsFraction = code.newIf("_match[8] == \"\"");
 51  1
                         secondsFraction.addStmt("_result.millisecondsUTC = Number(\"0\"+_match[8])*1000");
 52  1
                         ASIfStatement timezoneOffset = code.newIf("_match[9] == \"\"");
 53  1
                         timezoneOffset.addStmt("var _tzrs:RegExp = /(\\d\\d):(\\d\\d)/");
 54  1
                         timezoneOffset.addStmt("_match = _tzrs.exec(_match[9])");
 55  1
                         ASIfStatement timezoneOffsetPresent = timezoneOffset.newIf("_match != null");
 56  
                         // TODO: handle timezone offsets
 57  1
                         timezoneOffsetPresent.addComment(" Eeek!  handle timezone offset!");
 58  1
                         code.addStmt("return _result");
 59  1
                 } else if (role == CodegenRole.MARSHAL) {
 60  1
                         StatementContainer code = context.getCurrentMethodCode();
 61  1
                         String expr = "thisValue";
 62  1
                         code.addStmt("var _result:String = \"\"");
 63  1
                         code.addStmt("_result += "+expr+".fullYearUTC");
 64  1
                         code.addStmt("_result += \"-\"");
 65  1
                         code.addStmt("_result += "+expr+".monthUTC+1");
 66  1
                         code.addStmt("_result += \"-\"");
 67  1
                         code.addStmt("_result += "+expr+".dateUTC");
 68  1
                         code.addStmt("_result += \"T\"");
 69  1
                         code.addStmt("_result += "+expr+".hoursUTC");
 70  1
                         code.addStmt("_result += \":\"");
 71  1
                         code.addStmt("_result += "+expr+".minutesUTC");
 72  1
                         code.addStmt("_result += \":\"");
 73  1
                         code.addStmt("_result += "+expr+".secondsUTC");
 74  1
                         ASIfStatement secondsFraction = code.newIf(""+expr+".millisecondsUTC != 0");
 75  1
                         secondsFraction.addStmt("_result += String("+expr+".millisecondsUTC/1000).slice(1)");
 76  1
                         code.addStmt("_result += \" Z\"");
 77  1
                         code.addStmt("return _result");
 78  1
                 } else {
 79  0
                         super.generateCode(context, component);
 80  
                 }
 81  2
         }
 82  
 }