/*
 * 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
 * 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 openejb.tck.commands

/**
 * Generates the reverse tests for both jaxws and jws.
 *
 * @version $Rev: 3415 $ $Date: 2011-07-24 21:14:49 -0700 (Sun, 24 Jul 2011) $
 */
class ReverseSetupCommand
    extends CommandSupport
{
    def ReverseSetupCommand(source) {
        super(source)
    }

    def execute() {
        def javaeeCtsHome = requireDirectory('javaee.cts.home')
        def geronimoHome = requireDirectory('geronimo.home')
        def javaHome = requireDirectory('java.home')

        def tsant = new TsAntCommand(this)
        tsant.props['build.vi'] = true

        // TODO Update for TomEE
        tsant.props['endorsed.dirs'] = "${geronimoHome}/repository/org/apache/geronimo/specs/geronimo-jaxb_2.2_spec/1.0.1" + File.pathSeparator + "${geronimoHome}/repository/org/apache/geronimo/specs/geronimo-jaxws_2.2_spec/1.1" + File.pathSeparator + "${javaHome}/lib/endorsed"

        tsant.envs['ANT_OPTS'] = "-Djava.endorsed.dirs='${geronimoHome}/repository/org/apache/geronimo/specs/geronimo-jaxb_2.2_spec/1.0.1" + File.pathSeparator + "${geronimoHome}/repository/org/apache/geronimo/specs/geronimo-jaxws_2.2_spec/1.1" + File.pathSeparator + "${javaHome}/lib/endorsed'"

        def setupReverseTests = { section ->

            tsant.workingDirectory = "$javaeeCtsHome/src/com/sun/ts/tests/$section"

            // Generate the reverse tests for this section just once they haven't already been generated
            def reverseGeneratedFile = new File("${javaeeCtsHome}/reverse_${section}_generated")
            if (!reverseGeneratedFile.exists()) {

                log.info("Setting up reverse tests for: $section")
                tsant.execute(['clean', 'build'])

                // Create flag to indicate processing is complete
                ant.touch(file: reverseGeneratedFile)
            }
            else {
                log.info("Reverse tests already created for: $section")
            }
        }

        // Default to both jaxws and jws generation
        def sections = [ 'jaxws', 'jws' ]

        // If -Dsection was given, then use that instead
        def section = get('section')
        if (section) {
            sections = [ section ]
        }

        // Setup the rerverse tests for each section
        sections.each {
            setupReverseTests(it)
        }
    }
}
