/*
 * 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.
 */

include 'core:functional',
        'core:io',
        'core:api',
        'core:spi',
        'core:testsupport',
        'core:bootstrap',
        'core:runtime',
        'libraries:alarm',
        'libraries:circuitbreaker',
        'libraries:constraints',
        'libraries:conversion',
        'libraries:eventsourcing',
        'libraries:eventsourcing-jdbm',
        'libraries:eventsourcing-rest',
        'libraries:fileconfig',
        'libraries:http',
        'libraries:invocation-cache',
        'libraries:lang-groovy',
        'libraries:lang-javascript',
        'libraries:lang-scala',
        'libraries:jmx',
        'libraries:locking',
        'libraries:logging',
        'libraries:metrics',
        'libraries:osgi',
        'libraries:rdf',
        'libraries:rest',
        'libraries:rest-client',
        'libraries:rest-common',
        'libraries:rest-server',
        'libraries:restlet',
        'libraries:scheduler',
        'libraries:scripting',
        'libraries:servlet',
        'libraries:shiro-core',
        'libraries:shiro-web',
        'libraries:spring',
        'libraries:sql',
        'libraries:sql-bonecp',
        'libraries:sql-dbcp',
        'libraries:sql-liquibase',
        'libraries:uid',
        'libraries:uowfile',
        'extensions:cache-ehcache',
        'extensions:cache-memcache',
        'extensions:entitystore-memory',
        'extensions:entitystore-file',
        'extensions:entitystore-hazelcast',
        'extensions:entitystore-jclouds',
        'extensions:entitystore-jdbm',
        'extensions:entitystore-leveldb',
        'extensions:entitystore-mongodb',
        'extensions:entitystore-preferences',
        'extensions:entitystore-redis',
        'extensions:entitystore-riak',
        'extensions:entitystore-sql',
        'extensions:indexing-elasticsearch',
        'extensions:indexing-rdf',
        'extensions:indexing-solr',
        'extensions:indexing-sql',
        'extensions:metrics-yammer',
        'extensions:migration',
        'extensions:reindexer',
        'extensions:valueserialization-orgjson',
        'extensions:valueserialization-jackson',
        'extensions:valueserialization-stax',
        'manual',
        'samples:dci',
        'samples:dci-cargo:dcisample_a',
        'samples:dci-cargo:dcisample_b',
        'samples:forum',
        'samples:rental',
        'samples:sql-support',
        'samples:swing',
        'tools:model-detail',
        'tools:envisage',
        'tools:shell',
//        'tools:qidea',
        'tutorials:cargo',
        'tutorials:composites',
        'tutorials:hello',
        'tutorials:introduction',
        'tutorials:introduction:twominutes',
        'tutorials:introduction:tenminutes',
        'tutorials:introduction:thirtyminutes',
//        'tutorials:introduction:twohours',
        'tutorials:services',
        'tests:regression',
        'tests:performance'

rootProject.name = "org.apache.zest"

validateProject(rootProject, "")

def validateProject(project, parentName)
{
    assert project.projectDir.isDirectory()
    if( new File("$project.projectDir/src/main/java").exists() )
    {
        assert project.buildFile.isFile()
    }
    if( parentName == 'org.apache.zest.libraries' )
    {
        parentName = 'org.apache.zest.library'
    }
    if( parentName.endsWith('s') )
    {
        parentName = parentName.substring(0, parentName.length() - 1)
    }
    if( parentName.length() > 0 )
    {
        project.name = parentName + "." + project.name
    }
    println "Project: " + project.name
    project.children.each { child ->
        validateProject(child, project.name)
    }
}

