Mercurial > gemma
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 |
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 } |