All Downloads are FREE. Search and download functionalities are using the official Maven repository.

at.spardat.xma.baserpc.RemoteData Maven / Gradle / Ivy

/*******************************************************************************
 * Copyright (c) 2003, 2007 s IT Solutions AT Spardat GmbH .
 * 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
 *
 * Contributors:
 *     s IT Solutions AT Spardat GmbH - initial API and implementation
 *******************************************************************************/

//@(#) $Id: RemoteData.java 2089 2007-11-28 13:56:13Z s3460 $
package at.spardat.xma.baserpc;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

import at.spardat.xma.serializer.XmaInput;
import at.spardat.xma.serializer.XmaOutput;

/**
 * Models the data transferred via BaseRPCs. The main functionality in this class is
 * its ability to serialize and deserialize the data.
 * 
 * @author YSD
 */
public class RemoteData {

    /**
     * Collection of parameters. Keys are Shorts (ids) and values are objects. 
     * May be null if no parameters are provided. The ids of programmer supplied
     * parameters must be greater than or equal to zero. XMA runtime parameters
     * have a negative id.
     */
    private HashMap             parameters_;
    


    /**
     * Write the parameters to the XmaOutput.
     */
    protected void externalize (XmaOutput o) throws IOException {
        short           numParameters = (parameters_ == null ? 0 : (short) parameters_.size());
        o.writeShort ("numParams", numParameters);
        if (numParameters > 0) {
            Iterator    iter = parameters_.entrySet().iterator();
            while (iter.hasNext()) {
                Map.Entry e = (Map.Entry) iter.next();
                short       id = ((Short)e.getKey()).shortValue();
                Object      val = e.getValue();
                boolean     valIsCollection = (val instanceof UnserializableCollection);
                // write the id of the parameter
                o.writeShort("idParam", id);
                // write the fact if the parameter is a collection
                o.writeBoolean("isColl", valIsCollection);
                if (valIsCollection) {
                    // write number of objects contained in the collection
                    Collection      coll = ((UnserializableCollection)val).fCollection;
                    o.writeShort ("collSize", (short)coll.size());
                    Iterator        iter2 = coll.iterator();
                    while (iter2.hasNext()) {
                        Object el = (Object) iter2.next();
                        // for each object, first write boolean if the object is null
                        o.writeBoolean ("isNull", el == null);
                        if (el != null) {
                            // if not null, write the object
                            o.writeObject ("obj", el);
                        }
                    }
                } else {
                    o.writeObject("obj", e.getValue());
                }
            }
        }
    }
    
    /**
     * Reads parameters as written by externalizeParameters.
     */
    protected void internalize (XmaInput in) throws IOException, ClassNotFoundException {
        parameters_ = new HashMap();
        short           numParameters = in.readShort();
        for (int i=0; ijava.io.Serializable
     *                   and must be successfully be serialized. It cannot be null.
     * @throws IllegalArgumentException if any before mentioned condition is violated.
     */
    public void setParameter (int id, Object parameter) {
        if (id < 0 || id > 127) throw new IllegalArgumentException();
        setParameterInternal (id, parameter);
    }
    
    /**
     * Like setParameter, except that the provided collection is not
     * serialized itself. Instead, only the elements of the collection are
     * serialized. The corresponding get-call (getUnserializableCollection)
     * must be used to retrieve the collection. 
     */
    public void setUnserializableCollection (int id, Collection parameter) {
        setParameter (id, new UnserializableCollection (parameter));
    }
    
    /**
     * For package internal usage without range checks on the ids.
     */
    void setParameterInternal (int id, Object parameter) {
        if (parameter == null) throw new IllegalArgumentException();
        if (parameters_ == null) parameters_ = new HashMap();
        parameters_.put(new Short((short)id), parameter);
    }
    
    /**
     * Retrieves a parameter for a given id.
     * 
     * @param id the id that has been used in setParameter.
     * @return the same object set via setParameter or null if there
     *          is no parameter with the given id.
     */
    public Object getParameter (int id) {
        if (parameters_ == null) return null;
        return parameters_.get(new Short((short)id));
    }
    
    /**
     * Retrieves a parameter that has been set via setUnserializableCollection. Please
     * note that the type returned need not be the one provided via setUnserializableCollection. 
     * In fact, you cannot make any assumptions regarding the returned type beyond beeing a 
     * Collection.
     * 
     * @return null if no such parameter
     */
    public Collection getUnserializableCollection (int id) {
        Object          par = getParameter (id);
        if (par == null) return null;
        if (!(par instanceof UnserializableCollection)) return null;
        return ((UnserializableCollection)par).fCollection;
    }
    
    /**
     * Returns the number of parameters
     */
    public int getParameterCount () {
        if (parameters_ == null) return 0;
        return parameters_.size();
    }
    
    /**
     * Class to wrap a Collection to signal that it should not be treated conventially
     * in the serialization process, but unfolded. 
     */
    private static class UnserializableCollection {
        public UnserializableCollection (Collection c) {
            fCollection = c;
        }
        public Collection       fCollection;
    }

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy