|
What this is
Other links
The source code
/*
* Sun Public License Notice
*
* The contents of this file are subject to the Sun Public License
* Version 1.0 (the "License"). You may not use this file except in
* compliance with the License. A copy of the License is available at
* http://www.sun.com/
*
* The Original Code is NetBeans. The Initial Developer of the Original
* Code is Sun Microsystems, Inc. Portions Copyright 1997-2001 Sun
* Microsystems, Inc. All Rights Reserved.
*/
package org.netbeans.lib.jmi.xmi;
import java.io.*;
import java.util.*;
import java.net.URL;
import org.xml.sax.*;
import org.xml.sax.helpers.DefaultHandler;
import org.netbeans.lib.jmi.util.DebugException;
public class DefaultWriter extends DefaultHandler {
private static final char QUOTE = '\'';
private static final char EOL = '\n';
private static final String INDENT = " ";
private static final int INDENT_LENGTH = INDENT.length ();
/** An upper bound on the number of characters that can be printed to the output writer
* per one line. A new line is started every time when the number of characters in a line
* (excluding indent spaces) after @link #startElement or @link #addAttribute exceeds MAX.
*/
private static final int MAX = 70;
private static final String XMI_VERSION = "1.2";
private static final String EXPORTER_NAME = "Netbeans XMI Writer";
private static final String EXPORTER_VERSION = "1.0";
private static final String DEFAULT_ENCODING = "ISO-8859-1";
// variables ................................................................
//
private OutputStreamWriter writer;
// document locator
private Locator locator;
//
private String encoding = null;
// true if the currently written XML element has at least one sub-element
private boolean hasContent = true; // inited by true due to condition in @link #startElement
// true if the currently written XML element has some characters in its content
private boolean hasCharacters = false;
// indentation spaces to be currently used
private String indentSpaces = "";
// number of charecters written on current line so far (excluding indent spaces)
private int charsCount = 0;
// init .....................................................................
public DefaultWriter() {
}
public DefaultWriter(OutputStreamWriter writer, String encoding) {
this.writer = writer;
this.encoding = encoding;
}
public void init () throws SAXException {
hasContent = true;
hasCharacters = true;
indentSpaces = "";
charsCount = 0;
if (writer == null) {
try {
OutputStream ostr = new URL (locator.getSystemId()).openConnection().getOutputStream();
writer = new OutputStreamWriter (ostr);
} catch (IOException e) {
throw new SAXException (e);
}
}
String enc = (encoding != null) ? encoding : DEFAULT_ENCODING;
write ("");
writeln ();
}
// methods ..................................................................
public Writer getWriter () {
return writer;
}
/**
* Writes a string to the output writer.
*
* @param text a string to be written in the output writer
*/
private void write (String text) throws SAXException {
try {
writer.write (text);
} catch (IOException e) {
throw new SAXException (e);
}
}
/**
* Writes end of line to the output writer.
*/
private void writeln () throws SAXException {
try {
writer.write ("\r\n");
} catch (IOException e) {
throw new SAXException (e);
}
charsCount = 0;
}
/**
* Locates occurences of special XML charecters (like '<', '&', etc.) in a string
* and replaces them by sequences of the form &X...X;
*
* In addition, if replaceWhitechars parameter is true, '\n', '\r' and '\t' are replaced
* by NN; sequences.
*/
private String replaceSpecialChars (String s, boolean replaceWhitechars) {
int length = s.length ();
char [] chars = new char [6 * length];
int n = 0;
for (int x = 0; x < length; x++) {
char c = s.charAt (x);
switch (c) {
case '&':
chars [n] = '&'; n++; chars [n] = 'a'; n++;
chars [n] = 'm'; n++; chars [n] = 'p'; n++;
chars [n] = ';'; n++;
break;
case '\'':
chars [n] = '&'; n++; chars [n] = 'a'; n++;
chars [n] = 'p'; n++; chars [n] = 'o'; n++;
chars [n] = 's'; n++; chars [n] = ';'; n++;
break;
case '\"':
chars [n] = '&'; n++; chars [n] = 'q'; n++;
chars [n] = 'u'; n++; chars [n] = 'o'; n++;
chars [n] = 't'; n++; chars [n] = ';'; n++;
break;
case '<':
chars [n] = '&'; n++; chars [n] = 'l'; n++;
chars [n] = 't'; n++; chars [n] = ';'; n++;
break;
case '>':
chars [n] = '&'; n++; chars [n] = 'g'; n++;
chars [n] = 't'; n++; chars [n] = ';'; n++;
break;
default:
if (replaceWhitechars) {
switch (c) {
case '\n':
chars [n] = '&'; n++; chars [n] = '#'; n++;
chars [n] = '1'; n++; chars [n] = '0'; n++;
chars [n] = ';'; n++;
break;
case '\r':
chars [n] = '&'; n++; chars [n] = '#'; n++;
chars [n] = '1'; n++; chars [n] = '3'; n++;
chars [n] = ';'; n++;
break;
case '\t':
chars [n] = '&'; n++; chars [n] = '#'; n++;
chars [n] = '9'; n++; chars [n] = ';'; n++;
break;
default:
chars [n] = c; n++;
}
} else {
chars [n] = c; n++;
}
} // switch
} // for
return new String (chars, 0, n);
}
/**
* Writes start of a XML element to the output writer.
*
* @param name name of the XML element to be written
*/
private void startElement (String name, Attributes attrs) throws SAXException {
if (!hasContent && !hasCharacters) {
write (">");
writeln ();
}
hasContent = false;
hasCharacters = false;
write (indentSpaces);
write ("<" + name);
charsCount += name.length () + 1;
indentSpaces = indentSpaces + INDENT;
for (int x = 0; x < attrs.getLength(); x++) {
addAttribute (attrs.getQName(x), attrs.getValue(x));
}
}
/**
* Writes end of an XML element to the output writer.
*
* @param name name of the XML element to be written
*/
private void endElement (String name) throws SAXException {
indentSpaces = indentSpaces.substring (0, indentSpaces.length () - INDENT_LENGTH);
if (hasContent) {
write (indentSpaces);
write ("" + name + ">");
} else if (hasCharacters) {
write ("" + name + ">");
} else
write ("/>");
writeln ();
hasContent = true;
}
/**
* Writes an attribute of the currenly written XML elemnt to the output writer.
*
* @param name attribute name
* @param value value of the attribute
*/
private void addAttribute (String name, String value) throws SAXException {
value = replaceSpecialChars (value, true);
// [PENDING] ??? can be special characters in name too ???
if (charsCount > MAX) {
writeln ();
write (indentSpaces);
} else {
write (" ");
charsCount++;
}
write (name + " = " + QUOTE + value + QUOTE);
charsCount += name.length () + value.length () + 5;
}
/**
* Writes characters into body of the currenly written XML elemnt.
* Before the string is written, @link #replaceSpecialChars is called
* on it to replace special XML characters.
*
* @param text string to be written
*/
private void characters (String text) throws SAXException {
text = replaceSpecialChars (text, false);
if (!hasContent)
write (">");
write (text);
hasCharacters = true;
}
// org.xml.sax.ContentHandler interface implementation ......................
public void startDocument() throws org.xml.sax.SAXException {
init ();
}
public void endDocument() throws org.xml.sax.SAXException {
try {
writer.flush();
writer.close();
} catch (IOException e) {
throw new SAXException (e);
}
}
public void startElement(String uri, String sName, String qName, Attributes attributes) throws org.xml.sax.SAXException {
startElement (qName, attributes);
}
public void endElement(String uri, String sName, String qName) throws org.xml.sax.SAXException {
endElement (qName);
}
public void characters(char[] buf, int offset, int len) throws org.xml.sax.SAXException {
characters (new String (buf, offset, len));
}
public void setDocumentLocator(Locator locator) {
this.locator = locator;
}
/*
public void skippedEntity(String str) throws org.xml.sax.SAXException {
}
public void processingInstruction(String str, String str1) throws org.xml.sax.SAXException {
}
public void endPrefixMapping(String str) throws org.xml.sax.SAXException {
}
public void startPrefixMapping(String str, String str1) throws org.xml.sax.SAXException {
}
public void ignorableWhitespace(char[] values, int param, int param2) throws org.xml.sax.SAXException {
}
*/
}
|
| ... 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.