|
Java example source code file (XString.java)
The XString.java Java example source code
/*
* reserved comment block
* DO NOT REMOVE OR ALTER!
*/
/*
* Copyright 1999-2004 The Apache Software Foundation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/*
* $Id: XString.java,v 1.2.4.1 2005/09/14 20:47:20 jeffsuttor Exp $
*/
package com.sun.org.apache.xpath.internal.objects;
import java.util.Locale;
import com.sun.org.apache.xml.internal.dtm.DTM;
import com.sun.org.apache.xml.internal.utils.XMLCharacterRecognizer;
import com.sun.org.apache.xml.internal.utils.XMLString;
import com.sun.org.apache.xml.internal.utils.XMLStringFactory;
import com.sun.org.apache.xpath.internal.ExpressionOwner;
import com.sun.org.apache.xpath.internal.XPathContext;
import com.sun.org.apache.xpath.internal.XPathVisitor;
/**
* This class represents an XPath string object, and is capable of
* converting the string to other types, such as a number.
* @xsl.usage general
*/
public class XString extends XObject implements XMLString
{
static final long serialVersionUID = 2020470518395094525L;
/** Empty string XString object */
public static final XString EMPTYSTRING = new XString("");
/**
* Construct a XString object. This constructor exists for derived classes.
*
* @param val String object this will wrap.
*/
protected XString(Object val)
{
super(val);
}
/**
* Construct a XNodeSet object.
*
* @param val String object this will wrap.
*/
public XString(String val)
{
super(val);
}
/**
* Tell that this is a CLASS_STRING.
*
* @return type CLASS_STRING
*/
public int getType()
{
return CLASS_STRING;
}
/**
* Given a request type, return the equivalent string.
* For diagnostic purposes.
*
* @return type string "#STRING"
*/
public String getTypeString()
{
return "#STRING";
}
/**
* Tell if this object contains a java String object.
*
* @return true if this XMLString can return a string without creating one.
*/
public boolean hasString()
{
return true;
}
/**
* Cast result object to a number.
*
* @return 0.0 if this string is null, numeric value of this string
* or NaN
*/
public double num()
{
return toDouble();
}
/**
* Convert a string to a double -- Allowed input is in fixed
* notation ddd.fff.
*
* @return A double value representation of the string, or return Double.NaN
* if the string can not be converted.
*/
public double toDouble()
{
/* XMLCharacterRecognizer.isWhiteSpace(char c) methods treats the following
* characters as white space characters.
* ht - horizontal tab, nl - newline , cr - carriage return and sp - space
* trim() methods by default also takes care of these white space characters
* So trim() method is used to remove leading and trailing white spaces.
*/
XMLString s = trim();
double result = Double.NaN;
for (int i = 0; i < s.length(); i++)
{
char c = s.charAt(i);
if (c != '-' && c != '.' && ( c < 0X30 || c > 0x39)) {
// The character is not a '-' or a '.' or a digit
// then return NaN because something is wrong.
return result;
}
}
try
{
result = Double.parseDouble(s.toString());
} catch (NumberFormatException e){}
return result;
}
/**
* Cast result object to a boolean.
*
* @return True if the length of this string object is greater
* than 0.
*/
public boolean bool()
{
return str().length() > 0;
}
/**
* Cast result object to a string.
*
* @return The string this wraps or the empty string if null
*/
public XMLString xstr()
{
return this;
}
/**
* Cast result object to a string.
*
* @return The string this wraps or the empty string if null
*/
public String str()
{
return (null != m_obj) ? ((String) m_obj) : "";
}
/**
* Cast result object to a result tree fragment.
*
* @param support Xpath context to use for the conversion
*
* @return A document fragment with this string as a child node
*/
public int rtf(XPathContext support)
{
DTM frag = support.createDocumentFragment();
frag.appendTextChild(str());
return frag.getDocument();
}
/**
* Directly call the
* characters method on the passed ContentHandler for the
* string-value. Multiple calls to the
* ContentHandler's characters methods may well occur for a single call to
* this method.
*
* @param ch A non-null reference to a ContentHandler.
*
* @throws org.xml.sax.SAXException
*/
public void dispatchCharactersEvents(org.xml.sax.ContentHandler ch)
throws org.xml.sax.SAXException
{
String str = str();
ch.characters(str.toCharArray(), 0, str.length());
}
/**
* Directly call the
* comment method on the passed LexicalHandler for the
* string-value.
*
* @param lh A non-null reference to a LexicalHandler.
*
* @throws org.xml.sax.SAXException
*/
public void dispatchAsComment(org.xml.sax.ext.LexicalHandler lh)
throws org.xml.sax.SAXException
{
String str = str();
lh.comment(str.toCharArray(), 0, str.length());
}
/**
* Returns the length of this string.
*
* @return the length of the sequence of characters represented by this
* object.
*/
public int length()
{
return str().length();
}
/**
* Returns the character at the specified index. An index ranges
* from <code>0 to srcBegin is negative.
* <li>srcBegin is greater than srcEnd
* <li>srcEnd is greater than the length of this
* string
* <li>dstBegin is negative
* <li>dstBegin+(srcEnd-srcBegin) is larger than
* <code>dst.length
* @exception NullPointerException if <code>dst is null
*/
public void getChars(int srcBegin, int srcEnd, char dst[], int dstBegin)
{
str().getChars(srcBegin, srcEnd, dst, dstBegin);
}
/**
* Tell if two objects are functionally equal.
*
* @param obj2 Object to compare this to
*
* @return true if the two objects are equal
*
* @throws javax.xml.transform.TransformerException
*/
public boolean equals(XObject obj2)
{
// In order to handle the 'all' semantics of
// nodeset comparisons, we always call the
// nodeset function.
int t = obj2.getType();
try
{
if (XObject.CLASS_NODESET == t)
return obj2.equals(this);
// If at least one object to be compared is a boolean, then each object
// to be compared is converted to a boolean as if by applying the
// boolean function.
else if(XObject.CLASS_BOOLEAN == t)
return obj2.bool() == bool();
// Otherwise, if at least one object to be compared is a number, then each object
// to be compared is converted to a number as if by applying the number function.
else if(XObject.CLASS_NUMBER == t)
return obj2.num() == num();
}
catch(javax.xml.transform.TransformerException te)
{
throw new com.sun.org.apache.xml.internal.utils.WrappedRuntimeException(te);
}
// Otherwise, both objects to be compared are converted to strings as
// if by applying the string function.
return xstr().equals(obj2.xstr());
}
/**
* Compares this string to the specified <code>String.
* The result is <code>true if and only if the argument is not
* <code>null and is a String object that represents
* the same sequence of characters as this object.
*
* @param obj2 the object to compare this <code>String against.
* @return <code>true if the String s are equal;
* <code>false otherwise.
* @see java.lang.String#compareTo(java.lang.String)
* @see java.lang.String#equalsIgnoreCase(java.lang.String)
*/
public boolean equals(String obj2) {
return str().equals(obj2);
}
/**
* Compares this string to the specified object.
* The result is <code>true if and only if the argument is not
* <code>null and is a String object that represents
* the same sequence of characters as this object.
*
* @param obj2 the object to compare this <code>String
* against.
* @return <code>true if the String are equal;
* <code>false otherwise.
* @see java.lang.String#compareTo(java.lang.String)
* @see java.lang.String#equalsIgnoreCase(java.lang.String)
*/
public boolean equals(XMLString obj2)
{
if (obj2 != null) {
if (!obj2.hasString()) {
return obj2.equals(str());
} else {
return str().equals(obj2.toString());
}
}
return false;
}
/**
* Compares this string to the specified object.
* The result is <code>true if and only if the argument is not
* <code>null and is a String object that represents
* the same sequence of characters as this object.
*
* @param obj2 the object to compare this <code>String
* against.
* @return <code>true if the String are equal;
* <code>false otherwise.
* @see java.lang.String#compareTo(java.lang.String)
* @see java.lang.String#equalsIgnoreCase(java.lang.String)
*/
public boolean equals(Object obj2)
{
if (null == obj2)
return false;
// In order to handle the 'all' semantics of
// nodeset comparisons, we always call the
// nodeset function.
else if (obj2 instanceof XNodeSet)
return obj2.equals(this);
else if(obj2 instanceof XNumber)
return obj2.equals(this);
else
return str().equals(obj2.toString());
}
/**
* Compares this <code>String to another String ,
* ignoring case considerations. Two strings are considered equal
* ignoring case if they are of the same length, and corresponding
* characters in the two strings are equal ignoring case.
*
* @param anotherString the <code>String to compare this
* <code>String against.
* @return <code>true if the argument is not null
* and the <code>Strings are equal,
* ignoring case; <code>false otherwise.
* @see #equals(Object)
* @see java.lang.Character#toLowerCase(char)
* @see java.lang.Character#toUpperCase(char)
*/
public boolean equalsIgnoreCase(String anotherString)
{
return str().equalsIgnoreCase(anotherString);
}
/**
* Compares two strings lexicographically.
*
* @param xstr the <code>String to be compared.
*
* @return the value <code>0 if the argument string is equal to
* this string; a value less than <code>0 if this string
* is lexicographically less than the string argument; and a
* value greater than <code>0 if this string is
* lexicographically greater than the string argument.
* @exception java.lang.NullPointerException if <code>anotherString
* is <code>null.
*/
public int compareTo(XMLString xstr)
{
int len1 = this.length();
int len2 = xstr.length();
int n = Math.min(len1, len2);
int i = 0;
int j = 0;
while (n-- != 0)
{
char c1 = this.charAt(i);
char c2 = xstr.charAt(j);
if (c1 != c2)
{
return c1 - c2;
}
i++;
j++;
}
return len1 - len2;
}
/**
* Compares two strings lexicographically, ignoring case considerations.
* This method returns an integer whose sign is that of
* <code>this.toUpperCase().toLowerCase().compareTo(
* str.toUpperCase().toLowerCase())</code>.
* <p>
* Note that this method does <em>not take locale into account,
* and will result in an unsatisfactory ordering for certain locales.
* The java.text package provides <em>collators to allow
* locale-sensitive ordering.
*
* @param str the <code>String to be compared.
* @return a negative integer, zero, or a positive integer as the
* the specified String is greater than, equal to, or less
* than this String, ignoring case considerations.
* @see java.text.Collator#compare(String, String)
* @since 1.2
*/
public int compareToIgnoreCase(XMLString str)
{
// %REVIEW% Like it says, @since 1.2. Doesn't exist in earlier
// versions of Java, hence we can't yet shell out to it. We can implement
// it as character-by-character compare, but doing so efficiently
// is likely to be (ahem) interesting.
//
// However, since nobody is actually _using_ this method yet:
// return str().compareToIgnoreCase(str.toString());
throw new com.sun.org.apache.xml.internal.utils.WrappedRuntimeException(
new java.lang.NoSuchMethodException(
"Java 1.2 method, not yet implemented"));
}
/**
* Tests if this string starts with the specified prefix beginning
* a specified index.
*
* @param prefix the prefix.
* @param toffset where to begin looking in the string.
* @return <code>true if the character sequence represented by the
* argument is a prefix of the substring of this object starting
* at index <code>toffset; false otherwise.
* The result is <code>false if toffset is
* negative or greater than the length of this
* <code>String object; otherwise the result is the same
* as the result of the expression
* <pre>
* this.subString(toffset).startsWith(prefix)
* </pre>
* @exception java.lang.NullPointerException if <code>prefix is
* <code>null.
*/
public boolean startsWith(String prefix, int toffset)
{
return str().startsWith(prefix, toffset);
}
/**
* Tests if this string starts with the specified prefix.
*
* @param prefix the prefix.
* @return <code>true if the character sequence represented by the
* argument is a prefix of the character sequence represented by
* this string; <code>false otherwise.
* Note also that <code>true will be returned if the
* argument is an empty string or is equal to this
* <code>String object as determined by the
* {@link #equals(Object)} method.
* @exception java.lang.NullPointerException if <code>prefix is
* <code>null.
*/
public boolean startsWith(String prefix)
{
return startsWith(prefix, 0);
}
/**
* Tests if this string starts with the specified prefix beginning
* a specified index.
*
* @param prefix the prefix.
* @param toffset where to begin looking in the string.
* @return <code>true if the character sequence represented by the
* argument is a prefix of the substring of this object starting
* at index <code>toffset; false otherwise.
* The result is <code>false if toffset is
* negative or greater than the length of this
* <code>String object; otherwise the result is the same
* as the result of the expression
* <pre>
* this.subString(toffset).startsWith(prefix)
* </pre>
* @exception java.lang.NullPointerException if <code>prefix is
* <code>null.
*/
public boolean startsWith(XMLString prefix, int toffset)
{
int to = toffset;
int tlim = this.length();
int po = 0;
int pc = prefix.length();
// Note: toffset might be near -1>>>1.
if ((toffset < 0) || (toffset > tlim - pc))
{
return false;
}
while (--pc >= 0)
{
if (this.charAt(to) != prefix.charAt(po))
{
return false;
}
to++;
po++;
}
return true;
}
/**
* Tests if this string starts with the specified prefix.
*
* @param prefix the prefix.
* @return <code>true if the character sequence represented by the
* argument is a prefix of the character sequence represented by
* this string; <code>false otherwise.
* Note also that <code>true will be returned if the
* argument is an empty string or is equal to this
* <code>String object as determined by the
* {@link #equals(Object)} method.
* @exception java.lang.NullPointerException if <code>prefix is
* <code>null.
*/
public boolean startsWith(XMLString prefix)
{
return startsWith(prefix, 0);
}
/**
* Tests if this string ends with the specified suffix.
*
* @param suffix the suffix.
* @return <code>true if the character sequence represented by the
* argument is a suffix of the character sequence represented by
* this object; <code>false otherwise. Note that the
* result will be <code>true if the argument is the
* empty string or is equal to this <code>String object
* as determined by the {@link #equals(Object)} method.
* @exception java.lang.NullPointerException if <code>suffix is
* <code>null.
*/
public boolean endsWith(String suffix)
{
return str().endsWith(suffix);
}
/**
* Returns a hashcode for this string. The hashcode for a
* <code>String object is computed as
* <blockquote>* s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1] * </pre> * using <code>int arithmetic, where |
... this post is sponsored by my books ... | |
#1 New Release! |
FP Best Seller |
Copyright 1998-2024 Alvin Alexander, alvinalexander.com
All Rights Reserved.
A percentage of advertising revenue from
pages under the /java/jwarehouse
URI on this website is
paid back to open source projects.