⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xmlreaderbase.java

📁 SAP这个系统的一个转换器
💻 JAVA
📖 第 1 页 / 共 3 页
字号:
// 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 + -