com.nexaweb.xml
Interface Element


public interface Element

This is an interface to represent an element in an XML Document Object Model (DOM).

While Element objects can exist outside the context of a document, this is an interface and therefore cannot be constructed directly. Therefore the Document interface contains the factory methods needed to create these objects. Element objects created with the various versions of the Document.createElement(String) method will have no ownerDocument until inserted in or appended to a Document.

All Element objects must have an ID (set as the "id" attribute). If you do not assign an ID, one will be auto-assigned when the Element is added to a Document. Once the Element is in a document, the ID may no longer be set.

There are several event listeners that may be registered on an element.

IMPORTANT:

Nexaweb's Document Object Model (DOM) is a data structure. As with most data structures (such as List, Set, Map, etc.) Nexaweb's DOM is not thread safe. You must obtain the DOM lock before accessing the DOM.

In the case of the UI Document, you must ALWAYS get the DOM lock before manipulating the DOM because Nexaweb's client code accesses the DOM too. Failure to obtain the lock when accessing and manipulating the DOM can cause the client to freeze.

With other documents (such as local datasets) where your code is the only code that accesses the data structure, if you are operating in a single thread there is no need to obtain the lock. Note that synchronized or shared datasets are accessed by Nexaweb's synchronization threads and the lock must be obtained.

EXAMPLE:

When modifying the client side DOM from an MCO developers MUST wrap their changes in a synchronized block in the following way.

 
 ClientSession session = getClientSession();
 Document uiDoc = session.getDocumentRegistry()
     .findDocument(DocumentRegistry.UI_DOCUMENT_NAME);
 synchronized ( uiDoc.getDomSynchronizationObject() ) {
 
     // MAKE ALL UI DOM OR NFC CHANGES HERE
     // Any and all changes to the client side DOM
     // should be done inside the synchronized block.
 }
 
 

Since:
4.0
See Also:
DocumentRegistry, Document, Parser, ParserFactory

Method Summary
 void addAttributeChangeListener(AttributeChangeListener listener)
          Adds a listener to this Element for attribute changes.
 void addDocumentOwnershipListener(DocumentOwnershipListener listener)
          Adds a DocumentOwnershipListener to this element.
 void addStructureChangeListener(StructureChangeListener listener)
          Adds a StructureChangeListener to this Element for DOM structure changes.
 java.lang.Object appendChild(Element e)
          Appends a child element to the end of the child list.
 java.lang.Object appendChild(java.lang.String text)
          This will append a "Text Node" to this element.
 java.lang.Object appendXml(java.lang.String text)
          This will parse the specified XML to create an Element structure which will be appended to the child list of this Element.
 Element clone(boolean withIds)
          Clones an Element.
 Element deepClone(boolean withIds)
          Clones an Element.
 boolean equals(Element e, boolean deep)
          This will compare two elements to see if they are equal.
 java.lang.String getAttribute(java.lang.String name)
          Returns the value of the attribute with the given name for this element.
 int getAttributeCount()
          Returns the number of attributes this element contains.
 java.lang.String getAttributeNameAt(int index)
          Returns the attribute name at the specified index in this element.
 java.util.Enumeration getAttributeNames()
          Returns an Enumeration containing the names of the attributes on this element.
 java.lang.String getAttributeValueAt(int index)
          Returns the attribute value at the specified index in this element.
 java.util.Enumeration getAttributeValues()
          Returns an Enumeration containing the values of the attributes on this element.
 java.lang.Object getChildAt(int index)
          Returns the child at a specified index in the child list.
 int getChildCount()
          Returns the number of children this element has.
 java.util.Vector getChildren()
          Returns a Vector containing all the children of this Element.
 java.lang.String getFirstTextChild()
          This will return the first text node of this element.
 java.lang.String getLocalName()
          Returns the local name (also known as tag name) for this Element.
 java.lang.String getNamespaceUri()
          Returns the namespace URI for this Element.
 Document getOwnerDocument()
          Returns the owner document of this element.
 Element getParent()
          Returns the parent Element of this Element.
 java.lang.String getPrefix()
          Returns the namespace prefix for this element.
 java.lang.String getQName()
          Returns the QName for this element.
 int indexOfChild(Element child)
          Returns the index of the specified child Element, or -1 if no such child Element exists.
 int indexOfChild(java.lang.String text)
          Returns the index of the specified text node, or -1 if no such text node exists.
 java.lang.Object insertChildAt(int index, Element e)
          Inserts a child at the specified position in the child list.
 java.lang.Object insertChildAt(int index, java.lang.String text)
          Inserts a text node at the specified position in this element.
 void normalize()
          This method is equivalent to the W3C normalize behavior.
 boolean removeAttribute(java.lang.String name)
          Removes the attribute with the given name.
 java.lang.String removeAttributeAt(int index)
          Removes the attribute at a specified index on this element.
 boolean removeAttributeChangeListener(AttributeChangeListener listener)
          Removes an AttributeChangeListener from this Element.
 java.lang.Object removeChild(Element e)
          Removes the specified Element from the child list.
 java.lang.Object removeChild(java.lang.String text)
          Removes the specified text child from this Element if it exists.
 java.lang.Object removeChildAt(int index)
          Removes the Element at the specified index.
 boolean removeDocumentOwnershipListener(DocumentOwnershipListener listener)
          Removes a DocumentOwnershipListener from this element.
 boolean removeStructureChangeListener(StructureChangeListener listener)
          Removes a StructureChangeListener from this Element
 java.lang.Object replaceChildAt(int index, Element newValue)
          Replaces the child at the specified index with the supplied element.
 java.lang.Object replaceChildAt(int index, java.lang.String newValue)
          Replaces the child at the specified index with the supplied text node.
 java.lang.String setAttribute(java.lang.String name, java.lang.String value)
          Sets an attribute on this element.
 java.lang.String setFirstTextChild(java.lang.String text)
          This will replace the first text node of this element.
 java.lang.String toXml(boolean prettyPrint)
          Returns a String representation of this XML Element including any Nexaweb-generated XML ID attributes.
 java.lang.String toXmlWithoutAutoAssignedIds(boolean prettyPrint)
          Returns a String representation of this XML Element NOT including any Nexaweb-generated XML ID attributes.
 java.lang.String toXmlWithSimpleAttributeEncoding(boolean prettyPrint)
          Returns a String representation of this XML Element, attributes will have only double quotes XML encoded and the elements will include any Nexaweb-generated XML ID attributes.
 java.lang.String toXmlWithSimpleAttributeEncodingWithoutAutoAssignedIds(boolean prettyPrint)
          Returns a String representation of this XML Element, attributes will have only double quotes XML encoded and the elements will not include any Nexaweb-generated XML ID attributes.
 

Method Detail

getOwnerDocument

public Document getOwnerDocument()
Returns the owner document of this element. If this Element does not belong to a Document, this method returns null.

Returns:
The owner document for this element, or null if one does not exist.
Since:
4.0
See Also:
Document

getAttribute

public java.lang.String getAttribute(java.lang.String name)
Returns the value of the attribute with the given name for this element.

Parameters:
name - The name of the attribute to get the value of.
Returns:
The value of the attribute, or null if no attribute with the given name exists on this element.
Since:
4.0
See Also:
setAttribute(String, String), getAttributeNameAt(int), getAttributeValueAt(int)

getAttributeCount

public int getAttributeCount()
Returns the number of attributes this element contains.

Returns:
The number of attributes this element contains.
Since:
4.0

getAttributeNameAt

public java.lang.String getAttributeNameAt(int index)
Returns the attribute name at the specified index in this element. Note: a valid index is in the range [0, getAttributeCount()-1].

Parameters:
index - The index of the attribute you want the name of.
Returns:
The name of the attribute at the specified index.
Throws:
java.lang.ArrayIndexOutOfBoundsException - If the index given is not valid.
Since:
4.0
See Also:
getAttributeValueAt(int), getAttribute(String)

getAttributeValueAt

public java.lang.String getAttributeValueAt(int index)
Returns the attribute value at the specified index in this element. Note: a valid index is in the range [0, getAttributeCount()-1].

Parameters:
index - The index of the attribute you want the value of.
Returns:
The value of the attribute at the specified index.
Throws:
java.lang.ArrayIndexOutOfBoundsException - If the index given is not valid.
Since:
4.0
See Also:
getAttributeNameAt(int), getAttributeValueAt(int)

getAttributeNames

public java.util.Enumeration getAttributeNames()
Returns an Enumeration containing the names of the attributes on this element. If the attribute list on this element is modified while iterating over this Enumeration it will cause a ConcurrentModificationException.

Returns:
An Enumeration of the attribute names on this element.
Since:
4.0
See Also:
Enumeration, getAttributeValues()

getAttributeValues

public java.util.Enumeration getAttributeValues()
Returns an Enumeration containing the values of the attributes on this element.

Returns:
An Enumeration of the attribute values on this element.
Since:
4.0
See Also:
Enumeration, getAttributeNames()

setAttribute

public java.lang.String setAttribute(java.lang.String name,
                                     java.lang.String value)
                              throws ChangeRejectedException
Sets an attribute on this element. If an attribute already exists with the given name, its value is overridden. AttributeChangeListeners can modify the value being set. If this happens the value returned from this method will be the resulting value after being processed by the AttributeChangeListeners.

Parameters:
name - The name of the attribute to set.
value - The value of the attribute to be set.
Returns:
The value that was set for the attribute provided.
Throws:
ChangeRejectedException - If this operation was rejected by one of the AttributeChangeListeners
Since:
4.0
See Also:
AttributeChangeListener, getAttribute(String)

removeAttributeAt

public java.lang.String removeAttributeAt(int index)
                                   throws ChangeRejectedException
Removes the attribute at a specified index on this element. Note: a valid index is in the range [0, getAttributeCount()-1]

Parameters:
index - The index of the attribute to be removed.
Returns:
The name of the attribute that was removed.
Throws:
java.lang.ArrayIndexOutOfBoundsException - If the specified index is not valid.
ChangeRejectedException - If the removal was rejected by one of the AttributeChangeListeners registered for this element.
Since:
4.0
See Also:
removeAttribute(String)

removeAttribute

public boolean removeAttribute(java.lang.String name)
                        throws ChangeRejectedException
Removes the attribute with the given name.

Parameters:
name - The name of the attribute to be removed.
Returns:
True if the attribute with the given name was removed, false if it could not be found.
Throws:
ChangeRejectedException - If the removal was rejected by one of the AttributeChangeListeners registered for this element.
Since:
4.0
See Also:
removeAttributeAt(int)

getChildCount

public int getChildCount()
Returns the number of children this element has.

Returns:
The number of children.
Since:
4.0
See Also:
getChildren(), getChildAt(int)

getChildren

public java.util.Vector getChildren()
Returns a Vector containing all the children of this Element. Note: The Vector returned is the ACTUAL child list and may not be directly modified. If the Vector returned from this method is modified in any way, unexpected results will occur. Furthermore, if you modify the DOM while you have a reference to this Vector, the contents of the vector may change. If you wish to iterate over the Vector and modify the DOM using the children you find, you must clone() the Vector first.

Returns:
A Vector representing the children of this element.
Since:
4.0
See Also:
getChildAt(int), getChildCount()

getChildAt

public java.lang.Object getChildAt(int index)
Returns the child at a specified index in the child list. This method can return either a java.lang.String or an Element. Note: A valid index is in the range: [0, getChildCount()-1]

Parameters:
index - The index of the child to be returned.
Returns:
The child at the specified position.
Throws:
java.lang.ArrayIndexOutOfBoundsException - If the index supplied is not valid.
Since:
4.0
See Also:
indexOfChild(Element), indexOfChild(String), getChildCount()

indexOfChild

public int indexOfChild(Element child)
Returns the index of the specified child Element, or -1 if no such child Element exists.

Parameters:
child - The element to get the index of.
Returns:
The index of the specified child Element, or -1 if no such child Element exists.
Since:
4.0
See Also:
indexOfChild(String)

indexOfChild

public int indexOfChild(java.lang.String text)
Returns the index of the specified text node, or -1 if no such text node exists.

Parameters:
text - The text node to get the index of.
Returns:
The index of the specified text node, or -1 if no such text node exists.
Since:
4.0

appendChild

public java.lang.Object appendChild(Element e)
                             throws ChangeRejectedException
Appends a child element to the end of the child list.

Parameters:
e - - the Element wishing to be appended.
Returns:
The actual object that was appended. Since a StructureChangeListener can change the value before it is appended. This value can either be an Element or String.
Throws:
ChangeRejectedException - - if the append was rejected by a listener.
java.lang.IllegalStateException - if the element being added causes an ID conflict with an element already existing in this element's document and if the element being added has a prefix/namespace pair that conflicts with an existing prefix/namespace pair in this document.
Since:
4.0

appendChild

public java.lang.Object appendChild(java.lang.String text)
                             throws ChangeRejectedException
This will append a "Text Node" to this element. If a text node already exists in this element, it will append the new text to the previous text and retain the old text's index in the child list. If the event listeners change the value of the text in the beforeChildAdd() methods, the new value will be used. Note that the event will only contain the value being appended, not the full resulting text value.

Parameters:
text - - the text wishing to be appended to this element.
Returns:
The actual object that was appended. Since a StructureChangeListener can change the value before it is appended. This value can either be an Element or String.
Throws:
ChangeRejectedException - - if the append was rejected by a listener.
Since:
4.0

appendXml

public java.lang.Object appendXml(java.lang.String text)
                           throws ChangeRejectedException,
                                  ParserException
This will parse the specified XML to create an Element structure which will be appended to the child list of this Element. If the event listeners change the value of the structure in the beforeChildAdd() methods, the new structure will be used.

Returns:
The actual object that was appended. Since a StructureChangeListener can change the value before it is appended. This value can either be an Element or String.
Throws:
ChangeRejectedException - - if the append was rejected by a listener.
ParserException
Since:
4.2

insertChildAt

public java.lang.Object insertChildAt(int index,
                                      Element e)
                               throws ChangeRejectedException
Inserts a child at the specified position in the child list. This method will not replace the child at the specified position, it will take every child greater than the specified index and shift them down one. Then place the specified Element at the index.

Note: a valid index is in the range [0, getChildCount()]

Parameters:
index - - the index for the Element to be inserted at
e - - the element to be inserted.
Returns:
The actual object that was inserted. Since a StructureChangeListener can change the value before it is inserted. This value can either be an Element or String.
Throws:
java.lang.IllegalArgumentException - - if the specified index is not valid
ChangeRejectedException - - if the insert was rejected by a listener.
java.lang.IllegalStateException - if the element being added causes an ID conflict with an element already existing in this element's document and if the element being added has a prefix/namespace pair that conflicts with an existing prefix/namespace pair in this document.
Since:
4.0
See Also:
getChildCount(), insertChildAt(int, String)

insertChildAt

public java.lang.Object insertChildAt(int index,
                                      java.lang.String text)
                               throws ChangeRejectedException
Inserts a text node at the specified position in this element. If a text node already exists in this Element, you must first remove the old text node before using this method.

Parameters:
index - - the index to be inserted
text - - the text to be inserted
Returns:
The actual object that was inserted. Since a StructureChangeListener can change the value before it is inserted. This value can either be an Element or String.
Throws:
ChangeRejectedException - - if the insert was rejected by a listener.
Since:
4.0
See Also:
getChildCount(), insertChildAt(int, Element)

removeChild

public java.lang.Object removeChild(Element e)
                             throws ChangeRejectedException
Removes the specified Element from the child list.

Parameters:
e - - the Element to be removed.
Returns:
The actual object that was removed. Since a StructureChangeListener can change the value before it is removed. This value can either be an Element or String.
Throws:
ChangeRejectedException - - if the remove was rejected by a listener.
Since:
4.0

removeChild

public java.lang.Object removeChild(java.lang.String text)
                             throws ChangeRejectedException
Removes the specified text child from this Element if it exists. If the text is not present as a child or the text is null, then null is returned, otherwise the text node that was removed is returned.

Parameters:
text - The text to remove as the text child of this element.
Returns:
The actual object that was removed. Since a StructureChangeListener can change the value before it is removed. This value can either be an Element or String.
Throws:
ChangeRejectedException - - if the remove was rejected by a listener.
Since:
4.0

removeChildAt

public java.lang.Object removeChildAt(int index)
                               throws ChangeRejectedException
Removes the Element at the specified index. After the Element is removed all Elements below it are shifted up in the list.

Note: a valid index is in the range [0, getChildrenCount()-1]

Parameters:
index - - the index of the Element to be removed.
Returns:
- the actual Object that was removed, this can be either an Element or String object.
Throws:
java.lang.IllegalArgumentException - - if the specified index is not valid.
ChangeRejectedException - - if the remove was rejected by a listener.
Since:
4.0

replaceChildAt

public java.lang.Object replaceChildAt(int index,
                                       java.lang.String newValue)
                                throws ChangeRejectedException
Replaces the child at the specified index with the supplied text node. This method is equivilant to: removeChildAt(index); insertChildAt(index, newValue);

Parameters:
index - The index of the child to be replaced.
newValue - The new child to be inserted at that position.
Returns:
The child that was previously at that index, an Element or a String.
Throws:
ChangeRejectedException - If the removing of the current value or the addition of the supplied value was rejected by a StructureChangeListener.
Since:
4.0

replaceChildAt

public java.lang.Object replaceChildAt(int index,
                                       Element newValue)
                                throws ChangeRejectedException
Replaces the child at the specified index with the supplied element. This method is equivilant to: removeChildAt(index); insertChildAt(index, newValue);

Parameters:
index - The index of the child to be replaced.
newValue - The new child to be inserted at that position.
Returns:
The child that was previously at that index.
Throws:
ChangeRejectedException - If the removing of the current value or the addition of the supplied value was rejected by a StructureChangeListener.
Since:
4.0

getParent

public Element getParent()
Returns the parent Element of this Element. If this method returns null it could be one of two things.
  1. This is the root Element of a Document
  2. This Element was constructed outside the context of a Document, and has not been added to a Document yet.

Returns:
the parent of this element
Since:
4.0

getPrefix

public java.lang.String getPrefix()
Returns the namespace prefix for this element. For example:
<pers:person firstname="Peter" lastname="Eacmen"/>
This method would return "pers"

Returns:
- the namespace prefix for this element.
Since:
4.0

getNamespaceUri

public java.lang.String getNamespaceUri()
Returns the namespace URI for this Element. For example:
<pers:people xmlns:pers="http://acme.com/hr/people">   <pers:person firstname="Peter" lastname="Eacmen"/> </pers:people>

For the person element this method would return "http://acme.com/hr/people"

Returns:
- the namespace URI for this element
Since:
4.0

getLocalName

public java.lang.String getLocalName()
Returns the local name (also known as tag name) for this Element.

Returns:
- the local name
Since:
4.0

getQName

public java.lang.String getQName()
Returns the QName for this element. An example of a QName is:
"{http://acme.com/hr/people}person" where 'person' is the tag name.

Returns:
- the QName for this element.
Since:
4.0

addAttributeChangeListener

public void addAttributeChangeListener(AttributeChangeListener listener)
Adds a listener to this Element for attribute changes. If the listener already exists on this element, the listener is not added.

Parameters:
listener - - the listener to add
Since:
4.0
See Also:
AttributeChangeListener, AttributeChangeEvent

removeAttributeChangeListener

public boolean removeAttributeChangeListener(AttributeChangeListener listener)
Removes an AttributeChangeListener from this Element.

Parameters:
listener - - the listener to remove
Returns:
- returns true if it was removed, false otherwise
Since:
4.0
See Also:
AttributeChangeListener, AttributeChangeEvent

addStructureChangeListener

public void addStructureChangeListener(StructureChangeListener listener)
Adds a StructureChangeListener to this Element for DOM structure changes. If the listener already exists on this element, the listener is not added.

Parameters:
listener - - the listener to add
Since:
4.0
See Also:
StructureChangeListener, StructureChangeEvent

removeStructureChangeListener

public boolean removeStructureChangeListener(StructureChangeListener listener)
Removes a StructureChangeListener from this Element

Parameters:
listener - - the listener to remove
Returns:
- returns true if it was removed, false otherwise
Since:
4.0
See Also:
StructureChangeListener, StructureChangeEvent

addDocumentOwnershipListener

public void addDocumentOwnershipListener(DocumentOwnershipListener listener)
Adds a DocumentOwnershipListener to this element. If the listener already exists on this element, the listener is not added.

Parameters:
listener - The listener to add.
Since:
4.0

removeDocumentOwnershipListener

public boolean removeDocumentOwnershipListener(DocumentOwnershipListener listener)
Removes a DocumentOwnershipListener from this element. This method will return true if the listener supplied was actually removed, false otherwise.

Parameters:
listener - The listener to be removed from this element.
Returns:
True if the listener was removed, false otherwise.
Since:
4.0

getFirstTextChild

public java.lang.String getFirstTextChild()
This will return the first text node of this element. If this element has multiple text nodes ONLY the first text node is returned.

Returns:
The first text node of this element.
Since:
4.0
See Also:
normalize()

setFirstTextChild

public java.lang.String setFirstTextChild(java.lang.String text)
                                   throws ChangeRejectedException
This will replace the first text node of this element. If no text node exists then the text supplied is appended to the end of the child list (thus becoming the first text node).

Parameters:
text - The string representing what the first text node should become.
Returns:
The text node being replaced, null if no text node is being replaced.
Throws:
ChangeRejectedException - If replacing the first text node was rejected by a StructureChangeListener.
Since:
4.0

normalize

public void normalize()
This method is equivalent to the W3C normalize behavior. Any adjoining text node will be consolidated into one text node. If an element separates two text nodes, those nodes will not be combined. For example if an element has 2 text children, a non-text child, then 3 text children, normalize() leaves it with three children: the first 2 text nodes concatenated into one; the non-text child, and the last 3 text nodes concatenated into one.

Since:
4.0
See Also:
getFirstTextChild()

clone

public Element clone(boolean withIds)
Clones an Element. This will produce an exact replica of this Element, excluding parent reference, owner document, and listeners. This method will only clone THIS element. If you want to clone this Element and all of its descendants use the deepClone method.

Parameters:
withIds - - if this is true automatically generated IDs will get cloned with the element. If this is false all IDs that were previously generated will get re-assigned a new unique ID.
Returns:
- the cloned element
Since:
4.0
See Also:
deepClone(boolean)

deepClone

public Element deepClone(boolean withIds)
Clones an Element. This will produce an exact replica of this Element, excluding parent reference, owner document, and listeners. This methods clones this Element and all of its descendants.

Parameters:
withIds - - if this is true automatically generated IDs will get cloned with the element. If this is false all IDs that were previously generated will get re-assigned a new unique ID.
Returns:
- the cloned element
Since:
4.0
See Also:
clone(boolean)

equals

public boolean equals(Element e,
                      boolean deep)
This will compare two elements to see if they are equal. The parameter deep determines whether the Element's children should be considered when determining equality. If set to true, then this element and all of its children will be compared with the supplied Element and all of it's children. If false, only this element will be checked against the supplied element, the children (as well as the children count) will be ignored. The following must be equal for this method to return true:

Parameters:
e - - the element to compare this element to.
deep - - whether the elements' children should be considered in the comparison.
Returns:
- true if the elements are equal, false otherwise.
Since:
4.0

toXml

public java.lang.String toXml(boolean prettyPrint)
Returns a String representation of this XML Element including any Nexaweb-generated XML ID attributes.

Parameters:
prettyPrint - If true, the generated string will contain newlines and tabs to make the XML more readable.
Returns:
The String representation of this Element
Since:
4.0
See Also:
toXmlWithoutAutoAssignedIds(boolean)

toXmlWithoutAutoAssignedIds

public java.lang.String toXmlWithoutAutoAssignedIds(boolean prettyPrint)
Returns a String representation of this XML Element NOT including any Nexaweb-generated XML ID attributes.

Parameters:
prettyPrint - If true, the generated string will contain newlines and tabs to make the XML more readable.
Returns:
The String representation of this Element
Since:
4.0

toXmlWithSimpleAttributeEncoding

public java.lang.String toXmlWithSimpleAttributeEncoding(boolean prettyPrint)
Returns a String representation of this XML Element, attributes will have only double quotes XML encoded and the elements will include any Nexaweb-generated XML ID attributes.

Parameters:
prettyPrint - If true, the generated string will contain newlines and tabs to make the XML more readable.
Returns:
The String representation of this Element
Since:
4.2
See Also:
toXmlWithoutAutoAssignedIds(boolean)

toXmlWithSimpleAttributeEncodingWithoutAutoAssignedIds

public java.lang.String toXmlWithSimpleAttributeEncodingWithoutAutoAssignedIds(boolean prettyPrint)
Returns a String representation of this XML Element, attributes will have only double quotes XML encoded and the elements will not include any Nexaweb-generated XML ID attributes.

Parameters:
prettyPrint - If true, the generated string will contain newlines and tabs to make the XML more readable.
Returns:
The String representation of this Element
Since:
4.2


Copyright © 2005 Nexaweb Technologies, Inc. All Rights Reserved.