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

title: Download
in_menu: true
sort_info: 5
--- name:overview

# ${project_name}
Download it today!
--- name:head pipeline:jade
:javascript
  $(function(){
    $("body").find(".accordion").click(function() {
      $(this).next().toggle("slow");
      $(this).toggleClass("accordion-opened");
      return false;
    }).each(function(){
      $(this).toggleClass("accordion-opened", !$(this).next().is(":visible") && !$(this).next().is(".hide"))
    });
  });

:css
  .download {
    font-size: 80%;
  }
  table.download { width: 100%;}
  table.download tr td {
    border: 1px solid #ccc;
    padding: .5em;
  }
--- name:content pipeline:jade

:&markdown
  ## Get the latest official version

- for( version <- project_versions.headOption )
  :&markdown
    ### #{project_name} #{version}
    [Release Notes](blog/releases/release-#{version}.html) | [Installation Instructions](${website_base_url}/versions/#{version}/website/documentation/getting-started.html) | [Documentation](${website_base_url}/versions/#{version}/website/documentation/index.html)

  table.download
    tr
      td Binaries for Unix/Linux/OS X:
      td
        a(href="http://www.apache.org/dyn/closer.cgi?path=activemq/activemq-openwire/#{version}/apache-openwire-protocol-#{version}-unix-distro.tar.gz") apache-openwire-protocol-#{version}-unix-distro.tar.gz
      td
        a(href="http://apache.org/dist/activemq/activemq-openwire/#{version}/apache-openwire-protocol-#{version}-unix-distro.tar.gz.asc") GPG Signature
    tr
      td Binaries for Windows:
      td
        a(href="http://www.apache.org/dyn/closer.cgi?path=activemq/activemq-openwire/#{version}/apache-openwire-protocol-#{version}-windows-distro.zip") apache-openwire-protocol-#{version}-windows-distro.zip
      td
        a(href="http://apache.org/dist/activemq/activemq-openwire/#{version}/apache-openwire-protocol-#{version}-windows-distro.zip.asc") GPG Signature
    tr
      td  Source Code Distribution:
      td
        a(href="http://www.apache.org/dyn/closer.cgi?path=activemq/activemq-openwire/#{version}/apache-openwire-protocol-#{version}-source-release.tar.gz") apache-openwire-protocol-#{version}-source-release.tar.gz
      td
        a(href="http://apache.org/dist/activemq/activemq-openwire/#{version}/apache-openwire-protocol-#{version}-source-release.tar.gz.asc") GPG Signature

  - if( !project_versions.drop(1).isEmpty )
    div.accordion(style="padding-top:1em;")
      a(href="#") Show older versions...
    div.hide
      - for( version <- project_versions.drop(1) )
        - version
        h3.accordion
          a(href="#") #{project_name} #{version}
        div.hide
          :&markdown
            [Release Notes](blog/releases/release-#{version}.html) | [Installation Instructions](${website_base_url}/versions/#{version}/website/documentation/getting-started.html) | [Documentation](${website_base_url}/versions/#{version}/website/documentation/index.html)
          table.download
            tr
              td Binaries for Unix/Linux/OS X:
              td
                a(href="http://archive.apache.org/dist/activemq/activemq-openwire/#{version}/apache-openwire-protocol-#{version}-unix-distro.tar.gz") apache-openwire-protocol-#{version}-unix-distro.tar.gz
              td
                a(href="http://archive.apache.org/dist/activemq/activemq-openwire/#{version}/apache-openwire-protocol-#{version}-unix-distro.tar.gz.asc") GPG Signature
            tr
              td Binaries for Windows:
              td
                a(href="http://archive.apache.org/dist/activemq/activemq-openwire/#{version}/apache-openwire-protocol-#{version}-windows-distro.zip") apache-openwire-protocol-#{version}-windows-distro.zip
              td
                a(href="http://archive.apache.org/dist/activemq/activemq-openwire/#{version}/apache-openwire-protocol-#{version}-windows-distro.zip.asc") GPG Signature
            tr
              td  Source Code Distribution:
              td
                a(href="http://archive.apache.org/dist/activemq/activemq-openwire/#{version}/apache-openwire-protocol-#{version}-source-release.tar.gz") apache-openwire-protocol-#{version}-source-release.tar.gz
              td
                a(href="http://archive.apache.org/dist/activemq/activemq-openwire/#{version}/apache-openwire-protocol-#{version}-source-release.tar.gz.asc") GPG Signature


:&markdown

  ## Development Snapshot

  Want to help stablize the latest and greatest nightly development
  build?  **Warnning**: These builds are extremely bleeding edge!

  These development builds are automatically tested and deployed by a Jenkins CI server:

    * [Checkin Build and Test Results](https://builds.apache.org/job/ActiveMQ-OpenWire/)
    * [Nightly SNAPSHOT deployment Results](https://builds.apache.org/job/ActiveMQ-OpenWire-Deploy/)

  ### #{project_name} #{project_snapshot_version}
  [Installation Instructions](${website_base_url}/versions/#{project_snapshot_version}/website/documentation/getting-started.html) | [Documentation](${website_base_url}/versions/#{project_snapshot_version}/website/documentation/index.html)

table.download
  tr
    td Binaries for Unix/Linux/OS X:
    td
      a(href="http://repository.apache.org/service/local/artifact/maven/redirect?r=snapshots&g=org.apache.activemq&a=openwire-project&v=#{project_snapshot_version}&e=tar.gz&c=unix-distro") openwire-project-#{project_snapshot_version}-unix-distro.tar.gz
  tr
    td Binaries for Windows:
    td
      a(href="https://repository.apache.org/service/local/artifact/maven/redirect?r=snapshots&g=org.apache.activemq&a=openwire-project&v=#{project_snapshot_version}&e=zip&c=windows-distro") openwire-project-#{project_snapshot_version}-windows-distro.zip

:&markdown
  The development build source code should be directly checked out from our [source code repository](community/source.html)
