Cómo extraer un documento XML de una columna BLOB en Oracle que se ha comprimido en Java

Tengo una tabla en Oracle 11G (11.1) que tiene una columna BLOB que contiene documentos XML.

El documento XML se ha escrito en la tabla mediante un programa Java y se ha serializado y comprimido mediante el deflactor java.util.zip.

¿Existe una forma sencilla de extraer este documento utilizando SQL o PLSQL para revertir el proceso utilizado para crear la columna BLOB para recuperar el documento XML original?

Identifiqué un fragmento de Java de una aplicación web que lee la columna que se parece al código a continuación, pero con fines de soporte, me gustaría poder acceder a los datos de la columna desde el back-end.

private IntegrationStagingDataBean fromObjectToBean(StagedMessage message) throws ServerException {
    IntegrationStagingDataBean bean = new IntegrationStagingDataBean();
    bean.setBusinessId(message.getBusinessId());
    bean.setBusinessType(message.getBusinessType());
    bean.setCreateTime(message.getCreateTime());
    bean.setDeleted(message.hasBeenDeleted() ? "Y" : "N");
    bean.setErrorMessage(message.getErrorMessage());
    bean.setId(message.getId());
    bean.setStoreId(message.getStoreId());
    bean.setMessageDirection(message.getMessageDirection().getDbCode());
    bean.setMessageFamily(message.getMessageFamily().getDbCode());
    bean.setMessageType(message.getMessageType().getDbCode());
    bean.setProcessed(message.hasBeenProcessed() ? "Y" : "N");
    bean.setRetryCount(message.getRetryCount());
    bean.setUpdateTime(message.getUpdateTime());
    try {
        bean.setSerializedDeo(ObjectUtils.toByteArray(new CompressedObject(message.getDeo())));
    } catch (IOException ioex) {
        throw new ServerException("Problem setting compressed serialized object", ioex);
    }
    return bean;
}

private StagedMessage fromBeanToObject(IntegrationStagingDataBean bean) throws ServerException {
    DataExchangeObject deo = null;
    Blob blob = (Blob) bean.getSerializedDeo();
    try {
        CompressedObject compressedObject = (CompressedObject) new              
              ObjectInputStream(blob.getBinaryStream()).readObject();
        deo = (DataExchangeObject) compressedObject.recoverObject();
    } catch (Exception e) {
        throw new ServerException("Couldn't uncompress/deserialize DEO from BLOB", e);
    }

++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++

y encontró las siguientes funciones adicionales repartidas en un puñado de paquetes que indican que está usando la función java deflater de java.util.zip. *;

public CompressedObject (objeto objeto) lanza IOException {dataToSend = null; if (objeto! = nulo) dataToSend = ObjectUtils.toCompressedByteArray (objeto); }

public static final byte[] toCompressedByteArray(Object o)
    throws IOException
{
    return compressByteArray(toByteArray(o));
}

public static final byte[] compressByteArray(byte input[])
{
    Deflater compressor = new Deflater(9);
    compressor.setInput(input);
    compressor.finish();
    ByteArrayOutputStream bos = new ByteArrayOutputStream(input.length);
    byte buf[] = new byte[1024];
    int count;
    for(; !compressor.finished(); bos.write(buf, 0, count))
        count = compressor.deflate(buf);

    try
    {
        bos.close();
    }
    catch(IOException e) { }
    return bos.toByteArray();
}

public static final byte[] decompressByteArray(byte arr[])
{
    Inflater decompressor = new Inflater();
    decompressor.setInput(arr);
    ByteArrayOutputStream bos = new ByteArrayOutputStream(arr.length);
    byte buf[] = new byte[1024];
    while(!decompressor.finished()) 
        try
        {
            int count = decompressor.inflate(buf);
            bos.write(buf, 0, count);
        }
        catch(DataFormatException e) { }
    try
    {
        bos.close();
    }
    catch(IOException e) { }
    return bos.toByteArray();
}

Gracias de antemano.

preguntado el 28 de septiembre de 11 a las 05:09

¿Por qué alguien querría serializar un documento XML? -

Es una aplicación cerrada de Oracle que solía enviar datos directamente a una cola JMS pero ahora, en la última versión, la han desacoplado para que escriba en una tabla de preparación (que contiene esta columna de blob que contiene los datos del mensaje). Esto está destinado a permitir que los clientes utilicen su propio sistema de mensajería. Posiblemente, la compresión y la serialización son un remanente de la forma anterior en la que enviaba los datos del mensaje XML, por lo que habría sido mejor si lo hubieran puesto en un CLOB, pero desafortunadamente, no tenemos control sobre eso. -

Supongo que depende de cómo se comprima. Oracle ha incorporado paquetes para hacer compresión y descompresión gzip que he usado en el pasado. Si Java usa gzip, Oracle debería poder descomprimirlo con PLSQL. Si no tiene gzip, puede crear un procedimiento almacenado Java independiente para hacer el mismo trabajo que el código Java. -

Agregué más detalles: parece estar usando java.utils.zip deflate para comprimir los datos, lo que significa que es compresión zlib. De todos modos, ¿deserializar y descomprimir esto usando PLSQL? -

0 Respuestas

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.