Create a Custom Request Executor within Plugin

I want to know, if is possible create a custom Request Executor within a Plugin to deal with custom requests created by a custom TaskExecutor.

I know is possible create TaskExecutors and ServiceExecutors in a Plugin and expose them in the manifest.xml, but i want to know, can i do it with a RequestExecutor? if i expose the RequestExecutor as a Script package, will it work? should i create a RequestExecutor as a Custom class? I need to create this RequestExecutor to deal with partitioning in a custom TaskExecutor that i created, i dont want to do multithread execution, i want to do multihost execution

ExamplePlugin.zip (21.5 KB)

example of something I have , I removed a lot and just left what I think you need for ideas on how to get started.

1 Like

Thank you Alfi, but i found another aproach, i was reading the decompiled sailpoint iiq classes, and i saw a class called DynamicLoader, if you want to create a request executor, you can create a Rule, but instead od language=”beanshell” you can use language=”java” , like that:

<!DOCTYPE Rule PUBLIC "sailpoint.dtd" "sailpoint.dtd">

<Rule language="java" name="TesteClassLoader">
  <Description>Rule criada para teste de codigo.</Description>
  <Source>

import sailpoint.api.SailPointContext;
import sailpoint.object.Attributes;
import sailpoint.object.Partition;
import sailpoint.object.Request;
import sailpoint.object.RequestExecutor;
import sailpoint.request.RequestPermanentException;
import sailpoint.request.RequestTemporaryException;

public class TesteClassLoader implements RequestExecutor{

  @Override
  public void processCommand(Request arg0) {
    // TODO Auto-generated method stub
    throw new UnsupportedOperationException("Unimplemented method 'processCommand'");
  }

  @Override
  public boolean terminate() {
    // TODO Auto-generated method stub
    throw new UnsupportedOperationException("Unimplemented method 'terminate'");
  }

  @Override
  public void execute(SailPointContext arg0, Request arg1, Attributes&lt;String, Object> arg2)
    throws RequestPermanentException, RequestTemporaryException {
      Partition partition = (Partition) arg1.getAttribute("partition");
      System.out.println("Executing TestRequestExecutor");
      System.out.println("Partition value: " + partition.getAttribute("value"));
    }

}

</Source>

</Rule>



and create a RequestDefinition pointing to your rule:

<RequestDefinition executor="TesteClassLoader" name="Test Request" retryMax="20">
  <Attributes>
    <Map>
      <entry key="maxThreads" value="5"/>
    </Map>
  </Attributes>
</RequestDefinition>

Within your plugin task executor, you can create the requests with your partitions and use the native method inherited by BasePluginTaskExecutor .launchPartitions():


import sailpoint.api.SailPointContext;

import sailpoint.api.SailPointFactory;

import sailpoint.object.Attributes;

import sailpoint.object.Partition;

import sailpoint.object.Request;

import sailpoint.object.RequestDefinition;

import sailpoint.object.TaskResult;

import sailpoint.object.TaskSchedule;

import sailpoint.plugin.PluginsUtil;

import sailpoint.task.BasePluginTaskExecutor;




public class TestCreateRequestTaskExecutor extends BasePluginTaskExecutor {




    public TestCreateRequestTaskExecutor() {

        super();

    }

    @Override

    public void execute(SailPointContext arg0, TaskSchedule arg1, TaskResult arg2, Attributes<String, Object> arg3)

            throws Exception {

        SailPointContext context = SailPointFactory.getCurrentContext();

        RequestDefinition reqDef = context.getObjectByName(RequestDefinition.class,"Test Request");

        List<String> list = new ArrayList<>();

        list.add("req1");

        list.add("req2");

        list.add("req3");

        List<Request> requests = new ArrayList<>();

        Integer count = 1;

        for (String req : list) {

            

          Request request = new Request(reqDef);

          request.setName("Request " + count);

          request.setHost("srvidmdalbr04.bs.br.bsch");

          Partition partition = new Partition();

          partition.setName("Partition " + count);

          partition.setObjectType("string");

          partition.setSize(1);

          partition.setAttribute("value", req);

          request.put("partition", partition);

          requests.add(request);

          count++;

        }

        this.launchPartitions(context, arg2, requests);

    }




    @Override

    public boolean terminate() {

    return true;

    }




    @Override

    public String getPluginName() {

        return "TestRequest";

    }




}

1 Like

cool , I’ll take a look at this. Im glad you figured it out.

1 Like