public static Object fromPKValues()

in openjpa-kernel/src/main/java/org/apache/openjpa/util/ApplicationIds.java [137:265]


    public static Object fromPKValues(Object[] pks, ClassMetaData meta) {
        if (meta == null || pks == null)
            return null;

        boolean convert = !meta.getRepository().getConfiguration().
            getCompatibilityInstance().getStrictIdentityValues();
        if (meta.isOpenJPAIdentity()) {
            int type = meta.getPrimaryKeyFields()[0].getObjectIdFieldTypeCode();
            Object val = (convert) ? JavaTypes.convert(pks[0], type) : pks[0];
            switch (type) {
                case JavaTypes.BYTE:
                case JavaTypes.BYTE_OBJ:
                    if (!convert && !(val instanceof Byte))
                        throw new ClassCastException("!(x instanceof Byte)");
                    return new ByteId(meta.getDescribedType(),
                        val == null ? 0 : ((Number) val).byteValue());
                case JavaTypes.CHAR:
                case JavaTypes.CHAR_OBJ:
                    return new CharId(meta.getDescribedType(),
                        val == null ? 0 : (Character) val);
                case JavaTypes.DOUBLE:
                case JavaTypes.DOUBLE_OBJ:
                    if (!convert && !(val instanceof Double))
                        throw new ClassCastException("!(x instanceof Double)");
                    return new DoubleId(meta.getDescribedType(),
                        val == null ? 0 : ((Number) val).doubleValue());
                case JavaTypes.FLOAT:
                case JavaTypes.FLOAT_OBJ:
                    if (!convert && !(val instanceof Float))
                        throw new ClassCastException("!(x instanceof Float)");
                    return new FloatId(meta.getDescribedType(),
                        val == null ? 0 : ((Number) val).floatValue());
                case JavaTypes.INT:
                case JavaTypes.INT_OBJ:
                    if (!convert && !(val instanceof Integer))
                        throw new ClassCastException("!(x instanceof Integer)");
                    return new IntId(meta.getDescribedType(),
                        val == null ? 0 : ((Number) val).intValue());
                case JavaTypes.LONG:
                case JavaTypes.LONG_OBJ:
                    if (!convert && !(val instanceof Long))
                        throw new ClassCastException("!(x instanceof Long)");
                    return new LongId(meta.getDescribedType(),
                        val == null ? 0 : ((Number) val).longValue());
                case JavaTypes.SHORT:
                case JavaTypes.SHORT_OBJ:
                    if (!convert && !(val instanceof Short))
                        throw new ClassCastException("!(x instanceof Short)");
                    return new ShortId(meta.getDescribedType(),
                        val == null ? 0 : ((Number) val).shortValue());
                case JavaTypes.STRING:
                    return new StringId(meta.getDescribedType(), (String) val);
                case JavaTypes.DATE:
                    return new DateId(meta.getDescribedType(), (Date) val);
                case JavaTypes.OID:
                case JavaTypes.OBJECT:
                    return new ObjectId(meta.getDescribedType(), val);
                case JavaTypes.BIGDECIMAL:
                    if (!convert && !(val instanceof BigDecimal))
                        throw new ClassCastException(
                            "!(x instanceof BigDecimal)");
                    return new BigDecimalId(meta.getDescribedType(),
                        (BigDecimal)val);
                case JavaTypes.BIGINTEGER:
                    if (!convert && !(val instanceof BigInteger))
                        throw new ClassCastException(
                            "!(x instanceof BigInteger)");
                    return new BigIntegerId(meta.getDescribedType(),
                        (BigInteger)val);
                case JavaTypes.BOOLEAN:
                case JavaTypes.BOOLEAN_OBJ:
                    if (!convert && !(val instanceof Boolean))
                        throw new ClassCastException("!(x instanceof Boolean)");
                    return new BooleanId(meta.getDescribedType(),
                        val == null ? false : (Boolean)val);
                case JavaTypes.UUID_OBJ:
                    if (convert && (val instanceof String))
                        return new UuidId(meta.getDescribedType(), UUID.fromString((String) val));
                    else if (val instanceof UUID)
                        return new UuidId(meta.getDescribedType(), (UUID) val);
                    throw new ClassCastException(String.format("Could not convert [%s] to UUID", val.getClass().getCanonicalName()));
                default:
                    throw new InternalException();
            }
        }

        // copy pks to oid
        if (!Modifier.isAbstract(meta.getDescribedType().getModifiers())) {
            Object oid = PCRegistry.newObjectId(meta.getDescribedType());
            PrimaryKeyFieldManager producer = new PrimaryKeyFieldManager();
            producer.setStore(pks);
            if (convert)
                producer.setMetaData(meta);
            PCRegistry.copyKeyFieldsToObjectId(meta.getDescribedType(),
                producer, oid);
            return ApplicationIds.wrap(meta, oid);
        }

        // default to reflection
        Class<?> oidType = meta.getObjectIdType();
        if (Modifier.isAbstract(oidType.getModifiers()))
            throw new UserException(_loc.get("objectid-abstract", meta));
        Object copy = null;
        try {
            copy = AccessController.doPrivileged(
                J2DoPrivHelper.newInstanceAction(oidType));
        } catch (Throwable t) {
            if (t instanceof PrivilegedActionException)
                t = ((PrivilegedActionException) t).getException();
            throw new GeneralException(t);
        }

        FieldMetaData[] fmds = meta.getPrimaryKeyFields();
        Object val;
        for (int i = 0; i < fmds.length; i++) {
            val = (convert) ? JavaTypes.convert(pks[i],
                fmds[i].getObjectIdFieldTypeCode()) : pks[i];
            if (AccessCode.isField(meta.getAccessType()))
                Reflection.set(copy, Reflection.findField(oidType,
                    fmds[i].getName(), true), val);
            else
                Reflection.set(copy, Reflection.findSetter(oidType,
                    fmds[i].getName(), fmds[i].getDeclaredType(), true), val);
        }

        if (meta.isObjectIdTypeShared())
            copy = new ObjectId(meta.getDescribedType(), copy);
        return copy;
    }