annotate pkg/soap/xsdDateTime.go @ 5710:37c8feeecb4d

Merged branch sr-v2 into default.
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Tue, 20 Feb 2024 21:28:56 +0100
parents f2b51ac3d5cf
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
5607
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1 // This Source Code Form is subject to the terms of the Mozilla Public
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
2 // License, v. 2.0. If a copy of the MPL was not distributed with this
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
3 // file, You can obtain one at http://mozilla.org/MPL/2.0/.
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
4
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
5 package soap
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
6
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
7 import (
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
8 "encoding/xml"
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
9 "strings"
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
10 "time"
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
11 )
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
12
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
13 const (
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
14 dateLayout = "2006-01-02Z07:00"
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
15 timeLayout = "15:04:05.999999999Z07:00"
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
16 )
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
17
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
18 //
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
19 // DateTime struct
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
20 //
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
21
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
22 // XSDDateTime is a type for representing xsd:datetime in Golang
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
23 type XSDDateTime struct {
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
24 innerTime time.Time
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
25 hasTz bool
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
26 }
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
27
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
28 // StripTz removes TZ information from the datetime
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
29 func (xdt *XSDDateTime) StripTz() {
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
30 xdt.hasTz = false
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
31 }
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
32
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
33 // ToGoTime converts the time to time.Time by checking if a TZ is specified.
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
34 // If there is a TZ, that TZ is used, otherwise local TZ is used
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
35 func (xdt *XSDDateTime) ToGoTime() time.Time {
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
36 if xdt.hasTz {
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
37 return xdt.innerTime
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
38 }
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
39 return time.Date(xdt.innerTime.Year(), xdt.innerTime.Month(), xdt.innerTime.Day(),
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
40 xdt.innerTime.Hour(), xdt.innerTime.Minute(), xdt.innerTime.Second(),
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
41 xdt.innerTime.Nanosecond(), time.Local)
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
42 }
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
43
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
44 // MarshalXML implements xml.MarshalerAttr on XSDDateTime
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
45 func (xdt XSDDateTime) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
46 xdtString := xdt.string()
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
47 if xdtString != "" {
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
48 return e.EncodeElement(xdtString, start)
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
49 }
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
50 return nil
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
51 }
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
52
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
53 // MarshalXMLAttr implements xml.MarshalerAttr on XSDDateTime
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
54 func (xdt XSDDateTime) MarshalXMLAttr(name xml.Name) (xml.Attr, error) {
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
55 xdtString := xdt.string()
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
56 attr := xml.Attr{}
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
57 if xdtString != "" {
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
58 attr.Name = name
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
59 attr.Value = xdtString
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
60 }
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
61 return attr, nil
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
62 }
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
63
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
64 // returns string representation and skips "zero" time values. It also checks if nanoseconds and TZ exist.
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
65 func (xdt XSDDateTime) string() string {
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
66 if !xdt.innerTime.IsZero() {
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
67 dateTimeLayout := time.RFC3339Nano
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
68 if xdt.innerTime.Nanosecond() == 0 {
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
69 dateTimeLayout = time.RFC3339
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
70 }
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
71 dtString := xdt.innerTime.Format(dateTimeLayout)
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
72 if !xdt.hasTz {
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
73 // split off time portion
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
74 dateAndTime := strings.SplitN(dtString, "T", 2)
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
75 toks := strings.SplitN(dateAndTime[1], "Z", 2)
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
76 toks = strings.SplitN(toks[0], "+", 2)
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
77 toks = strings.SplitN(toks[0], "-", 2)
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
78 dtString = dateAndTime[0] + "T" + toks[0]
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
79 }
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
80 return dtString
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
81 }
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
82 return ""
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
83 }
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
84
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
85 // UnmarshalXML implements xml.Unmarshaler on XSDDateTime to use time.RFC3339Nano
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
86 func (xdt *XSDDateTime) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
87 var content string
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
88 err := d.DecodeElement(&content, &start)
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
89 if err != nil {
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
90 return err
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
91 }
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
92 xdt.innerTime, xdt.hasTz, err = fromString(content, time.RFC3339Nano)
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
93 return err
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
94 }
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
95
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
96 // UnmarshalXMLAttr implements xml.UnmarshalerAttr on XSDDateTime to use time.RFC3339Nano
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
97 func (xdt *XSDDateTime) UnmarshalXMLAttr(attr xml.Attr) error {
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
98 var err error
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
99 xdt.innerTime, xdt.hasTz, err = fromString(attr.Value, time.RFC3339Nano)
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
100 return err
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
101 }
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
102
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
103 func fromString(content string, format string) (time.Time, bool, error) {
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
104 var t time.Time
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
105 if content == "" {
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
106 return t, true, nil
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
107 }
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
108 hasTz := false
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
109 if strings.Contains(content, "T") { // check if we have a time portion
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
110 // split into date and time portion
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
111 dateAndTime := strings.SplitN(content, "T", 2)
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
112 if len(dateAndTime) > 1 {
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
113 if strings.Contains(dateAndTime[1], "Z") ||
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
114 strings.Contains(dateAndTime[1], "+") ||
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
115 strings.Contains(dateAndTime[1], "-") {
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
116 hasTz = true
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
117 }
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
118 }
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
119 if !hasTz {
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
120 content += "Z"
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
121 }
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
122 if content == "0001-01-01T00:00:00Z" {
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
123 return t, true, nil
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
124 }
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
125 } else {
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
126 // we don't see to have a time portion, check timezone
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
127 if strings.Contains(content, "Z") ||
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
128 strings.Contains(content, ":") {
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
129 hasTz = true
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
130 }
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
131 if !hasTz {
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
132 content += "Z"
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
133 }
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
134 }
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
135 t, err := time.Parse(format, content)
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
136 return t, hasTz, err
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
137 }
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
138
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
139 // CreateXsdDateTime creates an object represent xsd:datetime object in Golang
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
140 func CreateXsdDateTime(dt time.Time, hasTz bool) XSDDateTime {
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
141 return XSDDateTime{
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
142 innerTime: dt,
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
143 hasTz: hasTz,
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
144 }
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
145 }
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
146
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
147 // XSDDate is a type for representing xsd:date in Golang
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
148 type XSDDate struct {
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
149 innerDate time.Time
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
150 hasTz bool
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
151 }
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
152
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
153 // StripTz removes the TZ information from the date
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
154 func (xd *XSDDate) StripTz() {
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
155 xd.hasTz = false
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
156 }
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
157
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
158 // ToGoTime converts the date to Golang time.Time by checking if a TZ is specified.
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
159 // If there is a TZ, that TZ is used, otherwise local TZ is used
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
160 func (xd *XSDDate) ToGoTime() time.Time {
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
161 if xd.hasTz {
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
162 return xd.innerDate
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
163 }
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
164 return time.Date(xd.innerDate.Year(), xd.innerDate.Month(), xd.innerDate.Day(),
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
165 0, 0, 0, 0, time.Local)
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
166 }
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
167
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
168 // MarshalXML implementation on XSDDate
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
169 func (xd XSDDate) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
170 xdtString := xd.string()
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
171 if xdtString != "" {
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
172 return e.EncodeElement(xdtString, start)
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
173 }
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
174 return nil
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
175 }
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
176
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
177 // MarshalXMLAttr implementation on XSDDate
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
178 func (xd XSDDate) MarshalXMLAttr(name xml.Name) (xml.Attr, error) {
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
179 xdString := xd.string()
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
180 attr := xml.Attr{}
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
181 if xdString != "" {
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
182 attr.Name = name
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
183 attr.Value = xdString
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
184 }
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
185 return attr, nil
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
186 }
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
187
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
188 // returns string representation and skips "zero" time values
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
189 func (xd XSDDate) string() string {
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
190 if !xd.innerDate.IsZero() {
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
191 dateString := xd.innerDate.Format(dateLayout) // serialize with TZ
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
192 if !xd.hasTz {
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
193 if strings.Contains(dateString, "Z") {
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
194 // UTC Tz
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
195 toks := strings.SplitN(dateString, "Z", 2)
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
196 dateString = toks[0]
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
197 } else {
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
198 // [+-]00:00 Tz, remove last 6 chars
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
199 if len(dateString) > 5 { // this should always be true
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
200 start := len(dateString) - 6 // locate at "-"
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
201 dateString = dateString[0:start]
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
202 }
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
203 }
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
204 }
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
205 return dateString
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
206 }
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
207 return ""
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
208 }
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
209
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
210 // UnmarshalXML implements xml.Unmarshaler on XSDDate to use dateLayout
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
211 func (xd *XSDDate) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
212 var content string
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
213 err := d.DecodeElement(&content, &start)
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
214 if err != nil {
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
215 return err
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
216 }
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
217 xd.innerDate, xd.hasTz, err = fromString(content, dateLayout)
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
218 return err
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
219 }
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
220
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
221 // UnmarshalXMLAttr implements xml.UnmarshalerAttr on XSDDate to use dateLayout
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
222 func (xd *XSDDate) UnmarshalXMLAttr(attr xml.Attr) error {
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
223 var err error
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
224 xd.innerDate, xd.hasTz, err = fromString(attr.Value, dateLayout)
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
225 return err
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
226 }
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
227
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
228 // CreateXsdDate creates an object represent xsd:datetime object in Golang
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
229 func CreateXsdDate(date time.Time, hasTz bool) XSDDate {
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
230 return XSDDate{
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
231 innerDate: date,
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
232 hasTz: hasTz,
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
233 }
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
234 }
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
235
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
236 // XSDTime is a type for representing xsd:time
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
237 type XSDTime struct {
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
238 innerTime time.Time
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
239 hasTz bool
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
240 }
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
241
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
242 // MarshalXML implements xml.Marshaler on XSDTime
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
243 func (xt XSDTime) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
244 xdtString := xt.string()
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
245 if xdtString != "" {
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
246 return e.EncodeElement(xdtString, start)
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
247 }
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
248 return nil
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
249 }
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
250
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
251 // MarshalXMLAttr implements xml.MarshalerAttr on XSDTime
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
252 func (xt XSDTime) MarshalXMLAttr(name xml.Name) (xml.Attr, error) {
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
253 xdString := xt.string()
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
254 attr := xml.Attr{}
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
255 if xdString != "" {
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
256 attr.Name = name
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
257 attr.Value = xdString
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
258 }
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
259 return attr, nil
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
260 }
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
261
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
262 // returns string representation and skips "zero" time values
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
263 func (xt XSDTime) string() string {
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
264 if !xt.innerTime.IsZero() {
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
265 dateTimeLayout := time.RFC3339Nano
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
266 if xt.innerTime.Nanosecond() == 0 {
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
267 dateTimeLayout = time.RFC3339
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
268 }
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
269 // split off date portion
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
270 dateAndTime := strings.SplitN(xt.innerTime.Format(dateTimeLayout), "T", 2)
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
271 timeString := dateAndTime[1]
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
272 if !xt.hasTz {
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
273 toks := strings.SplitN(timeString, "Z", 2)
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
274 toks = strings.SplitN(toks[0], "+", 2)
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
275 toks = strings.SplitN(toks[0], "-", 2)
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
276 timeString = toks[0]
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
277 }
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
278 return timeString
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
279 }
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
280 return ""
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
281 }
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
282
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
283 // UnmarshalXML implements xml.Unmarshaler on XSDTime to use dateTimeLayout
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
284 func (xt *XSDTime) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
285 var err error
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
286 var content string
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
287 err = d.DecodeElement(&content, &start)
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
288 if err != nil {
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
289 return err
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
290 }
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
291 return xt.fromString(content)
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
292 }
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
293
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
294 // UnmarshalXMLAttr implements xml.UnmarshalerAttr on XSDTime to use dateTimeLayout
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
295 func (xt *XSDTime) UnmarshalXMLAttr(attr xml.Attr) error {
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
296 return xt.fromString(attr.Value)
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
297 }
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
298
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
299 func (xt *XSDTime) fromString(content string) error {
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
300 var t time.Time
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
301 var err error
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
302 if content == "" {
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
303 xt.innerTime = t
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
304 return nil
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
305 }
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
306 xt.hasTz = false
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
307 if strings.Contains(content, "Z") ||
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
308 strings.Contains(content, "+") ||
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
309 strings.Contains(content, "-") {
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
310 xt.hasTz = true
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
311 }
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
312 if !xt.hasTz {
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
313 content += "Z"
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
314 }
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
315 xt.innerTime, err = time.Parse(timeLayout, content)
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
316 return err
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
317 }
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
318
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
319 // Hour returns hour of the xsd:time
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
320 func (xt XSDTime) Hour() int {
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
321 return xt.innerTime.Hour()
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
322 }
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
323
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
324 // Minute returns minutes of the xsd:time
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
325 func (xt XSDTime) Minute() int {
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
326 return xt.innerTime.Minute()
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
327 }
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
328
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
329 // Second returns seconds of the xsd:time
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
330 func (xt XSDTime) Second() int {
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
331 return xt.innerTime.Second()
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
332 }
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
333
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
334 // Nanosecond returns nanosecond of the xsd:time
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
335 func (xt XSDTime) Nanosecond() int {
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
336 return xt.innerTime.Nanosecond()
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
337 }
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
338
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
339 // Location returns the TZ information of the xsd:time
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
340 func (xt XSDTime) Location() *time.Location {
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
341 if xt.hasTz {
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
342 return xt.innerTime.Location()
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
343 }
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
344 return nil
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
345 }
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
346
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
347 // CreateXsdTime creates an object representing xsd:time in Golang
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
348 func CreateXsdTime(hour int, min int, sec int, nsec int, loc *time.Location) XSDTime {
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
349 realLoc := loc
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
350 if loc == nil {
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
351 realLoc = time.Local
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
352 }
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
353 return XSDTime{
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
354 innerTime: time.Date(1951, 10, 22, hour, min, sec, nsec, realLoc),
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
355 hasTz: loc != nil,
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
356 }
f2b51ac3d5cf Modified SOAP client to fit new needs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
357 }