# 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.


name=apache-nutch
version=2.4
final.name=${name}-${version}
year=2019

basedir = ./
src.dir = ./src/java
lib.dir = ./lib
conf.dir = ./conf
plugins.dir = ./src/plugin

build.dir = ./build
build.classes = ${build.dir}/classes
build.plugins = ${build.dir}/plugins
build.javadoc = ${build.dir}/docs/api
build.encoding = UTF-8
build.ivy.dir=${build.dir}/ivy
build.lib.dir=${build.dir}/lib
build.gora=${build.dir}/gora

test.src.dir = ./src/test
test.build.dir = ${build.dir}/test
test.build.data =  ${test.build.dir}/data
test.build.classes = ${test.build.dir}/classes
test.build.javadoc = ${test.build.dir}/docs/api

# Proxy Host and Port to use for building JavaDoc
javadoc.proxy.host=-J-DproxyHost=
javadoc.proxy.port=-J-DproxyPort=
javadoc.link.java=http://docs.oracle.com/javase/8/docs/api/
javadoc.link.hadoop=http://hadoop.apache.org/docs/r2.5.2/api/
javadoc.link.lucene.core=https://lucene.apache.org/core/4_6_0/core/
javadoc.link.lucene.analyzers-common=https://lucene.apache.org/core/4_6_0/analyzers-common/
javadoc.link.solr-solrj=https://lucene.apache.org/solr/4_6_0/solr-solrj/
javadoc.packages=org.apache.nutch.*

dist.dir=./dist
src.dist.version.dir=${dist.dir}/${final.name}-src
bin.dist.version.dir=${dist.dir}/${final.name}-bin

javac.debug=on
javac.optimize=on
javac.deprecation=on
javac.version= 1.8

runtime.dir=./runtime
runtime.deploy=${runtime.dir}/deploy
runtime.local=${runtime.dir}/local

ivy.version=2.4.0
ivy.dir=${basedir}/ivy
ivy.file=${ivy.dir}/ivy.xml
ivy.jar=${ivy.dir}/ivy-${ivy.version}.jar
ivy.repo.url=http://repo2.maven.org/maven2/org/apache/ivy/ivy/${ivy.version}/ivy-${ivy.version}.jar

ivy.local.default.root=${ivy.default.ivy.user.dir}/local
ivy.local.default.ivy.pattern=[organisation]/[module]/[revision]/[type]s/[artifact].[ext]
ivy.local.default.artifact.pattern=[organisation]/[module]/[revision]/[type]s/[artifact].[ext]

ivy.shared.default.root=${ivy.default.ivy.user.dir}/shared
ivy.shared.default.ivy.pattern=[organisation]/[module]/[revision]/[type]s/[artifact].[ext]
ivy.shared.default.artifact.pattern=[organisation]/[module]/[revision]/[type]s/[artifact].[ext]

#
# Plugins API
#
plugins.api=\
   org.apache.nutch.protocol.http.api*:\
   org.apache.nutch.urlfilter.api*

#
# Protocol Plugins
#
plugins.protocol=\
   org.apache.nutch.protocol.file*:\
   org.apache.nutch.protocol.ftp*:\
   org.apache.nutch.protocol.http*:\
   org.apache.nutch.protocol.httpclient*:\
   org.apache.nutch.protocol.sftp*

#
# URL Filter Plugins
#
plugins.urlfilter=\
   org.apache.nutch.urlfilter.automaton*:\
   org.apache.nutch.urlfilter.domain*:\
   org.apache.nutch.urlfilter.prefix*:\
   org.apache.nutch.urlfilter.regex*:\
   org.apache.nutch.urlfilter.suffix*:\
   org.apache.nutch.urlfilter.validator*

#
# URL Normalizer Plugins
#
plugins.urlnormalizer=\
   org.apache.nutch.net.urlnormalizer.basic*:\
   org.apache.nutch.net.urlnormalizer.host*:\
   org.apache.nutch.net.urlnormalizer.pass*:\
   org.apache.nutch.net.urlnormalizer.querystring*:\
   org.apache.nutch.net.urlnormalizer.regex*

#
# Scoring Plugins
#
plugins.scoring=\
   org.apache.nutch.scoring.depth*:\
   org.apache.nutch.scoring.link*:\
   org.apache.nutch.scoring.opic*:\
   org.apache.nutch.scoring.tld*

#
# Parse Plugins
#
plugins.parse=\
   org.apache.nutch.parse.html*:\
   org.apache.nutch.parse.js:\
   org.apache.nutch.parse.tika
#   org.apache.nutch.parse.ext*:\
#   org.apache.nutch.parse.feed*:\
#   org.apache.nutch.parse.swf*:\
#   org.apache.nutch.parse.zip
   
#
# Parse Filter Plugins
#
plugins.parsefilter=\
   org.apache.nutch.parse.metatags*

#
# Indexing Filter Plugins
#
plugins.index=\
   org.apache.nutch.indexer.anchor*:\
   org.apache.nutch.indexer.basic*:\
   org.apache.nutch.indexer.feed*:\
   org.apache.nutch.indexer.metadata*:\
   org.apache.nutch.indexer.more*:\
   org.apache.nutch.indexer.subcollection*:\
   org.apache.nutch.indexer.tld*

# Indexing Backend Plugins
#
plugins.indexer=\
   org.apache.nutch.indexwriter.elastic2:\
   org.apache.nutch.indexwriter.solr*

#
# Misc. Plugins
#
# (gathers plugins that cannot be dispatched
# in any category, mainly because they contain
# many extension points)
#
plugins.misc=\
   org.apache.nutch.collection*:\
   org.apache.nutch.analysis.lang*:\
   org.creativecommons.nutch*:\
   org.apache.nutch.microformats.reltag*
   
