http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/a50fccdd/modules/core/src/main/java/org/apache/ignite/marshaller/optimized/GridOptimizedMarshallerUtils.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/marshaller/optimized/GridOptimizedMarshallerUtils.java b/modules/core/src/main/java/org/apache/ignite/marshaller/optimized/GridOptimizedMarshallerUtils.java new file mode 100644 index 0000000..8cfaca8 --- /dev/null +++ b/modules/core/src/main/java/org/apache/ignite/marshaller/optimized/GridOptimizedMarshallerUtils.java @@ -0,0 +1,450 @@ +/* @java.file.header */ + +/* _________ _____ __________________ _____ + * __ ____/___________(_)______ /__ ____/______ ____(_)_______ + * _ / __ __ ___/__ / _ __ / _ / __ _ __ `/__ / __ __ \ + * / /_/ / _ / _ / / /_/ / / /_/ / / /_/ / _ / _ / / / + * \____/ /_/ /_/ \_,__/ \____/ \__,_/ /_/ /_/ /_/ + */ + +package org.apache.ignite.marshaller.optimized; + +import org.gridgain.grid.util.*; +import org.gridgain.grid.util.typedef.*; +import org.jdk8.backport.*; +import org.jetbrains.annotations.*; +import sun.misc.*; + +import java.io.*; +import java.lang.reflect.*; +import java.nio.charset.*; +import java.security.*; +import java.util.*; +import java.util.concurrent.*; + +import static org.apache.ignite.marshaller.optimized.GridOptimizedMarshallable.*; + +/** + * Miscellaneous utility methods to facilitate {@link GridOptimizedMarshaller}. + */ +class GridOptimizedMarshallerUtils { + /** Unsafe. */ + private static final Unsafe UNSAFE = GridUnsafe.unsafe(); + + /** {@code Null} object reference. */ + static final byte NULL = (byte)0x70; + + /** Handle reference. */ + static final byte HANDLE = (byte)0x71; + + /** Object reference. */ + static final byte OBJECT = (byte)0x72; + + /** UTF-8 character name. */ + static final Charset UTF_8 = Charset.forName("UTF-8"); + + /** Class descriptors cache. */ + private static final ConcurrentMap<Class<?>, GridOptimizedClassDescriptor> CLS_DESC_CACHE = + new ConcurrentHashMap8<>(256); + + /** Classes cache by name. */ + private static final ConcurrentHashMap8<ClassLoader, ConcurrentHashMap8<String, Class<?>>> CLS_BY_NAME_CACHE = + new ConcurrentHashMap8<>(); + + /** + * Suppresses default constructor, ensuring non-instantiability. + */ + private GridOptimizedMarshallerUtils() { + // No-op. + } + + /** + * Gets class for given name and class loader. + * + * @param name Class name. + * @param ldr Class loader. + * @return Class. + * @throws ClassNotFoundException If class was not found. + */ + static Class<?> forName(String name, ClassLoader ldr) throws ClassNotFoundException { + assert ldr != null; + assert name != null; + + ConcurrentHashMap8<String, Class<?>> cache = CLS_BY_NAME_CACHE.get(ldr); + + Class<?> cls = null; + + if (cache == null) { + cache = new ConcurrentHashMap8<>(); + + ConcurrentHashMap8<String, Class<?>> old = CLS_BY_NAME_CACHE.putIfAbsent(ldr, cache); + + if (old != null) { + cache = old; + + cls = cache.get(name); + } + } + else + cls = cache.get(name); + + if (cls == null) { + cls = Class.forName(name, true, ldr); + + cache.put(name, cls); + } + + return cls; + } + + /** + * Gets descriptor for provided class. + * + * @param cls Class. + * @param obj Object. + * @return Descriptor. + * @throws IOException In case of error. + */ + static GridOptimizedClassDescriptor classDescriptor(Class<?> cls, @Nullable Object obj) throws IOException { + if (obj != null) { + if (obj instanceof GridOptimizedMarshallable) { + GridOptimizedMarshallable m = (GridOptimizedMarshallable)obj; + + Object clsId = m.ggClassId(); + + if (clsId != null && !(clsId instanceof GridOptimizedClassDescriptor)) + throw new IOException("Method '" + obj.getClass().getName() + ".ggClassId() must return " + + "the value of the field '" + CLS_ID_FIELD_NAME + "'."); + + GridOptimizedClassDescriptor desc = (GridOptimizedClassDescriptor)clsId; + + if (desc == null) { + desc = new GridOptimizedClassDescriptor(cls); + + try { + Field field = obj.getClass().getDeclaredField(CLS_ID_FIELD_NAME); + + field.setAccessible(true); + + Object o = field.get(null); + + if (o == null) { + if ((field.getModifiers() & Modifier.STATIC) == 0) + throw new IOException("Field '" + CLS_ID_FIELD_NAME + "' must be declared static: " + + obj.getClass().getName()); + + field.set(null, desc); + + if (m.ggClassId() == null) + throw new IOException( "Method '" + obj.getClass().getName() + ".ggClassId() must " + + "return the value of the field '" + CLS_ID_FIELD_NAME + "': " + + obj.getClass().getName()); + } + else if (!(o instanceof GridOptimizedClassDescriptor)) + throw new IOException("Field '" + CLS_ID_FIELD_NAME + "' must be declared with " + + "null value: " + obj.getClass().getName()); + } + catch (NoSuchFieldException e) { + throw new IOException("GridOptimizedMarshallable classes must have static field declared " + + "[fieldName=" + CLS_ID_FIELD_NAME + ", cls=" + obj.getClass().getName() + ']', e); + } + catch (IllegalAccessException e) { + throw new IOException("Failed to set field '" + CLS_ID_FIELD_NAME + "' on '" + + obj.getClass().getName() + "' class.", e); + } + } + + return desc; + } + } + + GridOptimizedClassDescriptor desc = CLS_DESC_CACHE.get(cls); + + if (desc == null) { + GridOptimizedClassDescriptor existing = CLS_DESC_CACHE.putIfAbsent(cls, + desc = new GridOptimizedClassDescriptor(cls)); + + if (existing != null) + desc = existing; + } + + return desc; + } + + /** + * Undeployment callback. + * + * @param ldr Undeployed class loader. + */ + public static void onUndeploy(ClassLoader ldr) { + CLS_BY_NAME_CACHE.remove(ldr); + + for (Class<?> cls : CLS_DESC_CACHE.keySet()) { + if (ldr.equals(cls.getClassLoader())) + CLS_DESC_CACHE.remove(cls); + } + } + + /** + * Intended for test purposes only. + */ + public static void clearCache() { + CLS_BY_NAME_CACHE.clear(); + CLS_DESC_CACHE.clear(); + } + + /** + * + */ + public static void printMemoryStats() { + X.println(">>>"); + X.println(">>> GridOptimizedMarshallerUtils memory stats:"); + X.println(" Cache size: " + CLS_DESC_CACHE.size()); + + for (Map.Entry<Class<?>, GridOptimizedClassDescriptor> e : CLS_DESC_CACHE.entrySet()) + X.println(" " + e.getKey() + " : " + e.getValue()); + } + + /** + * Computes the serial version UID value for the given class. + * The code is taken from {@link ObjectStreamClass#computeDefaultSUID(Class)}. + * + * @param cls A class. + * @param fields Fields. + * @return A serial version UID. + * @throws IOException If failed. + */ + @SuppressWarnings("ForLoopReplaceableByForEach") + static Long computeSerialVersionUid(Class cls, List<Field> fields) throws IOException { + if (Serializable.class.isAssignableFrom(cls) && !Enum.class.isAssignableFrom(cls)) + return ObjectStreamClass.lookup(cls).getSerialVersionUID(); + + MessageDigest md; + + try { + md = MessageDigest.getInstance("SHA"); + } + catch (NoSuchAlgorithmException e) { + throw new IOException("Failed to get digest for SHA.", e); + } + + md.update(cls.getName().getBytes(UTF_8)); + + if (!F.isEmpty(fields)) { + for (int i = 0; i < fields.size(); i++) { + Field f = fields.get(i); + + md.update(f.getName().getBytes(UTF_8)); + md.update(f.getType().getName().getBytes(UTF_8)); + } + } + + byte[] hashBytes = md.digest(); + + long hash = 0; + + // Composes a single-long hash from the byte[] hash. + for (int i = Math.min(hashBytes.length, 8) - 1; i >= 0; i--) + hash = (hash << 8) | (hashBytes[i] & 0xFF); + + return hash; + } + + /** + * Gets byte field value. + * + * @param obj Object. + * @param off Field offset. + * @return Byte value. + */ + static byte getByte(Object obj, long off) { + return UNSAFE.getByte(obj, off); + } + + /** + * Sets byte field value. + * + * @param obj Object. + * @param off Field offset. + * @param val Value. + */ + static void setByte(Object obj, long off, byte val) { + UNSAFE.putByte(obj, off, val); + } + + /** + * Gets short field value. + * + * @param obj Object. + * @param off Field offset. + * @return Short value. + */ + static short getShort(Object obj, long off) { + return UNSAFE.getShort(obj, off); + } + + /** + * Sets short field value. + * + * @param obj Object. + * @param off Field offset. + * @param val Value. + */ + static void setShort(Object obj, long off, short val) { + UNSAFE.putShort(obj, off, val); + } + + /** + * Gets integer field value. + * + * @param obj Object. + * @param off Field offset. + * @return Integer value. + */ + static int getInt(Object obj, long off) { + return UNSAFE.getInt(obj, off); + } + + /** + * Sets integer field value. + * + * @param obj Object. + * @param off Field offset. + * @param val Value. + */ + static void setInt(Object obj, long off, int val) { + UNSAFE.putInt(obj, off, val); + } + + /** + * Gets long field value. + * + * @param obj Object. + * @param off Field offset. + * @return Long value. + */ + static long getLong(Object obj, long off) { + return UNSAFE.getLong(obj, off); + } + + /** + * Sets long field value. + * + * @param obj Object. + * @param off Field offset. + * @param val Value. + */ + static void setLong(Object obj, long off, long val) { + UNSAFE.putLong(obj, off, val); + } + + /** + * Gets float field value. + * + * @param obj Object. + * @param off Field offset. + * @return Float value. + */ + static float getFloat(Object obj, long off) { + return UNSAFE.getFloat(obj, off); + } + + /** + * Sets float field value. + * + * @param obj Object. + * @param off Field offset. + * @param val Value. + */ + static void setFloat(Object obj, long off, float val) { + UNSAFE.putFloat(obj, off, val); + } + + /** + * Gets double field value. + * + * @param obj Object. + * @param off Field offset. + * @return Double value. + */ + static double getDouble(Object obj, long off) { + return UNSAFE.getDouble(obj, off); + } + + /** + * Sets double field value. + * + * @param obj Object. + * @param off Field offset. + * @param val Value. + */ + static void setDouble(Object obj, long off, double val) { + UNSAFE.putDouble(obj, off, val); + } + + /** + * Gets char field value. + * + * @param obj Object. + * @param off Field offset. + * @return Char value. + */ + static char getChar(Object obj, long off) { + return UNSAFE.getChar(obj, off); + } + + /** + * Sets char field value. + * + * @param obj Object. + * @param off Field offset. + * @param val Value. + */ + static void setChar(Object obj, long off, char val) { + UNSAFE.putChar(obj, off, val); + } + + /** + * Gets boolean field value. + * + * @param obj Object. + * @param off Field offset. + * @return Boolean value. + */ + static boolean getBoolean(Object obj, long off) { + return UNSAFE.getBoolean(obj, off); + } + + /** + * Sets boolean field value. + * + * @param obj Object. + * @param off Field offset. + * @param val Value. + */ + static void setBoolean(Object obj, long off, boolean val) { + UNSAFE.putBoolean(obj, off, val); + } + + /** + * Gets field value. + * + * @param obj Object. + * @param off Field offset. + * @return Value. + */ + static Object getObject(Object obj, long off) { + return UNSAFE.getObject(obj, off); + } + + /** + * Sets field value. + * + * @param obj Object. + * @param off Field offset. + * @param val Value. + */ + static void setObject(Object obj, long off, Object val) { + UNSAFE.putObject(obj, off, val); + } +}
http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/a50fccdd/modules/core/src/main/java/org/apache/ignite/marshaller/optimized/GridOptimizedObjectInputStream.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/marshaller/optimized/GridOptimizedObjectInputStream.java b/modules/core/src/main/java/org/apache/ignite/marshaller/optimized/GridOptimizedObjectInputStream.java new file mode 100644 index 0000000..384b643 --- /dev/null +++ b/modules/core/src/main/java/org/apache/ignite/marshaller/optimized/GridOptimizedObjectInputStream.java @@ -0,0 +1,1008 @@ +/* @java.file.header */ + +/* _________ _____ __________________ _____ + * __ ____/___________(_)______ /__ ____/______ ____(_)_______ + * _ / __ __ ___/__ / _ __ / _ / __ _ __ `/__ / __ __ \ + * / /_/ / _ / _ / / /_/ / / /_/ / / /_/ / _ / _ / / / + * \____/ /_/ /_/ \_,__/ \____/ \__,_/ /_/ /_/ /_/ + */ + +package org.apache.ignite.marshaller.optimized; + +import org.apache.ignite.lang.*; +import org.gridgain.grid.util.*; +import org.gridgain.grid.util.io.*; +import org.gridgain.grid.util.typedef.*; +import org.gridgain.grid.util.typedef.internal.*; +import sun.misc.*; + +import java.io.*; +import java.lang.reflect.*; +import java.util.*; + +import static org.apache.ignite.marshaller.optimized.GridOptimizedMarshallerUtils.*; + +/** + * Optimized object input stream. + */ +class GridOptimizedObjectInputStream extends ObjectInputStream { + /** Unsafe. */ + private static final Unsafe UNSAFE = GridUnsafe.unsafe(); + + /** Dummy object for HashSet. */ + private static final Object DUMMY = new Object(); + + /** */ + private final HandleTable handles = new HandleTable(10); + + /** */ + private ClassLoader clsLdr; + + /** */ + private GridDataInput in; + + /** */ + private Object curObj; + + /** */ + private List<T2<GridOptimizedFieldType, Long>> curFields; + + /** */ + private List<IgniteBiTuple<Integer, GridOptimizedFieldType>> curFieldInfoList; + + /** */ + private Map<String, IgniteBiTuple<Integer, GridOptimizedFieldType>> curFieldInfoMap; + + /** */ + private Class<?> curCls; + + /** + * @param in Input. + * @throws IOException In case of error. + */ + GridOptimizedObjectInputStream(GridDataInput in) throws IOException { + this.in = in; + } + + /** + * @throws IOException In case of error. + */ + GridOptimizedObjectInputStream() throws IOException { + // No-op. + } + + /** + * @param clsLdr Class loader. + */ + void classLoader(ClassLoader clsLdr) { + this.clsLdr = clsLdr; + } + + /** + * @return Class loader. + */ + ClassLoader classLoader() { + return clsLdr; + } + + /** + * @return Input. + */ + public GridDataInput in() { + return in; + } + + /** + * @param in Input. + */ + public void in(GridDataInput in) { + this.in = in; + } + + /** {@inheritDoc} */ + @Override public void close() throws IOException { + reset(); + } + + /** {@inheritDoc} */ + @SuppressWarnings("NonSynchronizedMethodOverridesSynchronizedMethod") + @Override public void reset() throws IOException { + in.reset(); + handles.clear(); + + curObj = null; + curFields = null; + curFieldInfoList = null; + curFieldInfoMap = null; + } + + /** {@inheritDoc} */ + @Override public Object readObjectOverride() throws ClassNotFoundException, IOException { + curObj = null; + curFields = null; + curFieldInfoList = null; + curFieldInfoMap = null; + + byte ref = in.readByte(); + + switch (ref) { + case NULL: + return null; + + case HANDLE: + return handles.lookup(readInt()); + + case OBJECT: + GridOptimizedClassDescriptor desc = GridOptimizedClassResolver.readClass(this, clsLdr); + + curCls = desc.describedClass(); + + return desc.read(this); + + default: + SB msg = new SB("Unexpected error occurred during unmarshalling"); + + if (curCls != null) + msg.a(" of an instance of the class: ").a(curCls.getName()); + + msg.a(". Check that all nodes are running the same version of GridGain and that all nodes have " + + "GridOptimizedMarshaller configured with identical optimized classes lists, if any " + + "(see setClassNames and setClassNamesPath methods). If your serialized classes implement " + + "java.io.Externalizable interface, verify that serialization logic is correct."); + + throw new IOException(msg.toString()); + } + } + + /** + * Reads array from this stream. + * + * @param compType Array component type. + * @return Array. + * @throws ClassNotFoundException If class not found. + * @throws IOException In case of error. + */ + <T> T[] readArray(Class<T> compType) throws ClassNotFoundException, IOException { + int len = in.readInt(); + + T[] arr = (T[])Array.newInstance(compType, len); + + handles.assign(arr); + + for (int i = 0; i < len; i++) + arr[i] = (T)readObject(); + + return arr; + } + + /** + * Reads {@link UUID} from this stream. + * + * @return UUID. + * @throws IOException In case of error. + */ + UUID readUuid() throws IOException { + UUID uuid = new UUID(readLong(), readLong()); + + handles.assign(uuid); + + return uuid; + } + + /** + * Reads {@link Properties} from this stream. + * + * @return Properties. + * @throws ClassNotFoundException If class not found. + * @throws IOException In case of error. + */ + Properties readProperties() throws ClassNotFoundException, IOException { + Properties dflts = readBoolean() ? null : (Properties)readObject(); + + Properties props = new Properties(dflts); + + int size = in.readInt(); + + for (int i = 0; i < size; i++) + props.setProperty(readUTF(), readUTF()); + + handles.assign(props); + + return props; + } + + /** + * Reads and sets all non-static and non-transient field values from this stream. + * + * @param obj Object. + * @param fieldOffs Field offsets. + * @throws ClassNotFoundException If class not found. + * @throws IOException In case of error. + */ + @SuppressWarnings("ForLoopReplaceableByForEach") + void readFields(Object obj, List<T2<GridOptimizedFieldType, Long>> fieldOffs) throws ClassNotFoundException, + IOException { + for (int i = 0; i < fieldOffs.size(); i++) { + T2<GridOptimizedFieldType, Long> t = fieldOffs.get(i); + + switch ((t.get1())) { + case BYTE: + setByte(obj, t.get2(), readByte()); + + break; + + case SHORT: + setShort(obj, t.get2(), readShort()); + + break; + + case INT: + setInt(obj, t.get2(), readInt()); + + break; + + case LONG: + setLong(obj, t.get2(), readLong()); + + break; + + case FLOAT: + setFloat(obj, t.get2(), readFloat()); + + break; + + case DOUBLE: + setDouble(obj, t.get2(), readDouble()); + + break; + + case CHAR: + setChar(obj, t.get2(), readChar()); + + break; + + case BOOLEAN: + setBoolean(obj, t.get2(), readBoolean()); + + break; + + case OTHER: + setObject(obj, t.get2(), readObject()); + } + } + } + + /** + * Reads {@link Externalizable} object. + * + * @param constructor Constructor. + * @param readResolveMtd {@code readResolve} method. + * @return Object. + * @throws ClassNotFoundException If class not found. + * @throws IOException In case of error. + */ + Object readExternalizable(Constructor<?> constructor, Method readResolveMtd) + throws ClassNotFoundException, IOException { + Object obj; + + try { + obj = constructor.newInstance(); + } + catch (InstantiationException | InvocationTargetException | IllegalAccessException e) { + throw new IOException(e); + } + + int handle = handles.assign(obj); + + Externalizable extObj = ((Externalizable)obj); + + extObj.readExternal(this); + + if (readResolveMtd != null) { + try { + obj = readResolveMtd.invoke(obj); + + handles.set(handle, obj); + } + catch (IllegalAccessException | InvocationTargetException e) { + throw new IOException(e); + } + } + + return obj; + } + + /** + * Reads serializable object. + * + * @param cls Class. + * @param mtds {@code readObject} methods. + * @param readResolveMtd {@code readResolve} method. + * @param fields class fields details. + * @return Object. + * @throws ClassNotFoundException If class not found. + * @throws IOException In case of error. + */ + @SuppressWarnings("ForLoopReplaceableByForEach") + Object readSerializable(Class<?> cls, List<Method> mtds, Method readResolveMtd, + GridOptimizedClassDescriptor.Fields fields) throws ClassNotFoundException, IOException { + Object obj; + + try { + obj = UNSAFE.allocateInstance(cls); + } + catch (InstantiationException e) { + throw new IOException(e); + } + + int handle = handles.assign(obj); + + for (int i = 0; i < mtds.size(); i++) { + Method mtd = mtds.get(i); + + if (mtd != null) { + curObj = obj; + curFields = fields.fieldOffs(i); + curFieldInfoList = fields.fieldInfoList(i); + curFieldInfoMap = fields.fieldInfoMap(i); + + try { + mtd.invoke(obj, this); + } + catch (IllegalAccessException | InvocationTargetException e) { + throw new IOException(e); + } + } + else + readFields(obj, fields.fieldOffs(i)); + } + + if (readResolveMtd != null) { + try { + obj = readResolveMtd.invoke(obj); + + handles.set(handle, obj); + } + catch (IllegalAccessException | InvocationTargetException e) { + throw new IOException(e); + } + } + + return obj; + } + + /** + * Reads {@link ArrayList}. + * + * @return List. + * @throws ClassNotFoundException If class not found. + * @throws IOException In case of error. + */ + ArrayList<?> readArrayList() throws ClassNotFoundException, IOException { + int size = readInt(); + + ArrayList<Object> list = new ArrayList<>(size); + + handles.assign(list); + + for (int i = 0; i < size; i++) + list.add(readObject()); + + return list; + } + + /** + * Reads {@link HashMap}. + * + * @param set Whether reading underlying map from {@link HashSet}. + * @return Map. + * @throws ClassNotFoundException If class not found. + * @throws IOException In case of error. + */ + HashMap<?, ?> readHashMap(boolean set) throws ClassNotFoundException, IOException { + int size = readInt(); + float loadFactor = readFloat(); + + HashMap<Object, Object> map = new HashMap<>(size, loadFactor); + + if (!set) + handles.assign(map); + + for (int i = 0; i < size; i++) { + Object key = readObject(); + Object val = !set ? readObject() : DUMMY; + + map.put(key, val); + } + + return map; + } + + /** + * Reads {@link HashSet}. + * + * @param mapFieldOff Map field offset. + * @return Set. + * @throws ClassNotFoundException If class not found. + * @throws IOException In case of error. + */ + HashSet<?> readHashSet(long mapFieldOff) throws ClassNotFoundException, IOException { + try { + HashSet<Object> set = (HashSet<Object>)UNSAFE.allocateInstance(HashSet.class); + + handles.assign(set); + + setObject(set, mapFieldOff, readHashMap(true)); + + return set; + } + catch (InstantiationException e) { + throw new IOException(e); + } + } + + /** + * Reads {@link LinkedList}. + * + * @return List. + * @throws ClassNotFoundException If class not found. + * @throws IOException In case of error. + */ + LinkedList<?> readLinkedList() throws ClassNotFoundException, IOException { + int size = readInt(); + + LinkedList<Object> list = new LinkedList<>(); + + handles.assign(list); + + for (int i = 0; i < size; i++) + list.add(readObject()); + + return list; + } + + /** + * Reads {@link LinkedHashMap}. + * + * @param set Whether reading underlying map from {@link LinkedHashSet}. + * @return Map. + * @throws ClassNotFoundException If class not found. + * @throws IOException In case of error. + */ + LinkedHashMap<?, ?> readLinkedHashMap(boolean set) throws ClassNotFoundException, IOException { + int size = readInt(); + float loadFactor = readFloat(); + boolean accessOrder = readBoolean(); + + LinkedHashMap<Object, Object> map = new LinkedHashMap<>(size, loadFactor, accessOrder); + + if (!set) + handles.assign(map); + + for (int i = 0; i < size; i++) { + Object key = readObject(); + Object val = !set ? readObject() : DUMMY; + + map.put(key, val); + } + + return map; + } + + /** + * Reads {@link LinkedHashSet}. + * + * @param mapFieldOff Map field offset. + * @return Set. + * @throws ClassNotFoundException If class not found. + * @throws IOException In case of error. + */ + LinkedHashSet<?> readLinkedHashSet(long mapFieldOff) throws ClassNotFoundException, IOException { + try { + LinkedHashSet<Object> set = (LinkedHashSet<Object>)UNSAFE.allocateInstance(LinkedHashSet.class); + + handles.assign(set); + + setObject(set, mapFieldOff, readLinkedHashMap(true)); + + return set; + } + catch (InstantiationException e) { + throw new IOException(e); + } + } + + /** + * Reads {@link Date}. + * + * @return Date. + * @throws ClassNotFoundException If class not found. + * @throws IOException In case of error. + */ + Date readDate() throws ClassNotFoundException, IOException { + Date date = new Date(readLong()); + + handles.assign(date); + + return date; + } + + /** + * Reads array of {@code byte}s. + * + * @return Array. + * @throws IOException In case of error. + */ + byte[] readByteArray() throws IOException { + byte[] arr = in.readByteArray(); + + handles.assign(arr); + + return arr; + } + + /** + * Reads array of {@code short}s. + * + * @return Array. + * @throws IOException In case of error. + */ + short[] readShortArray() throws IOException { + short[] arr = in.readShortArray(); + + handles.assign(arr); + + return arr; + } + + /** + * Reads array of {@code int}s. + * + * @return Array. + * @throws IOException In case of error. + */ + int[] readIntArray() throws IOException { + int[] arr = in.readIntArray(); + + handles.assign(arr); + + return arr; + } + + /** + * Reads array of {@code long}s. + * + * @return Array. + * @throws IOException In case of error. + */ + long[] readLongArray() throws IOException { + long[] arr = in.readLongArray(); + + handles.assign(arr); + + return arr; + } + + /** + * Reads array of {@code float}s. + * + * @return Array. + * @throws IOException In case of error. + */ + float[] readFloatArray() throws IOException { + float[] arr = in.readFloatArray(); + + handles.assign(arr); + + return arr; + } + + /** + * Reads array of {@code double}s. + * + * @return Array. + * @throws IOException In case of error. + */ + double[] readDoubleArray() throws IOException { + double[] arr = in.readDoubleArray(); + + handles.assign(arr); + + return arr; + } + + /** + * Reads array of {@code char}s. + * + * @return Array. + * @throws IOException In case of error. + */ + char[] readCharArray() throws IOException { + char[] arr = in.readCharArray(); + + handles.assign(arr); + + return arr; + } + + /** + * Reads array of {@code boolean}s. + * + * @return Array. + * @throws IOException In case of error. + */ + boolean[] readBooleanArray() throws IOException { + boolean[] arr = in.readBooleanArray(); + + handles.assign(arr); + + return arr; + } + + /** + * Reads {@link String}. + * + * @return String. + * @throws IOException In case of error. + */ + public String readString() throws IOException { + String str = in.readUTF(); + + handles.assign(str); + + return str; + } + + /** {@inheritDoc} */ + @Override public void readFully(byte[] b) throws IOException { + in.readFully(b); + } + + /** {@inheritDoc} */ + @Override public void readFully(byte[] b, int off, int len) throws IOException { + in.readFully(b, off, len); + } + + /** {@inheritDoc} */ + @Override public int skipBytes(int n) throws IOException { + return in.skipBytes(n); + } + + /** {@inheritDoc} */ + @Override public boolean readBoolean() throws IOException { + return in.readBoolean(); + } + + /** {@inheritDoc} */ + @Override public byte readByte() throws IOException { + return in.readByte(); + } + + /** {@inheritDoc} */ + @Override public int readUnsignedByte() throws IOException { + return in.readUnsignedByte(); + } + + /** {@inheritDoc} */ + @Override public short readShort() throws IOException { + return in.readShort(); + } + + /** {@inheritDoc} */ + @Override public int readUnsignedShort() throws IOException { + return in.readUnsignedShort(); + } + + /** {@inheritDoc} */ + @Override public char readChar() throws IOException { + return in.readChar(); + } + + /** {@inheritDoc} */ + @Override public int readInt() throws IOException { + return in.readInt(); + } + + /** {@inheritDoc} */ + @Override public long readLong() throws IOException { + return in.readLong(); + } + + /** {@inheritDoc} */ + @Override public float readFloat() throws IOException { + return in.readFloat(); + } + + /** {@inheritDoc} */ + @Override public double readDouble() throws IOException { + return in.readDouble(); + } + + /** {@inheritDoc} */ + @Override public int read() throws IOException { + return in.read(); + } + + /** {@inheritDoc} */ + @Override public int read(byte[] b) throws IOException { + return in.read(b); + } + + /** {@inheritDoc} */ + @Override public int read(byte[] b, int off, int len) throws IOException { + return in.read(b, off, len); + } + + /** {@inheritDoc} */ + @SuppressWarnings("deprecation") + @Override public String readLine() throws IOException { + return in.readLine(); + } + + /** {@inheritDoc} */ + @Override public String readUTF() throws IOException { + return in.readUTF(); + } + + /** {@inheritDoc} */ + @Override public Object readUnshared() throws IOException, ClassNotFoundException { + return readObject(); + } + + /** {@inheritDoc} */ + @Override public void defaultReadObject() throws IOException, ClassNotFoundException { + if (curObj == null) + throw new NotActiveException("Not in readObject() call."); + + readFields(curObj, curFields); + } + + /** {@inheritDoc} */ + @Override public ObjectInputStream.GetField readFields() throws IOException, ClassNotFoundException { + if (curObj == null) + throw new NotActiveException("Not in readObject() call."); + + return new GetFieldImpl(this); + } + + /** {@inheritDoc} */ + @Override public void registerValidation(ObjectInputValidation obj, int pri) { + // No-op. + } + + /** {@inheritDoc} */ + @Override public int available() throws IOException { + return -1; + } + + /** + * Returns objects that were added to handles table. + * Used ONLY for test purposes. + * + * @return Handled objects. + */ + Object[] handledObjects() { + return handles.entries; + } + + /** + * Lightweight identity hash table which maps objects to integer handles, + * assigned in ascending order. + */ + private static class HandleTable { + /** Array mapping handle -> object/exception (depending on status). */ + private Object[] entries; + + /** Number of handles in table. */ + private int size; + + /** + * Creates handle table with the given initial capacity. + * + * @param initCap Initial capacity. + */ + HandleTable(int initCap) { + entries = new Object[initCap]; + } + + /** + * Assigns next available handle to given object, and returns assigned + * handle. + * + * @param obj Object. + * @return Handle. + */ + int assign(Object obj) { + if (size >= entries.length) + grow(); + + entries[size] = obj; + + return size++; + } + + /** + * Assigns new object to existing handle. Old object is forgotten. + * + * @param handle Handle. + * @param obj Object. + */ + void set(int handle, Object obj) { + entries[handle] = obj; + } + + /** + * Looks up and returns object associated with the given handle. + * + * @param handle Handle. + * @return Object. + */ + Object lookup(int handle) { + return entries[handle]; + } + + /** + * Resets table to its initial state. + */ + void clear() { + Arrays.fill(entries, 0, size, null); + + size = 0; + } + + /** + * Expands capacity of internal arrays. + */ + private void grow() { + int newCap = (entries.length << 1) + 1; + + Object[] newEntries = new Object[newCap]; + + System.arraycopy(entries, 0, newEntries, 0, size); + + entries = newEntries; + } + } + + /** + * {@link GetField} implementation. + */ + private static class GetFieldImpl extends GetField { + /** Field info map. */ + private final Map<String, IgniteBiTuple<Integer, GridOptimizedFieldType>> fieldInfoMap; + + /** Values. */ + private final Object[] objs; + + /** + * @param in Stream. + * @throws IOException In case of error. + * @throws ClassNotFoundException If class not found. + */ + @SuppressWarnings("ForLoopReplaceableByForEach") + private GetFieldImpl(GridOptimizedObjectInputStream in) throws IOException, ClassNotFoundException { + fieldInfoMap = in.curFieldInfoMap; + + List<IgniteBiTuple<Integer, GridOptimizedFieldType>> infos = in.curFieldInfoList; + + objs = new Object[infos.size()]; + + for (int i = 0; i < infos.size(); i++) { + IgniteBiTuple<Integer, GridOptimizedFieldType> t = infos.get(i); + + Object obj = null; + + switch (t.get2()) { + case BYTE: + obj = in.readByte(); + + break; + + case SHORT: + obj = in.readShort(); + + break; + + case INT: + obj = in.readInt(); + + break; + + case LONG: + obj = in.readLong(); + + break; + + case FLOAT: + obj = in.readFloat(); + + break; + + case DOUBLE: + obj = in.readDouble(); + + break; + + case CHAR: + obj = in.readChar(); + + break; + + case BOOLEAN: + obj = in.readBoolean(); + + break; + + case OTHER: + obj = in.readObject(); + } + + objs[t.get1()] = obj; + } + } + + /** {@inheritDoc} */ + @Override public ObjectStreamClass getObjectStreamClass() { + throw new UnsupportedOperationException(); + } + + /** {@inheritDoc} */ + @Override public boolean defaulted(String name) throws IOException { + return objs[fieldInfoMap.get(name).get1()] == null; + } + + /** {@inheritDoc} */ + @Override public boolean get(String name, boolean dflt) throws IOException { + return value(name, dflt); + } + + /** {@inheritDoc} */ + @Override public byte get(String name, byte dflt) throws IOException { + return value(name, dflt); + } + + /** {@inheritDoc} */ + @Override public char get(String name, char dflt) throws IOException { + return value(name, dflt); + } + + /** {@inheritDoc} */ + @Override public short get(String name, short dflt) throws IOException { + return value(name, dflt); + } + + /** {@inheritDoc} */ + @Override public int get(String name, int dflt) throws IOException { + return value(name, dflt); + } + + /** {@inheritDoc} */ + @Override public long get(String name, long dflt) throws IOException { + return value(name, dflt); + } + + /** {@inheritDoc} */ + @Override public float get(String name, float dflt) throws IOException { + return value(name, dflt); + } + + /** {@inheritDoc} */ + @Override public double get(String name, double dflt) throws IOException { + return value(name, dflt); + } + + /** {@inheritDoc} */ + @Override public Object get(String name, Object dflt) throws IOException { + return value(name, dflt); + } + + /** + * @param name Field name. + * @param dflt Default value. + * @return Value. + */ + private <T> T value(String name, T dflt) { + return objs[fieldInfoMap.get(name).get1()] != null ? (T)objs[fieldInfoMap.get(name).get1()] : dflt; + } + } +} http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/a50fccdd/modules/core/src/main/java/org/apache/ignite/marshaller/optimized/GridOptimizedObjectOutputStream.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/marshaller/optimized/GridOptimizedObjectOutputStream.java b/modules/core/src/main/java/org/apache/ignite/marshaller/optimized/GridOptimizedObjectOutputStream.java new file mode 100644 index 0000000..55125e3 --- /dev/null +++ b/modules/core/src/main/java/org/apache/ignite/marshaller/optimized/GridOptimizedObjectOutputStream.java @@ -0,0 +1,831 @@ +/* @java.file.header */ + +/* _________ _____ __________________ _____ + * __ ____/___________(_)______ /__ ____/______ ____(_)_______ + * _ / __ __ ___/__ / _ __ / _ / __ _ __ `/__ / __ __ \ + * / /_/ / _ / _ / / /_/ / / /_/ / / /_/ / _ / _ / / / + * \____/ /_/ /_/ \_,__/ \____/ \__,_/ /_/ /_/ /_/ + */ + +package org.apache.ignite.marshaller.optimized; + +import org.apache.ignite.lang.*; +import org.gridgain.grid.util.*; +import org.gridgain.grid.util.io.*; +import org.gridgain.grid.util.typedef.*; + +import java.io.*; +import java.lang.reflect.*; +import java.util.*; + +import static org.apache.ignite.marshaller.optimized.GridOptimizedMarshallerUtils.*; + +/** + * Optimized object output stream. + */ +class GridOptimizedObjectOutputStream extends ObjectOutputStream { + /** */ + private static final Collection<String> CONVERTED_ERR = F.asList( + "weblogic/management/ManagementException", + "Externalizable class doesn't have default constructor: class " + + "org.gridgain.grid.kernal.processors.email.GridEmailProcessor$2" + ); + + /** */ + private final GridHandleTable handles = new GridHandleTable(10, 3.00f); + + /** */ + private boolean requireSer; + + /** */ + private GridDataOutput out; + + /** */ + private Object curObj; + + /** */ + private List<T2<GridOptimizedFieldType, Long>> curFields; + + /** */ + private Map<String, IgniteBiTuple<Integer, GridOptimizedFieldType>> curFieldInfoMap; + + /** */ + private PutFieldImpl curPut; + + + /** + * @throws IOException In case of error. + */ + GridOptimizedObjectOutputStream() throws IOException { + // No-op. + } + + /** + * @param out Output. + * @throws IOException In case of error. + */ + GridOptimizedObjectOutputStream(GridDataOutput out) throws IOException { + this.out = out; + } + + /** + * @param requireSer Require {@link Serializable} flag. + */ + void requireSerializable(boolean requireSer) { + this.requireSer = requireSer; + } + + /** + * @return Require {@link Serializable} flag. + */ + boolean requireSerializable() { + return requireSer; + } + + /** + * @param out Output. + */ + public void out(GridDataOutput out) { + this.out = out; + } + + /** + * @return Output. + */ + public GridDataOutput out() { + return out; + } + + /** {@inheritDoc} */ + @Override public void close() throws IOException { + reset(); + } + + /** {@inheritDoc} */ + @Override public void write(byte[] b) throws IOException { + out.write(b); + } + + /** {@inheritDoc} */ + @Override public void write(byte[] b, int off, int len) throws IOException { + out.write(b, off, len); + } + + /** {@inheritDoc} */ + @Override protected void writeObjectOverride(Object obj) throws IOException { + try { + writeObject0(obj); + } + catch (IOException e) { + Throwable t = e; + + do { + if (CONVERTED_ERR.contains(t.getMessage())) + throw new IOException("You are trying to serialize internal classes that are not supposed " + + "to be serialized. Check that all non-serializable fields are transient. Consider using " + + "static inner classes instead of non-static inner classes and anonymous classes.", e); + } + while ((t = t.getCause()) != null); + + throw e; + } + } + + /** + * Writes object to stream. + * + * @param obj Object. + * @throws IOException In case of error. + */ + private void writeObject0(Object obj) throws IOException { + curObj = null; + curFields = null; + curPut = null; + curFieldInfoMap = null; + + if (obj == null) + writeByte(NULL); + else { + Class<?> cls = obj.getClass(); + + GridOptimizedClassDescriptor desc = classDescriptor(cls, obj); + + if (desc.excluded()) { + writeByte(NULL); + + return; + } + + Object obj0 = desc.replace(obj); + + if (obj0 == null) { + writeByte(NULL); + + return; + } + + int handle = -1; + + if (!desc.isPrimitive() && !desc.isEnum() && !desc.isClass()) + handle = handles.lookup(obj); + + if (obj0 != obj) { + obj = obj0; + + desc = classDescriptor(obj.getClass(), obj); + } + + if (handle >= 0) { + writeByte(HANDLE); + writeInt(handle); + } + else { + writeByte(OBJECT); + + GridOptimizedClassResolver.writeClass(this, desc); + + desc.write(this, obj); + } + } + } + + /** + * Writes array to this stream. + * + * @param arr Array. + * @throws IOException In case of error. + */ + @SuppressWarnings("ForLoopReplaceableByForEach") + void writeArray(Object[] arr) throws IOException { + int len = arr.length; + + writeInt(len); + + for (int i = 0; i < len; i++) { + Object obj = arr[i]; + + writeObject0(obj); + } + } + + /** + * Writes {@link UUID} to this stream. + * + * @param uuid UUID. + * @throws IOException In case of error. + */ + void writeUuid(UUID uuid) throws IOException { + writeLong(uuid.getMostSignificantBits()); + writeLong(uuid.getLeastSignificantBits()); + } + + /** + * Writes {@link Properties} to this stream. + * + * @param props Properties. + * @param dfltsFieldOff Defaults field offset. + * @throws IOException In case of error. + */ + void writeProperties(Properties props, long dfltsFieldOff) throws IOException { + Properties dflts = (Properties)getObject(props, dfltsFieldOff); + + if (dflts == null) + writeBoolean(true); + else { + writeBoolean(false); + + writeObject0(dflts); + } + + Set<String> names = props.stringPropertyNames(); + + writeInt(names.size()); + + for (String name : names) { + writeUTF(name); + writeUTF(props.getProperty(name)); + } + } + + /** + * Writes externalizable object. + * + * @param obj Object. + * @throws IOException In case of error. + */ + void writeExternalizable(Object obj) throws IOException { + Externalizable extObj = (Externalizable)obj; + + extObj.writeExternal(this); + } + + /** + * Writes serializable object. + * + * @param obj Object. + * @param mtds {@code writeObject} methods. + * @param fields class fields details. + * @throws IOException In case of error. + */ + @SuppressWarnings("ForLoopReplaceableByForEach") + void writeSerializable(Object obj, List<Method> mtds, GridOptimizedClassDescriptor.Fields fields) + throws IOException { + for (int i = 0; i < mtds.size(); i++) { + Method mtd = mtds.get(i); + + if (mtd != null) { + curObj = obj; + curFields = fields.fieldOffs(i); + curFieldInfoMap = fields.fieldInfoMap(i); + + try { + mtd.invoke(obj, this); + } + catch (IllegalAccessException e) { + throw new IOException(e); + } + catch (InvocationTargetException e) { + throw new IOException(e.getCause()); + } + } + else + writeFields(obj, fields.fieldOffs(i)); + } + } + + /** + * Writes {@link ArrayList}. + * + * @param list List. + * @throws IOException In case of error. + */ + @SuppressWarnings({"ForLoopReplaceableByForEach", "TypeMayBeWeakened"}) + void writeArrayList(ArrayList<?> list) throws IOException { + int size = list.size(); + + writeInt(size); + + for (int i = 0; i < size; i++) + writeObject0(list.get(i)); + } + + /** + * Writes {@link HashMap}. + * + * @param map Map. + * @param loadFactorFieldOff Load factor field offset. + * @param set Whether writing underlying map from {@link HashSet}. + * @throws IOException In case of error. + */ + @SuppressWarnings("TypeMayBeWeakened") + void writeHashMap(HashMap<?, ?> map, long loadFactorFieldOff, boolean set) throws IOException { + int size = map.size(); + + writeInt(size); + writeFloat(getFloat(map, loadFactorFieldOff)); + + for (Map.Entry<?, ?> e : map.entrySet()) { + writeObject0(e.getKey()); + + if (!set) + writeObject0(e.getValue()); + } + } + + /** + * Writes {@link HashSet}. + * + * @param set Set. + * @param mapFieldOff Map field offset. + * @param loadFactorFieldOff Load factor field offset. + * @throws IOException In case of error. + */ + void writeHashSet(HashSet<?> set, long mapFieldOff, long loadFactorFieldOff) throws IOException { + writeHashMap((HashMap<?, ?>)getObject(set, mapFieldOff), loadFactorFieldOff, true); + } + + /** + * Writes {@link LinkedList}. + * + * @param list List. + * @throws IOException In case of error. + */ + @SuppressWarnings("TypeMayBeWeakened") + void writeLinkedList(LinkedList<?> list) throws IOException { + int size = list.size(); + + writeInt(size); + + for (Object obj : list) + writeObject0(obj); + } + + /** + * Writes {@link LinkedHashMap}. + * + * @param map Map. + * @param loadFactorFieldOff Load factor field offset. + * @param accessOrderFieldOff access order field offset. + * @param set Whether writing underlying map from {@link LinkedHashSet}. + * @throws IOException In case of error. + */ + @SuppressWarnings("TypeMayBeWeakened") + void writeLinkedHashMap(LinkedHashMap<?, ?> map, long loadFactorFieldOff, long accessOrderFieldOff, boolean set) + throws IOException { + int size = map.size(); + + writeInt(size); + writeFloat(getFloat(map, loadFactorFieldOff)); + + if (accessOrderFieldOff >= 0) + writeBoolean(getBoolean(map, accessOrderFieldOff)); + else + writeBoolean(false); + + for (Map.Entry<?, ?> e : map.entrySet()) { + writeObject0(e.getKey()); + + if (!set) + writeObject0(e.getValue()); + } + } + + /** + * Writes {@link LinkedHashSet}. + * + * @param set Set. + * @param mapFieldOff Map field offset. + * @param loadFactorFieldOff Load factor field offset. + * @throws IOException In case of error. + */ + void writeLinkedHashSet(LinkedHashSet<?> set, long mapFieldOff, long loadFactorFieldOff) throws IOException { + LinkedHashMap<?, ?> map = (LinkedHashMap<?, ?>)getObject(set, mapFieldOff); + + writeLinkedHashMap(map, loadFactorFieldOff, -1, true); + } + + /** + * Writes {@link Date}. + * + * @param date Date. + * @throws IOException In case of error. + */ + void writeDate(Date date) throws IOException { + writeLong(date.getTime()); + } + + /** + * Writes all non-static and non-transient field values to this stream. + * + * @param obj Object. + * @param fieldOffs Field offsets. + * @throws IOException In case of error. + */ + @SuppressWarnings("ForLoopReplaceableByForEach") + private void writeFields(Object obj, List<T2<GridOptimizedFieldType, Long>> fieldOffs) throws IOException { + for (int i = 0; i < fieldOffs.size(); i++) { + T2<GridOptimizedFieldType, Long> t = fieldOffs.get(i); + + switch (t.get1()) { + case BYTE: + writeByte(getByte(obj, t.get2())); + + break; + + case SHORT: + writeShort(getShort(obj, t.get2())); + + break; + + case INT: + writeInt(getInt(obj, t.get2())); + + break; + + case LONG: + writeLong(getLong(obj, t.get2())); + + break; + + case FLOAT: + writeFloat(getFloat(obj, t.get2())); + + break; + + case DOUBLE: + writeDouble(getDouble(obj, t.get2())); + + break; + + case CHAR: + writeChar(getChar(obj, t.get2())); + + break; + + case BOOLEAN: + writeBoolean(getBoolean(obj, t.get2())); + + break; + + case OTHER: + writeObject0(getObject(obj, t.get2())); + } + } + } + + /** + * Writes array of {@code byte}s. + * + * @param arr Array. + * @throws IOException In case of error. + */ + void writeByteArray(byte[] arr) throws IOException { + out.writeByteArray(arr); + } + + /** + * Writes array of {@code short}s. + * + * @param arr Array. + * @throws IOException In case of error. + */ + void writeShortArray(short[] arr) throws IOException { + out.writeShortArray(arr); + } + + /** + * Writes array of {@code int}s. + * + * @param arr Array. + * @throws IOException In case of error. + */ + void writeIntArray(int[] arr) throws IOException { + out.writeIntArray(arr); + } + + /** + * Writes array of {@code long}s. + * + * @param arr Array. + * @throws IOException In case of error. + */ + void writeLongArray(long[] arr) throws IOException { + out.writeLongArray(arr); + } + + /** + * Writes array of {@code float}s. + * + * @param arr Array. + * @throws IOException In case of error. + */ + void writeFloatArray(float[] arr) throws IOException { + out.writeFloatArray(arr); + } + + /** + * Writes array of {@code double}s. + * + * @param arr Array. + * @throws IOException In case of error. + */ + void writeDoubleArray(double[] arr) throws IOException { + out.writeDoubleArray(arr); + } + + /** + * Writes array of {@code char}s. + * + * @param arr Array. + * @throws IOException In case of error. + */ + void writeCharArray(char[] arr) throws IOException { + out.writeCharArray(arr); + } + + /** + * Writes array of {@code boolean}s. + * + * @param arr Array. + * @throws IOException In case of error. + */ + void writeBooleanArray(boolean[] arr) throws IOException { + out.writeBooleanArray(arr); + } + + /** + * Writes {@link String}. + * + * @param str String. + * @throws IOException In case of error. + */ + void writeString(String str) throws IOException { + out.writeUTF(str); + } + + /** {@inheritDoc} */ + @Override public void writeBoolean(boolean v) throws IOException { + out.writeBoolean(v); + } + + /** {@inheritDoc} */ + @Override public void writeByte(int v) throws IOException { + out.writeByte(v); + } + + /** {@inheritDoc} */ + @Override public void writeShort(int v) throws IOException { + out.writeShort(v); + } + + /** {@inheritDoc} */ + @Override public void writeChar(int v) throws IOException { + out.writeChar(v); + } + + /** {@inheritDoc} */ + @Override public void writeInt(int v) throws IOException { + out.writeInt(v); + } + + /** {@inheritDoc} */ + @Override public void writeLong(long v) throws IOException { + out.writeLong(v); + } + + /** {@inheritDoc} */ + @Override public void writeFloat(float v) throws IOException { + out.writeFloat(v); + } + + /** {@inheritDoc} */ + @Override public void writeDouble(double v) throws IOException { + out.writeDouble(v); + } + + /** {@inheritDoc} */ + @Override public void write(int b) throws IOException { + writeByte(b); + } + + /** {@inheritDoc} */ + @Override public void writeBytes(String s) throws IOException { + out.writeBytes(s); + } + + /** {@inheritDoc} */ + @Override public void writeChars(String s) throws IOException { + out.writeChars(s); + } + + /** {@inheritDoc} */ + @Override public void writeUTF(String s) throws IOException { + out.writeUTF(s); + } + + /** {@inheritDoc} */ + @Override public void useProtocolVersion(int ver) throws IOException { + // No-op. + } + + /** {@inheritDoc} */ + @Override public void writeUnshared(Object obj) throws IOException { + writeObject0(obj); + } + + /** {@inheritDoc} */ + @Override public void defaultWriteObject() throws IOException { + if (curObj == null) + throw new NotActiveException("Not in writeObject() call."); + + writeFields(curObj, curFields); + } + + /** {@inheritDoc} */ + @Override public ObjectOutputStream.PutField putFields() throws IOException { + if (curObj == null) + throw new NotActiveException("Not in writeObject() call or fields already written."); + + if (curPut == null) + curPut = new PutFieldImpl(this); + + return curPut; + } + + /** {@inheritDoc} */ + @Override public void writeFields() throws IOException { + if (curObj == null) + throw new NotActiveException("Not in writeObject() call."); + + if (curPut == null) + throw new NotActiveException("putFields() was not called."); + + for (IgniteBiTuple<GridOptimizedFieldType, Object> t : curPut.objs) { + switch (t.get1()) { + case BYTE: + writeByte((Byte)t.get2()); + + break; + + case SHORT: + writeShort((Short)t.get2()); + + break; + + case INT: + writeInt((Integer)t.get2()); + + break; + + case LONG: + writeLong((Long)t.get2()); + + break; + + case FLOAT: + writeFloat((Float)t.get2()); + + break; + + case DOUBLE: + writeDouble((Double)t.get2()); + + break; + + case CHAR: + writeChar((Character)t.get2()); + + break; + + case BOOLEAN: + writeBoolean((Boolean)t.get2()); + + break; + + case OTHER: + writeObject0(t.get2()); + } + } + } + + /** {@inheritDoc} */ + @Override public void reset() throws IOException { + out.reset(); + handles.clear(); + + curObj = null; + curFields = null; + curPut = null; + curFieldInfoMap = null; + } + + /** {@inheritDoc} */ + @Override public void flush() throws IOException { + // No-op. + } + + /** {@inheritDoc} */ + @Override public void drain() throws IOException { + // No-op. + } + + /** + * Returns objects that were added to handles table. + * Used ONLY for test purposes. + * + * @return Handled objects. + */ + Object[] handledObjects() { + return handles.objects(); + } + + /** + * {@link PutField} implementation. + */ + private static class PutFieldImpl extends PutField { + /** Stream. */ + private final GridOptimizedObjectOutputStream out; + + /** Field info map. */ + private final Map<String, IgniteBiTuple<Integer, GridOptimizedFieldType>> fieldInfoMap; + + /** Values. */ + private final IgniteBiTuple<GridOptimizedFieldType, Object>[] objs; + + /** + * @param out Output stream. + * @throws IOException In case of error. + */ + @SuppressWarnings("unchecked") + private PutFieldImpl(GridOptimizedObjectOutputStream out) { + this.out = out; + + fieldInfoMap = out.curFieldInfoMap; + + objs = new IgniteBiTuple[fieldInfoMap.size()]; + } + + /** {@inheritDoc} */ + @Override public void put(String name, boolean val) { + value(name, val); + } + + /** {@inheritDoc} */ + @Override public void put(String name, byte val) { + value(name, val); + } + + /** {@inheritDoc} */ + @Override public void put(String name, char val) { + value(name, val); + } + + /** {@inheritDoc} */ + @Override public void put(String name, short val) { + value(name, val); + } + + /** {@inheritDoc} */ + @Override public void put(String name, int val) { + value(name, val); + } + + /** {@inheritDoc} */ + @Override public void put(String name, long val) { + value(name, val); + } + + /** {@inheritDoc} */ + @Override public void put(String name, float val) { + value(name, val); + } + + /** {@inheritDoc} */ + @Override public void put(String name, double val) { + value(name, val); + } + + /** {@inheritDoc} */ + @Override public void put(String name, Object val) { + value(name, val); + } + + /** {@inheritDoc} */ + @Override public void write(ObjectOutput out) throws IOException { + if (out != this.out) + throw new IllegalArgumentException("Wrong stream."); + + this.out.writeFields(); + } + + /** + * @param name Field name. + * @param val Value. + */ + private void value(String name, Object val) { + IgniteBiTuple<Integer, GridOptimizedFieldType> info = fieldInfoMap.get(name); + + objs[info.get1()] = F.t(info.get2(), val); + } + } +} http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/a50fccdd/modules/core/src/main/java/org/apache/ignite/marshaller/optimized/GridOptimizedObjectStreamRegistry.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/marshaller/optimized/GridOptimizedObjectStreamRegistry.java b/modules/core/src/main/java/org/apache/ignite/marshaller/optimized/GridOptimizedObjectStreamRegistry.java new file mode 100644 index 0000000..bc7a586 --- /dev/null +++ b/modules/core/src/main/java/org/apache/ignite/marshaller/optimized/GridOptimizedObjectStreamRegistry.java @@ -0,0 +1,215 @@ +/* @java.file.header */ + +/* _________ _____ __________________ _____ + * __ ____/___________(_)______ /__ ____/______ ____(_)_______ + * _ / __ __ ___/__ / _ __ / _ / __ _ __ `/__ / __ __ \ + * / /_/ / _ / _ / / /_/ / / /_/ / / /_/ / _ / _ / / / + * \____/ /_/ /_/ \_,__/ \____/ \__,_/ /_/ /_/ /_/ + */ + +package org.apache.ignite.marshaller.optimized; + +import org.gridgain.grid.*; +import org.gridgain.grid.util.typedef.internal.*; +import org.gridgain.grid.util.io.*; + +import java.io.*; +import java.util.concurrent.*; + +/** + * Storage for object streams. + */ +class GridOptimizedObjectStreamRegistry { + /** Holders. */ + private static final ThreadLocal<StreamHolder> holders = new ThreadLocal<>(); + + /** Holders pool. */ + private static BlockingQueue<StreamHolder> pool; + + /** + * Ensures singleton. + */ + private GridOptimizedObjectStreamRegistry() { + // No-op. + } + + /** + * Sets streams pool size. + * + * @param size Streams pool size. + */ + static void poolSize(int size) { + if (size > 0) { + pool = new LinkedBlockingQueue<>(size); + + for (int i = 0; i < size; i++) { + boolean b = pool.offer(new StreamHolder()); + + assert b; + } + } + else + pool = null; + } + + /** + * Gets output stream. + * + * @return Object output stream. + * @throws GridInterruptedException If thread is interrupted while trying to take holder from pool. + */ + static GridOptimizedObjectOutputStream out() throws GridInterruptedException { + return holder().acquireOut(); + } + + /** + * Gets input stream. + * + * @return Object input stream. + * @throws GridInterruptedException If thread is interrupted while trying to take holder from pool. + */ + static GridOptimizedObjectInputStream in() throws GridInterruptedException { + return holder().acquireIn(); + } + + /** + * Closes and releases output stream. + * + * @param out Object output stream. + */ + static void closeOut(GridOptimizedObjectOutputStream out) { + U.close(out, null); + + StreamHolder holder = holders.get(); + + holder.releaseOut(); + + if (pool != null) { + holders.remove(); + + boolean b = pool.offer(holder); + + assert b; + } + } + + /** + * Closes and releases input stream. + * + * @param in Object input stream. + */ + @SuppressWarnings("TypeMayBeWeakened") + static void closeIn(GridOptimizedObjectInputStream in) { + U.close(in, null); + + StreamHolder holder = holders.get(); + + holder.releaseIn(); + + if (pool != null) { + holders.remove(); + + boolean b = pool.offer(holder); + + assert b; + } + } + + /** + * Gets holder from pool or thread local. + * + * @return Stream holder. + * @throws GridInterruptedException If thread is interrupted while trying to take holder from pool. + */ + private static StreamHolder holder() throws GridInterruptedException { + StreamHolder holder = holders.get(); + + if (holder == null) { + try { + holders.set(holder = pool != null ? pool.take() : new StreamHolder()); + } + catch (InterruptedException e) { + throw new GridInterruptedException("Failed to take object stream from pool (thread interrupted).", e); + } + } + + return holder; + } + + /** + * Streams holder. + */ + private static class StreamHolder { + /** Output stream. */ + private final GridOptimizedObjectOutputStream out = createOut(); + + /** Input stream. */ + private final GridOptimizedObjectInputStream in = createIn(); + + /** Output streams counter. */ + private int outAcquireCnt; + + /** Input streams counter. */ + private int inAcquireCnt; + + /** + * Gets output stream. + * + * @return Object output stream. + */ + GridOptimizedObjectOutputStream acquireOut() { + return outAcquireCnt++ > 0 ? createOut() : out; + } + + /** + * Gets input stream. + * + * @return Object input stream. + */ + GridOptimizedObjectInputStream acquireIn() { + return inAcquireCnt++ > 0 ? createIn() : in; + } + + /** + * Releases output stream. + */ + void releaseOut() { + outAcquireCnt--; + } + + /** + * Releases input stream. + */ + void releaseIn() { + inAcquireCnt--; + } + + /** + * Creates output stream. + * + * @return Object output stream. + */ + private GridOptimizedObjectOutputStream createOut() { + try { + return new GridOptimizedObjectOutputStream(new GridUnsafeDataOutput(4 * 1024)); + } + catch (IOException e) { + throw new GridRuntimeException("Failed to create object output stream.", e); + } + } + + /** + * Creates input stream. + * + * @return Object input stream. + */ + private GridOptimizedObjectInputStream createIn() { + try { + return new GridOptimizedObjectInputStream(new GridUnsafeDataInput()); + } + catch (IOException e) { + throw new GridRuntimeException("Failed to create object input stream.", e); + } + } + } +} http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/a50fccdd/modules/core/src/main/java/org/gridgain/client/marshaller/optimized/GridClientOptimizedMarshaller.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/gridgain/client/marshaller/optimized/GridClientOptimizedMarshaller.java b/modules/core/src/main/java/org/gridgain/client/marshaller/optimized/GridClientOptimizedMarshaller.java index a60c3a4..f7d48a5 100644 --- a/modules/core/src/main/java/org/gridgain/client/marshaller/optimized/GridClientOptimizedMarshaller.java +++ b/modules/core/src/main/java/org/gridgain/client/marshaller/optimized/GridClientOptimizedMarshaller.java @@ -9,17 +9,17 @@ package org.gridgain.client.marshaller.optimized; +import org.apache.ignite.marshaller.optimized.*; import org.gridgain.client.marshaller.*; import org.gridgain.grid.*; import org.gridgain.grid.kernal.processors.rest.client.message.*; -import org.gridgain.grid.marshaller.optimized.*; import java.io.*; import java.nio.*; import java.util.*; /** - * Wrapper, that adapts {@link GridOptimizedMarshaller} to + * Wrapper, that adapts {@link org.apache.ignite.marshaller.optimized.GridOptimizedMarshaller} to * {@link GridClientMarshaller} interface. */ public class GridClientOptimizedMarshaller implements GridClientMarshaller { http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/a50fccdd/modules/core/src/main/java/org/gridgain/grid/cache/affinity/rendezvous/GridCacheRendezvousAffinityFunction.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/gridgain/grid/cache/affinity/rendezvous/GridCacheRendezvousAffinityFunction.java b/modules/core/src/main/java/org/gridgain/grid/cache/affinity/rendezvous/GridCacheRendezvousAffinityFunction.java index a7f195f..7ebc4dc 100644 --- a/modules/core/src/main/java/org/gridgain/grid/cache/affinity/rendezvous/GridCacheRendezvousAffinityFunction.java +++ b/modules/core/src/main/java/org/gridgain/grid/cache/affinity/rendezvous/GridCacheRendezvousAffinityFunction.java @@ -12,11 +12,11 @@ package org.gridgain.grid.cache.affinity.rendezvous; import org.apache.ignite.cluster.*; import org.apache.ignite.lang.*; import org.apache.ignite.marshaller.*; +import org.apache.ignite.marshaller.optimized.*; import org.gridgain.grid.*; import org.gridgain.grid.cache.*; import org.gridgain.grid.cache.affinity.*; import org.gridgain.grid.kernal.*; -import org.gridgain.grid.marshaller.optimized.*; import org.gridgain.grid.util.typedef.*; import org.gridgain.grid.util.typedef.internal.*; import org.jetbrains.annotations.*; http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/a50fccdd/modules/core/src/main/java/org/gridgain/grid/kernal/GridGainEx.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/gridgain/grid/kernal/GridGainEx.java b/modules/core/src/main/java/org/gridgain/grid/kernal/GridGainEx.java index b662845..8888f9b 100644 --- a/modules/core/src/main/java/org/gridgain/grid/kernal/GridGainEx.java +++ b/modules/core/src/main/java/org/gridgain/grid/kernal/GridGainEx.java @@ -16,6 +16,7 @@ import org.apache.ignite.logger.*; import org.apache.ignite.logger.java.*; import org.apache.ignite.marshaller.*; import org.apache.ignite.marshaller.jdk.*; +import org.apache.ignite.marshaller.optimized.*; import org.apache.ignite.mbean.*; import org.gridgain.grid.*; import org.gridgain.grid.cache.*; @@ -24,7 +25,6 @@ import org.gridgain.grid.ggfs.*; import org.gridgain.grid.kernal.processors.interop.*; import org.gridgain.grid.kernal.processors.resource.*; import org.gridgain.grid.kernal.processors.spring.*; -import org.gridgain.grid.marshaller.optimized.*; import org.gridgain.grid.segmentation.*; import org.gridgain.grid.spi.*; import org.gridgain.grid.spi.authentication.*; http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/a50fccdd/modules/core/src/main/java/org/gridgain/grid/kernal/GridKernal.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/gridgain/grid/kernal/GridKernal.java b/modules/core/src/main/java/org/gridgain/grid/kernal/GridKernal.java index 965c526..8525afe 100644 --- a/modules/core/src/main/java/org/gridgain/grid/kernal/GridKernal.java +++ b/modules/core/src/main/java/org/gridgain/grid/kernal/GridKernal.java @@ -15,6 +15,7 @@ import org.apache.ignite.configuration.*; import org.apache.ignite.lang.*; import org.apache.ignite.lifecycle.*; import org.apache.ignite.marshaller.*; +import org.apache.ignite.marshaller.optimized.*; import org.apache.ignite.mbean.*; import org.apache.ignite.plugin.*; import org.gridgain.grid.*; @@ -58,7 +59,6 @@ import org.gridgain.grid.kernal.processors.session.*; import org.gridgain.grid.kernal.processors.streamer.*; import org.gridgain.grid.kernal.processors.task.*; import org.gridgain.grid.kernal.processors.timeout.*; -import org.gridgain.grid.marshaller.optimized.*; import org.gridgain.grid.portables.*; import org.gridgain.grid.product.*; import org.gridgain.grid.security.*; http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/a50fccdd/modules/core/src/main/java/org/gridgain/grid/kernal/GridTopic.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/gridgain/grid/kernal/GridTopic.java b/modules/core/src/main/java/org/gridgain/grid/kernal/GridTopic.java index d0dacbc..8213d7e 100644 --- a/modules/core/src/main/java/org/gridgain/grid/kernal/GridTopic.java +++ b/modules/core/src/main/java/org/gridgain/grid/kernal/GridTopic.java @@ -10,7 +10,7 @@ package org.gridgain.grid.kernal; import org.apache.ignite.lang.*; -import org.gridgain.grid.marshaller.optimized.*; +import org.apache.ignite.marshaller.optimized.*; import org.gridgain.grid.util.typedef.internal.*; import org.jetbrains.annotations.*; http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/a50fccdd/modules/core/src/main/java/org/gridgain/grid/kernal/managers/deployment/GridDeploymentLocalStore.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/gridgain/grid/kernal/managers/deployment/GridDeploymentLocalStore.java b/modules/core/src/main/java/org/gridgain/grid/kernal/managers/deployment/GridDeploymentLocalStore.java index d59736e..e176e45 100644 --- a/modules/core/src/main/java/org/gridgain/grid/kernal/managers/deployment/GridDeploymentLocalStore.java +++ b/modules/core/src/main/java/org/gridgain/grid/kernal/managers/deployment/GridDeploymentLocalStore.java @@ -12,9 +12,9 @@ package org.gridgain.grid.kernal.managers.deployment; import org.apache.ignite.compute.*; import org.apache.ignite.events.*; import org.apache.ignite.lang.*; +import org.apache.ignite.marshaller.optimized.*; import org.gridgain.grid.*; import org.gridgain.grid.kernal.*; -import org.gridgain.grid.marshaller.optimized.*; import org.gridgain.grid.spi.*; import org.gridgain.grid.spi.deployment.*; import org.gridgain.grid.util.*; http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/a50fccdd/modules/core/src/main/java/org/gridgain/grid/kernal/managers/deployment/GridDeploymentPerLoaderStore.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/gridgain/grid/kernal/managers/deployment/GridDeploymentPerLoaderStore.java b/modules/core/src/main/java/org/gridgain/grid/kernal/managers/deployment/GridDeploymentPerLoaderStore.java index 514653e..86ec14e 100644 --- a/modules/core/src/main/java/org/gridgain/grid/kernal/managers/deployment/GridDeploymentPerLoaderStore.java +++ b/modules/core/src/main/java/org/gridgain/grid/kernal/managers/deployment/GridDeploymentPerLoaderStore.java @@ -12,11 +12,11 @@ package org.gridgain.grid.kernal.managers.deployment; import org.apache.ignite.cluster.*; import org.apache.ignite.events.*; import org.apache.ignite.lang.*; +import org.apache.ignite.marshaller.optimized.*; import org.gridgain.grid.*; import org.gridgain.grid.kernal.*; import org.gridgain.grid.kernal.managers.eventstorage.*; import org.gridgain.grid.kernal.processors.timeout.*; -import org.gridgain.grid.marshaller.optimized.*; import org.gridgain.grid.spi.deployment.*; import org.gridgain.grid.util.typedef.internal.*; import org.gridgain.grid.util.*; http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/a50fccdd/modules/core/src/main/java/org/gridgain/grid/kernal/managers/deployment/GridDeploymentPerVersionStore.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/gridgain/grid/kernal/managers/deployment/GridDeploymentPerVersionStore.java b/modules/core/src/main/java/org/gridgain/grid/kernal/managers/deployment/GridDeploymentPerVersionStore.java index 4517759..7aa7096 100644 --- a/modules/core/src/main/java/org/gridgain/grid/kernal/managers/deployment/GridDeploymentPerVersionStore.java +++ b/modules/core/src/main/java/org/gridgain/grid/kernal/managers/deployment/GridDeploymentPerVersionStore.java @@ -11,11 +11,11 @@ package org.gridgain.grid.kernal.managers.deployment; import org.apache.ignite.events.*; import org.apache.ignite.lang.*; +import org.apache.ignite.marshaller.optimized.*; import org.gridgain.grid.*; import org.gridgain.grid.kernal.*; import org.gridgain.grid.kernal.managers.eventstorage.*; import org.gridgain.grid.kernal.processors.timeout.*; -import org.gridgain.grid.marshaller.optimized.*; import org.gridgain.grid.spi.deployment.*; import org.gridgain.grid.util.*; import org.gridgain.grid.util.typedef.*; http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/a50fccdd/modules/core/src/main/java/org/gridgain/grid/kernal/processors/affinity/GridAffinityMessage.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/gridgain/grid/kernal/processors/affinity/GridAffinityMessage.java b/modules/core/src/main/java/org/gridgain/grid/kernal/processors/affinity/GridAffinityMessage.java index 0362be9..4b7df4f 100644 --- a/modules/core/src/main/java/org/gridgain/grid/kernal/processors/affinity/GridAffinityMessage.java +++ b/modules/core/src/main/java/org/gridgain/grid/kernal/processors/affinity/GridAffinityMessage.java @@ -10,8 +10,8 @@ package org.gridgain.grid.kernal.processors.affinity; import org.apache.ignite.lang.*; +import org.apache.ignite.marshaller.optimized.*; import org.gridgain.grid.*; -import org.gridgain.grid.marshaller.optimized.*; import org.gridgain.grid.util.typedef.internal.*; import org.gridgain.grid.util.tostring.*; http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/a50fccdd/modules/core/src/main/java/org/gridgain/grid/kernal/processors/cache/GridCacheReturn.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/gridgain/grid/kernal/processors/cache/GridCacheReturn.java b/modules/core/src/main/java/org/gridgain/grid/kernal/processors/cache/GridCacheReturn.java index 8487bd8..b2fa13a 100644 --- a/modules/core/src/main/java/org/gridgain/grid/kernal/processors/cache/GridCacheReturn.java +++ b/modules/core/src/main/java/org/gridgain/grid/kernal/processors/cache/GridCacheReturn.java @@ -9,7 +9,7 @@ package org.gridgain.grid.kernal.processors.cache; -import org.gridgain.grid.marshaller.optimized.*; +import org.apache.ignite.marshaller.optimized.*; import org.gridgain.grid.util.typedef.internal.*; import org.gridgain.grid.util.tostring.*; import org.jetbrains.annotations.*; http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/a50fccdd/modules/core/src/main/java/org/gridgain/grid/kernal/processors/cache/GridCacheTxEntry.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/gridgain/grid/kernal/processors/cache/GridCacheTxEntry.java b/modules/core/src/main/java/org/gridgain/grid/kernal/processors/cache/GridCacheTxEntry.java index 02ec20d..45941d4 100644 --- a/modules/core/src/main/java/org/gridgain/grid/kernal/processors/cache/GridCacheTxEntry.java +++ b/modules/core/src/main/java/org/gridgain/grid/kernal/processors/cache/GridCacheTxEntry.java @@ -10,9 +10,9 @@ package org.gridgain.grid.kernal.processors.cache; import org.apache.ignite.lang.*; +import org.apache.ignite.marshaller.optimized.*; import org.gridgain.grid.*; import org.gridgain.grid.cache.*; -import org.gridgain.grid.marshaller.optimized.*; import org.gridgain.grid.util.lang.*; import org.gridgain.grid.util.typedef.*; import org.gridgain.grid.util.typedef.internal.*; http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/a50fccdd/modules/core/src/main/java/org/gridgain/grid/kernal/processors/cache/GridCacheVersion.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/gridgain/grid/kernal/processors/cache/GridCacheVersion.java b/modules/core/src/main/java/org/gridgain/grid/kernal/processors/cache/GridCacheVersion.java index 5581760..1ed7f93 100644 --- a/modules/core/src/main/java/org/gridgain/grid/kernal/processors/cache/GridCacheVersion.java +++ b/modules/core/src/main/java/org/gridgain/grid/kernal/processors/cache/GridCacheVersion.java @@ -10,7 +10,7 @@ package org.gridgain.grid.kernal.processors.cache; import org.apache.ignite.lang.*; -import org.gridgain.grid.marshaller.optimized.*; +import org.apache.ignite.marshaller.optimized.*; import org.gridgain.grid.util.typedef.internal.*; import org.jetbrains.annotations.*; http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/a50fccdd/modules/core/src/main/java/org/gridgain/grid/kernal/processors/cache/query/jdbc/GridCacheQueryJdbcMetadataTask.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/gridgain/grid/kernal/processors/cache/query/jdbc/GridCacheQueryJdbcMetadataTask.java b/modules/core/src/main/java/org/gridgain/grid/kernal/processors/cache/query/jdbc/GridCacheQueryJdbcMetadataTask.java index fa8801a..4ffed4a 100644 --- a/modules/core/src/main/java/org/gridgain/grid/kernal/processors/cache/query/jdbc/GridCacheQueryJdbcMetadataTask.java +++ b/modules/core/src/main/java/org/gridgain/grid/kernal/processors/cache/query/jdbc/GridCacheQueryJdbcMetadataTask.java @@ -14,12 +14,12 @@ import org.apache.ignite.cluster.*; import org.apache.ignite.compute.*; import org.apache.ignite.marshaller.*; import org.apache.ignite.marshaller.jdk.*; +import org.apache.ignite.marshaller.optimized.*; import org.apache.ignite.resources.*; import org.gridgain.grid.*; import org.gridgain.grid.cache.*; import org.gridgain.grid.kernal.*; import org.gridgain.grid.kernal.processors.cache.query.*; -import org.gridgain.grid.marshaller.optimized.*; import org.gridgain.grid.util.typedef.*; import org.gridgain.grid.util.typedef.internal.*; import org.jetbrains.annotations.*; http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/a50fccdd/modules/core/src/main/java/org/gridgain/grid/kernal/processors/cache/query/jdbc/GridCacheQueryJdbcTask.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/gridgain/grid/kernal/processors/cache/query/jdbc/GridCacheQueryJdbcTask.java b/modules/core/src/main/java/org/gridgain/grid/kernal/processors/cache/query/jdbc/GridCacheQueryJdbcTask.java index 00064a6..03fa113 100644 --- a/modules/core/src/main/java/org/gridgain/grid/kernal/processors/cache/query/jdbc/GridCacheQueryJdbcTask.java +++ b/modules/core/src/main/java/org/gridgain/grid/kernal/processors/cache/query/jdbc/GridCacheQueryJdbcTask.java @@ -14,13 +14,13 @@ import org.apache.ignite.cluster.*; import org.apache.ignite.compute.*; import org.apache.ignite.marshaller.*; import org.apache.ignite.marshaller.jdk.*; +import org.apache.ignite.marshaller.optimized.*; import org.apache.ignite.resources.*; import org.gridgain.grid.*; import org.gridgain.grid.cache.*; import org.gridgain.grid.cache.query.*; import org.gridgain.grid.kernal.*; import org.gridgain.grid.kernal.processors.cache.query.*; -import org.gridgain.grid.marshaller.optimized.*; import org.gridgain.grid.spi.indexing.*; import org.gridgain.grid.util.lang.*; import org.gridgain.grid.util.typedef.*; http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/a50fccdd/modules/core/src/main/java/org/gridgain/grid/kernal/processors/streamer/GridStreamerExecutionBatch.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/gridgain/grid/kernal/processors/streamer/GridStreamerExecutionBatch.java b/modules/core/src/main/java/org/gridgain/grid/kernal/processors/streamer/GridStreamerExecutionBatch.java index 9e56270..3004e85 100644 --- a/modules/core/src/main/java/org/gridgain/grid/kernal/processors/streamer/GridStreamerExecutionBatch.java +++ b/modules/core/src/main/java/org/gridgain/grid/kernal/processors/streamer/GridStreamerExecutionBatch.java @@ -10,8 +10,8 @@ package org.gridgain.grid.kernal.processors.streamer; import org.apache.ignite.lang.*; +import org.apache.ignite.marshaller.optimized.*; import org.gridgain.grid.kernal.managers.deployment.*; -import org.gridgain.grid.marshaller.optimized.*; import org.gridgain.grid.util.typedef.internal.*; import org.gridgain.grid.util.tostring.*; import org.jetbrains.annotations.*;