Imported GNU Classpath 0.90

Imported GNU Classpath 0.90
       * scripts/makemake.tcl: Set gnu/java/awt/peer/swing to ignore.
       * gnu/classpath/jdwp/VMFrame.java (SIZE): New constant.
       * java/lang/VMCompiler.java: Use gnu.java.security.hash.MD5.
       * java/lang/Math.java: New override file.
       * java/lang/Character.java: Merged from Classpath.
       (start, end): Now 'int's.
       (canonicalName): New field.
       (CANONICAL_NAME, NO_SPACES_NAME, CONSTANT_NAME): New constants.
       (UnicodeBlock): Added argument.
       (of): New overload.
       (forName): New method.
       Updated unicode blocks.
       (sets): Updated.
       * sources.am: Regenerated.
       * Makefile.in: Likewise.

From-SVN: r111942
This commit is contained in:
Mark Wielaard
2006-03-10 21:46:48 +00:00
parent 27079765d0
commit 8aa540d2f7
1367 changed files with 188789 additions and 22762 deletions
@@ -2182,6 +2182,7 @@ loop:
{
nest++;
}
break;
case ']':
if (tryRead("]>"))
{
@@ -1,5 +1,5 @@
/* DomCharacterData.java --
Copyright (C) 1999,2000,2001,2004 Free Software Foundation, Inc.
Copyright (C) 1999,2000,2001,2004,2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -39,6 +39,8 @@ package gnu.xml.dom;
import org.w3c.dom.CharacterData;
import org.w3c.dom.DOMException;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.w3c.dom.events.MutationEvent;
@@ -55,6 +57,30 @@ public abstract class DomCharacterData
implements CharacterData
{
/**
* Empty node list representing the children of character data nodes.
*/
static class EmptyNodeList
implements NodeList
{
public int getLength()
{
return 0;
}
public Node item(int index)
{
return null;
}
}
/**
* Singleton empty node list for character data nodes.
*/
static final NodeList CHILD_NODES = new EmptyNodeList();
private String text;
// package private
@@ -279,6 +305,15 @@ public abstract class DomCharacterData
}
}
/**
* Returns an empty node list.
* Character data nodes do not have children.
*/
public NodeList getChildNodes()
{
return CHILD_NODES;
}
/**
* The base URI for character data is <code>null</code>.
* @since DOM Level 3 Core
@@ -1,5 +1,5 @@
/* DomDocumentBuilder.java --
Copyright (C) 2004 Free Software Foundation, Inc.
Copyright (C) 2004,2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -37,9 +37,11 @@ exception statement from your version. */
package gnu.xml.dom;
import java.io.File;
import java.io.InputStream;
import java.io.IOException;
import java.io.Reader;
import java.net.MalformedURLException;
import java.net.URL;
import javax.xml.parsers.DocumentBuilder;
import org.w3c.dom.Document;
@@ -157,8 +159,18 @@ class DomDocumentBuilder
}
else
{
URL url = new URL(systemId);
input.setByteStream(url.openStream());
try
{
URL url = new URL(systemId);
input.setByteStream(url.openStream());
}
catch (MalformedURLException e)
{
// Maybe this is a relative file URL
File cwd = new File(System.getProperty("user.dir"));
URL url = new URL(cwd.toURL(), systemId);
input.setByteStream(url.openStream());
}
}
}
input.setPublicId(is.getPublicId());
@@ -37,6 +37,7 @@ exception statement from your version. */
package gnu.xml.dom;
import javax.xml.XMLConstants;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.FactoryConfigurationError;
@@ -59,6 +60,7 @@ public class DomDocumentBuilderFactory
final DOMImplementation impl;
final DOMImplementationLS ls;
private boolean secureProcessing;
public DomDocumentBuilderFactory()
{
@@ -124,5 +126,26 @@ public class DomDocumentBuilderFactory
// TODO
}
public void setFeature(String name, boolean value)
throws ParserConfigurationException
{
if (name == null)
throw new NullPointerException();
if (XMLConstants.FEATURE_SECURE_PROCESSING.equals(name))
{
secureProcessing = true;
return;
}
throw new ParserConfigurationException(name);
}
public boolean getFeature(String name)
throws ParserConfigurationException
{
if (XMLConstants.FEATURE_SECURE_PROCESSING.equals(name))
return secureProcessing;
throw new ParserConfigurationException(name);
}
}
@@ -49,6 +49,7 @@ import org.xml.sax.XMLReader;
import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;
import javax.xml.XMLConstants;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
@@ -70,6 +71,7 @@ public final class JAXPFactory
private static final String FEATURE = "http://xml.org/sax/features/";
private SAXParserFactory pf;
private boolean secureProcessing;
/**
* Default constructor.
@@ -138,6 +140,27 @@ public final class JAXPFactory
throw new IllegalArgumentException(name);
}
public void setFeature(String name, boolean value)
throws ParserConfigurationException
{
if (name == null)
throw new NullPointerException();
if (XMLConstants.FEATURE_SECURE_PROCESSING.equals(name))
{
secureProcessing = true;
return;
}
throw new ParserConfigurationException(name);
}
public boolean getFeature(String name)
throws ParserConfigurationException
{
if (XMLConstants.FEATURE_SECURE_PROCESSING.equals(name))
return secureProcessing;
throw new ParserConfigurationException(name);
}
static final class JAXPBuilder
extends DocumentBuilder
implements ErrorHandler
@@ -37,6 +37,7 @@ exception statement from your version. */
package gnu.xml.libxmlj.dom;
import javax.xml.XMLConstants;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
@@ -47,9 +48,11 @@ import javax.xml.parsers.ParserConfigurationException;
* @author <a href='mailto:dog@gnu.org'>Chris Burdess</a>
*/
public class GnomeDocumentBuilderFactory
extends DocumentBuilderFactory
extends DocumentBuilderFactory
{
private boolean secureProcessing;
public GnomeDocumentBuilderFactory ()
{
setNamespaceAware (true);
@@ -91,4 +94,25 @@ extends DocumentBuilderFactory
// TODO
}
public void setFeature(String name, boolean value)
throws ParserConfigurationException
{
if (name == null)
throw new NullPointerException();
if (XMLConstants.FEATURE_SECURE_PROCESSING.equals(name))
{
secureProcessing = true;
return;
}
throw new ParserConfigurationException(name);
}
public boolean getFeature(String name)
throws ParserConfigurationException
{
if (XMLConstants.FEATURE_SECURE_PROCESSING.equals(name))
return secureProcessing;
throw new ParserConfigurationException(name);
}
}
@@ -1,5 +1,5 @@
/* CRLFReader.java --
Copyright (C) 2005 Free Software Foundation, Inc.
Copyright (C) 2005,2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -153,13 +153,14 @@ class CRLFReader
throws IOException
{
doReset = false;
int lm1 = len - 1;
for (int i = off; i < len; i++)
int end = off + len;
int em1 = end - 1;
for (int i = off; i < end; i++)
{
if (b[i] == '\r') // CR
{
int d;
if (i == lm1)
if (i == em1)
{
d = in.read();
doReset = true;
@@ -1,5 +1,5 @@
/* EntityReferenceImpl.java --
Copyright (C) 2005 Free Software Foundation, Inc.
Copyright (C) 2005,2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -41,7 +41,7 @@ import java.io.IOException;
import java.io.Writer;
import javax.xml.stream.Location;
import javax.xml.stream.XMLStreamException;
//import javax.xml.stream.events.EntityDeclaration;
import javax.xml.stream.events.EntityDeclaration;
import javax.xml.stream.events.EntityReference;
/**
@@ -54,26 +54,16 @@ public class EntityReferenceImpl
implements EntityReference
{
//protected final EntityDeclaration decl;
protected final EntityDeclaration decl;
protected final String name;
protected final String baseUri;
protected final String publicId;
protected final String systemId;
protected final String replacementText;
protected EntityReferenceImpl(Location location,
//EntityDeclaration decl,
String name,
String baseUri, String publicId,
String systemId, String replacementText)
EntityDeclaration decl,
String name)
{
super(location);
//this.decl = decl;
this.decl = decl;
this.name = name;
this.baseUri = baseUri;
this.publicId = publicId;
this.systemId = systemId;
this.replacementText = replacementText;
}
public int getEventType()
@@ -81,36 +71,16 @@ public class EntityReferenceImpl
return ENTITY_REFERENCE;
}
/*public EntityDeclaration getDeclaration()
public EntityDeclaration getDeclaration()
{
return decl;
}*/
}
public String getName()
{
return name;
}
public String getBaseUri()
{
return baseUri;
}
public String getPublicId()
{
return publicId;
}
public String getSystemId()
{
return systemId;
}
public String getReplacementText()
{
return replacementText;
}
public void writeAsEncodedUnicode(Writer writer)
throws XMLStreamException
{
@@ -1,5 +1,5 @@
/* FilteredEventReader.java --
Copyright (C) 2005 Free Software Foundation, Inc.
Copyright (C) 2005,2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -56,24 +56,37 @@ class FilteredEventReader
}
public boolean hasNext()
throws XMLStreamException
{
// XXX ???
return super.hasNext();
}
public XMLEvent next()
public XMLEvent nextEvent()
throws XMLStreamException
{
XMLEvent ret;
do
{
ret = super.next();
ret = super.nextEvent();
}
while (!filter.accept(ret));
return ret;
}
public Object next()
{
try
{
return nextEvent();
}
catch (XMLStreamException e)
{
RuntimeException e2 = new RuntimeException();
e2.initCause(e);
throw e2;
}
}
public XMLEvent peek()
throws XMLStreamException
{
+54 -35
View File
@@ -1,5 +1,5 @@
/* SAXParser.java --
Copyright (C) 2005 Free Software Foundation, Inc.
Copyright (C) 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -92,8 +92,7 @@ import org.xml.sax.ext.Locator2;
*/
public class SAXParser
extends javax.xml.parsers.SAXParser
implements XMLReader, Attributes2, Locator2, XMLReporter,
XMLParser.XMLResolver2
implements XMLReader, Attributes2, Locator2, XMLReporter, XMLResolver
{
ContentHandler contentHandler;
@@ -323,6 +322,7 @@ public class SAXParser
supportDTD,
baseAware,
stringInterning,
true,
this,
this);
else
@@ -338,6 +338,7 @@ public class SAXParser
supportDTD,
baseAware,
stringInterning,
true,
this,
this);
}
@@ -357,6 +358,7 @@ public class SAXParser
supportDTD,
baseAware,
stringInterning,
true,
this,
this);
}
@@ -486,14 +488,14 @@ public class SAXParser
contentHandler.processingInstruction(target, data);
}
break;
case XMLStreamConstants.START_ENTITY:
case XMLParser.START_ENTITY:
if (lexicalHandler != null)
{
String name = reader.getText();
lexicalHandler.startEntity(name);
}
break;
case XMLStreamConstants.END_ENTITY:
case XMLParser.END_ENTITY:
if (lexicalHandler != null)
{
String name = reader.getText();
@@ -649,24 +651,36 @@ public class SAXParser
lexicalHandler.endDTD();
}
}
}
catch (XMLStreamException e)
{
if (!startDocumentDone && contentHandler != null)
contentHandler.startDocument();
SAXParseException e2 = new SAXParseException(e.getMessage(), this);
e2.initCause(e);
if (errorHandler != null)
errorHandler.fatalError(e2);
if (contentHandler != null)
contentHandler.endDocument();
throw e2;
}
finally
{
reset();
if (opened)
in.close();
}
catch (Exception e)
{
SAXParseException e2 = new SAXParseException(e.getMessage(), this);
e2.initCause(e);
try
{
if (!startDocumentDone && contentHandler != null)
contentHandler.startDocument();
if (errorHandler != null)
errorHandler.fatalError(e2);
if (contentHandler != null)
contentHandler.endDocument();
}
catch (SAXException sex)
{
// Ignored, we will rethrow the original exception.
}
reset();
if (opened)
in.close();
if (e instanceof SAXException)
throw (SAXException) e;
if (e instanceof IOException)
throw (IOException) e;
else
throw e2;
}
}
@@ -685,7 +699,7 @@ public class SAXParser
int ac = reader.getAttributeCount();
for (int i = 0; i < ac; i++)
{
QName aname = reader.getAttributeQName(i);
QName aname = reader.getAttributeName(i);
if ("space".equals(aname.getLocalPart()) &&
XMLConstants.XML_NS_URI.equals(aname.getNamespaceURI()))
{
@@ -726,7 +740,7 @@ public class SAXParser
int len = reader.getAttributeCount();
for (int i = 0; i < len; i++)
{
QName q = reader.getAttributeQName(i);
QName q = reader.getAttributeName(i);
String localName = q.getLocalPart();
String prefix = q.getPrefix();
String qn = ("".equals(prefix)) ? localName : prefix + ":" + localName;
@@ -741,7 +755,7 @@ public class SAXParser
int len = reader.getAttributeCount();
for (int i = 0; i < len; i++)
{
QName q = reader.getAttributeQName(i);
QName q = reader.getAttributeName(i);
String ln = q.getLocalPart();
String u = q.getNamespaceURI();
if (u == null && uri != null)
@@ -761,12 +775,12 @@ public class SAXParser
public String getLocalName(int index)
{
return reader.getAttributeName(index);
return reader.getAttributeLocalName(index);
}
public String getQName(int index)
{
QName q = reader.getAttributeQName(index);
QName q = reader.getAttributeName(index);
String localName = q.getLocalPart();
String prefix = q.getPrefix();
return ("".equals(prefix)) ? localName : prefix + ":" + localName;
@@ -864,13 +878,14 @@ public class SAXParser
public String getPublicId()
{
return null;
Location l = reader.getLocation();
return l.getPublicId();
}
public String getSystemId()
{
Location l = reader.getLocation();
return l.getLocationURI();
return l.getSystemId();
}
public String getEncoding()
@@ -885,13 +900,8 @@ public class SAXParser
// -- XMLResolver --
public InputStream resolve(String uri)
throws XMLStreamException
{
return resolve(null, uri);
}
public InputStream resolve(String publicId, String systemId)
public Object resolveEntity(String publicId, String systemId,
String baseURI, String namespace)
throws XMLStreamException
{
if (entityResolver != null)
@@ -901,7 +911,16 @@ public class SAXParser
InputSource input =
entityResolver.resolveEntity(publicId, systemId);
if (input != null)
return input.getByteStream();
{
InputStream in = input.getByteStream();
if (in == null)
{
String newSystemId = input.getSystemId();
if (newSystemId != null && !newSystemId.equals(systemId))
in = XMLParser.resolve(newSystemId);
}
return in;
}
}
catch (SAXException e)
{
@@ -45,7 +45,7 @@ import java.io.Reader;
*
* @author <a href='mailto:dog@gnu.org'>Chris Burdess</a>
*/
class UnicodeReader
public class UnicodeReader
{
final Reader in;
@@ -152,6 +152,10 @@ class UnicodeReader
in.close();
}
/**
* Returns the specified UTF-16 char array as an array of Unicode code
* points.
*/
public static int[] toCodePointArray(String text)
throws IOException
{
@@ -42,6 +42,7 @@ import java.io.InputStreamReader;
import java.io.IOException;
import java.io.Reader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.util.HashSet;
@@ -121,7 +122,17 @@ class XIncludeFilter
boolean expandERefs)
{
super(reader);
this.systemId = XMLParser.absolutize(null, systemId);
try
{
this.systemId = XMLParser.absolutize(null, systemId);
}
catch (MalformedURLException e)
{
RuntimeException e2 = new RuntimeException("unsupported URL: " +
systemId);
e2.initCause(e);
throw e2;
}
this.namespaceAware = namespaceAware;
this.validating = validating;
this.expandERefs = expandERefs;
@@ -137,7 +148,7 @@ class XIncludeFilter
return super.getAttributeCount();
}
public String getAttributeName(int index)
public String getAttributeLocalName(int index)
{
if (current != null)
{
@@ -147,7 +158,7 @@ class XIncludeFilter
Node attr = attrs.item(index);
return attr.getLocalName();
}
return super.getAttributeName(index);
return super.getAttributeLocalName(index);
}
public String getAttributeNamespace(int index)
@@ -176,7 +187,7 @@ class XIncludeFilter
return super.getAttributePrefix(index);
}
public QName getAttributeQName(int index)
public QName getAttributeName(int index)
{
if (current != null)
{
@@ -189,7 +200,7 @@ class XIncludeFilter
String prefix = attr.getPrefix();
return new QName(uri, localName, prefix);
}
return super.getAttributeQName(index);
return super.getAttributeName(index);
}
public String getAttributeType(int index)
@@ -1,5 +1,5 @@
/* XMLEventAllocatorImpl.java --
Copyright (C) 2005 Free Software Foundation, Inc.
Copyright (C) 2005,2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -116,10 +116,9 @@ public class XMLEventAllocatorImpl
namespaces);
case XMLStreamConstants.ENTITY_REFERENCE:
String name = reader.getLocalName();
//EntityDeclaration decl =
// (EntityDeclaration) entityDeclarations.get(name);
//return new EntityReferenceImpl(location, decl, name);
return new EntityReferenceImpl(location, name, null, null, null, null);
EntityDeclaration decl =
(EntityDeclaration) entityDeclarations.get(name);
return new EntityReferenceImpl(location, decl, name);
case XMLStreamConstants.PROCESSING_INSTRUCTION:
return new ProcessingInstructionImpl(location,
reader.getPITarget(),
@@ -132,7 +131,7 @@ public class XMLEventAllocatorImpl
return new CharactersImpl(location, text,
whitespace, false, ignorableWhitespace);
case XMLStreamConstants.START_DOCUMENT:
String systemId = location.getLocationURI();
String systemId = location.getSystemId();
String encoding = reader.getCharacterEncodingScheme();
boolean encodingDeclared = encoding != null;
if (encoding == null)
@@ -164,7 +163,7 @@ public class XMLEventAllocatorImpl
List attributes = new LinkedList();
for (int i = 0; i < len; i++)
attributes.add(new AttributeImpl(location,
reader.getAttributeQName(i),
reader.getAttributeName(i),
reader.getAttributeValue(i),
QName.valueOf(reader.getAttributeType(i)),
reader.isAttributeSpecified(i)));
@@ -1,5 +1,5 @@
/* XMLEventFactoryImpl.java --
Copyright (C) 2005 Free Software Foundation, Inc.
Copyright (C) 2005,2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -233,12 +233,9 @@ public class XMLEventFactoryImpl
}
public EntityReference createEntityReference(String name,
//EntityDeclaration declaration)
String replacementText)
EntityDeclaration declaration)
{
//return new EntityReferenceImpl(location, declaration, name);
return new EntityReferenceImpl(location, name, null, null, null,
replacementText);
return new EntityReferenceImpl(location, declaration, name);
}
public Comment createComment(String text)
@@ -1,5 +1,5 @@
/* XMLEventImpl.java --
Copyright (C) 2005 Free Software Foundation, Inc.
Copyright (C) 2005,2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -116,16 +116,6 @@ public abstract class XMLEventImpl
return getEventType() == END_DOCUMENT;
}
public boolean isStartEntity()
{
return getEventType() == START_ENTITY;
}
public boolean isEndEntity()
{
return getEventType() == END_ENTITY;
}
public StartElement asStartElement()
{
return (StartElement) this;
@@ -67,7 +67,7 @@ public class XMLEventReaderImpl
this.systemId = systemId;
}
public XMLEvent next()
public XMLEvent nextEvent()
throws XMLStreamException
{
XMLEvent ret = peek();
@@ -75,10 +75,32 @@ public class XMLEventReaderImpl
return ret;
}
public boolean hasNext()
throws XMLStreamException
public Object next()
{
return peekEvent != null || reader.hasNext();
try
{
return nextEvent();
}
catch (XMLStreamException e)
{
RuntimeException e2 = new RuntimeException();
e2.initCause(e);
throw e2;
}
}
public boolean hasNext()
{
if (peekEvent != null)
return true;
try
{
return reader.hasNext();
}
catch (XMLStreamException e)
{
return false;
}
}
public XMLEvent peek()
@@ -121,5 +143,16 @@ public class XMLEventReaderImpl
return reader.getProperty(name);
}
public void close()
throws XMLStreamException
{
reader.close();
}
public void remove()
{
throw new UnsupportedOperationException();
}
}
@@ -155,7 +155,7 @@ public class XMLEventWriterImpl
throws XMLStreamException
{
while (reader.hasNext())
add(reader.next());
add(reader.nextEvent());
}
public String getPrefix(String uri)
@@ -1,5 +1,5 @@
/* XMLInputFactoryImpl.java --
Copyright (C) 2005 Free Software Foundation, Inc.
Copyright (C) 2005,2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -89,28 +89,7 @@ public class XMLInputFactoryImpl
public XMLStreamReader createXMLStreamReader(Reader reader)
throws XMLStreamException
{
/*
return new XMLStreamReaderImpl(reader, null, null,
resolver, reporter,
validating, namespaceAware,
coalescing, replacingEntityReferences,
externalEntities, supportDTD);
*/
XMLParser ret = new XMLParser(reader, null,
validating,
namespaceAware,
coalescing,
replacingEntityReferences,
externalEntities,
supportDTD,
baseAware,
stringInterning,
reporter,
resolver);
if (xIncludeAware)
return new XIncludeFilter(ret, null, namespaceAware, validating,
replacingEntityReferences);
return ret;
return createXMLStreamReader(null, reader);
}
public XMLStreamReader createXMLStreamReader(Source source)
@@ -118,11 +97,6 @@ public class XMLInputFactoryImpl
{
String systemId = source.getSystemId();
InputStream in = getInputStream(source);
/*return new XMLStreamReaderImpl(in, null, systemId,
resolver, reporter,
validating, namespaceAware,
coalescing, replacingEntityReferences,
externalEntities, supportDTD);*/
XMLParser ret = new XMLParser(in, systemId,
validating,
namespaceAware,
@@ -132,6 +106,7 @@ public class XMLInputFactoryImpl
supportDTD,
baseAware,
stringInterning,
false,
reporter,
resolver);
if (xIncludeAware)
@@ -143,26 +118,7 @@ public class XMLInputFactoryImpl
public XMLStreamReader createXMLStreamReader(InputStream in)
throws XMLStreamException
{
/*return new XMLStreamReaderImpl(in, null, null,
resolver, reporter,
validating, namespaceAware,
coalescing, replacingEntityReferences,
externalEntities, supportDTD);*/
XMLParser ret = new XMLParser(in, null,
validating,
namespaceAware,
coalescing,
replacingEntityReferences,
externalEntities,
supportDTD,
baseAware,
stringInterning,
reporter,
resolver);
if (xIncludeAware)
return new XIncludeFilter(ret, null, namespaceAware, validating,
replacingEntityReferences);
return ret;
return createXMLStreamReader(null, in);
}
public XMLStreamReader createXMLStreamReader(InputStream in, String encoding)
@@ -171,6 +127,48 @@ public class XMLInputFactoryImpl
return createXMLStreamReader(in);
}
public XMLStreamReader createXMLStreamReader(String systemId, InputStream in)
throws XMLStreamException
{
XMLParser ret = new XMLParser(in, systemId,
validating,
namespaceAware,
coalescing,
replacingEntityReferences,
externalEntities,
supportDTD,
baseAware,
stringInterning,
false,
reporter,
resolver);
if (xIncludeAware)
return new XIncludeFilter(ret, null, namespaceAware, validating,
replacingEntityReferences);
return ret;
}
public XMLStreamReader createXMLStreamReader(String systemId, Reader reader)
throws XMLStreamException
{
XMLParser ret = new XMLParser(reader, systemId,
validating,
namespaceAware,
coalescing,
replacingEntityReferences,
externalEntities,
supportDTD,
baseAware,
stringInterning,
false,
reporter,
resolver);
if (xIncludeAware)
return new XIncludeFilter(ret, null, namespaceAware, validating,
replacingEntityReferences);
return ret;
}
public XMLEventReader createXMLEventReader(Reader reader)
throws XMLStreamException
{
@@ -178,6 +176,13 @@ public class XMLInputFactoryImpl
return new XMLEventReaderImpl(sr, allocator, null);
}
public XMLEventReader createXMLEventReader(String systemId, Reader reader)
throws XMLStreamException
{
XMLStreamReader sr = createXMLStreamReader(systemId, reader);
return new XMLEventReaderImpl(sr, allocator, null);
}
public XMLEventReader createXMLEventReader(XMLStreamReader reader)
throws XMLStreamException
{
@@ -205,6 +210,13 @@ public class XMLInputFactoryImpl
return new XMLEventReaderImpl(sr, allocator, null);
}
public XMLEventReader createXMLEventReader(String systemId, InputStream in)
throws XMLStreamException
{
XMLStreamReader sr = createXMLStreamReader(systemId, in);
return new XMLEventReaderImpl(sr, allocator, null);
}
public XMLStreamReader createFilteredReader(XMLStreamReader reader,
StreamFilter filter)
throws XMLStreamException
@@ -42,6 +42,8 @@ import java.io.OutputStreamWriter;
import java.io.Writer;
import java.io.UnsupportedEncodingException;
import javax.xml.transform.Result;
import javax.xml.transform.stream.StreamResult;
import javax.xml.stream.XMLEventWriter;
import javax.xml.stream.XMLOutputFactory;
import javax.xml.stream.XMLStreamException;
@@ -94,6 +96,22 @@ public class XMLOutputFactoryImpl
}
}
public XMLStreamWriter createXMLStreamWriter(Result result)
throws XMLStreamException
{
if (result instanceof StreamResult)
{
StreamResult sr = (StreamResult) result;
OutputStream out = sr.getOutputStream();
if (out != null)
return createXMLStreamWriter(out);
Writer writer = sr.getWriter();
if (writer != null)
return createXMLStreamWriter(writer);
}
throw new UnsupportedOperationException();
}
public XMLEventWriter createXMLEventWriter(OutputStream stream)
throws XMLStreamException
{
@@ -116,10 +134,26 @@ public class XMLOutputFactoryImpl
return new XMLEventWriterImpl(writer);
}
public XMLEventWriter createXMLEventWriter(Result result)
throws XMLStreamException
{
if (result instanceof StreamResult)
{
StreamResult sr = (StreamResult) result;
OutputStream out = sr.getOutputStream();
if (out != null)
return createXMLEventWriter(out);
Writer writer = sr.getWriter();
if (writer != null)
return createXMLEventWriter(writer);
}
throw new UnsupportedOperationException();
}
public void setProperty(String name, Object value)
throws IllegalArgumentException
{
if (IS_PREFIX_DEFAULTING.equals(name))
if (IS_REPAIRING_NAMESPACES.equals(name))
prefixDefaulting = ((Boolean) value).booleanValue();
else
throw new IllegalArgumentException(name);
@@ -128,14 +162,14 @@ public class XMLOutputFactoryImpl
public Object getProperty(String name)
throws IllegalArgumentException
{
if (IS_PREFIX_DEFAULTING.equals(name))
if (IS_REPAIRING_NAMESPACES.equals(name))
return new Boolean(prefixDefaulting);
throw new IllegalArgumentException(name);
}
public boolean isPropertySupported(String name)
{
if (IS_PREFIX_DEFAULTING.equals(name))
if (IS_REPAIRING_NAMESPACES.equals(name))
return true;
return false;
}
+90 -89
View File
@@ -137,6 +137,10 @@ public class XMLParser
final static int ATTRIBUTE_DEFAULT_REQUIRED = 33;
final static int ATTRIBUTE_DEFAULT_FIXED = 34;
// -- additional event types --
final static int START_ENTITY = 50;
final static int END_ENTITY = 51;
/**
* The current input.
*/
@@ -317,6 +321,12 @@ public class XMLParser
*/
private final boolean baseAware;
/**
* Whether to report extended event types (START_ENTITY and END_ENTITY)
* in addition to the standard event types. Used by the SAX parser.
*/
private final boolean extendedEventTypes;
/**
* The reporter to receive parsing warnings.
*/
@@ -389,6 +399,7 @@ public class XMLParser
boolean supportDTD,
boolean baseAware,
boolean stringInterning,
boolean extendedEventTypes,
XMLReporter reporter,
XMLResolver resolver)
{
@@ -400,6 +411,7 @@ public class XMLParser
this.supportDTD = supportDTD;
this.baseAware = baseAware;
this.stringInterning = stringInterning;
this.extendedEventTypes = extendedEventTypes;
this.reporter = reporter;
this.resolver = resolver;
if (validating)
@@ -446,6 +458,7 @@ public class XMLParser
boolean supportDTD,
boolean baseAware,
boolean stringInterning,
boolean extendedEventTypes,
XMLReporter reporter,
XMLResolver resolver)
{
@@ -457,6 +470,7 @@ public class XMLParser
this.supportDTD = supportDTD;
this.baseAware = baseAware;
this.stringInterning = stringInterning;
this.extendedEventTypes = extendedEventTypes;
this.reporter = reporter;
this.resolver = resolver;
if (validating)
@@ -561,7 +575,7 @@ public class XMLParser
return attrs.size();
}
public String getAttributeName(int index)
public String getAttributeLocalName(int index)
{
Attribute a = (Attribute) attrs.get(index);
return a.localName;
@@ -579,7 +593,7 @@ public class XMLParser
return a.prefix;
}
public QName getAttributeQName(int index)
public QName getAttributeName(int index)
{
Attribute a = (Attribute) attrs.get(index);
String namespaceURI = getNamespaceURI(a.prefix);
@@ -710,7 +724,7 @@ public class XMLParser
public int getNamespaceCount()
{
if (!namespaceAware)
if (!namespaceAware || namespaces.isEmpty())
return 0;
switch (event)
{
@@ -984,10 +998,10 @@ public class XMLParser
if (event == XMLStreamConstants.END_ELEMENT)
{
// Pop namespace context
if (namespaceAware)
if (namespaceAware && !namespaces.isEmpty())
namespaces.removeFirst();
// Pop base context
if (baseAware)
if (baseAware && !bases.isEmpty())
bases.removeFirst();
}
if (!startEntityStack.isEmpty())
@@ -995,16 +1009,16 @@ public class XMLParser
String entityName = (String) startEntityStack.removeFirst();
buf.setLength(0);
buf.append(entityName);
event = XMLStreamConstants.START_ENTITY;
return event;
event = START_ENTITY;
return extendedEventTypes ? event : next();
}
else if (!endEntityStack.isEmpty())
{
String entityName = (String) endEntityStack.removeFirst();
buf.setLength(0);
buf.append(entityName);
event = XMLStreamConstants.END_ENTITY;
return event;
event = END_ENTITY;
return extendedEventTypes ? event : next();
}
try
{
@@ -1484,7 +1498,6 @@ public class XMLParser
{
if (!externalEntities)
return;
InputStream in = null;
String url = absolutize(input.systemId, ids.systemId);
// Check for recursion
for (Iterator i = inputStack.iterator(); i.hasNext(); )
@@ -1497,12 +1510,13 @@ public class XMLParser
}
if (name == null || "".equals(name))
report = false;
if (in == null && url != null && resolver != null)
InputStream in = null;
if (resolver != null)
{
if (resolver instanceof XMLResolver2)
in = ((XMLResolver2) resolver).resolve(ids.publicId, url);
else
in = resolver.resolve(url);
Object obj = resolver.resolveEntity(ids.publicId, url, getXMLBase(),
null);
if (obj instanceof InputStream)
in = (InputStream) obj;
}
if (in == null)
in = resolve(url);
@@ -1535,12 +1549,13 @@ public class XMLParser
* @param base the current base URL
* @param href the (absolute or relative) URL to resolve
*/
static String absolutize(String base, String href)
public static String absolutize(String base, String href)
throws MalformedURLException
{
if (href == null)
return null;
int ci = href.indexOf(':');
if (ci > 1 && isLowercaseAscii(href.substring(0, ci)))
if (ci > 1 && isURLScheme(href.substring(0, ci)))
{
// href is absolute already
return href;
@@ -1565,40 +1580,23 @@ public class XMLParser
if (!base.endsWith("/"))
base += "/";
}
if (href.startsWith("/"))
{
if (base.startsWith("file:"))
return "file://" + href;
int i = base.indexOf("://");
if (i != -1)
{
i = base.indexOf('/', i + 3);
if (i != -1)
base = base.substring(0, i);
}
}
else
{
while (href.startsWith(".."))
{
int i = base.lastIndexOf('/', base.length() - 2);
if (i != -1)
base = base.substring(0, i + 1);
href = href.substring(2);
if (href.startsWith("/"))
href = href.substring(1);
}
}
return base + href;
return new URL(new URL(base), href).toString();
}
private static boolean isLowercaseAscii(String text)
/**
* Indicates whether the specified characters match the scheme portion of
* a URL.
* @see RFC 1738 section 2.1
*/
private static boolean isURLScheme(String text)
{
int len = text.length();
for (int i = 0; i < len; i++)
{
char c = text.charAt(i);
if (c < 97 || c > 122)
if (c == '+' || c == '.' || c == '-')
continue;
if (c < 65 || (c > 90 && c < 97) || c > 122)
return false;
}
return true;
@@ -1607,7 +1605,7 @@ public class XMLParser
/**
* Returns an input stream for the given URL.
*/
private InputStream resolve(String url)
static InputStream resolve(String url)
throws IOException
{
try
@@ -1618,6 +1616,12 @@ public class XMLParser
{
return null;
}
catch (IOException e)
{
IOException e2 = new IOException("error resolving " + url);
e2.initCause(e);
throw e2;
}
}
/**
@@ -1891,7 +1895,10 @@ public class XMLParser
throws IOException, XMLStreamException
{
requireWhitespace();
boolean saved = expandPE;
expandPE = (inputStack.size() > 1);
String name = readNmtoken(true);
expandPE = saved;
requireWhitespace();
readContentspec(name);
skipWhitespace();
@@ -2106,7 +2113,10 @@ public class XMLParser
throws IOException, XMLStreamException
{
requireWhitespace();
boolean saved = expandPE;
expandPE = (inputStack.size() > 1);
String elementName = readNmtoken(true);
expandPE = saved;
boolean white = tryWhitespace();
while (!tryRead('>'))
{
@@ -2419,11 +2429,11 @@ public class XMLParser
}
else
{
if (!isNameStartCharacter(cp[0]))
if (!isNameStartCharacter(cp[0], input.xml11))
error("malformed reference in entity value", value);
for (int i = 1; i < cp.length; i++)
{
if (!isNameCharacter(cp[i]))
if (!isNameCharacter(cp[i], input.xml11))
error("malformed reference in entity value", value);
}
}
@@ -2838,8 +2848,6 @@ public class XMLParser
error("Duplicate default namespace declaration");
if (XMLConstants.XML_NS_URI.equals(attr.value))
error("can't bind XML namespace");
if ("".equals(attr.value) && !input.xml11)
error("illegal use of 1.1-style prefix unbinding in 1.0 document");
ctx.put(XMLConstants.DEFAULT_NS_PREFIX, attr.value);
return true;
}
@@ -3087,7 +3095,15 @@ public class XMLParser
break;
case 0x3c: // '<'
reset();
read(tmpBuf, 0, i);
// read i characters
int count = 0, remaining = i;
do
{
int r = read(tmpBuf, 0, remaining);
count += r;
remaining -= r;
}
while (count < i);
i = len;
if (coalescing && tryRead(TEST_CDATA))
readUntil(TEST_END_CDATA); // read CDATA section into buf
@@ -3258,15 +3274,7 @@ public class XMLParser
reset();
char[] ref = readCharacterRef(hex ? 16 : 10);
for (int i = 0; i < ref.length; i++)
{
char x = ref[i];
if ((flags & (LIT_ATTRIBUTE | LIT_PUBID)) != 0 &&
(x == 0x0a || x == 0x0d))
x = 0x20; // normalize
else if ((flags & LIT_ATTRIBUTE) != 0 && x == 0x09)
x = 0x20; // normalize
literalBuf.append(x);
}
literalBuf.append(ref[i]);
entities = true;
continue;
}
@@ -3469,13 +3477,13 @@ public class XMLParser
int c = readCh();
if (isName)
{
if (!isNameStartCharacter(c))
if (!isNameStartCharacter(c, input.xml11))
error("not a name start character",
"U+" + Integer.toHexString(c));
}
else
{
if (!isNameCharacter(c))
if (!isNameCharacter(c, input.xml11))
error("not a name character",
"U+" + Integer.toHexString(c));
}
@@ -3510,7 +3518,7 @@ public class XMLParser
reset();
return intern(buf.toString());
default:
if (!isNameCharacter(c))
if (!isNameCharacter(c, input.xml11))
error("not a name character",
"U+" + Integer.toHexString(c));
else
@@ -3523,7 +3531,7 @@ public class XMLParser
/**
* Indicates whether the specified Unicode character is an XML 1.1 Char.
*/
private boolean isXML11Char(int c)
public static boolean isXML11Char(int c)
{
return ((c >= 0x0001 && c <= 0xD7FF) ||
(c >= 0xE000 && c < 0xFFFD) || // NB exclude 0xfffd
@@ -3534,7 +3542,7 @@ public class XMLParser
* Indicates whether the specified Unicode character is an XML 1.1
* RestrictedChar.
*/
private boolean isXML11RestrictedChar(int c)
public static boolean isXML11RestrictedChar(int c)
{
return ((c >= 0x0001 && c <= 0x0008) ||
(c >= 0x000B && c <= 0x000C) ||
@@ -3556,17 +3564,17 @@ public class XMLParser
return false;
if (isName)
{
if (!isNameStartCharacter(cp[0]))
if (!isNameStartCharacter(cp[0], input.xml11))
return false;
}
else
{
if (!isNameCharacter(cp[0]))
if (!isNameCharacter(cp[0], input.xml11))
return false;
}
for (int i = 1; i < cp.length; i++)
{
if (!isNameCharacter(cp[i]))
if (!isNameCharacter(cp[i], input.xml11))
return false;
}
return true;
@@ -3581,9 +3589,9 @@ public class XMLParser
* Indicates whether the specified Unicode character is a Name start
* character.
*/
private boolean isNameStartCharacter(int c)
public static boolean isNameStartCharacter(int c, boolean xml11)
{
if (input.xml11)
if (xml11)
return ((c >= 0x0041 && c <= 0x005a) ||
(c >= 0x0061 && c <= 0x007a) ||
c == 0x3a |
@@ -3608,9 +3616,9 @@ public class XMLParser
* Indicates whether the specified Unicode character is a Name non-initial
* character.
*/
private boolean isNameCharacter(int c)
public static boolean isNameCharacter(int c, boolean xml11)
{
if (input.xml11)
if (xml11)
return ((c >= 0x0041 && c <= 0x005a) ||
(c >= 0x0061 && c <= 0x007a) ||
(c >= 0x0030 && c <= 0x0039) ||
@@ -4255,6 +4263,7 @@ public class XMLParser
true, // supportDTD
true, // baseAware
true, // stringInterning
true, // extendedEventTypes
null,
null);
XMLStreamReader reader = p;
@@ -4286,7 +4295,7 @@ public class XMLParser
"='"+reader.getNamespaceURI(i)+"'");
l = reader.getAttributeCount();
for (int i = 0; i < l; i++)
System.out.println("\tattribute "+reader.getAttributeQName(i)+
System.out.println("\tattribute "+reader.getAttributeName(i)+
"='"+reader.getAttributeValue(i)+"'");
break;
case XMLStreamConstants.END_ELEMENT:
@@ -4314,10 +4323,10 @@ public class XMLParser
System.out.println("PROCESSING_INSTRUCTION "+reader.getPITarget()+
" "+reader.getPIData());
break;
case XMLStreamConstants.START_ENTITY:
case START_ENTITY:
System.out.println("START_ENTITY "+reader.getText());
break;
case XMLStreamConstants.END_ENTITY:
case END_ENTITY:
System.out.println("END_ENTITY "+reader.getText());
break;
default:
@@ -4330,7 +4339,7 @@ public class XMLParser
Location l = reader.getLocation();
System.out.println("At line "+l.getLineNumber()+
", column "+l.getColumnNumber()+
" of "+l.getLocationURI());
" of "+l.getSystemId());
throw e;
}
}
@@ -4938,19 +4947,6 @@ public class XMLParser
}
/**
* Compatibility interface that can be used to resolve based on a public
* ID, not just an URL.
*/
interface XMLResolver2
extends XMLResolver
{
InputStream resolve(String publicId, String systemId)
throws XMLStreamException;
}
/**
* An XML input source.
*/
@@ -5019,7 +5015,12 @@ public class XMLParser
return line;
}
public String getLocationURI()
public String getPublicId()
{
return publicId;
}
public String getSystemId()
{
return systemId;
}
File diff suppressed because it is too large Load Diff
@@ -104,6 +104,9 @@ public class XMLStreamWriterImpl
private NamespaceSupport namespaces;
private int count = 0;
private boolean xml11;
private boolean hasXML11RestrictedChars;
/**
* Constructor.
* @see #writer
@@ -145,6 +148,9 @@ public class XMLStreamWriterImpl
{
try
{
if (!isName(localName))
throw new IllegalArgumentException("illegal Name: " + localName);
endStartElement();
namespaces.pushContext();
@@ -167,6 +173,11 @@ public class XMLStreamWriterImpl
{
try
{
if (namespaceURI != null && !isURI(namespaceURI))
throw new IllegalArgumentException("illegal URI: " + namespaceURI);
if (!isName(localName))
throw new IllegalArgumentException("illegal Name: " + localName);
endStartElement();
namespaces.pushContext();
@@ -190,7 +201,7 @@ public class XMLStreamWriterImpl
inStartElement = true;
if (!isDeclared)
{
writeNamespace(prefix, namespaceURI);
writeNamespaceImpl(prefix, namespaceURI);
}
elements.addLast(new String[] { prefix, localName });
@@ -229,6 +240,13 @@ public class XMLStreamWriterImpl
{
try
{
if (namespaceURI != null && !isURI(namespaceURI))
throw new IllegalArgumentException("illegal URI: " + namespaceURI);
if (prefix != null && !isNCName(prefix))
throw new IllegalArgumentException("illegal NCName: " + prefix);
if (!isNCName(localName))
throw new IllegalArgumentException("illegal NCName: " + localName);
endStartElement();
namespaces.pushContext();
@@ -243,7 +261,7 @@ public class XMLStreamWriterImpl
writer.write(localName);
if (prefixDefaulting && !isCurrent)
{
writeNamespace(prefix, namespaceURI);
writeNamespaceImpl(prefix, namespaceURI);
}
elements.addLast(new String[] { prefix, localName });
@@ -343,11 +361,19 @@ public class XMLStreamWriterImpl
throw new IllegalStateException();
try
{
if (!isName(localName))
throw new IllegalArgumentException("illegal Name: " + localName);
if (!isChars(value))
throw new IllegalArgumentException("illegal character: " + value);
writer.write(' ');
writer.write(localName);
writer.write('=');
writer.write('"');
writeEncoded(value, true);
if (hasXML11RestrictedChars)
writeEncodedWithRestrictedChars(value, true);
else
writeEncoded(value, true);
writer.write('"');
}
catch (IOException e)
@@ -366,11 +392,20 @@ public class XMLStreamWriterImpl
throw new IllegalStateException();
try
{
if (namespaceURI != null && !isURI(namespaceURI))
throw new IllegalArgumentException("illegal URI: " + namespaceURI);
if (prefix != null && !isNCName(prefix))
throw new IllegalArgumentException("illegal NCName: " + prefix);
if (!isNCName(localName))
throw new IllegalArgumentException("illegal NCName: " + localName);
if (!isChars(value))
throw new IllegalArgumentException("illegal character: " + value);
String currentPrefix = getPrefix(namespaceURI);
if (currentPrefix == null)
{
if (prefixDefaulting)
writeNamespace(prefix, namespaceURI);
writeNamespaceImpl(prefix, namespaceURI);
else
throw new XMLStreamException("namespace " + namespaceURI +
" is not bound");
@@ -388,7 +423,10 @@ public class XMLStreamWriterImpl
writer.write(localName);
writer.write('=');
writer.write('"');
writeEncoded(value, true);
if (hasXML11RestrictedChars)
writeEncodedWithRestrictedChars(value, true);
else
writeEncoded(value, true);
writer.write('"');
}
catch (IOException e)
@@ -407,13 +445,20 @@ public class XMLStreamWriterImpl
throw new IllegalStateException();
try
{
if (namespaceURI != null && !isURI(namespaceURI))
throw new IllegalArgumentException("illegal URI: " + namespaceURI);
if (!isName(localName))
throw new IllegalArgumentException("illegal Name: " + localName);
if (!isChars(value))
throw new IllegalArgumentException("illegal character: " + value);
String prefix = getPrefix(namespaceURI);
if (prefix == null)
{
if (prefixDefaulting)
{
prefix = XMLConstants.DEFAULT_NS_PREFIX;
writeNamespace(prefix, namespaceURI);
writeNamespaceImpl(prefix, namespaceURI);
}
else
throw new XMLStreamException("namespace " + namespaceURI +
@@ -428,7 +473,10 @@ public class XMLStreamWriterImpl
writer.write(localName);
writer.write('=');
writer.write('"');
writeEncoded(value, true);
if (hasXML11RestrictedChars)
writeEncodedWithRestrictedChars(value, true);
else
writeEncoded(value, true);
writer.write('"');
}
catch (IOException e)
@@ -444,6 +492,25 @@ public class XMLStreamWriterImpl
{
if (!inStartElement)
throw new IllegalStateException();
try
{
if (!isURI(namespaceURI))
throw new IllegalArgumentException("illegal URI: " + namespaceURI);
if (!isNCName(prefix))
throw new IllegalArgumentException("illegal NCName: " + prefix);
}
catch (IOException e)
{
XMLStreamException e2 = new XMLStreamException(e);
e2.initCause(e);
throw e2;
}
writeNamespaceImpl(prefix, namespaceURI);
}
private void writeNamespaceImpl(String prefix, String namespaceURI)
throws XMLStreamException
{
try
{
if (prefix == null)
@@ -474,21 +541,41 @@ public class XMLStreamWriterImpl
public void writeDefaultNamespace(String namespaceURI)
throws XMLStreamException
{
writeNamespace(XMLConstants.DEFAULT_NS_PREFIX, namespaceURI);
if (!inStartElement)
throw new IllegalStateException();
if (!isURI(namespaceURI))
throw new IllegalArgumentException("illegal URI: " + namespaceURI);
writeNamespaceImpl(XMLConstants.DEFAULT_NS_PREFIX, namespaceURI);
}
public void writeComment(String data)
throws XMLStreamException
{
if (data == null)
return;
try
{
if (!isChars(data))
throw new IllegalArgumentException("illegal XML character: " + data);
if (data.indexOf("--") != -1)
throw new IllegalArgumentException("illegal comment: " + data);
endStartElement();
if (data != null && data.indexOf("--") != -1)
throw new IllegalArgumentException(data);
writer.write("<!--");
if (data != null)
if (hasXML11RestrictedChars)
{
int[] seq = UnicodeReader.toCodePointArray(data);
for (int i = 0; i < seq.length; i++)
{
int c = seq[i];
if (XMLParser.isXML11RestrictedChar(c))
writer.write("&#x" + Integer.toHexString(c) + ";");
else
writer.write(Character.toChars(i));
}
}
else
writer.write(data);
writer.write("-->");
}
@@ -511,6 +598,11 @@ public class XMLStreamWriterImpl
{
try
{
if (!isName(target) || "xml".equalsIgnoreCase(target))
throw new IllegalArgumentException("illegal PITarget: " + target);
if (data != null && !isChars(data))
throw new IllegalArgumentException("illegal XML character: " + data);
endStartElement();
writer.write('<');
@@ -519,7 +611,20 @@ public class XMLStreamWriterImpl
if (data != null)
{
writer.write(' ');
writer.write(data);
if (hasXML11RestrictedChars)
{
int[] seq = UnicodeReader.toCodePointArray(data);
for (int i = 0; i < seq.length; i++)
{
int c = seq[i];
if (XMLParser.isXML11RestrictedChar(c))
writer.write("&#x" + Integer.toHexString(c) + ";");
else
writer.write(Character.toChars(i));
}
}
else
writer.write(data);
}
writer.write('?');
writer.write('>');
@@ -537,10 +642,12 @@ public class XMLStreamWriterImpl
{
try
{
endStartElement();
if (!isChars(data) || hasXML11RestrictedChars)
throw new IllegalArgumentException("illegal XML character: " + data);
if (data.indexOf("]]") != -1)
throw new IllegalArgumentException(data);
throw new IllegalArgumentException("illegal CDATA section: " + data);
endStartElement();
writer.write("<![CDATA[");
writer.write(data);
@@ -557,8 +664,12 @@ public class XMLStreamWriterImpl
public void writeDTD(String dtd)
throws XMLStreamException
{
// Really thoroughly pointless method...
try
{
if (!isName(dtd))
throw new IllegalArgumentException("illegal Name: " + dtd);
writer.write("<!DOCTYPE ");
writer.write(dtd);
writer.write('>');
@@ -576,6 +687,9 @@ public class XMLStreamWriterImpl
{
try
{
if (!isName(name))
throw new IllegalArgumentException("illegal Name: " + name);
endStartElement();
writer.write('&');
@@ -607,6 +721,8 @@ public class XMLStreamWriterImpl
{
if (version == null)
version = "1.0";
else if ("1.1".equals(version))
xml11 = true;
encoding = this.encoding; // YES: the parameter must be ignored
if (encoding == null)
encoding = "UTF-8";
@@ -632,11 +748,18 @@ public class XMLStreamWriterImpl
public void writeCharacters(String text)
throws XMLStreamException
{
if (text == null)
return;
try
{
if (!isChars(text))
throw new IllegalArgumentException("illegal XML character: " + text);
endStartElement();
if (text != null)
if (hasXML11RestrictedChars)
writeEncodedWithRestrictedChars(text, false);
else
writeEncoded(text, false);
}
catch (IOException e)
@@ -650,39 +773,7 @@ public class XMLStreamWriterImpl
public void writeCharacters(char[] text, int start, int len)
throws XMLStreamException
{
try
{
endStartElement();
int end = start + len;
len = 0;
for (int i = start; i < end; i++)
{
char c = text[i];
if (c == '<' || c == '>' || c == '&')
{
writer.write(text, start, len);
if (c == '<')
writer.write("&lt;");
else if (c == '>')
writer.write("&gt;");
else
writer.write("&amp;");
start = i + 1;
len = 0;
}
else
len++;
}
if (len > 0)
writer.write(text, start, len);
}
catch (IOException e)
{
XMLStreamException e2 = new XMLStreamException(e);
e2.initCause(e);
throw e2;
}
writeCharacters(new String(text, start, len));
}
public String getPrefix(String uri)
@@ -697,6 +788,19 @@ public class XMLStreamWriterImpl
public void setPrefix(String prefix, String uri)
throws XMLStreamException
{
try
{
if (!isURI(uri))
throw new IllegalArgumentException("illegal URI: " + uri);
if (!isNCName(prefix))
throw new IllegalArgumentException("illegal NCName: " + prefix);
}
catch (IOException e)
{
XMLStreamException e2 = new XMLStreamException(e);
e2.initCause(e);
throw e2;
}
if (!namespaces.declarePrefix(prefix, uri))
throw new XMLStreamException("illegal prefix " + prefix);
}
@@ -704,6 +808,8 @@ public class XMLStreamWriterImpl
public void setDefaultNamespace(String uri)
throws XMLStreamException
{
if (!isURI(uri))
throw new IllegalArgumentException("illegal URI: " + uri);
if (!namespaces.declarePrefix(XMLConstants.DEFAULT_NS_PREFIX, uri))
throw new XMLStreamException("illegal default namespace prefix");
}
@@ -769,6 +875,131 @@ public class XMLStreamWriterImpl
if (len > 0)
writer.write(chars, start, len);
}
/**
* Writes the specified text, in the knowledge that some of the
* characters are XML 1.1 restricted characters.
*/
private void writeEncodedWithRestrictedChars(String text, boolean inAttr)
throws IOException
{
int[] seq = UnicodeReader.toCodePointArray(text);
for (int i = 0; i < seq.length; i++)
{
int c = seq[i];
switch (c)
{
case 0x3c: // '<'
writer.write("&lt;");
break;
case 0x3e: // '>'
writer.write("&gt;");
break;
case 0x26: // '&'
writer.write("&amp;");
break;
case 0x22: // '"'
if (inAttr)
writer.write("&quot;");
else
writer.write(c);
break;
case 0x27: // '\''
if (inAttr)
writer.write("&apos;");
else
writer.write(c);
break;
default:
if (XMLParser.isXML11RestrictedChar(c))
writer.write("&#x" + Integer.toHexString(c) + ";");
else
{
char[] chars = Character.toChars(c);
writer.write(chars, 0, chars.length);
}
}
}
}
private boolean isName(String text)
throws IOException
{
if (text == null)
return false;
int[] seq = UnicodeReader.toCodePointArray(text);
if (seq.length < 1)
return false;
if (!XMLParser.isNameStartCharacter(seq[0], xml11))
return false;
for (int i = 1; i < seq.length; i++)
{
if (!XMLParser.isNameCharacter(seq[i], xml11))
return false;
}
return true;
}
private boolean isNCName(String text)
throws IOException
{
if (text == null)
return false;
int[] seq = UnicodeReader.toCodePointArray(text);
if (seq.length < 1)
return false;
if (!XMLParser.isNameStartCharacter(seq[0], xml11) || seq[0] == 0x3a)
return false;
for (int i = 1; i < seq.length; i++)
{
if (!XMLParser.isNameCharacter(seq[i], xml11) || seq[i] == 0x3a)
return false;
}
return true;
}
private boolean isChars(String text)
throws IOException
{
if (text == null)
return false;
int[] seq = UnicodeReader.toCodePointArray(text);
hasXML11RestrictedChars = false;
if (xml11)
{
for (int i = 0; i < seq.length; i++)
{
if (!XMLParser.isXML11Char(seq[i]))
return false;
if (XMLParser.isXML11RestrictedChar(seq[i]))
hasXML11RestrictedChars = true;
}
}
else
{
for (int i = 0; i < seq.length; i++)
{
if (!XMLParser.isChar(seq[i]))
return false;
}
}
return true;
}
private boolean isURI(String text)
{
if (text == null)
return false;
char[] chars = text.toCharArray();
if (chars.length < 1)
return false;
for (int i = 0; i < chars.length; i++)
{
if (chars[i] < 0x20 || chars[i] >= 0x7f)
return false;
}
return true;
}
}
@@ -317,7 +317,7 @@ abstract class AbstractNumberNode
public String toString()
{
StringBuffer buf = new StringBuffer(getClass().getName());
StringBuffer buf = new StringBuffer("number");
buf.append('[');
buf.append("format=");
buf.append(format);
@@ -1,5 +1,5 @@
/* ApplyImportsNode.java --
Copyright (C) 2004 Free Software Foundation, Inc.
Copyright (C) 2004,2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -54,13 +54,9 @@ final class ApplyImportsNode
{
TemplateNode ret = new ApplyImportsNode();
if (children != null)
{
ret.children = children.clone(stylesheet);
}
ret.children = children.clone(stylesheet);
if (next != null)
{
ret.next = next.clone(stylesheet);
}
ret.next = next.clone(stylesheet);
return ret;
}
@@ -71,15 +67,16 @@ final class ApplyImportsNode
{
TemplateNode t = stylesheet.getTemplate(mode, context, true);
if (t != null)
{
t.apply(stylesheet, mode, context, pos, len,
parent, nextSibling);
}
t.apply(stylesheet, mode, context, pos, len,
parent, nextSibling);
if (next != null)
{
next.apply(stylesheet, mode, context, pos, len,
parent, nextSibling);
}
next.apply(stylesheet, mode, context, pos, len,
parent, nextSibling);
}
public String toString()
{
return "apply-imports";
}
}
@@ -1,5 +1,5 @@
/* ApplyTemplatesNode.java --
Copyright (C) 2004 Free Software Foundation, Inc.
Copyright (C) 2004,2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -76,29 +76,21 @@ final class ApplyTemplatesNode
TemplateNode clone(Stylesheet stylesheet)
{
int len = sortKeys.size();
int len = sortKeys != null ? sortKeys.size() : 0;
List sortKeys2 = new ArrayList(len);
for (int i = 0; i < len; i++)
{
sortKeys2.add(((Key) sortKeys.get(i)).clone(stylesheet));
}
sortKeys2.add(((Key) sortKeys.get(i)).clone(stylesheet));
len = withParams.size();
List withParams2 = new ArrayList(len);
for (int i = 0; i < len; i++)
{
withParams2.add(((WithParam) withParams.get(i)).clone(stylesheet));
}
withParams2.add(((WithParam) withParams.get(i)).clone(stylesheet));
TemplateNode ret = new ApplyTemplatesNode(select.clone(stylesheet),
mode, sortKeys2, withParams2,
isDefault);
if (children != null)
{
ret.children = children.clone(stylesheet);
}
ret.children = children.clone(stylesheet);
if (next != null)
{
ret.next = next.clone(stylesheet);
}
ret.next = next.clone(stylesheet);
return ret;
}
@@ -147,9 +139,7 @@ final class ApplyTemplatesNode
Collections.sort(nodes, new XSLComparator(sortKeys));
}
else
{
Collections.sort(nodes, documentOrderComparator);
}
Collections.sort(nodes, documentOrderComparator);
int l = nodes.size();
QName effectiveMode = isDefault ? mode : this.mode;
for (int i = 0; i < l; i++)
@@ -172,27 +162,21 @@ final class ApplyTemplatesNode
}
// apply-templates doesn't have processable children
if (next != null)
{
next.apply(stylesheet, mode,
context, pos, len,
parent, nextSibling);
}
next.apply(stylesheet, mode,
context, pos, len,
parent, nextSibling);
}
public boolean references(QName var)
{
if (select != null && select.references(var))
{
return true;
}
return true;
if (withParams != null)
{
for (Iterator i = withParams.iterator(); i.hasNext(); )
{
if (((WithParam) i.next()).references(var))
{
return true;
}
return true;
}
}
if (sortKeys != null)
@@ -200,9 +184,7 @@ final class ApplyTemplatesNode
for (Iterator i = sortKeys.iterator(); i.hasNext(); )
{
if (((SortKey) i.next()).references(var))
{
return true;
}
return true;
}
}
return super.references(var);
@@ -210,7 +192,7 @@ final class ApplyTemplatesNode
public String toString()
{
StringBuffer buf = new StringBuffer(getClass().getName());
StringBuffer buf = new StringBuffer("apply-templates");
buf.append('[');
boolean o = false;
if (select != null)
@@ -231,7 +231,7 @@ final class AttributeNode
public String toString()
{
StringBuffer buf = new StringBuffer(getClass().getName());
StringBuffer buf = new StringBuffer("attribute");
buf.append('[');
buf.append("name=");
buf.append(name);
@@ -1,5 +1,5 @@
/* CallTemplateNode.java --
Copyright (C) 2004 Free Software Foundation, Inc.
Copyright (C) 2004,2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -69,18 +69,12 @@ final class CallTemplateNode
int len = withParams.size();
List withParams2 = new ArrayList(len);
for (int i = 0; i < len; i++)
{
withParams2.add(((WithParam) withParams.get(i)).clone(stylesheet));
}
withParams2.add(((WithParam) withParams.get(i)).clone(stylesheet));
TemplateNode ret = new CallTemplateNode(name, withParams2);
if (children != null)
{
ret.children = children.clone(stylesheet);
}
ret.children = children.clone(stylesheet);
if (next != null)
{
ret.next = next.clone(stylesheet);
}
ret.next = next.clone(stylesheet);
return ret;
}
@@ -89,52 +83,52 @@ final class CallTemplateNode
Node parent, Node nextSibling)
throws TransformerException
{
if (withParams != null)
{
// compute the parameter values
LinkedList values = new LinkedList();
for (Iterator i = withParams.iterator(); i.hasNext(); )
{
WithParam p = (WithParam) i.next();
Object value = p.getValue(stylesheet, mode, context, pos, len);
Object[] pair = new Object[2];
pair[0] = p.name;
pair[1] = value;
values.add(pair);
}
// push the parameter context
stylesheet.bindings.push(Bindings.WITH_PARAM);
// set the parameters
for (Iterator i = values.iterator(); i.hasNext(); )
{
Object[] pair = (Object[]) i.next();
QName name = (QName) pair[0];
Object value = pair[1];
stylesheet.bindings.set(name, value, Bindings.WITH_PARAM);
if (stylesheet.debug)
{
System.err.println("with-param: " + name + " = " + value);
}
}
}
TemplateNode t = stylesheet.getTemplate(mode, name);
if (t != null)
{
if (withParams != null)
{
// compute the parameter values
LinkedList values = new LinkedList();
for (Iterator i = withParams.iterator(); i.hasNext(); )
{
WithParam p = (WithParam) i.next();
if (t.hasParam(p.name)) // ignore parameters not specified
{
Object value = p.getValue(stylesheet, mode, context,
pos, len);
Object[] pair = new Object[2];
pair[0] = p.name;
pair[1] = value;
values.add(pair);
}
}
// push the parameter context
stylesheet.bindings.push(Bindings.WITH_PARAM);
// set the parameters
for (Iterator i = values.iterator(); i.hasNext(); )
{
Object[] pair = (Object[]) i.next();
QName name = (QName) pair[0];
Object value = pair[1];
stylesheet.bindings.set(name, value, Bindings.WITH_PARAM);
if (stylesheet.debug)
System.err.println("with-param: " + name + " = " + value);
}
}
t.apply(stylesheet, mode, context, pos, len,
parent, nextSibling);
}
if (withParams != null)
{
// pop the variable context
stylesheet.bindings.pop(Bindings.WITH_PARAM);
if (withParams != null)
{
// pop the variable context
stylesheet.bindings.pop(Bindings.WITH_PARAM);
}
}
// call-template doesn't have processable children
if (next != null)
{
next.apply(stylesheet, mode,
context, pos, len,
parent, nextSibling);
}
}
public boolean references(QName var)
@@ -144,9 +138,7 @@ final class CallTemplateNode
for (Iterator i = withParams.iterator(); i.hasNext(); )
{
if (((WithParam) i.next()).references(var))
{
return true;
}
return true;
}
}
return super.references(var);
@@ -154,7 +146,7 @@ final class CallTemplateNode
public String toString()
{
StringBuffer buf = new StringBuffer(getClass().getName());
StringBuffer buf = new StringBuffer("call-template");
buf.append('[');
buf.append("name=");
buf.append(name);
@@ -1,5 +1,5 @@
/* ChooseNode.java --
Copyright (C) 2004 Free Software Foundation, Inc.
Copyright (C) 2004,2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -54,13 +54,9 @@ final class ChooseNode
{
TemplateNode ret = new ChooseNode();
if (children != null)
{
ret.children = children.clone(stylesheet);
}
ret.children = children.clone(stylesheet);
if (next != null)
{
ret.next = next.clone(stylesheet);
}
ret.next = next.clone(stylesheet);
return ret;
}
@@ -70,22 +66,18 @@ final class ChooseNode
throws TransformerException
{
if (children != null)
{
children.apply(stylesheet, mode,
context, pos, len,
parent, nextSibling);
}
children.apply(stylesheet, mode,
context, pos, len,
parent, nextSibling);
if (next != null)
{
next.apply(stylesheet, mode,
context, pos, len,
parent, nextSibling);
}
next.apply(stylesheet, mode,
context, pos, len,
parent, nextSibling);
}
public String toString()
{
StringBuffer buf = new StringBuffer(getClass().getName());
StringBuffer buf = new StringBuffer("choose");
buf.append('[');
buf.append(']');
return buf.toString();
@@ -1,5 +1,5 @@
/* CommentNode.java --
Copyright (C) 2004 Free Software Foundation, Inc.
Copyright (C) 2004,2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -58,13 +58,9 @@ final class CommentNode
{
TemplateNode ret = new CommentNode();
if (children != null)
{
ret.children = children.clone(stylesheet);
}
ret.children = children.clone(stylesheet);
if (next != null)
{
ret.next = next.clone(stylesheet);
}
ret.next = next.clone(stylesheet);
return ret;
}
@@ -90,27 +86,18 @@ final class CommentNode
Comment comment = doc.createComment(value);
// Insert into result tree
if (nextSibling != null)
{
parent.insertBefore(comment, nextSibling);
}
parent.insertBefore(comment, nextSibling);
else
{
parent.appendChild(comment);
}
parent.appendChild(comment);
if (next != null)
{
next.apply(stylesheet, mode,
context, pos, len,
parent, nextSibling);
}
next.apply(stylesheet, mode,
context, pos, len,
parent, nextSibling);
}
public String toString()
{
StringBuffer buf = new StringBuffer(getClass().getName());
buf.append('[');
buf.append(']');
return buf.toString();
return "comment";
}
}
@@ -1,5 +1,5 @@
/* CopyNode.java --
Copyright (C) 2004 Free Software Foundation, Inc.
Copyright (C) 2004,2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -65,13 +65,9 @@ final class CopyNode
{
TemplateNode ret = new CopyNode(uas);
if (children != null)
{
ret.children = children.clone(stylesheet);
}
ret.children = children.clone(stylesheet);
if (next != null)
{
ret.next = next.clone(stylesheet);
}
ret.next = next.clone(stylesheet);
return ret;
}
@@ -102,44 +98,32 @@ final class CopyNode
{
NamedNodeMap attrs = parent.getAttributes();
if (attrs != null)
{
attrs.setNamedItemNS(copy);
}
attrs.setNamedItemNS(copy);
}
}
else
{
if (nextSibling != null)
{
parent.insertBefore(copy, nextSibling);
}
parent.insertBefore(copy, nextSibling);
else
{
parent.appendChild(copy);
}
parent.appendChild(copy);
}
}
if (uas != null)
{
StringTokenizer st = new StringTokenizer(uas, " ");
while (st.hasMoreTokens())
{
addAttributeSet(stylesheet, mode, context, pos, len,
copy, null, st.nextToken());
}
addAttributeSet(stylesheet, mode, context, pos, len,
copy, null, st.nextToken());
}
if (children != null)
{
children.apply(stylesheet, mode,
context, pos, len,
copy, null);
}
children.apply(stylesheet, mode,
context, pos, len,
copy, null);
if (next != null)
{
next.apply(stylesheet, mode,
context, pos, len,
parent, nextSibling);
}
next.apply(stylesheet, mode,
context, pos, len,
parent, nextSibling);
}
void addAttributeSet(Stylesheet stylesheet, QName mode,
@@ -151,32 +135,31 @@ final class CopyNode
{
AttributeSet as = (AttributeSet) i.next();
if (!as.name.equals(attributeSet))
{
continue;
}
continue;
if (as.uas != null)
{
StringTokenizer st = new StringTokenizer(as.uas, " ");
while (st.hasMoreTokens())
{
addAttributeSet(stylesheet, mode, context, pos, len,
parent, nextSibling, st.nextToken());
}
addAttributeSet(stylesheet, mode, context, pos, len,
parent, nextSibling, st.nextToken());
}
if (as.children != null)
{
as.children.apply(stylesheet, mode,
context, pos, len,
parent, nextSibling);
}
as.children.apply(stylesheet, mode,
context, pos, len,
parent, nextSibling);
}
}
public String toString()
{
StringBuffer buf = new StringBuffer(getClass().getName());
buf.append('[');
buf.append(']');
StringBuffer buf = new StringBuffer("copy");
if (uas != null)
{
buf.append('[');
buf.append("uas=");
buf.append(uas);
buf.append(']');
}
return buf.toString();
}
@@ -1,5 +1,5 @@
/* CopyOfNode.java --
Copyright (C) 2004 Free Software Foundation, Inc.
Copyright (C) 2004,2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -70,13 +70,9 @@ final class CopyOfNode
{
TemplateNode ret = new CopyOfNode(select.clone(stylesheet));
if (children != null)
{
ret.children = children.clone(stylesheet);
}
ret.children = children.clone(stylesheet);
if (next != null)
{
ret.next = next.clone(stylesheet);
}
ret.next = next.clone(stylesheet);
return ret;
}
@@ -102,9 +98,7 @@ final class CopyOfNode
// Use document element
src = ((Document) src).getDocumentElement();
if (src == null)
{
continue;
}
continue;
nodeType = Node.ELEMENT_NODE;
}
else if (nodeType == Node.ATTRIBUTE_NODE)
@@ -128,20 +122,14 @@ final class CopyOfNode
{
NamedNodeMap attrs = parent.getAttributes();
if (attrs != null)
{
attrs.setNamedItemNS(node);
}
attrs.setNamedItemNS(node);
}
else
{
if (nextSibling != null)
{
parent.insertBefore(node, nextSibling);
}
parent.insertBefore(node, nextSibling);
else
{
parent.appendChild(node);
}
parent.appendChild(node);
}
}
}
@@ -152,36 +140,28 @@ final class CopyOfNode
{
Text textNode = doc.createTextNode(value);
if (nextSibling != null)
{
parent.insertBefore(textNode, nextSibling);
}
parent.insertBefore(textNode, nextSibling);
else
{
parent.appendChild(textNode);
}
parent.appendChild(textNode);
}
}
// copy-of doesn't process children
if (next != null)
{
next.apply(stylesheet, mode,
context, pos, len,
parent, nextSibling);
}
next.apply(stylesheet, mode,
context, pos, len,
parent, nextSibling);
}
public boolean references(QName var)
{
if (select != null && select.references(var))
{
return true;
}
return true;
return super.references(var);
}
public String toString()
{
StringBuffer buf = new StringBuffer(getClass().getName());
StringBuffer buf = new StringBuffer("copy-of");
buf.append('[');
buf.append("select=");
buf.append(select);
@@ -126,9 +126,7 @@ final class DocumentFunction
Object arg1 = values.get(0);
Object arg2 = values.get(1);
if (!(arg2 instanceof Collection))
{
throw new RuntimeException("second argument is not a node-set");
}
throw new RuntimeException("second argument is not a node-set");
Collection arg2ns = (Collection) arg2;
String base2 = arg2ns.isEmpty() ? null :
((Node) arg2ns.iterator().next()).getBaseURI();
@@ -166,9 +164,7 @@ final class DocumentFunction
Collection document(String uri, String base)
{
if ("".equals(uri) || uri == null)
{
uri = this.base.getBaseURI();
}
uri = this.base.getBaseURI();
// Get fragment
Expr fragment = null;
@@ -197,10 +193,10 @@ final class DocumentFunction
source = resolver.resolveDOM(null, base, uri);
}
Node node = source.getNode();
// Strip whitespace
TransformerImpl.strip(stylesheet, node);
if (fragment == null)
{
return Collections.singleton(node);
}
return Collections.singleton(node);
else
{
Object ret = fragment.evaluate(node, 1, 1);
@@ -216,9 +212,7 @@ final class DocumentFunction
{
String msg = "can't open " + uri;
if (base != null)
{
msg += " with base " + base;
}
msg += " with base " + base;
throw new RuntimeException(msg);
}
}
@@ -227,16 +221,12 @@ final class DocumentFunction
{
Stylesheet s = stylesheet;
if (context instanceof Stylesheet)
{
s = (Stylesheet) context;
}
s = (Stylesheet) context;
DocumentFunction f = new DocumentFunction(s, base);
int len = args.size();
List args2 = new ArrayList(len);
for (int i = 0; i < len; i++)
{
args2.add(((Expr) args.get(i)).clone(context));
}
args2.add(((Expr) args.get(i)).clone(context));
f.setArguments(args2);
return f;
}
@@ -246,9 +236,7 @@ final class DocumentFunction
for (Iterator i = args.iterator(); i.hasNext(); )
{
if (((Expr) i.next()).references(var))
{
return true;
}
return true;
}
return false;
}
@@ -1,5 +1,5 @@
/* ElementNode.java --
Copyright (C) 2004 Free Software Foundation, Inc.
Copyright (C) 2004,2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -238,7 +238,7 @@ final class ElementNode
public String toString()
{
StringBuffer buf = new StringBuffer(getClass().getName());
StringBuffer buf = new StringBuffer("element");
buf.append('[');
buf.append("name=");
if (namespace != null)
@@ -1,5 +1,5 @@
/* ForEachNode.java --
Copyright (C) 2004 Free Software Foundation, Inc.
Copyright (C) 2004,2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -70,19 +70,13 @@ final class ForEachNode
int len = sortKeys.size();
List sortKeys2 = new ArrayList(len);
for (int i = 0; i < len; i++)
{
sortKeys2.add(((Key) sortKeys.get(i)).clone(stylesheet));
}
sortKeys2.add(((Key) sortKeys.get(i)).clone(stylesheet));
TemplateNode ret = new ForEachNode(select.clone(stylesheet),
sortKeys2);
if (children != null)
{
ret.children = children.clone(stylesheet);
}
ret.children = children.clone(stylesheet);
if (next != null)
{
ret.next = next.clone(stylesheet);
}
ret.next = next.clone(stylesheet);
return ret;
}
@@ -113,9 +107,7 @@ final class ForEachNode
Collections.sort(list, new XSLComparator(sortKeys));
}
else
{
Collections.sort(list, documentOrderComparator);
}
Collections.sort(list, documentOrderComparator);
// Perform children for each node
int l = list.size();
int p = 1;
@@ -132,27 +124,21 @@ final class ForEachNode
stylesheet.currentTemplate = saved;
}
if (next != null)
{
next.apply(stylesheet, mode,
context, pos, len,
parent, nextSibling);
}
next.apply(stylesheet, mode,
context, pos, len,
parent, nextSibling);
}
public boolean references(QName var)
{
if (select != null && select.references(var))
{
return true;
}
return true;
if (sortKeys != null)
{
for (Iterator i = sortKeys.iterator(); i.hasNext(); )
{
if (((SortKey) i.next()).references(var))
{
return true;
}
return true;
}
}
return super.references(var);
@@ -160,7 +146,7 @@ final class ForEachNode
public String toString()
{
StringBuffer buf = new StringBuffer(getClass().getName());
StringBuffer buf = new StringBuffer("for-each");
buf.append('[');
buf.append("select=");
buf.append(select);
+13 -23
View File
@@ -1,5 +1,5 @@
/* IfNode.java --
Copyright (C) 2004 Free Software Foundation, Inc.
Copyright (C) 2004,2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -62,19 +62,15 @@ final class IfNode
{
TemplateNode ret = new IfNode(test.clone(stylesheet));
if (children != null)
{
ret.children = children.clone(stylesheet);
}
ret.children = children.clone(stylesheet);
if (next != null)
{
ret.next = next.clone(stylesheet);
}
ret.next = next.clone(stylesheet);
return ret;
}
void doApply(Stylesheet stylesheet, QName mode,
Node context, int pos, int len,
Node parent, Node nextSibling)
Node context, int pos, int len,
Node parent, Node nextSibling)
throws TransformerException
{
Object ret = test.evaluate(context, pos, len);
@@ -84,32 +80,26 @@ final class IfNode
if (success)
{
if (children != null)
{
children.apply(stylesheet, mode,
context, pos, len,
parent, nextSibling);
}
children.apply(stylesheet, mode,
context, pos, len,
parent, nextSibling);
}
if (next != null)
{
next.apply(stylesheet, mode,
context, pos, len,
parent, nextSibling);
}
next.apply(stylesheet, mode,
context, pos, len,
parent, nextSibling);
}
public boolean references(QName var)
{
if (test != null && test.references(var))
{
return true;
}
return true;
return super.references(var);
}
public String toString()
{
StringBuffer buf = new StringBuffer(getClass().getName());
StringBuffer buf = new StringBuffer("if");
buf.append('[');
buf.append("test=");
buf.append(test);
@@ -196,12 +196,7 @@ final class LiteralNode
public String toString()
{
StringBuffer buf = new StringBuffer(getClass().getName());
buf.append('[');
buf.append("source=");
buf.append(source);
buf.append(']');
return buf.toString();
return source.toString();
}
}
@@ -92,5 +92,17 @@ final class MessageNode
if (next != null && !terminate)
next.apply(stylesheet, mode, context, pos, len, parent, nextSibling);
}
public String toString()
{
StringBuffer buf = new StringBuffer("message");
if (terminate)
{
buf.append('[');
buf.append("terminate");
buf.append(']');
}
return buf.toString();
}
}
@@ -1,5 +1,5 @@
/* OtherwiseNode.java --
Copyright (C) 2004 Free Software Foundation, Inc.
Copyright (C) 2004,2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -54,13 +54,9 @@ final class OtherwiseNode
{
TemplateNode ret = new OtherwiseNode();
if (children != null)
{
ret.children = children.clone(stylesheet);
}
ret.children = children.clone(stylesheet);
if (next != null)
{
ret.next = next.clone(stylesheet);
}
ret.next = next.clone(stylesheet);
return ret;
}
@@ -70,25 +66,18 @@ final class OtherwiseNode
throws TransformerException
{
if (children != null)
{
children.apply(stylesheet, mode,
context, pos, len,
parent, nextSibling);
}
children.apply(stylesheet, mode,
context, pos, len,
parent, nextSibling);
if (next != null)
{
next.apply(stylesheet, mode,
context, pos, len,
parent, nextSibling);
}
next.apply(stylesheet, mode,
context, pos, len,
parent, nextSibling);
}
public String toString()
{
StringBuffer buf = new StringBuffer(getClass().getName());
buf.append('[');
buf.append(']');
return buf.toString();
return "otherwise";
}
}
@@ -1,5 +1,5 @@
/* ParameterNode.java --
Copyright (C) 2004 Free Software Foundation, Inc.
Copyright (C) 2004,2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -73,13 +73,9 @@ final class ParameterNode
select.clone(stylesheet),
type);
if (children != null)
{
ret.children = children.clone(stylesheet);
}
ret.children = children.clone(stylesheet);
if (next != null)
{
ret.next = next.clone(stylesheet);
}
ret.next = next.clone(stylesheet);
return ret;
}
@@ -96,18 +92,14 @@ final class ParameterNode
{
stylesheet.bindings.set(name, value, type);
if (stylesheet.debug)
{
System.err.println(this + ": set to " + value);
}
System.err.println(this + ": set to " + value);
}
// variable and param don't process children as such
// all subsequent instructions are processed with that variable context
if (next != null)
{
next.apply(stylesheet, mode,
context, pos, len,
parent, nextSibling);
}
next.apply(stylesheet, mode,
context, pos, len,
parent, nextSibling);
// pop the variable context
stylesheet.bindings.pop(type);
}
@@ -117,9 +109,7 @@ final class ParameterNode
throws TransformerException
{
if (select != null)
{
return select.evaluate(context, pos, len);
}
return select.evaluate(context, pos, len);
else if (children != null)
{
Document doc = (context instanceof Document) ? (Document) context :
@@ -129,17 +119,13 @@ final class ParameterNode
return Collections.singleton(fragment);
}
else
{
return null;
}
return null;
}
public boolean references(QName var)
{
if (select != null && select.references(var))
{
return true;
}
return true;
return super.references(var);
}
@@ -151,33 +137,18 @@ final class ParameterNode
boolean r1 = references(pn.name);
boolean r2 = pn.references(name);
if (r1 && r2)
{
throw new IllegalArgumentException("circular definitions");
}
throw new IllegalArgumentException("circular definitions");
if (r1)
{
return 1;
}
return 1;
if (r2)
{
return -1;
}
return -1;
}
return 0;
}
public String toString()
{
StringBuffer buf = new StringBuffer(getClass().getName());
buf.append('[');
buf.append("name=");
buf.append(name);
if (select != null)
{
buf.append(",select=");
buf.append(select);
}
buf.append(",type=");
StringBuffer buf = new StringBuffer();
switch (type)
{
case Bindings.VARIABLE:
@@ -190,6 +161,14 @@ final class ParameterNode
buf.append("with-param");
break;
}
buf.append('[');
buf.append("name=");
buf.append(name);
if (select != null)
{
buf.append(",select=");
buf.append(select);
}
buf.append(']');
return buf.toString();
}
@@ -1,5 +1,5 @@
/* ProcessingInstructionNode.java --
Copyright (C) 2004 Free Software Foundation, Inc.
Copyright (C) 2004,2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -66,19 +66,15 @@ final class ProcessingInstructionNode
{
TemplateNode ret = new ProcessingInstructionNode(name);
if (children != null)
{
ret.children = children.clone(stylesheet);
}
ret.children = children.clone(stylesheet);
if (next != null)
{
ret.next = next.clone(stylesheet);
}
ret.next = next.clone(stylesheet);
return ret;
}
void doApply(Stylesheet stylesheet, QName mode,
Node context, int pos, int len,
Node parent, Node nextSibling)
Node context, int pos, int len,
Node parent, Node nextSibling)
throws TransformerException
{
String data = null;
@@ -98,24 +94,18 @@ final class ProcessingInstructionNode
ProcessingInstruction pi = doc.createProcessingInstruction(name, data);
// Insert into result tree
if (nextSibling != null)
{
parent.insertBefore(pi, nextSibling);
}
parent.insertBefore(pi, nextSibling);
else
{
parent.appendChild(pi);
}
parent.appendChild(pi);
if (next != null)
{
next.apply(stylesheet, mode,
context, pos, len,
parent, nextSibling);
}
next.apply(stylesheet, mode,
context, pos, len,
parent, nextSibling);
}
public String toString()
{
StringBuffer buf = new StringBuffer(getClass().getName());
StringBuffer buf = new StringBuffer("processing-instruction");
buf.append('[');
buf.append("name=");
buf.append(name);
@@ -408,7 +408,7 @@ class Stylesheet
{
if (debug)
System.err.println("getTemplate: mode="+mode+" context="+context);
Set candidates = new TreeSet();
Template selected = null;
for (Iterator j = templates.iterator(); j.hasNext(); )
{
Template t = (Template) j.next();
@@ -426,10 +426,21 @@ class Stylesheet
}
//System.err.println("\t"+context+" "+t+"="+isMatch);
if (isMatch)
candidates.add(t);
{
// Conflict resolution
// @see http://www.w3.org/TR/xslt#conflict
if (selected == null)
selected = t;
else
{
if (t.precedence < selected.precedence ||
t.priority < selected.priority)
continue;
selected = t;
}
}
}
//System.err.println("\tcandidates="+candidates);
if (candidates.isEmpty())
if (selected == null)
{
// Apply built-in template
// Current template is unchanged
@@ -451,32 +462,39 @@ class Stylesheet
return null;
}
}
else
{
Template t = (Template) candidates.iterator().next();
// Set current template
currentTemplate = t;
if (debug)
System.err.println("\ttemplate="+t+" context="+context);
return t.node;
}
// Set current template
currentTemplate = selected;
if (debug)
System.err.println("\ttemplate="+currentTemplate+" context="+context);
return currentTemplate.node;
}
TemplateNode getTemplate(QName mode, QName name)
throws TransformerException
{
Set candidates = new TreeSet();
Template selected = null;
for (Iterator j = templates.iterator(); j.hasNext(); )
{
Template t = (Template) j.next();
boolean isMatch = t.matches(name);
if (isMatch)
candidates.add(t);
{
// Conflict resolution
// @see http://www.w3.org/TR/xslt#conflict
if (selected == null)
selected = t;
else
{
if (t.precedence < selected.precedence ||
t.priority < selected.priority)
continue;
selected = t;
}
}
}
if (candidates.isEmpty())
if (selected == null)
return null;
Template t = (Template) candidates.iterator().next();
return t.node;
return selected.node;
}
/**
@@ -504,11 +522,9 @@ class Stylesheet
String p = getAttribute(attrs, "priority");
String mm = getAttribute(attrs, "mode");
QName mode = (mm == null) ? null : getQName(mm);
double priority = (p == null) ? Template.DEFAULT_PRIORITY :
Double.parseDouble(p);
Node children = node.getFirstChild();
return new Template(this, name, match, parse(children),
precedence, priority, mode);
precedence, p, mode);
}
/**
@@ -799,7 +815,7 @@ class Stylesheet
templates.add(new Template(this, null, new Root(),
parse(rootClone),
precedence,
Template.DEFAULT_PRIORITY,
null,
null));
}
else
@@ -1,5 +1,5 @@
/* Template.java --
Copyright (C) 2004 Free Software Foundation, Inc.
Copyright (C) 2004,2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -66,51 +66,77 @@ class Template
final double priority;
final int precedence;
final QName mode;
final boolean isAnyNode; // is the match simply "node()"?
Template(Stylesheet stylesheet,
QName name, Pattern match, TemplateNode node,
int precedence, double priority, QName mode)
int precedence, String priorityAttr, QName mode)
{
this.stylesheet = stylesheet;
this.name = name;
this.match = match;
this.node = node;
// adjust priority if necessary
// see XSLT section 5.5
Test test = getNodeTest(match);
if (test != null)
this.precedence = precedence;
this.mode = mode;
double p = DEFAULT_PRIORITY;
boolean a = false;
if (priorityAttr != null)
p = Double.parseDouble(priorityAttr);
else
{
if (test instanceof NameTest)
// adjust priority if necessary
// see XSLT section 5.5
if (match instanceof Selector)
{
NameTest nameTest = (NameTest) test;
if (nameTest.matchesAny() ||
nameTest.matchesAnyLocalName())
Selector selector = (Selector) match;
Test[] tests = selector.getTests();
if (tests.length > 0)
{
priority = -0.25d;
}
else
{
priority = 0.0d;
}
}
else
{
NodeTypeTest nodeTypeTest = (NodeTypeTest) test;
if (nodeTypeTest.getNodeType() ==
Node.PROCESSING_INSTRUCTION_NODE &&
nodeTypeTest.getData() != null)
{
priority = 0.0d;
}
else
{
priority = -0.5d;
Test test = tests[0];
if (test instanceof NameTest)
{
NameTest nameTest = (NameTest) test;
if (nameTest.matchesAny())
p = -0.25d;
else if (nameTest.matchesAnyLocalName())
p = -0.20d;
else
p = 0.0d;
}
else
{
NodeTypeTest nodeTypeTest = (NodeTypeTest) test;
if (nodeTypeTest.getNodeType() ==
Node.PROCESSING_INSTRUCTION_NODE &&
nodeTypeTest.getData() != null)
p = 0.0d;
else
p = -0.5d;
a = (nodeTypeTest.getNodeType() == 0);
}
// Add a small difference for predicates
if (tests.length > 1)
p += ((double) tests.length - 1) * 0.001;
}
}
}
this.priority = p;
this.isAnyNode = a;
}
private Template(Stylesheet stylesheet,
QName name, Pattern match, TemplateNode node,
int precedence, double priority, QName mode, boolean isAnyNode)
{
this.stylesheet = stylesheet;
this.name = name;
this.match = match;
this.node = node;
this.precedence = precedence;
this.priority = priority;
this.mode = mode;
this.isAnyNode = isAnyNode;
}
Template clone(Stylesheet stylesheet)
@@ -124,7 +150,8 @@ class Template
(node == null) ? null : node.clone(stylesheet),
precedence,
priority,
mode);
mode,
isAnyNode);
}
public int compareTo(Object other)
@@ -134,29 +161,16 @@ class Template
Template t = (Template) other;
int d = t.precedence - precedence;
if (d != 0)
{
return d;
}
return d;
double d2 = t.priority - priority;
if (d2 != 0.0d)
{
return (int) Math.round(d2 * 1000.0d);
}
return (int) Math.round(d2 * 1000.0d);
}
return 0;
}
Test getNodeTest(Expr expr)
{
if (expr instanceof Selector)
{
Selector selector = (Selector) expr;
Test[] tests = selector.getTests();
if (tests.length > 0)
{
return tests[0];
}
}
return null;
}
@@ -164,13 +178,11 @@ class Template
{
if ((mode == null && this.mode != null) ||
(mode != null && !mode.equals(this.mode)))
{
return false;
}
return false;
if (match == null)
{
return false;
}
return false;
if (isAnyNode && node.getNodeType() == Node.DOCUMENT_NODE)
return false; // don't match document node
return match.matches(node);
}
@@ -186,9 +198,7 @@ class Template
ctx = ctx.parent)
{
if (ctx == stylesheet)
{
return true;
}
return true;
}
return false;
}
@@ -206,13 +216,12 @@ class Template
Node parent, Node nextSibling)
throws TransformerException
{
System.err.println("...applying " + toString() + " to " + context);
if (stylesheet.debug)
System.err.println("...applying " + toString() + " to " + context);
if (node != null)
{
node.apply(stylesheet, mode,
context, pos, len,
parent, nextSibling);
}
node.apply(stylesheet, mode,
context, pos, len,
parent, nextSibling);
}
public String toString()
@@ -244,9 +253,7 @@ class Template
{
out.println(toString());
if (node != null)
{
node.list(1, out, true);
}
node.list(1, out, true);
}
}
@@ -64,9 +64,7 @@ abstract class TemplateNode
throws TransformerException
{
if (stylesheet.terminated)
{
return;
}
return;
if (Thread.currentThread().isInterrupted())
{
// Try to head off any infinite loops at the pass
@@ -91,13 +89,9 @@ abstract class TemplateNode
public boolean references(QName var)
{
if (children != null && children.references(var))
{
return true;
}
return true;
if (next != null && next.references(var))
{
return true;
}
return true;
return false;
}
@@ -107,18 +101,30 @@ abstract class TemplateNode
void list(int depth, PrintStream out, boolean listNext)
{
for (int i = 0; i < depth; i++)
{
out.print(" ");
}
out.print(" ");
out.println(toString());
if (children != null)
{
children.list(depth + 1, out, true);
}
children.list(depth + 1, out, true);
if (listNext && next != null)
next.list(depth, out, listNext);
}
/**
* Indicates whether the template for which this template node is the
* first node specifies the given parameter.
*/
boolean hasParam(QName name)
{
for (TemplateNode ctx = this; ctx != null; ctx = ctx.next)
{
next.list(depth, out, listNext);
if (ctx instanceof ParameterNode)
{
ParameterNode param = (ParameterNode) ctx;
if (param.type == Bindings.PARAM && param.name.equals(name))
return true;
}
}
return false;
}
}
@@ -1,5 +1,5 @@
/* TextNode.java --
Copyright (C) 2004 Free Software Foundation, Inc.
Copyright (C) 2004,2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -65,19 +65,15 @@ final class TextNode
{
TemplateNode ret = new TextNode(disableOutputEscaping);
if (children != null)
{
ret.children = children.clone(stylesheet);
}
ret.children = children.clone(stylesheet);
if (next != null)
{
ret.next = next.clone(stylesheet);
}
ret.next = next.clone(stylesheet);
return ret;
}
void doApply(Stylesheet stylesheet, QName mode,
Node context, int pos, int len,
Node parent, Node nextSibling)
Node context, int pos, int len,
Node parent, Node nextSibling)
throws TransformerException
{
String value = "";
@@ -96,24 +92,28 @@ final class TextNode
}
Text text = doc.createTextNode(value);
if (disableOutputEscaping)
{
text.setUserData("disable-output-escaping", "yes", stylesheet);
}
text.setUserData("disable-output-escaping", "yes", stylesheet);
// Insert into result tree
if (nextSibling != null)
{
parent.insertBefore(text, nextSibling);
}
parent.insertBefore(text, nextSibling);
else
{
parent.appendChild(text);
}
parent.appendChild(text);
if (next != null)
next.apply(stylesheet, mode,
context, pos, len,
parent, nextSibling);
}
public String toString()
{
StringBuffer buf = new StringBuffer("text");
if (disableOutputEscaping)
{
next.apply(stylesheet, mode,
context, pos, len,
parent, nextSibling);
buf.append('[');
buf.append("disable-output-escaping");
buf.append(']');
}
return buf.toString();
}
}
@@ -162,7 +162,7 @@ class TransformerImpl
}
// Make a copy of the source node, and strip it
context = context.cloneNode(true);
strip(context);
strip(stylesheet, context);
// XSLT transformation
try
{
@@ -321,7 +321,7 @@ class TransformerImpl
if (indent)
{
parent.normalize();
strip(parent);
strip(stylesheet, parent);
Document resultDoc = (parent instanceof Document) ?
(Document) parent :
parent.getOwnerDocument();
@@ -393,7 +393,7 @@ class TransformerImpl
/**
* Strip whitespace from the source tree.
*/
boolean strip(Node node)
static boolean strip(Stylesheet stylesheet, Node node)
throws TransformerConfigurationException
{
short nt = node.getNodeType();
@@ -444,7 +444,7 @@ class TransformerImpl
Node child = node.getFirstChild();
while (child != null)
{
boolean remove = strip(child);
boolean remove = strip(stylesheet, child);
Node next = child.getNextSibling();
if (remove)
node.removeChild(child);
@@ -691,7 +691,7 @@ class TransformerImpl
for (Iterator i = children.iterator(); i.hasNext(); )
{
ctx = (Node) i.next();
reindent(doc, ctx, offset + 1);
reindent(doc, ctx, offset);
}
}
else
@@ -709,9 +709,9 @@ class TransformerImpl
}
buf = new StringBuffer();
buf.append('\n');
ws = buf.toString();
for (int i = 0; i < offset; i++)
buf.append(INDENT_WHITESPACE);
ws = buf.toString();
node.appendChild(doc.createTextNode(ws));
}
}
@@ -126,7 +126,7 @@ final class ValueOfNode
public String toString()
{
StringBuffer buf = new StringBuffer(getClass().getName());
StringBuffer buf = new StringBuffer("value-of");
buf.append('[');
buf.append("select=");
buf.append(select);
@@ -1,5 +1,5 @@
/* WhenNode.java --
Copyright (C) 2004 Free Software Foundation, Inc.
Copyright (C) 2004,2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -62,19 +62,15 @@ final class WhenNode
{
TemplateNode ret = new WhenNode(test.clone(stylesheet));
if (children != null)
{
ret.children = children.clone(stylesheet);
}
ret.children = children.clone(stylesheet);
if (next != null)
{
ret.next = next.clone(stylesheet);
}
ret.next = next.clone(stylesheet);
return ret;
}
void doApply(Stylesheet stylesheet, QName mode,
Node context, int pos, int len,
Node parent, Node nextSibling)
Node context, int pos, int len,
Node parent, Node nextSibling)
throws TransformerException
{
Object ret = test.evaluate(context, pos, len);
@@ -84,35 +80,29 @@ final class WhenNode
if (success)
{
if (children != null)
{
children.apply(stylesheet, mode,
context, pos, len,
parent, nextSibling);
}
children.apply(stylesheet, mode,
context, pos, len,
parent, nextSibling);
}
else
{
if (next != null)
{
next.apply(stylesheet, mode,
context, pos, len,
parent, nextSibling);
}
next.apply(stylesheet, mode,
context, pos, len,
parent, nextSibling);
}
}
public boolean references(QName var)
{
if (test != null && test.references(var))
{
return true;
}
return true;
return super.references(var);
}
public String toString()
{
StringBuffer buf = new StringBuffer(getClass().getName());
StringBuffer buf = new StringBuffer("when");
buf.append('[');
buf.append("test=");
buf.append(test);
@@ -55,6 +55,8 @@ import java.io.Writer;
* data loss.
*
* @author David Brownell
*
* @deprecated Please use the javax.xml.stream APIs instead
*/
public class XHTMLWriter extends XMLWriter
{
@@ -102,6 +102,8 @@ import org.xml.sax.helpers.*;
* @see gnu.xml.pipeline.TextConsumer
*
* @author David Brownell
*
* @deprecated Please use the javax.xml.stream APIs instead
*/
public class XMLWriter
implements ContentHandler, LexicalHandler, DTDHandler, DeclHandler
@@ -0,0 +1,61 @@
/* Annotation.java --
Copyright (C) 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
GNU Classpath is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING. If not, write to the
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 USA.
Linking this library statically or dynamically with other modules is
making a combined work based on this library. Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.
As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module. An independent module is a module which is not derived from
or based on this library. If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
package gnu.xml.validation.datatype;
/**
* A schema component annotation.
*
* @author <a href='mailto:dog@gnu.org'>Chris Burdess</a>
*/
public class Annotation
{
public final String documentation;
public Annotation(String documentation)
{
this.documentation = documentation;
}
public String toString()
{
return documentation;
}
}
@@ -0,0 +1,59 @@
/* AnySimpleType.java --
Copyright (C) 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
GNU Classpath is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING. If not, write to the
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 USA.
Linking this library statically or dynamically with other modules is
making a combined work based on this library. Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.
As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module. An independent module is a module which is not derived from
or based on this library. If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
package gnu.xml.validation.datatype;
import java.util.Set;
import javax.xml.XMLConstants;
import javax.xml.namespace.QName;
final class AnySimpleType
extends SimpleType
{
AnySimpleType()
{
super(new QName(XMLConstants.W3C_XML_SCHEMA_NS_URI, "anySimpleType"),
ANY, /* variety */
(Set) null, /* facets */
0, /* fundametalFacets */
(SimpleType) Type.ANY_TYPE, /* baseType */
null);
}
}
@@ -0,0 +1,58 @@
/* AnyType.java --
Copyright (C) 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
GNU Classpath is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING. If not, write to the
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 USA.
Linking this library statically or dynamically with other modules is
making a combined work based on this library. Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.
As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module. An independent module is a module which is not derived from
or based on this library. If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
package gnu.xml.validation.datatype;
import javax.xml.XMLConstants;
import javax.xml.namespace.QName;
final class AnyType
extends SimpleType
{
AnyType()
{
super(new QName(XMLConstants.W3C_XML_SCHEMA_NS_URI, "anyType"),
ANY, /* variety */
null, /* facets */
0, /* fundamentalFacets */
null, /* baseType */
null);
}
}
@@ -0,0 +1,94 @@
/* AnyURIType.java --
Copyright (C) 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
GNU Classpath is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING. If not, write to the
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 USA.
Linking this library statically or dynamically with other modules is
making a combined work based on this library. Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.
As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module. An independent module is a module which is not derived from
or based on this library. If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
package gnu.xml.validation.datatype;
import java.net.URI;
import java.net.URISyntaxException;
import javax.xml.XMLConstants;
import javax.xml.namespace.QName;
import org.relaxng.datatype.DatatypeException;
import org.relaxng.datatype.ValidationContext;
/**
* The XML Schema anyURI type.
*
* @author <a href='mailto:dog@gnu.org'>Chris Burdess</a>
*/
final class AnyURIType
extends AtomicSimpleType
{
static final int[] CONSTRAINING_FACETS = {
Facet.LENGTH,
Facet.MIN_LENGTH,
Facet.MAX_LENGTH,
Facet.PATTERN,
Facet.ENUMERATION,
Facet.WHITESPACE
};
AnyURIType()
{
super(new QName(XMLConstants.W3C_XML_SCHEMA_NS_URI, "anyURI"),
TypeLibrary.ANY_SIMPLE_TYPE);
}
public int[] getConstrainingFacets()
{
return CONSTRAINING_FACETS;
}
public void checkValid(String value, ValidationContext context)
throws DatatypeException
{
super.checkValid(value, context);
try
{
new URI(value);
}
catch (URISyntaxException e)
{
DatatypeException e2 = new DatatypeException(e.getIndex(),
e.getReason());
e2.initCause(e);
throw e2;
}
}
}
@@ -0,0 +1,78 @@
/* AtomicSimpleType.java --
Copyright (C) 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
GNU Classpath is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING. If not, write to the
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 USA.
Linking this library statically or dynamically with other modules is
making a combined work based on this library. Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.
As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module. An independent module is a module which is not derived from
or based on this library. If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
package gnu.xml.validation.datatype;
import java.util.Set;
import javax.xml.namespace.QName;
import org.relaxng.datatype.DatatypeException;
import org.relaxng.datatype.ValidationContext;
/**
* An XML Schema atomic simple type.
*
* @author <a href='mailto:dog@gnu.org'>Chris Burdess</a>
*/
public class AtomicSimpleType
extends SimpleType
{
public AtomicSimpleType(QName name,
Set facets,
int fundamentalFacets,
SimpleType baseType,
Annotation annotation)
{
super(name, ATOMIC, facets, fundamentalFacets, baseType, annotation);
}
// Only for use by built-in types
AtomicSimpleType(QName name, SimpleType baseType)
{
super(name, ATOMIC, null, 0, baseType, null);
}
public void checkValid(String value, ValidationContext context)
throws DatatypeException
{
super.checkValid(value, context);
if (baseType != null)
baseType.checkValid(value, context);
}
}
@@ -0,0 +1,131 @@
/* Base64BinaryType.java --
Copyright (C) 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
GNU Classpath is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING. If not, write to the
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 USA.
Linking this library statically or dynamically with other modules is
making a combined work based on this library. Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.
As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module. An independent module is a module which is not derived from
or based on this library. If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
package gnu.xml.validation.datatype;
import java.util.Collections;
import java.util.Set;
import javax.xml.XMLConstants;
import javax.xml.namespace.QName;
import org.relaxng.datatype.DatatypeException;
import org.relaxng.datatype.ValidationContext;
/**
* The XML Schema base64Binary type.
*
* @author <a href='mailto:dog@gnu.org'>Chris Burdess</a>
*/
final class Base64BinaryType
extends AtomicSimpleType
{
static final String B64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" +
"abcdefghijklmnopqrstuvwxyz0123456789+/";
static final String B16 = "AEIMQUYcgkosw048";
static final String B04 = "AQgw";
static final int[] CONSTRAINING_FACETS = {
Facet.LENGTH,
Facet.MIN_LENGTH,
Facet.MAX_LENGTH,
Facet.PATTERN,
Facet.ENUMERATION,
Facet.WHITESPACE
};
Base64BinaryType()
{
super(new QName(XMLConstants.W3C_XML_SCHEMA_NS_URI, "base64Binary"),
TypeLibrary.ANY_SIMPLE_TYPE);
}
public int[] getConstrainingFacets()
{
return CONSTRAINING_FACETS;
}
public void checkValid(String value, ValidationContext context)
throws DatatypeException
{
super.checkValid(value, context);
// TODO value = collapseWhitespace(value);
int len = value.length();
try
{
for (int i = len - 1; i >= 0; )
{
char c4 = value.charAt(i--);
if (c4 == ' ')
c4 = value.charAt(i--);
char c3 = value.charAt(i--);
if (c3 == ' ')
c3 = value.charAt(i--);
char c2 = value.charAt(i--);
if (c2 == ' ')
c2 = value.charAt(i--);
char c1 = value.charAt(i--);
if (c1 == ' ')
c1 = value.charAt(i--);
if (c4 == '=')
{
if (c3 == '=')
{
if (B04.indexOf(c2) != -1 &&
B64.indexOf(c1) != -1)
continue;
}
else if (B16.indexOf(c3) != -1)
{
if (B64.indexOf(c2) != -1 &&
B64.indexOf(c1) != -1)
continue;
}
}
else if (B64.indexOf(c4) != -1)
continue;
throw new DatatypeException(i, "illegal BASE64");
}
}
catch (IndexOutOfBoundsException e)
{
throw new DatatypeException("illegal BASE64");
}
}
}
@@ -0,0 +1,91 @@
/* BooleanType.java --
Copyright (C) 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
GNU Classpath is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING. If not, write to the
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 USA.
Linking this library statically or dynamically with other modules is
making a combined work based on this library. Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.
As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module. An independent module is a module which is not derived from
or based on this library. If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
package gnu.xml.validation.datatype;
import java.util.Arrays;
import java.util.Collections;
import java.util.Set;
import java.util.TreeSet;
import javax.xml.XMLConstants;
import javax.xml.namespace.QName;
import org.relaxng.datatype.DatatypeException;
import org.relaxng.datatype.ValidationContext;
/**
* The XML Schema boolean type.
*
* @author <a href='mailto:dog@gnu.org'>Chris Burdess</a>
*/
final class BooleanType
extends AtomicSimpleType
{
static final int[] CONSTRAINING_FACETS = {
Facet.PATTERN,
Facet.WHITESPACE
};
static final Set VALUE_SPACE =
new TreeSet(Arrays.asList(new String[] {"true", "false", "1", "0"}));
BooleanType()
{
super(new QName(XMLConstants.W3C_XML_SCHEMA_NS_URI, "boolean"),
TypeLibrary.ANY_SIMPLE_TYPE);
}
public int[] getConstrainingFacets()
{
return CONSTRAINING_FACETS;
}
public void checkValid(String value, ValidationContext context)
throws DatatypeException
{
super.checkValid(value, context);
if (!VALUE_SPACE.contains(value))
throw new DatatypeException("invalid boolean value");
}
public Object createValue(String literal, ValidationContext context) {
return ("1".equals(literal) || "true".equals(literal)) ? Boolean.TRUE :
Boolean.FALSE;
}
}
@@ -0,0 +1,133 @@
/* ByteType.java --
Copyright (C) 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
GNU Classpath is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING. If not, write to the
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 USA.
Linking this library statically or dynamically with other modules is
making a combined work based on this library. Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.
As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module. An independent module is a module which is not derived from
or based on this library. If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
package gnu.xml.validation.datatype;
import javax.xml.XMLConstants;
import javax.xml.namespace.QName;
import org.relaxng.datatype.DatatypeException;
import org.relaxng.datatype.ValidationContext;
/**
* The XML Schema byte type.
*
* @author <a href='mailto:dog@gnu.org'>Chris Burdess</a>
*/
final class ByteType
extends AtomicSimpleType
{
static final int[] CONSTRAINING_FACETS = {
Facet.TOTAL_DIGITS,
Facet.FRACTION_DIGITS,
Facet.PATTERN,
Facet.WHITESPACE,
Facet.ENUMERATION,
Facet.MAX_INCLUSIVE,
Facet.MAX_EXCLUSIVE,
Facet.MIN_INCLUSIVE,
Facet.MIN_EXCLUSIVE
};
static final String MAX_VALUE = "127";
static final String MIN_VALUE = "128";
static final int LENGTH = MAX_VALUE.length();
ByteType()
{
super(new QName(XMLConstants.W3C_XML_SCHEMA_NS_URI, "byte"),
TypeLibrary.SHORT);
}
public int[] getConstrainingFacets()
{
return CONSTRAINING_FACETS;
}
public void checkValue(String value, ValidationContext context)
throws DatatypeException
{
super.checkValid(value, context);
int len = value.length();
if (len == 0)
throw new DatatypeException(0, "invalid byte value");
int i = 0, off = 0;
boolean compare = false;
String compareTo = MAX_VALUE;
char c = value.charAt(0);
if (c == '+')
i++;
else if (c == '-')
{
compareTo = MIN_VALUE;
i++;
}
if (len - i > LENGTH)
throw new DatatypeException(0, "invalid byte value");
else if (len - i == LENGTH)
compare = true;
for (; i < len; i++)
{
c = value.charAt(i);
if (c >= 0x30 && c <= 0x39)
{
if (compare)
{
char d = compareTo.charAt(off);
if (Character.digit(c, 10) > Character.digit(d, 10))
throw new DatatypeException(i, "invalid byte value");
}
off++;
continue;
}
throw new DatatypeException(i, "invalid byte value");
}
}
public Object createValue(String literal, ValidationContext context) {
try
{
return new Byte(literal);
}
catch (NumberFormatException e)
{
return null;
}
}
}
@@ -0,0 +1,335 @@
/* DateTimeType.java --
Copyright (C) 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
GNU Classpath is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING. If not, write to the
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 USA.
Linking this library statically or dynamically with other modules is
making a combined work based on this library. Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.
As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module. An independent module is a module which is not derived from
or based on this library. If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
package gnu.xml.validation.datatype;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.TimeZone;
import javax.xml.XMLConstants;
import javax.xml.namespace.QName;
import org.relaxng.datatype.DatatypeException;
import org.relaxng.datatype.ValidationContext;
/**
* The XML Schema dateTime type.
*
* @author <a href='mailto:dog@gnu.org'>Chris Burdess</a>
*/
final class DateTimeType
extends AtomicSimpleType
{
static final int[] CONSTRAINING_FACETS = {
Facet.PATTERN,
Facet.ENUMERATION,
Facet.WHITESPACE,
Facet.MAX_INCLUSIVE,
Facet.MAX_EXCLUSIVE,
Facet.MIN_INCLUSIVE,
Facet.MIN_EXCLUSIVE
};
DateTimeType()
{
super(new QName(XMLConstants.W3C_XML_SCHEMA_NS_URI, "dateTime"),
TypeLibrary.ANY_SIMPLE_TYPE);
}
public int[] getConstrainingFacets()
{
return CONSTRAINING_FACETS;
}
public void checkValue(String value, ValidationContext context)
throws DatatypeException
{
super.checkValid(value, context);
int len = value.length();
int state = 0;
int start = 0;
for (int i = 0; i < len; i++)
{
char c = value.charAt(i);
if (c == '-' && i == 0)
{
start++;
continue;
}
if (c >= 0x30 && c <= 0x39)
continue;
switch (state)
{
case 0: // year
if (c == '-')
{
String year = value.substring(start, i);
if ("0000".equals(year) || year.length() < 4)
throw new DatatypeException(i, "invalid dateTime value");
state = 1;
start = i + 1;
continue;
}
break;
case 1: // month
if (c == '-')
{
if (i - start != 2)
throw new DatatypeException(i, "invalid dateTime value");
state = 2;
start = i + 1;
continue;
}
break;
case 2: // day
if (c == 'T')
{
if (i - start != 2)
throw new DatatypeException(i, "invalid dateTime value");
state = 3;
start = i + 1;
continue;
}
break;
case 3: // hour
if (c == ':')
{
if (i - start != 2)
throw new DatatypeException(i, "invalid dateTime value");
state = 4;
start = i + 1;
continue;
}
break;
case 4: // minute
if (c == ':')
{
if (i - start != 2)
throw new DatatypeException(i, "invalid dateTime value");
state = 5;
start = i + 1;
continue;
}
break;
case 5: // second
if (c == '.')
{
if (i - start != 2)
throw new DatatypeException(i, "invalid dateTime value");
state = 6;
start = i + 1;
continue;
}
else if (c == ' ')
{
if (i - start != 2)
throw new DatatypeException(i, "invalid dateTime value");
state = 7;
start = i + 1;
continue;
}
break;
case 6: // second fraction
if (c == ' ')
{
state = 7;
start = i + 1;
continue;
}
break;
case 7: // timezone 1
if (start == i)
{
if (c == '+' || c == '-')
continue;
else if (c == 'Z')
{
state = 9;
start = i + 1;
continue;
}
}
if (c == ':')
{
if (i - start != 2)
throw new DatatypeException(i, "invalid dateTime value");
state = 8;
start = i + 1;
continue;
}
break;
}
throw new DatatypeException(i, "invalid dateTime value");
}
switch (state)
{
case 5: // second
if (len - start != 2)
throw new DatatypeException(len, "invalid dateTime value");
break;
case 6: // second fraction
break;
case 8: // timezone 2
if (len - start != 2)
throw new DatatypeException(len, "invalid dateTime value");
break;
case 9: // post Z
break;
default:
throw new DatatypeException(len, "invalid dateTime value");
}
}
public Object createValue(String value, ValidationContext context) {
int len = value.length();
int state = 0;
int start = 0;
Calendar cal = new GregorianCalendar();
try
{
for (int i = 0; i < len; i++)
{
char c = value.charAt(i);
if (c == '-' && i == 0)
{
start++;
continue;
}
if (c >= 0x30 && c <= 0x39)
continue;
switch (state)
{
case 0: // year
if (c == '-')
{
cal.set(Calendar.YEAR,
Integer.parseInt(value.substring(0, i)));
state = 1;
start = i + 1;
continue;
}
break;
case 1: // month
if (c == '-')
{
cal.set(Calendar.MONTH,
Integer.parseInt(value.substring(start, i)));
state = 2;
start = i + 1;
continue;
}
break;
case 2: // day
if (c == 'T')
{
cal.set(Calendar.DATE,
Integer.parseInt(value.substring(start, i)));
state = 3;
start = i + 1;
continue;
}
break;
case 3: // hour
if (c == ':')
{
cal.set(Calendar.HOUR,
Integer.parseInt(value.substring(start, i)));
state = 4;
start = i + 1;
continue;
}
break;
case 4: // minute
if (c == ':')
{
cal.set(Calendar.MINUTE,
Integer.parseInt(value.substring(start, i)));
state = 5;
start = i + 1;
continue;
}
break;
case 5: // second
if (c == ' ')
{
float second = Float.parseFloat(value.substring(start, i));
// TODO adjust non-integer values
cal.set(Calendar.SECOND, (int) second);
state = 7;
start = i + 1;
continue;
}
break;
}
}
// end of input
if (len - start > 0 && state == 7)
{
// Timezone
String timezone = value.substring(len - start);
int i = timezone.indexOf(':');
if (i == -1)
{
if ("Z".equals(timezone))
timezone = "UTC";
TimeZone tz = TimeZone.getTimeZone(timezone);
if (tz == null)
return null;
cal.set(Calendar.ZONE_OFFSET, tz.getRawOffset());
}
else
{
String tzh = timezone.substring(0, i);
String tzm = timezone.substring(i + 1);
int offset = Integer.parseInt(tzh) * 360000;
if (offset < 0)
offset -= Integer.parseInt(tzm) * 60000;
else
offset += Integer.parseInt(tzm) * 60000;
cal.set(Calendar.ZONE_OFFSET, offset);
}
}
return cal.getTime();
}
catch (NumberFormatException e)
{
return null;
}
}
}
@@ -0,0 +1,222 @@
/* DateType.java --
Copyright (C) 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
GNU Classpath is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING. If not, write to the
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 USA.
Linking this library statically or dynamically with other modules is
making a combined work based on this library. Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.
As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module. An independent module is a module which is not derived from
or based on this library. If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
package gnu.xml.validation.datatype;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.TimeZone;
import javax.xml.XMLConstants;
import javax.xml.namespace.QName;
import org.relaxng.datatype.DatatypeException;
import org.relaxng.datatype.ValidationContext;
/**
* The XML Schema date type.
*
* @author <a href='mailto:dog@gnu.org'>Chris Burdess</a>
*/
final class DateType
extends AtomicSimpleType
{
static final int[] CONSTRAINING_FACETS = {
Facet.PATTERN,
Facet.ENUMERATION,
Facet.WHITESPACE,
Facet.MAX_INCLUSIVE,
Facet.MAX_EXCLUSIVE,
Facet.MIN_INCLUSIVE,
Facet.MIN_EXCLUSIVE
};
DateType()
{
super(new QName(XMLConstants.W3C_XML_SCHEMA_NS_URI, "date"),
TypeLibrary.ANY_SIMPLE_TYPE);
}
public int[] getConstrainingFacets()
{
return CONSTRAINING_FACETS;
}
public void checkValid(String value, ValidationContext context)
throws DatatypeException
{
super.checkValid(value, context);
int len = value.length();
int state = 0;
int start = 0;
for (int i = 0; i < len; i++)
{
char c = value.charAt(i);
if (c == '-' && i == 0)
{
start++;
continue;
}
if (c >= 0x30 && c <= 0x39)
continue;
switch (state)
{
case 0: // year
if (c == '-')
{
String year = value.substring(start, i);
if ("0000".equals(year) || year.length() < 4)
throw new DatatypeException(i, "invalid date value");
state = 1;
start = i + 1;
continue;
}
break;
case 1: // month
if (c == '-')
{
if (i - start != 2)
throw new DatatypeException(i, "invalid date value");
state = 2;
start = i + 1;
continue;
}
break;
}
throw new DatatypeException(i, "invalid date value");
}
switch (state)
{
case 2: // day
if (len - start != 2)
throw new DatatypeException("invalid date value");
break;
default:
throw new DatatypeException("invalid date value");
}
}
public Object createValue(String value, ValidationContext context) {
int len = value.length();
int state = 0;
int start = 0;
Calendar cal = new GregorianCalendar();
cal.set(Calendar.HOUR, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
try
{
for (int i = 0; i < len; i++)
{
char c = value.charAt(i);
if (c == '-' && i == 0)
{
start++;
continue;
}
if (c >= 0x30 && c <= 0x39)
continue;
switch (state)
{
case 0: // year
if (c == '-')
{
cal.set(Calendar.YEAR,
Integer.parseInt(value.substring(0, i)));
state = 1;
start = i + 1;
continue;
}
break;
case 1: // month
if (c == '-')
{
cal.set(Calendar.MONTH,
Integer.parseInt(value.substring(start, i)));
state = 2;
start = i + 1;
continue;
}
break;
case 2: // day
if (c == 'T')
{
cal.set(Calendar.DATE,
Integer.parseInt(value.substring(start, i)));
state = 7;
start = i + 1;
continue;
}
break;
}
}
// end of input
if (len - start > 0 && state == 7)
{
// Timezone
String timezone = value.substring(len - start);
int i = timezone.indexOf(':');
if (i == -1)
{
if ("Z".equals(timezone))
timezone = "UTC";
TimeZone tz = TimeZone.getTimeZone(timezone);
if (tz == null)
return null;
cal.set(Calendar.ZONE_OFFSET, tz.getRawOffset());
}
else
{
String tzh = timezone.substring(0, i);
String tzm = timezone.substring(i + 1);
int offset = Integer.parseInt(tzh) * 360000;
if (offset < 0)
offset -= Integer.parseInt(tzm) * 60000;
else
offset += Integer.parseInt(tzm) * 60000;
cal.set(Calendar.ZONE_OFFSET, offset);
}
}
return cal.getTime();
}
catch (NumberFormatException e)
{
return null;
}
}
}
@@ -0,0 +1,121 @@
/* DecimalType.java --
Copyright (C) 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
GNU Classpath is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING. If not, write to the
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 USA.
Linking this library statically or dynamically with other modules is
making a combined work based on this library. Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.
As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module. An independent module is a module which is not derived from
or based on this library. If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
package gnu.xml.validation.datatype;
import java.math.BigDecimal;
import java.util.Collections;
import java.util.Set;
import javax.xml.XMLConstants;
import javax.xml.namespace.QName;
import org.relaxng.datatype.DatatypeException;
import org.relaxng.datatype.ValidationContext;
/**
* The XML Schema decimal type.
*
* @author <a href='mailto:dog@gnu.org'>Chris Burdess</a>
*/
final class DecimalType
extends AtomicSimpleType
{
static final int[] CONSTRAINING_FACETS = {
Facet.TOTAL_DIGITS,
Facet.FRACTION_DIGITS,
Facet.PATTERN,
Facet.WHITESPACE,
Facet.ENUMERATION,
Facet.MAX_INCLUSIVE,
Facet.MAX_EXCLUSIVE,
Facet.MIN_INCLUSIVE,
Facet.MIN_EXCLUSIVE
};
DecimalType()
{
super(new QName(XMLConstants.W3C_XML_SCHEMA_NS_URI, "decimal"),
TypeLibrary.ANY_SIMPLE_TYPE);
}
public int[] getConstrainingFacets()
{
return CONSTRAINING_FACETS;
}
public void checkValid(String value, ValidationContext context)
throws DatatypeException
{
super.checkValid(value, context);
int len = value.length();
if (len == 0)
throw new DatatypeException("invalid decimal value");
boolean seenDot = false;
for (int i = 0; i < len; i++)
{
char c = value.charAt(i);
if (c >= 0x30 && c <= 0x39)
continue;
else if (c == '.')
{
if (seenDot)
throw new DatatypeException(i, "invalid decimal value");
seenDot = true;
continue;
}
else if (c == '+' && i == 0)
continue;
else if (c == '-' && i == 0)
continue;
else
throw new DatatypeException(i, "invalid decimal value");
}
}
public Object createValue(String literal, ValidationContext context) {
try
{
return new BigDecimal(literal);
}
catch (NumberFormatException e)
{
return null;
}
}
}
@@ -0,0 +1,112 @@
/* DoubleType.java --
Copyright (C) 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
GNU Classpath is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING. If not, write to the
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 USA.
Linking this library statically or dynamically with other modules is
making a combined work based on this library. Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.
As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module. An independent module is a module which is not derived from
or based on this library. If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
package gnu.xml.validation.datatype;
import java.util.Arrays;
import java.util.Collections;
import java.util.Set;
import java.util.TreeSet;
import javax.xml.XMLConstants;
import javax.xml.namespace.QName;
import org.relaxng.datatype.DatatypeException;
import org.relaxng.datatype.ValidationContext;
/**
* The XML Schema double type.
*
* @author <a href='mailto:dog@gnu.org'>Chris Burdess</a>
*/
final class DoubleType
extends AtomicSimpleType
{
static final int[] CONSTRAINING_FACETS = {
Facet.PATTERN,
Facet.ENUMERATION,
Facet.WHITESPACE,
Facet.MAX_INCLUSIVE,
Facet.MAX_EXCLUSIVE,
Facet.MIN_INCLUSIVE,
Facet.MIN_EXCLUSIVE
};
static final Set SPECIAL =
new TreeSet(Arrays.asList(new String[] {"INF", "-INF", "NaN"}));
DoubleType()
{
super(new QName(XMLConstants.W3C_XML_SCHEMA_NS_URI, "double"),
TypeLibrary.ANY_SIMPLE_TYPE);
}
public int[] getConstrainingFacets()
{
return CONSTRAINING_FACETS;
}
public void checkValid(String value, ValidationContext context)
throws DatatypeException
{
super.checkValid(value, context);
if (SPECIAL.contains(value))
return;
try
{
Double.parseDouble(value);
}
catch (NumberFormatException e)
{
DatatypeException e2 = new DatatypeException("invalid double value");
e2.initCause(e);
throw e2;
}
}
public Object createValue(String literal, ValidationContext context) {
try
{
return new Double(literal);
}
catch (NumberFormatException e)
{
return null;
}
}
}
@@ -0,0 +1,239 @@
/* DurationType.java --
Copyright (C) 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
GNU Classpath is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING. If not, write to the
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 USA.
Linking this library statically or dynamically with other modules is
making a combined work based on this library. Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.
As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module. An independent module is a module which is not derived from
or based on this library. If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
package gnu.xml.validation.datatype;
import javax.xml.XMLConstants;
import javax.xml.namespace.QName;
import org.relaxng.datatype.DatatypeException;
import org.relaxng.datatype.ValidationContext;
/**
* The XML Schema duration type.
*
* @author <a href='mailto:dog@gnu.org'>Chris Burdess</a>
*/
final class DurationType
extends AtomicSimpleType
{
static class Duration
implements Comparable
{
int years;
int months;
int days;
int minutes;
float seconds;
public int hashCode()
{
int hc = years;
hc = hc * 31 + months;
hc = hc * 31 + days;
hc = hc * 31 + minutes;
hc = hc * 31 + new Float(seconds).hashCode();
return hc;
}
public boolean equals(Object other)
{
if (other instanceof Duration)
{
Duration duration = (Duration) other;
return duration.years ==years &&
duration.months == months &&
duration.days == days &&
duration.minutes == minutes &&
duration.seconds == seconds;
}
return false;
}
public int compareTo(Object other)
{
if (other instanceof Duration)
{
Duration duration = (Duration) other;
if (duration.years != years)
return years - duration.years;
if (duration.months != months)
return months - duration.months;
if (duration.days != days)
return days - duration.days;
if (duration.minutes != minutes)
return minutes = duration.minutes;
if (duration.seconds == seconds)
return 0;
return (seconds < duration.seconds) ? -1 : 1;
}
return 0;
}
}
static final int[] CONSTRAINING_FACETS = {
Facet.PATTERN,
Facet.ENUMERATION,
Facet.WHITESPACE,
Facet.MAX_INCLUSIVE,
Facet.MAX_EXCLUSIVE,
Facet.MIN_INCLUSIVE,
Facet.MIN_EXCLUSIVE
};
DurationType()
{
super(new QName(XMLConstants.W3C_XML_SCHEMA_NS_URI, "duration"),
TypeLibrary.ANY_SIMPLE_TYPE);
}
public int[] getConstrainingFacets()
{
return CONSTRAINING_FACETS;
}
public void checkValid(String value, ValidationContext context)
throws DatatypeException
{
super.checkValid(value, context);
int len = value.length();
char expect = 'P';
boolean seenT = false;
for (int i = 0; i < len; i++)
{
char c = value.charAt(i);
if (c == '-' && expect == 'P')
continue;
if (c == expect)
{
if (c == 'P')
expect = 'Y';
else if (c == 'Y')
expect = 'M';
else if (c == 'M' && !seenT)
expect = 'D';
else if (c == 'D')
expect = 'T';
else if (c == 'T')
{
expect = 'H';
seenT = true;
}
else if (c == 'H')
expect = 'M';
else if (c == 'M' && seenT)
expect = 'S';
else if (c == 'S')
{
if (i + 1 != len)
throw new DatatypeException(i, "illegal duration value");
}
continue;
}
if (c >= 0x30 && c <= 0x39 && expect != 'P' && expect != 'T')
continue;
throw new DatatypeException(i, "illegal duration value");
}
}
public Object createValue(String value, ValidationContext context) {
boolean negative = false;
int days = 0, months = 0, years = 0;
int minutes = 0;
float seconds = 0.0f;
int len = value.length();
char expect = 'P';
boolean seenT = false;
int start = 0;
for (int i = 0; i < len; i++)
{
char c = value.charAt(i);
if (c == '-' && expect == 'P')
{
negative = true;
continue;
}
if (c == expect)
{
if (c == 'P')
expect = 'Y';
else if (c == 'Y')
{
expect = 'M';
years = Integer.parseInt(value.substring(start, i));
}
else if (c == 'M' && !seenT)
expect = 'D';
else if (c == 'D')
expect = 'T';
else if (c == 'T')
{
expect = 'H';
seenT = true;
}
else if (c == 'H')
expect = 'M';
else if (c == 'M' && seenT)
expect = 'S';
else if (c == 'S')
{
if (i + 1 != len)
return null;
}
start = i + 1;
continue;
}
if (c >= 0x30 && c <= 0x39 && expect != 'P' && expect != 'T')
continue;
return null;
}
if (negative)
{
days = days * -1;
minutes = minutes * -1;
seconds = seconds * -1.0f;
}
Duration duration = new Duration();
duration.days = days;
duration.minutes = minutes;
duration.seconds = seconds;
return duration;
}
}
@@ -0,0 +1,107 @@
/* EntitiesType.java --
Copyright (C) 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
GNU Classpath is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING. If not, write to the
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 USA.
Linking this library statically or dynamically with other modules is
making a combined work based on this library. Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.
As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module. An independent module is a module which is not derived from
or based on this library. If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
package gnu.xml.validation.datatype;
import javax.xml.XMLConstants;
import javax.xml.namespace.QName;
import org.relaxng.datatype.DatatypeException;
import org.relaxng.datatype.ValidationContext;
/**
* The XML Schema ENTITIES type.
*
* @author <a href='mailto:dog@gnu.org'>Chris Burdess</a>
*/
final class EntitiesType
extends AtomicSimpleType
{
static final int[] CONSTRAINING_FACETS = {
Facet.LENGTH,
Facet.MIN_LENGTH,
Facet.MAX_LENGTH,
Facet.PATTERN,
Facet.ENUMERATION,
Facet.WHITESPACE
};
EntitiesType()
{
super(new QName(XMLConstants.W3C_XML_SCHEMA_NS_URI, "ENTITIES"),
TypeLibrary.ENTITY);
}
public int[] getConstrainingFacets()
{
return CONSTRAINING_FACETS;
}
public void checkValid(String value, ValidationContext context)
throws DatatypeException
{
super.checkValid(value, context);
StringBuffer buf = new StringBuffer();
int len = value.length();
for (int i = 0; i < len; i++)
{
char c = value.charAt(i);
if (c == ' ')
{
String token = buf.toString();
if (token.length() > 0)
{
if (!context.isUnparsedEntity(token))
throw new DatatypeException(i, "invalid ENTITIES value");
}
buf.setLength(0);
}
else
buf.append(c);
}
String token = buf.toString();
if (token.length() == 0 || !context.isUnparsedEntity(token))
throw new DatatypeException("invalid ENTITIES value");
}
public boolean isContextDependent()
{
return true;
}
}
@@ -0,0 +1,88 @@
/* EntityType.java --
Copyright (C) 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
GNU Classpath is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING. If not, write to the
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 USA.
Linking this library statically or dynamically with other modules is
making a combined work based on this library. Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.
As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module. An independent module is a module which is not derived from
or based on this library. If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
package gnu.xml.validation.datatype;
import javax.xml.XMLConstants;
import javax.xml.namespace.QName;
import org.relaxng.datatype.DatatypeException;
import org.relaxng.datatype.ValidationContext;
/**
* The XML Schema ENTITY type.
*
* @author <a href='mailto:dog@gnu.org'>Chris Burdess</a>
*/
final class EntityType
extends AtomicSimpleType
{
static final int[] CONSTRAINING_FACETS = {
Facet.LENGTH,
Facet.MIN_LENGTH,
Facet.MAX_LENGTH,
Facet.PATTERN,
Facet.ENUMERATION,
Facet.WHITESPACE
};
EntityType()
{
super(new QName(XMLConstants.W3C_XML_SCHEMA_NS_URI, "ENTITY"),
TypeLibrary.NCNAME);
}
public int[] getConstrainingFacets()
{
return CONSTRAINING_FACETS;
}
public void checkValid(String value, ValidationContext context)
throws DatatypeException
{
super.checkValid(value, context);
if (value.length() == 0 || !context.isUnparsedEntity(value))
throw new DatatypeException("invalid ENTITY value");
}
public boolean isContextDependent()
{
return true;
}
}
@@ -0,0 +1,69 @@
/* EnumerationFacet.java --
Copyright (C) 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
GNU Classpath is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING. If not, write to the
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 USA.
Linking this library statically or dynamically with other modules is
making a combined work based on this library. Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.
As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module. An independent module is a module which is not derived from
or based on this library. If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
package gnu.xml.validation.datatype;
/**
* The <code>enumeration</code> facet.
*
* @author <a href='mailto:dog@gnu.org'>Chris Burdess</a>
*/
public final class EnumerationFacet
extends Facet
{
public final String value;
public EnumerationFacet(String value, Annotation annotation)
{
super(ENUMERATION, annotation);
this.value = value;
}
public int hashCode()
{
return value.hashCode();
}
public boolean equals(Object other)
{
return (other instanceof EnumerationFacet &&
((EnumerationFacet) other).value.equals(value));
}
}
@@ -0,0 +1,78 @@
/* Facet.java --
Copyright (C) 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
GNU Classpath is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING. If not, write to the
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 USA.
Linking this library statically or dynamically with other modules is
making a combined work based on this library. Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.
As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module. An independent module is a module which is not derived from
or based on this library. If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
package gnu.xml.validation.datatype;
/**
* An XML Schema constraining facet.
*
* @author <a href='mailto:dog@gnu.org'>Chris Burdess</a>
*/
public abstract class Facet
{
public static final int LENGTH = 1;
public static final int MIN_LENGTH = 2;
public static final int MAX_LENGTH = 3;
public static final int PATTERN = 4;
public static final int ENUMERATION = 5;
public static final int WHITESPACE = 6;
public static final int MAX_INCLUSIVE = 7;
public static final int MAX_EXCLUSIVE = 8;
public static final int MIN_EXCLUSIVE = 9;
public static final int MIN_INCLUSIVE = 10;
public static final int TOTAL_DIGITS = 11;
public static final int FRACTION_DIGITS = 12;
/**
* The type of this facet.
*/
public final int type;
/**
* Optional annotation.
*/
public Annotation annotation;
protected Facet(int type, Annotation annotation)
{
this.type = type;
this.annotation = annotation;
}
}
@@ -0,0 +1,112 @@
/* FloatType.java --
Copyright (C) 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
GNU Classpath is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING. If not, write to the
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 USA.
Linking this library statically or dynamically with other modules is
making a combined work based on this library. Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.
As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module. An independent module is a module which is not derived from
or based on this library. If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
package gnu.xml.validation.datatype;
import java.util.Arrays;
import java.util.Collections;
import java.util.Set;
import java.util.TreeSet;
import javax.xml.XMLConstants;
import javax.xml.namespace.QName;
import org.relaxng.datatype.DatatypeException;
import org.relaxng.datatype.ValidationContext;
/**
* The XML Schema float type.
*
* @author <a href='mailto:dog@gnu.org'>Chris Burdess</a>
*/
final class FloatType
extends AtomicSimpleType
{
static final int[] CONSTRAINING_FACETS = {
Facet.PATTERN,
Facet.ENUMERATION,
Facet.WHITESPACE,
Facet.MAX_INCLUSIVE,
Facet.MAX_EXCLUSIVE,
Facet.MIN_INCLUSIVE,
Facet.MIN_EXCLUSIVE
};
static final Set SPECIAL =
new TreeSet(Arrays.asList(new String[] {"INF", "-INF", "NaN"}));
FloatType()
{
super(new QName(XMLConstants.W3C_XML_SCHEMA_NS_URI, "float"),
TypeLibrary.ANY_SIMPLE_TYPE);
}
public int[] getConstrainingFacets()
{
return CONSTRAINING_FACETS;
}
public void checkValid(String value, ValidationContext context)
throws DatatypeException
{
super.checkValid(value, context);
if (SPECIAL.contains(value))
return;
try
{
Float.parseFloat(value);
}
catch (NumberFormatException e)
{
DatatypeException e2 = new DatatypeException("invalid float value");
e2.initCause(e);
throw e2;
}
}
public Object createValue(String literal, ValidationContext context) {
try
{
return new Float(literal);
}
catch (NumberFormatException e)
{
return null;
}
}
}
@@ -0,0 +1,72 @@
/* FractionDigitsFacet.java --
Copyright (C) 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
GNU Classpath is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING. If not, write to the
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 USA.
Linking this library statically or dynamically with other modules is
making a combined work based on this library. Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.
As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module. An independent module is a module which is not derived from
or based on this library. If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
package gnu.xml.validation.datatype;
/**
* The <code>fractionDigits</code> facet.
*
* @author <a href='mailto:dog@gnu.org'>Chris Burdess</a>
*/
public final class FractionDigitsFacet
extends Facet
{
public final int value;
public final boolean fixed;
public FractionDigitsFacet(int value, boolean fixed, Annotation annotation)
{
super(FRACTION_DIGITS, annotation);
this.value = value;
this.fixed = fixed;
}
public int hashCode()
{
return value;
}
public boolean equals(Object other)
{
return (other instanceof FractionDigitsFacet &&
((FractionDigitsFacet) other).value == value);
}
}
@@ -0,0 +1,175 @@
/* GDayType.java --
Copyright (C) 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
GNU Classpath is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING. If not, write to the
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 USA.
Linking this library statically or dynamically with other modules is
making a combined work based on this library. Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.
As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module. An independent module is a module which is not derived from
or based on this library. If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
package gnu.xml.validation.datatype;
import javax.xml.XMLConstants;
import javax.xml.namespace.QName;
import org.relaxng.datatype.DatatypeException;
import org.relaxng.datatype.ValidationContext;
/**
* The XML Schema gDay type.
*
* @author <a href='mailto:dog@gnu.org'>Chris Burdess</a>
*/
final class GDayType
extends AtomicSimpleType
{
static class GDay
implements Comparable
{
int day;
public int hashCode()
{
return day;
}
public boolean equals(Object other)
{
if (other instanceof GDay)
return ((GDay) other).day == day;
return false;
}
public int compareTo(Object other)
{
if (other instanceof GDay)
{
GDay gd = (GDay) other;
if (gd.day == day)
return 0;
return (day < gd.day) ? -1 : 1;
}
return 0;
}
}
static final int[] CONSTRAINING_FACETS = {
Facet.PATTERN,
Facet.ENUMERATION,
Facet.WHITESPACE,
Facet.MAX_INCLUSIVE,
Facet.MAX_EXCLUSIVE,
Facet.MIN_INCLUSIVE,
Facet.MIN_EXCLUSIVE
};
GDayType()
{
super(new QName(XMLConstants.W3C_XML_SCHEMA_NS_URI, "gDay"),
TypeLibrary.ANY_SIMPLE_TYPE);
}
public int[] getConstrainingFacets()
{
return CONSTRAINING_FACETS;
}
public void checkValid(String value, ValidationContext context)
throws DatatypeException
{
super.checkValid(value, context);
int len = value.length();
int state = 0;
int start = 0;
for (int i = 0; i < len; i++)
{
char c = value.charAt(i);
if (c >= 0x30 && c <= 0x39)
continue;
switch (state)
{
case 0: // year
if (c == '-')
{
switch (i)
{
case 0:
continue;
case 1:
state = 1;
start = i + 1;
continue;
default:
throw new DatatypeException(i, "invalid GDay value");
}
}
break;
case 1: // month
if (c == '-')
{
if (i - start != 0)
throw new DatatypeException(i, "invalid GDay value");
state = 2;
start = i + 1;
continue;
}
break;
}
throw new DatatypeException(i, "invalid GDay value");
}
switch (state)
{
case 2: // day
if (len - start != 2)
throw new DatatypeException("invalid GDay value");
break;
default:
throw new DatatypeException("invalid GDay value");
}
}
public Object createValue(String literal, ValidationContext context) {
try
{
GDay ret = new GDay();
ret.day = Integer.parseInt(literal.substring(3));
return ret;
}
catch (Exception e)
{
return null;
}
}
}
@@ -0,0 +1,184 @@
/* GMonthDayType.java --
Copyright (C) 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
GNU Classpath is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING. If not, write to the
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 USA.
Linking this library statically or dynamically with other modules is
making a combined work based on this library. Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.
As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module. An independent module is a module which is not derived from
or based on this library. If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
package gnu.xml.validation.datatype;
import javax.xml.XMLConstants;
import javax.xml.namespace.QName;
import org.relaxng.datatype.DatatypeException;
import org.relaxng.datatype.ValidationContext;
/**
* The XML Schema gMonthDay type.
*
* @author <a href='mailto:dog@gnu.org'>Chris Burdess</a>
*/
final class GMonthDayType
extends AtomicSimpleType
{
static class GMonthDay
implements Comparable
{
int month;
int day;
public int hashCode()
{
return month * 31 + day;
}
public boolean equals(Object other)
{
if (other instanceof GMonthDay)
{
GMonthDay gmd = (GMonthDay) other;
return gmd.month == month && gmd.day == day;
}
return false;
}
public int compareTo(Object other)
{
if (other instanceof GMonthDay)
{
GMonthDay gmd = (GMonthDay) other;
if (gmd.month == month)
{
if (gmd.day == day)
return 0;
return (day < gmd.day) ? -1 : 1;
}
return (month < gmd.month) ? -1 : 1;
}
return 0;
}
}
static final int[] CONSTRAINING_FACETS = {
Facet.PATTERN,
Facet.ENUMERATION,
Facet.WHITESPACE,
Facet.MAX_INCLUSIVE,
Facet.MAX_EXCLUSIVE,
Facet.MIN_INCLUSIVE,
Facet.MIN_EXCLUSIVE
};
GMonthDayType()
{
super(new QName(XMLConstants.W3C_XML_SCHEMA_NS_URI, "gMonthDay"),
TypeLibrary.ANY_SIMPLE_TYPE);
}
public int[] getConstrainingFacets()
{
return CONSTRAINING_FACETS;
}
public void checkValid(String value, ValidationContext context)
throws DatatypeException
{
super.checkValid(value, context);
int len = value.length();
int state = 0;
int start = 0;
for (int i = 0; i < len; i++)
{
char c = value.charAt(i);
if (c >= 0x30 && c <= 0x39)
continue;
switch (state)
{
case 0: // year
if (c == '-')
{
switch (i)
{
case 0:
continue;
case 1:
state = 1;
start = i + 1;
continue;
default:
throw new DatatypeException(i, "illegal GMonthDay type");
}
}
break;
case 1: // month
if (c == '-')
{
if (i - start != 2)
throw new DatatypeException(i, "illegal GMonthDay type");
state = 2;
start = i + 1;
continue;
}
break;
}
throw new DatatypeException(i, "illegal GMonthDay type");
}
switch (state)
{
case 2: // day
if (len - start != 2)
throw new DatatypeException("illegal GMonthDay type");
break;
default:
throw new DatatypeException("illegal GMonthDay type");
}
}
public Object createValue(String literal, ValidationContext context) {
try
{
GMonthDay ret = new GMonthDay();
ret.month = Integer.parseInt(literal.substring(2, 5));
ret.day = Integer.parseInt(literal.substring(6));
return ret;
}
catch (Exception e)
{
return null;
}
}
}
@@ -0,0 +1,164 @@
/* GMonthType.java --
Copyright (C) 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
GNU Classpath is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING. If not, write to the
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 USA.
Linking this library statically or dynamically with other modules is
making a combined work based on this library. Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.
As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module. An independent module is a module which is not derived from
or based on this library. If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
package gnu.xml.validation.datatype;
import javax.xml.XMLConstants;
import javax.xml.namespace.QName;
import org.relaxng.datatype.DatatypeException;
import org.relaxng.datatype.ValidationContext;
/**
* The XML Schema gMonth type.
*
* @author <a href='mailto:dog@gnu.org'>Chris Burdess</a>
*/
final class GMonthType
extends AtomicSimpleType
{
static class GMonth
implements Comparable
{
int month;
public int hashCode()
{
return month;
}
public boolean equals(Object other)
{
if (other instanceof GMonth)
return ((GMonth) other).month == month;
return false;
}
public int compareTo(Object other)
{
if (other instanceof GMonth)
{
GMonth gm = (GMonth) other;
if (gm.month == month)
return 0;
return (month < gm.month) ? -1 : 1;
}
return 0;
}
}
static final int[] CONSTRAINING_FACETS = {
Facet.PATTERN,
Facet.ENUMERATION,
Facet.WHITESPACE,
Facet.MAX_INCLUSIVE,
Facet.MAX_EXCLUSIVE,
Facet.MIN_INCLUSIVE,
Facet.MIN_EXCLUSIVE
};
GMonthType()
{
super(new QName(XMLConstants.W3C_XML_SCHEMA_NS_URI, "gMonth"),
TypeLibrary.ANY_SIMPLE_TYPE);
}
public int[] getConstrainingFacets()
{
return CONSTRAINING_FACETS;
}
public void checkValid(String value, ValidationContext context)
throws DatatypeException
{
int len = value.length();
int state = 0;
int start = 0;
for (int i = 0; i < len; i++)
{
char c = value.charAt(i);
if (c >= 0x30 && c <= 0x39)
continue;
switch (state)
{
case 0: // year
if (c == '-')
{
switch (i)
{
case 0:
continue;
case 1:
state = 1;
start = i + 1;
continue;
default:
throw new DatatypeException(i, "illegal GMonth value");
}
}
break;
}
throw new DatatypeException(i, "illegal GMonth value");
}
switch (state)
{
case 1: // month
if (len - start != 2)
throw new DatatypeException("illegal GMonth value");
break;
default:
throw new DatatypeException("illegal GMonth value");
}
}
public Object createValue(String literal, ValidationContext context) {
try
{
GMonth ret = new GMonth();
ret.month = Integer.parseInt(literal.substring(2));
return ret;
}
catch (Exception e)
{
return null;
}
}
}
@@ -0,0 +1,177 @@
/* GYearMonthType.java --
Copyright (C) 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
GNU Classpath is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING. If not, write to the
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 USA.
Linking this library statically or dynamically with other modules is
making a combined work based on this library. Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.
As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module. An independent module is a module which is not derived from
or based on this library. If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
package gnu.xml.validation.datatype;
import javax.xml.XMLConstants;
import javax.xml.namespace.QName;
import org.relaxng.datatype.DatatypeException;
import org.relaxng.datatype.ValidationContext;
/**
* The XML Schema gYearMonth type.
*
* @author <a href='mailto:dog@gnu.org'>Chris Burdess</a>
*/
final class GYearMonthType
extends AtomicSimpleType
{
static class GYearMonth
implements Comparable
{
int year;
int month;
public int hashCode()
{
return year * 31 + month;
}
public boolean equals(Object other)
{
if (other instanceof GYearMonth)
{
GYearMonth gmy = (GYearMonth) other;
return gmy.year == year && gmy.month == month;
}
return false;
}
public int compareTo(Object other)
{
if (other instanceof GYearMonth)
{
GYearMonth gmy = (GYearMonth) other;
if (gmy.year == year)
{
if (gmy.month == month)
return 0;
return (month < gmy.month) ? -1 : 1;
}
return (year < gmy.year) ? -1 : 1;
}
return 0;
}
}
static final int[] CONSTRAINING_FACETS = {
Facet.PATTERN,
Facet.ENUMERATION,
Facet.WHITESPACE,
Facet.MAX_INCLUSIVE,
Facet.MAX_EXCLUSIVE,
Facet.MIN_INCLUSIVE,
Facet.MIN_EXCLUSIVE
};
GYearMonthType()
{
super(new QName(XMLConstants.W3C_XML_SCHEMA_NS_URI, "gYearMonth"),
TypeLibrary.ANY_SIMPLE_TYPE);
}
public int[] getConstrainingFacets()
{
return CONSTRAINING_FACETS;
}
public void checkValid(String value, ValidationContext context)
throws DatatypeException
{
super.checkValid(value, context);
int len = value.length();
int state = 0;
int start = 0;
for (int i = 0; i < len; i++)
{
char c = value.charAt(i);
if (c == '-' && i == 0)
{
start++;
continue;
}
if (c >= 0x30 && c <= 0x39)
continue;
switch (state)
{
case 0: // year
if (c == '-')
{
String year = value.substring(start, i);
if (year.length() < 4 || Integer.parseInt(year) == 0)
throw new DatatypeException(i, "illegal GYear value");
state = 1;
start = i + 1;
continue;
}
break;
}
throw new DatatypeException(i, "illegal GYear value");
}
switch (state)
{
case 1: // month
if (len - start != 2)
throw new DatatypeException("illegal GYear value");
break;
default:
throw new DatatypeException("illegal GYear value");
}
}
public Object createValue(String literal, ValidationContext context) {
try
{
int offset = 5;
if (literal.charAt(0) == '-')
offset++;
GYearMonth ret = new GYearMonth();
ret.year = Integer.parseInt(literal.substring(0, offset));
ret.month = Integer.parseInt(literal.substring(offset + 1));
return ret;
}
catch (Exception e)
{
return null;
}
}
}
@@ -0,0 +1,152 @@
/* GYearType.java --
Copyright (C) 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
GNU Classpath is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING. If not, write to the
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 USA.
Linking this library statically or dynamically with other modules is
making a combined work based on this library. Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.
As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module. An independent module is a module which is not derived from
or based on this library. If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
package gnu.xml.validation.datatype;
import javax.xml.XMLConstants;
import javax.xml.namespace.QName;
import org.relaxng.datatype.DatatypeException;
import org.relaxng.datatype.ValidationContext;
/**
* The XML Schema gYear type.
*
* @author <a href='mailto:dog@gnu.org'>Chris Burdess</a>
*/
final class GYearType
extends AtomicSimpleType
{
static class GYear
implements Comparable
{
int year;
public int hashCode()
{
return year;
}
public boolean equals(Object other)
{
if (other instanceof GYear)
return ((GYear) other).year == year;
return false;
}
public int compareTo(Object other)
{
if (other instanceof GYear)
{
GYear gy = (GYear) other;
if (gy.year == year)
return 0;
return (year < gy.year) ? -1 : 1;
}
return 0;
}
}
static final int[] CONSTRAINING_FACETS = {
Facet.PATTERN,
Facet.ENUMERATION,
Facet.WHITESPACE,
Facet.MAX_INCLUSIVE,
Facet.MAX_EXCLUSIVE,
Facet.MIN_INCLUSIVE,
Facet.MIN_EXCLUSIVE
};
GYearType()
{
super(new QName(XMLConstants.W3C_XML_SCHEMA_NS_URI, "gYear"),
TypeLibrary.ANY_SIMPLE_TYPE);
}
public int[] getConstrainingFacets()
{
return CONSTRAINING_FACETS;
}
public void checkValid(String value, ValidationContext context)
throws DatatypeException
{
super.checkValid(value, context);
int len = value.length();
int state = 0;
int start = 0;
for (int i = 0; i < len; i++)
{
char c = value.charAt(i);
if (c == '-' && i == 0)
{
start++;
continue;
}
if (c >= 0x30 && c <= 0x39)
continue;
throw new DatatypeException(i, "invalid GYear value");
}
switch (state)
{
case 0: // year
String year = value.substring(start, len);
if (year.length() < 4 || Integer.parseInt(year) == 0)
throw new DatatypeException("invalid GYear value");
break;
default:
throw new DatatypeException("invalid GYear value");
}
}
public Object createValue(String literal, ValidationContext context) {
try
{
GYear ret = new GYear();
ret.year = Integer.parseInt(literal);
return ret;
}
catch (Exception e)
{
return null;
}
}
}
@@ -0,0 +1,92 @@
/* HexBinaryType.java --
Copyright (C) 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
GNU Classpath is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING. If not, write to the
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 USA.
Linking this library statically or dynamically with other modules is
making a combined work based on this library. Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.
As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module. An independent module is a module which is not derived from
or based on this library. If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
package gnu.xml.validation.datatype;
import java.util.Collections;
import java.util.Set;
import javax.xml.XMLConstants;
import javax.xml.namespace.QName;
import org.relaxng.datatype.DatatypeException;
import org.relaxng.datatype.ValidationContext;
/**
* The XML Schema hexBinary type.
*
* @author <a href='mailto:dog@gnu.org'>Chris Burdess</a>
*/
final class HexBinaryType
extends AtomicSimpleType
{
static final String HEX = "0123456789ABCDEF";
static final int[] CONSTRAINING_FACETS = {
Facet.LENGTH,
Facet.MIN_LENGTH,
Facet.MAX_LENGTH,
Facet.PATTERN,
Facet.ENUMERATION,
Facet.WHITESPACE
};
HexBinaryType()
{
super(new QName(XMLConstants.W3C_XML_SCHEMA_NS_URI, "hexBinary"),
TypeLibrary.ANY_SIMPLE_TYPE);
}
public int[] getConstrainingFacets()
{
return CONSTRAINING_FACETS;
}
public void checkValid(String value, ValidationContext context)
throws DatatypeException
{
super.checkValid(value, context);
int len = value.length();
for (int i = 0; i < len; i++)
{
char c = value.charAt(i);
if (HEX.indexOf(c) == -1)
throw new DatatypeException(i, "invalid hexBinary value");
}
}
}
@@ -0,0 +1,87 @@
/* IDRefType.java --
Copyright (C) 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
GNU Classpath is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING. If not, write to the
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 USA.
Linking this library statically or dynamically with other modules is
making a combined work based on this library. Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.
As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module. An independent module is a module which is not derived from
or based on this library. If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
package gnu.xml.validation.datatype;
import javax.xml.XMLConstants;
import javax.xml.namespace.QName;
import org.relaxng.datatype.DatatypeException;
import org.relaxng.datatype.ValidationContext;
/**
* The XML Schema IDREF type.
*
* @author <a href='mailto:dog@gnu.org'>Chris Burdess</a>
*/
final class IDRefType
extends AtomicSimpleType
{
static final int[] CONSTRAINING_FACETS = {
Facet.LENGTH,
Facet.MIN_LENGTH,
Facet.MAX_LENGTH,
Facet.PATTERN,
Facet.ENUMERATION,
Facet.WHITESPACE
};
IDRefType()
{
super(new QName(XMLConstants.W3C_XML_SCHEMA_NS_URI, "IDREF"),
TypeLibrary.NCNAME);
}
public int[] getConstrainingFacets()
{
return CONSTRAINING_FACETS;
}
public void checkValid(String value, ValidationContext context)
throws DatatypeException
{
super.checkValid(value, context);
// TODO
}
public int getIdType()
{
return ID_TYPE_IDREF;
}
}
@@ -0,0 +1,87 @@
/* IDRefsType.java --
Copyright (C) 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
GNU Classpath is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING. If not, write to the
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 USA.
Linking this library statically or dynamically with other modules is
making a combined work based on this library. Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.
As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module. An independent module is a module which is not derived from
or based on this library. If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
package gnu.xml.validation.datatype;
import javax.xml.XMLConstants;
import javax.xml.namespace.QName;
import org.relaxng.datatype.DatatypeException;
import org.relaxng.datatype.ValidationContext;
/**
* The XML Schema IDREFS type.
*
* @author <a href='mailto:dog@gnu.org'>Chris Burdess</a>
*/
final class IDRefsType
extends AtomicSimpleType
{
static final int[] CONSTRAINING_FACETS = {
Facet.LENGTH,
Facet.MIN_LENGTH,
Facet.MAX_LENGTH,
Facet.PATTERN,
Facet.ENUMERATION,
Facet.WHITESPACE
};
IDRefsType()
{
super(new QName(XMLConstants.W3C_XML_SCHEMA_NS_URI, "IDREFS"),
TypeLibrary.IDREF);
}
public int[] getConstrainingFacets()
{
return CONSTRAINING_FACETS;
}
public void checkValid(String value, ValidationContext context)
throws DatatypeException
{
super.checkValid(value, context);
// TODO
}
public int getIdType()
{
return ID_TYPE_IDREFS;
}
}
@@ -0,0 +1,87 @@
/* IDType.java --
Copyright (C) 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
GNU Classpath is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING. If not, write to the
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 USA.
Linking this library statically or dynamically with other modules is
making a combined work based on this library. Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.
As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module. An independent module is a module which is not derived from
or based on this library. If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
package gnu.xml.validation.datatype;
import javax.xml.XMLConstants;
import javax.xml.namespace.QName;
import org.relaxng.datatype.DatatypeException;
import org.relaxng.datatype.ValidationContext;
/**
* The XML Schema ID type.
*
* @author <a href='mailto:dog@gnu.org'>Chris Burdess</a>
*/
final class IDType
extends AtomicSimpleType
{
static final int[] CONSTRAINING_FACETS = {
Facet.LENGTH,
Facet.MIN_LENGTH,
Facet.MAX_LENGTH,
Facet.PATTERN,
Facet.ENUMERATION,
Facet.WHITESPACE
};
IDType()
{
super(new QName(XMLConstants.W3C_XML_SCHEMA_NS_URI, "ID"),
TypeLibrary.NCNAME);
}
public int[] getConstrainingFacets()
{
return CONSTRAINING_FACETS;
}
public void checkValid(String value, ValidationContext context)
throws DatatypeException
{
super.checkValid(value, context);
// TODO
}
public int getIdType()
{
return ID_TYPE_ID;
}
}
@@ -0,0 +1,133 @@
/* IntType.java --
Copyright (C) 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
GNU Classpath is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING. If not, write to the
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 USA.
Linking this library statically or dynamically with other modules is
making a combined work based on this library. Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.
As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module. An independent module is a module which is not derived from
or based on this library. If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
package gnu.xml.validation.datatype;
import javax.xml.XMLConstants;
import javax.xml.namespace.QName;
import org.relaxng.datatype.DatatypeException;
import org.relaxng.datatype.ValidationContext;
/**
* The XML Schema int type.
*
* @author <a href='mailto:dog@gnu.org'>Chris Burdess</a>
*/
final class IntType
extends AtomicSimpleType
{
static final int[] CONSTRAINING_FACETS = {
Facet.TOTAL_DIGITS,
Facet.FRACTION_DIGITS,
Facet.PATTERN,
Facet.WHITESPACE,
Facet.ENUMERATION,
Facet.MAX_INCLUSIVE,
Facet.MAX_EXCLUSIVE,
Facet.MIN_INCLUSIVE,
Facet.MIN_EXCLUSIVE
};
static final String MAX_VALUE = "2147483647";
static final String MIN_VALUE = "2147483648";
static final int LENGTH = MAX_VALUE.length();
IntType()
{
super(new QName(XMLConstants.W3C_XML_SCHEMA_NS_URI, "int"),
TypeLibrary.LONG);
}
public int[] getConstrainingFacets()
{
return CONSTRAINING_FACETS;
}
public void checkValid(String value, ValidationContext context)
throws DatatypeException
{
super.checkValid(value, context);
int len = value.length();
if (len == 0)
throw new DatatypeException(0, "invalid int value");
int i = 0, off = 0;
boolean compare = false;
String compareTo = MAX_VALUE;
char c = value.charAt(0);
if (c == '+')
i++;
else if (c == '-')
{
compareTo = MIN_VALUE;
i++;
}
if (len - i > LENGTH)
throw new DatatypeException("invalid int value");
else if (len - i == LENGTH)
compare = true;
for (; i < len; i++)
{
c = value.charAt(i);
if (c >= 0x30 && c <= 0x39)
{
if (compare)
{
char d = compareTo.charAt(off);
if (Character.digit(c, 10) > Character.digit(d, 10))
throw new DatatypeException(i, "invalid int value");
}
off++;
continue;
}
throw new DatatypeException(i, "invalid int value");
}
}
public Object createValue(String literal, ValidationContext context) {
try
{
return new Integer(literal);
}
catch (NumberFormatException e)
{
return null;
}
}
}
@@ -0,0 +1,110 @@
/* IntegerType.java --
Copyright (C) 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
GNU Classpath is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING. If not, write to the
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 USA.
Linking this library statically or dynamically with other modules is
making a combined work based on this library. Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.
As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module. An independent module is a module which is not derived from
or based on this library. If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
package gnu.xml.validation.datatype;
import java.math.BigInteger;
import javax.xml.XMLConstants;
import javax.xml.namespace.QName;
import org.relaxng.datatype.DatatypeException;
import org.relaxng.datatype.ValidationContext;
/**
* The XML Schema integer type.
*
* @author <a href='mailto:dog@gnu.org'>Chris Burdess</a>
*/
final class IntegerType
extends AtomicSimpleType
{
static final int[] CONSTRAINING_FACETS = {
Facet.TOTAL_DIGITS,
Facet.FRACTION_DIGITS,
Facet.PATTERN,
Facet.WHITESPACE,
Facet.ENUMERATION,
Facet.MAX_INCLUSIVE,
Facet.MAX_EXCLUSIVE,
Facet.MIN_INCLUSIVE,
Facet.MIN_EXCLUSIVE
};
IntegerType()
{
super(new QName(XMLConstants.W3C_XML_SCHEMA_NS_URI, "integer"),
TypeLibrary.DECIMAL);
}
public int[] getConstrainingFacets()
{
return CONSTRAINING_FACETS;
}
public void checkValid(String value, ValidationContext context)
throws DatatypeException
{
super.checkValid(value, context);
int len = value.length();
if (len == 0)
throw new DatatypeException(0, "invalid integer value");
for (int i = 0; i < len; i++)
{
char c = value.charAt(i);
if (c >= 0x30 && c <= 0x39)
continue;
else if (c == '+' && i == 0)
continue;
else if (c == '-' && i == 0)
continue;
throw new DatatypeException(i, "invalid integer value");
}
}
public Object createValue(String literal, ValidationContext context) {
try
{
return new BigInteger(literal);
}
catch (NumberFormatException e)
{
return null;
}
}
}
@@ -0,0 +1,87 @@
/* LanguageType.java --
Copyright (C) 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
GNU Classpath is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING. If not, write to the
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 USA.
Linking this library statically or dynamically with other modules is
making a combined work based on this library. Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.
As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module. An independent module is a module which is not derived from
or based on this library. If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
package gnu.xml.validation.datatype;
import java.util.regex.Pattern;
import javax.xml.XMLConstants;
import javax.xml.namespace.QName;
import org.relaxng.datatype.DatatypeException;
import org.relaxng.datatype.ValidationContext;
/**
* The XML Schema language type.
*
* @author <a href='mailto:dog@gnu.org'>Chris Burdess</a>
*/
final class LanguageType
extends AtomicSimpleType
{
static final int[] CONSTRAINING_FACETS = {
Facet.LENGTH,
Facet.MIN_LENGTH,
Facet.MAX_LENGTH,
Facet.PATTERN,
Facet.ENUMERATION,
Facet.WHITESPACE
};
static final Pattern PATTERN =
Pattern.compile("[a-zA-Z]{1,8}(-[a-zA-Z0-9]{1,8})*");
LanguageType()
{
super(new QName(XMLConstants.W3C_XML_SCHEMA_NS_URI, "language"),
TypeLibrary.TOKEN);
}
public int[] getConstrainingFacets()
{
return CONSTRAINING_FACETS;
}
public void checkValid(String value, ValidationContext context)
throws DatatypeException
{
super.checkValid(value, context);
if (!PATTERN.matcher(value).matches())
throw new DatatypeException("invalid language value");
}
}
@@ -0,0 +1,72 @@
/* LengthFacet.java --
Copyright (C) 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
GNU Classpath is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING. If not, write to the
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 USA.
Linking this library statically or dynamically with other modules is
making a combined work based on this library. Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.
As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module. An independent module is a module which is not derived from
or based on this library. If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
package gnu.xml.validation.datatype;
/**
* The <code>length</code> facet.
*
* @author <a href='mailto:dog@gnu.org'>Chris Burdess</a>
*/
public final class LengthFacet
extends Facet
{
public final int value;
public final boolean fixed;
public LengthFacet(int value, boolean fixed, Annotation annotation)
{
super(LENGTH, annotation);
this.value = value;
this.fixed = fixed;
}
public int hashCode()
{
return value;
}
public boolean equals(Object other)
{
return (other instanceof LengthFacet &&
((LengthFacet) other).value == value);
}
}
@@ -0,0 +1,83 @@
/* ListSimpleType.java --
Copyright (C) 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
GNU Classpath is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING. If not, write to the
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 USA.
Linking this library statically or dynamically with other modules is
making a combined work based on this library. Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.
As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module. An independent module is a module which is not derived from
or based on this library. If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
package gnu.xml.validation.datatype;
import java.util.Set;
import java.util.StringTokenizer;
import javax.xml.namespace.QName;
import org.relaxng.datatype.DatatypeException;
import org.relaxng.datatype.ValidationContext;
/**
* An XML Schema list simple type.
*
* @author <a href='mailto:dog@gnu.org'>Chris Burdess</a>
*/
public class ListSimpleType
extends SimpleType
{
/**
* The type of the items in this list (atomic or union).
*/
public final SimpleType itemType;
public ListSimpleType(QName name, Set facets,
int fundamentalFacets, SimpleType baseType,
Annotation annotation, SimpleType itemType)
{
super(name, LIST, facets, fundamentalFacets, baseType, annotation);
this.itemType = itemType;
}
public void checkValid(String value, ValidationContext context)
throws DatatypeException
{
super.checkValid(value, context);
StringTokenizer st = new StringTokenizer(value, " ");
if (!st.hasMoreTokens())
throw new DatatypeException("invalid list value");
while (st.hasMoreTokens())
{
String token = st.nextToken();
itemType.checkValid(token, context);
}
}
}
@@ -0,0 +1,133 @@
/* LongType.java --
Copyright (C) 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
GNU Classpath is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING. If not, write to the
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 USA.
Linking this library statically or dynamically with other modules is
making a combined work based on this library. Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.
As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module. An independent module is a module which is not derived from
or based on this library. If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
package gnu.xml.validation.datatype;
import javax.xml.XMLConstants;
import javax.xml.namespace.QName;
import org.relaxng.datatype.DatatypeException;
import org.relaxng.datatype.ValidationContext;
/**
* The XML Schema long type.
*
* @author <a href='mailto:dog@gnu.org'>Chris Burdess</a>
*/
final class LongType
extends AtomicSimpleType
{
static final int[] CONSTRAINING_FACETS = {
Facet.TOTAL_DIGITS,
Facet.FRACTION_DIGITS,
Facet.PATTERN,
Facet.WHITESPACE,
Facet.ENUMERATION,
Facet.MAX_INCLUSIVE,
Facet.MAX_EXCLUSIVE,
Facet.MIN_INCLUSIVE,
Facet.MIN_EXCLUSIVE
};
static final String MAX_VALUE = "9223372036854775807";
static final String MIN_VALUE = "9223372036854775808";
static final int LENGTH = MAX_VALUE.length();
LongType()
{
super(new QName(XMLConstants.W3C_XML_SCHEMA_NS_URI, "long"),
TypeLibrary.INTEGER);
}
public int[] getConstrainingFacets()
{
return CONSTRAINING_FACETS;
}
public void checkValid(String value, ValidationContext context)
throws DatatypeException
{
super.checkValid(value, context);
int len = value.length();
if (len == 0)
throw new DatatypeException(0, "invalid long value");
int i = 0, off = 0;
boolean compare = false;
String compareTo = MAX_VALUE;
char c = value.charAt(0);
if (c == '+')
i++;
else if (c == '-')
{
compareTo = MIN_VALUE;
i++;
}
if (len - i > LENGTH)
throw new DatatypeException(i, "invalid long value");
else if (len - i == LENGTH)
compare = true;
for (; i < len; i++)
{
c = value.charAt(i);
if (c >= 0x30 && c <= 0x39)
{
if (compare)
{
char d = compareTo.charAt(off);
if (Character.digit(c, 10) > Character.digit(d, 10))
throw new DatatypeException(i, "invalid long value");
}
off++;
continue;
}
throw new DatatypeException(i, "invalid long value");
}
}
public Object createValue(String literal, ValidationContext context) {
try
{
return new Long(literal);
}
catch (NumberFormatException e)
{
return null;
}
}
}
@@ -0,0 +1,111 @@
/* MaxExclusiveFacet.java --
Copyright (C) 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
GNU Classpath is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING. If not, write to the
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 USA.
Linking this library statically or dynamically with other modules is
making a combined work based on this library. Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.
As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module. An independent module is a module which is not derived from
or based on this library. If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
package gnu.xml.validation.datatype;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.Date;
/**
* The <code>maxExclusive</code> facet.
*
* @author <a href='mailto:dog@gnu.org'>Chris Burdess</a>
*/
public final class MaxExclusiveFacet
extends Facet
{
public final Object value; // date or number
public final boolean fixed;
public MaxExclusiveFacet(Object value, boolean fixed, Annotation annotation)
{
super(MAX_EXCLUSIVE, annotation);
this.value = value;
this.fixed = fixed;
}
public int hashCode()
{
return value.hashCode();
}
public boolean equals(Object other)
{
return (other instanceof MaxExclusiveFacet &&
((MaxExclusiveFacet) other).value.equals(value));
}
boolean matches(Object test)
{
if (value instanceof Date)
{
Date dvalue = (Date) value;
if (!(test instanceof Date))
return false;
return ((Date) test).before(dvalue);
}
else if (value instanceof BigInteger)
{
BigInteger ivalue = (BigInteger) value;
if (!(test instanceof BigInteger))
return false;
return ((BigInteger) test).compareTo(ivalue) < 0;
}
else if (value instanceof BigDecimal)
{
BigDecimal dvalue = (BigDecimal) value;
if (!(test instanceof BigDecimal))
return false;
return ((BigDecimal) test).compareTo(dvalue) < 0;
}
else if (value instanceof Comparable)
{
if (!(test.getClass().equals(value.getClass())))
return false;
return ((Comparable) test).compareTo(value) < 0;
}
Number nvalue = (Number) value;
if (!(test instanceof Number))
return false;
return ((Number) test).doubleValue() < nvalue.doubleValue();
}
}
@@ -0,0 +1,112 @@
/* MaxInclusiveFacet.java --
Copyright (C) 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
GNU Classpath is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING. If not, write to the
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 USA.
Linking this library statically or dynamically with other modules is
making a combined work based on this library. Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.
As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module. An independent module is a module which is not derived from
or based on this library. If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
package gnu.xml.validation.datatype;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.Date;
/**
* The <code>maxInclusive</code> facet.
*
* @author <a href='mailto:dog@gnu.org'>Chris Burdess</a>
*/
public final class MaxInclusiveFacet
extends Facet
{
public final Object value;
public final boolean fixed;
public MaxInclusiveFacet(Object value, boolean fixed, Annotation annotation)
{
super(MAX_INCLUSIVE, annotation);
this.value = value;
this.fixed = fixed;
}
public int hashCode()
{
return value.hashCode();
}
public boolean equals(Object other)
{
return (other instanceof MaxInclusiveFacet &&
((MaxInclusiveFacet) other).value.equals(value));
}
boolean matches(Object test)
{
if (value instanceof Date)
{
Date dvalue = (Date) value;
if (!(test instanceof Date))
return false;
Date dtest = (Date) test;
return dtest.equals(dvalue) || dtest.before(dvalue);
}
else if (value instanceof BigInteger)
{
BigInteger ivalue = (BigInteger) value;
if (!(test instanceof BigInteger))
return false;
return ((BigInteger) test).compareTo(ivalue) <= 0;
}
else if (value instanceof BigDecimal)
{
BigDecimal dvalue = (BigDecimal) value;
if (!(test instanceof BigDecimal))
return false;
return ((BigDecimal) test).compareTo(dvalue) <= 0;
}
else if (value instanceof Comparable)
{
if (!(test.getClass().equals(value.getClass())))
return false;
return ((Comparable) test).compareTo(value) <= 0;
}
Number nvalue = (Number) value;
if (!(test instanceof Number))
return false;
return ((Number) test).doubleValue() <= nvalue.doubleValue();
}
}
@@ -1,5 +1,5 @@
/* LocationImpl.java --
Copyright (C) 2005 Free Software Foundation, Inc.
/* MaxLengthFacet.java --
Copyright (C) 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -35,54 +35,37 @@ this exception to your version of the library, but you are not
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
package gnu.xml.stream;
import javax.xml.stream.Location;
package gnu.xml.validation.datatype;
/**
* Information about the location of an XML event within the underlying
* stream.
* The <code>maxLength</code> facet.
*
* @author <a href='mailto:dog@gnu.org'>Chris Burdess</a>
*/
public class LocationImpl
implements Location
public final class MaxLengthFacet
extends Facet
{
protected final int offset;
public final int value;
protected final int col;
public final boolean fixed;
protected final int line;
protected final String systemId;
protected LocationImpl(int offset, int col, int line, String systemId)
public MaxLengthFacet(int value, boolean fixed, Annotation annotation)
{
this.offset = offset;
this.col = col;
this.line = line;
this.systemId = systemId;
super(MAX_LENGTH, annotation);
this.value = value;
this.fixed = fixed;
}
public int getLineNumber()
public int hashCode()
{
return line;
return value;
}
public int getColumnNumber()
public boolean equals(Object other)
{
return col;
}
public int getCharacterOffset()
{
return offset;
}
public String getLocationURI()
{
return systemId;
return (other instanceof MaxLengthFacet &&
((MaxLengthFacet) other).value == value);
}
}
@@ -0,0 +1,111 @@
/* MinExclusiveFacet.java --
Copyright (C) 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
GNU Classpath is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING. If not, write to the
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 USA.
Linking this library statically or dynamically with other modules is
making a combined work based on this library. Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.
As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module. An independent module is a module which is not derived from
or based on this library. If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
package gnu.xml.validation.datatype;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.Date;
/**
* The <code>minExclusive</code> facet.
*
* @author <a href='mailto:dog@gnu.org'>Chris Burdess</a>
*/
public final class MinExclusiveFacet
extends Facet
{
public final Object value;
public final boolean fixed;
public MinExclusiveFacet(Object value, boolean fixed, Annotation annotation)
{
super(MIN_EXCLUSIVE, annotation);
this.value = value;
this.fixed = fixed;
}
public int hashCode()
{
return value.hashCode();
}
public boolean equals(Object other)
{
return (other instanceof MinExclusiveFacet &&
((MinExclusiveFacet) other).value.equals(value));
}
boolean matches(Object test)
{
if (value instanceof Date)
{
Date dvalue = (Date) value;
if (!(test instanceof Date))
return false;
return ((Date) test).after(dvalue);
}
else if (value instanceof BigInteger)
{
BigInteger ivalue = (BigInteger) value;
if (!(test instanceof BigInteger))
return false;
return ((BigInteger) test).compareTo(ivalue) > 0;
}
else if (value instanceof BigDecimal)
{
BigDecimal dvalue = (BigDecimal) value;
if (!(test instanceof BigDecimal))
return false;
return ((BigDecimal) test).compareTo(dvalue) > 0;
}
else if (value instanceof Comparable)
{
if (!(test.getClass().equals(value.getClass())))
return false;
return ((Comparable) test).compareTo(value) > 0;
}
Number nvalue = (Number) value;
if (!(test instanceof Number))
return false;
return ((Number) test).doubleValue() > nvalue.doubleValue();
}
}
@@ -0,0 +1,112 @@
/* MinInclusiveFacet.java --
Copyright (C) 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
GNU Classpath is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING. If not, write to the
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 USA.
Linking this library statically or dynamically with other modules is
making a combined work based on this library. Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.
As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module. An independent module is a module which is not derived from
or based on this library. If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
package gnu.xml.validation.datatype;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.Date;
/**
* The <code>minInclusive</code> facet.
*
* @author <a href='mailto:dog@gnu.org'>Chris Burdess</a>
*/
public final class MinInclusiveFacet
extends Facet
{
public final Object value;
public final boolean fixed;
public MinInclusiveFacet(Object value, boolean fixed, Annotation annotation)
{
super(MIN_INCLUSIVE, annotation);
this.value = value;
this.fixed = fixed;
}
public int hashCode()
{
return value.hashCode();
}
public boolean equals(Object other)
{
return (other instanceof MinInclusiveFacet &&
((MinInclusiveFacet) other).value.equals(value));
}
boolean matches(Object test)
{
if (value instanceof Date)
{
Date dvalue = (Date) value;
if (!(test instanceof Date))
return false;
Date dtest = (Date) test;
return dtest.equals(dvalue) || dtest.after(dvalue);
}
else if (value instanceof BigInteger)
{
BigInteger ivalue = (BigInteger) value;
if (!(test instanceof BigInteger))
return false;
return ((BigInteger) test).compareTo(ivalue) >= 0;
}
else if (value instanceof BigDecimal)
{
BigDecimal dvalue = (BigDecimal) value;
if (!(test instanceof BigDecimal))
return false;
return ((BigDecimal) test).compareTo(dvalue) >= 0;
}
else if (value instanceof Comparable)
{
if (!(test.getClass().equals(value.getClass())))
return false;
return ((Comparable) test).compareTo(value) >= 0;
}
Number nvalue = (Number) value;
if (!(test instanceof Number))
return false;
return ((Number) test).doubleValue() >= nvalue.doubleValue();
}
}
@@ -0,0 +1,72 @@
/* MinLengthFacet.java --
Copyright (C) 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
GNU Classpath is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING. If not, write to the
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 USA.
Linking this library statically or dynamically with other modules is
making a combined work based on this library. Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.
As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module. An independent module is a module which is not derived from
or based on this library. If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
package gnu.xml.validation.datatype;
/**
* The <code>minLength</code> facet.
*
* @author <a href='mailto:dog@gnu.org'>Chris Burdess</a>
*/
public final class MinLengthFacet
extends Facet
{
public final int value;
public final boolean fixed;
public MinLengthFacet(int value, boolean fixed, Annotation annotation)
{
super(MIN_LENGTH, annotation);
this.value = value;
this.fixed = fixed;
}
public int hashCode()
{
return value;
}
public boolean equals(Object other)
{
return (other instanceof MinLengthFacet &&
((MinLengthFacet) other).value == value);
}
}
@@ -0,0 +1,111 @@
/* NCNameType.java --
Copyright (C) 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
GNU Classpath is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING. If not, write to the
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 USA.
Linking this library statically or dynamically with other modules is
making a combined work based on this library. Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.
As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module. An independent module is a module which is not derived from
or based on this library. If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
package gnu.xml.validation.datatype;
import java.io.IOException;
import javax.xml.XMLConstants;
import javax.xml.namespace.QName;
import org.relaxng.datatype.DatatypeException;
import org.relaxng.datatype.ValidationContext;
import gnu.xml.stream.UnicodeReader;
import gnu.xml.stream.XMLParser;
/**
* The XML Schema NCName type.
*
* @author <a href='mailto:dog@gnu.org'>Chris Burdess</a>
*/
final class NCNameType
extends AtomicSimpleType
{
static final int[] CONSTRAINING_FACETS = {
Facet.LENGTH,
Facet.MIN_LENGTH,
Facet.MAX_LENGTH,
Facet.PATTERN,
Facet.ENUMERATION,
Facet.WHITESPACE
};
NCNameType()
{
super(new QName(XMLConstants.W3C_XML_SCHEMA_NS_URI, "NCName"),
TypeLibrary.NAME);
}
public int[] getConstrainingFacets()
{
return CONSTRAINING_FACETS;
}
public void checkValid(String value, ValidationContext context)
throws DatatypeException
{
super.checkValid(value, context);
try
{
int[] cp = UnicodeReader.toCodePointArray(value);
if (cp.length == 0)
throw new DatatypeException("invalid NCName value");
// XXX XML 1.1 documents?
if (cp[0] == ':' || !XMLParser.isNameStartCharacter(cp[0], false))
throw new DatatypeException(0, "invalid NCName value");
boolean seenColon = false;
for (int i = 1; i < cp.length; i++)
{
if (cp[i] == ':')
{
if (seenColon || (i + 1 == cp.length))
throw new DatatypeException(i, "invalid NCName value");
seenColon = true;
}
else if (!XMLParser.isNameCharacter(cp[i], false))
throw new DatatypeException(i, "invalid NCName value");
}
}
catch (IOException e)
{
DatatypeException e2 = new DatatypeException("invalid NCName value");
e2.initCause(e);
throw e2;
}
}
}
@@ -0,0 +1,102 @@
/* NMTokenType.java --
Copyright (C) 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
GNU Classpath is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING. If not, write to the
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 USA.
Linking this library statically or dynamically with other modules is
making a combined work based on this library. Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.
As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module. An independent module is a module which is not derived from
or based on this library. If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
package gnu.xml.validation.datatype;
import java.io.IOException;
import javax.xml.XMLConstants;
import javax.xml.namespace.QName;
import org.relaxng.datatype.DatatypeException;
import org.relaxng.datatype.ValidationContext;
import gnu.xml.stream.UnicodeReader;
import gnu.xml.stream.XMLParser;
/**
* The XML Schema NMTOKEN type.
*
* @author <a href='mailto:dog@gnu.org'>Chris Burdess</a>
*/
final class NMTokenType
extends AtomicSimpleType
{
static final int[] CONSTRAINING_FACETS = {
Facet.LENGTH,
Facet.MIN_LENGTH,
Facet.MAX_LENGTH,
Facet.PATTERN,
Facet.ENUMERATION,
Facet.WHITESPACE
};
NMTokenType()
{
super(new QName(XMLConstants.W3C_XML_SCHEMA_NS_URI, "NMTOKEN"),
TypeLibrary.TOKEN);
}
public int[] getConstrainingFacets()
{
return CONSTRAINING_FACETS;
}
public void checkValid(String value, ValidationContext context)
throws DatatypeException
{
super.checkValid(value, context);
try
{
int[] cp = UnicodeReader.toCodePointArray(value);
if (cp.length == 0)
throw new DatatypeException("invalid NMTOKEN value");
for (int i = 0; i < cp.length; i++)
{
// XXX XML 1.1 documents?
if (!XMLParser.isNameCharacter(cp[i], false))
throw new DatatypeException(i, "invalid NMTOKEN value");
}
}
catch (IOException e)
{
DatatypeException e2 = new DatatypeException("invalid NMTOKEN value");
e2.initCause(e);
throw e2;
}
}
}
@@ -0,0 +1,124 @@
/* NMTokensType.java --
Copyright (C) 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
GNU Classpath is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING. If not, write to the
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 USA.
Linking this library statically or dynamically with other modules is
making a combined work based on this library. Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.
As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module. An independent module is a module which is not derived from
or based on this library. If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
package gnu.xml.validation.datatype;
import java.io.IOException;
import javax.xml.XMLConstants;
import javax.xml.namespace.QName;
import org.relaxng.datatype.DatatypeException;
import org.relaxng.datatype.ValidationContext;
import gnu.xml.stream.UnicodeReader;
import gnu.xml.stream.XMLParser;
/**
* The XML Schema NMTOKENS type.
*
* @author <a href='mailto:dog@gnu.org'>Chris Burdess</a>
*/
final class NMTokensType
extends AtomicSimpleType
{
static final int[] CONSTRAINING_FACETS = {
Facet.LENGTH,
Facet.MIN_LENGTH,
Facet.MAX_LENGTH,
Facet.PATTERN,
Facet.ENUMERATION,
Facet.WHITESPACE
};
NMTokensType()
{
super(new QName(XMLConstants.W3C_XML_SCHEMA_NS_URI, "NMTOKENS"),
TypeLibrary.NMTOKEN);
}
public int[] getConstrainingFacets()
{
return CONSTRAINING_FACETS;
}
public void checkValid(String value, ValidationContext context)
throws DatatypeException
{
super.checkValid(value, context);
int len = value.length();
StringBuffer buf = new StringBuffer();
for (int i = 0; i < len; i++)
{
char c = value.charAt(i);
if (c == ' ')
{
String token = buf.toString();
if (token.length() > 0)
checkNmtoken(token, i);
buf.setLength(0);
}
else
buf.append(c);
}
checkNmtoken(buf.toString(), len);
}
private void checkNmtoken(String text, int i)
throws DatatypeException
{
try
{
int[] cp = UnicodeReader.toCodePointArray(text);
if (cp.length == 0)
throw new DatatypeException("invalid NMTOKEN value");
for (int j = 0; j < cp.length; j++)
{
// XXX XML 1.1 documents?
if (!XMLParser.isNameCharacter(cp[j], false))
throw new DatatypeException(i, "invalid NMTOKEN value");
}
}
catch (IOException e)
{
DatatypeException e2 = new DatatypeException("invalid NMTOKEN value");
e2.initCause(e);
throw e2;
}
}
}
@@ -0,0 +1,104 @@
/* NameType.java --
Copyright (C) 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
GNU Classpath is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING. If not, write to the
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 USA.
Linking this library statically or dynamically with other modules is
making a combined work based on this library. Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.
As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module. An independent module is a module which is not derived from
or based on this library. If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
package gnu.xml.validation.datatype;
import java.io.IOException;
import javax.xml.XMLConstants;
import javax.xml.namespace.QName;
import org.relaxng.datatype.DatatypeException;
import org.relaxng.datatype.ValidationContext;
import gnu.xml.stream.UnicodeReader;
import gnu.xml.stream.XMLParser;
/**
* The XML Schema Name type.
*
* @author <a href='mailto:dog@gnu.org'>Chris Burdess</a>
*/
final class NameType
extends AtomicSimpleType
{
static final int[] CONSTRAINING_FACETS = {
Facet.LENGTH,
Facet.MIN_LENGTH,
Facet.MAX_LENGTH,
Facet.PATTERN,
Facet.ENUMERATION,
Facet.WHITESPACE
};
NameType()
{
super(new QName(XMLConstants.W3C_XML_SCHEMA_NS_URI, "Name"),
TypeLibrary.TOKEN);
}
public int[] getConstrainingFacets()
{
return CONSTRAINING_FACETS;
}
public void checkValid(String value, ValidationContext context)
throws DatatypeException
{
super.checkValid(value, context);
try
{
int[] cp = UnicodeReader.toCodePointArray(value);
if (cp.length == 0)
throw new DatatypeException("invalid Name value");
// XXX XML 1.1 documents?
if (!XMLParser.isNameStartCharacter(cp[0], false))
throw new DatatypeException(0, "invalid Name value");
for (int i = 1; i < cp.length; i++)
{
if (!XMLParser.isNameCharacter(cp[i], false))
throw new DatatypeException(i, "invalid Name value");
}
}
catch (IOException e)
{
DatatypeException e2 = new DatatypeException("invalid Name value");
e2.initCause(e);
throw e2;
}
}
}
@@ -0,0 +1,111 @@
/* NegativeIntegerType.java --
Copyright (C) 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
GNU Classpath is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING. If not, write to the
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 USA.
Linking this library statically or dynamically with other modules is
making a combined work based on this library. Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.
As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module. An independent module is a module which is not derived from
or based on this library. If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
package gnu.xml.validation.datatype;
import java.math.BigInteger;
import javax.xml.XMLConstants;
import javax.xml.namespace.QName;
import org.relaxng.datatype.DatatypeException;
import org.relaxng.datatype.ValidationContext;
/**
* The XML Schema negativeInteger type.
*
* @author <a href='mailto:dog@gnu.org'>Chris Burdess</a>
*/
final class NegativeIntegerType
extends AtomicSimpleType
{
static final int[] CONSTRAINING_FACETS = {
Facet.TOTAL_DIGITS,
Facet.FRACTION_DIGITS,
Facet.PATTERN,
Facet.WHITESPACE,
Facet.ENUMERATION,
Facet.MAX_INCLUSIVE,
Facet.MAX_EXCLUSIVE,
Facet.MIN_INCLUSIVE,
Facet.MIN_EXCLUSIVE
};
NegativeIntegerType()
{
super(new QName(XMLConstants.W3C_XML_SCHEMA_NS_URI, "negativeInteger"),
TypeLibrary.NON_POSITIVE_INTEGER);
}
public int[] getConstrainingFacets()
{
return CONSTRAINING_FACETS;
}
public void checkValue(String value, ValidationContext context)
throws DatatypeException
{
super.checkValid(value, context);
int len = value.length();
if (len == 0)
throw new DatatypeException(0, "invalid negative integer value");
for (int i = 0; i < len; i++)
{
char c = value.charAt(i);
if (c == '-')
{
if (i == 0)
continue;
}
else if (c >= 0x30 && c <= 0x39)
continue;
throw new DatatypeException(i, "invalid negative integer value");
}
}
public Object createValue(String literal, ValidationContext context) {
try
{
return new BigInteger(literal);
}
catch (NumberFormatException e)
{
return null;
}
}
}
@@ -0,0 +1,121 @@
/* NonNegativeIntegerType.java --
Copyright (C) 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
GNU Classpath is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING. If not, write to the
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 USA.
Linking this library statically or dynamically with other modules is
making a combined work based on this library. Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.
As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module. An independent module is a module which is not derived from
or based on this library. If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
package gnu.xml.validation.datatype;
import java.math.BigInteger;
import javax.xml.XMLConstants;
import javax.xml.namespace.QName;
import org.relaxng.datatype.DatatypeException;
import org.relaxng.datatype.ValidationContext;
/**
* The XML Schema nonNegativeInteger type.
*
* @author <a href='mailto:dog@gnu.org'>Chris Burdess</a>
*/
final class NonNegativeIntegerType
extends AtomicSimpleType
{
static final int[] CONSTRAINING_FACETS = {
Facet.TOTAL_DIGITS,
Facet.FRACTION_DIGITS,
Facet.PATTERN,
Facet.WHITESPACE,
Facet.ENUMERATION,
Facet.MAX_INCLUSIVE,
Facet.MAX_EXCLUSIVE,
Facet.MIN_INCLUSIVE,
Facet.MIN_EXCLUSIVE
};
NonNegativeIntegerType()
{
super(new QName(XMLConstants.W3C_XML_SCHEMA_NS_URI, "nonNegativeInteger"),
TypeLibrary.INTEGER);
}
public int[] getConstrainingFacets()
{
return CONSTRAINING_FACETS;
}
public void checkValid(String value, ValidationContext context)
throws DatatypeException
{
super.checkValid(value, context);
int len = value.length();
if (len == 0)
throw new DatatypeException(0, "invalid non-negative integer value");
boolean negative = false;
for (int i = 0; i < len; i++)
{
char c = value.charAt(i);
if (c == 0x30)
continue;
else if (c >= 0x31 && c <= 0x39)
{
if (negative)
throw new DatatypeException(i,
"invalid non-negative integer value");
continue;
}
else if (c == '+' && i == 0)
continue;
else if (c == '-' && i == 0)
{
negative = true;
continue;
}
throw new DatatypeException(i, "invalid non-negative integer value");
}
}
public Object createValue(String literal, ValidationContext context) {
try
{
return new BigInteger(literal);
}
catch (NumberFormatException e)
{
return null;
}
}
}
@@ -0,0 +1,121 @@
/* NonPositiveIntegerType.java --
Copyright (C) 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
GNU Classpath is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING. If not, write to the
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 USA.
Linking this library statically or dynamically with other modules is
making a combined work based on this library. Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.
As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module. An independent module is a module which is not derived from
or based on this library. If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
package gnu.xml.validation.datatype;
import java.math.BigInteger;
import javax.xml.XMLConstants;
import javax.xml.namespace.QName;
import org.relaxng.datatype.DatatypeException;
import org.relaxng.datatype.ValidationContext;
/**
* The XML Schema nonPositiveInteger type.
*
* @author <a href='mailto:dog@gnu.org'>Chris Burdess</a>
*/
final class NonPositiveIntegerType
extends AtomicSimpleType
{
static final int[] CONSTRAINING_FACETS = {
Facet.TOTAL_DIGITS,
Facet.FRACTION_DIGITS,
Facet.PATTERN,
Facet.WHITESPACE,
Facet.ENUMERATION,
Facet.MAX_INCLUSIVE,
Facet.MAX_EXCLUSIVE,
Facet.MIN_INCLUSIVE,
Facet.MIN_EXCLUSIVE
};
NonPositiveIntegerType()
{
super(new QName(XMLConstants.W3C_XML_SCHEMA_NS_URI, "nonPositiveInteger"),
TypeLibrary.INTEGER);
}
public int[] getConstrainingFacets()
{
return CONSTRAINING_FACETS;
}
public void checkValid(String value, ValidationContext context)
throws DatatypeException
{
super.checkValid(value, context);
int len = value.length();
if (len == 0)
throw new DatatypeException(0, "invalid non-positive integer value");
boolean positive = true;
for (int i = 0; i < len; i++)
{
char c = value.charAt(i);
if (c == 0x30)
continue;
else if (c >= 0x31 && c <= 0x39)
{
if (positive)
throw new DatatypeException(i,
"invalid non-positive integer value");
continue;
}
else if (c == '+' && i == 0)
continue;
else if (c == '-' && i == 0)
{
positive = false;
continue;
}
throw new DatatypeException(i, "invalid non-positive integer value");
}
}
public Object createValue(String literal, ValidationContext context) {
try
{
return new BigInteger(literal);
}
catch (NumberFormatException e)
{
return null;
}
}
}
@@ -0,0 +1,88 @@
/* NormalizedStringType.java --
Copyright (C) 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
GNU Classpath is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING. If not, write to the
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 USA.
Linking this library statically or dynamically with other modules is
making a combined work based on this library. Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.
As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module. An independent module is a module which is not derived from
or based on this library. If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
package gnu.xml.validation.datatype;
import javax.xml.XMLConstants;
import javax.xml.namespace.QName;
import org.relaxng.datatype.DatatypeException;
import org.relaxng.datatype.ValidationContext;
/**
* The XML Schema normalizedString type.
*
* @author <a href='mailto:dog@gnu.org'>Chris Burdess</a>
*/
final class NormalizedStringType
extends AtomicSimpleType
{
static final int[] CONSTRAINING_FACETS = {
Facet.LENGTH,
Facet.MIN_LENGTH,
Facet.MAX_LENGTH,
Facet.PATTERN,
Facet.ENUMERATION,
Facet.WHITESPACE
};
NormalizedStringType()
{
super(new QName(XMLConstants.W3C_XML_SCHEMA_NS_URI, "normalizedString"),
TypeLibrary.STRING);
}
public int[] getConstrainingFacets()
{
return CONSTRAINING_FACETS;
}
public void checkValid(String value, ValidationContext context)
throws DatatypeException
{
super.checkValid(value, context);
int len = value.length();
for (int i = 0; i < len; i++)
{
char c = value.charAt(i);
if (c == 0x0a || c == 0x0d || c == 0x09)
throw new DatatypeException(i, "invalid normalized-string value");
}
}
}
@@ -0,0 +1,90 @@
/* NotationType.java --
Copyright (C) 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
GNU Classpath is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING. If not, write to the
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 USA.
Linking this library statically or dynamically with other modules is
making a combined work based on this library. Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.
As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module. An independent module is a module which is not derived from
or based on this library. If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
package gnu.xml.validation.datatype;
import java.util.Collections;
import java.util.Set;
import javax.xml.XMLConstants;
import javax.xml.namespace.QName;
import org.relaxng.datatype.DatatypeException;
import org.relaxng.datatype.ValidationContext;
/**
* The XML Schema NOTATION type.
*
* @author <a href='mailto:dog@gnu.org'>Chris Burdess</a>
*/
final class NotationType
extends AtomicSimpleType
{
static final int[] CONSTRAINING_FACETS = {
Facet.LENGTH,
Facet.MIN_LENGTH,
Facet.MAX_LENGTH,
Facet.PATTERN,
Facet.ENUMERATION,
Facet.WHITESPACE
};
NotationType()
{
super(new QName(XMLConstants.W3C_XML_SCHEMA_NS_URI, "NOTATION"),
TypeLibrary.ANY_SIMPLE_TYPE);
}
public int[] getConstrainingFacets()
{
return CONSTRAINING_FACETS;
}
public void checkValid(String value, ValidationContext context)
throws DatatypeException
{
super.checkValid(value, context);
if (!context.isNotation(value))
throw new DatatypeException("invalid NOTATION value");
}
public boolean isContextDependent()
{
return true;
}
}
@@ -0,0 +1,71 @@
/* PatternFacet.java --
Copyright (C) 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
GNU Classpath is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING. If not, write to the
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 USA.
Linking this library statically or dynamically with other modules is
making a combined work based on this library. Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.
As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module. An independent module is a module which is not derived from
or based on this library. If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
package gnu.xml.validation.datatype;
import java.util.regex.Pattern;
/**
* The <code>pattern</code> facet.
*
* @author <a href='mailto:dog@gnu.org'>Chris Burdess</a>
*/
public final class PatternFacet
extends Facet
{
public final Pattern value;
public PatternFacet(Pattern value, Annotation annotation)
{
super(PATTERN, annotation);
this.value = value;
}
public int hashCode()
{
return value.hashCode();
}
public boolean equals(Object other)
{
return (other instanceof PatternFacet &&
((PatternFacet) other).value.equals(value));
}
}
@@ -0,0 +1,111 @@
/* PositiveIntegerType.java --
Copyright (C) 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
GNU Classpath is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING. If not, write to the
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 USA.
Linking this library statically or dynamically with other modules is
making a combined work based on this library. Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.
As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module. An independent module is a module which is not derived from
or based on this library. If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
package gnu.xml.validation.datatype;
import java.math.BigInteger;
import javax.xml.XMLConstants;
import javax.xml.namespace.QName;
import org.relaxng.datatype.DatatypeException;
import org.relaxng.datatype.ValidationContext;
/**
* The XML Schema positiveInteger type.
*
* @author <a href='mailto:dog@gnu.org'>Chris Burdess</a>
*/
final class PositiveIntegerType
extends AtomicSimpleType
{
static final int[] CONSTRAINING_FACETS = {
Facet.TOTAL_DIGITS,
Facet.FRACTION_DIGITS,
Facet.PATTERN,
Facet.WHITESPACE,
Facet.ENUMERATION,
Facet.MAX_INCLUSIVE,
Facet.MAX_EXCLUSIVE,
Facet.MIN_INCLUSIVE,
Facet.MIN_EXCLUSIVE
};
PositiveIntegerType()
{
super(new QName(XMLConstants.W3C_XML_SCHEMA_NS_URI, "positiveInteger"),
TypeLibrary.NON_NEGATIVE_INTEGER);
}
public int[] getConstrainingFacets()
{
return CONSTRAINING_FACETS;
}
public void checkValid(String value, ValidationContext context)
throws DatatypeException
{
super.checkValid(value, context);
int len = value.length();
if (len == 0)
throw new DatatypeException(0, "invalid positive integer value");
for (int i = 0; i < len; i++)
{
char c = value.charAt(i);
if (c == '+')
{
if (i == 0)
continue;
}
else if (c >= 0x30 && c <= 0x39)
continue;
throw new DatatypeException(i, "invalid positive integer value");
}
}
public Object createValue(String literal, ValidationContext context) {
try
{
return new BigInteger(literal);
}
catch (NumberFormatException e)
{
return null;
}
}
}

Some files were not shown because too many files have changed in this diff Show More