0

We are going to gather some statics in SAP BTP Neo environment with FRun (not support CF). To implement the tracing of outgoing connections calls. I need to update "SAP-PASSPORT" and forward it as a header.

I followed SAP official documentation to implement it. https://help.sap.com/viewer/ea72206b834e4ace9cd834feed6c0e09/Cloud/en-US/05a07108d34540d39b8a79e2caf96c8c.html

From my perspective, Step 2 could be skipped. The only thing I need to do is to get updated SAP Passport Header and set it to request header.

Sample code:

1.Implement ConnectionInfo interface

public class ConnectionInfoNeo implements ConnectionInfo {

    @Override
    public byte[] getId() {

        UUID uuid = java.util.UUID.randomUUID();

        ByteBuffer bb = ByteBuffer.wrap(new byte[16]);
        bb.putLong(uuid.getMostSignificantBits());
        bb.putLong(uuid.getLeastSignificantBits());

        return bb.array();
    }

    @Override
    public int getCounter() {
        return 1;
    }
}
  1. Get SapPassportHeader and set it to request header

     public class MyPurchaseOrderService {
    
         private static final Logger logger = LoggerFactory.getLogger(MyPurchaseOrderService.class);
    
         private static final ConnectionInfo CONNECTION_INFO = new ConnectionInfoNeo();
    
         public List<String> getPurchaseOrdersValueHelp(String purOrderStr) throws NamingException {
    
             String destinationName = "ErpQueryEndpoint";
    
             Context ctx = new InitialContext();
    
    
          logger.info("Context: " + ctx);
         //        ConnectivityConfiguration configuration = (ConnectivityConfiguration) ctx.lookup("java:comp/env/connectivityConfiguration");
         //        DestinationConfiguration destConfiguration = configuration.getConfiguration(destinationName);
         //        String destinationUrl = destConfiguration.getProperty("URL");
    

    SapPassportHeader sapPassportHeader = updateSapPassportHeader(ctx);

             HttpDestination destination = DestinationAccessor.getDestination(destinationName).asHttp();
    
             List<PurchaseOrder> purchaseOrders = new DefaultPurchaseOrderService()
                     .getAllPurchaseOrder()
                     .withHeader("SAP-PASSPORT", sapPassportHeader.getValue())
                     .filter(PurchaseOrder.PURCHASE_ORDER.startsWith(purOrderStr))
                     //.top(20)
                     .executeRequest(destination);
             List<String> purOrderNumList = new ArrayList<>();
             purchaseOrders.forEach(purchaseOrder -> {
                 purOrderNumList.add(purchaseOrder.getPurchaseOrder());
             });
             return purOrderNumList;
         }
    
         private SapPassportHeader updateSapPassportHeader(Context ctx) throws NamingException {
             SapPassportHeaderProvider sapPassportHeaderProvider = (SapPassportHeaderProvider) ctx.lookup("java:comp/env/SapPassportHeaderProvider");
             return sapPassportHeaderProvider.getSapPassportHeader(CONNECTION_INFO);
         }
    
     }
    

But when I tested in Neo environment, I got an exception.

2021 11 04 03:05:11#+00#ERROR#java.lang.Throwable##ZJE8SZH#https-jsse-nio-8041-exec-6#na#s3td7fnnd5#purchaseorderneoapplication#web#s3td7fnnd5#na#na#na#na#javax.naming.NameNotFoundException: Name [SapPassportHeaderProvider] is not bound in this Context. Unable to find [SapPassportHeaderProvider]. |
2021 11 04 03:05:11#+00#ERROR#java.lang.Throwable##ZJE8SZH#https-jsse-nio-8041-exec-6#na#s3td7fnnd5#purchaseorderneoapplication#web#s3td7fnnd5#na#na#na#na# at org.apache.naming.NamingContext.lookup(NamingContext.java:824) |
2021 11 04 03:05:11#+00#ERROR#java.lang.Throwable##ZJE8SZH#https-jsse-nio-8041-exec-6#na#s3td7fnnd5#purchaseorderneoapplication#web#s3td7fnnd5#na#na#na#na# at org.apache.naming.NamingContext.lookup(NamingContext.java:157) |
2021 11 04 03:05:11#+00#ERROR#java.lang.Throwable##ZJE8SZH#https-jsse-nio-8041-exec-6#na#s3td7fnnd5#purchaseorderneoapplication#web#s3td7fnnd5#na#na#na#na# at org.apache.naming.NamingContext.lookup(NamingContext.java:834) |
2021 11 04 03:05:11#+00#ERROR#java.lang.Throwable##ZJE8SZH#https-jsse-nio-8041-exec-6#na#s3td7fnnd5#purchaseorderneoapplication#web#s3td7fnnd5#na#na#na#na# at org.apache.naming.NamingContext.lookup(NamingContext.java:157) |
2021 11 04 03:05:11#+00#ERROR#java.lang.Throwable##ZJE8SZH#https-jsse-nio-8041-exec-6#na#s3td7fnnd5#purchaseorderneoapplication#web#s3td7fnnd5#na#na#na#na# at org.apache.naming.NamingContext.lookup(NamingContext.java:834) |
2021 11 04 03:05:11#+00#ERROR#java.lang.Throwable##ZJE8SZH#https-jsse-nio-8041-exec-6#na#s3td7fnnd5#purchaseorderneoapplication#web#s3td7fnnd5#na#na#na#na# at org.apache.naming.NamingContext.lookup(NamingContext.java:171) |
2021 11 04 03:05:11#+00#ERROR#java.lang.Throwable##ZJE8SZH#https-jsse-nio-8041-exec-6#na#s3td7fnnd5#purchaseorderneoapplication#web#s3td7fnnd5#na#na#na#na# at org.apache.naming.SelectorContext.lookup(SelectorContext.java:161) |
2021 11 04 03:05:11#+00#ERROR#java.lang.Throwable##ZJE8SZH#https-jsse-nio-8041-exec-6#na#s3td7fnnd5#purchaseorderneoapplication#web#s3td7fnnd5

#na#na#na#na#   at javax.naming.InitialContext.lookup(InitialContext.java:417) |

How to register SapPassportHeaderProvider in JNDI? Is there any simple way to get the header in Cloud SDK Neo for Java7 project?

================================================================

I added some resource configuration in web.xml. The above issue is resolved. But SAP passport header is always null.

<resource-ref>
        <res-ref-name>connectivityConfiguration</res-ref-name>
        <res-type>com.sap.core.connectivity.api.configuration.ConnectivityConfiguration</res-type>
    </resource-ref>

    <resource-ref>
        <res-ref-name>SapPassportHeaderProvider</res-ref-name>
        <res-type>com.sap.core.connectivity.api.sappassport.SapPassportHeaderProvider</res-type>
    </resource-ref>

2021 11 04 04:14:58#+00#ERROR#org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/PurchaseOrderNeo-application].[com.bosch.sbs.po.servet.PurchaseOrderValueHelpServlet]##ZJE8SZH#https-jsse-nio-8041-exec-7#na#s3td7fnnd5#purchaseorderneoapplication#web#s3td7fnnd5#na#na#na#na#Servlet.service() for servlet [com.bosch.sbs.po.servet.PurchaseOrderValueHelpServlet] in context with path [/PurchaseOrderNeo-application] threw exception com.sap.cloud.sdk.cloudplatform.exception.ShouldNotHappenException: com.sap.cloud.sdk.cloudplatform.thread.exception.ThreadContextExecutionException: java.lang.NullPointerException: while trying to invoke the method com.sap.core.connectivity.api.sappassport.SapPassportHeader.getValue() of a null object loaded from local variable 'sapPassportHeader'

========================================================================= enter image description here

Jerry Zhang
  • 179
  • 3
  • 13

1 Answers1

1

Since you tagged your question with sap-cloud-sdk, I would respond on behalf of the library.

It works independent form the API provided by [SAP official documentation][2]. You would just need to add the SAP internal dependency com.sap.cloud.sdk.cloudplatform:sap-passport into your project. As long as you are using the Destination API the respective headers are added automatically to your outgoing requests.

Alexander Dümont
  • 903
  • 1
  • 5
  • 9
  • Thank you very much for your information. But I could not open SAP Internal dependency link. Is it publicly available? Is this dependency available in central maven repository? – Jerry Zhang Nov 04 '21 at 09:01
  • I checked it in cloud sdk project for neo. Seems the dependency is already involved in sdk-bom-3.56.0. Please see update above. – Jerry Zhang Nov 04 '21 at 09:12
  • Since the dependency is internal only (due to billing aspects) it can only be loaded if you point your Maven project to SAP Nexus repository. If this can be attached to your project, then you don't need any of the code from your original post - as far as we know. – Alexander Dümont Nov 04 '21 at 17:40
  • I am afraid not. Can I download the dependency from somewhere and install it to my local repository(similar to security libraries in previous version of cloud sdk)? – Jerry Zhang Nov 05 '21 at 05:12
  • I'm sorry, in this case the _SAP Cloud SDK_ can't help unfortunately. I would recommend following [the guide](https://help.sap.com/viewer/ea72206b834e4ace9cd834feed6c0e09/Cloud/en-US/05a07108d34540d39b8a79e2caf96c8c.html) in your original post. If there is a problem please approach colleagues with component id `BC-NEO-SEC` (NEO Security) or `BC-NEO-CON` (Neo to On-premise Connectivity service) via official channels e.g. ServiceNow. – Alexander Dümont Nov 05 '21 at 06:42