CelinQ Insights · No. 81

Pro Cloud Server, OSLC, and the Cost of a REST-per-Resource Design

OSLC is a genuine, well-designed standard for linking lifecycle tools together occasionally. It was never designed for the thousands of fine-grained operations a single modelling session generates.

A NILUS perspective on collaborative modelling for Sparx Enterprise Architect

Pro Cloud Server ships with a feature that gets less attention in performance conversations than it deserves, because most people either never turn it on or never look closely at what it is doing when they do: OSLC, the Open Services for Lifecycle Collaboration standard. It is worth being precise about what OSLC actually is before drawing any conclusions from it, because it is easy to reach for a technology's reputation instead of its architecture, and in this case the architecture is the entire point. OSLC is a real, carefully designed, OASIS-governed standard for letting lifecycle tools — a requirements tool, a test manager, an issue tracker, a modelling repository — reference each other's artefacts over HTTP using linked-data principles. Pro Cloud Server implements it as one of its Cloud Services specifically so that an Enterprise Architect model can participate in that wider integration fabric: a requirement in DOORS can link to a component in EA, a defect in Jira can reference the element it affects, and each tool resolves the other's link by fetching a standard, self-describing resource rather than needing a bespoke point-to-point integration for every pair of tools in the estate.

That is a genuinely good problem to solve, and OSLC solves it well for the case it was built for: infrequent, standards-based linking between tools that mostly live in their own worlds and only need to reference each other occasionally. The trouble starts when the same resource-oriented, fetch-one-thing-at-a-time shape that makes OSLC an excellent integration protocol gets held up as evidence that a repository built around similar HTTP semantics is well suited to interactive modelling, where "occasionally" is the wrong order of magnitude by several zeroes. A working modelling session is not five or ten cross-tool link resolutions an hour. It is thousands of small repository operations — read this element, write that attribute, resolve this connector's endpoints, refresh this diagram's contents — compressed into a single sitting, and the two problems, despite both being phrased as "fetch a thing over HTTP," are not the same problem at all.

What OSLC actually asks of the network

The OSLC specification is built around resource discovery, and resource discovery is a deliberately indirect process by design, because indirection is what lets a client that has never seen a particular server before find its way to the data it needs. A client does not simply ask a server for "the elements in package X." It first fetches a Service Provider Catalog, a resource that lists the Service Providers available — in EA's case, typically one per project or repository. It then fetches the Service Provider document itself, which advertises the capabilities that provider exposes: a Query Capability here, a Creation Factory there, each described by its own URL. Only then, with the Query Capability's URL in hand, can the client issue an actual query, and the response to that query is itself a set of resource references rather than full resource bodies in many implementations, which means resolving the substance of what was found can mean a further fetch per resource. Every one of those steps is a separate HTTP request-response pair, each with its own connection overhead, its own TLS handshake cost if a connection is not being kept warm, and its own serialisation and parsing cost on both ends.

None of this is a flaw in OSLC. It is what correct, standards-compliant linked-data discovery looks like, and the specification's authors were solving a real interoperability problem — letting tools that know nothing about each other's internals find and understand each other's data — not an interactive-editing-performance problem. HATEOAS-style discovery, where each response tells you where to go next rather than assuming you already know, is exactly the right design when the client might be any OSLC-compliant tool from any vendor and the alternative is everyone hard-coding URL patterns that break the moment a server changes its layout. The cost of that correctness is paid in round trips, and round trips are a currency an occasional cross-tool link check can easily afford and a live modelling session cannot.

Representation weight: RDF, XML, and content negotiation

The second cost sits inside each response rather than between them. OSLC resources are Linked Data, typically represented as RDF, and RDF/XML remains a common representation across OSLC implementations for compatibility reasons even where JSON-LD or Turtle are also offered through content negotiation. RDF/XML is a verbose format by construction: it describes a resource as a graph of subject-predicate-object triples, each triple wrapped in enough XML structure and namespace declaration to be unambiguous to any RDF processor that has never seen this particular vocabulary before, and that self-describing verbosity is precisely what makes it usable across tool boundaries without prior agreement on schema. A single Enterprise Architect element, described this way, carries considerably more bytes on the wire than the same element's actual data would need in a format that both ends already understand — because RDF's job is describing data to a stranger, not moving data efficiently between two systems that already know each other's shape.

Multiply that per-resource weight by the resource-discovery chain above and the shape of the cost becomes clear: an OSLC-mediated fetch of a handful of linked elements can mean several HTTP round trips, each carrying a self-describing payload heavier than the underlying data strictly requires, to retrieve information a co-resident local process could have read from disk in microseconds. Again, this is not a criticism of OSLC on its own terms — a defect tracker fetching one linked requirement now and then absorbs this cost without anyone noticing. It becomes a different conversation entirely when the same fetch-and-parse pattern, or a repository transport built in the same architectural spirit, sits on the path an architect's every click has to travel.

1. Service Provider Catalog — "where do I look?" 2. Service Provider "what can this one do?" 3. Query Capability "find the resource I want" 4. Resource RDF/XML payload Four sequential HTTP round trips to resolve one linked fact — correct, standards-compliant, and expensive per fetch. Local-first read one local disk access Neither shape is "wrong" — they were built to answer different questions, at different frequencies, for different consumers.
OSLC's resource-discovery chain, simplified — correct and standards-compliant, and paid for in round trips every time. A local read pays that cost exactly once, at synchronisation time, for a whole batch of changes rather than per fact.

Pagination: the cost that shows up only at scale

There is a further wrinkle that only becomes visible once a query returns more than a handful of results, and it is worth naming because it is exactly the kind of cost that passes every small-scale test and then surprises someone in production. OSLC query results are commonly paginated: a Query Capability returns a page of matching resource references rather than the entire result set in one response, with a link to the next page for the client to follow if it wants more. This is, again, entirely sensible on OSLC's own terms — an unbounded result set is a real risk when the client could be any tool, written by anyone, asking any query, and a server that tried to return everything in one response would be trading one performance problem for a worse one. But it means that a cross-tool query broad enough to matter — "every requirement linked to any element in this package," say, across a large programme — can turn into a sequence of page-fetches, each one a full round trip, each one followed by another discovery-adjacent wait while the next page is requested and parsed. A query that feels instantaneous against a handful of test elements can become a visibly different experience once it is run against the hundreds or thousands of elements a real programme accumulates, and the difference is not a bug anyone introduced. It is pagination doing exactly its job, at a frequency and a scale its job was never sized for.

Being precise about what this does and does not claim

It would overstate the case to say that every click an architect makes in Enterprise Architect against Pro Cloud Server is, technically, an OSLC request. It usually is not. OSLC in a Pro Cloud Server deployment is typically the integration surface — the channel a requirements tool or an issue tracker uses to reach into the model from outside — rather than the transport carrying the desktop client's own live editing session, which runs over Pro Cloud Server's own Cloud connection protocol instead. That protocol is a different, proprietary design, and it deserves to be judged on its own terms rather than tarred by association with a standard it does not literally use. That comparison is made honestly elsewhere in this series, on its own architectural merits: an HTTP-based client-server model, meaningfully more firewall-friendly and securable than raw remote database access, that still places a request on the path of every meaningful repository operation because the repository the client is querying is, definitionally, not on the architect's own machine.

What OSLC contributes to this conversation is not a claim about which bytes travel during a normal editing session. It is the clearest, most visible illustration available of the underlying architectural pattern that Pro Cloud Server's whole family of REST-based services shares: model data represented as discrete, individually addressable HTTP resources, fetched through a request-response cycle that assumes the fetch is occasional and the payload can afford to be self-describing. OSLC simply makes that pattern legible, because its specification is public, its resource shapes are documented, and its discovery chain is something you can trace request by request rather than infer from a closed protocol. Look at how OSLC represents a single Enterprise Architect element on the wire and you are looking, in unusually clear light, at what "the repository as a set of independently fetchable HTTP resources" costs once you count the requests rather than admire the interoperability.

The honest version of the claim. Pro Cloud Server's core Cloud connection is not literally OSLC, and it would be inaccurate to say otherwise. What is accurate is that OSLC — a real, documented, optional PCS feature — was designed for occasional cross-tool linking, not thousands of fine-grained interactive operations a session, and its resource-per-request, self-describing-payload shape is the same fundamental shape the rest of PCS's REST surface takes on for exactly the same reason: HTTP resources are the natural unit when the goal is broad interoperability, and broad interoperability is not the same design goal as desktop-speed responsiveness.

A worked comparison: resolving one cross-reference

Picture an architect who needs to confirm which requirement justifies a particular application service before making a change to it — a small, completely ordinary piece of the day's work, repeated dozens of times across a session as different elements get touched. Under an OSLC-mediated integration between EA and a separate requirements tool, resolving that single cross-reference means walking the discovery chain described above to reach the linked requirement's resource, parsing the RDF response to extract the handful of fields that actually matter — title, identifier, status — and discarding the rest of the self-describing structure that made the format usable across tool boundaries in the first place. Do this once, deliberately, to confirm a link before a release, and the cost is invisible. Do something with the same shape, at the same frequency PCS's own core Cloud protocol asks of every element read, every attribute write, every diagram refresh, across an eight-hour modelling session, and the cost stops being invisible and starts being the reason the day feels heavier than the work should.

Now picture the same confirmation under CelinQ. The requirement's relationship to the application service is already part of the local repository the architect is working in — synchronised in the background, in advance, as a batch of semantic facts rather than fetched on demand as a discrete HTTP resource. Confirming it costs a local read, the same local read every other operation in the session costs, with no discovery chain to walk and no RDF envelope to parse and discard. The two approaches are not competing to answer the same question faster. One treats "give me this fact" as a request worth making individually, self-describingly, to a stranger; the other treats it as data you already have, because it was synchronised as part of a whole model rather than requested one linked reference at a time.

Why REST-per-resource is the right choice for integration and the wrong one for interaction

A protocol built so that any tool can discover any other tool's data without prior agreement is solving a different problem from a protocol built so that one architect's click responds before the next one arrives. OSLC and CelinQ's sync transport are not two implementations of the same idea — they are correct answers to two different questions, and Pro Cloud Server's core transport, whatever its literal wire format, was built to answer the interoperability question's cousin rather than the interaction question CelinQ was built to answer.

REST-per-resource, content-negotiated, self-describing payloads are the right architecture whenever the set of consumers is open-ended and unpredictable, which is exactly OSLC's situation: any OSLC-compliant tool, from any vendor, written by people who have never seen your specific deployment, needs to be able to find and understand your data without a bespoke integration. Paying a request-per-resource cost, and a verbosity cost inside each response, is a completely reasonable price for that openness, and it is a price genuinely worth paying for the cross-tool linking OSLC exists to provide. The same architecture is the wrong choice the moment the two parties on either end of the wire are the same product, built by the same team, talking to each other constantly rather than occasionally — which is precisely the situation an EA desktop client and its repository are in during ordinary modelling, standards-based interoperability or not. CelinQ's sync protocol gets to make a different trade specifically because it does not need OSLC's openness: CelinQ Connect and the CelinQ Server are one product's two halves, so the wire format can be compact, the client can already know the schema without discovery, and a whole batch of semantic changes can travel as one exchange instead of one HTTP request per fact.

This is also why the comparison is worth making honestly rather than as a cheap shot at a competitor's optional feature. OSLC is not Pro Cloud Server's mistake; it is Pro Cloud Server doing standards-based integration correctly, using the standard built for exactly that purpose. The lesson is not "OSLC is bad." It is that the same architectural choices that make a protocol excellent for occasional, open-ended, standards-based linking make it a poor foundation for the interactive core of a modelling tool — and any REST-per-resource repository transport, whether or not it is literally OSLC, inherits that trade-off the moment it puts an HTTP request between an architect and a fact about their own model.

What to check in your own environment

If OSLC integration is switched on in your Pro Cloud Server deployment, it is worth watching what it actually does under load before drawing any conclusion, vendor claims — CelinQ's included — notwithstanding. Open the network trace for a session that resolves a handful of cross-tool links and count the requests each resolution actually took, including the discovery steps that never show up in a casual description of "fetching a resource," and including any pagination follow-ups a broader query triggered. Compare the bytes on the wire for one element's RDF representation against what the same fact would take in a format two halves of the same product already agree on. None of this requires taking any vendor's architecture diagram on faith; it is directly observable in minutes with tools every network engineer already has, and it is worth doing before a programme scales from the handful of test elements a proof-of-concept used to the thousands a live portfolio actually holds, because that is precisely the point at which pagination and discovery overhead stop being theoretical.

Whatever you find, the finding that matters most is not about OSLC specifically. It is about noticing how many of your day's repository operations, OSLC-mediated or not, are travelling as individually addressed HTTP resources rather than as data you already had — because that count, more than any single protocol's name, is what predicts how the day is going to feel. A team that runs this check honestly, on its own traffic, is in a far stronger position to evaluate any architecture — Pro Cloud Server's, CelinQ's, or anyone else's — than a team that takes either vendor's description of the other at face value.

The honest limits

OSLC's design is not a flaw to be fixed; it is a correct answer to a question CelinQ does not have to answer the same way, because CelinQ is not trying to be an open, standards-based integration point for arbitrary third-party ALM tools. An organisation that genuinely needs EA to participate in a wider OSLC-linked toolchain — a regulated programme with a separate requirements tool and a separate test manager, all expected to cross-reference each other through a common standard — has a real requirement OSLC exists to serve, and CelinQ does not attempt to replace that integration surface or claim it should. What CelinQ replaces is the assumption that a repository transport built for that kind of open interoperability is also the right transport for the interactive core of daily modelling, and that is a narrower, more defensible claim than "OSLC is slow," which on its own is neither fair to the standard nor precise enough to act on.

The honest conclusion is not that Pro Cloud Server chose badly by offering OSLC, and it is not that OSLC itself is a poorly designed standard — by the measure that actually matters for cross-tool linked data, it is a thoughtfully built one. It is that REST-per-resource, whether wearing OSLC's standard or a vendor's own proprietary variant of the same shape, was never trying to solve the problem CelinQ was built to solve, and judging either one by the other's success criteria does not do justice to what either was actually designed for.