com.github.sebhoss.contract.lifecycle.AspectContractLifecycle.java Source code

Java tutorial

Introduction

Here is the source code for com.github.sebhoss.contract.lifecycle.AspectContractLifecycle.java

Source

/*
 * Copyright  2012 Sebastian Ho <mail@shoss.de>
 * This work is free. You can redistribute it and/or modify it under the
 * terms of the Do What The Fuck You Want To Public License, Version 2,
 * as published by Sam Hocevar. See http://www.wtfpl.net/ for more details.
 */
package com.github.sebhoss.contract.lifecycle;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.reflect.MethodSignature;

import com.github.sebhoss.contract.annotation.Contract;
import com.github.sebhoss.contract.verifier.ContractVerifier;
import com.github.sebhoss.contract.verifier.ContractVerifierFactory;
import com.github.sebhoss.contract.verifier.ContractVerifierFactory.ContractVerifierBuilder;

/**
 * AspectJ-based implementation of the {@link ContractLifecycle}.
 */
public final class AspectContractLifecycle extends ContractLifecycle {

    private final ProceedingJoinPoint pjp;
    private final Contract contract;

    /**
     * @param pjp
     *            The AspectJ join point to use.
     * @param contract
     *            The contract to verify.
     * @param contractVerifierFactory
     *            The contract verifier factory to use.
     */
    public AspectContractLifecycle(final ProceedingJoinPoint pjp, final Contract contract,
            final ContractVerifierFactory contractVerifierFactory) {
        super(contractVerifierFactory);
        this.pjp = pjp;
        this.contract = contract;
    }

    @Override
    protected ContractVerifier createVerifier() {
        final ContractVerifierBuilder builder = getContractVerifierFactory().createContractVerifier();
        final MethodSignature methodSignature = (MethodSignature) pjp.getSignature();

        builder.method(methodSignature.getMethod());
        builder.parameterNames(methodSignature.getParameterNames());
        builder.instance(pjp.getThis());
        builder.arguments(pjp.getArgs());
        builder.contract(contract);

        return builder.get();
    }

    @Override
    protected Object executeMethod() throws Throwable {
        return pjp.proceed();
    }

}