blob: 981c663d99f37e1d9839d3271e8dd3a5723a6870 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.axis2.util;
import org.apache.axis2.context.externalize.ActivateUtils;
import org.apache.axis2.context.externalize.ExternalizeConstants;
import org.apache.axis2.context.externalize.SafeObjectInputStream;
import org.apache.axis2.context.externalize.SafeObjectOutputStream;
import org.apache.axis2.description.AxisMessage;
import org.apache.axis2.description.AxisOperation;
import org.apache.axis2.description.AxisService;
import org.apache.axis2.description.AxisServiceGroup;
import org.apache.axis2.engine.AxisConfiguration;
import org.apache.axis2.transport.TransportListener;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import javax.xml.namespace.QName;
import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectOutput;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.Map;
/**
* Utility to write, read and activate externalized Objects
*/
public class ObjectStateUtils implements ExternalizeConstants {
/*
* setup for logging
*/
private static final Log log = LogFactory.getLog(ObjectStateUtils.class);
// used to indicate an valid "null" object,
// typically used in key-value pairs where a non-null key refers to a null
// value
public static String NULL_OBJECT = "NULL_OBJ";
// message/trace/logging strings
public static final String UNSUPPORTED_SUID = "Serialization version ID is not supported.";
public static final String UNSUPPORTED_REVID = "Revision ID is not supported.";
// --------------------------------------------------------------------
// Save/Restore methods
// --------------------------------------------------------------------
/**
* Write a string to the specified output stream.
*
* @param o The output stream
* @param str The string to write
* @param desc A text description to use for logging
* @throws IOException Exception
*/
public static void writeString(ObjectOutput o, String str, String desc) throws IOException {
SafeObjectOutputStream out = SafeObjectOutputStream.install(o);
out.writeUTF(desc);
out.writeObject(str);
}
/**
* Read a string from the specified input stream. Returns null if no string is available.
*
* @param i The input stream
* @param desc A text description to use for logging
* @return The string or null, if not available
* @throws IOException
* @throws ClassNotFoundException
*/
public static String readString(ObjectInput i, String desc) throws IOException,
ClassNotFoundException {
SafeObjectInputStream in = SafeObjectInputStream.install(i);
// Get the marker
in.readUTF();
// Get the object
return (String) in.readObject();
}
/**
* Write an object to the specified output stream.
*
* @param o The output stream
* @param obj The object to write
* @param desc A text description to use for logging
* @throws IOException Exception
*/
public static void writeObject(ObjectOutput o, Object obj, String desc) throws IOException {
SafeObjectOutputStream out = SafeObjectOutputStream.install(o);
out.writeUTF(desc);
out.writeObject(obj);
}
/**
* Read an object from the specified input stream. Returns null if no object is available.
*
* @param i The input stream
* @param desc A text description to use for logging
* @return The object or null, if not available
* @throws IOException
* @throws ClassNotFoundException
*/
public static Object readObject(ObjectInput i, String desc) throws IOException,
ClassNotFoundException {
SafeObjectInputStream in = SafeObjectInputStream.install(i);
in.readUTF(); // Read Marker
return in.readObject();
}
/**
* Write an array of objects to the specified output stream. NOTE: each object in the array
* should implement either java.io.Serializable or java.io.Externalizable in order to be saved
*
* @param o The output stream
* @param al The ArrayList to write
* @param desc A text description to use for logging
* @throws IOException Exception
*/
public static void writeArrayList(ObjectOutput o, ArrayList al, String desc)
throws IOException {
SafeObjectOutputStream out = SafeObjectOutputStream.install(o);
out.writeUTF(desc);
out.writeList(al);
}
/**
* Reads an array of objects from the specified input stream. Returns null if no array is
* available. NOTE: each object in the array should implement either java.io.Serializable or
* java.io.Externalizable in order to be saved
*
* @param i The input stream
* @param desc A text description to use for logging
* @return The ArrayList or null, if not available
* @throws IOException
* @throws ClassNotFoundException
*/
public static ArrayList readArrayList(ObjectInput i, String desc) throws IOException {
SafeObjectInputStream in = SafeObjectInputStream.install(i);
in.readUTF();
return in.readArrayList();
}
/**
* Write a hashmap of objects to the specified output stream. NOTE: each object in the map
* should implement either java.io.Serializable or java.io.Externalizable in order to be saved
*
* @param o The output stream
* @param map The HashMap to write
* @param desc A text description to use for logging
* @throws IOException Exception
*/
public static void writeHashMap(ObjectOutput o, HashMap map, String desc) throws IOException {
SafeObjectOutputStream out = SafeObjectOutputStream.install(o);
out.writeUTF(desc);
out.writeMap(map);
}
/**
* Read a hashmap of objects from the specified input stream. Returns null if no hashmap is
* available.
*
* @param in The input stream
* @param desc A text description to use for logging
* @return The HashMap or null, if not available
* @throws IOException
* @throws ClassNotFoundException
*/
public static HashMap readHashMap(ObjectInput i, String desc) throws IOException {
SafeObjectInputStream in = SafeObjectInputStream.install(i);
in.readUTF();
return in.readHashMap();
}
/**
* Write a linked list of objects to the specified output stream. <NOTE: each object in the
* array should implement either java.io.Serializable or java.io.Externalizable in order to be
* saved
*
* @param o The output stream
* @param list The LinkedList to write
* @param desc A text description to use for logging
* @throws IOException Exception
*/
public static void writeLinkedList(ObjectOutput o, LinkedList objlist, String desc)
throws IOException {
SafeObjectOutputStream out = SafeObjectOutputStream.install(o);
out.writeUTF(desc);
out.writeList(objlist);
}
/**
* Reads a linked list of objects from the specified input stream. Returns null if no array is
* available.
*
* @param in The input stream
* @param desc A text description to use for logging
* @return The linked list or null, if not available
* @throws IOException
* @throws ClassNotFoundException
*/
public static LinkedList readLinkedList(ObjectInput i, String desc) throws IOException {
SafeObjectInputStream in = SafeObjectInputStream.install(i);
in.readUTF();
return in.readLinkedList();
}
// --------------------------------------------------------------------
// Finder methods
// --------------------------------------------------------------------
/**
* Find the AxisOperation object that matches the criteria
*
* @param axisConfig The AxisConfiguration object
* @param opClassName the class name string for the target object (could be a derived class)
* @param opQName the name associated with the operation
* @return the AxisOperation object that matches the given criteria
*/
public static AxisOperation findOperation(AxisConfiguration axisConfig, String opClassName,
QName opQName) {
return ActivateUtils.findOperation(axisConfig, opClassName, opQName);
}
/**
* Find the AxisOperation object that matches the criteria
*
* @param service The AxisService object
* @param opClassName The class name string for the target object (could be a derived class)
* @param opQName the name associated with the operation
* @return the AxisOperation object that matches the given criteria
*/
public static AxisOperation findOperation(AxisService service,
String opClassName,
QName opQName) {
return ActivateUtils.findOperation(service, opClassName, opQName);
}
/**
* Find the AxisService object that matches the criteria
*
* @param axisConfig The AxisConfiguration object
* @param serviceClassName the class name string for the target object (could be a derived
* class)
* @param serviceName the name associated with the service
* @return the AxisService object that matches the criteria
*/
public static AxisService findService(AxisConfiguration axisConfig, String serviceClassName,
String serviceName) {
return ActivateUtils.findService(axisConfig, serviceClassName, serviceName);
}
/**
* Find the AxisServiceGroup object that matches the criteria <p/> <B>Note<B> the saved
* service group meta information may not match up with any of the serviceGroups that
* are in the current AxisConfiguration object.
*
* @param axisConfig The AxisConfiguration object
* @param serviceGrpClassName the class name string for the target object (could be a derived
* class)
* @param serviceGrpName the name associated with the service group
* @return the AxisServiceGroup object that matches the criteria
*/
public static AxisServiceGroup findServiceGroup(AxisConfiguration axisConfig,
String serviceGrpClassName,
String serviceGrpName) {
return ActivateUtils.findServiceGroup(axisConfig, serviceGrpClassName, serviceGrpName);
}
/**
* Find the AxisMessage object that matches the criteria
*
* @param op The AxisOperation object
* @param msgName The name associated with the message
* @param msgElementName The name associated with the message element
* @return the AxisMessage object that matches the given criteria
*/
public static AxisMessage findMessage(AxisOperation op,
String msgName,
String msgElementName) {
return ActivateUtils.findMessage(op, msgName, msgElementName);
}
/**
* Find the Handler object that matches the criteria
*
* @param existingHandlers The list of existing handlers and phases
* @param handlerClassName the class name string for the target object (could be a derived
* class)
* @return the Handler object that matches the criteria
*/
public static Object findHandler(ArrayList existingHandlers,
MetaDataEntry metaDataEntry)
{
return ActivateUtils.findHandler(existingHandlers, metaDataEntry);
}
/**
* Find the TransportListener object that matches the criteria <p/> <B>Note<B> the saved meta
* information may not match up with any of the objects that are in the current
* AxisConfiguration object.
*
* @param axisConfig The AxisConfiguration object
* @param listenerClassName the class name string for the target object (could be a derived
* class)
* @return the TransportListener object that matches the criteria
*/
public static TransportListener findTransportListener(AxisConfiguration axisConfig,
String listenerClassName) {
return ActivateUtils.findTransportListener(axisConfig, listenerClassName);
}
/**
* Compares the two collections to see if they are equivalent.
*
* @param a1 The first collection
* @param a2 The second collection
* @param strict Indicates whether strict checking is required. Strict checking means that the
* two collections must have the same elements in the same order.
* Non-strict checking means that the two collections must have the same elements,
* but the order is not significant.
* @return TRUE if the two collections are equivalent FALSE, otherwise
*/
public static boolean isEquivalent(ArrayList a1, ArrayList a2, boolean strict) {
return ActivateUtils.isEquivalent(a1, a2, strict);
}
/**
* Compares the two collections to see if they are equivalent.
*
* @param m1 The first collection
* @param m2 The second collection
* @param strict Indicates whether strict checking is required. Strict checking means that the
* two collections must have the same mappings. Non-strict checking means that the two
* collections must have the same keys. In both cases, the order is not significant.
* @return TRUE if the two collections are equivalent FALSE, otherwise
*/
public static boolean isEquivalent(Map m1, Map m2, boolean strict) {
return ActivateUtils.isEquivalent(m1, m2, strict);
}
/**
* Compares the two collections to see if they are equivalent.
*
* @param l1
* The first collection
* @param l2
* The second collection
* @return TRUE if the two collections are equivalent FALSE, otherwise
*/
public static boolean isEquivalent(LinkedList l1, LinkedList l2) {
return ActivateUtils.isEquivalent(l1, l2);
}
}