blob: 4282b79c71939460fabe70c6666d8f9a5f603bd3 [file] [log] [blame]
<?xml version="1.0"?>
<!--
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.
-->
<project basedir="." name="plugins">
<!-- public targets -->
<target name="available-plugins"
depends="init-props, plugin-unavailable, fetch-plugins-descriptors"
description="What plugins are available?">
<for param="plugin-descriptor-file">
<path>
<fileset dir="${project.temp-dir}" includes="plugins-*.xml"/>
</path>
<sequential>
<xslt in="@{plugin-descriptor-file}"
out="${project.temp-dir}/pluginlist2echobuild.xml"
style="${forrest.core}/var/pluginlist2echo.xsl"/>
<ant antfile="${project.temp-dir}/pluginlist2echobuild.xml"/>
</sequential>
</for>
</target>
<target name="plugin-unavailable">
<property name="plugin.unavailable" value="true"/>
</target>
<target name="check-plugin">
<condition property="plugin.unavailable">
<and>
<not>
<available type="dir" file="${forrest.plugins-dir}/${versioned.name}"/>
</not>
<not>
<available type="file" file="${forrest.plugins-dir}/${versioned.name}.zip"/>
</not>
</and>
</condition>
<if>
<isset property="plugin.unavailable"/>
<then>
<echo level="info">${versioned.name} is not available in the build dir. Trying to fetch it...</echo>
</then>
<else>
<echo level="info">${versioned.name} is available in the build dir. Trying to update it...</echo>
</else>
</if>
</target>
<target name="unpack-plugin"
if="downloaded"
depends="init-props">
<if>
<available file="${forrest.plugins-dir}/${versioned.name}.zip"/>
<then>
<antcall target="extract-plugin">
<param name="plugin" value="${versioned.name}"/>
</antcall>
</then>
<else>
<if>
<available file="${forrest.plugins-dir}/${plugin.name}.zip"/>
<then>
<antcall target="extract-plugin">
<param name="plugin" value="${plugin.name}"/>
</antcall>
</then>
<else>
<if>
<not>
<available file="${forrest.plugins-dir}/${plugin.name}"/>
</not>
<then>
<echo>
ERROR
=====
Unable to retrieve the ${versioned.name} plugin.
There may be more information about the reason for this in output
above. The usual cause is that Forrest has been unable to download
the plugin descriptor file that indicates where this plugin is to be
downloaded from. If you are behind a firewall then set the proxy.host
and proxy.port values in the forrest.properties file.
You may also like to check the value of the
forrest.plugins.descriptors property in the forrest.properties file
and ensure that the locations indicated by that value are accessible
(note there should be no spaces in this property).
If all else fails you can can manually install the plugins you need
by downloading the install bundles (see
http://forrest.apache.org/pluginDocs/plugins_0_70/index.html) and unpacking
them into FORREST_HOME/build/plugins.
Note that once the plugins have been installed, they will not need
to be installed again unless you delete them or wish to upgrade them.
</echo>
<fail message="Unable to install required plugins. See error messages above for more detail."/>
</then>
</if>
</else>
</if>
</else>
</if>
</target>
<target name="extract-plugin">
<unzip dest="${forrest.plugins-dir}/${plugin}">
<fileset dir="${forrest.plugins-dir}/">
<include name="${plugin}.zip"/>
</fileset>
</unzip>
<!-- add to the entity catalog -->
<copy file="${forrest.core}/var/initial_catalog.xcat"
tofile="${forrest.plugins-dir}/catalog.xcat"
overwrite="false"/>
<if>
<available file="${forrest.plugins-dir}/${plugin}/resources/schema/catalog.xcat"/>
<then>
<xslt in="${forrest.plugins-dir}/catalog.xcat"
out="${forrest.plugins-dir}/catalog.xcat.new"
style="${forrest.core}/var/catalogMountSnippet.xsl"
force="true">
<param name="plugin-catalog-path"
expression="${plugin}/resources/schema/catalog.xcat"/>
</xslt>
<move file="${forrest.plugins-dir}/catalog.xcat.new"
tofile="${forrest.plugins-dir}/catalog.xcat"/>
</then>
</if>
</target>
<target name="configure-plugin"
unless="plugin.unavailable">
<if>
<available file="${forrest.plugins-dir}/${versioned.name}"/>
<then>
<if>
<available property="input-plugin" file="${forrest.plugins-dir}/${versioned.name}/input.xmap"/>
<then>
<antcall target="configure-input-plugin">
<param name="plugin" value="${versioned.name}"/>
</antcall>
</then>
</if>
<if>
<available property="output-plugin" file="${forrest.plugins-dir}/${versioned.name}/output.xmap"/>
<then>
<antcall target="configure-output-plugin">
<param name="plugin" value="${versioned.name}"/>
</antcall>
</then>
</if>
<if>
<available property="internal-plugin" file="${forrest.plugins-dir}/${versioned.name}/internal.xmap"/>
<then>
<antcall target="configure-internal-plugin">
<param name="plugin" value="${versioned.name}"/>
</antcall>
</then>
</if>
<if>
<available property="plugin-locationmap" file="${forrest.plugins-dir}/${versioned.name}/locationmap.xml"/>
<then>
<antcall target="configure-plugin-locationmap">
<param name="plugin" value="${versioned.name}"/>
</antcall>
</then>
<else>
<echo message="No locationmap provided for plugin ${versioned.name}"/>
</else>
</if>
</then>
<else>
<if>
<available property="input-plugin" file="${forrest.plugins-dir}/${plugin.name}/input.xmap"/>
<then>
<antcall target="configure-input-plugin">
<param name="plugin" value="${plugin.name}"/>
</antcall>
</then>
</if>
<if>
<available property="output-plugin" file="${forrest.plugins-dir}/${plugin.name}/output.xmap"/>
<then>
<antcall target="configure-output-plugin">
<param name="plugin" value="${plugin.name}"/>
</antcall>
</then>
</if>
<if>
<available property="internal-plugin" file="${forrest.plugins-dir}/${plugin.name}/internal.xmap"/>
<then>
<antcall target="configure-internal-plugin">
<param name="plugin" value="${plugin.name}"/>
</antcall>
</then>
</if>
<if>
<available property="plugin-locationmap" file="${forrest.plugins-dir}/${plugin.name}/locationmap.xml"/>
<then>
<antcall target="configure-plugin-locationmap">
<param name="plugin" value="${plugin.name}"/>
</antcall>
</then>
<else>
<echo message="No locationmap provided for plugin ${plugin.name}"/>
</else>
</if>
</else>
</if>
</target>
<target name="configure-input-plugin">
<!-- add the snippet to plugins/input.xmap that will mount the plugin
specific input.xmap -->
<echo level="info">Mounting input plugin: ${plugin}</echo>
<xslt in="${project.temp-dir}/input.xmap"
out="${project.temp-dir}/input.xmap.new"
style="${forrest.core}/var/pluginMountSnippet.xsl"
force="true">
<param name="plugin-name" expression="${plugin}"/>
<param name="plugin-type" expression="input"/>
</xslt>
<move file="${project.temp-dir}/input.xmap.new"
tofile="${project.temp-dir}/input.xmap"/>
<xslt in="${project.temp-dir}/resources.xmap"
out="${project.temp-dir}/resources.xmap.new"
style="${forrest.core}/var/pluginMountSnippet.xsl"
force="true">
<param name="plugin-name" expression="${plugin}"/>
<param name="plugin-type" expression="resources"/>
</xslt>
<move file="${project.temp-dir}/resources.xmap.new"
tofile="${project.temp-dir}/resources.xmap"/>
</target>
<target name="configure-output-plugin">
<!-- add the snippet to plugins/output.xmap that will mount the plugin
specific input.xmap -->
<echo level="info">Mounting output plugin: ${plugin}</echo>
<xslt in="${project.temp-dir}/output.xmap"
out="${project.temp-dir}/output.xmap.new"
style="${forrest.core}/var/pluginMountSnippet.xsl"
force="true">
<param name="plugin-name" expression="${plugin}"/>
<param name="plugin-type" expression="output"/>
</xslt>
<move file="${project.temp-dir}/output.xmap.new"
tofile="${project.temp-dir}/output.xmap"/>
</target>
<target name="configure-internal-plugin">
<!-- add the snippet to plugins/internal.xmap that will mount the plugin
specific input.xmap -->
<echo level="info">Mounting internal plugin: ${plugin}</echo>
<xslt in="${project.temp-dir}/internal.xmap"
out="${project.temp-dir}/internal.xmap.new"
style="${forrest.core}/var/pluginMountSnippet.xsl"
force="true">
<param name="plugin-name" expression="${plugin}"/>
<param name="plugin-type" expression="internal"/>
</xslt>
<move file="${project.temp-dir}/internal.xmap.new"
tofile="${project.temp-dir}/internal.xmap"/>
</target>
<target name="configure-plugin-locationmap">
<!-- add the snippet to plugins/locationmap.xml that will mount the plugin
specific locationmap -->
<echo level="info">Mounting plugin locationmap for ${plugin}</echo>
<xslt in="${project.temp-dir}/locationmap.xml"
out="${project.temp-dir}/locationmap.xml.new"
style="${forrest.core}/var/pluginLmMountSnippet.xsl"
force="true">
<param name="plugin-name" expression="${plugin}"/>
</xslt>
<move file="${project.temp-dir}/locationmap.xml.new"
tofile="${project.temp-dir}/locationmap.xml"/>
</target>
<target name="fetch-plugins-descriptors" depends="init-proxy" unless="plugins.desc.already.fetched">
<!-- Copy the initial local descriptors, then replace them with the
published descriptors. This enables offline operation. -->
<copy file="${forrest.home}/plugins/plugins.xml"
tofile="${project.temp-dir}/plugins-1.xml"
preservelastmodified="true"/>
<copy file="${forrest.home}/whiteboard/plugins/whiteboard-plugins.xml"
tofile="${project.temp-dir}/plugins-2.xml"
preservelastmodified="true"/>
<var name="plugin-counter" value="1"/>
<for list="${forrest.plugins.descriptors}" param="url">
<sequential>
<echo level="info">Fetching plugins descriptor: @{url}</echo>
<get src="@{url}"
dest="${project.temp-dir}/plugins-${plugin-counter}.xml"
verbose="true" usetimestamp="true" ignoreerrors="true"/>
<available property="plugin.list-${plugin-counter}.present"
file="${project.temp-dir}/plugins-${plugin-counter}.xml"/>
<math result="plugin-counter" operand1="${plugin-counter}" operation="+" operand2="1" datatype="int"/>
</sequential>
</for>
<var name="plugin-counter" value="1"/>
<for list="${forrest.plugins.descriptors}" param="url">
<sequential>
<if>
<available file="${project.temp-dir}/plugins-${plugin-counter}.xml"/>
<then>
<echo level="info">Plugin list loaded from @{url}.</echo>
</then>
<else>
<echo>
WARNING
=======
Unable to load plugin list number ${plugin-counter} from @{url}.
Any plugins identified in this plugin list cannot be installed
automatially, see further errors below.</echo>
</else>
</if>
<math result="plugin-counter" operand1="${plugin-counter}" operation="+" operand2="1" datatype="int"/>
</sequential>
</for>
</target>
<target name="fetch-plugin"
depends="init-props, fetch-plugins-descriptors">
<echo level="info">Trying to find the description of ${versioned.name} in the different descriptor files</echo>
<trycatch property="plugin-found">
<try>
<for param="plugin-descriptor-file">
<path>
<fileset dir="${project.temp-dir}" includes="plugins-*.xml"/>
</path>
<sequential>
<echo level="info">Using the descriptor file @{plugin-descriptor-file}...</echo>
<xslt in="@{plugin-descriptor-file}"
out="${project.temp-dir}/pluginlist2fetchbuild.xml"
style="${forrest.core}/var/pluginlist2fetch.xsl"
force="true">
<param name="plugin-name" expression="${plugin.name}"/>
<param name="plugin-version" expression="${plugin.version}"/>
<param name="plugin-dir" expression="${forrest.plugins-dir}/"/>
<param name="plugin-src-dir" expression="${project.required.plugins.src}"/>
<param name="forrest-version" expression="${forrest.version}"/>
</xslt>
<antfetch antfile="${project.temp-dir}/pluginlist2fetchbuild.xml" return="plugin-found,downloaded"/>
<fail if="plugin-found"/>
</sequential>
</for>
</try>
<catch>
<echo level="info">Fetch-plugin Ok, installing !</echo>
</catch>
</trycatch>
<!-- Here we stop if the description of a plugin has not been found... -->
<fail unless="plugin-found">STOP GENERATION !
WARNING - Cannot find the plugin description
============================================
Unable to find the description of ${versioned.name} in the different descriptor files.
This plugin used by this project (declared in project.required.plugins variable of the forrest.properties).
Forrest will stop the generation now.
To correct this :
- Check the name of the plugin and correct it in case it is wrong,
- Add the missing descriptor file in the list in the forrest.plugins.descriptors variable (forrest.properties) if necessary...
</fail>
</target>
<target name="install-plugin" depends="check-plugin, fetch-plugin, unpack-plugin"/>
<target name="init-plugins" depends="init-props, fetch-plugins-descriptors"
description="Ensure the required plugins are available locally, if any are not, download them automatically">
<mkdir dir="${forrest.plugins-dir}"/>
<mkdir dir="${project.temp-dir}"/>
<mkdir dir="${project.webapp}/conf"/>
<copy file="${forrest.core}/var/initial_plugins_sitemap.xmap"
tofile="${project.temp-dir}/input.xmap"
overwrite="true"/>
<copy file="${forrest.core}/var/initial_plugins_sitemap.xmap"
tofile="${project.temp-dir}/resources.xmap"
overwrite="true"/>
<copy file="${forrest.core}/var/initial_plugins_sitemap.xmap"
tofile="${project.temp-dir}/output.xmap"
overwrite="true"/>
<copy file="${forrest.core}/var/initial_plugins_sitemap.xmap"
tofile="${project.temp-dir}/internal.xmap"
overwrite="true"/>
<copy file="${forrest.core}/var/initial_plugins_locationmap.xml"
tofile="${project.temp-dir}/locationmap.xml"
overwrite="true"/>
<for list="${project.required.plugins}" param="name">
<sequential>
<echo level="info">
--------------------------------------------------------------
Installing plugin: @{name}
--------------------------------------------------------------
</echo>
<propertyregex property="plugin.name"
override="true"
input="@{name}"
regexp="(.*)-(.*)"
select="\1"
casesensitive="false"
defaultvalue="@{name}"/>
<propertyregex property="plugin.version"
override="true"
input="@{name}"
regexp="(.*)-(.*)"
select="\2"
casesensitive="false"
defaultvalue=""/>
<condition property="project.plugins.overridden">
<and>
<isset property="project.plugins.override"/>
<istrue value="${project.plugins.override}"/>
</and>
</condition>
<if>
<isset property="project.plugins.overridden"/>
<then>
<echo level="info">Using already installed plugin because 'project.plugins.override' property is ${project.plugins.override}.</echo>
</then>
<else>
<antcall target="install-plugin">
<param name="plugin.name" value="${plugin.name}"/>
<param name="plugin.version" value="${plugin.version}"/>
<param name="versioned.name" value="@{name}"/>
<param name="plugins.desc.already.fetched" value="true"/>
<param name="proxy.already.set" value="true"/>
</antcall>
</else>
</if>
<antcall target="configure-plugin">
<param name="plugin.name" value="${plugin.name}"/>
<param name="plugin.version" value="${plugin.version}"/>
<param name="versioned.name" value="@{name}"/>
</antcall>
</sequential>
</for>
</target>
</project>