/*
* Copyright 2013 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.common.visitors;
import org.apache.commons.lang.StringUtils;
import org.artificer.common.ArtificerConstants;
import org.oasis_open.docs.s_ramp.ns.s_ramp_v1.Actor;
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.DerivedArtifactType;
import org.oasis_open.docs.s_ramp.ns.s_ramp_v1.DocumentArtifactTarget;
import org.oasis_open.docs.s_ramp.ns.s_ramp_v1.Element;
import org.oasis_open.docs.s_ramp.ns.s_ramp_v1.Fault;
import org.oasis_open.docs.s_ramp.ns.s_ramp_v1.Message;
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.OperationOutput;
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.Policy;
import org.oasis_open.docs.s_ramp.ns.s_ramp_v1.PolicyAttachment;
import org.oasis_open.docs.s_ramp.ns.s_ramp_v1.Port;
import org.oasis_open.docs.s_ramp.ns.s_ramp_v1.PortType;
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.ServiceEndpoint;
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.ServiceInterface;
import org.oasis_open.docs.s_ramp.ns.s_ramp_v1.ServiceOperation;
import org.oasis_open.docs.s_ramp.ns.s_ramp_v1.SoaModelType;
import org.oasis_open.docs.s_ramp.ns.s_ramp_v1.Target;
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.WsdlService;
import org.oasis_open.docs.s_ramp.ns.s_ramp_v1.XsdDocument;
import java.util.List;
/**
* Visits all of the artifact's relationships.
*
* @author eric.wittmann@redhat.com
*/
public abstract class RelationshipArtifactVisitor extends HierarchicalArtifactVisitor {
/**
* Constructor.
*/
public RelationshipArtifactVisitor() {
}
/**
* @see HierarchicalArtifactVisitor#visitBase(org.oasis_open.docs.s_ramp.ns.s_ramp_v1.BaseArtifactType)
*/
@Override
protected void visitBase(BaseArtifactType artifact) {
// expansion
String archiveUuid = artifact.getOtherAttributes().get(ArtificerConstants.ARTIFICER_EXPANDED_FROM_ARCHIVE_UUID_QNAME);
if (StringUtils.isNotBlank(archiveUuid)) {
visitRelationship("expandedFromArchive", archiveUuid, false);
}
List<Relationship> relationships = artifact.getRelationship();
if (relationships != null) {
for (Relationship relationship : relationships) {
String type = relationship.getRelationshipType();
List<Target> targets = relationship.getRelationshipTarget();
visitRelationships(type, targets, true);
}
}
super.visitBase(artifact);
}
/**
* @see HierarchicalArtifactVisitor#visitDerived(org.oasis_open.docs.s_ramp.ns.s_ramp_v1.DerivedArtifactType)
*/
@Override
protected void visitDerived(DerivedArtifactType artifact) {
DocumentArtifactTarget relatedDocument = artifact.getRelatedDocument();
visitRelationship("relatedDocument", relatedDocument, false);
super.visitDerived(artifact);
}
/**
* @see HierarchicalArtifactVisitor#visitWsdlDerived(org.oasis_open.docs.s_ramp.ns.s_ramp_v1.WsdlDerivedArtifactType)
*/
@Override
protected void visitWsdlDerived(WsdlDerivedArtifactType artifact) {
visitRelationships("extension", artifact.getExtension(), false);
super.visitWsdlDerived(artifact);
}
/**
* @see HierarchicalArtifactVisitor#visitSoa(org.oasis_open.docs.s_ramp.ns.s_ramp_v1.SoaModelType)
*/
@Override
protected void visitSoa(SoaModelType artifact) {
visitRelationships("documentation", artifact.getDocumentation(), false);
super.visitSoa(artifact);
}
/**
* @see HierarchicalArtifactVisitor#visitServiceImplementation(org.oasis_open.docs.s_ramp.ns.s_ramp_v1.ServiceImplementationModelType)
*/
@Override
protected void visitServiceImplementation(ServiceImplementationModelType artifact) {
visitRelationships("documentation", artifact.getDocumentation(), false);
super.visitServiceImplementation(artifact);
}
/**
* @see HierarchicalArtifactVisitor#visit(org.oasis_open.docs.s_ramp.ns.s_ramp_v1.ServiceContract)
*/
@Override
public void visit(ServiceContract artifact) {
visitRelationships("involvesParty", artifact.getInvolvesParty(), false);
visitRelationships("specifies", artifact.getSpecifies(), false);
super.visit(artifact);
}
/**
* @see HierarchicalArtifactVisitor#visit(org.oasis_open.docs.s_ramp.ns.s_ramp_v1.BindingOperation)
*/
@Override
public void visit(BindingOperation artifact) {
visitRelationships("fault", artifact.getFault(), false);
visitRelationship("input", artifact.getInput(), false);
visitRelationship("output", artifact.getOutput(), false);
visitRelationship("operation", artifact.getOperation(), false);
super.visit(artifact);
}
/**
* @see HierarchicalArtifactVisitor#visit(org.oasis_open.docs.s_ramp.ns.s_ramp_v1.Actor)
*/
@Override
public void visit(Actor artifact) {
visitRelationships("does", artifact.getDoes(), false);
visitRelationships("setsPolicy", artifact.getSetsPolicy(), false);
super.visit(artifact);
}
/**
* @see HierarchicalArtifactVisitor#visit(org.oasis_open.docs.s_ramp.ns.s_ramp_v1.Binding)
*/
@Override
public void visit(Binding artifact) {
visitRelationships("bindingOperation", artifact.getBindingOperation(), false);
visitRelationship("portType", artifact.getPortType(), false);
super.visit(artifact);
}
/**
* @see HierarchicalArtifactVisitor#visit(org.oasis_open.docs.s_ramp.ns.s_ramp_v1.Element)
*/
@Override
public void visit(Element artifact) {
visitRelationships("represents", artifact.getRepresents(), false);
visitRelationships("uses", artifact.getUses(), false);
visitRelationships("performs", artifact.getPerforms(), false);
visitRelationship("directsOrchestration", artifact.getDirectsOrchestration(), false);
visitRelationship("directsOrchestrationProcess", artifact.getDirectsOrchestrationProcess(), false);
visitRelationships("generates", artifact.getGenerates(), false);
visitRelationships("respondsTo", artifact.getRespondsTo(), false);
super.visit(artifact);
}
/**
* @see HierarchicalArtifactVisitor#visit(org.oasis_open.docs.s_ramp.ns.s_ramp_v1.Fault)
*/
@Override
public void visit(Fault artifact) {
visitRelationship("message", artifact.getMessage(), false);
super.visit(artifact);
}
/**
* @see HierarchicalArtifactVisitor#visit(org.oasis_open.docs.s_ramp.ns.s_ramp_v1.Message)
*/
@Override
public void visit(Message artifact) {
visitRelationships("part", artifact.getPart(), false);
super.visit(artifact);
}
/**
* @see HierarchicalArtifactVisitor#visit(org.oasis_open.docs.s_ramp.ns.s_ramp_v1.Operation)
*/
@Override
public void visit(Operation artifact) {
visitRelationship("input", artifact.getInput(), false);
visitRelationship("output", artifact.getOutput(), false);
visitRelationships("fault", artifact.getFault(), false);
super.visit(artifact);
}
/**
* @see HierarchicalArtifactVisitor#visit(org.oasis_open.docs.s_ramp.ns.s_ramp_v1.OperationInput)
*/
@Override
public void visit(OperationInput artifact) {
visitRelationship("message", artifact.getMessage(), false);
super.visit(artifact);
}
/**
* @see HierarchicalArtifactVisitor#visit(org.oasis_open.docs.s_ramp.ns.s_ramp_v1.OperationOutput)
*/
@Override
public void visit(OperationOutput artifact) {
visitRelationship("message", artifact.getMessage(), false);
super.visit(artifact);
}
/**
* @see HierarchicalArtifactVisitor#visit(org.oasis_open.docs.s_ramp.ns.s_ramp_v1.Organization)
*/
@Override
public void visit(Organization artifact) {
visitRelationships("provides", artifact.getProvides(), false);
super.visit(artifact);
}
/**
* @see HierarchicalArtifactVisitor#visit(org.oasis_open.docs.s_ramp.ns.s_ramp_v1.Part)
*/
@Override
public void visit(Part artifact) {
visitRelationship("type", artifact.getType(), false);
visitRelationship("element", artifact.getElement(), false);
super.visit(artifact);
}
/**
* @see HierarchicalArtifactVisitor#visit(org.oasis_open.docs.s_ramp.ns.s_ramp_v1.Policy)
*/
@Override
public void visit(Policy artifact) {
visitRelationships("appliesTo", artifact.getAppliesTo(), false);
super.visit(artifact);
}
/**
* @see HierarchicalArtifactVisitor#visit(org.oasis_open.docs.s_ramp.ns.s_ramp_v1.PolicyAttachment)
*/
@Override
public void visit(PolicyAttachment artifact) {
visitRelationships("appliesTo", artifact.getAppliesTo(), false);
visitRelationships("policies", artifact.getPolicies(), false);
super.visit(artifact);
}
/**
* @see HierarchicalArtifactVisitor#visit(org.oasis_open.docs.s_ramp.ns.s_ramp_v1.Port)
*/
@Override
public void visit(Port artifact) {
visitRelationship("binding", artifact.getBinding(), false);
super.visit(artifact);
}
/**
* @see HierarchicalArtifactVisitor#visit(org.oasis_open.docs.s_ramp.ns.s_ramp_v1.PortType)
*/
@Override
public void visit(PortType artifact) {
visitRelationships("operation", artifact.getOperation(), false);
super.visit(artifact);
}
/**
* @see HierarchicalArtifactVisitor#visit(org.oasis_open.docs.s_ramp.ns.s_ramp_v1.Service)
*/
@Override
public void visit(Service artifact) {
visitRelationships("hasContract", artifact.getHasContract(), false);
visitRelationships("hasInterface", artifact.getHasInterface(), false);
visitRelationship("hasInstance", artifact.getHasInstance(), false);
super.visit(artifact);
}
/**
* @see HierarchicalArtifactVisitor#visit(org.oasis_open.docs.s_ramp.ns.s_ramp_v1.ServiceEndpoint)
*/
@Override
public void visit(ServiceEndpoint artifact) {
visitRelationship("endpointDefinedBy", artifact.getEndpointDefinedBy(), false);
super.visit(artifact);
}
/**
* @see HierarchicalArtifactVisitor#visit(org.oasis_open.docs.s_ramp.ns.s_ramp_v1.ServiceInstance)
*/
@Override
public void visit(ServiceInstance artifact) {
visitRelationships("uses", artifact.getUses(), false);
visitRelationships("describedBy", artifact.getDescribedBy(), false);
super.visit(artifact);
}
/**
* @see HierarchicalArtifactVisitor#visit(org.oasis_open.docs.s_ramp.ns.s_ramp_v1.ServiceInterface)
*/
@Override
public void visit(ServiceInterface artifact) {
visitRelationship("hasOperation", artifact.getHasOperation(), false);
visitRelationships("hasOutput", artifact.getHasOutput(), false);
visitRelationships("hasInput", artifact.getHasInput(), false);
visitRelationships("isInterfaceOf", artifact.getIsInterfaceOf(), false);
super.visit(artifact);
}
/**
* @see HierarchicalArtifactVisitor#visit(org.oasis_open.docs.s_ramp.ns.s_ramp_v1.ServiceOperation)
*/
@Override
public void visit(ServiceOperation artifact) {
visitRelationship("operationDefinedBy", artifact.getOperationDefinedBy(), false);
super.visit(artifact);
}
/**
* @see HierarchicalArtifactVisitor#visit(org.oasis_open.docs.s_ramp.ns.s_ramp_v1.WsdlDocument)
*/
@Override
public void visit(WsdlDocument artifact) {
visitRelationships("importedXsds", artifact.getImportedXsds(), false);
visitRelationships("includedXsds", artifact.getIncludedXsds(), false);
visitRelationships("redefinedXsds", artifact.getRedefinedXsds(), false);
visitRelationships("importedWsdls", artifact.getImportedWsdls(), false);
super.visit(artifact);
}
/**
* @see HierarchicalArtifactVisitor#visit(org.oasis_open.docs.s_ramp.ns.s_ramp_v1.WsdlService)
*/
@Override
public void visit(WsdlService artifact) {
visitRelationships("port", artifact.getPort(), false);
super.visit(artifact);
}
/**
* @see HierarchicalArtifactVisitor#visit(org.oasis_open.docs.s_ramp.ns.s_ramp_v1.XsdDocument)
*/
@Override
public void visit(XsdDocument artifact) {
visitRelationships("importedXsds", artifact.getImportedXsds(), false);
visitRelationships("includedXsds", artifact.getIncludedXsds(), false);
visitRelationships("redefinedXsds", artifact.getRedefinedXsds(), false);
super.visit(artifact);
}
/**
* Visits a collection of relationships.
* @param type
* @param targets
*/
protected void visitRelationships(String type, List<? extends Target> targets, boolean generic) {
for (Target target : targets) {
visitRelationship(type, target, generic);
}
}
protected void visitRelationship(String type, String targetUuid, boolean generic) {
Target target = new Target();
target.setValue(targetUuid);
visitRelationship(type, target, generic);
}
/**
* Called to visit a relationship.
* @param type
* @param target
*/
protected abstract void visitRelationship(String type, Target target, boolean generic);
}