Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  /*-
   * See the file LICENSE for redistribution information.
   *
   * Copyright (c) 2002, 2013 Oracle and/or its affiliates.  All rights reserved.
   *
   */
  
  package com.sleepycat.persist.impl;
  
 import java.util.Map;
 import java.util.Set;
 
An array of objects having a specified number of dimensions. All multidimensional arrays are handled by this class, since even a primitive array of more than one dimension is an array of objects, where the component objects may be primitive arrays. The PrimitiveArrayFormat class handles primitive arrays of one dimension only. In this class, and PrimitiveArrayFormat, we resort to using reflection to allocate multidimensional arrays. If there is a need for it, reflection could be avoided in the future by generating code as new array formats are encountered.

Author(s):
Mark Hayes
 
 public class ObjectArrayFormat extends Format {
 
     private static final long serialVersionUID = 4317004346690441892L;
 
     private Format componentFormat;
     private int nDimensions;
     private transient Format useComponentFormat;
 
     ObjectArrayFormat(Catalog catalogClass type) {
         super(catalogtype);
         String name = getClassName();
         for ( = 0;
              name.charAt() == '[';
               += 1) {
         }
     }
 
     @Override
     public boolean isArray() {
         return true;
     }
 
     @Override
     public int getDimensions() {
         return ;
     }
 
     @Override
     public Format getComponentType() {
         return ( != null) ?
              : ;
     }
 
     @Override
     void collectRelatedFormats(Catalog catalog,
                                Map<StringFormatnewFormats) {
         Class cls = getType().getComponentType();
         catalog.createFormat(clsnewFormats);
     }
 
     @Override
     void initialize(Catalog catalogEntityModel modelint initVersion) {
         /* Set the component format for a new (never initialized) format. */
         if ( == null) {
             Class cls = getType().getComponentType();
              = catalog.getFormat(cls.getName());
         }
     }
 
     @Override
     boolean isAssignableTo(Format format) {
         if (super.isAssignableTo(format)) {
             return true;
         }
         if (format instanceof ObjectArrayFormat) {
             ObjectArrayFormat other = (ObjectArrayFormatformat;
             if (.isAssignableTo(other.useComponentFormat)) {
                 return true;
             }
         }
         return false;
     }
 
     @Override
     Object newArray(int len) {
        return Array.newInstance(getType(), len);
    }
    @Override
    public Object newInstance(EntityInput inputboolean rawAccess) {
        int len = input.readArrayLength();
        if (rawAccess) {
            return new RawObject(thisnew Object[len]);
        } else {
            return .newArray(len);
        }
    }
    @Override
    public Object readObject(Object oEntityInput inputboolean rawAccess)
        throws RefreshException {
        
        Object[] a;
        if (rawAccess) {
            a = ((RawObjecto).getElements();
        } else {
            a = (Object[]) o;
        }
        if (.getId() == .) {
            for (int i = 0; i < a.lengthi += 1) {
                a[i] = input.readStringObject();
            }
        } else {
            for (int i = 0; i < a.lengthi += 1) {
                a[i] = input.readObject();
            }
        }
        return o;
    }
    @Override
    void writeObject(Object oEntityOutput outputboolean rawAccess)
        throws RefreshException {
        Object[] a;
        if (rawAccess) {
            a = ((RawObjecto).getElements();
        } else {
            a = (Object[]) o;
        }
        output.writeArrayLength(a.length);
        if (.getId() == .) {
            for (int i = 0; i < a.lengthi += 1) {
                output.writeString((String)a[i]);
            }
        } else {
            for (int i = 0; i < a.lengthi += 1) {
                output.writeObject(a[i], );
            }
        }
    }
    @Override
                            boolean rawAccess,
                            RawObject rawObject,
                            IdentityHashMap converted)
        throws RefreshException {
        RawArrayInput input = new RawArrayInput
            (catalograwAccessconvertedrawObject);
        Object a = newInstance(inputrawAccess);
        converted.put(rawObjecta);
        return readObject(ainputrawAccess);
    }
    @Override
    void skipContents(RecordInput input)
        throws RefreshException {
        int len = input.readPackedInt();
        for (int i = 0; i < leni += 1) {
            input.skipField();
        }
    }
    @Override
    void copySecMultiKey(RecordInput inputFormat keyFormatSet results)
        throws RefreshException {
        int len = input.readPackedInt();
        for (int i = 0; i < leni += 1) {
            KeyLocation loc = input.getKeyLocation();
            if (loc == null) {
                throw new IllegalArgumentException
                    ("Secondary key values in array may not be null");
            }
            if (loc.format != ) {
                throw DbCompat.unexpectedState
                    (.getClassName());
            }
            int off1 = loc.input.getBufferOffset();
            .skipContents(loc.input);
            int off2 = loc.input.getBufferOffset();
            DatabaseEntry entry = new DatabaseEntry
                (loc.input.getBufferBytes(), off1off2 - off1);
            results.add(entry);
        }
    }
    @Override
    boolean evolve(Format newFormatEvolver evolver) {
        /*
         * When the class name of the component changes, we need a new format
         * that references it.  Otherwise, don't propogate changes from
         * components upward to their arrays.
         */
        Format latest = .getLatestVersion();
        if (latest !=  &&
            !latest.getClassName().equals(.getClassName())) {
            evolver.useEvolvedFormat(thisnewFormatnewFormat);
        } else {
            evolver.useOldFormat(thisnewFormat);
        }
        return true;
    }
New to GrepCode? Check out our FAQ X