/*
* Copyright 2014 JBoss Inc
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.artificer.repository.hibernate.data;
import org.artificer.common.ArtifactType;
import org.artificer.common.ArtificerConstants;
import org.artificer.common.visitors.ArtifactVisitorHelper;
import org.artificer.common.visitors.HierarchicalArtifactVisitor;
import org.artificer.repository.hibernate.HibernateEntityFactory;
import org.artificer.repository.hibernate.entity.ArtificerArtifact;
import org.artificer.repository.hibernate.entity.ArtificerComment;
import org.artificer.repository.hibernate.entity.ArtificerDocumentArtifact;
import org.artificer.repository.hibernate.entity.ArtificerProperty;
import org.artificer.repository.hibernate.entity.ArtificerRelationship;
import org.artificer.common.query.RelationshipType;
import org.artificer.repository.hibernate.entity.ArtificerTarget;
import org.oasis_open.docs.s_ramp.ns.s_ramp_v1.Actor;
import org.oasis_open.docs.s_ramp.ns.s_ramp_v1.ActorTarget;
import org.oasis_open.docs.s_ramp.ns.s_ramp_v1.AttributeDeclaration;
import org.oasis_open.docs.s_ramp.ns.s_ramp_v1.BaseArtifactTarget;
import org.oasis_open.docs.s_ramp.ns.s_ramp_v1.BaseArtifactType;
import org.oasis_open.docs.s_ramp.ns.s_ramp_v1.Binding;
import org.oasis_open.docs.s_ramp.ns.s_ramp_v1.BindingOperation;
import org.oasis_open.docs.s_ramp.ns.s_ramp_v1.BindingOperationFaultTarget;
import org.oasis_open.docs.s_ramp.ns.s_ramp_v1.BindingOperationInputTarget;
import org.oasis_open.docs.s_ramp.ns.s_ramp_v1.BindingOperationOutputTarget;
import org.oasis_open.docs.s_ramp.ns.s_ramp_v1.BindingOperationTarget;
import org.oasis_open.docs.s_ramp.ns.s_ramp_v1.BindingTarget;
import org.oasis_open.docs.s_ramp.ns.s_ramp_v1.Comment;
import org.oasis_open.docs.s_ramp.ns.s_ramp_v1.ComplexTypeDeclaration;
import org.oasis_open.docs.s_ramp.ns.s_ramp_v1.DerivedArtifactTarget;
import org.oasis_open.docs.s_ramp.ns.s_ramp_v1.DerivedArtifactType;
import org.oasis_open.docs.s_ramp.ns.s_ramp_v1.DocumentArtifactEnum;
import org.oasis_open.docs.s_ramp.ns.s_ramp_v1.DocumentArtifactTarget;
import org.oasis_open.docs.s_ramp.ns.s_ramp_v1.DocumentArtifactType;
import org.oasis_open.docs.s_ramp.ns.s_ramp_v1.EffectTarget;
import org.oasis_open.docs.s_ramp.ns.s_ramp_v1.Element;
import org.oasis_open.docs.s_ramp.ns.s_ramp_v1.ElementDeclaration;
import org.oasis_open.docs.s_ramp.ns.s_ramp_v1.ElementDeclarationTarget;
import org.oasis_open.docs.s_ramp.ns.s_ramp_v1.ElementTarget;
import org.oasis_open.docs.s_ramp.ns.s_ramp_v1.EventTarget;
import org.oasis_open.docs.s_ramp.ns.s_ramp_v1.ExtendedArtifactType;
import org.oasis_open.docs.s_ramp.ns.s_ramp_v1.ExtendedDocument;
import org.oasis_open.docs.s_ramp.ns.s_ramp_v1.Fault;
import org.oasis_open.docs.s_ramp.ns.s_ramp_v1.FaultTarget;
import org.oasis_open.docs.s_ramp.ns.s_ramp_v1.InformationTypeTarget;
import org.oasis_open.docs.s_ramp.ns.s_ramp_v1.Message;
import org.oasis_open.docs.s_ramp.ns.s_ramp_v1.MessageTarget;
import org.oasis_open.docs.s_ramp.ns.s_ramp_v1.NamedWsdlDerivedArtifactType;
import org.oasis_open.docs.s_ramp.ns.s_ramp_v1.Operation;
import org.oasis_open.docs.s_ramp.ns.s_ramp_v1.OperationInput;
import org.oasis_open.docs.s_ramp.ns.s_ramp_v1.OperationInputTarget;
import org.oasis_open.docs.s_ramp.ns.s_ramp_v1.OperationOutput;
import org.oasis_open.docs.s_ramp.ns.s_ramp_v1.OperationOutputTarget;
import org.oasis_open.docs.s_ramp.ns.s_ramp_v1.OperationTarget;
import org.oasis_open.docs.s_ramp.ns.s_ramp_v1.OrchestrationProcessTarget;
import org.oasis_open.docs.s_ramp.ns.s_ramp_v1.OrchestrationTarget;
import org.oasis_open.docs.s_ramp.ns.s_ramp_v1.Organization;
import org.oasis_open.docs.s_ramp.ns.s_ramp_v1.Part;
import org.oasis_open.docs.s_ramp.ns.s_ramp_v1.PartTarget;
import org.oasis_open.docs.s_ramp.ns.s_ramp_v1.Policy;
import org.oasis_open.docs.s_ramp.ns.s_ramp_v1.PolicySubjectTarget;
import org.oasis_open.docs.s_ramp.ns.s_ramp_v1.PolicyTarget;
import org.oasis_open.docs.s_ramp.ns.s_ramp_v1.Port;
import org.oasis_open.docs.s_ramp.ns.s_ramp_v1.PortTarget;
import org.oasis_open.docs.s_ramp.ns.s_ramp_v1.PortType;
import org.oasis_open.docs.s_ramp.ns.s_ramp_v1.PortTypeTarget;
import org.oasis_open.docs.s_ramp.ns.s_ramp_v1.Property;
import org.oasis_open.docs.s_ramp.ns.s_ramp_v1.Relationship;
import org.oasis_open.docs.s_ramp.ns.s_ramp_v1.Service;
import org.oasis_open.docs.s_ramp.ns.s_ramp_v1.ServiceContract;
import org.oasis_open.docs.s_ramp.ns.s_ramp_v1.ServiceContractTarget;
import org.oasis_open.docs.s_ramp.ns.s_ramp_v1.ServiceEndpoint;
import org.oasis_open.docs.s_ramp.ns.s_ramp_v1.ServiceImplementationModelTarget;
import org.oasis_open.docs.s_ramp.ns.s_ramp_v1.ServiceImplementationModelType;
import org.oasis_open.docs.s_ramp.ns.s_ramp_v1.ServiceInstance;
import org.oasis_open.docs.s_ramp.ns.s_ramp_v1.ServiceInstanceTarget;
import org.oasis_open.docs.s_ramp.ns.s_ramp_v1.ServiceInterface;
import org.oasis_open.docs.s_ramp.ns.s_ramp_v1.ServiceInterfaceTarget;
import org.oasis_open.docs.s_ramp.ns.s_ramp_v1.ServiceOperation;
import org.oasis_open.docs.s_ramp.ns.s_ramp_v1.ServiceOperationTarget;
import org.oasis_open.docs.s_ramp.ns.s_ramp_v1.ServiceTarget;
import org.oasis_open.docs.s_ramp.ns.s_ramp_v1.SimpleTypeDeclaration;
import org.oasis_open.docs.s_ramp.ns.s_ramp_v1.SoaModelType;
import org.oasis_open.docs.s_ramp.ns.s_ramp_v1.SoapAddress;
import org.oasis_open.docs.s_ramp.ns.s_ramp_v1.SoapBinding;
import org.oasis_open.docs.s_ramp.ns.s_ramp_v1.Target;
import org.oasis_open.docs.s_ramp.ns.s_ramp_v1.TaskTarget;
import org.oasis_open.docs.s_ramp.ns.s_ramp_v1.WsdlDerivedArtifactType;
import org.oasis_open.docs.s_ramp.ns.s_ramp_v1.WsdlDocument;
import org.oasis_open.docs.s_ramp.ns.s_ramp_v1.WsdlDocumentTarget;
import org.oasis_open.docs.s_ramp.ns.s_ramp_v1.WsdlExtensionTarget;
import org.oasis_open.docs.s_ramp.ns.s_ramp_v1.WsdlService;
import org.oasis_open.docs.s_ramp.ns.s_ramp_v1.XmlDocument;
import org.oasis_open.docs.s_ramp.ns.s_ramp_v1.XsdDocument;
import org.oasis_open.docs.s_ramp.ns.s_ramp_v1.XsdDocumentTarget;
import org.oasis_open.docs.s_ramp.ns.s_ramp_v1.XsdTypeTarget;
import javax.xml.datatype.XMLGregorianCalendar;
import javax.xml.namespace.QName;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
/**
* Maps ORM entities to S-RAMP artifacts.
*
* @author Brett Meyer.
*/
public class HibernateEntityToSrampVisitor extends HierarchicalArtifactVisitor {
private final ArtificerArtifact artificerArtifact;
private final ArtifactType artifactType;
private final boolean includeAssociations;
public static BaseArtifactType visit(ArtificerArtifact artificerArtifact,
boolean includeAssociations) throws Exception {
return visit(artificerArtifact,
ArtifactType.valueOf(artificerArtifact.getType(), artificerArtifact.isDocument()), includeAssociations);
}
public static BaseArtifactType visit(ArtificerArtifact artificerArtifact, ArtifactType artifactType,
boolean includeAssociations) throws Exception {
if (artifactType.isExtendedType() && artificerArtifact.isDocument()) {
artifactType = ArtifactType.ExtendedDocument(artifactType.getExtendedType());
}
BaseArtifactType srampArtifact = artifactType.newArtifactInstance();
HibernateEntityToSrampVisitor visitor = new HibernateEntityToSrampVisitor(artificerArtifact, artifactType,
includeAssociations);
ArtifactVisitorHelper.visitArtifact(visitor, srampArtifact);
visitor.throwError();
return srampArtifact;
}
public HibernateEntityToSrampVisitor(ArtificerArtifact artificerArtifact, ArtifactType artifactType,
boolean includeAssociations) {
this.artificerArtifact = artificerArtifact;
this.artifactType = artifactType;
this.includeAssociations = includeAssociations;
}
@Override
protected void visitBase(BaseArtifactType srampArtifact) {
super.visitBase(srampArtifact);
try {
srampArtifact.setDescription(artificerArtifact.getDescription());
srampArtifact.setArtifactType(artifactType.getArtifactType().getApiType());
srampArtifact.setCreatedBy(artificerArtifact.getCreatedBy().getUsername());
XMLGregorianCalendar createdTimestamp = HibernateEntityFactory.calendar(artificerArtifact.getCreatedBy().getLastActionTime());
srampArtifact.setCreatedTimestamp(createdTimestamp);
srampArtifact.setLastModifiedBy(artificerArtifact.getModifiedBy().getUsername());
XMLGregorianCalendar modifiedTimestamp = HibernateEntityFactory.calendar(artificerArtifact.getModifiedBy().getLastActionTime());
srampArtifact.setLastModifiedTimestamp(modifiedTimestamp);
srampArtifact.setName(artificerArtifact.getName());
srampArtifact.setUuid(artificerArtifact.getUuid());
srampArtifact.setVersion(artificerArtifact.getVersion());
// Map in all the s-ramp extended properties.
for (ArtificerProperty artificerProperty : artificerArtifact.getProperties()) {
if (artificerProperty.isCustom()) {
Property srampProp = new Property();
srampProp.setPropertyName(artificerProperty.getKey());
srampProp.setPropertyValue(artificerProperty.getValue());
srampArtifact.getProperty().add(srampProp);
}
}
if (includeAssociations) {
// if expanded from a document
if (artificerArtifact.isExpandedFromArchive()) {
srampArtifact.getOtherAttributes().put(ArtificerConstants.ARTIFICER_EXPANDED_FROM_ARCHIVE_UUID_QNAME,
artificerArtifact.getExpandedFrom().getUuid());
srampArtifact.getOtherAttributes().put(ArtificerConstants.ARTIFICER_EXPANDED_FROM_ARCHIVE_PATH_QNAME,
artificerArtifact.getExpandedFromArchivePath());
}
// Map in the classifications
for (String uri : artificerArtifact.getClassifiers()) {
srampArtifact.getClassifiedBy().add(uri);
}
visitGenericRelationships(srampArtifact);
visitComments(srampArtifact);
}
} catch (Exception e) {
error = e;
}
}
private void visitGenericRelationships(BaseArtifactType srampArtifact) throws Exception {
for (ArtificerRelationship artificerRelationship : artificerArtifact.getRelationships()) {
if (artificerRelationship.getType() == RelationshipType.GENERIC) {
Relationship srampRelationship = new Relationship();
srampRelationship.setRelationshipType(artificerRelationship.getName());
for (ArtificerTarget artificerTarget : artificerRelationship.getTargets()) {
Target srampTarget = createTarget(Target.class, artificerTarget);
srampRelationship.getRelationshipTarget().add(srampTarget);
}
setOtherAttributes(artificerRelationship.getOtherAttributes(), srampRelationship.getOtherAttributes());
srampArtifact.getRelationship().add(srampRelationship);
}
}
}
private void setOtherAttributes(Map<String, String> artificerAttributes, Map<QName, String> srampAttributes)
throws Exception {
for (String key : artificerAttributes.keySet()) {
srampAttributes.put(QName.valueOf(key), artificerAttributes.get(key));
}
}
private void visitComments(BaseArtifactType srampArtifact) throws Exception {
for (ArtificerComment artificerComment : artificerArtifact.getComments()) {
Comment srampComment = new Comment();
srampComment.setCreatedBy(artificerComment.getCreatedBy().getUsername());
XMLGregorianCalendar createdTimestamp = HibernateEntityFactory.calendar(artificerComment.getCreatedBy().getLastActionTime());
srampComment.setCreatedTimestamp(createdTimestamp);
srampComment.setText(artificerComment.getText());
srampArtifact.getComment().add(srampComment);
}
}
@Override
protected void visitDerived(DerivedArtifactType srampArtifact) {
super.visitDerived(srampArtifact);
try {
if (includeAssociations) {
ArtificerArtifact derivedFrom = artificerArtifact.getDerivedFrom();
if (derivedFrom != null) {
DocumentArtifactTarget target = new DocumentArtifactTarget();
ArtifactType derivedFromType = ArtifactType.valueOf(derivedFrom.getType(), derivedFrom.isDocument());
DocumentArtifactEnum documentArtifactEnum = DocumentArtifactEnum.fromValue(derivedFromType.getArtifactType().getApiType());
target.setArtifactType(documentArtifactEnum);
target.setValue(derivedFrom.getUuid());
srampArtifact.setRelatedDocument(target);
}
}
} catch (Exception e) {
throw new RuntimeException(e);
}
}
/**
* @see org.artificer.common.visitors.HierarchicalArtifactVisitor#visitWsdlDerived(org.oasis_open.docs.s_ramp.ns.s_ramp_v1.WsdlDerivedArtifactType)
*/
@Override
protected void visitWsdlDerived(WsdlDerivedArtifactType artifact) {
super.visitWsdlDerived(artifact);
artifact.setNamespace(getProperty("namespace"));
try {
artifact.getExtension().addAll(getRelationships(
"extension", artificerArtifact, WsdlExtensionTarget.class));
} catch (Exception e) {
throw new RuntimeException(e);
}
}
/**
* @see org.artificer.common.visitors.HierarchicalArtifactVisitor#visitNamedWsdlDerived(org.oasis_open.docs.s_ramp.ns.s_ramp_v1.NamedWsdlDerivedArtifactType)
*/
@Override
protected void visitNamedWsdlDerived(NamedWsdlDerivedArtifactType artifact) {
super.visitNamedWsdlDerived(artifact);
artifact.setNCName(getProperty("ncName"));
}
/**
* @see org.artificer.common.visitors.HierarchicalArtifactVisitor#visitDocument(org.oasis_open.docs.s_ramp.ns.s_ramp_v1.DocumentArtifactType)
*/
@Override
protected void visitDocument(DocumentArtifactType artifact) {
super.visitDocument(artifact);
ArtificerDocumentArtifact artificerDocumentArtifact = (ArtificerDocumentArtifact) artificerArtifact;
artifact.setContentSize(artificerDocumentArtifact.getContentSize());
artifact.setContentType(artificerDocumentArtifact.getMimeType());
artifact.setContentHash(artificerDocumentArtifact.getContentHash());
}
/**
* @see org.artificer.common.visitors.HierarchicalArtifactVisitor#visitXmlDocument(org.oasis_open.docs.s_ramp.ns.s_ramp_v1.XmlDocument)
*/
@Override
protected void visitXmlDocument(XmlDocument artifact) {
super.visitXmlDocument(artifact);
artifact.setContentEncoding(artificerArtifact.getContentEncoding());
}
/**
* @see org.artificer.common.visitors.HierarchicalArtifactVisitor#visitExtended(org.oasis_open.docs.s_ramp.ns.s_ramp_v1.ExtendedArtifactType)
*/
@Override
protected void visitExtended(ExtendedArtifactType artifact) {
super.visitExtended(artifact);
String extendedType = artificerArtifact.getType();
boolean extendedDerived = artificerArtifact.isDerived();
artifact.setExtendedType(extendedType);
artifact.getOtherAttributes().put(ArtificerConstants.SRAMP_DERIVED_QNAME, extendedDerived + "");
}
/**
* @see org.artificer.common.visitors.HierarchicalArtifactVisitor#visitExtendedDocument(org.oasis_open.docs.s_ramp.ns.s_ramp_v1.ExtendedDocument)
*/
@Override
protected void visitExtendedDocument(ExtendedDocument artifact) {
super.visitExtendedDocument(artifact);
ArtificerDocumentArtifact artificerDocumentArtifact = (ArtificerDocumentArtifact) artificerArtifact;
String extendedType = artificerDocumentArtifact.getType();
String contentType = artificerDocumentArtifact.getMimeType();
long contentLength = artificerDocumentArtifact.getContentSize();
artifact.setExtendedType(extendedType);
if (contentType != null) {
artifact.getOtherAttributes().put(ArtificerConstants.SRAMP_CONTENT_SIZE_QNAME, contentLength + "");
artifact.getOtherAttributes().put(ArtificerConstants.SRAMP_CONTENT_TYPE_QNAME, contentType);
}
}
@Override
protected void visitServiceImplementation(ServiceImplementationModelType artifact) {
super.visitServiceImplementation(artifact);
try {
artifact.getDocumentation().addAll(getRelationships(
"documentation", artificerArtifact, DocumentArtifactTarget.class));
} catch (Exception e) {
throw new RuntimeException(e);
}
}
@Override
protected void visitSoa(SoaModelType artifact) {
super.visitSoa(artifact);
try {
artifact.getDocumentation().addAll(getRelationships(
"documentation", artificerArtifact, DocumentArtifactTarget.class));
} catch (Exception e) {
throw new RuntimeException(e);
}
}
@Override
protected void visitElement(Element artifact) {
super.visitElement(artifact);
try {
artifact.getRepresents().addAll(getRelationships(
"represents", artificerArtifact, ElementTarget.class));
artifact.getUses().addAll(getRelationships(
"uses", artificerArtifact, ElementTarget.class));
artifact.getPerforms().addAll(getRelationships(
"performs", artificerArtifact, ServiceTarget.class));
artifact.setDirectsOrchestration(getRelationship(
"directsOrchestration", artificerArtifact, OrchestrationTarget.class));
artifact.setDirectsOrchestrationProcess(getRelationship(
"directsOrchestrationProcess", artificerArtifact, OrchestrationProcessTarget.class));
artifact.getGenerates().addAll(getRelationships(
"generates", artificerArtifact, EventTarget.class));
artifact.getRespondsTo().addAll(getRelationships(
"respondsTo", artificerArtifact, EventTarget.class));
} catch (Exception e) {
throw new RuntimeException(e);
}
}
@Override
protected void visitActor(Actor artifact) {
super.visitActor(artifact);
try {
artifact.getDoes().addAll(getRelationships(
"does", artificerArtifact, TaskTarget.class));
artifact.getSetsPolicy().addAll(getRelationships(
"setsPolicy", artificerArtifact, PolicyTarget.class));
} catch (Exception e) {
throw new RuntimeException(e);
}
}
/**
* @see org.artificer.common.visitors.HierarchicalArtifactVisitor#visit(org.oasis_open.docs.s_ramp.ns.s_ramp_v1.XsdDocument)
*/
@Override
public void visit(XsdDocument artifact) {
super.visit(artifact);
artifact.setTargetNamespace(getProperty("targetNamespace"));
try {
artifact.getImportedXsds().addAll(getRelationships(
"importedXsds", artificerArtifact, XsdDocumentTarget.class));
artifact.getIncludedXsds().addAll(getRelationships(
"includedXsds", artificerArtifact, XsdDocumentTarget.class));
artifact.getRedefinedXsds().addAll(getRelationships(
"redefinedXsds", artificerArtifact, XsdDocumentTarget.class));
} catch (Exception e) {
throw new RuntimeException(e);
}
}
/**
* @see org.artificer.common.visitors.HierarchicalArtifactVisitor#visit(org.oasis_open.docs.s_ramp.ns.s_ramp_v1.AttributeDeclaration)
*/
@Override
public void visit(AttributeDeclaration artifact) {
super.visit(artifact);
artifact.setNamespace(getProperty("namespace"));
}
/**
* @see org.artificer.common.visitors.HierarchicalArtifactVisitor#visit(org.oasis_open.docs.s_ramp.ns.s_ramp_v1.ComplexTypeDeclaration)
*/
@Override
public void visit(ComplexTypeDeclaration artifact) {
super.visit(artifact);
artifact.setNamespace(getProperty("namespace"));
}
/**
* @see org.artificer.common.visitors.HierarchicalArtifactVisitor#visit(org.oasis_open.docs.s_ramp.ns.s_ramp_v1.ElementDeclaration)
*/
@Override
public void visit(ElementDeclaration artifact) {
super.visit(artifact);
artifact.setNamespace(getProperty("namespace"));
}
/**
* @see org.artificer.common.visitors.HierarchicalArtifactVisitor#visit(org.oasis_open.docs.s_ramp.ns.s_ramp_v1.SimpleTypeDeclaration)
*/
@Override
public void visit(SimpleTypeDeclaration artifact) {
super.visit(artifact);
artifact.setNamespace(getProperty("namespace"));
}
/**
* @see org.artificer.common.visitors.HierarchicalArtifactVisitor#visit(org.oasis_open.docs.s_ramp.ns.s_ramp_v1.WsdlDocument)
*/
@Override
public void visit(WsdlDocument artifact) {
super.visit(artifact);
artifact.setTargetNamespace(getProperty("targetNamespace"));
try {
artifact.getImportedXsds().addAll(getRelationships(
"importedXsds", artificerArtifact, XsdDocumentTarget.class));
artifact.getIncludedXsds().addAll(getRelationships(
"includedXsds", artificerArtifact, XsdDocumentTarget.class));
artifact.getRedefinedXsds().addAll(getRelationships(
"redefinedXsds", artificerArtifact, XsdDocumentTarget.class));
artifact.getImportedWsdls().addAll(getRelationships(
"importedWsdls", artificerArtifact, WsdlDocumentTarget.class));
} catch (Exception e) {
throw new RuntimeException(e);
}
}
/**
* @see org.artificer.common.visitors.HierarchicalArtifactVisitor#visit(org.oasis_open.docs.s_ramp.ns.s_ramp_v1.Message)
*/
@Override
public void visit(Message artifact) {
super.visit(artifact);
try {
artifact.getPart().addAll(getRelationships(
"part", artificerArtifact, PartTarget.class));
} catch (Exception e) {
throw new RuntimeException(e);
}
}
/**
* @see org.artificer.common.visitors.HierarchicalArtifactVisitor#visit(org.oasis_open.docs.s_ramp.ns.s_ramp_v1.Part)
*/
@Override
public void visit(Part artifact) {
super.visit(artifact);
try {
artifact.setElement(getRelationship(
"element", artificerArtifact, ElementDeclarationTarget.class));
artifact.setType(getRelationship(
"type", artificerArtifact, XsdTypeTarget.class));
} catch (Exception e) {
throw new RuntimeException(e);
}
}
/**
* @see org.artificer.common.visitors.HierarchicalArtifactVisitor#visit(org.oasis_open.docs.s_ramp.ns.s_ramp_v1.PortType)
*/
@Override
public void visit(PortType artifact) {
super.visit(artifact);
try {
artifact.getOperation().addAll(getRelationships(
"operation", artificerArtifact, OperationTarget.class));
} catch (Exception e) {
throw new RuntimeException(e);
}
}
/**
* @see org.artificer.common.visitors.HierarchicalArtifactVisitor#visit(org.oasis_open.docs.s_ramp.ns.s_ramp_v1.Operation)
*/
@Override
public void visit(Operation artifact) {
super.visit(artifact);
try {
artifact.setInput(getRelationship(
"input", artificerArtifact, OperationInputTarget.class));
artifact.setOutput(getRelationship(
"output", artificerArtifact, OperationOutputTarget.class));
artifact.getFault().addAll(getRelationships(
"fault", artificerArtifact, FaultTarget.class));
} catch (Exception e) {
throw new RuntimeException(e);
}
}
/**
* @see org.artificer.common.visitors.HierarchicalArtifactVisitor#visit(org.oasis_open.docs.s_ramp.ns.s_ramp_v1.OperationInput)
*/
@Override
public void visit(OperationInput artifact) {
super.visit(artifact);
try {
artifact.setMessage(getRelationship(
"message", artificerArtifact, MessageTarget.class));
} catch (Exception e) {
throw new RuntimeException(e);
}
}
/**
* @see org.artificer.common.visitors.HierarchicalArtifactVisitor#visit(org.oasis_open.docs.s_ramp.ns.s_ramp_v1.OperationOutput)
*/
@Override
public void visit(OperationOutput artifact) {
super.visit(artifact);
try {
artifact.setMessage(getRelationship(
"message", artificerArtifact, MessageTarget.class));
} catch (Exception e) {
throw new RuntimeException(e);
}
}
/**
* @see org.artificer.common.visitors.HierarchicalArtifactVisitor#visit(org.oasis_open.docs.s_ramp.ns.s_ramp_v1.Fault)
*/
@Override
public void visit(Fault artifact) {
super.visit(artifact);
try {
artifact.setMessage(getRelationship(
"message", artificerArtifact, MessageTarget.class));
} catch (Exception e) {
throw new RuntimeException(e);
}
}
/**
* @see org.artificer.common.visitors.HierarchicalArtifactVisitor#visit(org.oasis_open.docs.s_ramp.ns.s_ramp_v1.Binding)
*/
@Override
public void visit(Binding artifact) {
super.visit(artifact);
try {
artifact.getBindingOperation().addAll(getRelationships(
"bindingOperation", artificerArtifact, BindingOperationTarget.class));
artifact.setPortType(getRelationship(
"portType", artificerArtifact, PortTypeTarget.class));
} catch (Exception e) {
throw new RuntimeException(e);
}
}
/**
* @see org.artificer.common.visitors.HierarchicalArtifactVisitor#visit(org.oasis_open.docs.s_ramp.ns.s_ramp_v1.SoapBinding)
*/
@Override
public void visit(SoapBinding artifact) {
super.visit(artifact);
artifact.setStyle(getProperty("style"));
artifact.setTransport(getProperty("transport"));
}
/**
* @see org.artificer.common.visitors.HierarchicalArtifactVisitor#visit(org.oasis_open.docs.s_ramp.ns.s_ramp_v1.BindingOperation)
*/
@Override
public void visit(BindingOperation artifact) {
super.visit(artifact);
try {
artifact.setInput(getRelationship(
"input", artificerArtifact, BindingOperationInputTarget.class));
artifact.setOutput(getRelationship(
"output", artificerArtifact, BindingOperationOutputTarget.class));
artifact.getFault().addAll(getRelationships(
"fault", artificerArtifact, BindingOperationFaultTarget.class));
artifact.setOperation(getRelationship(
"operation", artificerArtifact, OperationTarget.class));
} catch (Exception e) {
throw new RuntimeException(e);
}
}
/**
* @see org.artificer.common.visitors.HierarchicalArtifactVisitor#visit(org.oasis_open.docs.s_ramp.ns.s_ramp_v1.WsdlService)
*/
@Override
public void visit(WsdlService artifact) {
super.visit(artifact);
try {
artifact.getPort().addAll(getRelationships(
"port", artificerArtifact, PortTarget.class));
} catch (Exception e) {
throw new RuntimeException(e);
}
}
/**
* @see org.artificer.common.visitors.HierarchicalArtifactVisitor#visit(org.oasis_open.docs.s_ramp.ns.s_ramp_v1.Port)
*/
@Override
public void visit(Port artifact) {
super.visit(artifact);
try {
artifact.setBinding(getRelationship(
"binding", artificerArtifact, BindingTarget.class));
} catch (Exception e) {
throw new RuntimeException(e);
}
}
/**
* @see org.artificer.common.visitors.HierarchicalArtifactVisitor#visit(org.oasis_open.docs.s_ramp.ns.s_ramp_v1.SoapAddress)
*/
@Override
public void visit(SoapAddress artifact) {
super.visit(artifact);
artifact.setSoapLocation(getProperty("soapLocation"));
}
@Override
public void visit(ServiceEndpoint artifact) {
super.visit(artifact);
try {
artifact.setEndpointDefinedBy(getRelationship(
"endpointDefinedBy", artificerArtifact, DerivedArtifactTarget.class));
artifact.setUrl(getProperty("url"));
// These have to currently be added on the subclass visitors, as they're not currently
// on ServiceImplementationModelType itself.
artifact.setEnd(getProperty("end"));
} catch (Exception e) {
throw new RuntimeException(e);
}
}
@Override
public void visit(ServiceInstance artifact) {
super.visit(artifact);
try {
artifact.getDescribedBy().addAll(getRelationships(
"describedBy", artificerArtifact, BaseArtifactTarget.class));
artifact.getUses().addAll(getRelationships(
"uses", artificerArtifact, BaseArtifactTarget.class));
// These have to currently be added on the subclass visitors, as they're not currently
// on ServiceImplementationModelType itself.
artifact.setEnd(getProperty("end"));
} catch (Exception e) {
throw new RuntimeException(e);
}
}
@Override
public void visit(ServiceOperation artifact) {
super.visit(artifact);
try {
artifact.setOperationDefinedBy(getRelationship(
"operationDefinedBy", artificerArtifact, DerivedArtifactTarget.class));
// These have to currently be added on the subclass visitors, as they're not currently
// on ServiceImplementationModelType itself.
artifact.setEnd(getProperty("end"));
} catch (Exception e) {
throw new RuntimeException(e);
}
}
@Override
public void visit(Policy artifact) {
super.visit(artifact);
try {
artifact.getAppliesTo().addAll(getRelationships(
"appliesTo", artificerArtifact, PolicySubjectTarget.class));
} catch (Exception e) {
throw new RuntimeException(e);
}
}
@Override
public void visit(ServiceInterface artifact) {
super.visit(artifact);
try {
artifact.setInterfaceDefinedBy(getRelationship(
"interfaceDefinedBy", artificerArtifact, DerivedArtifactTarget.class));
artifact.setHasOperation(getRelationship(
"hasOperation", artificerArtifact, ServiceOperationTarget.class));
artifact.getHasOutput().addAll(getRelationships(
"hasOutput", artificerArtifact, InformationTypeTarget.class));
artifact.getHasInput().addAll(getRelationships(
"hasInput", artificerArtifact, InformationTypeTarget.class));
artifact.getIsInterfaceOf().addAll(getRelationships(
"isInterfaceOf", artificerArtifact, ServiceTarget.class));
} catch (Exception e) {
throw new RuntimeException(e);
}
}
@Override
public void visit(ServiceContract artifact) {
super.visit(artifact);
try {
artifact.getInvolvesParty().addAll(getRelationships(
"involvesParty", artificerArtifact, ActorTarget.class));
artifact.getSpecifies().addAll(getRelationships(
"specifies", artificerArtifact, EffectTarget.class));
} catch (Exception e) {
throw new RuntimeException(e);
}
}
@Override
public void visit(Organization artifact) {
super.visit(artifact);
try {
artifact.getProvides().addAll(getRelationships(
"provides", artificerArtifact, ServiceImplementationModelTarget.class));
} catch (Exception e) {
throw new RuntimeException(e);
}
}
@Override
public void visit(Service artifact) {
super.visit(artifact);
try {
artifact.getHasContract().addAll(getRelationships(
"hasContract", artificerArtifact, ServiceContractTarget.class));
artifact.getHasInterface().addAll(getRelationships(
"hasInterface", artificerArtifact, ServiceInterfaceTarget.class));
artifact.setHasInstance(getRelationship(
"hasInstance", artificerArtifact, ServiceInstanceTarget.class));
} catch (Exception e) {
throw new RuntimeException(e);
}
}
private String getProperty(String key) {
for (ArtificerProperty artificerProperty : artificerArtifact.getProperties()) {
if (artificerProperty.getKey().equals(key)) {
return artificerProperty.getValue();
}
}
return null;
}
private <T> T getRelationship(ArtificerTarget artificerTarget, Class<T> targetClass) throws Exception {
T t = createTarget(targetClass, artificerTarget);
Target target = (Target) t;
// Use reflection to set the 'artifact type' attribute found on
// most (all?) targets. Unfortunately, the method and field are
// redefined in each subclass of Target.
// Get ^^^ changed in the spec!
try {
Method m = targetClass.getMethod("getArtifactType");
Class<?> mc = m.getReturnType();
m = mc.getMethod("valueOf", String.class);
Object o = m.invoke(null, artificerTarget.getTargetType());
m = targetClass.getMethod("setArtifactType", o.getClass());
m.invoke(target, o);
} catch (Exception e) {
// eat it
}
return t;
}
private <T> T getRelationship(String relationshipName, ArtificerArtifact artifact,
Class<T> targetClass) throws Exception {
List<T> rval = getRelationships(relationshipName, artifact, targetClass);
// TODO: Throw something if more than one?
return rval.size() == 0 ? null : rval.get(0);
}
private <T> List<T> getRelationships(String relationshipName, ArtificerArtifact artifact,
Class<T> targetClass) throws Exception {
List<T> rval = new ArrayList<T>();
if (includeAssociations) {
for (ArtificerRelationship relationship : artifact.getRelationships()) {
if (relationshipName.equalsIgnoreCase(relationship.getName())) {
for (ArtificerTarget artificerTarget : relationship.getTargets()) {
T t = getRelationship(artificerTarget, targetClass);
rval.add(t);
}
}
}
}
return rval;
}
private <T> T createTarget(Class<T> targetClass, ArtificerTarget artificerTarget) throws Exception {
T t = targetClass.newInstance();
Target target = (Target) t;
if (artificerTarget != null) {
String targetedUuid = artificerTarget.getTarget().getUuid();
target.setValue(targetedUuid);
String href = String.format("%1$s/%2$s/%3$s", artificerTarget.getTarget().getModel(),
artificerTarget.getTarget().getType(), targetedUuid);
target.setHref(href);
setOtherAttributes(artificerTarget.getOtherAttributes(), target.getOtherAttributes());
}
return t;
}
}