⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xmlserver.java

📁 这个是perst-269.zip下面的SOURCECODE,和大家分享了。
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
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 + -