My favorites | Sign in
Project Home Downloads Wiki Issues Source
READ-ONLY: This project has been archived. For more information see this post.
Search
for
  Advanced search   Search tips   Subscriptions

Issue 3 attachment: XmlParserImpl.java (5.3 KB)

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
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
package name.pehl.totoe.xml.client.internal;

import name.pehl.totoe.xml.client.Document;
import name.pehl.totoe.xml.client.XmlParseException;

import com.google.gwt.core.client.JavaScriptException;
import com.google.gwt.core.client.JavaScriptObject;

/**
* @author $Author: harald.pehl $
* @version $Date: 2010-10-26 06:04:16 -0600 (Tue, 26 Oct 2010) $ $Revision: 629
* $
*/
public class XmlParserImpl
{
// ------------------------------------------------------------------- JSNI

private static final JavaScriptObject nativeParser = XmlParserImpl.initialize();

private static JavaScriptObject initialize() {
setupSarissaPrototypes();
return initializeDOMParser();
}

public static native void setupSarissaPrototypes() /*-{
if($wnd.Sarissa._SARISSA_HAS_DOM_FEATURE && document.implementation.hasFeature("XPath", "3.0")){
XMLDocument.prototype._sarissa_useCustomResolver = false;
XMLDocument.prototype._sarissa_xpathNamespaces = [];
XMLDocument.prototype.selectNodes = function(sExpr, contextNode, returnSingle){
var nsDoc = this;
var nsresolver;
if(this._sarissa_useCustomResolver){
nsresolver = function(prefix){
var s = nsDoc._sarissa_xpathNamespaces[prefix];
if(s){
return s;
}
else {
throw "No namespace URI found for prefix: '" + prefix+"'";
}
};
}
else{
nsresolver = this.createNSResolver(this.documentElement);
}
var result = null;
if(!returnSingle){
var oResult = this.evaluate(sExpr,
(contextNode?contextNode:this),
nsresolver,
XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
var nodeList = new SarissaNodeList(oResult.snapshotLength);
nodeList.expr = sExpr;
for(var i=0;i<nodeList.length;i++){
nodeList[i] = oResult.snapshotItem(i);
}
result = nodeList;
}
else {
result = this.evaluate(sExpr,
(contextNode?contextNode:this),
nsresolver,
XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;
}
return result;
};
Element.prototype.selectNodes = function(sExpr){
var doc = this.ownerDocument;
if(doc.selectNodes){
return doc.selectNodes(sExpr, this);
}
else{
throw "Method selectNodes is only supported by XML Elements";
}
};
XMLDocument.prototype.selectSingleNode = function(sExpr, contextNode){
var ctx = contextNode?contextNode:null;
return this.selectNodes(sExpr, ctx, true);
};
Element.prototype.selectSingleNode = function(sExpr){
var doc = this.ownerDocument;
if(doc.selectSingleNode){
return doc.selectSingleNode(sExpr, this);
}
else{
throw "Method selectNodes is only supported by XML Elements";
}
};
}
}-*/;

private static native JavaScriptObject initializeDOMParser() /*-{
return new $wnd.DOMParser();
}-*/;


// ---------------------------------------------------------- parse methods

public Document parse(String xml, String namespaces)
{
if (xml == null || xml.trim().length() == 0)
{
return null;
}
try
{
JavaScriptObject documentJso = parseImpl(xml, namespaces);
return NodeFactory.create(documentJso);
}
catch (JavaScriptException e)
{
throw new XmlParseException(e.getMessage(), e);
}
}


private native JavaScriptObject parseImpl(String xml, String namespaces) /*-{
var domDoc = @name.pehl.totoe.xml.client.internal.XmlParserImpl::nativeParser.parseFromString(xml, "text/xml");
var error = $wnd.Sarissa.getParseErrorText(domDoc);
if (error != $wnd.Sarissa.PARSED_OK)
{
if (error == $wnd.Sarissa.PARSED_EMPTY)
{
return null;
}
else if (error == $wnd.Sarissa.PARSED_UNKNOWN_ERROR)
{
throw (new Error("Unkown error parsing xml file."));
}
else
{
throw (new Error(error));
}
return null;
}

if (namespaces != null)
{
try
{
$wnd.Sarissa.setXpathNamespaces(domDoc, namespaces);
}
catch (e)
{
throw (new Error(e));
}
}
return domDoc;
}-*/;
}
Powered by Google Project Hosting