genio 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/LICENSE.txt +54 -0
- data/README.md +55 -0
- data/bin/genio +21 -0
- data/lib/genio.rb +35 -0
- data/lib/genio/helper/base.rb +101 -0
- data/lib/genio/helper/dot_net.rb +410 -0
- data/lib/genio/helper/java.rb +415 -0
- data/lib/genio/helper/php.rb +342 -0
- data/lib/genio/logging.rb +30 -0
- data/lib/genio/tasks.rb +246 -0
- data/lib/genio/template.rb +65 -0
- data/lib/genio/util/namespace_helper.rb +93 -0
- data/lib/genio/util/schema_helper.rb +65 -0
- data/lib/genio/version.rb +19 -0
- data/templates/sdk.rest_dotnet.erb +174 -0
- data/templates/sdk.rest_java.erb +231 -0
- data/templates/sdk.rest_php.erb +120 -0
- data/templates/sdk.rest_version_dotnet.erb +49 -0
- data/templates/sdk.rest_version_java.erb +46 -0
- data/templates/sdk.wsdl_dotnet.erb +90 -0
- data/templates/sdk.wsdl_java.erb +115 -0
- data/templates/sdk.wsdl_php.erb +79 -0
- data/templates/sdk.wsdlenum_dotnet.erb +32 -0
- data/templates/sdk.wsdlenum_java.erb +47 -0
- data/templates/sdk.wsdlservice_dotnet.erb +154 -0
- data/templates/sdk.wsdlservice_java.erb +145 -0
- data/templates/sdk.wsdlservice_php.erb +92 -0
- data/templates/sdk.wsdlsoapdeserialize_dotnet.erb +139 -0
- data/templates/sdk.wsdlsoapdeserialize_java.erb +128 -0
- data/templates/sdk.wsdlsoapserialize_dotnet.erb +184 -0
- data/templates/sdk.wsdlsoapserialize_java.erb +170 -0
- data/templates/sdk.wsdlsoapserialize_php.erb +67 -0
- metadata +191 -0
@@ -0,0 +1,415 @@
|
|
1
|
+
#
|
2
|
+
# Copyright 2013 PayPal Inc.
|
3
|
+
#
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
5
|
+
# you may not use this file except in compliance with the License.
|
6
|
+
# You may obtain a copy of the License at
|
7
|
+
#
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
9
|
+
#
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
13
|
+
# See the License for the specific language governing permissions and
|
14
|
+
# limitations under the License.
|
15
|
+
#
|
16
|
+
#
|
17
|
+
|
18
|
+
module Genio
|
19
|
+
module Helper
|
20
|
+
module Java
|
21
|
+
|
22
|
+
include Base
|
23
|
+
|
24
|
+
# Key/Reserved Words
|
25
|
+
KeyWords = [
|
26
|
+
"abstract",
|
27
|
+
"continue",
|
28
|
+
"for",
|
29
|
+
"new",
|
30
|
+
"switch",
|
31
|
+
"assert",
|
32
|
+
"default",
|
33
|
+
"goto",
|
34
|
+
"package",
|
35
|
+
"synchronized",
|
36
|
+
"boolean",
|
37
|
+
"do",
|
38
|
+
"if",
|
39
|
+
"private",
|
40
|
+
"this",
|
41
|
+
"break",
|
42
|
+
"double",
|
43
|
+
"implements",
|
44
|
+
"protected",
|
45
|
+
"throw",
|
46
|
+
"byte",
|
47
|
+
"else",
|
48
|
+
"import",
|
49
|
+
"public",
|
50
|
+
"throws",
|
51
|
+
"case",
|
52
|
+
"enum",
|
53
|
+
"instanceof",
|
54
|
+
"return",
|
55
|
+
"transient",
|
56
|
+
"catch",
|
57
|
+
"extends",
|
58
|
+
"int",
|
59
|
+
"short",
|
60
|
+
"try",
|
61
|
+
"char",
|
62
|
+
"final",
|
63
|
+
"interface",
|
64
|
+
"static",
|
65
|
+
"void",
|
66
|
+
"class",
|
67
|
+
"finally",
|
68
|
+
"long",
|
69
|
+
"strictfp**",
|
70
|
+
"volatile",
|
71
|
+
"const",
|
72
|
+
"float",
|
73
|
+
"native",
|
74
|
+
"super",
|
75
|
+
"while"
|
76
|
+
]
|
77
|
+
|
78
|
+
# Keyword substitute hash
|
79
|
+
KeywordsSubstitute = {
|
80
|
+
|
81
|
+
}
|
82
|
+
|
83
|
+
# Static resource imports
|
84
|
+
# Resource class which have REST operation enabled
|
85
|
+
# depend on these core classes
|
86
|
+
ServiceImportREST = [
|
87
|
+
"com.paypal.core.rest.PayPalRESTException",
|
88
|
+
"com.paypal.core.rest.PayPalResource",
|
89
|
+
"com.paypal.core.rest.HttpMethod",
|
90
|
+
"com.paypal.core.rest.PayPalRESTException",
|
91
|
+
"com.paypal.core.rest.RESTUtil",
|
92
|
+
"com.paypal.core.rest.JSONFormatter",
|
93
|
+
"com.paypal.core.rest.APIContext",
|
94
|
+
"com.paypal.core.Constants",
|
95
|
+
"com.paypal.core.SDKVersion",
|
96
|
+
"com.paypal.sdk.info.SDKVersionImpl",
|
97
|
+
"java.io.File",
|
98
|
+
"java.io.InputStream",
|
99
|
+
"java.util.Properties",
|
100
|
+
"java.util.Map",
|
101
|
+
"java.util.HashMap"
|
102
|
+
]
|
103
|
+
|
104
|
+
# Static resource imports for WSDL
|
105
|
+
# service class; they depend on these core classes
|
106
|
+
ServiceImportWSDL = [
|
107
|
+
"java.io.*",
|
108
|
+
"java.util.Map",
|
109
|
+
"java.util.HashMap",
|
110
|
+
"java.util.Properties",
|
111
|
+
"com.paypal.core.BaseService",
|
112
|
+
"com.paypal.exception.*",
|
113
|
+
"com.paypal.sdk.exceptions.*",
|
114
|
+
"com.paypal.core.APICallPreHandler",
|
115
|
+
"com.paypal.core.DefaultSOAPAPICallHandler",
|
116
|
+
"com.paypal.core.DefaultSOAPAPICallHandler.XmlNamespaceProvider",
|
117
|
+
"org.w3c.dom.Node",
|
118
|
+
"org.xml.sax.SAXException",
|
119
|
+
"org.xml.sax.InputSource",
|
120
|
+
"javax.xml.parsers.ParserConfigurationException",
|
121
|
+
"javax.xml.parsers.DocumentBuilderFactory",
|
122
|
+
"javax.xml.xpath.XPathConstants",
|
123
|
+
"javax.xml.xpath.XPathExpressionException",
|
124
|
+
"javax.xml.xpath.XPathFactory",
|
125
|
+
"com.paypal.core.DefaultSOAPAPICallHandler",
|
126
|
+
"com.paypal.core.BaseAPIContext"
|
127
|
+
]
|
128
|
+
|
129
|
+
# Static resource imports for WSDL
|
130
|
+
# stub classes; they depend on these core classes
|
131
|
+
StubImportWSDL = [
|
132
|
+
"javax.xml.xpath.XPath",
|
133
|
+
"javax.xml.xpath.XPathConstants",
|
134
|
+
"javax.xml.xpath.XPathExpressionException",
|
135
|
+
"javax.xml.xpath.XPathFactory",
|
136
|
+
"org.w3c.dom.Node",
|
137
|
+
"org.w3c.dom.NodeList",
|
138
|
+
"com.paypal.core.SDKUtil"
|
139
|
+
]
|
140
|
+
|
141
|
+
# Spec Types to Java Types conversion map
|
142
|
+
BasicTypes = { "int" => "Integer", "integer" => "Integer", "positiveInteger" => "Integer", "nonNegativeInteger" => "Integer", "long" => "Long", "double" => "Double", "decimal" => "Double", "float" => "Float", "boolean" => "Boolean", "string" => "String", "dateTime" => "String", "date" => "String", "number" => "Number", "object" => "Object", "token" => "String", "duration" => "String", "anyURI" => "String", "date_time" => "String", "base64Binary" => "String", "time" => "String" }
|
143
|
+
|
144
|
+
# Returns the type of a member
|
145
|
+
# If the passed in parameter is one of Basic types
|
146
|
+
# return the corresponding BasicType, else
|
147
|
+
# the parameter is returned unmodified
|
148
|
+
def find_basic_type(key)
|
149
|
+
only_basic_type(key) || key
|
150
|
+
end
|
151
|
+
|
152
|
+
# Returns the corresponding basic
|
153
|
+
# data type in Java
|
154
|
+
def only_basic_type(key)
|
155
|
+
BasicTypes[key.camelcase(:lower)]
|
156
|
+
end
|
157
|
+
|
158
|
+
# Returns the imports for the Class
|
159
|
+
def imports(data_type, schema, package, classname, schema_format, operation_input = false)
|
160
|
+
list = []
|
161
|
+
|
162
|
+
# custom package provided during generation
|
163
|
+
pkg = options[:namespace]
|
164
|
+
pkg += "." if pkg.present?
|
165
|
+
|
166
|
+
# mandatory imports
|
167
|
+
list += ["com.paypal.core.rest.JSONFormatter"] if (schema_format == "rest")
|
168
|
+
data_type.properties.each do |name, property|
|
169
|
+
type = schema.data_types[property.type] || schema.enum_types[property.type]
|
170
|
+
if (type)
|
171
|
+
if (pkg.present?)
|
172
|
+
list.push(pkg + property.type)
|
173
|
+
else
|
174
|
+
# TODO fix this when definition namespace fixes
|
175
|
+
defpkg = convert_ns_to_package(type.package || package)
|
176
|
+
list.push(defpkg + "." + property.type)
|
177
|
+
end
|
178
|
+
end
|
179
|
+
list.push("java.util.List") if property.array
|
180
|
+
list.push("java.util.ArrayList") if property.array
|
181
|
+
end
|
182
|
+
|
183
|
+
# Add references for members of parent datatype
|
184
|
+
# flatten classes for wsdl
|
185
|
+
if schema.instance_of? Genio::Parser::Format::Wsdl
|
186
|
+
x_type = schema.data_types[data_type.extends]
|
187
|
+
while x_type
|
188
|
+
x_type.properties.each do |name, property|
|
189
|
+
type = schema.data_types[property.type] || schema.enum_types[property.type]
|
190
|
+
if (type)
|
191
|
+
if (pkg.present?)
|
192
|
+
list.push(pkg + property.type)
|
193
|
+
else
|
194
|
+
# TODO fix this when definition namespace fixes
|
195
|
+
defpkg = convert_ns_to_package(type.package || package)
|
196
|
+
list.push(defpkg + "." + property.type)
|
197
|
+
end
|
198
|
+
end
|
199
|
+
list.push("java.util.List") if property.array
|
200
|
+
list.push("java.util.ArrayList") if property.array
|
201
|
+
end
|
202
|
+
x_type = schema.data_types[x_type.extends]
|
203
|
+
end
|
204
|
+
end
|
205
|
+
|
206
|
+
# Add reference for request and response type
|
207
|
+
# of operations: Applies to REST services
|
208
|
+
service = schema.services[classname]
|
209
|
+
if service
|
210
|
+
service.operations.each do |name, operation|
|
211
|
+
if operation.response
|
212
|
+
if (pkg.present?)
|
213
|
+
list.push(pkg + validate_class_name(operation.response))
|
214
|
+
else
|
215
|
+
list.push(convert_ns_to_package(schema.data_types[operation.response].try(:package) || package) + "." + validate_class_name(operation.response))
|
216
|
+
end
|
217
|
+
end
|
218
|
+
if operation.request
|
219
|
+
if (pkg.present?)
|
220
|
+
list.push(pkg + validate_class_name(operation.request))
|
221
|
+
else
|
222
|
+
list.push(convert_ns_to_package(schema.data_types[operation.request].try(:package) || package) + "." + validate_class_name(operation.request))
|
223
|
+
end
|
224
|
+
end
|
225
|
+
end
|
226
|
+
end
|
227
|
+
|
228
|
+
list += ServiceImportREST if (schema.services[classname] && (schema_format == "rest"))
|
229
|
+
list += StubImportWSDL if (schema_format == "soap")
|
230
|
+
list += ["com.paypal.core.message.XMLMessageSerializer"] if (operation_input && (schema_format == "soap"))
|
231
|
+
list.uniq.sort
|
232
|
+
end
|
233
|
+
|
234
|
+
# Generate imports for WSDL Service class
|
235
|
+
def service_imports(schema, service, package)
|
236
|
+
list = []
|
237
|
+
|
238
|
+
# custom package provided during generation
|
239
|
+
pkg = options[:namespace]
|
240
|
+
pkg += "." if pkg.present?
|
241
|
+
|
242
|
+
# import request and response of operations
|
243
|
+
service.operations.each do |name, definition|
|
244
|
+
if (definition.request_property)
|
245
|
+
if (pkg.present?)
|
246
|
+
list.push(pkg + validate_class_name(definition.request_property.type))
|
247
|
+
else
|
248
|
+
list.push(convert_ns_to_package(schema.data_types[validate_class_name(definition.request_property.type)].package || package) + "." + validate_class_name(definition.request_property.type))
|
249
|
+
end
|
250
|
+
end
|
251
|
+
if (definition.response_property)
|
252
|
+
if (pkg.present?)
|
253
|
+
list.push(pkg + validate_class_name(definition.response_property.type))
|
254
|
+
else
|
255
|
+
list.push(convert_ns_to_package(schema.data_types[validate_class_name(definition.response_property.type)].package || package) + "." + validate_class_name(definition.response_property.type))
|
256
|
+
end
|
257
|
+
end
|
258
|
+
if (definition.fault_property)
|
259
|
+
if (pkg.present?)
|
260
|
+
list.push(pkg + validate_class_name(definition.fault_property.type))
|
261
|
+
else
|
262
|
+
list.push(convert_ns_to_package(schema.data_types[validate_class_name(definition.fault_property.type)].package || package) + "." + validate_class_name(definition.fault_property.type))
|
263
|
+
end
|
264
|
+
end
|
265
|
+
end
|
266
|
+
|
267
|
+
# mandatory imports
|
268
|
+
list += ServiceImportWSDL
|
269
|
+
list.uniq.sort
|
270
|
+
end
|
271
|
+
|
272
|
+
# Returns the property type name to be used as the
|
273
|
+
# type name in enclosing Class
|
274
|
+
def get_property_class(property, classname = nil)
|
275
|
+
type = find_basic_type(property.type)
|
276
|
+
|
277
|
+
# If type is Self (as per Spec) treat is as HostType
|
278
|
+
# classname is always in camelcase
|
279
|
+
type = classname if type == "self"
|
280
|
+
type = "List<#{type}>" if property.array
|
281
|
+
type
|
282
|
+
end
|
283
|
+
|
284
|
+
# Replaces any "-" present in the path URI to valid "_"
|
285
|
+
# used while replacing placeholders with exact values
|
286
|
+
def validate_path(path)
|
287
|
+
path.gsub(/\{([^}]*)\}/){|match| "\{#{validate_property_name($1)}\}" }
|
288
|
+
end
|
289
|
+
|
290
|
+
# Replaces '-' with '_' and CamelCase(s) them [Java]
|
291
|
+
def validate_class_name(name)
|
292
|
+
only_basic_type(name) || name.gsub(/-/, "_").camelcase
|
293
|
+
end
|
294
|
+
|
295
|
+
# Replaces '-' with '_' and camelCase(s) them
|
296
|
+
# used for valid property names [Java]
|
297
|
+
# replaces keywords with substitutes form KeywordsSubstitute
|
298
|
+
def validate_property_name(name)
|
299
|
+
valid_name = name.gsub(/-/, "_").camelcase(:lower)
|
300
|
+
if KeyWords.include? valid_name
|
301
|
+
valid_name = KeywordsSubstitute[valid_name]
|
302
|
+
end
|
303
|
+
valid_name
|
304
|
+
end
|
305
|
+
|
306
|
+
# Replaces '-' and spaces with '_'
|
307
|
+
# used for valid enum names [Java]
|
308
|
+
def validate_enum_name(name)
|
309
|
+
name.gsub(/[-\s]/, "_").sub(/^\d/, '_\0')
|
310
|
+
end
|
311
|
+
|
312
|
+
# Prepends do to method names that are keywords
|
313
|
+
def validate_method_name(name)
|
314
|
+
KeyWords.include?(name) ? "do#{name.gsub(/-/, "_").camelcase}" : validate_property_name(name)
|
315
|
+
end
|
316
|
+
|
317
|
+
# Generate method formal parameters for REST API calls
|
318
|
+
def form_rest_api_args(classname, property, name)
|
319
|
+
arguments = {}
|
320
|
+
property.path.scan(/{([^}]*)}/).each do |name, etc|
|
321
|
+
if is_static_method(property) or validate_class_name(name) !~ /^#{classname}/i
|
322
|
+
arguments[validate_property_name(name)] = "String"
|
323
|
+
end
|
324
|
+
end
|
325
|
+
if property.request and property.request != classname
|
326
|
+
arguments[validate_property_name(property.request)] = property.request
|
327
|
+
end
|
328
|
+
if property.type == 'GET' or property.type == 'HEAD' or property.type == 'DELETE'
|
329
|
+
arguments["queryParameters"] = "Map<String, String>"
|
330
|
+
end
|
331
|
+
arguments
|
332
|
+
end
|
333
|
+
|
334
|
+
# Generate method formal parameters for CXF interface
|
335
|
+
# The argument type is appended with annotations
|
336
|
+
def form_cxf_args(classname, property, name)
|
337
|
+
arguments = {}
|
338
|
+
arguments["context"] = "@Context final MessageContext"
|
339
|
+
property.parameters.each do |name, parameter|
|
340
|
+
arguments[validate_property_name(name)] = "@#{parameter.location.capitalize}Param(\"#{name}\") String"
|
341
|
+
end if property.parameters
|
342
|
+
if property.request
|
343
|
+
arguments[property.request.camelcase(:lower)] = property.request
|
344
|
+
end
|
345
|
+
arguments
|
346
|
+
end
|
347
|
+
|
348
|
+
# Generates a map of parameters for placeholders used
|
349
|
+
# to process path URI
|
350
|
+
def generate_format_hash(classname, property, resourcePath)
|
351
|
+
map = {}
|
352
|
+
resourcePath.scan(/\{([^}]*)\}/) { |name, etc|
|
353
|
+
if (name.match(/^#{classname}.*/i) and !is_static_method(property))
|
354
|
+
map[name] = 'this.getId()'
|
355
|
+
else
|
356
|
+
map[name] = validate_property_name(name)
|
357
|
+
end
|
358
|
+
}
|
359
|
+
map
|
360
|
+
end
|
361
|
+
|
362
|
+
# Returns the expression to set for payLoad in the API call
|
363
|
+
def get_payload(classname, property)
|
364
|
+
payLoad = '""';
|
365
|
+
if !is_static_method(property)
|
366
|
+
if property.request == classname
|
367
|
+
payLoad = "this.toJSON()"
|
368
|
+
elsif property.request
|
369
|
+
payLoad = validate_property_name(property.request) + ".toJSON()"
|
370
|
+
end
|
371
|
+
end
|
372
|
+
payLoad
|
373
|
+
end
|
374
|
+
|
375
|
+
# Returns true if data_type is in services operations
|
376
|
+
# request or header, else returns false
|
377
|
+
def is_operation_input(data_type, schema)
|
378
|
+
schema.services.each do |service_name, servicedef|
|
379
|
+
servicedef.operations.each do |operation_name, oper_definition|
|
380
|
+
if (data_type.name == oper_definition.request || data_type.name == oper_definition.header)
|
381
|
+
return true
|
382
|
+
end
|
383
|
+
end
|
384
|
+
end
|
385
|
+
return false
|
386
|
+
end
|
387
|
+
|
388
|
+
# Returns the name used during serialization for types
|
389
|
+
# that extend Serializer interface
|
390
|
+
def get_rootname_serialization(data_type, schema)
|
391
|
+
schema.services.each do |service_name, servicedef|
|
392
|
+
servicedef.operations.each do |operation_name, oper_definition|
|
393
|
+
if (data_type.name == oper_definition.request)
|
394
|
+
return (oper_definition.request_property.package + ":" + oper_definition.request_property.name)
|
395
|
+
elsif (data_type.name == oper_definition.header)
|
396
|
+
return (oper_definition.header_property.package + ":" + oper_definition.header_property.name)
|
397
|
+
end
|
398
|
+
end
|
399
|
+
end
|
400
|
+
end
|
401
|
+
|
402
|
+
# Returns a hash of arguments for wsdl operations
|
403
|
+
# including the request type and name
|
404
|
+
# hash is in the format of [name] = [type]
|
405
|
+
def get_wsdl_operation_arguments(operation_definition)
|
406
|
+
argument_hash = {}
|
407
|
+
argument_hash[validate_property_name(operation_definition.request_property.name)] = operation_definition.request
|
408
|
+
argument_hash
|
409
|
+
end
|
410
|
+
|
411
|
+
private
|
412
|
+
include Genio::Util::NamespaceHelper
|
413
|
+
end
|
414
|
+
end
|
415
|
+
end
|
@@ -0,0 +1,342 @@
|
|
1
|
+
#
|
2
|
+
# Copyright 2013 PayPal Inc.
|
3
|
+
#
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
5
|
+
# you may not use this file except in compliance with the License.
|
6
|
+
# You may obtain a copy of the License at
|
7
|
+
#
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
9
|
+
#
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
13
|
+
# See the License for the specific language governing permissions and
|
14
|
+
# limitations under the License.
|
15
|
+
#
|
16
|
+
#
|
17
|
+
module Genio
|
18
|
+
module Helper
|
19
|
+
module PHP
|
20
|
+
|
21
|
+
include Base
|
22
|
+
# Key/Reserved Words
|
23
|
+
KeyWords = [
|
24
|
+
'__halt_compiler',
|
25
|
+
'abstract',
|
26
|
+
'and',
|
27
|
+
'array',
|
28
|
+
'as',
|
29
|
+
'break',
|
30
|
+
'callable',
|
31
|
+
'case',
|
32
|
+
'catch',
|
33
|
+
'class',
|
34
|
+
'clone',
|
35
|
+
'const',
|
36
|
+
'continue',
|
37
|
+
'declare',
|
38
|
+
'default',
|
39
|
+
'die',
|
40
|
+
'do',
|
41
|
+
'echo',
|
42
|
+
'else',
|
43
|
+
'elseif',
|
44
|
+
'empty',
|
45
|
+
'enddeclare',
|
46
|
+
'endfor',
|
47
|
+
'endforeach',
|
48
|
+
'endif',
|
49
|
+
'endswitch',
|
50
|
+
'endwhile',
|
51
|
+
'eval',
|
52
|
+
'exit',
|
53
|
+
'extends',
|
54
|
+
'final',
|
55
|
+
'for',
|
56
|
+
'foreach',
|
57
|
+
'function',
|
58
|
+
'global',
|
59
|
+
'goto',
|
60
|
+
'if',
|
61
|
+
'implements',
|
62
|
+
'include',
|
63
|
+
'include_once',
|
64
|
+
'instanceof',
|
65
|
+
'insteadof',
|
66
|
+
'interface',
|
67
|
+
'isset',
|
68
|
+
'list',
|
69
|
+
'namespace',
|
70
|
+
'new',
|
71
|
+
'or',
|
72
|
+
'print',
|
73
|
+
'private',
|
74
|
+
'protected',
|
75
|
+
'public',
|
76
|
+
'require',
|
77
|
+
'require_once',
|
78
|
+
'return',
|
79
|
+
'static',
|
80
|
+
'switch',
|
81
|
+
'throw',
|
82
|
+
'trait',
|
83
|
+
'try',
|
84
|
+
'unset',
|
85
|
+
'use',
|
86
|
+
'var',
|
87
|
+
'while',
|
88
|
+
'xor'
|
89
|
+
]
|
90
|
+
|
91
|
+
# Class static imports/references for rest services
|
92
|
+
RestServiceImport = [
|
93
|
+
"PayPal\\Rest\\IResource",
|
94
|
+
"PayPal\\Transport\\PPRestCall"
|
95
|
+
]
|
96
|
+
|
97
|
+
# Class static imports/references for rest services
|
98
|
+
WSDLServiceImport = [
|
99
|
+
"PayPal\\Exception\\PPTransformerException",
|
100
|
+
"PayPal\\Core\\PPBaseService",
|
101
|
+
"PayPal\\Core\\PPUtils"
|
102
|
+
]
|
103
|
+
|
104
|
+
# Class static imports/references for WSDL
|
105
|
+
WSDLStubImport = [
|
106
|
+
]
|
107
|
+
# Spec Types to PHP Types conversion map
|
108
|
+
BasicTypes = { "int" => "integer", "integer" => "integer", "positiveInteger" => "integer", "nonNegativeInteger" => "integer", "long" => "long", "double" => "double", "decimal" => "double", "float" => "float", "boolean" => "boolean", "string" => "string", "dateTime" => "string", "date" => "string", "date_time" => "string", "number" => "number", "object" => "object", "token" => "string", "duration" => "string", "anyURI" => "string", "base64Binary" => "string", "time" => "string" }
|
109
|
+
|
110
|
+
# Returns the type of a member
|
111
|
+
def find_basic_type(key)
|
112
|
+
BasicTypes[key] ? BasicTypes[key] : valid_class_name(key)
|
113
|
+
end
|
114
|
+
|
115
|
+
def get_php_type(property, schema, classname = nil)
|
116
|
+
type = find_basic_type(property.type)
|
117
|
+
|
118
|
+
# for enums, return type as string
|
119
|
+
type = "string" if schema.enum_types[property.type]
|
120
|
+
|
121
|
+
# If type is Self (as per Spec) treat is as HostType
|
122
|
+
# classname is always in camelcase
|
123
|
+
type = classname if type.downcase == "self"
|
124
|
+
type
|
125
|
+
end
|
126
|
+
|
127
|
+
def imports(data_type, schema, package, classname, schema_format)
|
128
|
+
|
129
|
+
# mandatory references
|
130
|
+
list = []
|
131
|
+
if (data_type.extends)
|
132
|
+
defpkg = get_namespace(schema.data_types[valid_class_name(data_type.extends)].package || package)
|
133
|
+
list.push(defpkg + '\\' + valid_class_name(data_type.extends))
|
134
|
+
end
|
135
|
+
|
136
|
+
service = schema.services[classname]
|
137
|
+
|
138
|
+
# Add use statements for function return types
|
139
|
+
if service
|
140
|
+
service.operations.each do |name, operation|
|
141
|
+
type = schema.data_types[operation.response]
|
142
|
+
if(type)
|
143
|
+
defpkg = get_namespace(schema.data_types[valid_class_name(operation.response)].package || package)
|
144
|
+
list.push(defpkg + '\\' + valid_class_name(operation.response)) if (operation.response && operation.response != classname)
|
145
|
+
end
|
146
|
+
end
|
147
|
+
end
|
148
|
+
|
149
|
+
if (schema_format == "rest")
|
150
|
+
list.push( "PayPal\\Common\\PPModel") if !data_type.extends
|
151
|
+
list += RestServiceImport if service
|
152
|
+
elsif (schema_format == "soap")
|
153
|
+
list += WSDLStubImport
|
154
|
+
if data_type.fault
|
155
|
+
list.push('PayPal\\Core\\PPXmlFaultMessage')
|
156
|
+
else
|
157
|
+
list.push('PayPal\\Core\\PPXmlMessage')
|
158
|
+
end
|
159
|
+
end
|
160
|
+
list.uniq.sort
|
161
|
+
end
|
162
|
+
|
163
|
+
# Generate imports for WSDL Service class
|
164
|
+
def service_imports(schema, service, package)
|
165
|
+
list = []
|
166
|
+
|
167
|
+
# custom package provided during generation
|
168
|
+
pkg = options[:namespace]
|
169
|
+
pkg += "." if pkg.present?
|
170
|
+
|
171
|
+
# import request and response of operations
|
172
|
+
service.operations.each do |name, definition|
|
173
|
+
if (definition.request_property)
|
174
|
+
if (pkg.present?)
|
175
|
+
list.push(pkg + valid_class_name(definition.request_property.type))
|
176
|
+
else
|
177
|
+
list.push(get_slashed_package_name(get_namespace(schema.data_types[valid_class_name(definition.request_property.type)].package || package) + "." + valid_class_name(definition.request_property.type)))
|
178
|
+
end
|
179
|
+
end
|
180
|
+
if (definition.response)
|
181
|
+
if (pkg.present?)
|
182
|
+
list.push(pkg + valid_class_name(definition.response))
|
183
|
+
else
|
184
|
+
list.push(get_slashed_package_name(get_namespace(schema.data_types[valid_class_name(definition.response)].package || package) + "." + valid_class_name(definition.response)))
|
185
|
+
end
|
186
|
+
end
|
187
|
+
if (definition.fault)
|
188
|
+
if (pkg.present?)
|
189
|
+
list.push(pkg + valid_class_name(definition.response))
|
190
|
+
else
|
191
|
+
list.push(get_slashed_package_name(get_namespace(schema.data_types[valid_class_name(definition.fault)].package || package) + "." + valid_class_name(definition.fault)))
|
192
|
+
end
|
193
|
+
end
|
194
|
+
end
|
195
|
+
# mandatory imports
|
196
|
+
list += WSDLServiceImport
|
197
|
+
list.uniq.sort
|
198
|
+
end
|
199
|
+
|
200
|
+
def process_path_with_placeholders(classname, name, path, hostId_check = false, argument_hash = nil, query_params)
|
201
|
+
path = '/' + path if !path.start_with?('/')
|
202
|
+
returnPath = ""
|
203
|
+
if hostId_check
|
204
|
+
returnPath = path.sub(/\{[^}]*\}/, "{$this->getId()}")
|
205
|
+
returnPath = '"' + returnPath
|
206
|
+
else
|
207
|
+
values = argument_hash.keys
|
208
|
+
returnPath = path.gsub(/\{[^}]*\}/) do |match|
|
209
|
+
"$#{values.shift}"
|
210
|
+
end
|
211
|
+
returnPath = '"' + returnPath
|
212
|
+
end
|
213
|
+
if query_params
|
214
|
+
returnPath = returnPath +'?" . http_build_query($queryParameters)'
|
215
|
+
else
|
216
|
+
returnPath = returnPath + '"'
|
217
|
+
end
|
218
|
+
returnPath
|
219
|
+
end
|
220
|
+
|
221
|
+
def valid_class_name(name)
|
222
|
+
name.gsub(/-/, "_").camelcase
|
223
|
+
end
|
224
|
+
|
225
|
+
def valid_property_name(name)
|
226
|
+
name.gsub(/-/, "_").camelize(:lower)
|
227
|
+
end
|
228
|
+
|
229
|
+
def deprecated_function_name(name)
|
230
|
+
name.gsub(/-/, "_").capitalize
|
231
|
+
end
|
232
|
+
|
233
|
+
def validate_function_name(name)
|
234
|
+
returnName = name
|
235
|
+
if name == 'list'
|
236
|
+
returnName = 'all'
|
237
|
+
end
|
238
|
+
returnName
|
239
|
+
end
|
240
|
+
|
241
|
+
# Prepends do to method names that are keywords
|
242
|
+
def validate_method_name(name)
|
243
|
+
KeyWords.include?(name) ? "do#{valid_class_name(name)}" : valid_property_name(name)
|
244
|
+
end
|
245
|
+
|
246
|
+
def validated_package(package)
|
247
|
+
get_slashed_package_name(capitalize_package(remove_tld_in_package(convert_ns_to_package(package))))
|
248
|
+
end
|
249
|
+
|
250
|
+
# to underscore
|
251
|
+
def to_underscore(name)
|
252
|
+
name.gsub(/-/, "_")
|
253
|
+
end
|
254
|
+
|
255
|
+
def form_arguments(classname, property, name)
|
256
|
+
arguments = {}
|
257
|
+
property.path.scan(/{([^}]*)}/).each do |name, etc|
|
258
|
+
if is_static_method(property) or name !~ /^#{classname}/i
|
259
|
+
arguments[valid_property_name(name)] = "string"
|
260
|
+
end
|
261
|
+
end
|
262
|
+
if property.request and property.request != classname
|
263
|
+
arguments[valid_property_name(property.request)] = property.request
|
264
|
+
end
|
265
|
+
if property.type == 'GET' or property.type == 'HEAD' or property.type == 'DELETE'
|
266
|
+
arguments["queryParameters"] = "array"
|
267
|
+
elsif (property.parameters && allowed_params(property.parameters).size > 0)
|
268
|
+
arguments["queryParameters"] = "array"
|
269
|
+
end
|
270
|
+
arguments
|
271
|
+
end
|
272
|
+
|
273
|
+
def get_object_array(classname, name, property, argument_hash)
|
274
|
+
arr = []
|
275
|
+
if property.path
|
276
|
+
arr.push("queryParameters")
|
277
|
+
else
|
278
|
+
argument_hash.each do |name, type|
|
279
|
+
if name.include?("Id") and property.path =~ /\{([^}]*id)\}/
|
280
|
+
arr.push(name)
|
281
|
+
end
|
282
|
+
end
|
283
|
+
if !is_static_method(property) and name != "create"
|
284
|
+
arr.push("this.id")
|
285
|
+
end
|
286
|
+
end
|
287
|
+
arr
|
288
|
+
end
|
289
|
+
|
290
|
+
def get_payload(classname, property)
|
291
|
+
payload = '""';
|
292
|
+
if !is_static_method(property)
|
293
|
+
if property.request == classname
|
294
|
+
payload = "$this->toJSON()"
|
295
|
+
elsif property.request
|
296
|
+
payload = "$" + valid_property_name(property.request) + "->toJSON()"
|
297
|
+
end
|
298
|
+
end
|
299
|
+
payload
|
300
|
+
end
|
301
|
+
|
302
|
+
def get_namespace(package)
|
303
|
+
pkg = options[:namespace]
|
304
|
+
return capitalize_package(remove_tld_in_package(convert_ns_to_package(pkg))) if pkg.present?
|
305
|
+
return validated_package(package)
|
306
|
+
end
|
307
|
+
|
308
|
+
# Returns a hash of arguments for wsdl operations
|
309
|
+
# including the request and header arguments
|
310
|
+
# hash is in the format of [name] = [type]
|
311
|
+
def get_wsdl_operation_arguments(operation_definition)
|
312
|
+
argument_array = []
|
313
|
+
argument_array.push('$' + operation_definition.request.camelcase(:lower))
|
314
|
+
#argument_array.push('$' + operation_definition.header.camelcase(:lower))
|
315
|
+
argument_array
|
316
|
+
end
|
317
|
+
|
318
|
+
def get_rootname_serialization(data_type, schema)
|
319
|
+
schema.services.each do |service_name, servicedef|
|
320
|
+
servicedef.operations.each do |operation_name, oper_definition|
|
321
|
+
if (data_type.name == oper_definition.request)
|
322
|
+
temp = oper_definition.request_property.package + ":" + oper_definition.request_property.name
|
323
|
+
return temp
|
324
|
+
elsif (data_type.name == oper_definition.header)
|
325
|
+
temp = oper_definition.header_property.package + ":" + oper_definition.header_property.name
|
326
|
+
return temp
|
327
|
+
end
|
328
|
+
end
|
329
|
+
end
|
330
|
+
end
|
331
|
+
|
332
|
+
# Returns set of alllowed query parameters
|
333
|
+
# for a operation
|
334
|
+
def allowed_params(parameters)
|
335
|
+
parameters.select do |name, values|
|
336
|
+
values.location != "path"
|
337
|
+
end
|
338
|
+
end
|
339
|
+
|
340
|
+
end
|
341
|
+
end
|
342
|
+
end
|