<!--
  ~ 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.
-->
<component-set>
  <components>

    <!--
        A custom artifact handler for javascript archives (jsar).
        This requires the plugin to be configured with <extensions> set to true
        on any project that uses javascript depedencies.
     -->
    <component>
      <role>org.apache.maven.artifact.handler.ArtifactHandler</role>
      <role-hint>javascript</role-hint>
      <implementation>org.apache.maven.artifact.handler.DefaultArtifactHandler</implementation>
      <configuration>
        <type>javascript</type>
        <extension>jar</extension>
        <language>javascript</language>
        <addedToClasspath>false</addedToClasspath>
      </configuration>
    </component>

  <!--
    A custom lifecycle for javascript packaging
    -->
    <component>
      <role>org.apache.maven.lifecycle.mapping.LifecycleMapping</role>
      <role-hint>javascript</role-hint>
      <implementation>org.apache.maven.lifecycle.mapping.DefaultLifecycleMapping</implementation>
      <configuration>
        <lifecycles>
          <lifecycle>
            <id>default</id>
            <phases>
              <process-resources>org.apache.maven.plugins:maven-resources-plugin:resources</process-resources>
              <compile>org.apache.myfaces.buildtools:myfaces-javascript-plugin:compile</compile>
              <process-test-resources>org.apache.maven.plugins:maven-resources-plugin:testResources</process-test-resources>
              <test-compile>org.apache.myfaces.buildtools:myfaces-javascript-plugin:prepare-tests</test-compile>
              <test>org.apache.myfaces.buildtools:myfaces-javascript-plugin:jsunit</test>
              <package>org.apache.myfaces.buildtools:myfaces-javascript-plugin:package</package>
              <install>org.apache.maven.plugins:maven-install-plugin:install</install>
              <deploy>org.apache.maven.plugins:maven-deploy-plugin:deploy</deploy>
            </phases>
          </lifecycle>
        </lifecycles>
      </configuration>
    </component>

    <component>
      <role>org.apache.myfaces.buildtools.maven2.plugin.javascript.jmt.assembler.AssemblerReader</role>
      <role-hint>default</role-hint>
      <implementation>org.apache.myfaces.buildtools.maven2.plugin.javascript.jmt.assembler.DefaultAssemblerReader</implementation>
      <description></description>
    </component>
    <component>
      <role>org.apache.myfaces.buildtools.maven2.plugin.javascript.jmt.assembler.AssemblerReaderManager</role>
      <implementation>org.apache.myfaces.buildtools.maven2.plugin.javascript.jmt.assembler.DefaultAssemblerReaderManager</implementation>
      <description></description>
    </component>
    <component>
      <role>org.apache.myfaces.buildtools.maven2.plugin.javascript.jmt.assembler.AssemblerReader</role>
      <role-hint>jsbuilder</role-hint>
      <implementation>org.apache.myfaces.buildtools.maven2.plugin.javascript.jmt.assembler.JsBuilderAssemblerReader</implementation>
      <description></description>
    </component>
    <component>
      <role>org.apache.myfaces.buildtools.maven2.plugin.javascript.jmt.archive.JavascriptArtifactManager</role>
      <implementation>org.apache.myfaces.buildtools.maven2.plugin.javascript.jmt.archive.JavascriptArtifactManager</implementation>
      <description>A component to handle javascript dependencies.</description>
      <isolated-realm>false</isolated-realm>
      <requirements>
        <requirement>
          <role>org.codehaus.plexus.archiver.UnArchiver</role>
          <role-hint>javascript</role-hint>
          <field-name>archiver</field-name>
        </requirement>
      </requirements>
    </component>
    <component>
      <role>org.codehaus.plexus.archiver.UnArchiver</role>
      <role-hint>javascript</role-hint>
      <implementation>org.apache.myfaces.buildtools.maven2.plugin.javascript.jmt.archive.JavascriptUnArchiver</implementation>
      <description>Custom archiver for javascript dependencies, packaged as &quot;jsar&quot; (JavaScript
ARchive), that are simply a jar of scripts and resources.</description>
      <isolated-realm>false</isolated-realm>
    </component>
    <component>
      <role>org.codehaus.plexus.archiver.Archiver</role>
      <role-hint>javascript</role-hint>
      <implementation>org.apache.myfaces.buildtools.maven2.plugin.javascript.jmt.archive.JavascriptArchiver</implementation>
      <instantiation-strategy>per-lookup</instantiation-strategy>
      <description>Custom archiver for javascript dependencies, packaged as &quot;jsar&quot; (JavaScript
ARchive), that are simply a jar of scripts and resources.</description>
      <isolated-realm>false</isolated-realm>
    </component>    
  </components>
</component-set>
