astroboa-cli 0.3.1 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +17 -16
- data/lib/astroboa-cli/command/model.rb +267 -19
- data/lib/astroboa-cli/command/repository.rb +4 -19
- data/lib/astroboa-cli/command/server.rb +1 -1
- data/lib/astroboa-cli/command/service.rb +6 -2
- data/lib/astroboa-cli/util.rb +29 -7
- data/lib/astroboa-cli/version.rb +1 -1
- metadata +2 -2
data/README.md
CHANGED
@@ -96,15 +96,16 @@ On **Mac OS X** to install `rbenv` and `ruby-build` using the [Homebrew](http:/
|
|
96
96
|
$ brew update
|
97
97
|
$ brew install rbenv
|
98
98
|
$ brew install ruby-build
|
99
|
-
|
100
|
-
Then add the following line in your .bash_profile:
|
101
99
|
$ echo 'if which rbenv > /dev/null; then eval "$(rbenv init -)"; fi' >> ~/.bash_profile
|
102
100
|
|
101
|
+
The last command adds to your .bash_profile the code that initializes rbenv
|
102
|
+
|
103
|
+
|
103
104
|
|
104
105
|
---
|
105
106
|
On **Ubuntu Linux** to install `rbenv` and `ruby-build` using `apt` package manager and `git` do (it has been tested in Ubuntu 12.04):
|
106
107
|
|
107
|
-
$ sudo apt-get install zlib1g-dev openssl libopenssl-ruby1.9.1 libssl-dev libruby1.9.1 libreadline-dev git-core
|
108
|
+
$ sudo apt-get install build-essential zlib1g-dev openssl libopenssl-ruby1.9.1 libssl-dev libruby1.9.1 libreadline-dev git-core
|
108
109
|
$ cd
|
109
110
|
$ git clone git://github.com/sstephenson/rbenv.git .rbenv
|
110
111
|
|
@@ -139,9 +140,9 @@ Restart your shell to apply the changes in your bashrc or bash_profile
|
|
139
140
|
|
140
141
|
$ exec $SHELL
|
141
142
|
|
142
|
-
To install ruby version 1.9.3-
|
143
|
+
To install ruby version 1.9.3-p286 do:
|
143
144
|
|
144
|
-
$ rbenv install 1.9.3-
|
145
|
+
$ rbenv install 1.9.3-p286
|
145
146
|
$ rbenv rehash
|
146
147
|
|
147
148
|
|
@@ -149,22 +150,22 @@ To install ruby version 1.9.3-p194 do:
|
|
149
150
|
|
150
151
|
To set the global version of Ruby to be used in all your shells do:
|
151
152
|
|
152
|
-
$ rbenv global 1.9.3-
|
153
|
+
$ rbenv global 1.9.3-p286
|
153
154
|
|
154
|
-
To set ruby 1.9.3-
|
155
|
+
To set ruby 1.9.3-p286 as a local per-project ruby version by writing the version name to an .rbenv-version file in the current project directory do:
|
155
156
|
|
156
|
-
$ rbenv local 1.9.3-
|
157
|
+
$ rbenv local 1.9.3-p286
|
157
158
|
|
158
|
-
To set ruby 1.9.3-
|
159
|
+
To set ruby 1.9.3-p286 as the version to be used only in the current shell (sets the RBENV_VERSION environment variable in your shell) do:
|
159
160
|
|
160
|
-
$ rbenv shell 1.9.3-
|
161
|
+
$ rbenv shell 1.9.3-p286
|
161
162
|
|
162
163
|
Test your ruby installation:
|
163
164
|
|
164
|
-
$ rbenv global 1.9.3-
|
165
|
+
$ rbenv global 1.9.3-p286
|
165
166
|
$ ruby -v
|
166
167
|
|
167
|
-
On MAC you will get output similar to this: ruby 1.9.
|
168
|
+
On MAC you will get output similar to this: ruby 1.9.3p286 (2012-04-20 revision 35410) [x86_64-darwin12.0.0]
|
168
169
|
|
169
170
|
For more information about `rbenv`, `ruby-build` and `rbenv-sudo` check https://github.com/sstephenson/rbenv, https://github.com/sstephenson/ruby-build and https://github.com/dcarley/rbenv-sudo
|
170
171
|
|
@@ -178,12 +179,12 @@ If you prefer to use 'rvm' as your ruby management utility use the following com
|
|
178
179
|
For multi-user installation and detailed rvm installation instructions check: https://rvm.io/rvm/install/
|
179
180
|
To use `sudo` to run astroboa-cli (and any other ruby-based program) you should use `rvmsudo`
|
180
181
|
|
181
|
-
After 'rvm' has been installed run the following commands to install ruby 1.9.3-
|
182
|
+
After 'rvm' has been installed run the following commands to install ruby 1.9.3-p286:
|
182
183
|
|
183
|
-
$ rvm install 1.9.3-
|
184
|
-
$ rvm use 1.9.3-
|
184
|
+
$ rvm install 1.9.3-p286
|
185
|
+
$ rvm use 1.9.3-p286
|
185
186
|
|
186
|
-
run: `$ rvm use 1.9.3-
|
187
|
+
run: `$ rvm use 1.9.3-p286 --default` to make 1.9.3-p286 your default ruby
|
187
188
|
|
188
189
|
# LICENSE
|
189
190
|
-------
|
@@ -26,19 +26,31 @@ require 'fileutils'
|
|
26
26
|
#
|
27
27
|
class AstroboaCLI::Command::Model < AstroboaCLI::Command::Base
|
28
28
|
|
29
|
-
# model:associate REPOSITORY
|
29
|
+
# model:associate REPOSITORY [MODELS_DIR]
|
30
30
|
#
|
31
31
|
# This command allows you to associate a repository with a domain model.
|
32
32
|
# After the association is done your repository can store entities that follow the domain model.
|
33
33
|
#
|
34
|
-
# It is recommended to use this command
|
35
|
-
#
|
36
|
-
#
|
37
|
-
#
|
34
|
+
# It is recommended to use this command either to bootstrap new repositories with a domain model
|
35
|
+
# or use it with CAUTION to update the domain model of an existing repository.
|
36
|
+
# It is SAFE to use it for domain model updates ONLY WHEN YOU ADD new object types or add new properties to existing types.
|
37
|
+
# This command does not cope with model updates that change existing object type names or change existing property names,
|
38
|
+
# property types and property value cardinality. I you do such updates and use this command, it may render your data inaccessible.
|
39
|
+
# In any case it will not delete any existing data so you can instantly recover your data visibility if you put back your old model.
|
38
40
|
#
|
39
|
-
#
|
40
|
-
#
|
41
|
-
#
|
41
|
+
# The command can be used both when the server is stoppped as well as when the server is up.
|
42
|
+
# So you can do LIVE UPDATES to your schema but be warned that a schema change
|
43
|
+
# will cause a few seconds performace decrease on a live system.
|
44
|
+
#
|
45
|
+
# If in some case you need to change existing object type names or change existing property names, property types
|
46
|
+
# and property value cardinality in your domain model then use 'astroboa-cli model:propagate_updates'
|
47
|
+
# in order to propagate the changes to a repository. This might require to alter data
|
48
|
+
# in the repository as opposed to 'model:associate' that never touches the stored data and
|
49
|
+
# so it should be used ONLY if you ADD new features to your model.
|
50
|
+
#
|
51
|
+
# If you specify the 'MODELS_DIR' (i.e. where your models are stored) then your DSL model definition is expected to be
|
52
|
+
# in 'MODELS_DIR/dsl' and your XML Schemas to be in 'MODELS_DIR/xsd'
|
53
|
+
# If you do not specify the 'MODELS_DIR' then the domain model is expected to be found inside the current directory in 'models/dsl' and 'models/xsd'
|
42
54
|
#
|
43
55
|
def associate
|
44
56
|
|
@@ -52,26 +64,26 @@ class AstroboaCLI::Command::Model < AstroboaCLI::Command::Base
|
|
52
64
|
|
53
65
|
error "Repository '#{repository}' does not exist or it is not properly configured (use astroboa-cli repository:list to see available repositories)" unless repository?(server_configuration, repository)
|
54
66
|
|
55
|
-
if
|
56
|
-
|
67
|
+
if models_dir = args.shift
|
68
|
+
models_dir = models_dir.strip
|
57
69
|
else
|
58
|
-
|
70
|
+
models_dir = File.join(Dir.getwd, 'models')
|
59
71
|
end
|
60
72
|
|
61
|
-
error <<-MSG unless Dir.exists?
|
62
|
-
Directory #{
|
63
|
-
If you specify the '
|
64
|
-
in '
|
65
|
-
If you do not specify the '
|
73
|
+
error <<-MSG unless Dir.exists? models_dir
|
74
|
+
Directory #{models_dir} does not exist.
|
75
|
+
If you specify the 'MODELS_DIR' then your DSL model definition is expected to be
|
76
|
+
in 'MODELS_DIR/dsl' and your XML Schemas to be in 'MODELS_DIR/xsd'
|
77
|
+
If you do not specify the 'MODELS_DIR' then domain model is expected to be found inside current directory in 'models/dsl' and 'models/xsd'
|
66
78
|
MSG
|
67
79
|
|
68
80
|
astroboa_dir = server_configuration['install_dir']
|
69
81
|
|
70
82
|
display "Looking for XML Schemas..."
|
71
|
-
xsd_dir = File.join
|
72
|
-
|
83
|
+
xsd_dir = File.join models_dir, 'xsd'
|
84
|
+
models_contain_xsds = Dir.exists?(xsd_dir) && Dir.entries(xsd_dir) != [".", ".."]
|
73
85
|
|
74
|
-
if
|
86
|
+
if models_contain_xsds
|
75
87
|
display "Found XML Schemas in '#{xsd_dir}'"
|
76
88
|
display "Validating XML Schemas..."
|
77
89
|
|
@@ -131,8 +143,244 @@ class AstroboaCLI::Command::Model < AstroboaCLI::Command::Base
|
|
131
143
|
|
132
144
|
end
|
133
145
|
|
146
|
+
# model:create_object_type NAME
|
147
|
+
#
|
148
|
+
# Creates a new object type. The name of the new object type (the class name in programming terms) will be NAME
|
149
|
+
#
|
150
|
+
# It will create a new XML Schema and will add the required definitions (namespaces, imports, xml tags) for the new object type.
|
151
|
+
# The generated file will be named '{NAME}.xsd'
|
152
|
+
# If you do not specify a namespace for your new object type (using --namespace) then the namespace 'http://astroboa/schema/{NAME}' will be used by default
|
153
|
+
#
|
154
|
+
# If you specify the 'MODELS_DIR' (i.e. where your models are stored) then the XML Schema file will be written inside '{MODELS_DIR}/xsd/' ('{MODELS_DIR}/xsd' will be created if it does not exist)
|
155
|
+
# If you do not specify the 'MODELS_DIR' then the XML Schema file will be written in 'models/xsd/' inside the current directory ('./models/xsd' will be created if it does not exist).
|
156
|
+
#
|
157
|
+
# The created object type will not have any properties. Use the 'model:add_property' command to add properties to your new type.
|
158
|
+
#
|
159
|
+
# NOTE: If you are creating XML Schema files manually besides using this command please follow the same convension
|
160
|
+
# that this command follows, that is to keep each object type in a separate file and name your file after the name of the type.
|
161
|
+
#
|
162
|
+
# -d, --models_dir MODELS_DIR # The directory (absolute path) where your models are stored. # The generated XML Schema file will be written inside '{MODELS_DIR}/xsd/' # If directory {MODELS_DIR}/xsd does not exist, it will be created.
|
163
|
+
# -n, --namespace NAMESPACE # The namespace to be used for your new object type # (i.e. the corresponding entity tag will be namespaced with the provided namespace) # If not specified, the default namespace 'http://astroboa/schema/{NAME}' will be used (NAME is the name of your object type).
|
164
|
+
# -l, --localized_labels OBJECT_TYPE_LABELS # Provide friendly object type names for different languages # By default the 'NAME' of the object type will be used as the english label # Example: -l en:Movie,fr:Film,es:Filme
|
165
|
+
#
|
166
|
+
def create_object_type
|
167
|
+
if object_type = args.shift
|
168
|
+
object_type = object_type.strip
|
169
|
+
else
|
170
|
+
error "Please specify a name for your new object type. Usage: model:create_object_type NAME"
|
171
|
+
end
|
172
|
+
|
173
|
+
namespace = options[:namespace] ||= "http://astroboa/schema/#{object_type}"
|
174
|
+
models_dir = options[:models_dir] ||= File.join(Dir.getwd, 'models')
|
175
|
+
localized_labels = options[:localized_labels] ||= "en:#{object_type}"
|
176
|
+
localized_labels_map = {}
|
177
|
+
localized_labels.split(',').each {|loc_lab| loc_lab_array = loc_lab.split(':'); localized_labels_map[loc_lab_array[0]] = loc_lab_array[1]}
|
178
|
+
|
179
|
+
xsd_dir = File.join models_dir, 'xsd'
|
180
|
+
|
181
|
+
unless Dir.exists? xsd_dir
|
182
|
+
FileUtils.mkdir_p xsd_dir
|
183
|
+
end
|
184
|
+
|
185
|
+
schema_file = File.join xsd_dir, "#{object_type}.xsd"
|
186
|
+
|
187
|
+
error <<-MSG if File.exists? schema_file
|
188
|
+
XML Schema file '#{schema_file}' exists.
|
189
|
+
This means that you have already defined a type named '#{object_type}' (the command creates each object type
|
190
|
+
in a different schema file named after the object type name).
|
191
|
+
There is also the possibility that you have manually created the file '#{schema_file}'.
|
192
|
+
If you are creating XML Schema files manually please follow the convension
|
193
|
+
to keep each object type in a separate file and name your file after the name of the type.
|
194
|
+
MSG
|
195
|
+
|
196
|
+
# TODO: Extra check all other schemas to verify that user has not manually add this type
|
197
|
+
|
198
|
+
server_configuration = get_server_configuration
|
199
|
+
astroboa_dir = server_configuration['install_dir']
|
200
|
+
|
201
|
+
object_type_template = File.join(astroboa_dir, 'astroboa-setup-templates', 'object_type_template.xsd')
|
202
|
+
context = {namespace: namespace, object_type: object_type, localized_labels_map: localized_labels_map}
|
203
|
+
render_template_to_file(object_type_template, context, schema_file)
|
204
|
+
|
205
|
+
display "Generate schema file '#{schema_file}' for new object type '#{object_type}': OK"
|
206
|
+
display "You can now use 'model:add_property' to add properties to your new object type."
|
207
|
+
display "When you finish adding properties to your type use 'model:associate' to associate a repository with your new object type and start creating object instances of this type"
|
208
|
+
end
|
209
|
+
|
210
|
+
|
211
|
+
# model:add_property PROPERTY_NAME OBJECT_TYPE
|
212
|
+
#
|
213
|
+
# Adds a new property with name 'PROPERTY_NAME' to 'OBJECT_TYPE'. If '--update' is specified it updates an existing property
|
214
|
+
#
|
215
|
+
# If you specify the 'MODELS_DIR' (i.e. where your models are stored) then the XML Schema that contains the object type definition
|
216
|
+
# is expected to be found in '{MODELS_DIR}/xsd/{OBJECT_TYPE}.xsd'
|
217
|
+
# If you do not specify the 'MODELS_DIR' then the XML Schema that contains the object type definition is expected to be found inside the current directory in 'models/xsd/{OBJECT_TYPE}.xsd'
|
218
|
+
#
|
219
|
+
# -d, --models_dir MODELS_DIR # The directory (absolute path) where your models are stored. # Default is './models' # The XML Schema file that contains the object type definition is expected to be found in '{MODELS_DIR}/xsd/{OBJECT_TYPE}.xsd'
|
220
|
+
# -t, --type TYPE # The property type. # Accepted types are: string,integer,double,boolean,date,dateTime,binary,topic_ref,object_ref,complex,[USER_DEFINED_TYPE]. Default type is 'string'.
|
221
|
+
# -x, --max_values MAX_NUM_OF_VALUES # The maximum number of values that are permitted for this property. # Specify '1' if you want to store only one value. # Specify 'unbounded' if you want to store a list of values without an upper limit in list size. # Default is '1'.
|
222
|
+
# -n, --min_values MIN_NUM_VALUES # The minimum number of values that are permitted for this property. # Specify '0' to designate a non mandatory field. # Specify '1' to designate a mandatory field. # Default is '0'.
|
223
|
+
# -p, --parent PROPERTY_NAME # The name of an EXISTING property that will contain this property. # The parent property should always be of type 'complex'. # Properties of type 'complex' act as a grouping container for their child properties. # Imagine them as named fieldsets of a form # E.g. The 'complex' property 'address' is the parent (container) of the properties 'street', 'city', 'zipcode', 'country'. # You may arbitrarily nest 'complex' properties inside other 'complex' properties to create property trees.
|
224
|
+
# -l, --localized_labels PROPERTY_NAME_LABELS # Provide friendly names for the property in different languages # By default the 'PROPERTY_NAME' will be used as the english label # Example: -l en:First Name,fr:Prénom,es:Primer Nombre
|
225
|
+
# -u, --update # Use this option to specify whether you want to update an EXISTING property. # If the property with 'PROPERTY_NAME' exists and you do not use this option then NO UPDATE will be performed. # The default values for property attributes are not used during a property update. # ONLY the property attributes that are expicitly specified with the options will be updated. # E.g. if you give 'astroboa-cli model:add_property age person -t integer --update' # and the property 'age' exists then only its 'type' will be changed. # The 'minValues', 'maxValues', 'localized_labels' will keep their existing values.
|
226
|
+
#
|
227
|
+
def add_property
|
228
|
+
if property_name = args.shift
|
229
|
+
property_name = property_name.strip
|
230
|
+
else
|
231
|
+
error "Please specify a name for the property. Usage: model:add_property PROPERTY_NAME OBJECT_TYPE"
|
232
|
+
end
|
233
|
+
|
234
|
+
if object_type = args.shift
|
235
|
+
object_type = object_type.strip
|
236
|
+
else
|
237
|
+
error "Please specify the object type for which you want to add / update a property. Usage: model:add_property PROPERTY_NAME OBJECT_TYPE"
|
238
|
+
end
|
239
|
+
|
240
|
+
models_dir = options[:models_dir] ||= File.join(Dir.getwd, 'models')
|
241
|
+
xsd_dir = File.join models_dir, 'xsd'
|
242
|
+
schema_file = File.join xsd_dir, "#{object_type}.xsd"
|
243
|
+
|
244
|
+
error <<-MSG unless File.exists? schema_file
|
245
|
+
XML Schema file #{schema_file} does not exist.
|
246
|
+
The XML Schema that contains the object type definition
|
247
|
+
is expected to be found in 'MODELS_DIR/xsd/OBJECT_TYPE.xsd'
|
248
|
+
If you do not specify the MODELS_DIR with '--models_dir MODELS_DIR'
|
249
|
+
the default is './models'
|
250
|
+
MSG
|
251
|
+
|
252
|
+
localized_labels = options[:localized_labels] ||= "en:#{property_name}"
|
253
|
+
localized_labels_map = {}
|
254
|
+
localized_labels.split(',').each {|loc_lab| loc_lab_array = loc_lab.split(':'); localized_labels_map[loc_lab_array[0]] = loc_lab_array[1]}
|
255
|
+
|
256
|
+
type_specified = options.has_key? :type
|
257
|
+
max_values_specified = options.has_key? :max_values
|
258
|
+
min_values_specified = options.has_key? :min_values
|
259
|
+
parent_specified = options.has_key? :parent
|
260
|
+
type = options[:type] ||= 'string'
|
261
|
+
max_values = options[:max_values] ||= '1'
|
262
|
+
min_values = options[:min_values] ||= '0'
|
263
|
+
parent = options[:parent]
|
264
|
+
|
265
|
+
schema = nil
|
266
|
+
File.open(schema_file, 'r') do |f|
|
267
|
+
schema = Nokogiri::XML(f) do |config|
|
268
|
+
config.noblanks
|
269
|
+
end
|
270
|
+
end
|
271
|
+
|
272
|
+
|
273
|
+
# find if specified property is already defined
|
274
|
+
property_node_set = schema.xpath "//xs:element[@name='#{property_name}']"
|
275
|
+
if property_node_set.length == 0 # property is not defined
|
276
|
+
# if a parent has been specified check if it exists
|
277
|
+
error <<-MSG if parent && schema.xpath("//xs:element[@name='#{parent}']").length == 0
|
278
|
+
The parent property '#{parent}' you specified does not exist.
|
279
|
+
Please check the XML Schema at '#{schema_file}' and run the command again with a
|
280
|
+
existing parent property.
|
281
|
+
MSG
|
282
|
+
display "property '#{property_name}' is not yet defined. Lets create it..."
|
283
|
+
property = create_property schema, object_type: object_type, name: property_name,
|
284
|
+
type: type, min_values: min_values, max_values: max_values, i18n: localized_labels_map
|
285
|
+
|
286
|
+
write_xml schema, schema_file
|
287
|
+
display <<-MSG
|
288
|
+
Create new property '#{property_name}' for object type '#{object_type}': OK
|
289
|
+
The new property is now defined in file: #{schema_file}
|
290
|
+
The xml schema definition for the new property is:
|
291
|
+
#{property.to_xml indent: 1, indent_text: "\t", encoding: 'UTF-8'}
|
292
|
+
MSG
|
293
|
+
else
|
294
|
+
display "property '#{property_name}' is already defined. Lets update it..."
|
295
|
+
error "property update is not yet supported"
|
296
|
+
end
|
297
|
+
end
|
298
|
+
|
299
|
+
|
134
300
|
private
|
135
301
|
|
302
|
+
def create_property schema, options
|
303
|
+
object_type = options[:object_type]
|
304
|
+
property = Nokogiri::XML::Node.new 'element', schema
|
305
|
+
property['name'] = options[:name]
|
306
|
+
property['minOccurs'] = options[:min_values]
|
307
|
+
property['maxOccurs'] = options[:max_values]
|
308
|
+
type = xsd_type options[:type]
|
309
|
+
if type
|
310
|
+
property['type'] = type
|
311
|
+
else # complex properties do not have type but they need some more child tags
|
312
|
+
property = to_complex schema, property
|
313
|
+
end
|
314
|
+
|
315
|
+
# add localized labels for property name
|
316
|
+
localize schema, property, options[:i18n]
|
317
|
+
|
318
|
+
# append the new property in XML Schema
|
319
|
+
parent_node = schema.xpath("//xs:element[@name='#{object_type}']//xs:sequence").first
|
320
|
+
error <<-MSG unless parent_node
|
321
|
+
Could not locate the child '<xs:sequence>' tag inside '<xs:element name="#{object_type}"'
|
322
|
+
in order to append the new property.
|
323
|
+
If you have manually created the XML Schema file for object type '#{object_type}'
|
324
|
+
then make sure that you have also created an empty '<xs:sequence></xs:sequence>' child tag
|
325
|
+
before using this command to add new properties.
|
326
|
+
MSG
|
327
|
+
parent_node << property
|
328
|
+
property
|
329
|
+
end
|
330
|
+
|
331
|
+
|
332
|
+
def localize schema, element, localized_labels_map
|
333
|
+
localized_labels_map.each do |locale, label|
|
334
|
+
annotation_node = Nokogiri::XML::Node.new 'annotation', schema
|
335
|
+
documentation_node = Nokogiri::XML::Node.new 'documentation', schema
|
336
|
+
documentation_node["xml:lang"] = locale
|
337
|
+
|
338
|
+
# here we need to add the astroboa namespace so lets find it in schema
|
339
|
+
astroboa_namespace = schema.root.namespace_definitions.find{|ns| ns.prefix=="astroboa"}
|
340
|
+
error <<-MSG unless astroboa_namespace
|
341
|
+
Could not find the astroboa model namespace using namespace prefix 'astroboa'.
|
342
|
+
If you have manually created the XML Schema make sure that you have specified
|
343
|
+
(inside the <xml:schema> tag) the astroboa model namespace with the proper prefix as follows:
|
344
|
+
xmlns:astroboa="http://www.betaconceptframework.org/schema/astroboa/model"
|
345
|
+
MSG
|
346
|
+
display_name_node = Nokogiri::XML::Node.new 'displayName', schema
|
347
|
+
display_name_node.namespace = astroboa_namespace
|
348
|
+
display_name_node.content = label
|
349
|
+
|
350
|
+
documentation_node << display_name_node
|
351
|
+
annotation_node << documentation_node
|
352
|
+
element << annotation_node
|
353
|
+
end
|
354
|
+
end
|
355
|
+
|
356
|
+
|
357
|
+
def to_complex schema, property
|
358
|
+
complex_type_node = Nokogiri::Node.new 'xs:complexType', schema
|
359
|
+
sequence_node = Nokogiri::Node.new 'xs:sequence', schema
|
360
|
+
complex_type_node.add_child sequence_node
|
361
|
+
property.add_child complex_type_node
|
362
|
+
end
|
363
|
+
|
364
|
+
|
365
|
+
def xsd_type type
|
366
|
+
type = case type
|
367
|
+
when 'string'; 'xs:string'
|
368
|
+
when 'integer'; 'xs:int'
|
369
|
+
when 'double'; 'xs:double'
|
370
|
+
when 'boolean'; 'xs:boolean'
|
371
|
+
when 'date'; 'xs:date'
|
372
|
+
when 'dateTime'; 'xs:dateTime'
|
373
|
+
when 'binary'
|
374
|
+
|
375
|
+
when 'topic_ref'
|
376
|
+
|
377
|
+
when 'object_ref'; 'astroboa:contentObjectReferenceType'
|
378
|
+
when 'complex'; nil
|
379
|
+
else type
|
380
|
+
end
|
381
|
+
end
|
382
|
+
|
383
|
+
|
136
384
|
def domain_model_valid? domain_model_file, schemas_dir
|
137
385
|
Dir.chdir(schemas_dir) do
|
138
386
|
|
@@ -339,11 +339,8 @@ private
|
|
339
339
|
|
340
340
|
repository << jcrCache
|
341
341
|
|
342
|
-
strip_text_nodes(repo_conf)
|
343
342
|
new_astroboa_repos_config = "#{astroboa_repos_config}.new"
|
344
|
-
|
345
|
-
repo_conf.write_xml_to(f, :indent => 1, :indent_text => "\t", :encoding => 'UTF-8')
|
346
|
-
end
|
343
|
+
write_xml repo_conf, new_astroboa_repos_config
|
347
344
|
|
348
345
|
# save old config file
|
349
346
|
if conf_exists
|
@@ -372,11 +369,9 @@ private
|
|
372
369
|
|
373
370
|
if !repo_nodes.empty?
|
374
371
|
repo_nodes.remove
|
375
|
-
|
372
|
+
|
376
373
|
new_astroboa_repos_config = "#{astroboa_repos_config}.new"
|
377
|
-
|
378
|
-
repo_conf.write_xml_to(f, :indent => 1, :indent_text => "\t", :encoding => 'UTF-8')
|
379
|
-
end
|
374
|
+
write_xml repo_conf, new_astroboa_repos_config
|
380
375
|
|
381
376
|
current_date = DateTime.now().strftime('%Y-%m-%dT%H.%M')
|
382
377
|
FileUtils.cp astroboa_repos_config, "#{astroboa_repos_config}.#{current_date}"
|
@@ -392,17 +387,7 @@ private
|
|
392
387
|
error "cannot find repositories configuration file: '#{astroboa_repos_config}'"
|
393
388
|
end
|
394
389
|
end
|
395
|
-
|
396
|
-
|
397
|
-
# remove leading and trailing white space from XML Document text nodes
|
398
|
-
def strip_text_nodes(xml_doc)
|
399
|
-
xml_doc.traverse do |node|
|
400
|
-
if node.text?
|
401
|
-
node.content = node.content.strip
|
402
|
-
end
|
403
|
-
end
|
404
|
-
end
|
405
|
-
|
390
|
+
|
406
391
|
|
407
392
|
def add_repo_conf_to_server_conf(server_configuration, repository_name)
|
408
393
|
repo_domain_name = options[:domain_name] ||= 'localhost:8080'
|
@@ -327,7 +327,7 @@ private
|
|
327
327
|
download_package(@torquebox_version_download_url, @install_dir) unless File.size?(File.join(@install_dir, @torquebox_version_file)) == 6
|
328
328
|
|
329
329
|
# download astroboa ear
|
330
|
-
download_package(@astroboa_ear_download_url, @install_dir) unless File.size?(File.join(@install_dir, @astroboa_ear_package)) ==
|
330
|
+
download_package(@astroboa_ear_download_url, @install_dir) unless File.size?(File.join(@install_dir, @astroboa_ear_package)) == 63783475
|
331
331
|
|
332
332
|
# download astroboa version file
|
333
333
|
download_package(@astroboa_version_download_url, @install_dir) unless File.size?(File.join(@install_dir, @astroboa_version_file)) == 15
|
@@ -1,6 +1,7 @@
|
|
1
1
|
# encoding: UTF-8
|
2
2
|
|
3
3
|
require 'astroboa-cli/command/base'
|
4
|
+
require 'fileutils'
|
4
5
|
require 'rbconfig'
|
5
6
|
|
6
7
|
# setup astroboa as a system service (daemon) that automatically starts on boot
|
@@ -108,8 +109,11 @@ private
|
|
108
109
|
launchd_config_template = File.join(astroboa_dir, 'astroboa-setup-templates', 'AstroboaDaemon.plist.template')
|
109
110
|
context = {:astroboa_dir => astroboa_dir, :java_home => ENV['JAVA_HOME'], :jruby_home => File.join(server_configuration['install_dir'], 'torquebox', 'jruby'), :astroboa_user => astroboa_user}
|
110
111
|
render_template_to_file(launchd_config_template, context, temp_launchd_config)
|
111
|
-
|
112
|
-
|
112
|
+
unless FileUtils.cp temp_launchd_config LAUNCHD_CONFIG
|
113
|
+
FileUtils.rm temp_launchd_config
|
114
|
+
error "Failed to copy launchd config file to #{LAUNCHD_CONFIG}"
|
115
|
+
end
|
116
|
+
error "Failed to remove temporary launchd config file #{temp_launchd_config}" unless FileUtils.rm temp_launchd_config
|
113
117
|
display "Generating launchd config file '#{LAUNCHD_CONFIG}': OK"
|
114
118
|
end
|
115
119
|
|
data/lib/astroboa-cli/util.rb
CHANGED
@@ -467,20 +467,20 @@ module AstroboaCLI
|
|
467
467
|
database_admin, database_admin_password, database_server = get_postgresql_config(server_configuration)
|
468
468
|
begin
|
469
469
|
conn = PG.connect(
|
470
|
-
:
|
471
|
-
:
|
472
|
-
:
|
473
|
-
:
|
474
|
-
:
|
470
|
+
host: database_server,
|
471
|
+
port: '5432',
|
472
|
+
dbname: 'postgres',
|
473
|
+
user: database_admin,
|
474
|
+
password: database_admin_password)
|
475
475
|
|
476
476
|
# check if db exists
|
477
477
|
res = conn.exec("SELECT COUNT(*) FROM pg_database WHERE datname=$1",[database_name])
|
478
|
-
unless res.entries[0]['count'] == 0
|
478
|
+
unless res.entries[0]['count'].to_i == 0
|
479
479
|
display "Database #{database_name} exists. You may run the command with --db_name repo_db_name to specify a different database name"
|
480
480
|
raise
|
481
481
|
end
|
482
482
|
|
483
|
-
res = conn.exec("CREATE DATABASE
|
483
|
+
res = conn.exec("CREATE DATABASE #{database_name} ENCODING 'UNICODE'")
|
484
484
|
if res.result_status == PG::Result::PGRES_COMMAND_OK
|
485
485
|
display %(Create Postges database "#{database_name}" : OK)
|
486
486
|
else
|
@@ -540,6 +540,27 @@ module AstroboaCLI
|
|
540
540
|
end
|
541
541
|
|
542
542
|
|
543
|
+
# remove leading and trailing white space from XML Document text nodes
|
544
|
+
# xml_doc should be a Nokogiri::XML:Document or Nokogiri::XML::Node
|
545
|
+
def strip_text_nodes xml_doc
|
546
|
+
xml_doc.traverse do |node|
|
547
|
+
if node.text?
|
548
|
+
node.content = node.content.strip
|
549
|
+
end
|
550
|
+
end
|
551
|
+
end
|
552
|
+
|
553
|
+
# write XML document to a file
|
554
|
+
# document should be a Nokogiri::XML:Document or Nokogiri::XML::Node
|
555
|
+
def write_xml document, file_full_path
|
556
|
+
strip_text_nodes document
|
557
|
+
|
558
|
+
File.open(file_full_path, 'w') do |f|
|
559
|
+
document.write_xml_to(f, :indent => 1, :indent_text => "\t", :encoding => 'UTF-8')
|
560
|
+
end
|
561
|
+
end
|
562
|
+
|
563
|
+
|
543
564
|
# Not used because only works in jruby, TO BE REMOVED
|
544
565
|
def create_postgresql_db_with_jdbc(server_configuration, database_name, repo_dir)
|
545
566
|
database_admin, database_admin_password, database_server = get_postgresql_config(server_configuration)
|
@@ -591,5 +612,6 @@ module AstroboaCLI
|
|
591
612
|
raise
|
592
613
|
end
|
593
614
|
end
|
615
|
+
|
594
616
|
end
|
595
617
|
end
|
data/lib/astroboa-cli/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: astroboa-cli
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2012-
|
13
|
+
date: 2012-11-05 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: progressbar
|