/*
* Copyright 2006-2012 Amazon Technologies, Inc. or its affiliates.
* Amazon, Amazon.com and Carbonado are trademarks or registered trademarks
* of Amazon Technologies, Inc. or its affiliates. All rights reserved.
*
* Licensed 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 com.amazon.carbonado.raw;
import java.lang.reflect.Method;
import org.cojen.classfile.CodeAssembler;
import org.cojen.classfile.TypeDesc;
import com.amazon.carbonado.info.StorableProperty;
import com.amazon.carbonado.lob.Lob;
/**
*
*
* @author Brian S O'Neill
*/
public class StorablePropertyInfo implements GenericPropertyInfo {
private final StorableProperty<?> mProp;
private final TypeDesc mPropertyType;
private final TypeDesc mStorageType;
private final Method mFromStorage;
private final Method mToStorage;
StorablePropertyInfo(StorableProperty<?> property) {
this(property, null, null, null);
}
StorablePropertyInfo(StorableProperty<?> property,
Class<?> storageType, Method fromStorage, Method toStorage) {
mProp = property;
mPropertyType = TypeDesc.forClass(property.getType());
if (storageType == null) {
mStorageType = mPropertyType;
} else {
mStorageType = TypeDesc.forClass(storageType);
}
mFromStorage = fromStorage;
mToStorage = toStorage;
}
public String getPropertyName() {
return mProp.getName();
}
public TypeDesc getPropertyType() {
return mPropertyType;
}
public TypeDesc getStorageType() {
return mStorageType;
}
public boolean isNullable() {
return mProp.isNullable();
}
public boolean isLob() {
Class clazz = mPropertyType.toClass();
return clazz != null && Lob.class.isAssignableFrom(clazz);
}
public boolean isDerived() {
return mProp.isDerived();
}
public Method getFromStorageAdapter() {
return mFromStorage;
}
public Method getToStorageAdapter() {
return mToStorage;
}
public String getReadMethodName() {
return mProp.getReadMethodName();
}
public void addInvokeReadMethod(CodeAssembler a) {
a.invoke(mProp.getReadMethod());
}
public void addInvokeReadMethod(CodeAssembler a, TypeDesc instanceType) {
Class clazz = instanceType.toClass();
if (clazz == null) {
// Can't know if instance should be invoked as an interface or as a
// virtual method.
throw new IllegalArgumentException("Instance type has no known class");
}
if (clazz.isInterface()) {
a.invokeInterface(instanceType, getReadMethodName(), getPropertyType(), null);
} else {
a.invokeVirtual(instanceType, getReadMethodName(), getPropertyType(), null);
}
}
public String getWriteMethodName() {
return mProp.getWriteMethodName();
}
public void addInvokeWriteMethod(CodeAssembler a) {
a.invoke(mProp.getWriteMethod());
}
public void addInvokeWriteMethod(CodeAssembler a, TypeDesc instanceType) {
Class clazz = instanceType.toClass();
if (clazz == null) {
// Can't know if instance should be invoked as an interface or as a
// virtual method.
throw new IllegalArgumentException("Instance type has no known class");
}
if (clazz.isInterface()) {
a.invokeInterface(instanceType,
getWriteMethodName(), null, new TypeDesc[] {getPropertyType()});
} else {
a.invokeVirtual(instanceType,
getWriteMethodName(), null, new TypeDesc[] {getPropertyType()});
}
}
@Override
public String toString() {
return mProp.toString();
}
}