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

# Install a complete distribution, the required system tools and libraries,
# runtime dependencies and the Tuscany SCA runtime on Ubuntu Server 12.04.

# Display commands as they are executed
set -x

# First update the system
sudo apt-get update

# Create install directory
u=`id -un`
g=`id -gn`
sudo mkdir -p /opt/tuscany
sudo chown $u /opt/tuscany
sudo chgrp $g /opt/tuscany
cd /opt/tuscany

# Install core dev tools
sudo apt-get -y install curl git-core subversion autoconf pkg-config automake libtool g++ make gdb vim
if [ "$?" != "0" ]; then
    exit $?
fi

# Install the Apache HTTP server dependencies
sudo apt-get -y install libssl-dev libpcre3-dev
if [ "$?" != "0" ]; then
    exit $?
fi

# Install the Memcached dependencies
sudo apt-get -y install libevent-dev
if [ "$?" != "0" ]; then
    exit $?
fi

# Install the SpiderMonkey dependencies
sudo apt-get -y install zip unzip
if [ "$?" != "0" ]; then
    exit $?
fi

# Install the Apache Qpid/C++ dependencies
sudo apt-get -y install libboost-dev libboost-program-options-dev libboost-filesystem-dev uuid-dev
if [ "$?" != "0" ]; then
    exit $?
fi

# Install the Apache Vysper dependencies
sudo apt-get -y install openjdk-6-jdk
if [ "$?" != "0" ]; then
    exit $?
fi

# Install the HTML Tidy dependencies
sudo apt-get -y install cvs
if [ "$?" != "0" ]; then
    exit $?
fi

# Install the PostgreSQL dependencies
sudo apt-get -y install libreadline-dev
if [ "$?" != "0" ]; then
    exit $?
fi

# Install the Apache Thrift dependencies
sudo apt-get -y install bison flex
if [ "$?" != "0" ]; then
    exit $?
fi

# Install the Facebook Scribe dependencies
sudo apt-get -y install gawk
if [ "$?" != "0" ]; then
    exit $?
fi

# Download and install the Tuscany runtime
curl -OL http://people.apache.org/~jsdelfino/tuscany/test/tuscany-sca-cpp-all-1.0.tar.gz
tar xzf tuscany-sca-cpp-all-1.0.tar.gz

