-
Notifications
You must be signed in to change notification settings - Fork 10
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[WIP] Feature/properties in boundary definitions #113
base: main
Are you sure you want to change the base?
Changes from 5 commits
f2fbee3
c7dd8a2
9d68b3d
7288da7
5aad601
c2f8beb
1b974b6
5f2e739
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -26,11 +26,14 @@ | |
import javax.xml.bind.annotation.XmlAnyAttribute; | ||
import javax.xml.bind.annotation.XmlAnyElement; | ||
import javax.xml.bind.annotation.XmlSeeAlso; | ||
import javax.xml.bind.annotation.XmlTransient; | ||
import javax.xml.bind.annotation.XmlType; | ||
import javax.xml.namespace.QName; | ||
|
||
import org.eclipse.winery.model.tosca.kvproperties.WinerysPropertiesDefinition; | ||
import org.eclipse.winery.model.tosca.visitor.Visitor; | ||
|
||
import com.fasterxml.jackson.annotation.JsonIgnore; | ||
import com.fasterxml.jackson.annotation.JsonInclude; | ||
import io.github.adr.embedded.ADR; | ||
import org.eclipse.jdt.annotation.NonNull; | ||
|
@@ -60,6 +63,7 @@ | |
}) | ||
@JsonInclude(JsonInclude.Include.NON_NULL) | ||
public abstract class TExtensibleElements { | ||
public static final String NS_SUFFIX_PROPERTIESDEFINITION_WINERY = "propertiesdefinition/winery"; | ||
|
||
protected List<TDocumentation> documentation; | ||
|
||
|
@@ -68,7 +72,7 @@ public abstract class TExtensibleElements { | |
|
||
@XmlAnyAttribute | ||
@NonNull | ||
private Map<QName, String> otherAttributes = new HashMap<QName, String>(); | ||
private Map<QName, String> otherAttributes = new HashMap<>(); | ||
|
||
public TExtensibleElements() { | ||
} | ||
|
@@ -101,19 +105,59 @@ public int hashCode() { | |
@NonNull | ||
public List<TDocumentation> getDocumentation() { | ||
if (documentation == null) { | ||
documentation = new ArrayList<TDocumentation>(); | ||
documentation = new ArrayList<>(); | ||
} | ||
return this.documentation; | ||
} | ||
|
||
@NonNull | ||
public List<Object> getAny() { | ||
if (any == null) { | ||
any = new ArrayList<Object>(); | ||
any = new ArrayList<>(); | ||
} | ||
return this.any; | ||
} | ||
|
||
/** | ||
* This is a special method for Winery. Winery allows to define a property definition by specifying name/type | ||
* values. Instead of parsing the extensible elements returned TDefinitions, this method is a convenience method to | ||
* access this information | ||
* | ||
* @return a WinerysPropertiesDefinition object, which includes a map of name/type-pairs denoting the associated | ||
* property definitions. A default element name and namespace is added if it is not defined in the underlying XML. | ||
* null if no Winery specific KV properties are defined for the given entity type | ||
*/ | ||
@XmlTransient | ||
@JsonIgnore | ||
public WinerysPropertiesDefinition getWinerysPropertiesDefinition() { | ||
// similar implementation as org.eclipse.winery.repository.resources.entitytypes.properties.PropertiesDefinitionResource.getListFromEntityType(TEntityType) | ||
WinerysPropertiesDefinition res = null; | ||
for (Object o : this.getAny()) { | ||
if (o instanceof WinerysPropertiesDefinition) { | ||
res = (WinerysPropertiesDefinition) o; | ||
} | ||
} | ||
|
||
if (res != null) { | ||
// we put defaults if elementname and namespace have not been set | ||
setWPDElement(res); | ||
setWPDNamespace(res); | ||
} | ||
|
||
return res; | ||
} | ||
|
||
protected void setWPDElement(WinerysPropertiesDefinition res) { | ||
if (res.getElementName() == null) { | ||
res.setElementName("Properties"); | ||
} | ||
} | ||
|
||
protected void setWPDNamespace(WinerysPropertiesDefinition res) { | ||
// bo be overridden by subclasses willing to use getWinerysPropertiesDefinition() | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. should this be marked as There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I was not sure if all TExtensibleElements actually need WPD support, since initially only TEntityType supported them. This is an attempt to reuse the method in both TEntityTypes and TServiceTemplates without duplicating it and at the same time without putting additional requirements on TExtensibleElements. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I don't think you need to have this "abstract" method. The implementations in both are similar and you could check if the current class is an There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. yeah, that's a good solution if a namespace has to be set in the same way for both TEntityType and TServiceTemplate (currently setWPDNamespace is identical, so I assume there's no need for different implementations) |
||
// Template method pattern | ||
} | ||
|
||
@NonNull | ||
public Map<QName, String> getOtherAttributes() { | ||
return otherAttributes; | ||
|
@@ -254,6 +298,5 @@ public T addOtherAttributes(QName key, String value) { | |
|
||
@ADR(11) | ||
public abstract T self(); | ||
|
||
} | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
You could actually implement it on this level since the methods are identical. To be able to use the
getTargetNamespace
method, you can check if the current object is aninstance of HasTargetNamespace
and cast it. Otherwise, you could use a default namespace.