ontomde-uml2-java 1.0.4
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.
- data/History.txt +8 -0
- data/Manifest.txt +24 -0
- data/README.txt +98 -0
- data/Rakefile +21 -0
- data/lib/ontomde-uml2-java/accessorCode.rb +496 -0
- data/lib/ontomde-uml2-java/accessorSignature.rb +304 -0
- data/lib/ontomde-uml2-java/build.rb +80 -0
- data/lib/ontomde-uml2-java/collectionMapping.rb +98 -0
- data/lib/ontomde-uml2-java/enumAssignable.rb +67 -0
- data/lib/ontomde-uml2-java/enumCompatibilityLayer.rb +188 -0
- data/lib/ontomde-uml2-java/equals.rb +91 -0
- data/lib/ontomde-uml2-java/groovy.rb +56 -0
- data/lib/ontomde-uml2-java/java.rb +1252 -0
- data/lib/ontomde-uml2-java/java.rdoc +78 -0
- data/lib/ontomde-uml2-java/javaHelper.rb +25 -0
- data/lib/ontomde-uml2-java/javaMapping.rb +420 -0
- data/lib/ontomde-uml2-java/java_todo.rdoc +3 -0
- data/lib/ontomde-uml2-java/javadoc.rb +217 -0
- data/lib/ontomde-uml2-java/meta.rb +26 -0
- data/lib/ontomde-uml2-java/operationAsClass.rb +130 -0
- data/lib/ontomde-uml2-java/security.rb +232 -0
- data/lib/ontomde-uml2-java/version.rb +7 -0
- data/lib/ontomde-uml2-java.rb +37 -0
- data/test/test_ontomde-uml2-java.rb +0 -0
- metadata +96 -0
@@ -0,0 +1,217 @@
|
|
1
|
+
|
2
|
+
|
3
|
+
class String
|
4
|
+
JAVA_ESCAPEJAVADOC_RE=/\*\\/
|
5
|
+
#write string as javadoc
|
6
|
+
#NOTE: source strings should not include javadoc comments open/close
|
7
|
+
# (javadoc comments open/closed are removed)
|
8
|
+
def java_writeJavadoc(res)
|
9
|
+
# replace escaped carriage return by true carriage return
|
10
|
+
# remove java comments (we are already inside a javadoc)
|
11
|
+
self.gsub(/\\r\\n/,"\n").gsub(/\*\//,'--').gsub(/\/\*/,'--').each { |line|
|
12
|
+
res.write(" * #{line}".tr("\n"," ").rstrip)
|
13
|
+
res.write("\n")
|
14
|
+
}
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
module Muml_Classifier
|
19
|
+
#write classifier javadoc comment.
|
20
|
+
def java_writeJavadoc
|
21
|
+
return unless context[:javadoc]
|
22
|
+
c=""
|
23
|
+
sep=""
|
24
|
+
uml_ownedComment.each { |comment|
|
25
|
+
c="#{c}#{sep}#{comment.uml_body_one}"
|
26
|
+
sep="\n"
|
27
|
+
}
|
28
|
+
write(" /**\n");
|
29
|
+
c.java_writeJavadoc(self)
|
30
|
+
#Note: RSM exports adds an extraneous http://
|
31
|
+
#Note: TODO: This code is RSM 6 specific
|
32
|
+
%{@see <a href="#{context[:rsm6WebDocURI]}#{UriNamespace.instance.unalias(rdf_uri).gsub(/http:\/\/kb#/,"")}-content.html">UML documentation.</a>}.java_writeJavadoc(self) unless context[:rsm6WebDocURI].empty?
|
33
|
+
|
34
|
+
write(" */\n")
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
module Muml_Property
|
39
|
+
#returns a javadoc link suitable for @see and @link.
|
40
|
+
def java_javadocLink(location=nil)
|
41
|
+
o=umlx_owner_one
|
42
|
+
if location==o
|
43
|
+
#same class
|
44
|
+
return "##{java_Name}"
|
45
|
+
else
|
46
|
+
#different class
|
47
|
+
return "#{o.java_qualifiedName}##{java_Name}"
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
|
54
|
+
module Muml_Operation
|
55
|
+
#returns a javadoc link suitable for @see and @link.
|
56
|
+
def java_javadocLink(location=nil)
|
57
|
+
o=umlx_owner_one
|
58
|
+
if location==o
|
59
|
+
#same class
|
60
|
+
return "##{java_Name}"
|
61
|
+
else
|
62
|
+
#different class
|
63
|
+
return "#{o.java_qualifiedName}##{java_Name}"
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
|
68
|
+
#write operation javadoc comment.
|
69
|
+
def java_writeJavadoc
|
70
|
+
return unless context[:javadoc]
|
71
|
+
write(" /**\n");
|
72
|
+
hasDoc=false
|
73
|
+
|
74
|
+
# if !java_getter_property.empty? && !java_getter_property_one.uml_isDerived?
|
75
|
+
# "getter for property {@link #{java_getter_property_one.java_javadocLink}}".java_writeJavadoc(self)
|
76
|
+
# end
|
77
|
+
# if !java_setter_property.empty? && !java_setter_property_one.uml_isDerived?
|
78
|
+
# "setter for property {@link #{java_setter_property_one.java_javadocLink}}".java_writeJavadoc(self)
|
79
|
+
# end
|
80
|
+
|
81
|
+
p=java_getter_property_one0
|
82
|
+
if !p.nil?
|
83
|
+
oe=p.umlx_otherEnd
|
84
|
+
if !oe.nil? && oe.umlx_isNavigable?
|
85
|
+
g=oe.java_AttributeGlobalGetter_one0
|
86
|
+
if !g.nil?
|
87
|
+
"This property is part of a bi-navigable association {@link #{g.java_javadocLink(self)}}<br/>".java_writeJavadoc(self)
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
|
93
|
+
if !uml_ownedComment.empty?
|
94
|
+
#write("* @return the \n");
|
95
|
+
uml_ownedComment.each { |comment|
|
96
|
+
hasDoc=true
|
97
|
+
comment.uml_body_one.java_writeJavadoc(self)
|
98
|
+
}
|
99
|
+
|
100
|
+
elsif !java_getter_property.empty?
|
101
|
+
java_getter_property_one.uml_ownedComment.each { |comment|
|
102
|
+
hasDoc=true
|
103
|
+
comment.uml_body_one.java_writeJavadoc(self)
|
104
|
+
}
|
105
|
+
else
|
106
|
+
#nop
|
107
|
+
end
|
108
|
+
#if(!hasDoc)
|
109
|
+
# "TODO: document this element in source UML model".java_writeJavadoc(self)
|
110
|
+
#end
|
111
|
+
|
112
|
+
uml_ownedParameter.each { |p|
|
113
|
+
c=""
|
114
|
+
p.uml_ownedComment.each { |comment|
|
115
|
+
c="#{c} #{comment.uml_body_one}"
|
116
|
+
}
|
117
|
+
next if c.empty? && p.uml_direction_one.isReturn?
|
118
|
+
"#{p.uml_direction_one.isReturn? ? %{@return} : %{@param}} #{p.java_Name unless p.uml_direction_one.isReturn?}#{c}".java_writeJavadoc(self)
|
119
|
+
}
|
120
|
+
|
121
|
+
if !java_setter_property.empty?
|
122
|
+
hasDoc=true
|
123
|
+
p=java_setter_property_one
|
124
|
+
if !p.java_AttributeGlobalGetter.empty?
|
125
|
+
"@see #{p.java_AttributeGlobalGetter_one.java_javadocLink}".java_writeJavadoc(self)
|
126
|
+
end
|
127
|
+
end
|
128
|
+
|
129
|
+
write(" */\n")
|
130
|
+
end
|
131
|
+
end
|
132
|
+
|
133
|
+
module Muml_EnumerationLiteral
|
134
|
+
def java_writeJavadoc
|
135
|
+
return unless context[:javadoc]
|
136
|
+
c=""
|
137
|
+
uml_ownedComment.each { |comment|
|
138
|
+
c="#{c} #{comment.uml_body_one}"
|
139
|
+
}
|
140
|
+
return if c.empty?
|
141
|
+
write(" /**\n");
|
142
|
+
c.java_writeJavadoc(self)
|
143
|
+
write(" */\n")
|
144
|
+
end
|
145
|
+
end
|
146
|
+
|
147
|
+
|
148
|
+
module Mrdf_Model
|
149
|
+
|
150
|
+
#returns a hash of package sets for which a javadoc should be generated.
|
151
|
+
#hash key is the qualifiedName of the packages
|
152
|
+
#(several uml packages may have the same name in different UML models)
|
153
|
+
#
|
154
|
+
#A package is included if :
|
155
|
+
#* it contains a generated class/interface/enum
|
156
|
+
#* it contains a uml comment
|
157
|
+
def java_getUsedPackages
|
158
|
+
|
159
|
+
ps=Hash.new
|
160
|
+
uml_Class_all.each { |e|
|
161
|
+
p=e.umlx_owner_one
|
162
|
+
next unless p.kind_of?(Muml_Package)
|
163
|
+
next if p.kind_of?(Muml_Model)
|
164
|
+
next if e.umlx_external?
|
165
|
+
pn=p.java_qualifiedName.to_s
|
166
|
+
s=ps[pn]
|
167
|
+
if s.nil?
|
168
|
+
s=Set.new
|
169
|
+
ps[pn]=s
|
170
|
+
end
|
171
|
+
s.add(p)
|
172
|
+
}
|
173
|
+
|
174
|
+
each { |k,p|
|
175
|
+
next unless p.kind_of?(Muml_Package)
|
176
|
+
next if p.kind_of?(Muml_Model)
|
177
|
+
next if p.uml_ownedComment.empty?
|
178
|
+
pn=p.java_qualifiedName.to_s
|
179
|
+
s=ps[pn]
|
180
|
+
if s.nil?
|
181
|
+
s=Set.new
|
182
|
+
ps[pn]=s
|
183
|
+
end
|
184
|
+
s.add(p)
|
185
|
+
}
|
186
|
+
return ps
|
187
|
+
end
|
188
|
+
|
189
|
+
#generates java documentation files (package-info.java) for
|
190
|
+
#packages directly containing elements (class, enum, interface)
|
191
|
+
#cf: http://java.sun.com/docs/books/jls/third_edition/html/packages.html
|
192
|
+
def java_generatePackageDoc
|
193
|
+
return unless context[:javadoc]
|
194
|
+
java_getUsedPackages.each { |packageName,packageSet|
|
195
|
+
fn=nil
|
196
|
+
packageSet.each { |package|
|
197
|
+
fn="#{package.java_FilePath}/#{package.java_Name}/package-info.java"
|
198
|
+
break
|
199
|
+
}
|
200
|
+
mtk_writeSession(fn) {
|
201
|
+
write("/**\n")
|
202
|
+
packageSet.each { |package|
|
203
|
+
package.uml_ownedComment.each { |comment|
|
204
|
+
comment.uml_body_one.java_writeJavadoc(self)
|
205
|
+
}
|
206
|
+
}
|
207
|
+
write("**/\n\n")
|
208
|
+
write("package #{packageName};\n")
|
209
|
+
}
|
210
|
+
}
|
211
|
+
end
|
212
|
+
end
|
213
|
+
|
214
|
+
|
215
|
+
|
216
|
+
|
217
|
+
|
@@ -0,0 +1,26 @@
|
|
1
|
+
|
2
|
+
class Crdfs_Class
|
3
|
+
|
4
|
+
#UML metaclass to java class mapping.
|
5
|
+
#Example:
|
6
|
+
#An UML metaclass class maps to a java.lang.Class java class.
|
7
|
+
#Note:
|
8
|
+
# feature introduced for opencrx.
|
9
|
+
JAVA_METACLASS_MAPPING={
|
10
|
+
"uml_Class" => "java.lang.Class"
|
11
|
+
}
|
12
|
+
|
13
|
+
# returns the java class name for this meta-class.
|
14
|
+
# Example:
|
15
|
+
#
|
16
|
+
# Note:
|
17
|
+
# added for openmdx which uses attributes of type "metaclass-class".
|
18
|
+
def java_qualifiedName
|
19
|
+
qn=JAVA_METACLASS_MAPPING[rdf_uri]
|
20
|
+
return qn unless qn.nil?
|
21
|
+
msg="unknown java_qualifiedName for meta-class #{rdf_uri}"
|
22
|
+
return "int /*TODO: #{msg} */"
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
26
|
+
|
@@ -0,0 +1,130 @@
|
|
1
|
+
module Muml_Classifier
|
2
|
+
STRUTS_APPLY_TO_PARAM="applyTo"
|
3
|
+
STRUTS_APPLY_TO_PROP="ApplyTo"
|
4
|
+
end
|
5
|
+
|
6
|
+
module Muml_Operation
|
7
|
+
rdf_safe_attr_reader_many :struts_bizOperationReverse
|
8
|
+
end
|
9
|
+
|
10
|
+
module Muml_Parameter
|
11
|
+
#the method parameter
|
12
|
+
rdf_safe_attr_reader_many :struts_sourceParameter
|
13
|
+
end
|
14
|
+
|
15
|
+
|
16
|
+
module Mrdf_Model
|
17
|
+
def struts_addAllOperationAggregateParameterClass!
|
18
|
+
return unless context[:withGenerateMethodForm]
|
19
|
+
|
20
|
+
uml_Class_all.each {|c|
|
21
|
+
#exclude classes explicitely set to false
|
22
|
+
next if (!c.umlx_businessMethod.empty?) && (!c.umlx_businessMethod?)
|
23
|
+
c.uml_ownedOperation.each {|biz|
|
24
|
+
#next if c.java_isATestFile?
|
25
|
+
next unless biz.kind_of?(Muml_Operation)
|
26
|
+
next unless biz.umlx_businessMethod?
|
27
|
+
next if biz.umlx_isConstructor?
|
28
|
+
next if biz.uml_visibility_one.isPrivate?
|
29
|
+
next if biz.uml_visibility_one.isProtected?
|
30
|
+
next if biz.uml_isStatic?
|
31
|
+
#c=biz.umlx_owner_one
|
32
|
+
|
33
|
+
p=c.umlx_package
|
34
|
+
if p.nil?
|
35
|
+
log.error{"Model modification required !!! class #{c} is in root model element. Classes should be in a package."}
|
36
|
+
next
|
37
|
+
end
|
38
|
+
next unless c.kind_of?(Muml_Class)
|
39
|
+
|
40
|
+
p=p.umlx_getOrCreatePackage(context[:classMethodSubDir,"methods"],p)
|
41
|
+
#BUG:biz_uri ne suffisait pas car si 2 classes immplémnetaient 2 fois une méthode d'une classe abstraite
|
42
|
+
#la classe crée avait les 2 mêmes uri et donc était zappé par la suite(notamment le java_transform
|
43
|
+
mpc=p.umlx_createAndAddClass(c.rdf_uri+biz.rdf_uri+"_mpc2");
|
44
|
+
mpc.umlx_businessMethod=RDF_TRUE
|
45
|
+
mpc.struts_addAllOperationAggregateParameterClass!(biz)
|
46
|
+
mpc.db_isTransient=RDF_TRUE
|
47
|
+
|
48
|
+
m=mpc.umlx_createAndAddOperation(mpc.rdf_uri+"merge","merge");
|
49
|
+
#TODO merge referenced items
|
50
|
+
m.java_code="return this; "
|
51
|
+
p=m.umlx_createAndAddReturnParameter(m.rdf_uri+'_ret',"return")
|
52
|
+
p.uml_type=mpc
|
53
|
+
|
54
|
+
}}
|
55
|
+
end
|
56
|
+
end
|
57
|
+
module Muml_Classifier
|
58
|
+
|
59
|
+
rdf_safe_attr_reader_many :struts_bizOperation
|
60
|
+
#
|
61
|
+
#Creates a class for every business method holding every parameters
|
62
|
+
#and
|
63
|
+
#
|
64
|
+
#
|
65
|
+
|
66
|
+
STRUTS_RESULT_PARAM_NAME="_result"
|
67
|
+
|
68
|
+
def struts_addAllOperationAggregateParameterClass!(biz)
|
69
|
+
mpc=self
|
70
|
+
mpc.struts_bizOperation=biz
|
71
|
+
biz.struts_bizOperationReverse_add(mpc)
|
72
|
+
#biz.struts_bizForm=mpc
|
73
|
+
mpc.uml_name="#{biz.umlx_owner_one.java_Name}#{biz.java_Name}MPC"
|
74
|
+
(biz.uml_ownedParameter+biz.uml_returnResult).each { |param|
|
75
|
+
#next if param.uml_direction_one.isReturn?
|
76
|
+
mpcp=mpc.umlx_createAndAddProperty(mpc.rdf_uri+"_mpc3")
|
77
|
+
param.umlx_copyToAttributeProperty(mpcp)
|
78
|
+
mpcp.uml_name= param.uml_direction_one.isReturn? ? STRUTS_RESULT_PARAM_NAME : param.uml_name
|
79
|
+
}
|
80
|
+
mpc.struts_addApplyToParameter!(biz)
|
81
|
+
mpc.struts_addProceed!(biz)
|
82
|
+
#mpc.apaCom_addLogger!
|
83
|
+
end
|
84
|
+
|
85
|
+
def struts_addApplyToParameter!(biz)
|
86
|
+
mpc=self
|
87
|
+
m,m1,m2=mpc.umlx_createAndAddAssociation(mpc.rdf_uri+"_apply",biz.umlx_owner_one)
|
88
|
+
m1.uml_name=STRUTS_APPLY_TO_PARAM
|
89
|
+
m2.uml_name="#{STRUTS_APPLY_TO_PARAM}_inv"
|
90
|
+
end
|
91
|
+
|
92
|
+
def struts_addProceed!(biz)
|
93
|
+
mpc=self
|
94
|
+
cpt=mpc.umlx_createAndAddOperation(mpc.rdf_uri+"_proceed","proceed")
|
95
|
+
params=""; sep=""
|
96
|
+
hasRP=false
|
97
|
+
(biz.uml_ownedParameter+biz.uml_returnResult).each { |param|
|
98
|
+
if param.uml_direction_one.isReturn?
|
99
|
+
hasRP=true
|
100
|
+
next
|
101
|
+
end
|
102
|
+
params="#{params}#{sep}#{param.java_Name}"
|
103
|
+
sep=","
|
104
|
+
}
|
105
|
+
if(biz.uml_raisedException.empty?)
|
106
|
+
cpt.java_code=%{
|
107
|
+
#{hasRP ? "#{STRUTS_RESULT_PARAM_NAME}=" : ""} #{STRUTS_APPLY_TO_PARAM}.#{biz.java_Name}(#{params});
|
108
|
+
}
|
109
|
+
else
|
110
|
+
cpt.java_code=%{
|
111
|
+
try {
|
112
|
+
//log.error("before biz method");
|
113
|
+
//log.error("applyTo="+#{STRUTS_APPLY_TO_PARAM});
|
114
|
+
#{hasRP ? "#{STRUTS_RESULT_PARAM_NAME}=" : ""} #{STRUTS_APPLY_TO_PARAM}.#{biz.java_Name}(#{params});
|
115
|
+
//log.error("after biz method");
|
116
|
+
//log.error("result="+#{hasRP ? STRUTS_RESULT_PARAM_NAME : %{"-none-"}});
|
117
|
+
} catch(Exception e) {
|
118
|
+
//TODO: implement proper exception handling
|
119
|
+
throw new java.lang.RuntimeException(e);
|
120
|
+
}
|
121
|
+
}
|
122
|
+
end
|
123
|
+
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
|
128
|
+
|
129
|
+
|
130
|
+
|
@@ -0,0 +1,232 @@
|
|
1
|
+
# Authentification and security model enhancements.
|
2
|
+
#
|
3
|
+
|
4
|
+
module Muml_Property
|
5
|
+
#return true if element is marked as secured.
|
6
|
+
def umlx_isSecured?
|
7
|
+
return umlx_hasStereotype?("Secured")
|
8
|
+
end
|
9
|
+
end
|
10
|
+
module Muml_Operation
|
11
|
+
#return true if element is marked as secured.
|
12
|
+
def umlx_isSecured?
|
13
|
+
return umlx_hasStereotype?("Secured")
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
module Mrdf_Model
|
18
|
+
|
19
|
+
#Retrieve an enumeration that will contain a list of secured methods
|
20
|
+
def umlx_getSecuredMethodEnumeration
|
21
|
+
return umlx_reserved_model.umlx_getOrCreateEnumeration("xmda.security.SecuredMethodInventory",Muml_Classifier::UMLX_SEARCH_EVERY_MODEL)
|
22
|
+
end
|
23
|
+
|
24
|
+
def umlx_populateSecuredMethodEnumeration
|
25
|
+
umlx_generateStaticSecurityRoleEnum
|
26
|
+
e=umlx_getSecuredMethodEnumeration
|
27
|
+
|
28
|
+
#populate inventory
|
29
|
+
uml_Class_all.each {|c|
|
30
|
+
next unless c.umlx_businessMethod?
|
31
|
+
next if c.kind_of?(Muml_Interface)
|
32
|
+
cn="#{c.java_qualifiedName}.class"
|
33
|
+
c.uml_ownedOperation.each {|op|
|
34
|
+
next unless op.umlx_businessMethod?
|
35
|
+
#operation was generated from an interface
|
36
|
+
next if (!op.umlx_redefinesMethod.empty?) && (!op.umlx_redefinesMethod_one.umlx_owner_one.kind_of?(Muml_Interface))
|
37
|
+
lit=e.umlx_createAndAddLiteral("#{op.umlx_owner_one.java_qualifiedName}_#{op.java_Name}")
|
38
|
+
lit.java_initParameterValue_add(cn)
|
39
|
+
lit.java_initParameterValue_add(%{"#{op.java_Name}"})
|
40
|
+
}
|
41
|
+
}
|
42
|
+
|
43
|
+
cc=umlx_reserved_model.umlx_getOrCreateClass("java.lang.Classxx")
|
44
|
+
cc.uml_name="Class<?>"
|
45
|
+
cc.java_isGeneric=RDF_TRUE
|
46
|
+
|
47
|
+
str=e.umlx_owner_one.umlx_dataType_string
|
48
|
+
# add constructor
|
49
|
+
c=e.umlx_createAndAddOperation("#{c}.constructor","constructor")
|
50
|
+
c.uml_appliedStereotype_add(e.umlx_getOrCreateStereotype("Create"))
|
51
|
+
c.uml_visibility=::Cuml_VisibilityKind::Private
|
52
|
+
p1=c.umlx_createAndAddParameter("#{c.uri}_p1","_ownerClass")
|
53
|
+
p1.uml_type=cc
|
54
|
+
p2=c.umlx_createAndAddParameter("#{c.uri}_p2","_operationName")
|
55
|
+
p2.uml_type=str
|
56
|
+
c.java_code="ownerClass=_ownerClass;\noperationName=_operationName;"
|
57
|
+
|
58
|
+
#add attributes
|
59
|
+
a1=e.umlx_createAndAddProperty("#{e}_a1","ownerClass")
|
60
|
+
a1.uml_type=cc
|
61
|
+
a2=e.umlx_createAndAddProperty("#{e}_a2","operationName")
|
62
|
+
a2.uml_type=str
|
63
|
+
|
64
|
+
#add finder
|
65
|
+
f=e.umlx_createAndAddOperation("#{e.uri}_find","find")
|
66
|
+
f.uml_isStatic=RDF_TRUE
|
67
|
+
a1=f.umlx_createAndAddParameter("#{e}_a1","ownerClass")
|
68
|
+
a1.uml_type=cc
|
69
|
+
a2=f.umlx_createAndAddParameter("#{e}_a2","operationName")
|
70
|
+
a2.uml_type=str
|
71
|
+
a3=f.umlx_createAndAddReturnParameter("#{e}_ret","enum")
|
72
|
+
a3.uml_type=e
|
73
|
+
f.java_code=<<END
|
74
|
+
//TODO !!!!!!!!!!!
|
75
|
+
return null ; //#{e.java_Name}
|
76
|
+
END
|
77
|
+
|
78
|
+
end
|
79
|
+
|
80
|
+
#model may contain several enumeration of roles stereotypes staticSecurityRole
|
81
|
+
#For implementation use, an enumeration containing every roles is generated.
|
82
|
+
#Role container name could be appended to role name but it is not because it
|
83
|
+
#would make code refactoring more complex.
|
84
|
+
#As a consequence, role name should be unique application wide.
|
85
|
+
def umlx_generateStaticSecurityRoleEnum
|
86
|
+
e=umlx_reserved_model.umlx_getOrCreateEnumeration("xmda.security.StaticSecurityRole",Muml_Classifier::UMLX_SEARCH_EVERY_MODEL)
|
87
|
+
self.each_value { |v|
|
88
|
+
next unless v.kind_of?(Muml_Enumeration)
|
89
|
+
next unless v.umlx_hasStereotype?("staticSecurityRole")
|
90
|
+
v.uml_ownedLiteral.each {|c|
|
91
|
+
#role name should be unique
|
92
|
+
e.umlx_createAndAddLiteral(c.to_s)
|
93
|
+
}
|
94
|
+
}
|
95
|
+
end
|
96
|
+
|
97
|
+
#Retrieve an enumeration that will contain a list of secured property
|
98
|
+
def umlx_getSecuredPropertyEnumeration
|
99
|
+
return umlx_reserved_model.umlx_getOrCreateEnumeration("xmda.security.SecuredPropertyInventory",Muml_Classifier::UMLX_SEARCH_EVERY_MODEL)
|
100
|
+
end
|
101
|
+
|
102
|
+
def umlx_populateSecuredPropertyEnumeration
|
103
|
+
#umlx_generateStaticSecurityRoleEnum
|
104
|
+
e=umlx_getSecuredPropertyEnumeration
|
105
|
+
|
106
|
+
#populate inventory
|
107
|
+
uml_Class_all.each {|c|
|
108
|
+
next unless c.umlx_businessMethod?
|
109
|
+
|
110
|
+
#Hack: transient operation
|
111
|
+
#next if c.db_isTransient?
|
112
|
+
|
113
|
+
|
114
|
+
next if c.kind_of?(Muml_Interface)
|
115
|
+
cn="#{c.java_qualifiedName}.class"
|
116
|
+
c.uml_ownedAttribute.each {|op|
|
117
|
+
#next unless op.umlx_businessMethod?
|
118
|
+
#operation was generated from an interface
|
119
|
+
#next if (!op.umlx_redefinesProperty.empty?) && (!op.umlx_redefinesProperty_one.umlx_owner_one.kind_of?(Muml_Interface))
|
120
|
+
lit=e.umlx_createAndAddLiteral("#{op.umlx_owner_one.java_qualifiedName}_#{op.java_Name}")
|
121
|
+
lit.java_initParameterValue_add(cn)
|
122
|
+
lit.java_initParameterValue_add(%{"#{op.java_Name}"})
|
123
|
+
lit.java_initParameterValue_add(op.umlx_isSecured?)
|
124
|
+
}
|
125
|
+
}
|
126
|
+
|
127
|
+
|
128
|
+
#Classxx is on purpose
|
129
|
+
cc=umlx_reserved_model.umlx_getOrCreateClass("java.lang.Classxx")
|
130
|
+
cc.uml_name="Class<?>"
|
131
|
+
cc.java_isGeneric=RDF_TRUE
|
132
|
+
|
133
|
+
str=e.umlx_owner_one.umlx_dataType_string
|
134
|
+
bol=e.umlx_owner_one.umlx_dataType_boolean
|
135
|
+
# add constructor
|
136
|
+
c=e.umlx_createAndAddOperation("#{c}.constructor","constructor")
|
137
|
+
c.uml_appliedStereotype_add(e.umlx_getOrCreateStereotype("Create"))
|
138
|
+
c.uml_visibility=::Cuml_VisibilityKind::Private
|
139
|
+
p1=c.umlx_createAndAddParameter("#{c.uri}_p1","_ownerClass")
|
140
|
+
p1.uml_type=cc
|
141
|
+
p2=c.umlx_createAndAddParameter("#{c.uri}_p2","_propertyName")
|
142
|
+
p2.uml_type=str
|
143
|
+
p3=c.umlx_createAndAddParameter("#{c.uri}_p3","_isSecured")
|
144
|
+
p3.uml_type=bol
|
145
|
+
c.java_code="ownerClass=_ownerClass;\npropertyName=_propertyName;\nisSecured=_isSecured;"
|
146
|
+
|
147
|
+
#add attributes
|
148
|
+
a1=e.umlx_createAndAddProperty("#{e}_a1","ownerClass")
|
149
|
+
a1.uml_type=cc
|
150
|
+
a2=e.umlx_createAndAddProperty("#{e}_a2","propertyName")
|
151
|
+
a2.uml_type=str
|
152
|
+
a3=e.umlx_createAndAddProperty("#{e}_a2","isSecured")
|
153
|
+
a3.uml_type=bol
|
154
|
+
|
155
|
+
|
156
|
+
#add finder
|
157
|
+
f=e.umlx_createAndAddOperation("#{e.uri}_find","find")
|
158
|
+
f.uml_isStatic=RDF_TRUE
|
159
|
+
a1=f.umlx_createAndAddParameter("#{e}_a1","ownerClass")
|
160
|
+
a1.uml_type=cc
|
161
|
+
a2=f.umlx_createAndAddParameter("#{e}_a2","propertyName")
|
162
|
+
a2.uml_type=str
|
163
|
+
a3=f.umlx_createAndAddReturnParameter("#{e}_ret","enum")
|
164
|
+
a3.uml_type=e
|
165
|
+
f.java_code=<<END
|
166
|
+
//TODO !!!!!!!!!!!
|
167
|
+
return null ; //#{e.java_Name}
|
168
|
+
END
|
169
|
+
|
170
|
+
end
|
171
|
+
|
172
|
+
#Java annotation used to mark a Secured method or field.
|
173
|
+
JAVA_SECURE_ANNOTATION="@xmda.security.Secure"
|
174
|
+
|
175
|
+
# process element marked as secured
|
176
|
+
def umlx_processSecuredElements
|
177
|
+
e=umlx_reserved_model.umlx_getOrCreateInterface("org.acegisecurity.userdetails.UserDetails")
|
178
|
+
|
179
|
+
uml_Class_all.each {|c|
|
180
|
+
#sec=false
|
181
|
+
next if c.kind_of?(Muml_Interface) || c.kind_of?(Muml_Enumeration)
|
182
|
+
c.uml_ownedOperation.each {|o|
|
183
|
+
next unless o.umlx_isSecured?
|
184
|
+
o.java_annotation_add(JAVA_SECURE_ANNOTATION)
|
185
|
+
#sec=true
|
186
|
+
}
|
187
|
+
c.uml_ownedAttribute.each { |a|
|
188
|
+
next unless a.umlx_isSecured?
|
189
|
+
a.java_annotation_add(JAVA_SECURE_ANNOTATION)
|
190
|
+
#sec=true
|
191
|
+
}
|
192
|
+
c.umlx_addGetStaticRoleOperation! #if sec
|
193
|
+
}
|
194
|
+
end
|
195
|
+
|
196
|
+
end
|
197
|
+
module Muml_Class
|
198
|
+
|
199
|
+
# method comment that will be generated as javadoc
|
200
|
+
JAVA_GETSTATIC_ROLE_COMMENT=<<ENDHELP
|
201
|
+
This method returns a set of "static roles" that *may* *be* granted to the user based on database informations.
|
202
|
+
|
203
|
+
When a "security role" (defined at runtime) is bounded(linked) to a "static role" (defined at compile time),
|
204
|
+
users must
|
205
|
+
- be granted the security role
|
206
|
+
- and the bounded "static role" must be included in the set of role returned by this method.
|
207
|
+
ENDHELP
|
208
|
+
|
209
|
+
#method default implementation
|
210
|
+
JAVA_GETSTATIC_ROLE_CODE=<<ENDROLECODE
|
211
|
+
//return empty list (every static role are denied)
|
212
|
+
return new java.util.HashSet<xmda.security.StaticSecurityRole>();
|
213
|
+
ENDROLECODE
|
214
|
+
|
215
|
+
#public List<SecurityRole> getStaticRoles(org.acegi.security.UserDetails userName
|
216
|
+
def umlx_addGetStaticRoleOperation!
|
217
|
+
m=self.umlx_createAndAddOperation("#{rdf_uri}_getStaticRoles","getStaticRoles")
|
218
|
+
|
219
|
+
r=m.umlx_createAndAddReturnParameter("#{m.rdf_uri}_return")
|
220
|
+
r.uml_type=umlx_reserved_model.umlx_getOrCreateEnumeration("xmda.security.StaticSecurityRole",Muml_Classifier::UMLX_SEARCH_EVERY_MODEL)
|
221
|
+
r.uml_upperValue=umlx_literal(-1)
|
222
|
+
r.umlx_createAndAddComment("#{r.rdf_uri}_c1",JAVA_GETSTATIC_ROLE_COMMENT)
|
223
|
+
|
224
|
+
p=m.umlx_createAndAddParameter("#{m.rdf_uri}_p1","user")
|
225
|
+
p.uml_type=umlx_reserved_model.umlx_getOrCreateEnumeration("org.acegisecurity.userdetails.UserDetails",Muml_Classifier::UMLX_SEARCH_EVERY_MODEL)
|
226
|
+
|
227
|
+
m.java_code=JAVA_GETSTATIC_ROLE_CODE
|
228
|
+
end
|
229
|
+
|
230
|
+
|
231
|
+
end
|
232
|
+
|
@@ -0,0 +1,37 @@
|
|
1
|
+
# This class is meant to be included in your project that require java code generation capability.
|
2
|
+
#
|
3
|
+
#EXAMPLE: The following code will generate all the java file corresponding to the UML elements stored in model.emx.nt
|
4
|
+
#
|
5
|
+
# require '#{h}'
|
6
|
+
# modelFile='model.emx.nt'
|
7
|
+
#
|
8
|
+
# model=Crdf_Model.new
|
9
|
+
# model.loadUml2
|
10
|
+
# model.loadModelFromFile(modelFile)
|
11
|
+
#
|
12
|
+
# model.mtk_context(:build=> build) {
|
13
|
+
# model.java_generate
|
14
|
+
# }
|
15
|
+
# puts "Your Java file have been generated"
|
16
|
+
|
17
|
+
|
18
|
+
require 'ontomde-uml2'
|
19
|
+
|
20
|
+
h="#{File.dirname(__FILE__)}/ontomde-uml2-java"
|
21
|
+
require "#{h}/version.rb"
|
22
|
+
require "#{h}/JavaMapping.rb"
|
23
|
+
require "#{h}/java.rb"
|
24
|
+
require "#{h}/javaHelper.rb"
|
25
|
+
require "#{h}/accessorCode.rb"
|
26
|
+
require "#{h}/accessorSignature.rb"
|
27
|
+
require "#{h}/meta.rb"
|
28
|
+
require "#{h}/enumCompatibilityLayer.rb"
|
29
|
+
require "#{h}/enumAssignable.rb"
|
30
|
+
require "#{h}/operationAsClass.rb"
|
31
|
+
require "#{h}/build.rb"
|
32
|
+
require "#{h}/collectionMapping.rb"
|
33
|
+
require "#{h}/javadoc.rb"
|
34
|
+
require "#{h}/security.rb"
|
35
|
+
require "#{h}/groovy.rb"
|
36
|
+
|
37
|
+
|
File without changes
|