Technology Blogs by Members
Explore a vibrant mix of technical expertise, industry insights, and tech buzz in member blogs covering SAP products, technology, and events. Get in the mix!
cancel
Showing results for 
Search instead for 
Did you mean: 
Martin-Pankraz
Active Contributor

Today, I’m going to make your life as integration developer a whole lot easier. Whenever there’s a complex transformation requirement, for instance combining rows from an excel sheet into one object by a common identifier, Scripting is a great way to tackle the issue. SAP offers two flavors of scripting – JavaScript and Groovy.


The only downside is that the SAP Cloud Platform Integration WebUI does development environment. So, basically, it is like developing whilst blindfolded and then hoping for the best during deployment and runtime. As an integration developer you want a little more than syntax highlighting. You at least want to have syntax checks, code completion and the ability to test messages easily without deploying entire iFlows and executing them.


Fortunately, there are some clever people at the SAP community, who can show us how to setup a development environment for those CPI scripts.


I am going to build upon their amazing work and equip you with a custom iFlow and a Postman request that allows you to “hunt” for the Java-Libraries residing on your own Cloud Platform Integration tenant. You will need them to be able to execute your groovy script from eclipse.


Find out how my custom iFlow finds java libraries on your CPI tenant on Vadim’s amazing blog post.


Also, Eng Swee produced a fantastic write up on how to start your first functional tests with a groovy script.



Ready to groove?


So let’s say you’ve installed Eclipse Neon, the groovy plugin and added Eng Swee’s initial scripts for message processing and running the test. Then, you notice that the project produces errors due to missing dependencies. This is what we need to fix.


Have a look at my slightly adapted demo structure below, which I am going to refer to from hereon.




Message processing script “src/com/convista/groovydemo/Script1.groovy”:
package com.convista.groovydemo
import com.sap.gateway.ip.core.customdev.util.Message;
import java.util.HashMap;

def Message processData(Message message) {
//Body
def body = message.getBody();
message.setBody(body + "Body is modified");
//Headers
def map = message.getHeaders();
def value = map.get("oldHeader");
message.setHeader("oldHeader", value + "modified");
message.setHeader("newHeader", "newHeader");
//Properties
map = message.getProperties();
value = map.get("oldProperty");
message.setProperty("oldProperty", value + "modified");
message.setProperty("newProperty", "newProperty");
return message;
}

Note: If you run into encoding problems, for example, with messages, created by the csv converter, consider adding the java.lang.String class to your get-method (e.g. message.getBody(java.lang.String)).


And the script “Tester.groovy” that executes the actual test. This piece simulates the message passed by the CPI framework so to say.



package com.equalize.groovy.testing

import com.sap.gateway.ip.core.customdev.processor.MessageImpl
import com.sap.gateway.ip.core.customdev.util.Message

// Load Groovy Script
GroovyShell shell = new GroovyShell()
def script = shell.parse(new File("src/com/convista/groovydemo/Script1.groovy"))

// Initialize message with body, header and property
Message msg = new MessageImpl()
msg.setBody(new String("Hello Groovy World"))
msg.setHeader("oldHeader", "MyGroovyHeader")
msg.setProperty("oldProperty", "MyGroovyProperty")

// Execute script
script.processData(msg)

// Display results of script in console
println("Body:\r\n" + msg.getBody())

def displayMaps = { String mapName, Map map ->
println mapName
map.each { key, value -> println( key + " = " + value) }
}
displayMaps("Headers:", msg.getHeaders())
displayMaps("Properties:", msg.getProperties())

The blogs, mentioned above, walk you through the dependency problem with SAP’s standard class “Message” and explains, in detail, how to solve it.


So: “What are we doing here then?”


Vadim and Eng Swee left you with a very cumbersome approach to retrieve the java libraries. I’d like to show you a much more integrated way of doing this without comprising Eng Swee’s goal of teaching a man to fish instead of simply giving him a fish to eat, so he has the skills to feed himself going forward.



What else do you get?


Vadim’s and Eng Swee’s approach involves executing your incomplete groovy project, identifying an error relating to a missing dependency in eclipse, and using that missing class name on an additional groovy script, which you need to deploy on CPI to download the corresponding java library from your tenant. Once you have the java library file you can add it to your class path and re-execute your project to find the next missing class. For this next one you need to alter the groovy script on the iFlow and re-deploy.


Ugh, that is quite a lot of work, because you currently need to download ten java library files to get a complete set and the deployment times of the iFlow can take several minutes. It can easily take 20 minutes to complete them. So that is why I decided to develop an iFlow, which can do all of this in one go. You can download it here.



To achieve what I wanted I needed the ability to pass the java class name dynamically without hard coding it on a groovy script. That way we can circumvent the re-deployment process. So, to achieve that, I use an https connector that allows the forwarding of the HTTP query string parameters. SAP is running the Apache Camel server for that reason. You can read more about this here.


A couple of weeks ago my colleague 6c74addc374841d587eccd4a68075de8 gave you an introduction on how to use Postman for testing your iFlows. You are going to need that knowledge now.



As you can see the URL for my iFlow https endpoint requires the following pattern:


/external/trigger?lib=<java class name>


The yellow part is required for the Camel server, the blue part addresses the https endpoint of the iFlow and the red part is the name of the query string variable, which can be accessed on the iFlow later on. Check it out below:



You can access the query string parameters by reading the header “CamelHttpQuery”. I decided to parse it by applying a substring to actually get the value of the parameter (lib=some.java.class.name).


I feed the result into Vadim’s script logic that utilizes the Java API to lookup the jar file, which contains the class name. The result is then base64 encoded and added as a string attachment to an iFlow message.




For the convenience of the developer I added the jar file name including its version as the title of the attachment.



Finally you need to copy the base64 encoded string and create a jar file from it. I decided to do this by running another groovy script once more. As preparation you need to copy the encoded string into a text file and put it on the libs folder of my demo project. You can also download it from my GitHub repository. The script is called Base64Decoder.groovy. Add the jar file to your project’s build path, try to run the groovy script “Tester” once again and start the process of “hunting” for more missing jar files again.



Once you are done “hunting” for all the SAP jar files and added all of them to your build path, you can finally execute tests with your groovy scripts:


That wasn’t too hard, was it?


engswee.yeoh suggests you take the testing approach even further. If you want to delve further into Test Driven Development with your groovy scripts take a look here.


Before concluding, I would like to emphasize the power of creating message logs (with attachments) with groovy scripts. In our case we used it to output the content of the jar files from the CPI tenant. But, of course, possible use cases for custom logging are only limited by your imagination and implementation needs.



Final Words


So I’ve introduced you to the setup procedure and told you where to find instructions on how to setup your groovy development environment in eclipse to get started with groovy scripting for your CPI iFlows. I also showed you how to download the required java libraries more easily and quicker than my SAP community colleagues Vadim and Eng Swee suggest.


Next time I am going to combine the topics of our blogs, which we posted so far and talk about end-to-end testing of your iFlows. So stay tuned for more.


As always feel free to leave comments and ask lots of follow up questions.


Thanks


Martin

20 Comments
engswee
Active Contributor
Hi Martin

 

Nice to see your blog expanding on vadim.klimov and my ideas (but does the title really have to be in all UPPER CASE??)

 

It's good to know that you understood our intention of just highlighting the fundamental concepts, and then leaving the rest to the imagination of developers like yourself. IMHO, to appreciate automation, one needs to have experienced how things are done "the hard way" 😉

 

A few comments on your approach:-

1) You can further bypass the Base64 encoding/decoding steps by setting the byte content of the file into the message body. With this you can use the "Send and Download" feature in Postman to directly retrieve the binary contents of the JAR files. If you want the filename, you can additionally store it back in the HTTP header of the response.

 

2) While MPL attachments are indeed useful - take note that SAP have repeatedly cautioned against using it unnecessarily - see here and here.

 

Regards

Eng Swee
Martin-Pankraz
Active Contributor
0 Kudos
Hi Eng Swee,

Thanks for your input. I drafted the blog in a different place where the styling of titles need to be "shouting" ;-). When I copied from there I forgot about the styling. So thanks for pointing that out.

 

Good point to enhance the base64 encoding step by moving it also into the message. I was simply itching to do some groovy instead.

 

Kind regards

Martin
vadimklimov
Active Contributor

Hello Martin,

 

Very nice blog – thank you for sharing it with the community in a detailed way, clear and easy to follow every step you walk through, as well as it presents a good example of technique applied in action and its practical utilization and usability.

 

I agree with engswee.yeoh in part that our posts were not intended to provide a ready to run packaged solution, as only imagination and creativity of the developer being put into context of a specific use case / requirement, will be boundary of practical usage of the described techniques – Eng Swee provided reference examples on technique as a core, so that it can be wrapped and bundled into a specific case and tailored to specific needs. This brings us to a variety of options on how to:

  • invoke functionality. For example expose it as an API and call it via Postman or its equivalents, or build user-friendly UI on top of it, or embed libraries retrieval logic into scripts of dependency management system, and
  • digest and process output. For example, save it to local file, or upload to central binaries repository for fellow developers’ usage across the team. Or, as a more advanced option, to build script that will download updated versions of libraries when CPI tenant gets updated – to keep your libraries in sync with those used by CPI tenant’s runtime. Here it is worth referring to work already done by 7a519509aed84a2c9e6f627841825b5a and CPI Tracker that he developed and shared in blog series – here, here and here, as it can be used as a core to track CPI updates and use it as a trigger for required actions – such as earlier downloaded libraries’ refresh on client side.

In certain cases, it was also driven by non-technical factors – such as legal / end user license agreement – cases, where it might have been considered as violation of EULA articles, techniques were described in very high level and agnostic way (note disclaimer that I put at the beginning of several blogs – it was actually put for this specific reason).

 

Regarding the script, to protect it from issues caused by incorrect URL constructed by the consumer of the flow, the check against query parameter name might become handy, so that class name retrieved from the expected query parameter. This is to avoid situation if somebody will enter URL with multiple parameters for some reason, where they shouldn’t have done so, and the script will get executed with some multi-parameter query.

String queryParameterName = 'lib';

if (httpQuery) {
def queryParameters = [:];
def queryParameter;

httpQuery.split('&').each {
queryParameter = it.split('=');
queryParameters.put(queryParameter[0], queryParameter[1]);
}

className = queryParameters[queryParameterName];
}

The above logic assumes the required query parameter name is ‘lib’, but obviously it can be replaced with any other reasonable query parameter name of your choice (I have chosen ‘lib’ to follow URL you passed in the request and captured in Postman screenshot).

 

 

Regards,

Vadim

Martin-Pankraz
Active Contributor
0 Kudos
Hi Vadim,

Thanks a lot for your thorough comment. You guys made it easy to build upon your great research to bundle something usable. Furthermore your thoughts on the topic really allowed a deep insight of the workings of the groovy related topics and how the cpi messages can be manipulated.

Your suggestion for enhancing the example script will increase the robustness. So I will give it another look. But there is always something that can be added, isn't there? 😉

 

Kind regards

Martin
vadimklimov
Active Contributor
That's very true, Martin - I agree, there shall be a certain point, when the one makes full stop and releases findings to community, otherwise enhancements, tweaks, introduction of extra features and functionality might go forever, and will finally quite significantly deviate from the original scope, and even distract from the main subject. And all other ideas can be put in new blogs or blog series - so keep on exploring, developing and sharing your thoughts and findings, those are valuable inputs and appreciated efforts!

Regards,

Vadim
Illya_Kuys
Explorer
0 Kudos
Hi Martin,

 

It's a very nice blog – thank you for sharing it with us in such a detailed way to follow each step along the process.

1/ However, I still encounter some small issues. When I try to retrieve
URI classFilePath = clazz.protectionDomain.codeSource.location.toURI();

This causes an error: URI is not hierarchical.

When I look further into this issue, the jar location is not correctly specified.

As it should return a path which would look like this: /usr/sap/ljs/plugins/...jar

It actually returns: jar:bundle://627.0:0/!/

When I request the location with a script of Vadim Klimov (many thanks as well for the great blog), the following response is returned.

Fully qualified class name: com.sap.gateway.ip.core.customdev.util.Message
JAR file containing class file: jar:bundle://627.0:0/!/

Has there been a change of location or has the security changed?

 

2/ Is it a possibility to provide a groovy example project with all the jars included?

The possibility to develop groovy in an editor opens a whole lot of possibilities.

 

Kind regards,

Illya Kuys
Martin-Pankraz
Active Contributor
0 Kudos
Hi Illya,

 

It is indeed possible that the library structure changed. SAP is updating CPI frequently. I would advice to check with vadim.klimov on this matter, since he investigated with most detail.

In case this issue is a deal breaker I will publish the last working version I have.

Kind regards

Martin
vadimklimov
Active Contributor
Hi Martin, hi Illya,

 

I have now tested the script for identification of path to JAR file - and it worked for me when being run in CPI. Although these are internals and not publicly exposed CPI APIs, they rely on Java APIs such as Reflection API, and it is unlikely to be something that can get changed easily, as it is one of ground level APIs in JVM.

Is it possible for you to provide full code of the script (or part of that script that queries class path) to check if there can be any difference in what has been executed by you and me?

I used the following one:
String className = "<fully qualified class name>";
Class clazz = Class.forName(className);
URI classFilePath = clazz.protectionDomain.codeSource.location.toURI();

 

Regarding a project to run scripts locally. engswee.yeoh has written a blog about this where he described steps that can be followed to get it set. It will require at least dependency resolved for external library with class Message, but you might need additional dependencies to be resolved in case some other functionality will be used in the script. Although it is possible to use older versions of that library, I would suggest regularly downloading current versions of required libraries from CPI and refreshing project dependencies for them to keep them up to date and aligned with those used at runtime by CPI tenant.

 

Regards,

Vadim
Martin-Pankraz
Active Contributor
0 Kudos
Thanks a lot vadim.klimov for the comment!

 

Kind regards

Martin

 
Naveen_MP
Explorer
0 Kudos
Hi vadim.klimov, Hi  martin.pankraz ,

I am also facing similar issue mentioned by illya_kuys

I am using below code(copied from Vadim post)
def Message processData(Message message) {

String className = "com.sap.gateway.ip.core.customdev.util.Message";

StringBuilder builder = new StringBuilder();
Class clazz = Class.forName(className);
URI classFilePath = clazz.protectionDomain.codeSource.location.toURI();
File classFile = new File(classFilePath);
byte[] classFileContent = classFile.bytes;
builder << classFileContent.encodeBase64().toString();

def messageLog = messageLogFactory.getMessageLog(message);
messageLog.addAttachmentAsString("JAR file content: Base64 encoding", builder.toString(), "text/plain");

return message;

}

 

Error :

javax.script.ScriptException: java.lang.Exception: java.lang.IllegalArgumentException: URI is not hierarchical@ line 46 in script2.groovy, cause: java.lang.IllegalArgumentException: URI is not hierarchical

and

I get class path as "JAR file containing class file: jar:bundle://518.0:0/!/ "  when i execute the code for accessing  classpath.

I suspect, due to restricted authorization i am not able to access the class path .

Could you please have a look.

Thanks in advance.

Best begards,

Naveen
vadimklimov
Active Contributor

Hello Naveen,

 

This observed behavior is a consequence of the way how an OSGi container that is now used by CPI – Apache Karaf – stores data of deployed bundles. In contrast to an earlier directory layout where all JAR files were located in a single directory, Karaf caches deployed bundles in their own sub-directories. For example, an output that you got – jar:bundle://518.0:0/!/ – suggests that the required file can be found in a version 0.0 of a bundle with ID 518. With this in mind, as well as considering standard structure of Karaf directories, we can modify the script so that it retrieves corresponding bundle file:

 

Message processData(Message message) {
String className = 'com.sap.gateway.ip.core.customdev.util.Message'

StringBuilder builder = new StringBuilder()

Class clazz = Class.forName(className)
URI classFilePath = clazz.protectionDomain.codeSource.location.toURI()

String regex = '\\/\\/(.*?)\\/!\\/'
def matcher = (classFilePath =~ regex)
String bundleIdVersion = matcher[0].getAt(1)
String bundleId = bundleIdVersion.take(bundleIdVersion.indexOf('.'))
String bundleVersion = bundleIdVersion.drop(bundleId.length() + 1)
String cacheBundleFilePath = "/usr/sap/ljs/data/cache/bundle${bundleId}/version${bundleVersion.replace(':', '.')}/bundle.jar"

File classFile = new File(cacheBundleFilePath)
byte[] classFileContent = classFile.bytes
builder << classFileContent.encodeBase64().toString()

def messageLog = messageLogFactory.getMessageLog(message)
messageLog.addAttachmentAsString('JAR file content: Base64 encoding', builder.toString(), 'text/plain')

return message
}

 

Note an enhanced middle part of the script code snippet: after we get location of the source of the given class, we decompose it into bundle ID and version, and make use of them when constructing a full path to the required bundle file.

 

Regards,

Vadim

0 Kudos

Hi Martin, Vadim,

I was trying to set up the Groovy project to test my scripts. I added the required JARs as mentioned. But I got the following error when executing the tester.groovy script. I am not able to find the class org.osgi.framework.FrameworkUtil, seems like I am missing something. Can you please advise how I can fix the issue? 

Thanks Ravikanth

 

 

Update:

I did add library org.osgi.core-4.2.0.jar (found through google) and fixed the error. I could successfully run the script now. But I still feel this step is not needed and something amiss in my set up. Please let me know if I have to set up the groovy environment differently. Thanks

Martin-Pankraz
Active Contributor
0 Kudos
Hi Ravikanth,

I am on a different S-User now, so I don't messages here anymore. I am trying to replicate this on my CloudFoundry environment just now. So I think given the time that has passed there are probably some changes on the SAP side. You should be fine with your current setup. Especially if you can execute Message locally.

KR

Martin
0 Kudos
Thanks Martin
DisplayName2
Participant
0 Kudos
/http/amba/cpifilesystemdownload///usr/sap/ljs//webapps/ROOT.war works for me in year 2021

It contains:

AS4.monitor-1.4.3.jar
camel.iflow.simulation.invoker-1.60.1.jar
camel.iflow.simulation.models-1.60.1.jar
com.amazon.ion.java-1.5.1.jar
com.fasterxml.aalto-xml-1.2.2.jar
com.fasterxml.jackson.core.jackson-annotations-2.11.3.jar
com.fasterxml.jackson.core.jackson-core-2.11.3.jar
com.fasterxml.jackson.core.jackson-databind-2.11.3.jar
com.fasterxml.jackson.dataformat.jackson-dataformat-ion-2.11.3.jar
com.fasterxml.jackson.dataformat.jackson-dataformat-smile-2.11.3.jar
com.fasterxml.jackson.dataformat.jackson-dataformat-xml-2.11.3.jar
com.fasterxml.jackson.datatype.jackson-datatype-jdk8-2.11.3.jar
com.fasterxml.jackson.datatype.jackson-datatype-jsr310-2.11.3.jar
com.fasterxml.jackson.jaxrs.jackson-jaxrs-base-2.11.3.jar
com.fasterxml.jackson.jaxrs.jackson-jaxrs-json-provider-2.11.3.jar
com.fasterxml.jackson.module.jackson-module-jaxb-annotations-2.11.3.jar
com.fasterxml.jackson.module.jackson-module-parameter-names-2.11.3.jar
com.github.luben.zstd-jni-1.4.5.12.jar
com.google.gson-1.7.0.jar
com.google.guava-28.1.0.sap-02.jar
com.google.guava.failureaccess-1.0.1.jar
com.jcraft.jsch-0.1.55.sap-01.jar
com.sap.common.apis-5.24.0.jar
com.sap.core.jpaas.crypto.api.jce-1.2.0.jar
com.sap.core.jpaas.crypto.iaik.cms-1.6.0.jar
com.sap.core.messaging.admin.client-1.37.1.jar
com.sap.core.messaging.client-1.37.1.jar
com.sap.core.messaging.client.commons-1.37.1.jar
com.sap.core.messaging.client.comp.status-1.37.1.jar
com.sap.core.messaging.client.spi-1.37.1.jar
com.sap.core.messaging.commons-1.37.1.jar
com.sap.core.messaging.spi-1.37.1.jar
com.sap.core.messaging.util.http-1.37.1.jar
com.sap.core.messaging.util.rest-1.37.1.jar
com.sap.cpi.cil-3.1.4.jar
com.sap.db.jdbc-2.6.28.fbc60bae0c06f69fb20cccf50ab57dbeb3964a88.jar
com.sap.esb.application.fsn.message-1.31.0.jar
com.sap.esb.application.services.api-1.62.0.jar
com.sap.esb.application.services.classpath.url.handler-1.62.0.jar
com.sap.esb.application.services.database.properties-1.62.0.jar
com.sap.esb.application.services.database.properties.impl-1.62.0.jar
com.sap.esb.application.services.datastore-1.62.0.jar
com.sap.esb.application.services.datastore.impl-1.62.0.jar
com.sap.esb.application.services.encryption.api-1.62.0.jar
com.sap.esb.application.services.heartbeat-1.62.0.jar
com.sap.esb.application.services.heartbeat.impl-1.62.0.jar
com.sap.esb.application.services.idmap.api-1.62.0.jar
com.sap.esb.application.services.idmap.impl-1.62.0.jar
com.sap.esb.application.services.message.storage.api-1.62.0.jar
com.sap.esb.application.services.message.storage.impl-1.62.0.jar
com.sap.esb.application.services.netty.handler-1.62.0.jar
com.sap.esb.camel.addons.camel.aggregation.strategies-1.60.1.jar
com.sap.esb.camel.addons.camel.csvtoxml.converter-1.60.1.jar
com.sap.esb.camel.addons.camel.error.component-1.60.1.jar
com.sap.esb.camel.addons.camel.iflow.simulation.datastore-1.60.1.jar
com.sap.esb.camel.addons.camel.iflow.simulation.messageflow-1.60.1.jar
com.sap.esb.camel.addons.camel.xmltocsv.converter-1.60.1.jar
com.sap.esb.camel.addons.connectivity.provider.impl-1.60.1.jar
com.sap.esb.camel.addons.connectivity.provider.neo.impl-1.60.1.jar
com.sap.esb.camel.addons.connectivity.service.neo-1.60.1.jar
com.sap.esb.camel.addons.connectivity.service.principal.propagator.neo-1.60.1.jar
com.sap.esb.camel.addons.oauth.cache.handler-1.60.1.jar
com.sap.esb.camel.addons.oauth.token.handler-1.60.1.jar
com.sap.esb.camel.core.camel.aggregate-1.90.1.jar
com.sap.esb.camel.core.camel.aggregation.repository-1.90.1.jar
com.sap.esb.camel.core.camel.attachment.component-1.90.1.jar
com.sap.esb.camel.core.camel.datastore.component-1.90.1.jar
com.sap.esb.camel.core.camel.eip.splitter-1.90.1.jar
com.sap.esb.camel.core.camel.idmap.component-1.90.1.jar
com.sap.esb.camel.core.camel.jdbc.idempotency.management-1.90.1.jar
com.sap.esb.camel.core.camel.jdbc.idempotency.reorg-1.90.1.jar
com.sap.esb.camel.core.camel.message.storage.component-1.90.1.jar
com.sap.esb.camel.core.camel.msgdigest.component-1.90.1.jar
com.sap.esb.camel.core.camel.saxon.converter-1.90.1.jar
com.sap.esb.camel.core.camel.saxon.extensions-1.90.1.jar
com.sap.esb.camel.core.camel.size.converter-1.90.1.jar
com.sap.esb.camel.core.camel.size.limiter-1.90.1.jar
com.sap.esb.camel.core.camel.util-1.90.1.jar
com.sap.esb.camel.core.camel.xmljson-1.90.1.jar
com.sap.esb.camel.core.cloud.connector.socket-1.90.1.jar
com.sap.esb.camel.core.endpoint.configurator.api-1.90.1.jar
com.sap.esb.camel.core.endpoint.configurator.mail-1.90.1.jar
com.sap.esb.camel.core.event.polling.strategy-1.90.1.jar
com.sap.esb.camel.core.header.filter.strategy-1.90.1.jar
com.sap.esb.camel.core.idempotent.repository-1.90.1.jar
com.sap.esb.camel.core.idempotent.repository.management-1.90.1.jar
com.sap.esb.camel.core.it.xmljson-1.90.1.jar
com.sap.esb.camel.core.jdbc.idempotency.repository-1.90.1.jar
com.sap.esb.camel.core.lock.polling.strategy-1.90.1.jar
com.sap.esb.camel.core.mpl.access.api-1.90.1.jar
com.sap.esb.camel.core.quartz-1.90.1.jar
com.sap.esb.camel.core.xml.modification-1.90.1.jar
com.sap.esb.camel.esr.mapping.camel.xi.mapping-1.38.0.jar
com.sap.esb.camel.esr.mapping.camel.xi.mapping.component.check-1.38.0.jar
com.sap.esb.camel.esr.mapping.camel.xi.opmapping.fault-1.38.0.jar
com.sap.esb.camel.ftp.endpoint.configurator.api-1.41.0.jar
com.sap.esb.camel.ftp.endpoint.configurator.sftp-1.41.0.jar
com.sap.esb.camel.ftp.file.filter.glob-1.41.0.jar
com.sap.esb.camel.ftp.sap.ftp.component-1.41.0.jar
com.sap.esb.camel.ftp.sap.sftp.component-1.41.0.jar
com.sap.esb.camel.ftp.socks.proxy-1.41.0.jar
com.sap.esb.camel.http.ahc.configurer-2.15.0.jar
com.sap.esb.camel.http.ahc.configurer.impl-2.15.0.jar
com.sap.esb.camel.http.cookie.policy-2.15.0.jar
com.sap.esb.camel.quartz.camel.route.policy-1.26.0.jar
com.sap.esb.camel.security.authentication.header-1.67.0.jar
com.sap.esb.camel.security.camel.security.cms-1.67.0.jar
com.sap.esb.camel.security.camel.security.cms.impl-1.67.0.jar
com.sap.esb.camel.security.camel.security.cms.smime-1.67.0.jar
com.sap.esb.camel.security.camel.security.crypto-1.67.0.jar
com.sap.esb.camel.security.camel.security.crypto.impl-1.67.0.jar
com.sap.esb.camel.security.camel.security.pgp-1.67.0.jar
com.sap.esb.camel.security.camel.security.pgp.impl-1.67.0.jar
com.sap.esb.camel.security.camel.security.xmlsecurity-1.67.0.jar
com.sap.esb.camel.security.camel.security.xmlsecurity.impl-1.67.0.jar
com.sap.esb.camel.security.encryption.dataformat-1.67.0.jar
com.sap.esb.camel.webservice.endpoint.configurer-1.35.0.jar
com.sap.esb.camel.webservice.xi.mpl.status.component-1.35.0.jar
com.sap.esb.camel.webservice.xi.packaging-1.35.0.jar
com.sap.esb.messaging.camel.endpoint.configurator.amqp-1.55.0.jar
com.sap.esb.messaging.camel.endpoint.configurator.kafka-1.55.0.jar
com.sap.esb.messaging.camel.jms.util-1.55.0.jar
com.sap.esb.messaging.camel.retry-1.55.0.jar
com.sap.esb.messaging.qpid.connection.factory-1.55.0.jar
com.sap.esb.messaging.solace.connection.factory-1.55.0.jar
com.sap.esb.messaging.solace.connection.factory.neo-1.55.0.jar
com.sap.esb.monitoring.audit.log-1.107.0.jar
com.sap.esb.monitoring.camel.ahc.monitor-1.107.0.jar
com.sap.esb.monitoring.camel.core.monitor-1.107.0.jar
com.sap.esb.monitoring.camel.cxf.monitor-1.107.0.jar
com.sap.esb.monitoring.camel.ftp.monitor-1.107.0.jar
com.sap.esb.monitoring.camel.mail.monitor-1.107.0.jar
com.sap.esb.monitoring.camel.quartz.monitor-1.107.0.jar
com.sap.esb.monitoring.camel.security.monitor-1.107.0.jar
com.sap.esb.monitoring.component.command-1.107.0.jar
com.sap.esb.monitoring.cxf.monitor-1.107.0.jar
com.sap.esb.monitoring.cxf.runtime.feature-1.107.0.jar
com.sap.esb.monitoring.data.encryption.monitor-1.107.0.jar
com.sap.esb.monitoring.data.store.monitor-1.107.0.jar
com.sap.esb.monitoring.delete.tmp.folder-1.107.0.jar
com.sap.esb.monitoring.id.map.monitor-1.107.0.jar
com.sap.esb.monitoring.idempotent.management.monitor-1.107.0.jar
com.sap.esb.monitoring.iflow.state.monitor-1.107.0.jar
com.sap.esb.monitoring.jdbc.driver.state.monitor-1.107.0.jar
com.sap.esb.monitoring.jms.monitor-1.107.0.jar
com.sap.esb.monitoring.keystore.monitor-1.107.0.jar
com.sap.esb.monitoring.mbean.dummies.worker-1.107.0.jar
com.sap.esb.monitoring.message.storage.monitor-1.107.0.jar
com.sap.esb.monitoring.messages-1.107.0.jar
com.sap.esb.monitoring.messages.adapter-1.107.0.jar
com.sap.esb.monitoring.mpl.extension.ahc-1.107.0.jar
com.sap.esb.monitoring.mpl.extension.cxf-1.107.0.jar
com.sap.esb.monitoring.mpl.extension.file-1.107.0.jar
com.sap.esb.monitoring.mpl.extension.kafka-1.107.0.jar
com.sap.esb.monitoring.nodeinfo.impl-1.107.0.jar
com.sap.esb.monitoring.pgp.monitor-1.107.0.jar
com.sap.esb.monitoring.restart.iflow-1.107.0.jar
com.sap.esb.monitoring.secure.parameter.impl-1.107.0.jar
com.sap.esb.pd.api-1.50.0.jar
com.sap.esb.pd.capability-1.50.0.jar
com.sap.esb.pd.commons-1.50.0.jar
com.sap.esb.pd.monitor-1.50.0.jar
com.sap.esb.pd.read-1.50.0.jar
com.sap.esb.pd.rt-1.50.0.jar
com.sap.esb.pd.rt.api-1.50.0.jar
com.sap.esb.pd.rt.neo-1.50.0.jar
com.sap.esb.security-1.59.0.jar
com.sap.esb.security.cloud.authentication-1.33.0.jar
com.sap.esb.security.db.encryption-1.59.0.jar
com.sap.esb.security.db.encryption.lib-1.59.0.jar
com.sap.esb.security.gogo.commands-1.59.0.jar
com.sap.esb.security.hci.cxf.filter.registration.karaf-1.33.0.jar
com.sap.esb.security.iaik.pgp-1.59.0.jar
com.sap.esb.security.impl-1.59.0.jar
com.sap.esb.security.oauth.client-1.59.0.jar
com.sap.esb.security.oauth.token.access-1.59.0.jar
com.sap.esb.security.oauth.token.access.base-1.59.0.jar
com.sap.esb.security.oauth.token.access.impl-1.59.0.jar
com.sap.esb.security.oauth.token.update.impl-1.33.0.jar
com.sap.esb.security.oauth.types-1.59.0.jar
com.sap.esb.security.oauth.util-1.59.0.jar
com.sap.esb.security.pgp-1.59.0.jar
com.sap.esb.security.pgp.impl-1.59.0.jar
com.sap.esb.security.ssh.key.util-1.59.0.jar
com.sap.esb.webservice.authorization.supplier-1.68.0.jar
com.sap.esb.webservice.cxf.interceptor-1.68.0.jar
com.sap.esb.webservice.cxf.interceptor.neo-1.68.0.jar
com.sap.esb.webservice.cxf.interceptor.store-1.68.0.jar
com.sap.esb.webservice.cxf.xi.core-1.68.0.jar
com.sap.esb.webservice.jmx.management-1.68.0.jar
com.sap.esb.webservice.mpl.access.api-1.68.0.jar
com.sap.esb.webservice.security.crypto-1.68.0.jar
com.sap.esb.xi.mapping.api-1.22.0.jar
com.sap.esb.xi.mapping.rt-1.22.0.jar
com.sap.gateway.core.ip.component.odata4.odata4-5.24.0.jar
com.sap.gw.rt.camel.components.gwodc-5.24.0.jar
com.sap.gw.rt.camel.components.hciodc-5.24.0.jar
com.sap.gw.rt.core.api-5.24.0.jar
com.sap.gw.rt.core.bep-5.24.0.jar
com.sap.gw.rt.core.ip.ipcore-5.24.0.jar
com.sap.gw.rt.core.ip.runtime-5.24.0.jar
com.sap.gw.rt.core.runtime-5.24.0.jar
com.sap.gw.rt.hci.components.gwcoreip.web-5.24.0.jar
com.sap.gw.rt.hci.components.service.messages-5.24.0.jar
com.sap.gw.rt.hci.components.service.state.monitor-5.24.0.jar
com.sap.gw.rt.ip.commons.camel-commons-5.24.0.jar
com.sap.gw.rt.ip.commons.camel-converter-5.24.0.jar
com.sap.gw.rt.ip.commons.camel-gw-msg-translator-5.24.0.jar
com.sap.gw.rt.ip.commons.camel-odata-5.24.0.jar
com.sap.gw.rt.ip.commons.odata4-api-5.24.0.jar
com.sap.gw.rt.ip.commons.tenant-config-5.24.0.jar
com.sap.gw.rt.odata-response-handler-5.24.0.jar
com.sap.gw.rt.service.url-5.24.0.jar
com.sap.it.adk.capability-1.35.0.jar
com.sap.it.asdk.cloud.authentication-1.61.0.jar
com.sap.it.asdk.com.sap.it.api.asdk-1.61.0.jar
com.sap.it.asdk.com.sap.it.api.asdk.datastore.impl-1.61.0.jar
com.sap.it.asdk.com.sap.it.api.asdk.keystore.impl-1.61.0.jar
com.sap.it.asdk.com.sap.it.api.asdk.securestore.impl-1.61.0.jar
com.sap.it.asdk.com.sap.it.api.cloud.connector.impl-1.61.0.jar
com.sap.it.asdk.com.sap.it.api.external.keystore.impl-1.61.0.jar
com.sap.it.asdk.com.sap.it.api.external.securestore.impl-1.61.0.jar
com.sap.it.asdk.com.sap.it.api.idempotent.repository.impl-1.61.0.jar
com.sap.it.asdk.com.sap.it.api.number.range.impl-1.61.0.jar
com.sap.it.asdk.web.extender-1.61.0.jar
com.sap.it.base.constants-1.28.0.jar
com.sap.it.capability.amqp-1.105.0.jar
com.sap.it.capability.ariba-1.105.0.jar
com.sap.it.capability.as2-1.105.0.jar
com.sap.it.capability.core-1.105.0.jar
com.sap.it.capability.core.neo-1.105.0.jar
com.sap.it.capability.elster-1.105.0.jar
com.sap.it.capability.http-1.105.0.jar
com.sap.it.capability.https-1.105.0.jar
com.sap.it.capability.idoc-1.105.0.jar
com.sap.it.capability.jms-1.105.0.jar
com.sap.it.capability.kafka-1.105.0.jar
com.sap.it.capability.ldap-1.105.0.jar
com.sap.it.capability.mail-1.105.0.jar
com.sap.it.capability.odata-1.105.0.jar
com.sap.it.capability.odata-sender-1.105.0.jar
com.sap.it.capability.odata4-1.105.0.jar
com.sap.it.capability.odc-1.105.0.jar
com.sap.it.capability.sfsf-1.105.0.jar
com.sap.it.capability.sftp-1.105.0.jar
com.sap.it.capability.soap-component-1.105.0.jar
com.sap.it.capability.xi-1.105.0.jar
com.sap.it.capability.xml-validator-1.105.0.jar
com.sap.it.commons-1.81.0.jar
com.sap.it.commons.cache-1.81.0.jar
com.sap.it.commons.cache.osgi-1.81.0.jar
com.sap.it.commons.com.sap.it.commons.connectivity.principal.propagation-1.81.0.jar
com.sap.it.commons.com.sap.it.commons.connectivity.provider.api-1.81.0.jar
com.sap.it.commons.com.sap.it.commons.oauth.cache.manager-1.81.0.jar
com.sap.it.commons.command-1.81.0.jar
com.sap.it.commons.command.osgi-1.81.0.jar
com.sap.it.commons.command.osgi.basicserver-1.81.0.jar
com.sap.it.commons.config-1.78.0.jar
com.sap.it.commons.config.model-1.78.0.jar
com.sap.it.commons.config.types-1.78.0.jar
com.sap.it.commons.http.util-1.81.0.jar
com.sap.it.commons.json.util-1.81.0.jar
com.sap.it.commons.logging.slf4j-1.81.0.jar
com.sap.it.commons.odata2.annotations-1.78.0.jar
com.sap.it.commons.thread.annotation-1.81.0.jar
com.sap.it.commons.validation-1.81.0.jar
com.sap.it.config.commons-1.50.0.jar
com.sap.it.config.monitor-1.50.0.jar
com.sap.it.config.read.impl-1.50.0.jar
com.sap.it.config.read.persistent.impl-1.50.0.jar
com.sap.it.config.types.impl-1.50.0.jar
com.sap.it.elster.component-1.10.0.jar
com.sap.it.elster.monitor-1.10.0.jar
com.sap.it.eric.wrapper.api-33.4.4.0.jar
com.sap.it.eric.wrapper.lib-33.4.4.0.jar
com.sap.it.eric.wrapper.linux.x86_64-33.4.4.0.jar
com.sap.it.iflow.model-2.84.4.jar
com.sap.it.iflow.saxonee-3.26.0.jar
com.sap.it.jms_1.1_fragment-3.26.0.jar
com.sap.it.km.api.event-1.10.0.jar
com.sap.it.nm-2.87.0.jar
com.sap.it.nm.commands-2.87.0.jar
com.sap.it.nm.commands.profile-2.87.0.jar
com.sap.it.nm.component-2.87.0.jar
com.sap.it.nm.concurrent-2.87.0.jar
com.sap.it.nm.core.agent-2.85.1.jar
com.sap.it.nm.core.agent.logmsg-2.85.1.jar
com.sap.it.nm.core.commands.support-2.85.1.jar
com.sap.it.nm.core.concurrent-2.85.1.jar
com.sap.it.nm.core.deploy-2.85.1.jar
com.sap.it.nm.core.deploy.logmsg-2.85.1.jar
com.sap.it.nm.core.event.support-2.85.1.jar
com.sap.it.nm.core.fndt.cmd.handler-2.85.1.jar
com.sap.it.nm.core.fndt.diag-2.85.1.jar
com.sap.it.nm.core.fndt.metrics-2.85.1.jar
com.sap.it.nm.core.fsm-2.85.1.jar
com.sap.it.nm.core.init-2.85.1.jar
com.sap.it.nm.core.init-config-2.85.1.jar
com.sap.it.nm.core.init-logmsg-2.85.1.jar
com.sap.it.nm.core.init.db-2.85.1.jar
com.sap.it.nm.core.jdk.http-2.85.1.jar
com.sap.it.nm.core.logmsg-2.85.1.jar
com.sap.it.nm.core.monitor.deadlock-2.85.1.jar
com.sap.it.nm.core.public.lock.manager-2.85.1.jar
com.sap.it.nm.core.public.lock.store.access-2.85.1.jar
com.sap.it.nm.core.store.access-2.85.1.jar
com.sap.it.nm.core.store.ddl-2.85.1.jar
com.sap.it.nm.core.store.fs-2.85.1.jar
com.sap.it.nm.core.store.jdbc-2.85.1.jar
com.sap.it.nm.core.store.logmsg-2.85.1.jar
com.sap.it.nm.core.talk2-2.85.1.jar
com.sap.it.nm.core.talk2.jms-2.85.1.jar
com.sap.it.nm.core.talk2.logmsg-2.85.1.jar
com.sap.it.nm.core.talk2.util-2.85.1.jar
com.sap.it.nm.core.util-2.85.1.jar
com.sap.it.nm.core.util.osgi-2.85.1.jar
com.sap.it.nm.http-2.87.0.jar
com.sap.it.nm.plaf.neo.audit-2.84.1.jar
com.sap.it.nm.plaf.neo.commons-2.84.1.jar
com.sap.it.nm.plaf.neo.commons.lm-2.84.1.jar
com.sap.it.nm.plaf.neo.deploy-2.84.1.jar
com.sap.it.nm.plaf.neo.diag-2.84.1.jar
com.sap.it.nm.plaf.neo.diag.logmsg-2.84.1.jar
com.sap.it.nm.plaf.neo.init-2.84.1.jar
com.sap.it.nm.plaf.neo.init.db-2.84.1.jar
com.sap.it.nm.plaf.neo.shell.karaf-2.84.1.jar
com.sap.it.nm.plaf.neo.talk2-2.84.1.jar
com.sap.it.nm.plaf.neo.types-2.84.1.jar
com.sap.it.nm.shared-2.87.0.jar
com.sap.it.nm.spi-2.84.0.jar
com.sap.it.nm.spi.commands-2.84.0.jar
com.sap.it.nm.spi.http-2.84.0.jar
com.sap.it.nm.spi.metrics-2.84.0.jar
com.sap.it.nm.spi.talk-2.84.0.jar
com.sap.it.nm.spi.talk2-2.84.0.jar
com.sap.it.nm.spi.types-2.84.0.jar
com.sap.it.nm.spi.types.entity-2.84.0.jar
com.sap.it.nm.spi.types.http-2.84.0.jar
com.sap.it.nm.spi.types.talk-2.84.0.jar
com.sap.it.nm.spi.util-2.84.0.jar
com.sap.it.nm.talk-2.87.0.jar
com.sap.it.nm.talk.types-2.87.0.jar
com.sap.it.nm.types-2.87.0.jar
com.sap.it.nm.types.profile-2.87.0.jar
com.sap.it.node.stack.profile-5.27.13.jar
com.sap.it.op-1.25.0.jar
com.sap.it.op.agent-2.84.4.jar
com.sap.it.op.agent.api-2.84.4.jar
com.sap.it.op.agent.archiving-2.84.4.jar
com.sap.it.op.agent.collector.camel-2.84.4.jar
com.sap.it.op.agent.collector.cxf-2.84.4.jar
com.sap.it.op.agent.commands-1.80.0.jar
com.sap.it.op.agent.component.check-2.84.4.jar
com.sap.it.op.agent.ed.notifier.db-2.84.4.jar
com.sap.it.op.agent.ed.plugins.camel-2.84.4.jar
com.sap.it.op.agent.handler-2.84.4.jar
com.sap.it.op.agent.logging-2.84.4.jar
com.sap.it.op.agent.mpl-2.84.4.jar
com.sap.it.op.agent.mpl.camel-2.84.4.jar
com.sap.it.op.agent.mpl.factory.impl-2.84.4.jar
com.sap.it.op.agent.mpl.hystrix-2.84.4.jar
com.sap.it.op.agent.mpl.impl-2.84.4.jar
com.sap.it.op.agent.spi-2.84.4.jar
com.sap.it.op.agent.trace-2.84.4.jar
com.sap.it.op.agent.trace.cxf.impl-2.84.4.jar
com.sap.it.op.alert-2.84.4.jar
com.sap.it.op.cfglog-2.84.4.jar
com.sap.it.op.cfglog.osgi-2.84.4.jar
com.sap.it.op.component.access.osgi-1.25.0.jar
com.sap.it.op.component.check-1.25.0.jar
com.sap.it.op.data-2.84.4.jar
com.sap.it.op.data.tools-2.84.4.jar
com.sap.it.op.ed.impl-2.84.4.jar
com.sap.it.op.ed.subscribe.api-2.84.4.jar
com.sap.it.op.jpahelper-2.84.4.jar
com.sap.it.op.jutils-2.84.4.jar
com.sap.it.op.mpl-2.84.4.jar
com.sap.it.op.persistence.component.check-2.84.4.jar
com.sap.it.op.security-1.80.0.jar
com.sap.it.public.adapter.api-2.25.0.jar
com.sap.it.public.api-2.25.0.jar
com.sap.it.public.generic.api-2.25.0.jar
com.sap.it.public.spi-2.25.0.jar
com.sap.it.quartz.monitoring-2.3.0.jar
com.sap.it.quartz.runtime-persistence-2.3.0.jar
com.sap.it.rt.adapter.facebook.component-1.5.1.jar
com.sap.it.rt.adapter.https.http.component-1.63.0.jar
com.sap.it.rt.adapter.https.http.monitoring-1.63.0.jar
com.sap.it.rt.adapter.jdbc.component-1.19.0.jar
com.sap.it.rt.adapter.jdbc.ds.artifact.handler-1.19.0.jar
com.sap.it.rt.adapter.jdbc.ds.artifact.reader-1.19.0.jar
com.sap.it.rt.adapter.jdbc.ds.manager-1.19.0.jar
com.sap.it.rt.adapter.jdbc.monitoring-1.19.0.jar
com.sap.it.rt.adapter.ldap-component-1.70.0.jar
com.sap.it.rt.adapter.ldap-monitoring-1.70.0.jar
com.sap.it.rt.adapter.ldap.neo.url.resolver-1.70.0.jar
com.sap.it.rt.adapter.odata.auth-1.70.0.jar
com.sap.it.rt.adapter.odata.auth.facade-1.70.0.jar
com.sap.it.rt.adapter.odc-monitoring-1.70.0.jar
com.sap.it.rt.adapter.odc.auth-1.70.0.jar
com.sap.it.rt.adapter.openconnector.s-1.13.1.jar
com.sap.it.rt.adapter.processdirect.component-1.14.0.jar
com.sap.it.rt.adapter.rfc.capabilities-1.20.0.jar
com.sap.it.rt.adapter.rfc.component-1.20.0.jar
com.sap.it.rt.adapter.rfc.monitoring-1.20.0.jar
com.sap.it.rt.adapter.secure.instances.provider.impl-1.70.0.jar
com.sap.it.rt.adapter.sfsf.sf-cachehandler-1.54.0.jar
com.sap.it.rt.adapter.sfsf.sf-component-1.54.0.jar
com.sap.it.rt.adapter.sfsf.sf-core-1.54.0.jar
com.sap.it.rt.adapter.sfsf.sf-language-1.54.0.jar
com.sap.it.rt.adapter.sfsf.sf-monitoring-1.54.0.jar
com.sap.it.rt.adapter.sfsf.sf-persistence-1.54.0.jar
com.sap.it.rt.adapter.sfsf.sf-persistence.impl-1.54.0.jar
com.sap.it.rt.adapter.sfsf.sf-restclient-1.54.0.jar
com.sap.it.rt.adapter.sfsf.sf-wsclient-1.54.0.jar
com.sap.it.rt.adapter.twitter.component-1.6.0.jar
com.sap.it.rt.components.b2b.ariba.component-2.27.2.jar
com.sap.it.rt.components.b2b.ariba.monitoring-2.27.2.jar
com.sap.it.rt.components.b2b.as2.component-2.27.2.jar
com.sap.it.rt.components.b2b.as2.monitoring-2.27.2.jar
com.sap.it.rt.components.b2b.as2.registry-2.27.2.jar
com.sap.it.rt.components.b2b.as4.adapter-2.27.2.jar
com.sap.it.rt.components.b2b.edi.core-2.27.2.jar
com.sap.it.rt.components.b2b.edi.edifact-2.27.2.jar
com.sap.it.rt.components.b2b.edi.iflmap.capabilities-2.27.2.jar
com.sap.it.rt.components.b2b.edi.x12-2.27.2.jar
com.sap.it.rt.components.b2b.esb.b2b.commons-2.27.2.jar
com.sap.it.rt.components.b2b.metering.event.delegator-2.27.2.jar
com.sap.it.rt.components.b2b.nr.capabilities-2.27.2.jar
com.sap.it.rt.components.b2b.nr.processor-2.27.2.jar
com.sap.it.rt.components.b2b.xml.validator-2.27.2.jar
com.sap.it.rt.rfc.extensions.rfc.library-1.23.0.jar
com.sap.it.rt.rfc.extensions.rfc.utils-1.23.0.jar
com.sap.it.rt.utils.logging-1.20.0.jar
com.sap.it.rt.utils.oAuth-1.20.0.jar
com.sap.it.rt.utils.validation-1.20.0.jar
com.sap.it.saxonee-9.9.1.6-sap-01.jar
com.sap.it.script.artifact.state-2.13.0.jar
com.sap.it.script.com.sap.groovy.engine-2.13.0.jar
com.sap.it.script.com.sap.groovy.script.engine-2.13.0.jar
com.sap.it.script.com.sap.rhino.engine-2.13.0.jar
com.sap.it.script.custom-development-2.13.0.jar
com.sap.it.script.script.artifact.compilation.provider-2.13.0.jar
com.sap.it.script.script.artifact.osgi-2.13.0.jar
com.sap.it.script.script.engine.api-2.13.0.jar
com.sap.it.spc.iflow.step.test.commands-1.72.0.jar
com.sap.it.spc.iflow.step.test.commands.handler-1.72.0.jar
com.sap.it.util.thread-2.49.0.jar
com.sap.it.util.thread.osgi-2.49.0.jar
com.sap.it.wrappers.olingo.odata2.annotation.processor.core.wrapper-3.26.0.jar
com.sap.it.wrappers.olingo.odata2.core.wrapper-3.26.0.jar
com.sap.it.wrappers.opensaml.wrapper-3.26.0.jar
com.sap.it.wrappers.org.json.wrapper-3.26.0.jar
com.sap.messaging.clientfactory.hcp-1.10.0.jar
com.sap.messaging.clientfactory.jms-1.10.0.jar
com.sap.messaging.clientfactory.solace-1.10.0.jar
com.sap.messaging.clientfactory.spi-1.10.0.jar
com.sap.messaging.clientfactory.spi.jms-1.10.0.jar
com.sap.org.apache.camel.xmlsecurity-1.67.0.jar
com.sap.platform.lib.virus.scanner-1.13.0.jar
com.sap.platform.lib.virus.scanner.impl-1.13.0.jar
com.sap.security.core.server.csi-1.0.8.jar
com.sap.security.nw.vsi-2.8.2.sap-01.jar
com.sap.sod.camel.idocsoap.monitor-1.30.0.jar
com.sap.sod.utils.idoc-1.30.0.jar
com.solacesystems.sol-jms-10.12.1.jar
com.sun.jna-5.7.0.jar
com.typesafe.netty.reactive-streams-2.0.3.jar
com.zaxxer.HikariCP-3.4.5.jar
content.txt
deploy.json
eclipselink.ext-2.85.1.jar
Facebook.monitor-1.5.1.jar
hystrix-osgi-1.4.18.jar
io.netty.buffer-4.1.63.Final.jar
io.netty.codec-4.1.63.Final.jar
io.netty.codec-http-4.1.63.Final.jar
io.netty.codec-socks-4.1.63.Final.jar
io.netty.common-4.1.63.Final.jar
io.netty.handler-4.1.63.Final.jar
io.netty.handler-proxy-4.1.63.Final.jar
io.netty.resolver-4.1.63.Final.jar
io.netty.transport-4.1.63.Final.jar
io.netty.transport-native-epoll-4.1.63.Final.jar
io.netty.transport-native-kqueue-4.1.63.Final.jar
io.netty.transport-native-unix-common-4.1.63.Final.jar
javax.ws.rs-api-2.1.99.b01.jar
JDBC.monitor-1.3.0.jar
joda-time-2.10.1.jar
liquibase.frag-2.85.1.jar
lz4-java-1.7.1.jar
odata-monitoring-1.70.0.jar
olingo-odata2-annotation-processor-api-3.0.0.sap-17.jar
olingo-odata2-api-3.0.0.sap-17.jar
olingo-odata2-api-annotation-3.0.0.sap-17.jar
OpenConnectors.monitor-1.0.0.jar
org.antlr.antlr4-runtime-4.7.2.jar
org.apache.activemq.activemq-client-5.16.1.sap-03.jar
org.apache.activemq.activemq-jms-pool-5.16.1.jar
org.apache.activemq.activemq-pool-5.16.1.jar
org.apache.camel.camel-ahc-2.24.2.sap-21.jar
org.apache.camel.camel-amqp-2.24.2.jar
org.apache.camel.camel-base64-2.24.2.jar
org.apache.camel.camel-blueprint-2.24.2.sap-21.jar
org.apache.camel.camel-core-2.24.2.sap-21.jar
org.apache.camel.camel-core-osgi-2.24.2.jar
org.apache.camel.camel-csv-2.24.2.jar
org.apache.camel.camel-cxf-2.24.2.sap-21.jar
org.apache.camel.camel-cxf-transport-2.24.2.jar
org.apache.camel.camel-facebook-2.24.2.jar
org.apache.camel.camel-ftp-2.24.2.sap-21.jar
org.apache.camel.camel-http-common-2.24.2.sap-21.jar
org.apache.camel.camel-jms-2.24.2.sap-21.jar
org.apache.camel.camel-kafka-2.24.2.sap-21.jar
org.apache.camel.camel-mail-2.24.2.sap-21.jar
org.apache.camel.camel-netty4-2.24.2.sap-21.jar
org.apache.camel.camel-quartz-2.24.2.jar
org.apache.camel.camel-quartz2-2.24.2.jar
org.apache.camel.camel-saxon-2.24.2.jar
org.apache.camel.camel-servlet-2.24.2.sap-21.jar
org.apache.camel.camel-spring-2.24.2.jar
org.apache.camel.camel-spring-ldap-2.24.2.jar
org.apache.camel.camel-sql-2.24.2.jar
org.apache.camel.camel-tarfile-2.24.2.sap-21.jar
org.apache.camel.camel-twitter-2.24.2.jar
org.apache.camel.camel-zipfile-2.24.2.jar
org.apache.commons.collections-3.2.2.jar
org.apache.commons.commons-beanutils-1.9.4.jar
org.apache.commons.commons-compress-1.21.0.jar
org.apache.commons.commons-pool2-2.9.0.jar
org.apache.commons.csv-1.6.0.jar
org.apache.commons.lang3-3.9.0.jar
org.apache.commons.net-3.6.0.jar
org.apache.commons.pool-1.6.0.jar
org.apache.cxf.cxf-core-3.2.11.sap-03.jar
org.apache.cxf.cxf-rt-bindings-soap-3.2.11.sap-03.jar
org.apache.cxf.cxf-rt-bindings-xml-3.2.11.sap-03.jar
org.apache.cxf.cxf-rt-databinding-jaxb-3.2.11.sap-03.jar
org.apache.cxf.cxf-rt-features-logging-3.2.11.sap-03.jar
org.apache.cxf.cxf-rt-frontend-jaxrs-3.2.11.sap-03.jar
org.apache.cxf.cxf-rt-frontend-jaxws-3.2.11.sap-03.jar
org.apache.cxf.cxf-rt-frontend-simple-3.2.11.sap-03.jar
org.apache.cxf.cxf-rt-management-3.2.11.sap-03.jar
org.apache.cxf.cxf-rt-rs-client-3.2.11.sap-03.jar
org.apache.cxf.cxf-rt-rs-extension-providers-3.2.11.sap-03.jar
org.apache.cxf.cxf-rt-rs-extension-search-3.2.11.sap-03.jar
org.apache.cxf.cxf-rt-rs-service-description-3.2.11.sap-03.jar
org.apache.cxf.cxf-rt-security-3.2.11.sap-03.jar
org.apache.cxf.cxf-rt-security-saml-3.2.11.sap-03.jar
org.apache.cxf.cxf-rt-transports-http-3.2.11.sap-03.jar
org.apache.cxf.cxf-rt-ws-addr-3.2.11.sap-03.jar
org.apache.cxf.cxf-rt-ws-policy-3.2.11.sap-03.jar
org.apache.cxf.cxf-rt-ws-rm-3.2.11.sap-03.jar
org.apache.cxf.cxf-rt-ws-security-3.2.11.sap-03.jar
org.apache.cxf.cxf-rt-wsdl-3.2.11.sap-03.jar
org.apache.felix.scr.compat-1.0.4.jar
org.apache.geronimo.specs.geronimo-j2ee-management_1.1_spec-1.0.1.jar
org.apache.geronimo.specs.geronimo-jms_2.0_spec-1.0.0.alpha-2.jar
org.apache.neethi-3.1.1.jar
org.apache.olingo.odata-client-api-4.7.1.sap-18.jar
org.apache.olingo.odata-client-core-4.7.1.sap-18.jar
org.apache.olingo.odata-commons-api-4.7.1.sap-18.jar
org.apache.olingo.odata-commons-core-4.7.1.sap-18.jar
org.apache.qpid.jms.client-0.59.0.jar
org.apache.qpid.proton-j-0.33.8.jar
org.apache.santuario.xmlsec-2.1.4.jar
org.apache.servicemix.bundles.c3p0-0.9.5.4_1.jar
org.apache.servicemix.bundles.facebook4j-2.4.12.1.jar
org.apache.servicemix.bundles.jzlib-1.0.7.2.jar
org.apache.servicemix.bundles.kafka-clients-2.7.0.1.jar
org.apache.servicemix.bundles.quartz-1.8.6.1.jar
org.apache.servicemix.bundles.spring-batch-infrastructure-4.1.2.RELEASE_1.jar
org.apache.servicemix.bundles.spring-beans-5.3.8.1.jar
org.apache.servicemix.bundles.spring-context-5.3.8.1.jar
org.apache.servicemix.bundles.spring-core-5.3.8.1.jar
org.apache.servicemix.bundles.spring-expression-5.3.8.1.jar
org.apache.servicemix.bundles.spring-jdbc-5.3.8.1.jar
org.apache.servicemix.bundles.spring-jms-5.3.8.1.jar
org.apache.servicemix.bundles.spring-ldap-2.3.2.RELEASE_2.jar
org.apache.servicemix.bundles.spring-tx-5.3.8.1.jar
org.apache.servicemix.bundles.twitter4j-4.0.7.1.jar
org.apache.servicemix.bundles.wsdl4j-1.6.3.1.jar
org.apache.servicemix.bundles.xmlresolver-1.2.0.5.jar
org.apache.ws.xmlschema.core-2.2.4.jar
org.apache.wss4j.wss4j-bindings-2.2.4.jar
org.apache.wss4j.wss4j-policy-2.2.4.jar
org.apache.wss4j.wss4j-ws-security-common-2.2.4.jar
org.apache.wss4j.wss4j-ws-security-dom-2.2.4.jar
org.apache.wss4j.wss4j-ws-security-policy-stax-2.2.4.jar
org.apache.wss4j.wss4j-ws-security-stax-2.2.4.jar
org.asynchttpclient.async-http-client-2.7.0.sap-04.jar
org.asynchttpclient.async-http-client-netty-utils-2.7.0.sap-04.jar
org.codehaus.jettison.jettison-1.4.0.jar
org.fusesource.hawtbuf.hawtbuf-1.11.0.jar
org.liquibase.osgi-3.6.2.sap-01.jar
org.postgresql.jdbc-42.2.14.jar
org.quartz-scheduler.quartz-2.3.2.sap-02.jar
org.reactivestreams.reactive-streams-1.0.2.jar
org.springframework.data.core-1.13.12.RELEASE.jar
org.xerial.snappy.snappy-java-1.1.8.1.jar
ProcessDirect.monitor-1.1.3.jar
scc.proxy-1.60.1.jar
Twitter.monitor-1.1.1.jar
former_member187270
Participant
0 Kudos
Hello Vadim,

I tried with the modify script shared above and I am facing "FileNotFoundException". Can you please help.


Regards,

Quddus.
vadimklimov
Active Contributor
Hello Quddus,

Since a location of deployed bundles changed - and to allow further dynamic determination of their current location, after a bundle ID (bundleId) has been identified in the code snippet above, you can use OSGi Framework API to find a location of that bundle. Example is below:
BundleContext context = FrameworkUtil.getBundle(Message).bundleContext
String location = context.getBundle(bundleId as long).location

(also ensure that you add org.osgi.framework.BundleContext and org.osgi.framework.FrameworkUtil to imports section of a script)

After the location of a bundle has been identified, you shall be able to access file content by its location.

Regards,

Vadim

 
former_member207667
Participant
0 Kudos
Hi Vadim,

Where can we add this piece of code in the previous script (September 2019)?

Would you mind updating that one please?

 

Being able to test the scripts in eclipse would be great, but I have been fighting with this for a while now (downloading the required jars) and I'm feeling I won't be able to solve it by myself.

Thanks in advance!

 
former_member207667
Participant

This works for downloading a war that contains most of the "problematic" classes, so devs can prepare the Groovy Scripting Testing Environment locally.

Vadim's script was beauuuuuutiful, and I have messed it up with some workarounds, just to get it working again.

It wont work for all missing classes, but it does work, as stated before, for the "problematic ones". For the other ones, Google will do.

I have also added some comments to the code and two new features:

  • Response Type (File), so use the "Send and Download" button in Postman to get the file (takes a bit to get executed).
  • Custom HTTP Header in Response "JarName" with the name of the Jar containing the incoming class (QP)
import com.sap.gateway.ip.core.customdev.util.Message;
import java.util.HashMap;
import org.osgi.framework.BundleContext
import org.osgi.framework.FrameworkUtil

def Message processData(Message message) {

//Get the className from the incoming QP
String httpQuery = message.getHeaders()["CamelHttpQuery"]
int index = httpQuery.indexOf("=")
String className = httpQuery.substring(index + 1) // Example: "com.sap.it.script.logging.ILogger";

Class clazz = Class.forName(className)
URI classFilePath = clazz.protectionDomain.codeSource.location.toURI()

String regex = '\\/\\/(.*?)\\/!\\/'
def matcher = (classFilePath =~ regex)
String bundleIdVersion = matcher[0].getAt(1)
String bundleId = bundleIdVersion.take(bundleIdVersion.indexOf('.'))

//Get jar location in server
BundleContext context = FrameworkUtil.getBundle(clazz).bundleContext
String location = context.getBundle(bundleId as long).location//This returns "jar:file:/home/vcap/app/webapps/stack.worker_cf.karaf-6.20.11.war!com.sap.it.public.api-2.25.0.jar"

//Following code is to get the war path cleaned (contains the SAP Jars needed)
location = location.replace("jar:file:","")
String[] war_jar = location.split('!')

//Read war
File classFile = new File(war_jar[0])

//Add jar to response for postman "Send and download"
message.setBody(classFile.bytes);
message.setHeader("Content-Type", "application/java-archive");

//Also add the jar name that contains the incoming class name, in order to take only that one from the war
message.setHeader("JarName", war_jar[1]);

return message
}

Example:

GET --> https://xxxxxx/http/external/trigger?lib=com.sap.it.api.msg.ExchangePropertyProvider

Regards,

Mikel

Dwipayan96
Explorer
0 Kudos
If you are trying to get the CPI JAR files in 2023, then use the below groovy script inside your IFlow and you might need to download some extra libraries if you are setting this up in IntelliJ IDEA.

  1. slf4j-api-2.0.9

  2. slf4j-simple-2.0.9

  3. javax.activation-api-1.2.0

  4. org.osgi.core-6.0.0

  5. cloud.integration.script.apis-2.7.1


Note: I have mentioned the version name as I have downloaded this at the time of setup, You can also download the latest JAR files.

The below script is a modification of code written by mikel.maesozelaya
import com.sap.gateway.ip.core.customdev.util.Message;
import java.util.HashMap;
import org.osgi.framework.BundleContext
import org.osgi.framework.FrameworkUtil

def Message processData(Message message) {
String className = 'com.sap.gateway.ip.core.customdev.util.Message'

StringBuilder builder = new StringBuilder()

Class clazz = Class.forName(className)
URI classFilePath = clazz.protectionDomain.codeSource.location.toURI()

String regex = '\\/\\/(.*?)\\/!\\/'
def matcher = (classFilePath =~ regex)
String bundleIdVersion = matcher[0].getAt(1)
String bundleId = bundleIdVersion.take(bundleIdVersion.indexOf('.'))
String bundleVersion = bundleIdVersion.drop(bundleId.length() + 1)
String cacheBundleFilePath = "/usr/sap/ljs/data/cache/bundle${bundleId}/version${bundleVersion.replace(':', '.')}/bundle.jar"

BundleContext context = FrameworkUtil.getBundle(clazz).bundleContext
String location = context.getBundle(bundleId as long).location

//Following code is to get the war path cleaned (contains the SAP Jars needed)
location = location.replace("jar:file:","")
String[] war_jar = location.split('!')

//Read war
File classFile = new File(war_jar[0])

//Add jar to response for postman "Send and download"
message.setBody(classFile.bytes);
message.setHeader("Content-Type", "application/java-archive");

//Also add the jar name that contains the incoming class name, in order to take only that one from the war
message.setHeader("JarName", war_jar[1]);

return message
}

 

Regards,

Dwipayan Gupta
Labels in this area