Skip to content

Commit

Permalink
EDMM Import (winery#692)
Browse files Browse the repository at this point in the history
  • Loading branch information
lharzenetter authored Feb 16, 2023
1 parent 231f087 commit bbe59ae
Show file tree
Hide file tree
Showing 32 changed files with 1,051 additions and 192 deletions.
2 changes: 1 addition & 1 deletion .idea/runConfigurations/TOSCA_Mangement_UI.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion .idea/runConfigurations/Topologymodeler.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

20 changes: 10 additions & 10 deletions .idea/runConfigurations/Workflowmodeler.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
Expand Up @@ -41,9 +41,15 @@ static EdmmManager forRepository(IRepository repo) {

void setOneToOneMappings(List<EdmmMappingItem> list);

default Map<QName, EdmmType> getOneToOneMap() {
default Map<QName, EdmmType> getToscaToEdmmMap() {
Map<QName, EdmmType> typeMappings = new HashMap<>();
this.getOneToOneMappings().forEach(m -> typeMappings.put(m.toscaType, m.edmmType));
return typeMappings;
}

default Map<EdmmType, QName> getEdmmOneToToscaMap() {
Map<EdmmType, QName> typeMappings = new HashMap<>();
this.getOneToOneMappings().forEach(m -> typeMappings.put(m.edmmType, m.toscaType));
return typeMappings;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,13 @@
import org.eclipse.winery.repository.backend.IRepository;
import org.eclipse.winery.repository.backend.RepositoryFactory;

public class EdmmUtils {
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public abstract class EdmmUtils {

public static final String IMPORTED_EDMM_NAMESPACE = "https://opentosca.org/edmm/imported/";
private static final Logger LOGGER = LoggerFactory.getLogger(EdmmUtils.class);

public static Map<String, Object> checkToscaLightCompatibility(TServiceTemplate serviceTemplate) {
ToscaLightChecker toscaLightChecker = getToscaLightChecker();
Expand All @@ -53,7 +59,7 @@ public static ToscaLightChecker getToscaLightChecker() {

Map<QName, TRelationshipType> relationshipTypes = repository.getQNameToElementMapping(RelationshipTypeId.class);
Map<QName, TNodeType> nodeTypes = repository.getQNameToElementMapping(NodeTypeId.class);
Map<QName, EdmmType> oneToOneMap = EdmmManager.forRepository(repository).getOneToOneMap();
Map<QName, EdmmType> oneToOneMap = EdmmManager.forRepository(repository).getToscaToEdmmMap();

return new ToscaLightChecker(nodeTypes, relationshipTypes, oneToOneMap);
}
Expand All @@ -69,4 +75,35 @@ public static Map<QName, TServiceTemplate> getAllToscaLightCompliantModels() {
.filter(entry -> toscaLightChecker.isToscaLightCompliant(entry.getValue()))
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
}

public static String normalizeQName(QName qName) {
return qName.toString()
.replace("{", "")
.replace("}", "__")
.replace("/", "--")
.replace(':', '+');
}

/**
* Tries to generate a QName from a type name. Thereby, two underscores are treated as the separation between a
* potential namespace and the ID
*
* @param typeName the name of the EDMM type
* @return a QName
*/
public static QName getQNameFromType(String typeName, String namespaceSuffix) {
if (typeName.contains("__")) {
return QName.valueOf(
"{" +
typeName.replace('+', ':')
.replace("__", "}")
.replace("--", "/")
);
}

return new QName(
IMPORTED_EDMM_NAMESPACE + namespaceSuffix,
typeName
);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
import javax.xml.namespace.QName;

import org.eclipse.winery.common.configuration.Environments;
import org.eclipse.winery.edmm.EdmmUtils;
import org.eclipse.winery.model.tosca.TArtifactTemplate;
import org.eclipse.winery.model.tosca.TDeploymentArtifact;
import org.eclipse.winery.model.tosca.TEntityTemplate;
Expand All @@ -50,10 +51,14 @@
import io.github.edmm.core.parser.ScalarEntity;
import io.github.edmm.core.parser.SequenceEntity;
import io.github.edmm.core.parser.support.DefaultKeys;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import static org.eclipse.winery.model.tosca.constants.Namespaces.TOSCA_WINERY_EXTENSIONS_NAMESPACE;

public class EdmmConverter {
public class EdmmExporter {

private final Logger logger = LoggerFactory.getLogger(EdmmExporter.class);

private final Map<QName, TNodeType> nodeTypes;
private final Map<QName, TRelationshipType> relationshipTypes;
Expand All @@ -63,20 +68,20 @@ public class EdmmConverter {
private final Map<QName, EdmmType> oneToOneMappings;
private final boolean useAbsolutePaths;

public EdmmConverter(Map<QName, TNodeType> nodeTypes, Map<QName, TRelationshipType> relationshipTypes,
Map<QName, TNodeTypeImplementation> nodeTypeImplementations,
Map<QName, TRelationshipTypeImplementation> relationshipTypeImplementations,
Map<QName, TArtifactTemplate> artifactTemplates,
Map<QName, EdmmType> oneToOneMappings) {
public EdmmExporter(Map<QName, TNodeType> nodeTypes, Map<QName, TRelationshipType> relationshipTypes,
Map<QName, TNodeTypeImplementation> nodeTypeImplementations,
Map<QName, TRelationshipTypeImplementation> relationshipTypeImplementations,
Map<QName, TArtifactTemplate> artifactTemplates,
Map<QName, EdmmType> oneToOneMappings) {
this(nodeTypes, relationshipTypes, nodeTypeImplementations, relationshipTypeImplementations, artifactTemplates,
oneToOneMappings, true);
}

public EdmmConverter(Map<QName, TNodeType> nodeTypes, Map<QName, TRelationshipType> relationshipTypes,
Map<QName, TNodeTypeImplementation> nodeTypeImplementations,
Map<QName, TRelationshipTypeImplementation> relationshipTypeImplementations,
Map<QName, TArtifactTemplate> artifactTemplates,
Map<QName, EdmmType> oneToOneMappings, boolean useAbsolutePaths) {
public EdmmExporter(Map<QName, TNodeType> nodeTypes, Map<QName, TRelationshipType> relationshipTypes,
Map<QName, TNodeTypeImplementation> nodeTypeImplementations,
Map<QName, TRelationshipTypeImplementation> relationshipTypeImplementations,
Map<QName, TArtifactTemplate> artifactTemplates,
Map<QName, EdmmType> oneToOneMappings, boolean useAbsolutePaths) {
this.nodeTypes = nodeTypes;
this.relationshipTypes = relationshipTypes;
this.nodeTypeImplementations = nodeTypeImplementations;
Expand All @@ -87,7 +92,10 @@ public EdmmConverter(Map<QName, TNodeType> nodeTypes, Map<QName, TRelationshipTy
}

public EntityGraph transform(TServiceTemplate serviceTemplate) {
assert serviceTemplate.getTopologyTemplate() != null;
if (serviceTemplate.getTopologyTemplate() == null) {
throw new RuntimeException("Service Template does not have a Topology Template!");
}

return this.transform(serviceTemplate.getTopologyTemplate(), ModelUtilities.getOwnerParticipantOfServiceTemplate(serviceTemplate));
}

Expand Down Expand Up @@ -227,11 +235,14 @@ private void createArtifact(TNodeTemplate nodeTemplate, EntityId componentNodeId
path = artifactTemplate.getArtifactReferences().get(0).getReference();
}

EntityId artifactEntityId = artifactsEntityId.extend(
artifact.getArtifactType().getLocalPart().toLowerCase()
);

createPathReferenceEntity(entityGraph, path, artifactEntityId);
if (artifact.getArtifactType() != null) {
EntityId artifactEntityId = artifactsEntityId.extend(
artifact.getArtifactType().getLocalPart().toLowerCase()
);
createPathReferenceEntity(entityGraph, path, artifactEntityId);
} else {
logger.error("Artifact Type of Artifact {} is not set!", artifact.getArtifactRef());
}
}
}
}
Expand All @@ -258,8 +269,7 @@ private void createProperties(TEntityTemplate toscaTemplate, EntityId componentN
EntityId propertiesEntityId = componentNodeId.extend(DefaultKeys.PROPERTIES);
entityGraph.addEntity(new MappingEntity(propertiesEntityId, entityGraph));

if (Objects.nonNull(toscaTemplate.getProperties()) && Objects.nonNull(ModelUtilities.getPropertiesKV(toscaTemplate))) {

if (toscaTemplate.getProperties() != null && ModelUtilities.getPropertiesKV(toscaTemplate) != null) {
ModelUtilities.getPropertiesKV(toscaTemplate)
.forEach((key, value) -> {
EntityId propertyEntityId = propertiesEntityId.extend(key);
Expand All @@ -281,11 +291,10 @@ private EntityId createType(TEntityType toscaType, EntityId typeRoot, EntityGrap
entityGraph.addEntity(new MappingEntity(typeRoot, entityGraph));
}

EntityId typeEntityId;
EdmmType edmmType = oneToOneMappings.get(toscaType.getQName());
typeEntityId = edmmType != null ?
EntityId typeEntityId = edmmType != null ?
typeRoot.extend(edmmType.getValue()) :
typeRoot.extend(this.normalizeQName(toscaType.getQName()));
typeRoot.extend(EdmmUtils.normalizeQName(toscaType.getQName()));

// the type we are trying to create is already there!
if (entityGraph.getEntity(typeEntityId).isPresent()) {
Expand Down Expand Up @@ -382,12 +391,4 @@ private String getImplementationForOperation(TEntityTypeImplementation implement
}
return null;
}

private String normalizeQName(QName qName) {
return qName.toString()
.replace("{", "")
.replace("}", "__")
.replace("/", "")
.replace(':', '_');
}
}
Loading

0 comments on commit bbe59ae

Please sign in to comment.