/*
 * Copyright 2004,2005 The Apache Software Foundation.
 *
 * Licensed 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.apache.axis2.wsdl.codegen.extension;


import org.apache.axis2.wsdl.codegen.CodeGenConfiguration;

import java.lang.reflect.Method;

/**
 * Extension for simple data binding.
 */
public class SimpleDBExtension extends AbstractDBProcessingExtension {

    private static final String ADB_INVOKE_CLASS_NAME =
            "org.apache.axis2.schema.ExtensionUtility";
    private static final String INVOKE_METHOD_NAME =
            "invoke";

    /**
     * 
     */
    public void engage(CodeGenConfiguration configuration) {
        //test the databinding type. If not just fall through
        if (testFallThrough(configuration.getDatabindingType())) {
            return;
        }
        try {
            //invoke the adb codegen by reflection
            Class adbGeneratorClass = Class.
                    forName(ADB_INVOKE_CLASS_NAME);
            Method invokeMethod = adbGeneratorClass.getMethod(
                    INVOKE_METHOD_NAME,
                    new Class[]{CodeGenConfiguration.class});
            invokeMethod.invoke(null,new Object[]{configuration});

        } catch (Exception e) {
            throw new RuntimeException(e);
        }

    }

}
