📄 xmlreaderbase.java
字号:
// Decompiled by Jad v1.5.8e2. Copyright 2001 Pavel Kouznetsov.
// Jad home page: http://kpdus.tripod.com/jad.html
// Decompiler options: packimports(3)
// Source File Name: XMLReaderBase.java
package com.sap.mw.jco.util;
import com.sap.mw.jco.JCO;
import java.io.*;
public abstract class XMLReaderBase
{
protected XMLReaderBase(com.sap.mw.jco.JCO.Record record)
{
this(null, record);
}
protected XMLReaderBase(XMLReaderBase parent, com.sap.mw.jco.JCO.Record record)
{
tagBuffer = new char[0];
m_namespace_mode = 0;
m_parent = parent;
m_record = record;
if(m_parent == null)
{
m_buffer = new char[0];
m_offset = 0;
m_length = 0;
} else
{
m_buffer = m_parent.m_buffer;
m_offset = m_parent.m_offset;
m_length = m_buffer.length;
}
m_record.clear();
}
public void parse(String data)
{
if(JCO.getTraceLevel() > 9)
{
StringBuffer buffer = new StringBuffer(data);
for(int i = 0; i < buffer.length(); i += 80)
buffer.insert(i, "\n");
JCO.fireTrace(10, "[JAV-LAYER] XMLReaderBase.parse():\n" + buffer.toString());
}
char buf[] = new char[data.length()];
data.getChars(0, buf.length, buf, 0);
parse(buf, 0, buf.length);
}
public void parse(char buffer[], int offset, int length)
{
try
{
m_buffer = buffer;
m_offset = offset;
m_length = length;
nextProlog();
if(nextTag(true, true) != 1)
{
nextStatement(m_record, false);
nextTag(false);
}
}
catch(Throwable ex)
{
if(JCO.getTraceLevel() > 0)
{
StringWriter w = new StringWriter();
ex.printStackTrace(new PrintWriter(w, true));
JCO.fireTrace(1, "[JAV-LAYER] XMLReaderBase.parse() throws exception \n" + w.toString());
}
if(ex instanceof RuntimeException)
throw (RuntimeException)ex;
if(ex instanceof Error)
throw (Error)ex;
}
}
public void parse(Reader is)
{
int offset = 0;
int length = 0;
int chunk_size = 0;
char ibuffer[] = null;
try
{
ibuffer = new char[10240];
while((chunk_size = is.read(ibuffer, offset, 10240)) > 0)
{
length += chunk_size;
if(chunk_size < 10240)
break;
char old[] = ibuffer;
offset = length;
ibuffer = new char[length + 10240];
System.arraycopy(old, 0, ibuffer, 0, old.length);
}
}
catch(Exception ex)
{
throw new com.sap.mw.jco.JCO.Exception(130, "JCO_ERROR_XML_PARSER", ex.getMessage());
}
parse(ibuffer, 0, length);
}
private final void skipWhitespaces()
{
for(char c = m_offset >= m_length ? '\0' : m_buffer[m_offset]; Character.isWhitespace(c) && m_offset < m_length; c = m_offset >= m_length ? '\0' : m_buffer[m_offset])
m_offset++;
}
private void nextProlog()
{
skipWhitespaces();
int c1 = m_offset >= m_length ? 0 : ((int) (m_buffer[m_offset]));
int c2 = m_offset >= m_length ? 0 : ((int) (m_buffer[m_offset + 1]));
if(c1 == 60 && c2 == 63)
for(c1 = m_offset >= m_length ? 0 : ((int) (m_buffer[m_offset++])); m_offset < m_length && c1 != 62; c1 = m_offset >= m_length ? 0 : ((int) (m_buffer[m_offset++])));
}
private void nextStatement(com.sap.mw.jco.JCO.Record record, boolean inRow)
{
skipWhitespaces();
char c1 = m_offset >= m_length ? '\0' : m_buffer[m_offset];
char c2 = m_offset >= m_length ? '\0' : m_buffer[m_offset + 1];
if(inRow && c1 == '<' && c2 != '/')
{
int saveOffset = m_offset;
nextTag(false);
String item_tag;
if(m_namespace_mode == 1)
item_tag = record.getLineTypeName() == null ? "ITEM" : escape(record.getLineTypeName());
else
item_tag = "item";
m_offset = saveOffset;
if(equals(m_buffer, m_tag_start, (m_tag_end - m_tag_start) + 1, item_tag))
if(record instanceof com.sap.mw.jco.JCO.Table)
record = record.getTable(0);
else
throw new com.sap.mw.jco.JCO.Exception(130, "JCO_ERROR_XML_PARSER", "XML represents a nested table in record " + record.getName() + ". Not fitting to real structure.");
}
for(; c1 == '<' && c2 != '/'; c2 = m_offset >= m_length ? '\0' : m_buffer[m_offset + 1])
{
nextElement(record);
skipWhitespaces();
c1 = m_offset >= m_length ? '\0' : m_buffer[m_offset];
}
}
private int nextTag(boolean unescape)
{
return nextTag(unescape, false);
}
private int nextTag(boolean unescape, boolean check_namespace)
{
int tag_type = 0;
boolean needs_unescaping = false;
boolean has_namespace = false;
skipWhitespaces();
char c = m_offset >= m_length ? '\0' : m_buffer[m_offset];
if(c == '<')
m_offset++;
else
throw new com.sap.mw.jco.JCO.Exception(130, "JCO_ERROR_XML_PARSER", "Expecting a tag to begin with '<' instead of '" + c + "', in \"" + new String(m_buffer, Math.max(0, m_offset - 10), Math.min(10, m_offset) + Math.min(m_length - m_offset, 10)) + "\"");
c = m_offset >= m_length ? '\0' : m_buffer[m_offset];
if(c == '/')
{
tag_type = 1;
m_offset++;
}
m_tag_start = m_tag_end = m_offset;
for(c = m_offset >= m_length ? '\0' : m_buffer[m_offset++]; m_offset < m_length && c != ' ' && c != '>'; c = m_offset >= m_length ? '\0' : m_buffer[m_offset++])
if(c == '_' && (m_offset >= m_length ? '\0' : m_buffer[m_offset]) == '-')
{
m_tag_end++;
needs_unescaping = true;
} else
if(c == ':' && !has_namespace)
{
m_tag_start = m_tag_end = m_offset;
has_namespace = true;
} else
{
m_tag_end++;
}
m_tag_end--;
if(check_namespace)
{
int start = m_offset;
for(; m_offset < m_length && c != '>'; c = m_buffer[m_offset++]);
if(m_offset - start > 1)
{
String namespace = new String(m_buffer, start, m_offset - start - 1);
if(namespace.indexOf("urn:sap-com:document:sap:soap:functions:uc-style") >= 0)
m_namespace_mode = 1;
else
m_namespace_mode = 0;
}
} else
{
for(; m_offset < m_length && c != '>'; c = m_buffer[m_offset++]);
}
if(c != '>')
throw new com.sap.mw.jco.JCO.Exception(130, "JCO_ERROR_XML_PARSER", "Expecting a tag to end with '>' instead of '" + c + "', in \"" + new String(m_buffer, Math.max(0, m_offset - 10), Math.min(10, m_offset) + Math.min(m_length - m_offset, 10)) + "\"");
if(m_offset >= 2 && m_buffer[m_offset - 2] == '/')
tag_type = 1;
if(unescape && needs_unescaping)
{
int i = m_tag_start;
int j = m_tag_start;
while(i <= m_tag_end)
if(m_buffer[i] == '_')
{
if(m_buffer[++i] == '-')
{
if(m_buffer[++i] == '-')
{
i++;
try
{
m_buffer[j++] = (char)Integer.parseInt(new String(m_buffer, i, 2), 16);
}
catch(NumberFormatException ex)
{
throw new com.sap.mw.jco.JCO.Exception(130, "JCO_ERROR_XML_PARSER", "Illegal escape sequence _--" + new String(m_buffer, i, 2) + " encountered");
}
i += 2;
} else
{
m_buffer[j++] = '/';
}
} else
{
m_buffer[j++] = '_';
}
} else
{
m_buffer[j++] = m_buffer[i++];
}
m_tag_end = j - 1;
}
m_tag_typ = tag_type;
return tag_type;
}
public void nextElement(com.sap.mw.jco.JCO.Record record)
{
if(nextTag(true) == 1)
return;
if(m_offset >= m_length)
throw new com.sap.mw.jco.JCO.Exception(130, "JCO_ERROR_XML_PARSER", "Unexpecting end of buffer after <" + new String(m_buffer, m_tag_start, (m_tag_end - m_tag_start) + 1) + ">");
String item_tag;
if(m_namespace_mode == 1)
item_tag = record.getLineTypeName() == null ? "ITEM" : record.getLineTypeName();
else
item_tag = "item";
int index = -1;
int type = -1;
if(equals(m_buffer, m_tag_start, (m_tag_end - m_tag_start) + 1, item_tag))
type = 133;
else
try
{
index = record.indexOf(new String(m_buffer, m_tag_start, (m_tag_end - m_tag_start) + 1));
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -