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

ext.unsupportedJava7TestProjects = [  // why not on all of these? (match ant_test7.run, see JAVA_SUPPORT.md)
  // projects with no tests will be automatically avoided for java7 tests
  // otherwise those that are not yet supported for java7 (not in ant_test7.{setup,run}) must be added here
  ':api:graph',       // no runnable tests
  ':analytics:math3',
  ':analytics:sensors',
  ':connectors:command',
  ':connectors:csv',
  ':connectors:file',
  ':connectors:jdbc',
  ':connectors:mqtt',
  ':connectors:kafka',
  ':connectors:serial',
  ':connectors:wsclient',
  ':connectors:wsclient-javax.websocket',
  ':connectors:javax.websocket-client',
  ':connectors:edgent.javax.websocket',
  ':connectors:javax.websocket-server',
  ':console:server',
  ':console:servlets',
  ':providers:development',
  ':utils:streamscope',
  ':test:fvtiot',
  ':test:svt',
]

ext.projectsWithPreApacheContribs = [
  ':analytics:math3', ':analytics:sensors',
  ':android:topology', ':android:hardware',
  ':api:function', ':api:execution', ':api:window', ':api:oplet',
  ':api:graph', ':api:topology',
  ':connectors:common', ':connectors:iot', ':connectors:serial',
  ':connectors:file', ':connectors:http', ':connectors:iotp',
  ':connectors:jdbc', ':connectors:kafka', ':connectors:mqtt',
  ':connectors:edgent.javax.websocket',
  ':connectors:javax.websocket-client', ':connectors:javax.websocket-server',
  ':connectors:wsclient', ':connectors:wsclient-javax.websocket',
  ':console:server', ':console:servlets',
  ':providers:direct', ':providers:development',
  ':runtime:etiao', ':runtime:jmxcontrol', ':runtime:jsoncontrol',
  ':samples:utils', ':samples:apps', ':samples:topology', ':samples:connectors',
  ':samples:console',
  ':spi:graph', ':spi:topology',
  ':test:svt',
  ':utils:metrics',
]
