JCo server programming, properties and connection settings

Greetings, SAP professionals.
The reason I come to this forum is that I'm hoping to gain some insights into the use of the SAP Java Connector (JCo). I am a developer who was tasked with making a new component for a systems integration application. As is typical of integration software, our app can link together various different systems using a variety of protocols, as well as providing the means to apply business logic on messages passed from one location to another. We already have a connector acting as an SAP client which was implemented using JCo. Now, we were asked to develop a new component: a server capable of accepting RFCs from a remote SAP system acting as client. The server is to be created using the JCo classes, so basically an extension of JCo.Server, with some logic for creating function templates from configuration files.
However, while I'm understanding the structure of the Java API, it's not entirely clear to me just what the classes do. I've found the JavaDoc for JCo to be mostly descriptive of the interface of classes and methods, but not really explaining what these achieve, or how. So I'm hoping to be set straight, as I fear I'm kind of misunderstanding the functionality of JCo... Being mainly an integrations developer, I unfortunately often have to settle for gaining a superficial knowledge of a variety of systems to quickly interface with them, so I don't have any prior knowledge of SAP but still need to be able to implement something with JCo without too much delay.
The most important question I have is this: when a JCO.Server implementation is started, does it act as a fully standalone component capable of receiving calls, or does it merely act as a sort of listener for some main SAP system? I'm not talking about a reliability on the two .dll files (or .so for Linux) that are required for the use of JCo, I just wish to know if the JCo package is entirely self-sufficient for server functionality or if it is intended to be linked to some SAP system.
A second problem I have is that the parameters passed to various constructors aren't clear to me... I'm not familiar with SAP terminology, nor have I worked with any client apps that make use of an SAP system.
The meaning of client strings, gwhost, gwservice, ashost, system IDs and program IDs mostly elude me, especially when it comes to knowing what client parameters must match what server parameters.
In order to familiarize myself with the classes, I've tried playing around with them a bit trying to create a small test app that first starts a JCO.Server instance, then tries to make a remote function call to it with a JCO.Client (within the same class, for simplicity and debugging purposes). I was wondering if this actually makes sense... Would a JCo client be capable of connecting to a JCo server, all running purely in Java, or is that nonsense?
To eliminate some common troubleshooting options, I'll quicly describe the steps I've taken:
Both librfc32.dll and sapjcorfc.dll were placed in the Windows system32 folder. Maybe only librfd32 needs to be placed there, but I copied both anyway to make sure.
The directory containing the jar file and both dll files is included in my environment path variable.
I've added a line to the C:\Windows\system32\drivers\etc\services file as follows:
sapgw00          3300/tcp                           #SAP System Gateway Port
I've opened port 3300 in my Windows firewall. In fact, I also tested with the firewall completely turned off.
However, I do not manage to get my test class to work. I've tried ports 3300, 3200 and 3600. I've tried various permutations of the client and server properties. I've tried removing the line from the services file, which would prompt the client to state upon connecting that the service "sapgw00" is unknown. When I add it back in, the error changes to "partner not reached", so it is definitely picking something up.
The server itself starts just fine, but connecting through a client doesn't work. My class source code is posted below. Maybe what I'm trying to do doesn't make any sense, but at the moment it's my best guess.
I realize this is a pretty long post and the class, while not exactly big, also implies a bit of reading of its own. But if anyone could give me any answers that are new to me, I'd be hugely grateful. Right now I'm kind of stuck, and just setting up the service and letting our customer test on it is a somewhat slow approach that can't match developing and testing on one and the same host.
Preliminary thanks to everyone who took the effort to read this.
//Start of code
import java.util.Properties;
import com.sap.mw.jco.IFunctionTemplate;
import com.sap.mw.jco.IMetaData;
import com.sap.mw.jco.IRepository;
import com.sap.mw.jco.JCO;
public class Test {
     public static void main(String[] args) {
          Test test = new Test();
          ServerThread serverThread = test.new ServerThread();
          serverThread.start();
          while(!serverThread.isReady) {
               try {
                    Thread.sleep(5000);
               } catch(final InterruptedException i) {
                    System.out.println("Rudely awakened");
          try {
//               JCO.Function func = getSampleFunction(test, "STAY");
//               serverThread.server.handleRequest(func);
//               System.out.println(func.getExportParameterList().toXML());
//               func = getSampleFunction(test, "STOP");
//               serverThread.server.handleRequest(func);
//               System.out.println(func.getExportParameterList().toXML());
               final Properties clientProps = getClientProps();
               JCO.Client client = JCO.createClient(clientProps);
               client.connect();
               IRepository rep = JCO.createRepository("1", client);
               IFunctionTemplate templ = rep.getFunctionTemplate("TEST_FUNC");
               JCO.Function function = templ.getFunction();
               function.getImportParameterList().setValue("STAY", "FIELD1");
               client.execute(function);
               JCO.Function function2 = templ.getFunction();
               function2.getImportParameterList().setValue("STOP", "FIELD1");
               client.execute(function2);
          } catch(final Exception e) {
               e.printStackTrace(System.out);
               serverThread.requestStop();
               while(serverThread.isAlive) {
                    try {
                         Thread.sleep(5000);
                    } catch(final InterruptedException i) {
                         System.out.println("Rudely awakened");
          } finally {
     private static Properties getClientProps() {
          final Properties props = new Properties();
          props.setProperty("jco.client.client", "100");
          props.setProperty("jco.client.user", "");
          props.setProperty("jco.client.passwd", "");
          props.setProperty("jco.client.lang", "");
          props.setProperty("jco.client.sysnr", "00");
          props.setProperty("jco.client.ashost", "/H/localhost/S/sapgw00");
          props.setProperty("jco.client.gwhost", "localhost");
          props.setProperty("jco.client.gwserv", "sapgw00");
          return props;
     public class ServerThread extends Thread {
          public void run() {
               isAlive = true;
               IRepository repos = new TestRepository("testrep");
               repos.addFunctionInterfaceToCache(getFunctionInterface());
               server = new TestServer(repos);
               server.start();
               System.out.println("Server successfully started");
               isReady = true;
               while(!stop) {
                    try {
                         Thread.sleep(1000);
                    } catch(final InterruptedException i) {
                         System.out.println("Wouldn't let me sleep...");
                    stop = server.stopRequested;
               server.stop();
               isAlive = false;
               System.out.println("Server successfully stopped");
          public void requestStop() {
               server.requestStop();
          public TestServer server;
          public boolean isReady = false;
          public boolean isAlive = false;
     public class TestServer extends JCO.Server {
          public TestServer(IRepository rep) {
               super("localhost", "sapgw00", "PROGID", rep);
          public void handleRequest(JCO.Function fct) {
               try {
                    JCO.ParameterList importParams = fct.getImportParameterList();
                    final String importXML = importParams.toXML();
                    System.out.println("XML representation of import parameters: ");
                    System.out.println(importXML);
                    final String input = importParams.getString("FIELD1");
                    System.out.println("FIELD1 value: " + input);
                    JCO.ParameterList exportParams = fct.getExportParameterList();
                    if(input.equals("STOP")) {
                         exportParams.getField("FIELD2").setValue("OK");
                         stopRequested = true;
               catch(JCO.AbapException ex) {
                    throw ex;
               catch(Throwable t) {
                    throw new JCO.AbapException("SYSTEM_FAILURE", t.getMessage());
          public boolean checkAuthorization(String functionName, int authorMode, String partner, byte[] key) {
               System.out.println(functionName + " " + partner);
               return true;
          public void requestStop() {
               stopRequested = true;
          public boolean stopRequested = false;
     public class TestRepository extends JCO.BasicRepository implements IRepository {
          public TestRepository(String name) {
               super(name);
     public static IMetaData getFunctionInterface() {
          JCO.MetaData metaData = new JCO.MetaData("TEST_FUNC");
          metaData.addInfo("FIELD1", IMetaData.TYPE_STRING, 4);
          metaData.setFlags(0, IMetaData.IMPORT_PARAMETER);
          metaData.addInfo("FIELDX", IMetaData.TYPE_STRING, 8);
          metaData.setFlags(1, IMetaData.IMPORT_PARAMETER & IMetaData.OPTIONAL_PARAMETER);
          metaData.addInfo("FIELD2", IMetaData.TYPE_STRING, 2);
          metaData.setFlags(2, IMetaData.EXPORT_PARAMETER);
          return metaData;
     public static JCO.Function getSampleFunction(Test test, String s) {
          TestRepository testRep = test.new TestRepository("testrepository");
          testRep.addFunctionInterfaceToCache(getFunctionInterface());
          JCO.Function func = testRep.getFunctionTemplate("TEST_FUNC").getFunction();
          func.getImportParameterList().setValue(s, "FIELD1");
          return func;
     private static boolean stop = false;

If I understood you correctly, you want to provide a "service" that can be called from SAP. To provide this service you've chosen to implement an (external) RFC server program via JCo. One common method for RFC server programs is to register in SAP on the gateway - you do this by supplying the three parameters
<ol>
<li><b>jco.server.gwhost</b> -  SAP gateway host on which the server should be registered (so this would be the server name or IP address of the SAP gateway; localhost is only correct, if your RFC server program runs on the same server as the SAP gateway)</li>
<li><b>jco.server.gwserv</b>  - Gateway service, i.e. the port on which a registration can be done</li>
<li><b>jco.server.progid</b> - Program ID under which your RFC server program can be reached (free, made-up case sensitive name, that should represent the service your RFC server is providing)</li>
</ol>
So essentially you're creating a listener, that is registered in SAP and waits for any invocations. Within SAP they will define a <i>RFC destination</i>, which basically represents a TCP/IP connection pointing to the SAP gateway where you registered with the given program ID. If you want more details, check the SAP help pages for <a target="_blank" href="http://help.sap.com/saphelp_nw04/helpdata/en/22/04262b488911d189490000e829fbbd/content.htm">RFC destinations</a> (you're looking for destination type <b>T</b>, see explanations <a target="_blank" href="http://help.sap.com/saphelp_nw04/helpdata/en/22/042652488911d189490000e829fbbd/content.htm">here</a>).
Usually gateway host and service (port) are given to you by the SAP basis folks and you tell them which program ID you're using. They will then enter those parameters in an RFC destination of type <b>T</b> in SAP. So no need for any of the client parameters you've mentioned. Although, I'd like to repeat, it's usually handy to also have SAP logon parameters maintained on your RFC server program, so that you can utilize the repository data from SAP (might be irrelevant in your case).
Hope this clarifies it a bit...

Similar Messages

  • PI Configuration and connection settings between SAP ERP and peoplesoft

    Can someone please share some docs or the link  for the PI Configuration and connection settings for the connection between SAP ERP and people soft system. Thanks in advnce
    Regards
    krish

    Hello,
    The following links will be helpful in this regard:
    http://help.sap.com/saphelp_nw04s/helpdata/en/14/39084136b5f423e10000000a155106/frameset.htm
    http://help.sap.com/saphelp_nwpi711/helpdata/en/d9/f3d22f01c741bdb0e62a2f4205411c/content.htm

  • Powershell export User properties and policy settings

    is there a Powershell script "out-there" that export and import all the user properties from the User Profile service Application - including their individual placement on the various sections (contact, basic, details etc), and also including their
    policy settings (only me /everyone/replicate settings) - basic all the settings - and if the AD mapping is there as weel it would be nice...
    So I can export from environment A and then import them to environment B... ?

    Did you try this blog:
    POWERSHELL TO EXPORT / QUERY ALL USER PROFILE PROPERTIES AND AD MAPPINGS
    http://www.sharepointfix.com/2012/01/powershell-script-to-print-user-profile.html
    also
    SharePoint 2010: Updating User Profile Properties with PowerShell
    Please remember to mark your question as answered &Vote helpful,if this solves/helps your problem. ****************************************************************************************** Thanks -WS MCITP(SharePoint 2010, 2013) Blog: http://wscheema.com/blog

  • XL Reporter Scheduled Jobs and connection settings

    Company needs to decommission current SQL Server and move to new box.
    Company has many XL Reporter scheduled jobs that run on a client machine.
    When the new sql server is in place, what will happen to those jobs? The client machine SBO installation will be directed to the new sql server and the license server there. Will the scheduled jobs "know' from the SBO client to go to the new server for data? Or is the connection string somehow encapsulated in the scheduled job such that they will still try to access data on the old server?
    SBO 2007 A SP 00 PL 48
    (Yes, I know it's old. There are reasons.)
    TIA.

    Your 2nd guess is true: the connection string somehow encapsulated in the scheduled job such that they will still try to access data on the old server. It will not automatically find the new server unless new server has the identical settings.
    You probably need to re-schedule those jobs.
    Thanks,
    Gordon

  • JCo Server Programming

              I'm using SAP JCo version 2.0.8 to integrate with SAP 4.6C I'm familiar with using
              JCo as a client calling SAP, but currently I'm trying to setup JCo as a server
              on Weblogic. Does anyone have some insights in how to do this and would like
              to share this with us?
              Thanks!
              

    Hi,
    I've recently come upon this page in the JCo documentation:
    http://help.sap.com/saphelp_nw04/helpdata/en/b0/46e13d82fcfb34e10000000a114084/frameset.htm
    Does that help answering your questions?

  • Server | communications | ike and ipsec settings

    Hi
    How important are the settings in monitor regarding Ike and ipsec? I was
    having 3rd party site to site issues and started to modify these to try
    and resolve issues. It did not seem to help and I am thinking I should
    set them back. is there a way to reset them to defaults?
    Thanks,
    Will

    oops I do know.
    Would any of these cause an issue?
    The number on the left shows current the right shows previous.
    I am also getting a lot of ike abends. Not sure if that is related.
    IKE AUTHMETHOD 0 1
    IKE PFS 1 0
    IKE lifetime 7200 300
    ipsec hash alg for pss 1 2
    ipsec encr alg for pss 2 3
    IPSec encap mode 2 1
    SA lifetime 7200 1000
    And IPSec SA 1 0
    ESP Algorithm ID 0 2
    AH Algorithm ID 0 2
    Thanks,
    Craig Johnson wrote:
    > Do you remember which ones you changed?
    >
    > Craig Johnson
    > Novell Support Connection SysOp
    > *** For a current patch list, tips, handy files and books on
    > BorderManager, go to http://www.craigjconsulting.com ***
    >
    >

  • Script to perform post server build configurations and validate settings

    Hello!
    I would like to create a script that can set numerous Windows server settings and validate that they are indeed set correctly, based on a predefined list of settings.
    For example: A third party company deploys servers from templates.  I am tasked with going through the build and verifying certain configurations and settings are set, based on my company's build request. Depending on where the server resides (physically)
    it will get specific settings.
    Is there a way to script making the correct changes and also display a validation report that all the settings/attributes that were changed, meet the expected value?
    Settings like dns settings, netbios, pagefile size/location, Terminal Server host settings(session limits etc), local admin accounts, windows features, bginfo, drive letters, drive sizes, installed ram, number of cpu cores, date/timezone, and the list goes
    on.  I currently run a few batch files to make the changes, but I'm still required to check that the settings are correct.  It would be nice to have all the batch files rolled into a script that makes changes and then runs a validation test against
    those changes. Or at the least, make changes and display all of the current values/settings so I can validate they are the correct ones.
    I have little scripting/powershell experience.  I could use some assistance to get me going in the right direction.

    Here's some intro information that should give you a place to start pulling threads:
    http://blogs.technet.com/b/heyscriptingguy/archive/2014/03/09/weekend-scripter-intro-to-powershell-4-0-desired-state-configuration.aspx
    Don't retire TechNet! -
    (Don't give up yet - 13,225+ strong and growing)

  • JDriver for MS SQL Server 6.5 and Connection Pooling

    I was given the unfortunate task :-) of getting data out of M$FT SQL 6.5. I set
    up a JDBC connection pool using jDriver in mssqlserver4v65.jar, and created a
    JDBCDataSource for the pool. I am using a stateless session bean + JDBC (with
    the DAO pattern) to get data. In the DAO class I have an instance variable for
    the datasource, which I look up in the constructor. In the DAO's business method
    I RELIGIOUSLY call datasource.getConnect() first, and ALWAYS call connection.close()
    in the finally block. Now the initial requests are fine, but after a while I
    got a weblogic.common.ResourceException telling me there were no more connection
    available in the pool. Is this a jDriver bug? I never run into such a problem
    with an Oracle connection pool using the thin driver.
    Any insight will be greatly appreciated.
    Eric Ma

    Eric Ma wrote:
    Joe:
    Connection is a LOCAL variable declared in each method. DataSource is an instance
    variable.That sounds fine... let me see your code (main block plus finally block). How long does this
    take to reproduce? Show me your pool definition.
    thanks,
    Joe
    >
    >
    Eric
    Joseph Weinstein <[email protected]> wrote:
    Eric Ma wrote:
    I was given the unfortunate task :-) of getting data out of M$FT SQL6.5. I set
    up a JDBC connection pool using jDriver in mssqlserver4v65.jar, andcreated a
    JDBCDataSource for the pool. I am using a stateless session bean +JDBC (with
    the DAO pattern) to get data. In the DAO class I have an instancevariable for
    the datasource, which I look up in the constructor. In the DAO's businessmethod
    I RELIGIOUSLY call datasource.getConnect() first, and ALWAYS call connection.close()
    in the finally block. Now the initial requests are fine, but aftera while I
    got a weblogic.common.ResourceException telling me there were no moreconnection
    available in the pool. Is this a jDriver bug? I never run into sucha problem
    with an Oracle connection pool using the thin driver.
    Any insight will be greatly appreciated.
    Eric MaHi. Is the connection object an instance variable? That would be a problem.
    The connection object has to be a method variable to be safe from multithreading
    issues.
    Joe

  • JCo Server - ABAP to NWJ2EE - Metadata Access

    Hi Friends,
    we are here in a project, which also deals to fetch data from an external non ABAP system. The calling system is a 4.6C. We therefore use the JCo server service (registered RFC connection), which can be called by the 4.6C system. Basicly it works, but we discovered, that currently we get a single point of failure, because we have to provide repository information (connection information) within the visual admin.
    The help page
    <a href="http://help.sap.com/saphelp_nw04/helpdata/en/b0/46e13d82fcfb34e10000000a114084/frameset.htm">SAP JCo Server Programming</a> and its examples, would lead us to provide connection properties, e.g. within the coding. Therefore, within visual admin, section "JCo RFC Provider", JNDI name, program ID and connection properties are maintained. The J2EE application therefore use those predefined entries. When starting the first request to JCo server, metadata are being read from repository, which here must be the calling system (our 4.6C system). Within the repository section, you can only provide dedicated application server login information, not e.g. a load balanced one. Thus this is for reasons of high availability, a single point of failure. An ABAP instance itself is not HA required, because you can use multiple of them. The message service itself but is HA required.
    Now after this long explanation my question:
    Are we on the right way, using e.g. visual admin to define the registered server programs, etc - or is there a more integrated, flexible integration possible?
    Perhaps, we need only the correct entry point of documentation or workshops, to direct our project developers to the right way.
    All information I found about higher integration was only for Web Dynpro - and therefore for JCo client integration. But this is not our scenario.
    thanks a lot in advance for your replies,
    reiner leibig

    You might benefit by reading the JCO pdf delivered with the jco download from sapservice.com....(free)....
    Usually it is easier to define the structure and the function interface as an SAP function even if there is no body (abap to java). This means that the JCO will read correctly all the metainformation about the function. You then call the function as an RFC specifying the host...
    Have fun...
    In your case I would read carefully the example (getting the company code info etc...)
    It shows how to manipulate the table returned by ABAP...

  • Firefox unable to connect after brand new first time installation, IE can load fine, I have followed all directions for firefox can not connect but other programs can, and it did not solve the problem

    I have downloaded Firefox for the First time, Firefox can not connect to any website (Unable to COnnect), but IE can. I have followed all the directions on the page for firefox can not load when other programs can (Firefox connection settings,IPv6,DNS Prefetching, firewall settings)
    == This happened ==
    Every time Firefox opened
    == I downloaded it for the 1st time ==
    == User Agent ==
    Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Trident/4.0; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; .NET CLR 3.5.30729; .NET CLR 3.0.30729; MSN Optimized;US)

    http://support.mozilla.com/en-US/kb/Firewalls
    http://support.mozilla.com/en-US/kb/Cannot+connect+after+upgrading+Firefox
    http://support.mozilla.com/en-US/kb/Error+loading+web+sites
    http://kb.mozillazine.org/Error_loading_websites

  • JCo Server Shutdown

    I have implemented a JCo Server using Example 5 in Jco Documentation.
    The Server shuts down automatically every other day with no dumps leading no trails on how to debug.when we restart, it runs just fine.
    my hunch is that the threads are not properly handled or not releasing the memory, i m not sure.
    Does any one had similar problem or any clues ?
    Thanks,
    Sujatha

    hi:
    I also encountered  a  JCO Server problem which likes your problem above when SAP R/3 call java function.
    The SAP R/3 is 4.6c, the JCo package version is 2.0.7.
    In my java program, I start a Jco server and register that Jco server in R/3 sm59. In sm59 I register that connection as a TCP/IP connection.
    In the RZ11, I get the gateway information. 
    My java program is a servlet program, which is running on the WAS640. The program is referred to JCO example 5. I attach the original code in the attachment.
    When I start the Jco server, I get successful connection information in sm59. At that time, the ABAP program can call java program successfully.
    But unluckily I find that link is not stable. Maybe after an hour or several hours, when I run the ABAP program again, RFC error message will popup. At that time I test the connection in sm59, an error message will show “the connection is not registered”. Also in SMGW I can’t find the java rfc connection. Then, I have to restart the jco server, establish a new rfc connection.
    I don’t know what happen. I think maybe it is my program problem(I search the JCO help and try to find a function setting the timeout. But I don’t find any). Maybe there is something to do with basis (I don’t know whether there is a timeout configuration in r/3 or there is a background job will clean up the java connection).
    Would you please give me some advices. I really don’t know how to fix that problem. Thank you for your help.

  • JCO Server Instances

    We have developed JCO Server program ,so that the ABAP calls the JCO Server program,so that we can set values in the Export Parameters of the RFM.This I wrote using the Example5 code,but I need to understand ,that if we define two or three instances of JCO.Server,what does it actually mean,does the ABAP program automatically calls these instances,how is the calls to JCO.Server made and to which server,how is that determined.
    Our scenario: We have written exit routines for our sales order creation,and we want to override the price  of the material ,obtaining from a separate database.So exit routines,RFMS which calls the handleRequest method of Server.How do we acheive concurrency in the request to Servers.

    Not quite sure if this is what you were asking, but..
    Is the JCO server program registered at the gateway?
    If so, and you run several instances which all use the same program ID, SAP gateway will load-balance the calls.
    http://help.sap.com/saphelp_nw04/helpdata/en/51/aea438ec2a7e26e10000009b38f8cf/content.htm

  • Where to find JCo server examples under NW04

    I am using NW04 and do not know where to look for or download demos showing how to set up a JCo server program that can be called into using ABAP.  I have seen references to a JCo.zip file, but that file seems to have been pulled from the downloads.  Can someone tell me where I can download sample programs?

    Hi,
    you can download Jco (and yes, documentation and examples are included in the download package) from SAP Service Marketplace at: http://service.sap.com/connectors -> SAP Java Connector -> Tools & Services and then select the Jco version you need from the right hand side frame.

  • JRE and Proxy Settings

    Hello,
    I've created a proxy.pac that's been deployed to our ouposts. It works fine except for one web application which is using java.
    Now, I figured out that it's because I have to not only change the proxy-settings for IE and Firefox, but also for Java. Point is, it's user-based. So every user has to make these changes to make them become active.
    My question is: Is there a way (probably by manipulating the net.properties) to make this change systemwide and not only limited to a single user?

    The application is a browser based application. It's partially HTML/XML (right frame with content) and partially Javabased (left frame with navigation tree).
    Now when I change the browsers' settings to use a pac-file as a proxy configuration file, the HTML/XML-based part is using the proxy setting that is set in the browsers' properties and connects by using the proxy. But the Java-side of the application seems to ignore these settings and tries to get a direct connection to the application. This ends in two different sessions where you have to login again in order to see the navigation-tree displayed. Since these two sessions are different from each other, they won't work together.
    After correcting the proxy settings for the java runtime engine to also work with the configurationfile it works just fine.
    As I said, we already found a solution for the problem itself. All we need to have now is a way to make the proxy-settings for java systemwide for we don't want to correct these settings for each and every user.

  • RFC  and connections test

    Hi all
    We need to test some data loads for RFC  and connection settings . How do we go about it ?
    Thanks all

    Hi,
    Actually choosing 'Check' option on source sytem is sufficient to check the conection seetings. If you do not satisfied with this, Do full load of any master data or full/initial upload of selective Transaction data(by filling setup tables).
    With rgds,
    Anil Kumar Sharma .P

Maybe you are looking for