<!--
  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.
-->
<ivysettings>
  <!-- Prevent IvyDE error: -->
  <property name="server.ivy.repo.root" value="${ivy.project.dir}/NOT_SET" override="false" />
  
  <caches defaultCacheDir="${ivy.project.dir}/.ivy/cache">
    <cache name="cacheForPrivate" useOrigin="true" defaultTTL="1s" />
    
    <!--
      Rather don't use useOrigin="true" here, as deleting from the target repo breaks the cache then.
    -->
    <cache name="cacheForLocalOverride"
      basedir="${user.home}/.ivy2/freemarker-devel-local-override-cache"
      defaultTTL="1s" lockStrategy="artifact-lock"
    />
  </caches>
  <resolvers>
    <chain name="freemarker-devel-local" returnFirst="true">
      <filesystem name="freemarker-devel-local-override" cache="cacheForLocalOverride">
        <ivy pattern="${user.home}/.ivy2/freemarker-devel-local-override/[organisation]/[module]/ivy-[revision].xml" />
        <artifact pattern="${user.home}/.ivy2/freemarker-devel-local-override/[organisation]/[module]/[artifact]-[revision].[ext]" />
      </filesystem>
      <filesystem name="project-private" cache="cacheForPrivate">
        <ivy pattern="${ivy.project.dir}/.ivy/repo/[organisation]/[module]/ivy-[revision].xml" />
        <artifact pattern="${ivy.project.dir}/.ivy/repo/[organisation]/[module]/[artifact]-[revision].[ext]" />
      </filesystem>
    </chain>
    <filesystem name="server-publishing-target">
      <ivy pattern="${server.ivy.repo.root}/[organisation]/[module]/ivy-[revision].xml" />
      <artifact pattern="${server.ivy.repo.root}/[organisation]/[module]/[artifact]-[revision].[ext]" />
    </filesystem>
  </resolvers>
  <modules>
    <module organisation="*" resolver="freemarker-devel-local" />
  </modules>
</ivysettings>
