/*
* Copyright 2011 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.test;
import org.apache.commons.io.IOUtils;
import org.artificer.common.ArtifactContent;
import org.artificer.common.ArtifactType;
import org.artificer.common.ArtificerModelUtils;
import org.artificer.common.query.ArtifactSummary;
import org.artificer.common.query.ReverseRelationship;
import org.artificer.repository.query.ArtificerQuery;
import org.artificer.repository.query.PagedResult;
import org.junit.Assert;
import org.junit.Test;
import org.oasis_open.docs.s_ramp.ns.s_ramp_v1.BaseArtifactEnum;
import org.oasis_open.docs.s_ramp.ns.s_ramp_v1.BaseArtifactType;
import org.oasis_open.docs.s_ramp.ns.s_ramp_v1.Property;
import org.oasis_open.docs.s_ramp.ns.s_ramp_v1.WsdlDocument;
import org.oasis_open.docs.s_ramp.ns.s_ramp_v1.XsdDocument;
import javax.xml.namespace.QName;
import java.io.InputStream;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* Tests that relationships can be queried.
* @author eric.wittmann@redhat.com
*/
public class RelationshipQueryTest extends AbstractNoAuditingPersistenceTest {
/**
* Tests the query manager + derived relationships.
* @throws Exception
*/
@Test
public void testDerivedRelationshipQueries() throws Exception {
WsdlDocument wsdlDoc = addWsdlDoc();
// Get all the element style WSDL message parts
ArtificerQuery query = queryManager.createQuery("/s-ramp/wsdl/Part[element]");
PagedResult<ArtifactSummary> artifactSet = query.executeQuery();
Assert.assertNotNull(artifactSet);
Assert.assertEquals(3, artifactSet.getTotalSize());
// Get all the element style WSDL message parts that refer to the element with name 'findRequest'
query = queryManager.createQuery("/s-ramp/wsdl/Part[element[@name = 'find']]");
artifactSet = query.executeQuery();
Assert.assertNotNull(artifactSet);
Assert.assertEquals(1, artifactSet.getTotalSize());
// Get all the messages that have at least one part
query = queryManager.createQuery("/s-ramp/wsdl/Message[part]");
artifactSet = query.executeQuery();
Assert.assertNotNull(artifactSet);
Assert.assertEquals(5, artifactSet.getTotalSize());
// Get all operations that have faults
query = queryManager.createQuery("/s-ramp/wsdl/Operation[fault]");
artifactSet = query.executeQuery();
Assert.assertNotNull(artifactSet);
Assert.assertEquals(1, artifactSet.getTotalSize());
// Get all operations that have faults named 'foo' (hint - there aren't any)
query = queryManager.createQuery("/s-ramp/wsdl/Operation[fault[@name = 'foo']]");
artifactSet = query.executeQuery();
Assert.assertNotNull(artifactSet);
Assert.assertEquals(0, artifactSet.getTotalSize());
// Get all faults
query = queryManager.createQuery("/s-ramp/wsdl/Fault");
artifactSet = query.executeQuery();
Assert.assertNotNull(artifactSet);
Assert.assertEquals(2, artifactSet.getTotalSize());
// Get all operations for the port type (sub-artifact-set query)
query = queryManager.createQuery("/s-ramp/wsdl/PortType[@name = 'SamplePortType']/operation");
artifactSet = query.executeQuery();
Assert.assertNotNull(artifactSet);
Assert.assertEquals(2, artifactSet.getTotalSize());
// Get just one operation for the port type (sub-artifact-set query with predicate)
query = queryManager.createQuery("/s-ramp/wsdl/PortType[@name = 'SamplePortType']/operation[@name = 'findSimple']");
artifactSet = query.executeQuery();
Assert.assertNotNull(artifactSet);
Assert.assertEquals(1, artifactSet.getTotalSize());
// Negation test
query = queryManager.createQuery("/s-ramp/wsdl/Part[xp2:not(element)]");
artifactSet = query.executeQuery();
Assert.assertNotNull(artifactSet);
Assert.assertEquals(2, artifactSet.getTotalSize());
// Test multiple levels of relationships
// query = queryManager.createQuery("/s-ramp/wsdl/Message/part/element");
// artifactSet = query.executeQuery();
// Assert.assertNotNull(artifactSet);
// Assert.assertEquals(1, artifactSet.getTotalSize());
// Ensure predicate conjunctions work w/ relationships
query = queryManager.createQuery(String.format("/s-ramp/wsdl/Part[relatedDocument[@uuid = '%1$s'] and element]", wsdlDoc.getUuid()));
artifactSet = query.executeQuery();
Assert.assertNotNull(artifactSet);
Assert.assertEquals(3, artifactSet.getTotalSize());
}
/**
* Tests the query manager + custom/generic relationships
* @throws Exception
*/
@Test
public void testGenericRelationshipQueries() throws Exception {
XsdDocument xsdDoc = addXsdDoc();
WsdlDocument wsdlDoc1 = addWsdlDoc();
WsdlDocument wsdlDoc2 = addWsdlDoc();
ArtificerModelUtils.addGenericRelationship(xsdDoc, "importedBy", wsdlDoc1.getUuid());
ArtificerModelUtils.addGenericRelationship(xsdDoc, "importedBy", wsdlDoc2.getUuid());
persistenceManager.updateArtifact(xsdDoc, ArtifactType.XsdDocument());
ArtificerQuery query = queryManager.createQuery("/s-ramp/xsd/XsdDocument[importedBy]");
PagedResult<ArtifactSummary> artifactSet = query.executeQuery();
Assert.assertNotNull(artifactSet);
Assert.assertEquals(1, artifactSet.getTotalSize());
query = queryManager.createQuery("/s-ramp/xsd/XsdDocument[importedBy[@uuid = ?]]");
query.setString(wsdlDoc1.getUuid());
artifactSet = query.executeQuery();
Assert.assertNotNull(artifactSet);
Assert.assertEquals(1, artifactSet.getTotalSize());
query = queryManager.createQuery("/s-ramp/xsd/XsdDocument[noSuchRel]");
artifactSet = query.executeQuery();
Assert.assertNotNull(artifactSet);
Assert.assertEquals(0, artifactSet.getTotalSize());
query = queryManager.createQuery("/s-ramp/wsdl/WsdlDocument[importedBy]");
artifactSet = query.executeQuery();
Assert.assertNotNull(artifactSet);
Assert.assertEquals(0, artifactSet.getTotalSize());
}
@Test
public void testGenericRelationshipAttributeQueries() throws Exception {
XsdDocument xsdDoc = addXsdDoc();
WsdlDocument wsdlDoc1 = addWsdlDoc();
WsdlDocument wsdlDoc2 = addWsdlDoc();
WsdlDocument wsdlDoc3 = addWsdlDoc();
Map<QName, String> otherAttributes = new HashMap<QName, String>();
otherAttributes.put(QName.valueOf("FooKey"), "FooValue");
ArtificerModelUtils.addGenericRelationship(xsdDoc, "relWithAttr", wsdlDoc1.getUuid(), otherAttributes, Collections.EMPTY_MAP);
ArtificerModelUtils.addGenericRelationship(xsdDoc, "relWithAttr", wsdlDoc2.getUuid(), otherAttributes, Collections.EMPTY_MAP);
Map<QName, String> otherAttributes2 = new HashMap<QName, String>();
otherAttributes2.put(QName.valueOf("FooKey2"), "FooValue2");
ArtificerModelUtils.addGenericRelationship(xsdDoc, "relWithAttr2", wsdlDoc3.getUuid(), otherAttributes2, Collections.EMPTY_MAP);
xsdDoc = (XsdDocument) persistenceManager.updateArtifact(xsdDoc, ArtifactType.XsdDocument());
// add custom properties only to one of the wsdls
Property prop = new Property();
prop.setPropertyName("FooProperty");
prop.setPropertyValue("FooValue");
wsdlDoc1.getProperty().add(prop);
wsdlDoc1 = (WsdlDocument) persistenceManager.updateArtifact(wsdlDoc1, ArtifactType.WsdlDocument());
ArtificerQuery query = queryManager.createQuery("/s-ramp/xsd/XsdDocument[relWithAttr[s-ramp:getRelationshipAttribute(., 'FooKey')]]");
PagedResult<ArtifactSummary> artifactSet = query.executeQuery();
Assert.assertNotNull(artifactSet);
Assert.assertEquals(1, artifactSet.getTotalSize());
query = queryManager.createQuery("/s-ramp/xsd/XsdDocument[relWithAttr[s-ramp:getRelationshipAttribute(., 'FooKey') = 'FooValue']]");
artifactSet = query.executeQuery();
Assert.assertNotNull(artifactSet);
Assert.assertEquals(1, artifactSet.getTotalSize());
query = queryManager.createQuery("/s-ramp/xsd/XsdDocument[relWithAttr[s-ramp:getRelationshipAttribute(., 'InvalidKey')]]");
artifactSet = query.executeQuery();
Assert.assertNotNull(artifactSet);
Assert.assertEquals(0, artifactSet.getTotalSize());
query = queryManager.createQuery("/s-ramp/xsd/XsdDocument[relWithAttr[s-ramp:getRelationshipAttribute(., 'FooKey') = 'FooValue' and @FooProperty = 'FooValue']]");
artifactSet = query.executeQuery();
Assert.assertNotNull(artifactSet);
Assert.assertEquals(1, artifactSet.getTotalSize());
query = queryManager.createQuery("/s-ramp/xsd/XsdDocument[relWithAttr[s-ramp:getRelationshipAttribute(., 'FooKey') = 'FooValue' and @InvalidProperty]]");
artifactSet = query.executeQuery();
Assert.assertNotNull(artifactSet);
Assert.assertEquals(0, artifactSet.getTotalSize());
query = queryManager.createQuery("/s-ramp/xsd/XsdDocument[relWithAttr[s-ramp:getRelationshipAttribute(., 'FooKey') = 'FooValue' or @FooProperty = 'FooValue']]");
artifactSet = query.executeQuery();
Assert.assertNotNull(artifactSet);
Assert.assertEquals(1, artifactSet.getTotalSize());
query = queryManager.createQuery("/s-ramp/xsd/XsdDocument[relWithAttr[s-ramp:getRelationshipAttribute(., 'FooKey') = 'InvalidValue' or @FooProperty = 'FooValue']]");
artifactSet = query.executeQuery();
Assert.assertNotNull(artifactSet);
Assert.assertEquals(1, artifactSet.getTotalSize());
query = queryManager.createQuery("/s-ramp/xsd/XsdDocument[relWithAttr[s-ramp:getRelationshipAttribute(., 'FooKey') = 'InvalidValue' or @FooProperty = 'FooValue']]");
artifactSet = query.executeQuery();
Assert.assertNotNull(artifactSet);
Assert.assertEquals(1, artifactSet.getTotalSize());
query = queryManager.createQuery("/s-ramp/xsd/XsdDocument[@uuid = ?]/relWithAttr2");
query.setString(xsdDoc.getUuid());
artifactSet = query.executeQuery();
Assert.assertNotNull(artifactSet);
Assert.assertEquals(1, artifactSet.getTotalSize());
Assert.assertEquals(wsdlDoc3.getUuid(), artifactSet.getResults().get(0).getUuid());
query = queryManager.createQuery("/s-ramp/xsd/XsdDocument[@uuid = ?]/relWithAttr2[s-ramp:getRelationshipAttribute(., 'FooKey2')]");
query.setString(xsdDoc.getUuid());
artifactSet = query.executeQuery();
Assert.assertNotNull(artifactSet);
Assert.assertEquals(1, artifactSet.getTotalSize());
Assert.assertEquals(wsdlDoc3.getUuid(), artifactSet.getResults().get(0).getUuid());
query = queryManager.createQuery("/s-ramp/xsd/XsdDocument[@uuid = ?]/relWithAttr2[s-ramp:getRelationshipAttribute(., 'FooKey2') = 'FooValue2']");
query.setString(xsdDoc.getUuid());
artifactSet = query.executeQuery();
Assert.assertNotNull(artifactSet);
Assert.assertEquals(1, artifactSet.getTotalSize());
Assert.assertEquals(wsdlDoc3.getUuid(), artifactSet.getResults().get(0).getUuid());
query = queryManager.createQuery("/s-ramp/xsd/XsdDocument[@uuid = ?]/relWithAttr2[s-ramp:getRelationshipAttribute(., 'InvalidKey')]");
query.setString(xsdDoc.getUuid());
artifactSet = query.executeQuery();
Assert.assertNotNull(artifactSet);
Assert.assertEquals(0, artifactSet.getTotalSize());
}
@Test
public void testGenericTargetAttributeQueries() throws Exception {
XsdDocument xsdDoc = addXsdDoc();
WsdlDocument wsdlDoc1 = addWsdlDoc();
WsdlDocument wsdlDoc2 = addWsdlDoc();
WsdlDocument wsdlDoc3 = addWsdlDoc();
Map<QName, String> otherAttributes = new HashMap<QName, String>();
otherAttributes.put(QName.valueOf("FooKey"), "FooValue");
ArtificerModelUtils.addGenericRelationship(xsdDoc, "relWithAttr", wsdlDoc1.getUuid(), Collections.EMPTY_MAP, otherAttributes);
ArtificerModelUtils.addGenericRelationship(xsdDoc, "relWithAttr", wsdlDoc2.getUuid(), Collections.EMPTY_MAP, otherAttributes);
Map<QName, String> otherAttributes2 = new HashMap<QName, String>();
otherAttributes2.put(QName.valueOf("FooKey2"), "FooValue2");
ArtificerModelUtils.addGenericRelationship(xsdDoc, "relWithAttr2", wsdlDoc3.getUuid(), Collections.EMPTY_MAP, otherAttributes2);
xsdDoc = (XsdDocument) persistenceManager.updateArtifact(xsdDoc, ArtifactType.XsdDocument());
// add custom properties only to one of the wsdls
Property prop = new Property();
prop.setPropertyName("FooProperty");
prop.setPropertyValue("FooValue");
wsdlDoc1.getProperty().add(prop);
wsdlDoc1 = (WsdlDocument) persistenceManager.updateArtifact(wsdlDoc1, ArtifactType.WsdlDocument());
ArtificerQuery query = queryManager.createQuery("/s-ramp/xsd/XsdDocument[relWithAttr[s-ramp:getTargetAttribute(., 'FooKey')]]");
PagedResult<ArtifactSummary> artifactSet = query.executeQuery();
Assert.assertNotNull(artifactSet);
Assert.assertEquals(1, artifactSet.getTotalSize());
query = queryManager.createQuery("/s-ramp/xsd/XsdDocument[relWithAttr[s-ramp:getTargetAttribute(., 'FooKey') = 'FooValue']]");
artifactSet = query.executeQuery();
Assert.assertNotNull(artifactSet);
Assert.assertEquals(1, artifactSet.getTotalSize());
query = queryManager.createQuery("/s-ramp/xsd/XsdDocument[relWithAttr[s-ramp:getTargetAttribute(., 'InvalidKey')]]");
artifactSet = query.executeQuery();
Assert.assertNotNull(artifactSet);
Assert.assertEquals(0, artifactSet.getTotalSize());
query = queryManager.createQuery("/s-ramp/xsd/XsdDocument[relWithAttr[s-ramp:getTargetAttribute(., 'FooKey') = 'FooValue' and @FooProperty = 'FooValue']]");
artifactSet = query.executeQuery();
Assert.assertNotNull(artifactSet);
Assert.assertEquals(1, artifactSet.getTotalSize());
query = queryManager.createQuery("/s-ramp/xsd/XsdDocument[relWithAttr[s-ramp:getTargetAttribute(., 'FooKey') = 'FooValue' and @InvalidProperty]]");
artifactSet = query.executeQuery();
Assert.assertNotNull(artifactSet);
Assert.assertEquals(0, artifactSet.getTotalSize());
query = queryManager.createQuery("/s-ramp/xsd/XsdDocument[relWithAttr[s-ramp:getTargetAttribute(., 'FooKey') = 'FooValue' or @FooProperty = 'FooValue']]");
artifactSet = query.executeQuery();
Assert.assertNotNull(artifactSet);
Assert.assertEquals(1, artifactSet.getTotalSize());
query = queryManager.createQuery("/s-ramp/xsd/XsdDocument[relWithAttr[s-ramp:getTargetAttribute(., 'FooKey') = 'InvalidValue' or @FooProperty = 'FooValue']]");
artifactSet = query.executeQuery();
Assert.assertNotNull(artifactSet);
Assert.assertEquals(1, artifactSet.getTotalSize());
query = queryManager.createQuery("/s-ramp/xsd/XsdDocument[relWithAttr[s-ramp:getTargetAttribute(., 'FooKey') = 'InvalidValue' or @FooProperty = 'FooValue']]");
artifactSet = query.executeQuery();
Assert.assertNotNull(artifactSet);
Assert.assertEquals(1, artifactSet.getTotalSize());
query = queryManager.createQuery("/s-ramp/xsd/XsdDocument[@uuid = ?]/relWithAttr2");
query.setString(xsdDoc.getUuid());
artifactSet = query.executeQuery();
Assert.assertNotNull(artifactSet);
Assert.assertEquals(1, artifactSet.getTotalSize());
query = queryManager.createQuery("/s-ramp/xsd/XsdDocument[@uuid = ?]/relWithAttr2[s-ramp:getTargetAttribute(., 'FooKey2')]");
query.setString(xsdDoc.getUuid());
artifactSet = query.executeQuery();
Assert.assertNotNull(artifactSet);
Assert.assertEquals(1, artifactSet.getTotalSize());
Assert.assertEquals(wsdlDoc3.getUuid(), artifactSet.getResults().get(0).getUuid());
query = queryManager.createQuery("/s-ramp/xsd/XsdDocument[@uuid = ?]/relWithAttr2[s-ramp:getTargetAttribute(., 'FooKey2') = 'FooValue2']");
query.setString(xsdDoc.getUuid());
artifactSet = query.executeQuery();
Assert.assertNotNull(artifactSet);
Assert.assertEquals(1, artifactSet.getTotalSize());
Assert.assertEquals(wsdlDoc3.getUuid(), artifactSet.getResults().get(0).getUuid());
query = queryManager.createQuery("/s-ramp/xsd/XsdDocument[@uuid = ?]/relWithAttr2[s-ramp:getTargetAttribute(., 'InvalidKey')]");
query.setString(xsdDoc.getUuid());
artifactSet = query.executeQuery();
Assert.assertNotNull(artifactSet);
Assert.assertEquals(0, artifactSet.getTotalSize());
}
@Test
public void testReverseRelationships() throws Exception {
WsdlDocument wsdlDoc = addWsdlDoc();
// Get one of the Parts
ArtificerQuery query = queryManager.createQuery("/s-ramp/wsdl/Part");
PagedResult<ArtifactSummary> artifactSet = query.executeQuery();
ArtifactSummary partSummary = artifactSet.getResults().get(0);
BaseArtifactType part = persistenceManager.getArtifact(partSummary.getUuid(), partSummary.getArtifactType());
// Set one generic relationship, *from* the part
ArtificerModelUtils.addGenericRelationship(part, "fooRel", wsdlDoc.getUuid());
persistenceManager.updateArtifact(part, ArtifactType.valueOf(part));
List<ReverseRelationship> reverseRelationships = queryManager.reverseRelationships(wsdlDoc.getUuid());
Assert.assertTrue(hasRelationship(reverseRelationships, part.getUuid(), "fooRel"));
Assert.assertTrue(hasRelationship(reverseRelationships, part.getUuid(), "relatedDocument"));
}
private WsdlDocument addWsdlDoc() throws Exception {
String artifactFileName = "jcr-sample.wsdl";
InputStream contentStream = this.getClass().getResourceAsStream("/sample-files/wsdl/" + artifactFileName);
try {
WsdlDocument wsdlDoc = new WsdlDocument();
wsdlDoc.setArtifactType(BaseArtifactEnum.WSDL_DOCUMENT);
wsdlDoc.setName(artifactFileName);
wsdlDoc.setContentEncoding("application/xml");
// Persist the artifact
BaseArtifactType artifact = persistenceManager.persistArtifact(wsdlDoc, new ArtifactContent(artifactFileName, contentStream));
Assert.assertNotNull(artifact);
return (WsdlDocument) artifact;
} finally {
IOUtils.closeQuietly(contentStream);
}
}
private XsdDocument addXsdDoc() throws Exception {
String artifactFileName = "PO.xsd";
InputStream contentStream = this.getClass().getResourceAsStream("/sample-files/xsd/" + artifactFileName);
try {
XsdDocument xsdDoc = new XsdDocument();
xsdDoc.setArtifactType(BaseArtifactEnum.XSD_DOCUMENT);
xsdDoc.setName(artifactFileName);
xsdDoc.setContentEncoding("application/xml");
// Persist the artifact
BaseArtifactType artifact = persistenceManager.persistArtifact(xsdDoc, new ArtifactContent(artifactFileName, contentStream));
Assert.assertNotNull(artifact);
return (XsdDocument) artifact;
} finally {
IOUtils.closeQuietly(contentStream);
}
}
private boolean hasRelationship(List<ReverseRelationship> reverseRelationships, String sourceUuid, String relType) {
for (ReverseRelationship reverseRelationship : reverseRelationships) {
if (reverseRelationship.getSourceArtifact().getUuid().equals(sourceUuid)
&& reverseRelationship.getName().equals(relType)) {
return true;
}
}
return false;
}
}