# Licensed to the Apache Software Foundation (ASF) under the terms of ASLv2 (http://www.apache.org/licenses/LICENSE-2.0).

obrHost = getproperty "org.apache.ace.obr"
aceObr = "http://$obrHost/obr/"

# install test bundle with additional Gogo commands needed later on in this script
pwd = (cd) getAbsolutePath

#start 'file:'$pwd'/../org.apache.ace.test/generated/org.apache.ace.test.jar'

# create a workspace
w = (cw [obrlocation=$aceObr])

$w ca 'file:'$pwd'/../cnf/localrepo/org.apache.felix.configadmin/org.apache.felix.configadmin-1.8.8.jar' true
$w ca 'file:'$pwd'/../cnf/localrepo/org.apache.felix.metatype/org.apache.felix.metatype-1.1.2.jar' true
$w ca 'file:'$pwd'/../cnf/localrepo/org.apache.felix.dependencymanager/org.apache.felix.dependencymanager-4.1.1.jar' true
$w ca 'file:'$pwd'/../cnf/localrepo/org.apache.felix.eventadmin/org.apache.felix.eventadmin-1.4.6.jar' true
$w ca 'file:'$pwd'/../cnf/localrepo/org.apache.felix.log/org.apache.felix.log-1.0.1.jar' true

$w ca 'file:'$pwd'/../cnf/localrepo/org.apache.felix.gogo.command/org.apache.felix.gogo.command-0.12.0.jar' true
$w ca 'file:'$pwd'/../cnf/localrepo/org.apache.felix.gogo.runtime/org.apache.felix.gogo.runtime-0.12.0.jar' true
$w ca 'file:'$pwd'/../cnf/localrepo/org.apache.felix.gogo.shell/org.apache.felix.gogo.shell-0.10.0.jar' true
$w ca 'file:'$pwd'/../cnf/localrepo/org.apache.felix.dependencymanager.shell/org.apache.felix.dependencymanager.shell-4.0.2.jar' true


$w ca 'file:'$pwd'/../cnf/localrepo/org.apache.felix.deployment.rp.autoconf/org.apache.felix.deployment.rp.autoconf-0.1.8.jar' true

$w ca 'file:'$pwd'/../cnf/localrepo/org.apache.felix.http.jetty/org.apache.felix.http.jetty-3.1.6.jar' true
$w ca 'file:'$pwd'/../cnf/localrepo/org.apache.felix.http.servlet-api/org.apache.felix.http.servlet-api-1.1.2.jar' true
$w ca 'file:'$pwd'/scripts/felixHttpConf.xml' true

$w cf 'autoconf-deps'
$w ca2f '(Bundle-SymbolicName=org.apache.felix.configadmin)' '(name=autoconf-deps)'
$w ca2f '(Bundle-SymbolicName=org.apache.felix.metatype)' '(name=autoconf-deps)'
$w ca2f '(Bundle-SymbolicName=org.apache.felix.dependencymanager)' '(name=autoconf-deps)'
$w ca2f '(Bundle-SymbolicName=org.apache.felix.eventadmin)' '(name=autoconf-deps)'
$w ca2f '(Bundle-SymbolicName=org.apache.felix.log)' '(name=autoconf-deps)'
$w ca2f '(artifactName=felixHttpConf.xml)' '(name=autoconf-deps)'

$w cf 'shell'
$w ca2f '(Bundle-SymbolicName=org.apache.felix.gogo.command)' '(name=shell)'
$w ca2f '(Bundle-SymbolicName=org.apache.felix.gogo.runtime)' '(name=shell)'
$w ca2f '(Bundle-SymbolicName=org.apache.felix.gogo.shell)' '(name=shell)'
$w ca2f '(Bundle-SymbolicName=org.apache.felix.dependencymanager.shell)' '(name=shell)'

$w cf 'http'
$w ca2f '(Bundle-SymbolicName=org.apache.felix.http.jetty)' '(name=http)'
$w ca2f '(Bundle-SymbolicName=org.apache.felix.http.servlet-api)' '(name=http)'


$w cd 'autoconf-test'


$w cf2d '(name=autoconf-deps)' '(name=autoconf-test)'
$w cf2d '(name=shell)' '(name=autoconf-test)'
$w cf2d '(name=http)' '(name=autoconf-test)'


($w ct [id=target-1] [httpPort="8888"]) setautoapprove true
$w cd2t '(name=autoconf-test)' '(id=target-1)'


# commit and delete the workspace
$w commit
rw $w