blob: 91948fe680a0430375c9e0e0dd624e5ccc9c8585 [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.codehaus.groovy.runtime.metaclass;
/**
* WARNING: This class is for internal use only!
* We use this class to store information about if a default MetaClass is
* used for certain primitives.
* @author Jochen "blackdrag" Theodorou
*
*/
public class DefaultMetaClassInfo {
//---------------------------------------------
// boolean
//---------------------------------------------
// if original boolean meta class
private static boolean origBoolean = true;
// if origBoolean and withoutCustomHandle
private static boolean origBooleanRes = true;
/**
* @return true if no meta class creation handle is set and if
* the original boolean meta class is used.
*/
public static boolean isOrigBool() {
return origBooleanRes;
}
/**
* sets if the original boolean meta class is used
*/
public static void setOrigBool(boolean v) {
origBoolean = v;
origBooleanRes = withoutCustomHandle && origBoolean;
}
//---------------------------------------------
// byte
//---------------------------------------------
// if original Byte meta class
private static boolean origByte = true;
// if origByte and withoutCustomHandle
private static boolean origByteRes = true;
/**
* @return true if no meta class creation handle is set and if
* the original byte meta class is used.
*/
public static boolean isOrigByte() {
return origByteRes;
}
/**
* sets if the original byte meta class is used
*/
public static void setOrigByte(boolean v) {
origByte = v;
origByteRes = withoutCustomHandle && origByte;
}
//---------------------------------------------
// char
//---------------------------------------------
// if original char meta class
private static boolean origChar = true;
// if origChar and withoutCustomHandle
private static boolean origCharRes = true;
/**
* @return true if no meta class creation handle is set and if
* the original char meta class is used.
*/
public static boolean isOrigChar() {
return origCharRes;
}
/**
* sets if the original char meta class is used
*/
public static void setOrigChar(boolean v) {
origChar = v;
origCharRes = withoutCustomHandle && origChar;
}
//---------------------------------------------
// short
//---------------------------------------------
// if original short meta class
private static boolean origShort = true;
// if origShort and withoutCustomHandle
private static boolean origShortRes = true;
/**
* @return true if no meta class creation handle is set and if
* the original short meta class is used.
*/
public static boolean isOrigShort() {
return origShortRes;
}
/**
* sets if the original short meta class is used
*/
public static void setOrigShort(boolean v) {
origShort = v;
origShortRes = withoutCustomHandle && origShort;
}
//---------------------------------------------
// int
//---------------------------------------------
// if original Integer meta class
private static boolean origInt = true;
// if origInt and withoutCustomHandle
private static boolean origIntRes = true;
/**
* @return true if no meta class creation handle is set and if
* the original integer meta class is used.
*/
public static boolean isOrigInt() {
return origIntRes;
}
/**
* sets if the original int meta class is used
*/
public static void setOrigInt(boolean v) {
origInt = v;
origIntRes = withoutCustomHandle && origInt;
}
//---------------------------------------------
// int[]
//---------------------------------------------
// if original Integer[] meta class
private static boolean origIntArray = true;
// if origInt and withoutCustomHandle
private static boolean origIntArrayWCH = true;
/**
* @return true if no meta class creation handle is set and if
* the original integer array meta class is used.
*/
public static boolean isOrigIntArray() {
return origIntArrayWCH;
}
/**
* sets if the original int array meta class is used
*/
public static void setOrigIntArray(boolean v) {
origIntArray = v;
origIntArrayWCH = withoutCustomHandle && origIntArray;
}
//---------------------------------------------
// long
//---------------------------------------------
// if original long meta class
private static boolean origLong = true;
// if origLong and withoutCustomHandle
private static boolean origLongRes = true;
/**
* @return true if no meta class creation handle is set and if
* the original long meta class is used.
*/
public static boolean isOrigLong() {
return origLongRes;
}
/**
* sets if the original long meta class is used
*/
public static void setOrigLong(boolean v) {
origLong = v;
origLongRes = withoutCustomHandle && origLong;
}
//---------------------------------------------
// float
//---------------------------------------------
// if original float meta class
private static boolean origFloat = true;
// if origFloat and withoutCustomHandle
private static boolean origFloatRes = true;
/**
* @return true if no meta class creation handle is set and if
* the original float meta class is used.
*/
public static boolean isOrigFloat() {
return origFloatRes;
}
/**
* sets if the original float meta class is used
*/
public static void setOrigFloat(boolean v) {
origFloat = v;
origFloatRes = withoutCustomHandle && origFloat;
}
//---------------------------------------------
// double
//---------------------------------------------
// if original double meta class
private static boolean origDouble = true;
// if origFloat and withoutCustomHandle
private static boolean origDoubleRes = true;
/**
* @return true if no meta class creation handle is set and if
* the original double meta class is used.
*/
public static boolean isOrigDouble() {
return origDoubleRes;
}
/**
* sets if the original double meta class is used
*/
public static void setOrigDouble(boolean v) {
origDouble = v;
origDoubleRes = withoutCustomHandle && origDouble;
}
//---------------------------------------------
// custom meta class creation handle
//---------------------------------------------
// if a custom meta class creation handle is set
private static boolean withoutCustomHandle = true;
/**
* sets if the system uses a custom meta class creation handle
*/
public static void setWithoutCustomMetaclassCreationHandle(boolean mch) {
withoutCustomHandle = mch;
changeFlags(mch);
}
//---------------------------------------------
// category handle
//---------------------------------------------
private static boolean categoryUsed = false;
private static boolean disabledStandardMC = false;
public static void setCategoryUsed(boolean b) {
categoryUsed = b;
disabledStandardMC = b || !withoutCustomHandle;
}
public static boolean disabledStandardMetaClass() {
return disabledStandardMC;
}
private static void changeFlags(boolean mch) {
if (mch) {
disabledStandardMC = true;
origIntArrayWCH = false;
origByteRes = origChar = origBoolean =false;
origShortRes = origIntRes = origLong = false;
origFloat = origDouble = false;
} else {
disabledStandardMC = categoryUsed;
origByteRes = origByte; origCharRes = origChar;
origBooleanRes = origBoolean; origShortRes = origShort;
origIntRes = origInt; origLongRes = origLong;
origFloatRes = origFloat; origDoubleRes = origDouble;
origIntArrayWCH = origIntArray;
}
}
public static void setPrimitiveMeta(Class c, boolean orig) {
if (c==Byte.class) {
setOrigByte(orig);
} else if (c==Character.class) {
setOrigChar(orig);
} else if (c==Short.class) {
setOrigShort(orig);
} else if (c==Integer.class) {
setOrigInt(orig);
} else if (c.getComponentType()==Integer.class) {
setOrigIntArray(orig);
} else if (c==Long.class) {
setOrigLong(orig);
} else if (c==Float.class) {
setOrigFloat(orig);
} else if (c==Double.class) {
setOrigDouble(orig);
}
}
//---------------------------------------------
// GlobalMetaClassVersioning
//---------------------------------------------
public static class ConstantMetaClassVersioning {
private boolean valid = true;
public boolean isValid(){return valid;}
}
private static ConstantMetaClassVersioning constantMetaClassVersioning = new ConstantMetaClassVersioning();
private static Object constantMetaClassVersioningLock = new Object();
public static ConstantMetaClassVersioning getCurrentConstantMetaClassVersioning() {
return constantMetaClassVersioning;
}
public static ConstantMetaClassVersioning getNewConstantMetaClassVersioning() {
synchronized (constantMetaClassVersioningLock) {
constantMetaClassVersioning.valid = false;
constantMetaClassVersioning = new ConstantMetaClassVersioning();
return constantMetaClassVersioning;
}
}
}