1515 */
1616package io .adminshell .aas .v3 .dataformat .aml ;
1717
18+ import io .adminshell .aas .v3 .dataformat .aml .aas2aml .Aas2AmlMappingContext ;
1819import io .adminshell .aas .v3 .dataformat .aml .model .caex .AttributeType ;
1920import io .adminshell .aas .v3 .dataformat .aml .model .caex .CAEXFile ;
2021import io .adminshell .aas .v3 .dataformat .aml .model .caex .CAEXObject ;
2122import io .adminshell .aas .v3 .dataformat .aml .model .caex .InternalElementType ;
2223import io .adminshell .aas .v3 .dataformat .aml .model .caex .RoleClassType ;
2324import io .adminshell .aas .v3 .dataformat .aml .model .caex .SystemUnitClassType ;
2425import io .adminshell .aas .v3 .model .Referable ;
26+ import java .beans .PropertyDescriptor ;
2527import java .util .List ;
2628import org .slf4j .Logger ;
2729import org .slf4j .LoggerFactory ;
2830
2931public class AmlGenerator {
3032
3133 private static final Logger log = LoggerFactory .getLogger (AmlGenerator .class );
34+ private static final String DEFAULT_REF_SEMANTIC_PREFIX = "AAS:" ;
35+ private final String refSemanticPrefix ;
3236 private CAEXObject .Builder current ;
3337 private CAEXFile .Builder fileBuilder ;
38+ private final AmlDocumentInfo documentInfo ;
3439
35- public AmlGenerator () {
36- this .fileBuilder = CAEXFile .builder ();
37- }
38-
39- public AmlGenerator (CAEXFile .Builder fileBuilder ) {
40- this .fileBuilder = fileBuilder ;
41- }
42-
43- private AmlGenerator (CAEXFile .Builder fileBuilder , CAEXObject .Builder current ) {
40+ private AmlGenerator (AmlDocumentInfo documentInfo , String refSemanticPrefix , CAEXFile .Builder fileBuilder , CAEXObject .Builder current ) {
41+ this .documentInfo = documentInfo ;
42+ this .refSemanticPrefix = refSemanticPrefix ;
4443 this .fileBuilder = fileBuilder ;
4544 this .current = current ;
4645 }
4746
4847 public AmlGenerator with (CAEXObject .Builder current ) {
49- return new AmlGenerator (fileBuilder , current );
48+ return new AmlGenerator (documentInfo , refSemanticPrefix , fileBuilder , current );
5049 }
5150
5251 public void addAdditionalInformation (List <Object > additionalInformation ) {
5352 fileBuilder .addAdditionalInformation (additionalInformation );
5453 }
5554
55+ public static Builder builder () {
56+ return new Builder ();
57+ }
58+
59+ public static class Builder {
60+
61+ private String refSemanticPrefix = DEFAULT_REF_SEMANTIC_PREFIX ;
62+ private CAEXObject .Builder current ;
63+ private CAEXFile .Builder fileBuilder = CAEXFile .builder ();
64+ private AmlDocumentInfo documentInfo = new AmlDocumentInfo ();
65+
66+ public AmlGenerator build () {
67+ return new AmlGenerator (documentInfo , refSemanticPrefix , fileBuilder , current );
68+ }
69+
70+ public Builder refSemanticPrefix (String value ) {
71+ this .refSemanticPrefix = value ;
72+ return this ;
73+ }
74+
75+ public Builder current (CAEXObject .Builder value ) {
76+ this .current = value ;
77+ return this ;
78+ }
79+
80+ public Builder file (CAEXFile .Builder value ) {
81+ this .fileBuilder = value ;
82+ return this ;
83+ }
84+
85+ public Builder documentInfo (AmlDocumentInfo value ) {
86+ this .documentInfo = value ;
87+ return this ;
88+ }
89+ }
90+
91+ public void add (CAEXObject caexObject ) {
92+ if (caexObject == null ) {
93+ return ;
94+ }
95+ if (AttributeType .class .isAssignableFrom (caexObject .getClass ())) {
96+ addAttribute ((AttributeType ) caexObject );
97+ } else if (InternalElementType .class .isAssignableFrom (caexObject .getClass ())) {
98+ addInternalElement ((InternalElementType ) caexObject );
99+ } else {
100+ log .warn ("adding caex object failed because unsupported type '{}'" , caexObject .getClass ());
101+ }
102+ }
103+
56104 public void addAttribute (AttributeType attribute ) {
57105 if (attribute == null ) {
58106 return ;
@@ -125,14 +173,14 @@ public void addInternalElement(InternalElementType internalElement) {
125173 }
126174 }
127175
128- public void appendReferenceTargetInterfaceIfRequired (Object obj , MappingContext context ) {
176+ public void appendReferenceTargetInterfaceIfRequired (Object obj , Aas2AmlMappingContext context ) {
129177 RoleClassType .ExternalInterface referenceTargetInterface = getReferenceTargetInterface (obj , context );
130178 if (referenceTargetInterface != null ) {
131179 addExternalInterface (referenceTargetInterface );
132180 }
133181 }
134182
135- public RoleClassType .ExternalInterface getReferenceTargetInterface (Object obj , MappingContext context ) {
183+ public RoleClassType .ExternalInterface getReferenceTargetInterface (Object obj , Aas2AmlMappingContext context ) {
136184 RoleClassType .ExternalInterface result = null ;
137185 if (obj != null && Referable .class .isAssignableFrom (obj .getClass ())) {
138186 Referable referable = (Referable ) obj ;
@@ -146,4 +194,32 @@ public RoleClassType.ExternalInterface getReferenceTargetInterface(Object obj, M
146194 }
147195 return result ;
148196 }
197+
198+ public InternalElementType .RoleRequirements roleRequirement (String value ) {
199+ return InternalElementType .RoleRequirements .builder ()
200+ .withRefBaseRoleClassPath (documentInfo .getAssetAdministrationShellRoleClassLib () + "/" + value )
201+ .build ();
202+ }
203+
204+ public AttributeType .RefSemantic refSemantic (Class <?> type , String propertyName ) {
205+ return AttributeType .RefSemantic .builder ()
206+ .withCorrespondingAttributePath (refSemanticPrefix + type .getSimpleName () + "/" + propertyName )
207+ .build ();
208+ }
209+
210+ public AttributeType .RefSemantic refSemantic (PropertyDescriptor property ) {
211+ return refSemantic (property .getReadMethod ().getDeclaringClass (), property .getName ());
212+ }
213+
214+ public String refBaseSystemUnitPath (Object value , Aas2AmlMappingContext context ) {
215+ return documentInfo .getAssetAdministrationShellSystemUnitClassLib ()
216+ + "/" + context .getInternalElementNamingStrategy ().getName (
217+ value .getClass (),
218+ value ,
219+ null );
220+ }
221+
222+ public AmlDocumentInfo getDocumentInfo () {
223+ return documentInfo ;
224+ }
149225}
0 commit comments