It's all about the answers!

Ask a question

RM OSLC - created links don't seem to persist


Steven Hovater (706) | asked Mar 31 '20, 5:16 p.m.
hi all
I'm developing my first RM OSLC app which at some point will create a link between two requirements.
The code I started with is from the OSLC workshop RM example 03. This is in a GC context, I should add.
I just don't see the links in the GUI, or if I inquire programmatically, although they appear to be present right after creation.And no error is thrown. (This is RM 6.0.6.1)

Here's some code:
I seem to have missed something.

    private void updateRequirement(OslcClient oslcClient, String sourceURL, String targetURL) throws Exception {
        Thread.sleep(3000); //wait for indexing
       
        //Get the document we just created
        ClientResponse sourceResponse = oslcClient.getResource(sourceURL, OSLCConstants.CT_RDF);
       
        if (sourceResponse.getStatusCode() != 200) {
            sourceResponse.consumeContent();
            throw new HttpResponseException(sourceResponse.getStatusCode(),
                    sourceResponse.getMessage());
        }   
        Requirement sourceReq = sourceResponse.getEntity(Requirement.class);
        List<String> etagValues = sourceResponse.getHeaders().get("etag");
        Link links[] = sourceReq.getSatisfies();
        for (Link link : links) {
            log.println("S LINK: " + link);
        }
       
        //Get the document we just created
        ClientResponse targetResponse = oslcClient.getResource(targetURL, OSLCConstants.CT_RDF);
       
       
        if (targetResponse.getStatusCode() != 200) {
            targetResponse.consumeContent();
            throw new HttpResponseException(targetResponse.getStatusCode(),
                    targetResponse.getMessage());
        }   
        Requirement targetReq = targetResponse.getEntity(Requirement.class);
        List<String> tetagValues = targetResponse.getHeaders().get("etag");
       
   
        Link satisfies = new Link(targetReq.getAbout());
        sourceReq.setSatisfies(new Link[] { satisfies });
       
        sourceResponse = etagValues != null ?
                oslcClient.updateResource(sourceURL, sourceReq, OSLCConstants.CT_RDF,
                                          OSLCConstants.CT_RDF,
                                          etagValues.get(etagValues.size() - 1)) :               
                oslcClient.updateResource(sourceURL, sourceReq, OSLCConstants.CT_RDF,
                                          OSLCConstants.CT_RDF);
               
        sourceResponse.consumeContent();
        if (sourceResponse.getStatusCode() != 200) {
            sourceResponse.consumeContent();
            throw new HttpResponseException(sourceResponse.getStatusCode(),
                    sourceResponse.getMessage());
        }       
        targetResponse = tetagValues != null ?
                oslcClient.updateResource(targetURL, targetReq, OSLCConstants.CT_RDF,
                                          OSLCConstants.CT_RDF,
                                          tetagValues.get(tetagValues.size() - 1)) :               
                oslcClient.updateResource(targetURL, targetReq, OSLCConstants.CT_RDF,
                                          OSLCConstants.CT_RDF);
               
        targetResponse.consumeContent();
       
       
        if (targetResponse.getStatusCode() != 200) {
            targetResponse.consumeContent();
            throw new HttpResponseException(targetResponse.getStatusCode(),
                    targetResponse.getMessage());
        }
       
        Link alinks[] = sourceReq.getSatisfies();
        for (Link link : alinks) {
            log.println("LINK: " + link);
        }
        log.println("Linked");
        //If we get here then our PUT succeeded and the requirement should have our link now
    }

3 answers



permanent link
Steven Hovater (706) | answered Apr 01 '20, 9:46 a.m.
edited Apr 01 '20, 9:47 a.m.
Code seems to work if I use a "Specifies" or "Elaborates" link to another requirement.

It would appear that the problem is that the "Satisfies" link type isn't supported by OSLC, at least through the lyo app. When I look at a Satisfies link that I established via the RM gui, I see:

<ds:Link type="Link">
<rrm:title>Satisfies</rrm:title>

<ds:linkType>
https://myserver/rm/types/_HJ2MLNobEemsbO6NwH1NuA
</ds:linkType>
<ds:isParentLink>false</ds:isParentLink>
<ds:isChildLink>false</ds:isChildLink>
<rrm:relation>
https://myserver/rm/resources/MB_ace34e61a36346599ddc93be08259e86
</rrm:relation>
<rrm:alternative>
https://myserver/rm/resources/MB_ace34e61a36346599ddc93be08259e86
</rrm:alternative>
<rrm:identifier>328</rrm:identifier>
<ds:content>
<rrm:title>Actor 1</rrm:title>
<rrm:identifier>328</rrm:identifier>
<rrm:description/>
<rrm:format>Text</rrm:format>
<ds:artifactFormat>Actor</ds:artifactFormat>
</ds:content>
</ds:Link>

compare to the Specifies relationship:

<ds:Specifies type="Specifies">
<rrm:title>Specifies</rrm:title>

<ds:linkType>
https://myserver/rm/types/_TuEXEdoaEemsbO6NwH1NuA
</ds:linkType>
<rrm:relation>
https://myserver/rm/resources/MB_d33e8df4600f41a9a59b8c3ae658f9f2
</rrm:relation>
<rrm:alternative>
https://myserver/rm/resources/MB_d33e8df4600f41a9a59b8c3ae658f9f2
</rrm:alternative>
<rrm:identifier>331</rrm:identifier>
<ds:content>
<rrm:title>Do wacka do</rrm:title>
<rrm:identifier>331</rrm:identifier>
<rrm:description/>
<rrm:format>Text</rrm:format>
<ds:artifactFormat>Use Case Requirement</ds:artifactFormat>
</ds:content>
</ds:Specifies>

So - bottom line, can someone confirm whether the Satisfies link  can be created using OSLC?

permanent link
Steven Hovater (706) | answered Apr 02 '20, 11:03 a.m.
edited Apr 02 '20, 11:04 a.m.
OK, So, here's what you need to do - instead of creating a link, work through the extendedProperties:
replace
Link satisfies = new Link(targetReq.getAbout());
sourceReq.setSatisfies(new Link[] { satisfies });


with:
Map<QName,Object> pmap = sourceReq.getExtendedProperties();
 // this is the Satisfies link type
QName key = new QName("https://myserver/rm/types/", "_HJ2MLNobEemsbO6NwH1NuA", "rm_property");
pmap.put(key, targetReq);
sourceReq.setExtendedProperties(pmap);

(thanks Scott!)

permanent link
Ralph Schoon (57.2k23642) | answered Apr 03 '20, 7:03 a.m.
FORUM ADMINISTRATOR / FORUM MODERATOR / JAZZ DEVELOPER

Steve, please be aware that Eclipse Lyo is probably a better infrastructure. The Examples you started with are so old, that they precede the newer frameworks that can make life easier. https://rsjazz.wordpress.com/2019/03/07/type-system-manager-part-2/ and the related articles show how to get started with the older 2.4 version. See https://github.com/OSLC/lyo-samples/tree/master/oslc4j-client-samples/src/main/java/org/eclipse/lyo/oslc4j/client/samples . Especially https://github.com/OSLC/lyo-samples/blob/master/oslc4j-client-samples/src/main/java/org/eclipse/lyo/oslc4j/client/samples/RMSample.java

Your answer


Register or to post your answer.