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

apply plugin: 'com.diffplug.spotless'

/*
 * This build.gradle file is empty except to configure the spotless task on the java sources.
 * These java sources are included in the subproject's sources in order to compile against the different versions.
 * We configure spotless here once in order to only check these java sources once.
 */
spotless {
  java {
    licenseHeader org.apache.beam.gradle.BeamModulePlugin.javaLicenseHeader
    googleJavaFormat('1.7')
    target project.fileTree(project.projectDir) { include 'src/*/java/**/*.java' }
  }
}