de.bps.webservices.clients.onyxreporter.HashMapWrapper.java Source code

Java tutorial

Introduction

Here is the source code for de.bps.webservices.clients.onyxreporter.HashMapWrapper.java

Source

/**
 * <a href="http://www.openolat.org">
 * OpenOLAT - Online Learning and Training</a><br>
 * <p>
 * Licensed under the Apache License, Version 2.0 (the "License"); <br>
 * you may not use this file except in compliance with the License.<br>
 * You may obtain a copy of the License at the
 * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a>
 * <p>
 * Unless required by applicable law or agreed to in writing,<br>
 * software distributed under the License is distributed on an "AS IS" BASIS, <br>
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br>
 * See the License for the specific language governing permissions and <br>
 * limitations under the License.
 * <p>
 * Initial code contributed and copyrighted by<br>
 * BPS Bildungsportal Sachsen GmbH, http://www.bps-system.de
 * <p>
 */
package de.bps.webservices.clients.onyxreporter;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.HashMap;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlType;

import org.apache.commons.codec.binary.Base64;

/**
 * HashMap wrapper class. Uses serialization and base64 encoding to wrap a <code>HashMap<String, String></code>
 * 
 * @author Lars Eberle (laeb@bps-system.de)
 * <ONYX-705>
 */
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "hashmapwrapper")
public class HashMapWrapper implements Serializable {
    private static final long serialVersionUID = 5831008170384520354L;

    @XmlElement(name = "content")
    private String serialized;

    /**
     * @return The wrapped map.
     * @throws OnyxReporterException
     */
    @SuppressWarnings("unchecked")
    public HashMap<String, String> getMap() throws OnyxReporterException {
        if (this.serialized == null) {
            return null;
        }
        HashMap<String, String> results = null;
        final Object o = deserialize(this.serialized);
        if (o == null) {
            final String logMsg = "Got invalid null response from Onyx Reporter in getResults!";
            throw new OnyxReporterException(logMsg);
        } else if (o instanceof HashMap) {
            results = (HashMap<String, String>) o;
        } else {
            String name = null;
            try {
                name = o.getClass().getName();
            } catch (final Exception e) {
                name = "unknown";
            }
            final String logMsg = "Got response from unexpected type from Onyx Reporter in getResults: " + name;
            throw new OnyxReporterException(logMsg);
        }
        return results;
    }

    /**
     * Wraps the given map.
     * 
     * @param map
     * @throws OnyxReporterException
     */
    public void setMap(final HashMap<String, String> map) throws OnyxReporterException {
        if (map == null) {
            final String s = serialize(new HashMap<String, String>());
            this.serialized = s;
        } else {
            String s = serialize(map);
            if (s == null) {
                s = serialize(new HashMap<String, String>());
            }
            this.serialized = s;
        }
    }

    /**
     * Serializes the given object o and encodes the result as non-chunked base64.
     * 
     * @param objectToSerializeAndEncode
     * @return
     * @throws OnyxReporterException
     */
    private static final String serialize(final Object objectToSerializeAndEncode) throws OnyxReporterException {
        final ByteArrayOutputStream baos = new ByteArrayOutputStream();
        ObjectOutputStream oos = null;
        try {
            oos = new ObjectOutputStream(baos);
            oos.writeObject(objectToSerializeAndEncode);
            oos.close();
            oos = null;
            return Base64.encodeBase64String(baos.toByteArray());
        } catch (final IOException e) {
            throw new OnyxReporterException("Could not serialize object!", e);
        } finally {
            try {
                if (oos != null) {
                    oos.close();
                }
            } catch (final IOException e) {
            }
        }
    }

    /**
     * Deserializes an object from the given Base65 encoded string.
     * 
     * @param base64EncodedSerializedObject
     * @return
     * @throws OnyxReporterException
     */
    private static final Object deserialize(final String base64EncodedSerializedObject)
            throws OnyxReporterException {
        final ByteArrayInputStream bais = new ByteArrayInputStream(
                Base64.decodeBase64(base64EncodedSerializedObject));
        ObjectInputStream ois = null;
        try {
            ois = new ObjectInputStream(bais);
            final Object o = ois.readObject();
            return o;
        } catch (final IOException e) {
            throw new OnyxReporterException("Could not deserialize object!", e);
        } catch (final ClassNotFoundException e) {
            throw new OnyxReporterException("Could not deserialize object!", e);
        } finally {
            try {
                if (ois != null) {
                    ois.close();
                }
            } catch (final IOException e) {
            }
        }
    }
}
// </ONYX-705>