-
Notifications
You must be signed in to change notification settings - Fork 8
/
PrimitiveSource.java
113 lines (104 loc) · 3.37 KB
/
PrimitiveSource.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
/*
* Copyright 2005--2008 Helsinki Institute for Information Technology
*
* This file is a part of Fuego middleware. Fuego middleware is free
* software; you can redistribute it and/or modify it under the terms
* of the MIT license, included as the file MIT-LICENSE in the Fuego
* middleware source distribution. If you did not receive the MIT
* license with the distribution, write to the Fuego Core project at
* fuego-xas-users@hoslab.cs.helsinki.fi.
*/
package fc.xml.xas.typing;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import fc.xml.xas.AttributeNode;
import fc.xml.xas.Item;
import fc.xml.xas.ItemSource;
import fc.xml.xas.Qname;
import fc.xml.xas.StartTag;
import fc.xml.xas.Text;
import fc.xml.xas.Verifier;
import fc.xml.xas.XasUtil;
public class PrimitiveSource implements ItemSource {
private ItemSource source;
private String type;
private String encoding;
private boolean looking = false;
private StartTag lookingTag = null;
private Qname lookingType = null;
private Item cachedItem = null;
private ByteArrayOutputStream bout = new ByteArrayOutputStream();
public PrimitiveSource (ItemSource source, String type, String encoding) {
Verifier.checkNotNull(source);
this.source = source;
this.type = type;
this.encoding = encoding;
}
public Item next () throws IOException {
if (cachedItem != null) {
Item item = cachedItem;
cachedItem = null;
return item;
} else {
Item item = source.next();
if (Item.isStartTag(item)) {
StartTag st = (StartTag) item;
AttributeNode an = st.getAttribute(XasUtil.XSI_TYPE);
if (an != null) {
looking = true;
lookingTag = st;
Object value = an.getValue();
if (value instanceof String) {
byte[] bytes = ((String) value).getBytes(encoding);
UnparsedPrimitive up =
new UnparsedPrimitive(type, bytes, encoding);
ParsedPrimitive pp = up.convert(XasUtil.QNAME_TYPE, st);
lookingType = (Qname) pp.getValue();
an.setValue(pp);
} else if (value instanceof UnparsedPrimitive) {
UnparsedPrimitive up = (UnparsedPrimitive) value;
ParsedPrimitive pp = up.convert(XasUtil.QNAME_TYPE, st);
lookingType = (Qname) pp.getValue();
an.setValue(pp);
} else if (value instanceof ParsedPrimitive) {
lookingType =
(Qname) ((ParsedPrimitive) value).getValue();
} else if (value instanceof Qname) {
lookingType = (Qname) value;
} else {
throw new IllegalStateException("Value of attribute "
+ an + " not convertible to Qname");
}
// st.removeAttribute(XasUtil.XSI_TYPE);
}
} else if (looking) {
if (!UnparsedPrimitive.isUnparsedPrimitive(item)) {
while (Item.isText(item)) {
Text t = (Text) item;
bout.write(t.getData().getBytes(encoding));
item = source.next();
}
if (Item.isEndTag(item)) {
cachedItem = item;
UnparsedPrimitive up =
new UnparsedPrimitive(type, bout.toByteArray(),
encoding);
item = up.convert(lookingType, lookingTag);
} else if (bout.size() > 0) {
cachedItem = item;
item =
new Text(new String(bout.toByteArray(), encoding));
}
} else {
UnparsedPrimitive up = (UnparsedPrimitive) item;
item = up.convert(lookingType, lookingTag);
}
bout.reset();
looking = false;
lookingTag = null;
}
return item;
}
}
}
// arch-tag: 48f90544-684e-4d8a-9370-bd4d84147e49