calatrava 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +9 -0
- data/.rvmrc +2 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +202 -0
- data/Plans.md +20 -0
- data/README.md +73 -0
- data/Rakefile +26 -0
- data/bin/calatrava +6 -0
- data/calatrava.gemspec +35 -0
- data/features/cli.feature +14 -0
- data/features/project.feature +48 -0
- data/features/step_definitions/template_steps.rb +8 -0
- data/features/support/env.rb +5 -0
- data/lib/calatrava/app.rb +30 -0
- data/lib/calatrava/manifest.rb +44 -0
- data/lib/calatrava/project.rb +218 -0
- data/lib/calatrava/resources_build_phase.rb +19 -0
- data/lib/calatrava/tasks/apache.rb +44 -0
- data/lib/calatrava/tasks/artifact.rb +24 -0
- data/lib/calatrava/tasks/assets.rb +6 -0
- data/lib/calatrava/tasks/automation.rb +38 -0
- data/lib/calatrava/tasks/bootstrap.rb +10 -0
- data/lib/calatrava/tasks/build.rb +1 -0
- data/lib/calatrava/tasks/configuration.rb +41 -0
- data/lib/calatrava/tasks/droid.rb +83 -0
- data/lib/calatrava/tasks/haml.rb +71 -0
- data/lib/calatrava/tasks/ios.rb +73 -0
- data/lib/calatrava/tasks/kernel.rb +52 -0
- data/lib/calatrava/tasks/precommit.rb +22 -0
- data/lib/calatrava/tasks/release.rb +17 -0
- data/lib/calatrava/tasks/shell.rb +17 -0
- data/lib/calatrava/tasks/web.rb +82 -0
- data/lib/calatrava/tasks.rb +93 -0
- data/lib/calatrava/template.rb +44 -0
- data/lib/calatrava/templates/.rvmrc.calatrava +2 -0
- data/lib/calatrava/templates/Gemfile.calatrava +4 -0
- data/lib/calatrava/templates/Rakefile +1 -0
- data/lib/calatrava/templates/assets/lib/ICanHaz.js +542 -0
- data/lib/calatrava/templates/assets/lib/underscore.js +1059 -0
- data/lib/calatrava/templates/assets/lib/zepto.js +1355 -0
- data/lib/calatrava/templates/build_env.sh +2 -0
- data/lib/calatrava/templates/config/environments.yml +17 -0
- data/lib/calatrava/templates/config/templates/env.coffee.erb +7 -0
- data/lib/calatrava/templates/config/templates/httpd.conf.erb +33 -0
- data/lib/calatrava/templates/droid/app/bridge.coffee +130 -0
- data/lib/calatrava/templates/droid/calatrava/ant/calatrava.xml +48 -0
- data/lib/calatrava/templates/droid/calatrava/calatrava-build.xml +91 -0
- data/lib/calatrava/templates/droid/calatrava/ivy.xml +8 -0
- data/lib/calatrava/templates/droid/calatrava/ivysettings.xml +12 -0
- data/lib/calatrava/templates/droid/calatrava/src/com/CALATRAVA_TMPL/AndroidManifest.xml.calatrava +20 -0
- data/lib/calatrava/templates/droid/calatrava/src/com/CALATRAVA_TMPL/ConversionForm.java.calatrava +27 -0
- data/lib/calatrava/templates/droid/calatrava/src/com/CALATRAVA_TMPL/Title.java.calatrava +23 -0
- data/lib/calatrava/templates/droid/calatrava/src/com/calatrava/CalatravaPage.java +13 -0
- data/lib/calatrava/templates/droid/calatrava/src/com/calatrava/bridge/AjaxRequestManager.java +166 -0
- data/lib/calatrava/templates/droid/calatrava/src/com/calatrava/bridge/AssetRepository.java +17 -0
- data/lib/calatrava/templates/droid/calatrava/src/com/calatrava/bridge/KernelBridge.java +25 -0
- data/lib/calatrava/templates/droid/calatrava/src/com/calatrava/bridge/Launcher.java +85 -0
- data/lib/calatrava/templates/droid/calatrava/src/com/calatrava/bridge/PageRegistry.java +225 -0
- data/lib/calatrava/templates/droid/calatrava/src/com/calatrava/bridge/RegisteredActivity.java +86 -0
- data/lib/calatrava/templates/droid/calatrava/src/com/calatrava/bridge/RequestLoader.java +31 -0
- data/lib/calatrava/templates/droid/calatrava/src/com/calatrava/bridge/RhinoService.java +212 -0
- data/lib/calatrava/templates/droid/calatrava/src/com/calatrava/shell/WebViewActivity.java +247 -0
- data/lib/calatrava/templates/droid/manifest.yml +1 -0
- data/lib/calatrava/templates/ios/Podfile.calatrava +5 -0
- data/lib/calatrava/templates/ios/manifest.yml +1 -0
- data/lib/calatrava/templates/ios/res/js/bridge.js +249 -0
- data/lib/calatrava/templates/ios/res/xibs/ProgressViewController.xib +334 -0
- data/lib/calatrava/templates/ios/res/xibs/WebViewController.xib +173 -0
- data/lib/calatrava/templates/ios/src/AppDelegate.h +8 -0
- data/lib/calatrava/templates/ios/src/AppDelegate.m +56 -0
- data/lib/calatrava/templates/ios/src/CALATRAVA_TMPL-Info.plist +45 -0
- data/lib/calatrava/templates/ios/src/CALATRAVA_TMPL-Prefix.pch +14 -0
- data/lib/calatrava/templates/ios/src/ConversionFormViewController.h +16 -0
- data/lib/calatrava/templates/ios/src/ConversionFormViewController.m +179 -0
- data/lib/calatrava/templates/ios/src/ConversionFormViewController.xib +357 -0
- data/lib/calatrava/templates/ios/src/en.lproj/InfoPlist.strings +2 -0
- data/lib/calatrava/templates/ios/src/main.m +10 -0
- data/lib/calatrava/templates/ios/test/AJAXConnectionTest.m +21 -0
- data/lib/calatrava/templates/ios/test/AppTests-Prefix.pch +8 -0
- data/lib/calatrava/templates/ios/test/CalatravaiOSTests-Info.plist +22 -0
- data/lib/calatrava/templates/ios/test/TWBridgePageRegistryTest.m +15 -0
- data/lib/calatrava/templates/ios/test/en.lproj/InfoPlist.strings +2 -0
- data/lib/calatrava/templates/kernel/.gitignore +1 -0
- data/lib/calatrava/templates/kernel/app/calatrava.coffee +8 -0
- data/lib/calatrava/templates/kernel/app/converter/controller.converter.coffee +50 -0
- data/lib/calatrava/templates/kernel/app/converter/init.converter.coffee +11 -0
- data/lib/calatrava/templates/kernel/app/pageHelper.coffee +17 -0
- data/lib/calatrava/templates/kernel/features/support/bridge.coffee +124 -0
- data/lib/calatrava/templates/kernel/features/support/spec_helper.js +49 -0
- data/lib/calatrava/templates/kernel/spec/converter/controller.converter.spec.coffee +37 -0
- data/lib/calatrava/templates/kernel/spec/environment.spec_helper.coffee +25 -0
- data/lib/calatrava/templates/kernel/spec/spec_helper.js +49 -0
- data/lib/calatrava/templates/kernel/spec/stubView.coffee +18 -0
- data/lib/calatrava/templates/kernel/watchr.rb +17 -0
- data/lib/calatrava/templates/package.json +20 -0
- data/lib/calatrava/templates/shell/layouts/single_page.haml +23 -0
- data/lib/calatrava/templates/shell/pages/converter/conversionForm.haml +12 -0
- data/lib/calatrava/templates/shell/pages/converter/page.conversionForm.coffee +42 -0
- data/lib/calatrava/templates/shell/shell.scss +1 -0
- data/lib/calatrava/templates/shell/support/shell.coffee +21 -0
- data/lib/calatrava/templates/web/apache/conf/mime.types +1357 -0
- data/lib/calatrava/templates/web/app/source/bridge.coffee +158 -0
- data/lib/calatrava/templates/web/app/source/init.coffee +14 -0
- data/lib/calatrava/templates/web/app/views/index.haml +18 -0
- data/lib/calatrava/templates/web/deploy/instance.sh +10 -0
- data/lib/calatrava/templates/web/manifest.yml +1 -0
- data/lib/calatrava/version.rb +3 -0
- data/lib/calatrava.rb +5 -0
- metadata +302 -0
@@ -0,0 +1,17 @@
|
|
1
|
+
local:
|
2
|
+
api_endpoint : "http://localhost:8081"
|
3
|
+
web_port : 8888
|
4
|
+
|
5
|
+
development:
|
6
|
+
api_endpoint : "http://localhost:8081"
|
7
|
+
web_port : 8888
|
8
|
+
|
9
|
+
test:
|
10
|
+
api_endpoint : "http://localhost:8081"
|
11
|
+
web_port : 8888
|
12
|
+
|
13
|
+
automation:
|
14
|
+
api_endpoint : "http://localhost:8081"
|
15
|
+
web_port : 8889
|
16
|
+
|
17
|
+
production:
|
@@ -0,0 +1,33 @@
|
|
1
|
+
LoadModule ssl_module <%=MODULES_PATH%>/mod_ssl.so
|
2
|
+
LoadModule proxy_module <%=MODULES_PATH%>/mod_proxy.so
|
3
|
+
LoadModule proxy_http_module <%=MODULES_PATH%>/mod_proxy_http.so
|
4
|
+
LoadModule headers_module <%=MODULES_PATH%>/mod_headers.so
|
5
|
+
<% if LOAD_LOG_MODULE %>
|
6
|
+
LoadModule log_config_module <%=MODULES_PATH%>/mod_log_config.so
|
7
|
+
<% end %>
|
8
|
+
LoadModule mime_module <%=MODULES_PATH%>/mod_mime.so
|
9
|
+
LoadModule dir_module <%=MODULES_PATH%>/mod_dir.so
|
10
|
+
LoadModule alias_module <%=MODULES_PATH%>/mod_alias.so
|
11
|
+
|
12
|
+
ErrorLog "logs/error.log"
|
13
|
+
LogLevel Debug
|
14
|
+
|
15
|
+
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\"" combined
|
16
|
+
CustomLog "logs/access.log" combined
|
17
|
+
|
18
|
+
PidFile logs/httpd.pid
|
19
|
+
LockFile logs/run.lock
|
20
|
+
|
21
|
+
TypesConfig conf/mime.types
|
22
|
+
|
23
|
+
Listen <%= configuration['web_port'] %>
|
24
|
+
|
25
|
+
ProxyRequests off
|
26
|
+
|
27
|
+
ProxyPass /api <%= configuration['api_endpoint'] %>/api
|
28
|
+
|
29
|
+
SSLProxyEngine On
|
30
|
+
|
31
|
+
DocumentRoot "public"
|
32
|
+
|
33
|
+
DirectoryIndex index.html
|
@@ -0,0 +1,130 @@
|
|
1
|
+
tw ?= {}
|
2
|
+
tw.bridge = tw.bridge ? {}
|
3
|
+
|
4
|
+
generateRandomString = () ->
|
5
|
+
str = ''
|
6
|
+
for i in [1...32]
|
7
|
+
r = Math.floor(Math.random() * 16)
|
8
|
+
str = str + r.toString(16)
|
9
|
+
str.toUpperCase()
|
10
|
+
|
11
|
+
tw.bridge.dispatchEvent = (page, event) ->
|
12
|
+
extraArgs = _.toArray(arguments).slice(1);
|
13
|
+
tw.bridge.pages.pageNamed(page).dispatch.apply(tw.bridge.pages.pageNamed(page), extraArgs)
|
14
|
+
|
15
|
+
class tw.bridge.Page
|
16
|
+
constructor: (@pageName) ->
|
17
|
+
@handlerRegistry = {}
|
18
|
+
|
19
|
+
bind: (event, handler) ->
|
20
|
+
@handlerRegistry[event] = handler
|
21
|
+
# Register that an event handler has been installed?
|
22
|
+
|
23
|
+
dispatch: (event) ->
|
24
|
+
args = _.toArray(arguments).slice(1)
|
25
|
+
if @handlerRegistry[event]?
|
26
|
+
@handlerRegistry[event].apply(this, args)
|
27
|
+
|
28
|
+
get: (field) ->
|
29
|
+
String(pageRegistry.getValueForField(@pageName, field))
|
30
|
+
|
31
|
+
render: (viewObject) ->
|
32
|
+
viewObject = JSON.stringify(viewObject)
|
33
|
+
pageRegistry.renderPage(@pageName, viewObject)
|
34
|
+
|
35
|
+
|
36
|
+
tw.bridge.changePage = (target) ->
|
37
|
+
pageRegistry.changePage(target)
|
38
|
+
target
|
39
|
+
|
40
|
+
tw.bridge.pages = (() ->
|
41
|
+
pagesByName = {}
|
42
|
+
|
43
|
+
pageNamed: (pageName) ->
|
44
|
+
if (!pagesByName[pageName])
|
45
|
+
pagesByName[pageName] = new tw.bridge.Page(pageName)
|
46
|
+
pagesByName[pageName]
|
47
|
+
)()
|
48
|
+
|
49
|
+
tw.bridge.widgets = (()->
|
50
|
+
callbacks = {}
|
51
|
+
display: (name, options, callback) ->
|
52
|
+
pageRegistry.displayWidget(name, JSON.stringify(options))
|
53
|
+
callbacks[name] = callback
|
54
|
+
|
55
|
+
invokeCallback: (name) ->
|
56
|
+
args = _.toArray(arguments).slice(1)
|
57
|
+
callbacks[name].apply(this, args)
|
58
|
+
)()
|
59
|
+
|
60
|
+
tw.bridge.dialog = (()->
|
61
|
+
display : (name) ->
|
62
|
+
pageRegistry.displayDialog(name)
|
63
|
+
)()
|
64
|
+
|
65
|
+
tw.bridge.request = (reqOptions) ->
|
66
|
+
tw.bridge.requests.issue reqOptions
|
67
|
+
|
68
|
+
tw.bridge.requests = (() ->
|
69
|
+
successHandlers = {}
|
70
|
+
failureHandlers = {}
|
71
|
+
|
72
|
+
issue: (options) ->
|
73
|
+
requestId = generateRandomString()
|
74
|
+
if options.body
|
75
|
+
bodyStr = options.body
|
76
|
+
else
|
77
|
+
bodyStr = ""
|
78
|
+
if (bodyStr.constructor != String)
|
79
|
+
bodyStr = JSON.stringify(body)
|
80
|
+
|
81
|
+
if options.customHeaders
|
82
|
+
headers = JSON.stringify(options.customHeaders)
|
83
|
+
else
|
84
|
+
headers = ""
|
85
|
+
|
86
|
+
successHandlers[requestId] = options.success
|
87
|
+
failureHandlers[requestId] = options.failure
|
88
|
+
ajaxRequestManagerRegistry.makeRequest(requestId,
|
89
|
+
options.url,
|
90
|
+
options.method,
|
91
|
+
bodyStr,
|
92
|
+
headers)
|
93
|
+
|
94
|
+
successfulResponse: (reqId, response) ->
|
95
|
+
successHandlers[reqId](response)
|
96
|
+
@clearHandlers(reqId)
|
97
|
+
|
98
|
+
failureResponse: (reqId, errorCode, response) ->
|
99
|
+
failureHandlers[reqId](errorCode, response)
|
100
|
+
@clearHandlers(reqId)
|
101
|
+
|
102
|
+
clearHandlers: (reqId) ->
|
103
|
+
successHandlers[reqId] = null
|
104
|
+
failureHandlers[reqId] = null
|
105
|
+
)()
|
106
|
+
|
107
|
+
tw.bridge.alert = (message) ->
|
108
|
+
pageRegistry.alert(message)
|
109
|
+
|
110
|
+
tw.bridge.openUrl = (url) ->
|
111
|
+
pageRegistry.openUrl(url)
|
112
|
+
|
113
|
+
tw.bridge.trackEvent = (pageName, channel, eventName, variables, properties) ->
|
114
|
+
pageRegistry.track(pageName, channel, eventName, variables, properties)
|
115
|
+
|
116
|
+
tw.bridge.timers = (() ->
|
117
|
+
callbacks = {}
|
118
|
+
|
119
|
+
start: (timeout, callback) ->
|
120
|
+
timerId = generateRandomString()
|
121
|
+
callbacks[timerId] = callback
|
122
|
+
pageRegistry.startTimer(timeout, timerId)
|
123
|
+
timerId
|
124
|
+
|
125
|
+
fireTimer: (timerId) ->
|
126
|
+
callbacks[timerId]() if callbacks[timerId]
|
127
|
+
|
128
|
+
clearTimer: (timerId) ->
|
129
|
+
delete callbacks[timerId]
|
130
|
+
)()
|
@@ -0,0 +1,48 @@
|
|
1
|
+
<project name="ivy" xmlns:ivy="antlib:org.apache.ivy.ant">
|
2
|
+
|
3
|
+
<!-- here is the version of ivy we will use. change this property to try a newer
|
4
|
+
version if you want -->
|
5
|
+
<property name="ivy.install.version" value="2.3.0-rc1" />
|
6
|
+
<property name="ivy.jar.dir" value="${basedir}/ivy" />
|
7
|
+
<property name="ivy.jar.file" value="${ivy.jar.dir}/ivy.jar" />
|
8
|
+
|
9
|
+
<property name="build.dir" value="build" />
|
10
|
+
<property name="src.dir" value="src" />
|
11
|
+
|
12
|
+
|
13
|
+
<target name="download-ivy" unless="skip.download">
|
14
|
+
<mkdir dir="${ivy.jar.dir}"/>
|
15
|
+
<!-- download Ivy from web site so that it can be used even without any special installation -->
|
16
|
+
<echo message="installing ivy..."/>
|
17
|
+
<get src="http://repo1.maven.org/maven2/org/apache/ivy/ivy/${ivy.install.version}/ivy-${ivy.install.version}.jar"
|
18
|
+
dest="${ivy.jar.file}" usetimestamp="true"/>
|
19
|
+
</target>
|
20
|
+
|
21
|
+
<target name="install-ivy" depends="download-ivy" description="--> install ivy">
|
22
|
+
<path id="ivy.lib.path">
|
23
|
+
<fileset dir="${ivy.jar.dir}" includes="*.jar"/>
|
24
|
+
</path>
|
25
|
+
<taskdef resource="org/apache/ivy/ant/antlib.xml"
|
26
|
+
uri="antlib:org.apache.ivy.ant" classpathref="ivy.lib.path"/>
|
27
|
+
</target>
|
28
|
+
|
29
|
+
<target name="resolve"
|
30
|
+
depends="install-ivy"
|
31
|
+
description="--> retrieve dependencies with ivy">
|
32
|
+
<ivy:configure />
|
33
|
+
<ivy:resolve file="${ivy.dep.file}" conf="${ivy.configurations}" />
|
34
|
+
|
35
|
+
<ivy:report />
|
36
|
+
|
37
|
+
<ivy:retrieve pattern="libs/[artifact]-[revision](-[classifier]).[ext]" conf="${ivy.configurations}" />
|
38
|
+
</target>
|
39
|
+
|
40
|
+
<target name="clean-ivy" description="--> clean the ivy installation">
|
41
|
+
<delete dir="${ivy.jar.dir}"/>
|
42
|
+
</target>
|
43
|
+
|
44
|
+
<target name="clean-cache" depends="install-ivy"
|
45
|
+
description="--> clean the ivy cache">
|
46
|
+
<ivy:cleancache />
|
47
|
+
</target>
|
48
|
+
</project>
|
@@ -0,0 +1,91 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<!-- A standard Android ant build file, with changes to support calatrava.
|
3
|
+
It incorporates ivy to manage dependencies. -->
|
4
|
+
<project name="test" default="help">
|
5
|
+
|
6
|
+
<!-- The local.properties file is created and updated by the 'android' tool.
|
7
|
+
It contains the path to the SDK. It should *NOT* be checked into
|
8
|
+
Version Control Systems. -->
|
9
|
+
<property file="local.properties" />
|
10
|
+
|
11
|
+
<!-- The ant.properties file can be created by you. It is only edited by the
|
12
|
+
'android' tool to add properties to it.
|
13
|
+
This is the place to change some Ant specific build properties.
|
14
|
+
Here are some properties you may want to change/update:
|
15
|
+
|
16
|
+
source.dir
|
17
|
+
The name of the source directory. Default is 'src'.
|
18
|
+
out.dir
|
19
|
+
The name of the output directory. Default is 'bin'.
|
20
|
+
|
21
|
+
For other overridable properties, look at the beginning of the rules
|
22
|
+
files in the SDK, at tools/ant/build.xml
|
23
|
+
|
24
|
+
Properties related to the SDK location or the project target should
|
25
|
+
be updated using the 'android' tool with the 'update' action.
|
26
|
+
|
27
|
+
This file is an integral part of the build system for your
|
28
|
+
application and should be checked into Version Control Systems.
|
29
|
+
|
30
|
+
-->
|
31
|
+
<property file="ant.properties" />
|
32
|
+
|
33
|
+
<!-- The project.properties file is created and updated by the 'android'
|
34
|
+
tool, as well as ADT.
|
35
|
+
|
36
|
+
This contains project specific properties such as project target, and library
|
37
|
+
dependencies. Lower level build properties are stored in ant.properties
|
38
|
+
(or in .classpath for Eclipse projects).
|
39
|
+
|
40
|
+
This file is an integral part of the build system for your
|
41
|
+
application and should be checked into Version Control Systems. -->
|
42
|
+
<loadproperties srcFile="project.properties" />
|
43
|
+
|
44
|
+
<!-- quick check on sdk.dir -->
|
45
|
+
<fail
|
46
|
+
message="sdk.dir is missing. Make sure to generate local.properties using 'android update project' or to inject it through an env var"
|
47
|
+
unless="sdk.dir"
|
48
|
+
/>
|
49
|
+
|
50
|
+
<!-- Load the calatrava additions -->
|
51
|
+
<import file="ant/calatrava.xml" />
|
52
|
+
|
53
|
+
<!-- Calatrava configuration -->
|
54
|
+
<target name="-pre-build" depends="resolve">
|
55
|
+
</target>
|
56
|
+
|
57
|
+
<!-- extension targets. Uncomment the ones where you want to do custom work
|
58
|
+
in between standard targets -->
|
59
|
+
<!--
|
60
|
+
<target name="-pre-compile">
|
61
|
+
</target>
|
62
|
+
|
63
|
+
/* This is typically used for code obfuscation.
|
64
|
+
Compiled code location: ${out.classes.absolute.dir}
|
65
|
+
If this is not done in place, override ${out.dex.input.absolute.dir} */
|
66
|
+
<target name="-post-compile">
|
67
|
+
</target>
|
68
|
+
-->
|
69
|
+
|
70
|
+
<!-- Import the actual build file.
|
71
|
+
|
72
|
+
To customize existing targets, there are two options:
|
73
|
+
- Customize only one target:
|
74
|
+
- copy/paste the target into this file, *before* the
|
75
|
+
<import> task.
|
76
|
+
- customize it to your needs.
|
77
|
+
- Customize the whole content of build.xml
|
78
|
+
- copy/paste the content of the rules files (minus the top node)
|
79
|
+
into this file, replacing the <import> task.
|
80
|
+
- customize to your needs.
|
81
|
+
|
82
|
+
***********************
|
83
|
+
****** IMPORTANT ******
|
84
|
+
***********************
|
85
|
+
In all cases you must update the value of version-tag below to read 'custom' instead of an integer,
|
86
|
+
in order to avoid having your file be overridden by tools such as "android update project"
|
87
|
+
-->
|
88
|
+
<!-- version-tag: 1 -->
|
89
|
+
<import file="${sdk.dir}/tools/ant/build.xml" />
|
90
|
+
|
91
|
+
</project>
|
@@ -0,0 +1,8 @@
|
|
1
|
+
<ivy-module version="2.0">
|
2
|
+
<info organisation="com.example" module="currency-converter" revision="0.1" />
|
3
|
+
<dependencies>
|
4
|
+
<!-- Calatrava dependencies -->
|
5
|
+
<dependency org="org.mozilla" name="rhino" rev="1.7R4" conf="*->*,!sources,!javadoc" />
|
6
|
+
<dependency org="org.codehaus.jackson" name="jackson-mapper-asl" rev="1.9.8"/>
|
7
|
+
</dependencies>
|
8
|
+
</ivy-module>
|
@@ -0,0 +1,12 @@
|
|
1
|
+
<ivysettings>
|
2
|
+
<property name="repo.dir" value="/var/ivy"/>
|
3
|
+
<resolvers>
|
4
|
+
<ibiblio name="maven2" m2compatible="true" />
|
5
|
+
|
6
|
+
<chain name="chained" returnFirst="true">
|
7
|
+
<resolver ref="maven2" />
|
8
|
+
</chain>
|
9
|
+
</resolvers>
|
10
|
+
|
11
|
+
<settings defaultResolver="chained" />
|
12
|
+
</ivysettings>
|
data/lib/calatrava/templates/droid/calatrava/src/com/CALATRAVA_TMPL/AndroidManifest.xml.calatrava
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
<?xml version="1.0" encoding="utf-8"?>
|
2
|
+
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
3
|
+
package="com.{{ project_name }}"
|
4
|
+
android:versionCode="1"
|
5
|
+
android:versionName="1.0">
|
6
|
+
<application android:label="@string/app_name" >
|
7
|
+
<activity android:name="com.{{ project_name }}.{{ project_title }}"
|
8
|
+
android:label="@string/app_name">
|
9
|
+
<intent-filter>
|
10
|
+
<action android:name="android.intent.action.MAIN" />
|
11
|
+
<category android:name="android.intent.category.LAUNCHER" />
|
12
|
+
</intent-filter>
|
13
|
+
</activity>
|
14
|
+
<activity android:name=".ConversionForm"
|
15
|
+
android:label="@string/app_name">
|
16
|
+
</activity>
|
17
|
+
<service android:enabled="true"
|
18
|
+
android:name="com.calatrava.bridge.RhinoService"/>
|
19
|
+
</application>
|
20
|
+
</manifest>
|
data/lib/calatrava/templates/droid/calatrava/src/com/CALATRAVA_TMPL/ConversionForm.java.calatrava
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
package com.{{ project_name }};
|
2
|
+
|
3
|
+
import com.calatrava.CalatravaPage;
|
4
|
+
import com.calatrava.shell.WebViewActivity;
|
5
|
+
|
6
|
+
import java.util.ArrayList;
|
7
|
+
import java.util.Arrays;
|
8
|
+
import java.util.List;
|
9
|
+
|
10
|
+
@CalatravaPage(name = "conversionForm")
|
11
|
+
public class ConversionForm extends WebViewActivity
|
12
|
+
{
|
13
|
+
@Override
|
14
|
+
protected String getPageName() {
|
15
|
+
return "conversionForm";
|
16
|
+
}
|
17
|
+
|
18
|
+
@Override
|
19
|
+
protected List<String> getEvents() {
|
20
|
+
return Arrays.asList("selectedInCurrency", "selectedOutCurrency");
|
21
|
+
}
|
22
|
+
|
23
|
+
@Override
|
24
|
+
protected List<String> getFields() {
|
25
|
+
return new ArrayList<String>();
|
26
|
+
}
|
27
|
+
}
|
@@ -0,0 +1,23 @@
|
|
1
|
+
package com.{{ project_name }};
|
2
|
+
|
3
|
+
import android.app.Activity;
|
4
|
+
import android.os.Bundle;
|
5
|
+
|
6
|
+
import com.calatrava.bridge.Launcher;
|
7
|
+
|
8
|
+
public class {{ project_title }} extends Activity
|
9
|
+
{
|
10
|
+
/** Called when the activity is first created. */
|
11
|
+
@Override
|
12
|
+
public void onCreate(Bundle savedInstanceState)
|
13
|
+
{
|
14
|
+
super.onCreate(savedInstanceState);
|
15
|
+
setContentView(R.layout.main);
|
16
|
+
|
17
|
+
Launcher.launchKernel("com.test", this, getApplication(), new Runnable() {
|
18
|
+
public void run() {
|
19
|
+
Launcher.launchFlow("example.converter.start");
|
20
|
+
}
|
21
|
+
});
|
22
|
+
}
|
23
|
+
}
|
@@ -0,0 +1,13 @@
|
|
1
|
+
package com.calatrava;
|
2
|
+
|
3
|
+
import java.lang.annotation.Target;
|
4
|
+
import java.lang.annotation.ElementType;
|
5
|
+
import java.lang.annotation.Retention;
|
6
|
+
import java.lang.annotation.RetentionPolicy;
|
7
|
+
|
8
|
+
@Target(ElementType.TYPE)
|
9
|
+
@Retention(RetentionPolicy.RUNTIME)
|
10
|
+
public @interface CalatravaPage
|
11
|
+
{
|
12
|
+
String name();
|
13
|
+
}
|
@@ -0,0 +1,166 @@
|
|
1
|
+
package com.calatrava.bridge;
|
2
|
+
|
3
|
+
import android.content.Context;
|
4
|
+
import android.content.Intent;
|
5
|
+
import android.os.AsyncTask;
|
6
|
+
import android.util.Log;
|
7
|
+
import com.calatrava.bridge.RhinoService;
|
8
|
+
import org.apache.http.Header;
|
9
|
+
import org.apache.http.HttpEntity;
|
10
|
+
import org.apache.http.HttpResponse;
|
11
|
+
import org.apache.http.StatusLine;
|
12
|
+
import org.apache.http.client.HttpClient;
|
13
|
+
import org.apache.http.client.methods.HttpGet;
|
14
|
+
import org.apache.http.client.methods.HttpPost;
|
15
|
+
import org.apache.http.client.methods.HttpRequestBase;
|
16
|
+
import org.apache.http.client.methods.HttpUriRequest;
|
17
|
+
import org.apache.http.conn.ConnectTimeoutException;
|
18
|
+
import org.apache.http.entity.StringEntity;
|
19
|
+
import org.apache.http.impl.client.DefaultHttpClient;
|
20
|
+
import org.apache.http.message.BasicHeader;
|
21
|
+
import org.apache.http.params.HttpConnectionParams;
|
22
|
+
import org.json.JSONException;
|
23
|
+
import org.json.JSONObject;
|
24
|
+
|
25
|
+
import java.io.*;
|
26
|
+
import java.net.SocketTimeoutException;
|
27
|
+
import java.util.Iterator;
|
28
|
+
|
29
|
+
public class AjaxRequestManager {
|
30
|
+
|
31
|
+
private static String TAG = AjaxRequestManager.class.getSimpleName();
|
32
|
+
private static AjaxRequestManager sharedManager;
|
33
|
+
private Context context;
|
34
|
+
private RhinoService rhino;
|
35
|
+
|
36
|
+
public AjaxRequestManager(Context context, RhinoService rhino) {
|
37
|
+
this.context = context;
|
38
|
+
this.rhino = rhino;
|
39
|
+
}
|
40
|
+
|
41
|
+
public void makeRequest(String requestId, String url, String method, String body, String customHeaders) {
|
42
|
+
Log.d(TAG, "requestId is :" + requestId);
|
43
|
+
Log.d(TAG, "URL is :" + url);
|
44
|
+
Log.d(TAG, "method :" + method);
|
45
|
+
Log.d(TAG, "body :" + body);
|
46
|
+
Log.d(TAG, "custom headers :" + customHeaders);
|
47
|
+
|
48
|
+
new AjaxRequest().execute(requestId, url, method, body, customHeaders);
|
49
|
+
}
|
50
|
+
|
51
|
+
private HttpRequestBase httpMethod(String url, String method) {
|
52
|
+
return method.equals("post") ? new HttpPost(url) : new HttpGet(url);
|
53
|
+
}
|
54
|
+
|
55
|
+
public static AjaxRequestManager sharedManager() {
|
56
|
+
return sharedManager;
|
57
|
+
}
|
58
|
+
|
59
|
+
public static void setSharedManager(AjaxRequestManager ajaxRequestManager) {
|
60
|
+
Log.d(TAG, "Set shared manager");
|
61
|
+
sharedManager = ajaxRequestManager;
|
62
|
+
}
|
63
|
+
|
64
|
+
class AjaxRequest extends AsyncTask<String, Void, Void> {
|
65
|
+
|
66
|
+
public static final int CONNECTION_TIMEOUT = 5;
|
67
|
+
public static final int SO_TIMEOUT = 60;
|
68
|
+
|
69
|
+
@Override
|
70
|
+
protected Void doInBackground(String... params) {
|
71
|
+
String requestId = params[0];
|
72
|
+
String url = params[1];
|
73
|
+
String method = params[2];
|
74
|
+
String body = params[3];
|
75
|
+
String customHeaders = params[4];
|
76
|
+
try {
|
77
|
+
Log.d(TAG, "About to show loader");
|
78
|
+
context.sendBroadcast(new Intent("com.calatrava.ajax.start"));
|
79
|
+
Log.d(TAG, "Issuing request");
|
80
|
+
HttpClient httpclient = new DefaultHttpClient();
|
81
|
+
HttpResponse response;
|
82
|
+
HttpUriRequest request;
|
83
|
+
|
84
|
+
if(method.equals("GET")) {
|
85
|
+
request = new HttpGet(url);
|
86
|
+
} else {
|
87
|
+
HttpPost httpPost = new HttpPost(url);
|
88
|
+
httpPost.setEntity(new StringEntity(body));
|
89
|
+
httpPost.setHeaders(addHeaders(customHeaders));
|
90
|
+
request = httpPost;
|
91
|
+
}
|
92
|
+
|
93
|
+
HttpConnectionParams.setConnectionTimeout(httpclient.getParams(), CONNECTION_TIMEOUT * 1000);
|
94
|
+
HttpConnectionParams.setSoTimeout(httpclient.getParams(), SO_TIMEOUT * 1000);
|
95
|
+
response = httpclient.execute(request);
|
96
|
+
|
97
|
+
StatusLine statusLine = response.getStatusLine();
|
98
|
+
String responseBody = readResponseBody(response);
|
99
|
+
Log.d(TAG, "Response is :" + statusLine.getStatusCode());
|
100
|
+
Log.d(TAG, "Response is :" + responseBody);
|
101
|
+
if (statusLine.getStatusCode() < 300) {
|
102
|
+
Log.d(TAG, "Invoke success callback");
|
103
|
+
rhino.invokeSuccessCallback(requestId, responseBody);
|
104
|
+
} else {
|
105
|
+
Log.d(TAG, "Invoke failure callback");
|
106
|
+
rhino.invokeFailureCallback(requestId, statusLine.getStatusCode(), responseBody);
|
107
|
+
}
|
108
|
+
} catch (UnsupportedEncodingException e) {
|
109
|
+
Log.d(TAG, "Unable to construct an entity.", e);
|
110
|
+
} catch (IOException e) {
|
111
|
+
Log.d(TAG, "Request threw exception", e);
|
112
|
+
Log.d(TAG, "requestId: " + requestId);
|
113
|
+
rhino.invokeFailureCallback(requestId, 500, "IOException");
|
114
|
+
} finally {
|
115
|
+
Log.d(TAG, "About to hide loader");
|
116
|
+
context.sendBroadcast(new Intent("com.calatrava.ajax.finish"));
|
117
|
+
}
|
118
|
+
return null;
|
119
|
+
}
|
120
|
+
|
121
|
+
private Header[] addHeaders(String customHeaders) {
|
122
|
+
Header[] headers = null;
|
123
|
+
try {
|
124
|
+
if (customHeaders != null && customHeaders.trim() != "") {
|
125
|
+
JSONObject jsonCustomHeaders = new JSONObject(customHeaders);
|
126
|
+
headers = new Header[jsonCustomHeaders.length()];
|
127
|
+
Iterator<String> keys = jsonCustomHeaders.keys();
|
128
|
+
int cnt = 0;
|
129
|
+
while (keys.hasNext()) {
|
130
|
+
|
131
|
+
String headerKey = keys.next();
|
132
|
+
String headerVal = jsonCustomHeaders.getString(headerKey);
|
133
|
+
headers[cnt] = new BasicHeader(headerKey, headerVal);
|
134
|
+
cnt++;
|
135
|
+
}
|
136
|
+
}
|
137
|
+
} catch (JSONException e) {
|
138
|
+
}
|
139
|
+
if (headers != null) {
|
140
|
+
Log.d(TAG, "Headers are: " + headers);
|
141
|
+
for (Header header : headers) {
|
142
|
+
Log.d(TAG, header.getName() + ":" + header.getValue());
|
143
|
+
}
|
144
|
+
}
|
145
|
+
return headers;
|
146
|
+
}
|
147
|
+
|
148
|
+
private String readResponseBody(HttpResponse response) {
|
149
|
+
StringBuilder builder = new StringBuilder();
|
150
|
+
try {
|
151
|
+
HttpEntity entity = response.getEntity();
|
152
|
+
InputStream content = entity.getContent();
|
153
|
+
BufferedReader reader = new BufferedReader(new InputStreamReader(content), 1024);
|
154
|
+
String line;
|
155
|
+
while ((line = reader.readLine()) != null) {
|
156
|
+
builder.append(line);
|
157
|
+
}
|
158
|
+
|
159
|
+
} catch (Exception e) {
|
160
|
+
Log.d(TAG, "Error ");
|
161
|
+
e.printStackTrace();
|
162
|
+
}
|
163
|
+
return builder.toString();
|
164
|
+
}
|
165
|
+
}
|
166
|
+
}
|
@@ -0,0 +1,17 @@
|
|
1
|
+
package com.calatrava.bridge;
|
2
|
+
|
3
|
+
import android.content.Context;
|
4
|
+
|
5
|
+
import java.io.*;
|
6
|
+
|
7
|
+
public class AssetRepository {
|
8
|
+
private Context appContext;
|
9
|
+
|
10
|
+
public AssetRepository(Context appContext) {
|
11
|
+
this.appContext = appContext;
|
12
|
+
}
|
13
|
+
|
14
|
+
public Reader assetReader(String path) throws IOException {
|
15
|
+
return new BufferedReader(new InputStreamReader(appContext.getAssets().open(path)), 8192);
|
16
|
+
}
|
17
|
+
}
|
@@ -0,0 +1,25 @@
|
|
1
|
+
package com.calatrava.bridge;
|
2
|
+
|
3
|
+
import java.io.IOException;
|
4
|
+
|
5
|
+
public class KernelBridge {
|
6
|
+
|
7
|
+
private AssetRepository assetRepository;
|
8
|
+
private RhinoService rhinoService;
|
9
|
+
|
10
|
+
public KernelBridge(AssetRepository assetRepository, RhinoService rhinoService) throws IOException {
|
11
|
+
this.assetRepository = assetRepository;
|
12
|
+
this.rhinoService = rhinoService;
|
13
|
+
|
14
|
+
//load js libraries
|
15
|
+
loadLibrary("hybrid/scripts/underscore.js");
|
16
|
+
|
17
|
+
//load bridge
|
18
|
+
loadLibrary("hybrid/scripts/env.js");
|
19
|
+
loadLibrary("hybrid/scripts/bridge.js");
|
20
|
+
}
|
21
|
+
|
22
|
+
public void loadLibrary(String libraryName) throws IOException {
|
23
|
+
rhinoService.load(assetRepository.assetReader(libraryName), libraryName);
|
24
|
+
}
|
25
|
+
}
|