/**
* Copyright 2014-2016 yangming.liu<bytefox@126.com>.
*
* This copyrighted material is made available to anyone wishing to use, modify,
* copy, or redistribute it subject to the terms and conditions of the GNU
* Lesser General Public License, as published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
* for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this distribution; if not, see <http://www.gnu.org/licenses/>.
*/
package org.bytesoft.bytetcc.supports;
import java.io.ObjectStreamException;
import java.io.Serializable;
import java.util.Arrays;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class CompensableInvocationInfo implements Serializable {
private static final long serialVersionUID = 1L;
static final Logger logger = LoggerFactory.getLogger(CompensableInvocationInfo.class);
private String declaringClass;
private String methodName;
private String[] parameterTypeArray;
private Object[] args;
private String confirmableKey;
private String cancellableKey;
private Object identifier;
private boolean simplified;
protected Object readResolve() throws ObjectStreamException {
CompensableInvocationImpl that = new CompensableInvocationImpl();
that.setArgs(this.args);
that.setConfirmableKey(this.confirmableKey);
that.setCancellableKey(this.cancellableKey);
that.setIdentifier(this.identifier);
that.setSimplified(this.simplified);
Class<?> clazz = null;
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
try {
clazz = classLoader.loadClass(this.declaringClass);
} catch (ClassNotFoundException ex) {
logger.error("Error occurred while loading class: {}", this.declaringClass, ex);
return that;
}
Class<?>[] parameterTypes = new Class<?>[this.parameterTypeArray == null ? 0 : this.parameterTypeArray.length];
for (int i = 0; this.parameterTypeArray != null && i < this.parameterTypeArray.length; i++) {
String className = this.parameterTypeArray[i];
if (Double.TYPE.getName().equals(className)) {
parameterTypes[i] = Double.TYPE;
} else if (Long.TYPE.getName().equals(className)) {
parameterTypes[i] = Long.TYPE;
} else if (Integer.TYPE.getName().equals(className)) {
parameterTypes[i] = Integer.TYPE;
} else if (Float.TYPE.getName().equals(className)) {
parameterTypes[i] = Float.TYPE;
} else if (Short.TYPE.getName().equals(className)) {
parameterTypes[i] = Short.TYPE;
} else if (Character.TYPE.getName().equals(className)) {
parameterTypes[i] = Character.TYPE;
} else if (Boolean.TYPE.getName().equals(className)) {
parameterTypes[i] = Boolean.TYPE;
} else if (Byte.TYPE.getName().equals(className)) {
parameterTypes[i] = Byte.TYPE;
} else {
try {
parameterTypes[i] = Class.forName(className, false, classLoader); // classLoader.loadClass(className);
} catch (ClassNotFoundException ex) {
logger.error("Error occurred while loading class: {}", className, ex);
return that;
}
}
}
try {
that.setMethod(clazz.getDeclaredMethod(this.methodName, parameterTypes));
} catch (NoSuchMethodException ex) {
logger.error("Error occurred: class= {}, method= {}, parameters= {}" //
, this.declaringClass, this.methodName, Arrays.toString(this.parameterTypeArray), ex);
} catch (SecurityException ex) {
logger.error("Error occurred: class= {}, method= {}, parameters= {}" //
, this.declaringClass, this.methodName, Arrays.toString(this.parameterTypeArray), ex);
}
return that;
}
public String getDeclaringClass() {
return declaringClass;
}
public void setDeclaringClass(String declaringClass) {
this.declaringClass = declaringClass;
}
public String getMethodName() {
return methodName;
}
public void setMethodName(String methodName) {
this.methodName = methodName;
}
public String[] getParameterTypeArray() {
return parameterTypeArray;
}
public void setParameterTypeArray(String[] parameterTypeArray) {
this.parameterTypeArray = parameterTypeArray;
}
public Object[] getArgs() {
return args;
}
public void setArgs(Object[] args) {
this.args = args;
}
public String getConfirmableKey() {
return confirmableKey;
}
public void setConfirmableKey(String confirmableKey) {
this.confirmableKey = confirmableKey;
}
public String getCancellableKey() {
return cancellableKey;
}
public void setCancellableKey(String cancellableKey) {
this.cancellableKey = cancellableKey;
}
public Object getIdentifier() {
return identifier;
}
public void setIdentifier(Object identifier) {
this.identifier = identifier;
}
public boolean isSimplified() {
return simplified;
}
public void setSimplified(boolean simplified) {
this.simplified = simplified;
}
}