<%#
 *  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.
 *
 *
-%>
dependencies {
  implementation project( ":model" )
<%
if( polygene.applicationtype === 'Rest API' ) {
%>  implementation project( ":rest" )
<%
}
%>  implementation "org.apache.polygene.core:org.apache.polygene.core.spi:$polygeneVersion"
  implementation "org.apache.polygene.core:org.apache.polygene.core.bootstrap:$polygeneVersion"
  implementation "org.apache.polygene.libraries:org.apache.polygene.library.fileconfig:$polygeneVersion"
<%
if( polygene.applicationtype === 'Rest API' ) {
    if( polygene.hasFeature('security') ) {
%>  implementation "org.apache.polygene.libraries:org.apache.polygene.library.shiro-web:$polygeneVersion"
<%
    }
%>  implementation "org.apache.polygene.libraries:org.apache.polygene.library.restlet:$polygeneVersion"
  implementation "org.apache.polygene.libraries:org.apache.polygene.library.http:$polygeneVersion"
<%
}

if( polygene.entitystore.indexOf('SQL') >= 0 || polygene.indexing === 'SQL' ) {
%>  implementation "org.apache.polygene.libraries:org.apache.polygene.library.sql-<%= polygene.dbpool.toLowerCase() %>:$polygeneVersion"
<%
}
%>
  implementation "org.apache.polygene.extensions:org.apache.polygene.extension.entitystore-<%= polygene.entitystoremodule.toLowerCase() %>:$polygeneVersion"
  implementation "org.apache.polygene.extensions:org.apache.polygene.extension.indexing-<%= polygene.indexing.toLowerCase() %>:$polygeneVersion"
  implementation "org.apache.polygene.extensions:org.apache.polygene.extension.serialization-javaxjson:$polygeneVersion"
<%
if( polygene.caching !== "None" ) {
%>  implementation "org.apache.polygene.extensions:org.apache.polygene.extension.cache-<%= polygene.caching.toLowerCase() %>:$polygeneVersion"
<%
}
    if( polygene.metrics !== "None" ) {
%>  implementation "org.apache.polygene.extensions:org.apache.polygene.extension.metrics-<%= polygene.metrics.toLowerCase() %>:$polygeneVersion"
<%
    }
%>}