📄 xmlserver.java
字号:
package org.garret.rdf.xml;
import org.xml.sax.*;
import org.xml.sax.helpers.DefaultHandler;
import javax.xml.parsers.*;
import java.util.*;
import java.text.*;
import java.io.*;
import org.garret.rdf.*;
/**
* Parse XML requests and store/fetch data in storage
*/
public class XmlServer {
VersionedStorage store;
PrintStream writer;
public static String[] dateFormats = {
"EEE, d MMM yyyy kk:mm:ss z",
"EEE, d MMM yyyy kk:mm:ss",
"yyyy-MM-dd HH:mm:ss",
"yyyy-MM-dd HH:mm",
"yyyy-MM-dd"
};
public static DateFormat[] dateFormatters;
static {
dateFormatters = new DateFormat[dateFormats.length];
for (int i = 0; i < dateFormatters.length; i++) {
dateFormatters[i] = new SimpleDateFormat(dateFormats[i], Locale.ENGLISH);
}
}
public XmlServer(VersionedStorage store, PrintStream writer)
{
this.store = store;
this.writer = writer;
}
static class RdfResource {
RdfResource outer;
ArrayList props;
Object value;
String uri;
RdfResource(RdfResource outer) {
this.outer = outer;
props = new ArrayList();
}
}
static class RdfPattern {
RdfPattern outer;
ArrayList props;
Object value;
String uri;
int depth;
SearchKind kind;
Date timestamp;
RdfPattern(RdfPattern outer) {
this.outer = outer;
props = new ArrayList();
kind = SearchKind.LatestVersion;
}
}
DefaultHandler getHandler() {
return new RdfHandler();
}
class RdfHandler extends DefaultHandler {
DefaultHandler handler;
RdfHandler() {
handler = new RdfDocumentParser();
}
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
handler.startElement(uri, localName, qName, attributes);
}
public void endElement(String uri, String localName, String qName) throws SAXException {
handler.endElement(uri, localName, qName);
}
public void characters(char ch[], int start, int length) throws SAXException {
handler.characters(ch, start, length);
}
class RdfDocumentParser extends DefaultHandler {
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
String name = uri + localName;
if (XmlSymbols.Store.equals(name)) {
handler = new RdfStoreHandler(this);
} else if (XmlSymbols.Find.equals(name)) {
handler = new RdfFindHandler(this);
} else {
throw new SAXException("Unknown operation '" + name + "'");
}
}
}
class RdfStoreHandler extends DefaultHandler {
RdfResource curr;
DefaultHandler prevHandler;
RdfStoreHandler(DefaultHandler prevHandler) {
curr = new RdfResource(null);
this.prevHandler = prevHandler;
store.beginTransaction();
}
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
RdfResource res = new RdfResource(curr);
for (int i = 0, n = attributes.getLength(); i < n; i++) {
String name = attributes.getURI(i) + attributes.getLocalName(i);
String value = attributes.getValue(i);
if (XmlSymbols.Uri.equals(name)) {
res.uri = value;
} else if (XmlSymbols.Ref.equals(name)) {
if ((res.value = store.getObject(value)) == null) {
throw new SAXException("Object with URI '" + value + "' is not found");
}
} else {
res.props.add(createProperty(name, value));
}
}
if (res.uri == null) {
String parentURI = curr.uri == null
? XmlSymbols.NS + new java.rmi.server.UID()
: curr.uri;
res.uri = parentURI + '/' + localName;
}
curr = res;
}
public void characters (char ch[], int start, int length) {
if (curr != null && length != 0) {
curr.value = convertValue(new String(ch, start, length));
}
}
public void endElement (String uri, String localName, String qName) {
if (curr.outer == null) {
store.commit();
handler = prevHandler;
} else {
String name = uri+localName;
Object value;
if (curr.props.size() != 0) {
Thing thing = store.createObject(curr.uri, name, (NameVal[])curr.props.toArray(new NameVal[curr.props.size()]));
value = thing.vh;
} else {
value = curr.value;
}
curr = curr.outer;
curr.props.add(new NameVal(name, value));
}
}
private NameVal createProperty(String name, String value) throws SAXException {
if (XmlSymbols.Subtype.equals(name)) {
VersionHistory vh = store.getObject(value);
if (vh == null) {
throw new SAXException("Object with URI '" + value + "' is not found");
}
return new NameVal(name, vh);
} else {
return new NameVal(name, convertValue(value));
}
}
}
class RdfFindHandler extends DefaultHandler {
RdfPattern curr;
DefaultHandler prevHandler;
RdfFindHandler(DefaultHandler prevHandler) {
this.prevHandler = prevHandler;
writer.println("<?xml version='1.0'?>");
writer.println("<vr:result xmlns:vr=\"http://www.perst.org#\" xmlns:rdfs=\"http://www.w3.org/2000/01/rdf-schema#\" xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\">");
}
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
RdfPattern pattern = new RdfPattern(curr);
for (int i = 0, n = attributes.getLength(); i < n; i++) {
String name = attributes.getURI(i) + attributes.getLocalName(i);
String value = attributes.getValue(i);
if (XmlSymbols.Uri.equals(name)) {
pattern.uri = value;
} else if (XmlSymbols.Before.equals(name)) {
if ((pattern.timestamp = parseDate(value)) == null) {
throw new SAXException("Invalid date format " + value);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -