All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.jd.blockchain.transaction.ContractInvocationHandler Maven / Gradle / Ivy

There is a newer version: 1.6.5.RELEASE
Show newest version
package com.jd.blockchain.transaction;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.util.Arrays;

import com.jd.blockchain.contract.ContractException;
import com.jd.blockchain.contract.ContractType;
import com.jd.blockchain.ledger.BytesValueEncoding;
import com.jd.blockchain.ledger.BytesValueList;

import utils.Bytes;
import utils.IllegalDataException;

public class ContractInvocationHandler implements InvocationHandler {

	private Bytes contractAddress;
	private long version;

	private ContractType contractType;

	private ContractEventSendOperationBuilder sendOpBuilder;

	private int proxyHashCode;

	public ContractInvocationHandler(Bytes contractAddress, long version, ContractType contractType,
			ContractEventSendOperationBuilder sendOpBuilder) {
		this.contractAddress = contractAddress;
		this.version = version;
		if (contractType == null) {
			throw new IllegalDataException("contractType == null, no invoke really.");
		}
		this.contractType = contractType;
		this.sendOpBuilder = sendOpBuilder;
		this.proxyHashCode = Arrays.deepHashCode(new Object[] { this, contractAddress, version, contractType, sendOpBuilder });
	}

	@Override
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		// 判断是否是常规方法调用
		if (method.getName().equals("hashCode")) {
			// 该处需要使用当前代理类的HashCode
			return proxyHashCode;
		}
		if (method.getName().equals("toString")) {
			// 该处使用当前代理类的toString
			return this.toString();
		}

		String event = contractType.getEvent(method);
		if (event == null) {
			// 该方法不是合约可执行的方法
			throw new ContractException(
					String.format("The invoking method [%s] is not annotated as event handle method by @ContractEvent!",
							method.toString()));
		}
		// 序列化调用参数;
		Class[] argTypes = method.getParameterTypes();
		BytesValueList argBytes = BytesValueEncoding.encodeArray(args, argTypes);

		// 定义合约调用操作;
		ContractEventSendOpTemplate opTemplate = (ContractEventSendOpTemplate) sendOpBuilder.invoke(event, argBytes);

		// 加入合约调用的额外信息;
		ContractInvocation invocation = new ContractInvocation(contractType, method);

		// 传递给定义操作的上下文,以便在生成交易时,同步操作在交易中的索引位置;
		opTemplate.setInvocation(invocation);

		// 传递给通过代理对象调用合约方法的调用者,以便可以同步操作在交易中的索引位置以及操作的返回值;
		ContractInvocationStub.set(invocation);

		// 返回类型的默认值
		return BytesValueEncoding.getDefaultValue(method.getReturnType());
	}

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy