Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'rse/plugins/org.eclipse.dstore.core/src/org/eclipse/dstore/internal/core/util/XMLgenerator.java')
-rw-r--r--rse/plugins/org.eclipse.dstore.core/src/org/eclipse/dstore/internal/core/util/XMLgenerator.java694
1 files changed, 0 insertions, 694 deletions
diff --git a/rse/plugins/org.eclipse.dstore.core/src/org/eclipse/dstore/internal/core/util/XMLgenerator.java b/rse/plugins/org.eclipse.dstore.core/src/org/eclipse/dstore/internal/core/util/XMLgenerator.java
deleted file mode 100644
index da0261f75..000000000
--- a/rse/plugins/org.eclipse.dstore.core/src/org/eclipse/dstore/internal/core/util/XMLgenerator.java
+++ /dev/null
@@ -1,694 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2002, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Initial Contributors:
- * The following IBM employees contributed to the Remote System Explorer
- * component that contains this file: David McKnight, Kushal Munir,
- * Michael Berger, David Dykstal, Phil Coulthard, Don Yantzi, Eric Simpson,
- * Emily Bruner, Mazen Faraj, Adrian Storisteanu, Li Ding, and Kent Hawley.
- *
- * Contributors:
- * David McKnight (IBM) - [232233] [dstore] Buffer in DataElement is not retained
- * David McKnight (IBM) - [245481] [dstore] CR/LF not restored for new client/old server
- *******************************************************************************/
-
-package org.eclipse.dstore.internal.core.util;
-
-import java.io.BufferedWriter;
-import java.io.IOException;
-import java.io.ObjectOutputStream;
-import java.io.PipedInputStream;
-import java.io.PipedOutputStream;
-import java.io.PrintStream;
-import java.util.Stack;
-
-import org.eclipse.dstore.core.java.IRemoteClassInstance;
-import org.eclipse.dstore.core.model.DE;
-import org.eclipse.dstore.core.model.DataElement;
-import org.eclipse.dstore.core.model.DataStore;
-import org.eclipse.dstore.core.model.DataStoreResources;
-
-/**
- * <p>
- * This class is used to serialize data and send it either
- * to a file or a socket.
- * </p>
- * <p>
- * When a DataStore tree needs to be transmitted, it's DataElements are
- * converted to XML before sending. Only those elements which have changed and
- * are thus out of synch with the DataStore on the other end of the socket are
- * actually transferred.
- * </p>
- * <p>
- * When a byte stream or file needs to be transmitted, bytes are
- * either send as is if binary transfer is requested or as unicode if
- * binary transfer is not requested.
- * </p>
- */
-public class XMLgenerator
-{
-
- private int _state;
-
- private StringBuffer _document;
-
- private int _indent;
- private Stack _tagStack;
-
- private PrintStream _fileWriter;
- private BufferedWriter _dataWriter;
-
- private int _bufferSize;
- private boolean _generateBuffer;
- private boolean _ignoreDeleted;
-
- private DataStore _dataStore;
-
- public static final int EMPTY = 0;
- public static final int OPEN = 1;
- public static final int CLOSE = 2;
- public static final int BODY = 3;
-
- /**
- * Constructor
- * @param dataStore the associated DataStore
- */
- public XMLgenerator(DataStore dataStore)
- {
- _dataStore = dataStore;
- _state = EMPTY;
- _bufferSize = 100000;
-
- _document = new StringBuffer(_bufferSize);
-
- _indent = 0;
- _generateBuffer = true;
- _ignoreDeleted = false;
- _tagStack = new Stack();
- }
-
- /**
- * Indicate whether DataElements marked as deleted should be sent.
- * @param flag whether deleted elements should be sent
- */
- public void setIgnoreDeleted(boolean flag)
- {
- _ignoreDeleted = flag;
- }
-
- /**
- * Sets the file writer used for file transfer
- * @param writer the file writer used for file transfer
- */
- public void setFileWriter(PrintStream writer)
- {
- _fileWriter = writer;
- }
-
- /**
- * Sets the data writer used for XML transfer
- * @param writer the data writer used for XML transfer
- */
- public void setDataWriter(BufferedWriter writer)
- {
- _dataWriter = writer;
- }
-
- /**
- * Set the buffer size
- * @param size of the buffer used for transmitting packets
- */
- public void setBufferSize(int size)
- {
- _bufferSize = size;
- }
-
- /**
- * Indicate whether the buffer attribute of each DataElement should be
- * transferred
- * @param flag whether the buffer should be transferred
- */
- public void setGenerateBuffer(boolean flag)
- {
- _generateBuffer = flag;
- }
-
- private void append(char c)
- {
- _document.append(c);
- }
-
- private void append(String buffer)
- {
- _document.append(buffer);
- }
-
- private void append(StringBuffer buffer)
- {
- _document.append(buffer);
- }
-
- private void nextLine()
- {
- if (_dataWriter != null)
- {
- _document.append('\n');
-
- int length = _document.length();
- if (length > _bufferSize)
- {
- flushData();
- }
- }
- }
-
- /**
- * Send all buffered data through the pipe.
- */
- public void flushData()
- {
- if (_document.length() > 0 && _dataWriter != null)
- {
- try
- {
- _dataWriter.write(_document.toString(), 0, _document.length());
- _dataWriter.write('\n');
- _dataWriter.flush();
- _document.setLength(0);
- }
- catch (Exception e)
- {
- _dataStore.trace(e);
- _dataWriter = null;
- }
- }
- }
-
- private void indent()
- {
- for (int i = 0; i < _indent; i++)
- {
- append(' ');
- }
- }
-
- private void startTag(String name)
- {
- if (_state == OPEN)
- {
- append('>');
- _indent++;
- }
- if (_state == CLOSE)
- {
- _indent--;
- }
- if (_state == BODY)
- {
- nextLine();
- }
- indent();
- if (_document == null)
- {
- append('<');
- append(name);
- }
- else
- {
- append('<');
- append(name);
- }
- _tagStack.push(name);
- _state = OPEN;
- }
-
- private void endTag(String name)
- {
- String top = (String) _tagStack.pop();
- if (_state == CLOSE)
- {
- }
- else if (_state == OPEN)
- {
- if (top == name)
- {
- append("/>"); //$NON-NLS-1$
- if (_tagStack.empty())
- {
- _state = CLOSE;
- }
- else
- {
- _state = BODY;
- }
- }
- }
- else if (_state == BODY)
- {
- if (top == name)
- {
- nextLine();
- _indent--;
- indent();
- append("</"); //$NON-NLS-1$
- append(name);
- append('>');
- if (_tagStack.empty())
- {
- _state = CLOSE;
- }
- }
- }
- }
-
- private void addAttribute(String name, String value)
- {
- if (_state != OPEN)
- {
- }
-
- StringBuffer niceValue = null;
- if (value != null)
- {
- niceValue = prepareStringForXML(value);
-
- append(' ');
- append(name);
- append("=\""); //$NON-NLS-1$
- append(niceValue);
- append('"');
- }
- else
- {
- append(' ');
- append(name);
- append("=\"\""); //$NON-NLS-1$
- }
-
- }
-
- private void addReferenceTypeAttribute(DataElement object)
- {
- if (object.isSpirit())
- {
- addAttribute(DE.P_REF_TYPE, DataStoreResources.SPIRIT);
- }
- else
- {
- if (object.isReference())
- {
- if (_dataStore.getReferenceTag() != null && _dataStore.getReferenceTag().equals(DE.P_REF_TYPE)) addAttribute(DE.P_REF_TYPE, DataStoreResources.REFERENCE);
- else addAttribute(DE.P_REF_TYPE, DataStoreResources.TRUE);
- }
- else
- {
- if (_dataStore.getReferenceTag() != null && _dataStore.getReferenceTag().equals(DE.P_REF_TYPE)) addAttribute(DE.P_REF_TYPE, DataStoreResources.VALUE);
- else addAttribute(DE.P_REF_TYPE, DataStoreResources.FALSE);
- }
- }
- }
-
- private void addFile(byte[] bytes, int size, boolean binary)
- {
- if (_state == OPEN)
- {
- append('>');
-
- _indent++;
- _state = BODY;
- }
- if (_state == BODY)
- {
- flushData();
-
- // send everything across
- if (binary)
- {
- _fileWriter.write(bytes, 0, size);
- _fileWriter.flush();
- }
- else
- {
- try
- {
- _dataWriter.write(new String(bytes), 0, size);
- _dataWriter.flush();
- }
- catch (IOException e)
- {
- _dataStore.trace(e);
- }
- }
- }
- else if (_state == EMPTY)
- {
- }
- else if (_state == CLOSE)
- {
- }
- }
-
- private void addData(StringBuffer data)
- {
- if (_state == OPEN)
- {
- append('>');
-
- _indent++;
- _state = BODY;
- }
- if (_state == BODY)
- {
- if (_generateBuffer && data != null && (data.length() > 0))
- {
- StringBuffer text = prepareStringForXML(data);
- if (text != null && text.length() > 0)
- {
- nextLine();
- indent();
- append("<Buffer>"); //$NON-NLS-1$
- nextLine();
- append(text.toString());
- nextLine();
- append("</Buffer>"); //$NON-NLS-1$
- }
- }
- else
- {
- append(""); //$NON-NLS-1$
- }
- }
- else if (_state == EMPTY)
- {
- }
- else if (_state == CLOSE)
- {
- }
- }
-
- /**
- * Returns the current serialized document
- * @return the current document
- */
- public StringBuffer document()
- {
- return _document;
- }
-
- /**
- * Clears the current serlized document
- */
- public void empty()
- {
- _indent = 0;
- _document.delete(0, _document.length());
- }
-
- /**
- * Converts special characters to appropriate representation in XML
- * @param input buffer to convert
- * @return the converted buffer
- */
- public static StringBuffer prepareStringForXML(StringBuffer input)
- {
- StringBuffer output = new StringBuffer();
-
- for (int idx = 0; idx < input.length(); idx++)
- {
- char currChar = input.charAt(idx);
- switch (currChar)
- {
- case '&' :
- output.append(XMLparser.STR_AMP);
- break;
- case '"' :
- output.append(XMLparser.STR_QUOTE);
- break;
- case '\'' :
- output.append(XMLparser.STR_APOS);
- break;
- case '<' :
- output.append(XMLparser.STR_LT);
- break;
- case '>' :
- output.append(XMLparser.STR_GT);
- break;
- case ';' :
- output.append(XMLparser.STR_SEMI);
- break;
- case '\n':
- output.append(XMLparser.STR_NL);
- break;
- case '\r':
- output.append(XMLparser.STR_CR);
- break;
- case '\0':
- output.append(XMLparser.STR_EOL);
- break;
- default :
- output.append(currChar);
- break;
- }
- }
-
- return output;
- }
-
- /**
- * Converts special characters to appropriate representation in XML
- * @param input buffer to convert
- * @return the converted buffer
- */
- public static StringBuffer prepareStringForXML(String input)
- {
- StringBuffer output = new StringBuffer();
-
- for (int idx = 0; idx < input.length(); idx++)
- {
- char currChar = input.charAt(idx);
- switch (currChar)
- {
- case '&' :
- output.append(XMLparser.STR_AMP);
- break;
- case '"' :
- output.append(XMLparser.STR_QUOTE);
- break;
- case '\'' :
- output.append(XMLparser.STR_APOS);
- break;
- case '<' :
- output.append(XMLparser.STR_LT);
- break;
- case '>' :
- output.append(XMLparser.STR_GT);
- break;
- case ';' :
- output.append(XMLparser.STR_SEMI);
- break;
- case '\n':
- output.append(XMLparser.STR_NL);
- break;
- case '\r':
- output.append(XMLparser.STR_CR);
- break;
- case '\0':
- output.append(XMLparser.STR_EOL);
- break;
- default :
- output.append(currChar);
- break;
- }
- }
-
- return output;
- }
-
- /**
- * Generate an tags for a file transfer and send bytes over the pipe.
- *
- * @param object the element representing the file transfer
- * @param bytes the bytes to send
- * @param size the number of bytes to send
- * @param isAppend indicates whether bytes should be appended or not to a file on the other end of the pipe
- * @param binary indicates whether the bytes should be sent as binary or text
- */
- public synchronized void generate(DataElement object, byte[] bytes, int size, boolean isAppend, boolean binary)
- {
- String tagType = XMLparser.STR_FILE;
- if (isAppend)
- {
- tagType += ".Append"; //$NON-NLS-1$
- }
- if (binary)
- {
- tagType += ".Binary"; //$NON-NLS-1$
- }
-
- if (object != null)
- {
- startTag(tagType);
- addAttribute(DE.P_TYPE, object.getAttribute(DE.A_TYPE));
- addAttribute(DE.P_ID, object.getAttribute(DE.A_ID));
- addAttribute(DE.P_NAME, object.getAttribute(DE.A_NAME));
- addAttribute(DE.P_VALUE, object.getAttribute(DE.A_VALUE));
- addAttribute(DE.P_SOURCE, object.getAttribute(DE.A_SOURCE));
- addAttribute(DE.P_SOURCE_LOCATION, object.getAttribute(DE.A_SOURCE_LOCATION));
-
- addReferenceTypeAttribute(object);
-
- addAttribute(DE.P_DEPTH, "" + size); //$NON-NLS-1$
- addFile(bytes, size, binary);
-
- endTag(tagType);
- }
- }
-
- /**
- * Generate tags for class transfer and send bytes over the pipe.
- *
- * @param object the element representing the class transfer
- * @param bytes the bytes to send
- * @param size the number of bytes to send
- */
- public synchronized void generate(DataElement object, byte[] bytes, int size)
- {
- String tagType = XMLparser.STR_CLASS;
-
- if (object != null)
- {
- startTag(tagType);
- addAttribute(DE.P_TYPE, object.getAttribute(DE.A_TYPE));
- addAttribute(DE.P_ID, object.getAttribute(DE.A_ID));
- addAttribute(DE.P_NAME, object.getAttribute(DE.A_NAME));
- addAttribute(DE.P_VALUE, object.getAttribute(DE.A_VALUE));
- addAttribute(DE.P_SOURCE, object.getAttribute(DE.A_SOURCE));
- addAttribute(DE.P_SOURCE_LOCATION, object.getAttribute(DE.A_SOURCE_LOCATION));
-
- addReferenceTypeAttribute(object);
-
- addAttribute(DE.P_DEPTH, "" + size); //$NON-NLS-1$
- addFile(bytes, size, true);
-
- endTag(tagType);
- }
- }
-
- /**
- * Serializes and sends a DataStore tree through the pipe
- *
- * @param object the root of the DataStore tree to send
- * @param depth the depth of the tree to send
- */
- public void generate(DataElement object, int depth)
- {
- if ((object != null) && (depth >= 0))
- {
- String tagType = XMLparser.STR_DATAELEMENT;
-
- if (object.isUpdated() && !object.isPendingTransfer())
- {
- }
- else
- {
- if (object.isDeleted() && _ignoreDeleted)
- {
- }
- else
- {
- object.setPendingTransfer(false);
-
- startTag(tagType);
- addAttribute(DE.P_TYPE, object.getAttribute(DE.A_TYPE));
- addAttribute(DE.P_ID, object.getAttribute(DE.A_ID));
- addAttribute(DE.P_NAME, object.getAttribute(DE.A_NAME));
- addAttribute(DE.P_VALUE, object.getAttribute(DE.A_VALUE));
- addAttribute(DE.P_SOURCE, object.getAttribute(DE.A_SOURCE));
- addAttribute(DE.P_SOURCE_LOCATION, object.getAttribute(DE.A_SOURCE_LOCATION));
-
- addReferenceTypeAttribute(object);
-
- addAttribute(DE.P_DEPTH, "" + object.depth()); //$NON-NLS-1$
- addData(object.getBuffer());
- object.setUpdated(true);
-
- if (!object.isReference() && depth >= 0)
- {
- for (int i = 0; i < object.getNestedSize(); i++)
- {
- generate(object.get(i), depth - 1);
- }
- }
-
- // end generation
- endTag(tagType);
- }
- }
- }
- }
-
- public void generateClassRequest(DataElement object)
- {
- String tagType = XMLparser.STR_REQUEST_CLASS;
- if (object != null)
- {
- startTag(tagType);
- addAttribute(DE.P_TYPE, object.getAttribute(DE.A_TYPE));
- addAttribute(DE.P_ID, object.getAttribute(DE.A_ID));
- addAttribute(DE.P_NAME, object.getAttribute(DE.A_NAME));
- addAttribute(DE.P_VALUE, object.getAttribute(DE.A_VALUE));
- addAttribute(DE.P_SOURCE, object.getAttribute(DE.A_SOURCE));
- addAttribute(DE.P_SOURCE_LOCATION, object.getAttribute(DE.A_SOURCE_LOCATION));
-
- addReferenceTypeAttribute(object);
- _state = BODY;
- endTag(tagType);
- }
-
- }
-
- public void generateSerializedObject(DataElement object, IRemoteClassInstance runnable)
- {
- String tagType = XMLparser.STR_SERIALIZED;
- if (object != null)
- {
- startTag(tagType);
- addAttribute(DE.P_TYPE, object.getAttribute(DE.A_TYPE));
- addAttribute(DE.P_ID, object.getAttribute(DE.A_ID));
- addAttribute(DE.P_NAME, object.getAttribute(DE.A_NAME));
- addAttribute(DE.P_VALUE, object.getAttribute(DE.A_VALUE));
- addAttribute(DE.P_SOURCE, object.getAttribute(DE.A_SOURCE));
- addAttribute(DE.P_SOURCE_LOCATION, object.getAttribute(DE.A_SOURCE_LOCATION));
-
- addReferenceTypeAttribute(object);
-
- try
- {
- PipedInputStream pin = new PipedInputStream();
- PipedOutputStream pout = new PipedOutputStream(pin);
- ObjectOutputStream outStream = new ObjectOutputStream(pout);
- outStream.writeObject(runnable);
-
-
- int size = pin.available();
- byte[] bytes = new byte[size];
- int nRead = pin.read(bytes, 0, size);
- addAttribute(DE.P_DEPTH, "" + nRead); //$NON-NLS-1$
- addFile(bytes, nRead, true);
-
- outStream.close();
- pin.close();
-
- }
- catch (Exception e)
- {
- e.printStackTrace();
- }
- endTag(tagType);
- }
- }
-}

Back to the top