// 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
// 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.cloud.utils.db;

import java.lang.reflect.Method;

import com.cloud.utils.component.ComponentMethodInterceptor;

public class TransactionContextBuilder implements ComponentMethodInterceptor {
    public TransactionContextBuilder() {
    }

    @Override
    public boolean needToIntercept(Method method) {
        DB db = method.getAnnotation(DB.class);
        if (db != null) {
            return true;
        }

        Class<?> clazz = method.getDeclaringClass();

        do {
            db = clazz.getAnnotation(DB.class);
            if (db != null) {
                return true;
            }
            clazz = clazz.getSuperclass();
        } while (clazz != Object.class && clazz != null);

        return false;
    }

    @Override
    public Object interceptStart(Method method, Object target) {
        return TransactionLegacy.open(method.getName());
    }

    @Override
    public void interceptComplete(Method method, Object target, Object objReturnedInInterceptStart) {
        TransactionLegacy txn = (TransactionLegacy)objReturnedInInterceptStart;
        if (txn != null)
            txn.close();
    }

    @Override
    public void interceptException(Method method, Object target, Object objReturnedInInterceptStart) {
        TransactionLegacy txn = (TransactionLegacy)objReturnedInInterceptStart;
        if (txn != null)
            txn.close();
    }
}
