cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

Object growth monitoring

Object growth monitoring

There are many SailPoint objects which grow very fast and we might be interested in how often they are growing. Examples can be like:

 

1. How many identities were on-boarded yearly or monthly

2. How many snapshots were created yearly or monthly or even daily.

 

We can view this with the help of a Quicklink and Workflow. The following example represents how the Identity object is growing monthly in year 2016.

 

pic1.JPG

 

If you click next, it will give you total number of identities created in 2016 in monthly basis like the following.

pic2.jpg

 

You can monitor more and it will give you the previous screen again.

 

Here is how it was done. The following  Quicklink was created to launch the workflow. The quicklink is of Task category, you can make it a custom category. Please see Quicklinks.pdf  for detail.

 

<?xml version='1.0' encoding='UTF-8'?>

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

<QuickLink action="workflow" category="Tasks"  messageKey="Object Growth" name="Object Growth">

  <Attributes>

    <Map>

      <entry key="workflowName" value="Object Growth"/>

    </Map>

  </Attributes>

</QuickLink>

 

 

The above QuickLink launchs  the following workflow named "Object Growth". The only thing you need to modify before importing the workflow is the IIQ installation year in your implementation. It's in line number 06 and currently having a value of 2014.

 

<?xml version='1.0' encoding='UTF-8'?>

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

<Workflow  explicitTransitions="true"  name="Object Growth">

  <Variable initializer="true" input="true" name="trace"/>

  <Variable initializer="true" input="true" name="transient"/>

  <Variable initializer="2014" name="stringIIQInstallYear"/>

  <Step icon="Approval" name="Generic Step" posX="297" posY="124">

    <Approval name="Object Growth" owner="ref:launcher" return="objectName,stringYear,stringMonth" send="stringIIQInstallYear">

      <Form name="Object Growth">

        <Attributes>

          <Map>

            <entry key="pageTitle" value="Object Growth"/>

          </Map>

        </Attributes>

        <Section columns="3" name="Configuration">

          <Field displayName="Object" filterString="" name="objectName" postBack="true" required="true" type="string">

            <AllowedValuesDefinition>

              <Script>

                <Source>

  import java.util.List; 

  import java.util.ArrayList;

 

 

  // CSV of all independent objects in 6.4 

  String classNames="AccountGroup,ActivityDataSource,Application,ApplicationActivity,ApplicationScorecard,AuditConfig,AuditEvent,AuthenticationQuestion,BatchRequest,Bundle,BundleArchive,Capability,Category,Certification,CertificationArchive,CertificationDefinition,CertificationGroup,Configuration,CorrelationConfig,Custom,DashboardContent,DashboardLayout,DatabaseVersion,Dictionary,DynamicScope,EmailTemplate,Form,FullTextIndex,GroupDefinition,GroupFactory,GroupIndex,Identity,IdentityArchive,IdentityDashboard,IdentityEntitlement,IdentityHistoryItem,IdentityRequest,IdentitySnapshot,IdentityTrigger,IntegrationConfig,JasperResult,JasperTemplate,LocalizedAttribute,ManagedAttribute,MessageTemplate,MiningConfig,MitigationExpiration,ObjectConfig,PasswordPolicy,Policy,PolicyViolation,Process,ProcessLog,Profile,ProvisioningRequest,QuickLink,Request,RequestDefinition,ResourceEvent,RightConfig,RoleChangeEvent,RoleIndex,RoleMetadata,RoleMiningResult,RoleScorecard,Rule,RuleRegistry,SPRight,Scope,ScoreConfig,Scorecard,Server,ServiceDefinition,ServiceStatus,SyslogEvent,Target,TargetAssociation,TargetSource,TaskDefinition,TaskResult,TaskSchedule,TimePeriod,UIConfig,UIPreferences,WorkItem,WorkItemArchive,Workflow,WorkflowCase,WorkflowRegistry,WorkflowTestSuite,Workgroup"; 

  

  

  //In 7.0 QuickLinkOptions is an independent object, so it's added here for 7.0 

  //String classNames="AccountGroup,ActivityDataSource,Application,ApplicationActivity,ApplicationScorecard,AuditConfig,AuditEvent,AuthenticationQuestion,BatchRequest,Bundle,BundleArchive,Capability,Category,Certification,CertificationArchive,CertificationDefinition,CertificationGroup,Configuration,CorrelationConfig,Custom,DashboardContent,DashboardLayout,DatabaseVersion,Dictionary,DynamicScope,EmailTemplate,Form,FullTextIndex,GroupDefinition,GroupFactory,GroupIndex,Identity,IdentityArchive,IdentityDashboard,IdentityEntitlement,IdentityHistoryItem,IdentityRequest,IdentitySnapshot,IdentityTrigger,IntegrationConfig,JasperResult,JasperTemplate,LocalizedAttribute,ManagedAttribute,MessageTemplate,MiningConfig,MitigationExpiration,ObjectConfig,PasswordPolicy,Policy,PolicyViolation,Process,ProcessLog,Profile,ProvisioningRequest,QuickLink,QuickLinkOptions,Request,RequestDefinition,ResourceEvent,RightConfig,RoleChangeEvent,RoleIndex,RoleMetadata,RoleMiningResult,RoleScorecard,Rule,RuleRegistry,SPRight,Scope,ScoreConfig,Scorecard,Server,ServiceDefinition,ServiceStatus,SyslogEvent,Target,TargetAssociation,TargetSource,TaskDefinition,TaskResult,TaskSchedule,TimePeriod,UIConfig,UIPreferences,Widget,WorkItem,WorkItemArchive,Workflow,WorkflowCase,WorkflowRegistry,WorkflowTestSuite,Workgroup"; 

 

  

  //Making array from CSV 

  String[] classes = classNames.split(","); 

  

  

  // defining a map to return the object name and counts; 

  List list=new ArrayList(); 

 

  //iterating all objects 

  for(String clas: classes ){

  list.add(clas);

  }

  return list;

                </Source>

              </Script>

            </AllowedValuesDefinition>

          </Field>

          <Field displayName="Year" filterString="" name="stringYear" postBack="true" type="string">

            <AllowedValuesDefinition>

              <Script>

                <Source>

  import java.util.Calendar;

  import java.util.List;

  import java.util.ArrayList;

  List list = new ArrayList();

  int currentYear=Calendar.getInstance().get(Calendar.YEAR);

  int intIiqInstallYear = Integer.parseInt(stringIIQInstallYear);

  for (int i=intIiqInstallYear; i&lt; currentYear+1; i++){

  list.add(String.valueOf(i));                

  }           

  return list;                 

                 

                 

  </Source>

              </Script>

            </AllowedValuesDefinition>

          </Field>

          <Field displayName="Month" filterString="" name="stringMonth" type="string">

            <AllowedValuesDefinition>

              <Script>

                <Source>

  import java.util.List;

  import java.util.ArrayList;

  List list = new ArrayList();

  String monthNames="January,February,March,April,May,June,July,August,September,October,November,December";

  String[] months = monthNames.split(",");                  

    

  for(String month: months ){

  list.add(month);                

  }           

  return list;                   

  </Source>

              </Script>

            </AllowedValuesDefinition>

            <Attributes>

              <Map>

                <entry key="hidden" value="script:"/>

                <entry key="readOnly">

                  <value>

                    <Script>

                      <Source>

  if(stringYear != null) return false;

  else return true;

   </Source>

                    </Script>

                  </value>

                </entry>

              </Map>

            </Attributes>

          </Field>

        </Section>

        <Button action="next" label="Next"/>

        <Button action="cancel" label="Cancel"/>

      </Form>

    </Approval>

    <Transition to="Build Form"/>

  </Step>

  <Step icon="Task" name="Build Form" posX="294" posY="15" resultVariable="viewForm">

    <Script>

      <Source>

 

  import java.sql.Date;

  import java.util.ArrayList;

  import java.util.Calendar;

  import java.util.GregorianCalendar;

  import java.util.List;

  import java.util.Map;

  import java.util.TreeMap;

  import sailpoint.object.Form.Button;

  import sailpoint.object.Form.Section;       

  import sailpoint.object.*;

   

 

   

 

  

  int getLastDayOfMonth(int year, int month){

  month=month+1;

  if(month==9 || month==4 || month==6 || month==11){

  return 30;

  }

  else if(month==2){

  if(year%4==0){

  return 29;

  }

  else{

  return 28;

  }

  }

  else{

  return 31;

  }

  } 

 

 

  int getObjectCount(String clas, Calendar startDate, Calendar endDate){

 

 

  int count;

  Class className;

  List filters = new ArrayList();

  if(clas.equals("Workgroup")){ 

 

  filters.add(Filter.eq("workgroup", true)); 

  className= Class.forName("sailpoint.object.Identity");

  } 

  else{ 

   

  className = Class.forName("sailpoint.object." + clas); 

   

  }

  filters.add(Filter.ge("created", startDate.getTime()));

  filters.add(Filter.le("created", endDate.getTime()));

  Filter f=Filter.and(filters);

 

 

 

  QueryOptions qo = new QueryOptions();

  qo.addFilter(f);

  qo.setIgnoreCase(true);

 

 

  count=context.countObjects (className, qo);

  return count;

  }

 

  String formatKey(int key){

  if(key &lt; 10){

  return "0" + String.valueOf(key);

  }

  else{

  return String.valueOf(key);

  }

  }

 

 

  int getMonthNumber(String[] months, String monthName){

  for(int i=0; i&lt; months.length; i++){

  if(monthName.equals(months[i])){

  return i;

  }

  }

  } 

 

  //**************Main method*********************

 

 

  int currentYear=Calendar.getInstance().get(Calendar.YEAR);

        int currentMonth=Calendar.getInstance().get(Calendar.MONTH);

        int iiqInstallYear=Integer.parseInt(stringIIQInstallYear);

       

        String monthNames="January,February,March,April,May,June,July,August,September,October,November,December";

        String[] months = monthNames.split(",");

      

        String subTitle="";

        Calendar startDate;

        Calendar endDate;

        Calendar currentStartDate;

        Calendar currentEndDate;

       

        Map map=new TreeMap();

       

        if(stringYear==null){

        subTitle="From " + stringIIQInstallYear + " to " + String.valueOf(currentYear);

 

 

        startDate = new GregorianCalendar(iiqInstallYear, 0, 1);

        endDate = new GregorianCalendar(currentYear, 11, 31);

         

      

        for(int indexYear=iiqInstallYear; indexYear&lt;currentYear+1; indexYear++){

            currentStartDate = new GregorianCalendar(indexYear, 0, 1);

            currentEndDate = new GregorianCalendar(indexYear, 11, 31); 

           

            map.put(String.valueOf(indexYear), getObjectCount(objectName, currentStartDate, currentEndDate));

        }

        }

        else{

        int year=Integer.parseInt(stringYear);

        

        if(stringMonth==null){

        subTitle="From January, " + stringYear + " to December, " + stringYear;

 

 

        startDate = new GregorianCalendar(year, 0, 1);

        endDate = new GregorianCalendar(year, 11, 31);  

        for(int indexMonth=0; indexMonth &lt;12; indexMonth++){

                    currentStartDate = new GregorianCalendar(year, indexMonth, 1);

                    currentEndDate = new GregorianCalendar(year, indexMonth, 31); 

                

                    String key=stringYear + "-" + formatKey(indexMonth+1);

                    map.put(key, getObjectCount(objectName, currentStartDate, currentEndDate));

                }

       

        }

        else{

        int month=getMonthNumber(months, stringMonth);

        subTitle="For " + stringMonth + ", " + stringYear;

 

 

        startDate = new GregorianCalendar(year, month, 1);

        int lastDayOfMonth=getLastDayOfMonth(year, month);

        endDate = new GregorianCalendar(year, month, lastDayOfMonth);

        for(int dayIndex=0; dayIndex &lt; lastDayOfMonth; dayIndex++){

        currentStartDate = new GregorianCalendar(year, month, dayIndex+1);

                    currentEndDate = new GregorianCalendar(year, month, dayIndex+2);

                    String key=stringYear + "-" + String.valueOf(formatKey(month+1)) + "-" + String.valueOf(formatKey(dayIndex+1));

                    map.put(key, getObjectCount(objectName, currentStartDate, currentEndDate));

                  

        }

        }         

        }

 

        viewForm = new Form();

        viewForm.setTitle("Object Growth");

        viewForm.setSubtitle(subTitle);

    

        List  buttons = new ArrayList();

   

        Form.Button submitButton = new Button("Monitor more", Form.ACTION_NEXT);

  

        buttons.add(submitButton);

        Form.Button cancelButton = new Button("Done", Form.ACTION_CANCEL);

        buttons.add(cancelButton);

  

        viewForm.setButtons(buttons);

 

 

        Form.Section viewSection = new Form.Section("Section 1");

 

 

        viewSection.setLabel(objectName);

        viewSection.setType("text");

        viewSection.setColumns(9);

 

 

       

 

 

        for(Map.Entry entry : map.entrySet()) {

        Field field1 = new Field();

        field1.setColumnSpan(1);

     

  String key=(String)entry.getKey();

       

     

        field1.setName(key);

        field1.setDisplayName(key);

         field1.setValue(String.valueOf(entry.getValue()));

        field1.setDefaultValue(String.valueOf(entry.getValue()));

 

        viewSection.add(field1);

 

 

        }

 

 

        viewForm.add(viewSection);

        return viewForm;

      </Source>

    </Script>

    <Transition to="displayForm"/>

  </Step>

  <Step icon="Approval" name="displayForm" posX="430" posY="19">

    <Approval name="View growth" owner="ref:launcher" return="">

      <Arg name="workItemForm" value="ref:viewForm"/>

    </Approval>

    <Transition to="Generic Step"/>

  </Step>

  <Step icon="Start" name="Start" posX="92" posY="127">

    <Transition to="Generic Step"/>

  </Step>

  <Step icon="Stop" name="Stop" posX="664" posY="60"/>

</Workflow>

Labels (1)
Comments

This is cool. Make it a plugin, so I can call a webservice from Cacti scripts and make nice graphs ;-)

I see one issue with your approach: you are counting the number of objects that still exist, created within time frames. Some objects may have already been deleted and will not be counted anymore. As long as the number grows, there is no issue. But if you have 100000 identities, 1000 leaving each year, 1000 new, you won't see the changes.

A task could run daily/weekly/monthly to keep numbers, so you get more accurate results.

Thanks for the great feedback Menno. I emailed  getting contact information from 7.0 plugin verification process  and waiting for the verification process. Thanks, Tonmay

Hi,

I tried this but giving below error.

<Attributes>
  <Map>
    <entry key="currentUserName" value="spadmin"/>
    <entry key="launcher" value="spadmin"/>
    <entry key="quickLinkIdentityId" value="8a8ddf8850f1db270150f1db62d200cf"/>
    <entry key="quickLinkIdentityIds">
      <value>
        <List>
          <String>8a8ddf8850f1db270150f1db62d200cf</String>
        </List>
      </value>
    </entry>
    <entry key="sessionOwner" value="spadmin"/>
    <entry key="stringIIQInstallYear" value="2015"/>
    <entry key="trace" value="true"/>
    <entry key="transient" value="true"/>
    <entry key="workflowName" value="Object Growth"/>
  </Map>
</Attributes>

Starting step Generic Step
Starting approval for spadmin
Opening work item: Object Growth
2017-03-13 13:31:08,532 ERROR http-apr-8080-exec-1 sailpoint.web.SailPointContextRequestFilter:65 - /include/formRenderer.xhtml @110,74 id="form-ct-#{form.id}" /include/formRenderer.xhtml @110,74 id="form-ct-#{form.id}": /workitem/workItemForm.xhtml @53,70 value="#{workItemForm.formBean}": Error reading 'formBean' on type sailpoint.web.WorkItemFormBean
javax.servlet.ServletException: /include/formRenderer.xhtml @110,74 id="form-ct-#{form.id}" /include/formRenderer.xhtml @110,74 id="form-ct-#{form.id}": /workitem/workItemForm.xhtml @53,70 value="#{workItemForm.formBean}": Error reading 'formBean' on type sailpoint.web.WorkItemFormBean

Thanks,

Subhanshu

Make sure the first class citizens in the variable 'classNames' are available in your installed version.

Example: Latest version doesn't have 'QuickLinkOptions' as the independent object.

Thanks for the reply Tonmay!

we are also using 6.4 and yes we have all the 'classNames'.

Caused by: javax.el.ELException: /include/formRenderer.xhtml @110,74 id="form-ct-#{form.id}": /workitem/workItemForm.xhtml @53,70 value="#{workItemForm.formBean}": Error reading 'formBean' on type sailpoint.web.WorkItemFormBean

at com.sun.faces.facelets.el.TagValueExpression.getValue(TagValueExpression.java:114)

at com.sun.faces.facelets.tag.TagAttributeImpl.getObject(TagAttributeImpl.java:329)

... 121 more

Caused by: java.lang.NullPointerException

somewhere it getting null value.

If you have every classNames, can you post the full trace in forums?

Initializing variable: transient
--> true
Enabling transient workflow case for spadmin
Starting workflow Test Object Growth
Initializing variable: stringIIQInstallYear
--> 2015
Initial case variables:
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE Attributes PUBLIC "sailpoint.dtd" "sailpoint.dtd">
<Attributes>
  <Map>
    <entry key="currentUserName" value="spadmin"/>
    <entry key="launcher" value="spadmin"/>
    <entry key="quickLinkIdentityId" value="8a8ddf8850f1db270150f1db62d200cf"/>
    <entry key="quickLinkIdentityIds">
      <value>
        <List>
          <String>8a8ddf8850f1db270150f1db62d200cf</String>
        </List>
      </value>
    </entry>
    <entry key="sessionOwner" value="spadmin"/>
    <entry key="stringIIQInstallYear" value="2015"/>
    <entry key="trace" value="true"/>
    <entry key="transient" value="true"/>
    <entry key="workflowName" value="Test Object Growth"/>
  </Map>
</Attributes>

Starting step Generic Step
Starting approval for spadmin
Opening work item: Object Growth
2017-03-13 12:31:50,093 ERROR http-apr-8080-exec-2 sailpoint.web.SailPointContextRequestFilter:65 - /include/formRenderer.xhtml @110,74 id="form-ct-#{form.id}" /include/formRenderer.xhtml @110,74 id="form-ct-#{form.id}": /workitem/workItemForm.xhtml @53,70 value="#{workItemForm.formBean}": Error reading 'formBean' on type sailpoint.web.WorkItemFormBean
javax.servlet.ServletException: /include/formRenderer.xhtml @110,74 id="form-ct-#{form.id}" /include/formRenderer.xhtml @110,74 id="form-ct-#{form.id}": /workitem/workItemForm.xhtml @53,70 value="#{workItemForm.formBean}": Error reading 'formBean' on type sailpoint.web.WorkItemFormBean
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:606)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.myfaces.webapp.filter.ExtensionsFilter.doFilter(ExtensionsFilter.java:357)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at sailpoint.web.PageAuthorizationFilter.doFilter(PageAuthorizationFilter.java:92)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at sailpoint.web.PageAuthenticationFilter$MyHandler.handleFinally(PageAuthenticationFilter.java:440)
at sailpoint.web.PageAuthenticationFilter$MyHandler.handle(PageAuthenticationFilter.java:344)
at sailpoint.web.PageAuthenticationFilter.doFilter(PageAuthenticationFilter.java:278)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at sailpoint.web.SailPointContextRequestFilter.doFilter(SailPointContextRequestFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at sailpoint.web.util.MethodFilter.doFilter(MethodFilter.java:54)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at sailpoint.web.util.TimingFilter.doFilter(TimingFilter.java:88)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at sailpoint.web.ResponseHeaderFilter.doFilter(ResponseHeaderFilter.java:63)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:75)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:503)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:421)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1070)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:611)
at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.doRun(AprEndpoint.java:2466)
at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:2455)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:745)
Caused by: javax.faces.view.facelets.TagAttributeException: /include/formRenderer.xhtml @110,74 id="form-ct-#{form.id}" /include/formRenderer.xhtml @110,74 id="form-ct-#{form.id}": /workitem/workItemForm.xhtml @53,70 value="#{workItemForm.formBean}": Error reading 'formBean' on type sailpoint.web.WorkItemFormBean
at com.sun.faces.facelets.tag.TagAttributeImpl.getObject(TagAttributeImpl.java:331)
at com.sun.faces.facelets.tag.TagAttributeImpl.getValue(TagAttributeImpl.java:295)
at com.sun.faces.facelets.tag.jsf.ComponentTagHandlerDelegateImpl.assignUniqueId(ComponentTagHandlerDelegateImpl.java:369)
at com.sun.faces.facelets.tag.jsf.ComponentTagHandlerDelegateImpl.apply(ComponentTagHandlerDelegateImpl.java:172)
at javax.faces.view.facelets.DelegatingMetaTagHandler.apply(DelegatingMetaTagHandler.java:120)
at javax.faces.view.facelets.DelegatingMetaTagHandler.applyNextHandler(DelegatingMetaTagHandler.java:137)
at org.richfaces.view.facelets.html.BehaviorsAddingComponentHandlerWrapper.applyNextHandler(BehaviorsAddingComponentHandlerWrapper.java:53)
at com.sun.faces.facelets.tag.jsf.ComponentTagHandlerDelegateImpl.apply(ComponentTagHandlerDelegateImpl.java:187)
at javax.faces.view.facelets.DelegatingMetaTagHandler.apply(DelegatingMetaTagHandler.java:120)
at javax.faces.view.facelets.CompositeFaceletHandler.apply(CompositeFaceletHandler.java:95)
at com.sun.faces.facelets.tag.jsf.core.ViewHandler.apply(ViewHandler.java:188)
at javax.faces.view.facelets.CompositeFaceletHandler.apply(CompositeFaceletHandler.java:95)
at com.sun.faces.facelets.compiler.NamespaceHandler.apply(NamespaceHandler.java:93)
at javax.faces.view.facelets.CompositeFaceletHandler.apply(CompositeFaceletHandler.java:95)
at com.sun.faces.facelets.compiler.EncodingHandler.apply(EncodingHandler.java:87)
at com.sun.faces.facelets.impl.DefaultFacelet.include(DefaultFacelet.java:320)
at com.sun.faces.facelets.impl.DefaultFacelet.include(DefaultFacelet.java:379)
at com.sun.faces.facelets.impl.DefaultFacelet.include(DefaultFacelet.java:358)
at com.sun.faces.facelets.impl.DefaultFaceletContext.includeFacelet(DefaultFaceletContext.java:199)
at com.sun.faces.facelets.tag.ui.IncludeHandler.apply(IncludeHandler.java:120)
at javax.faces.view.facelets.CompositeFaceletHandler.apply(CompositeFaceletHandler.java:95)
at javax.faces.view.facelets.DelegatingMetaTagHandler.applyNextHandler(DelegatingMetaTagHandler.java:137)
at org.richfaces.view.facelets.html.BehaviorsAddingComponentHandlerWrapper.applyNextHandler(BehaviorsAddingComponentHandlerWrapper.java:53)
at com.sun.faces.facelets.tag.jsf.ComponentTagHandlerDelegateImpl.apply(ComponentTagHandlerDelegateImpl.java:187)
at javax.faces.view.facelets.DelegatingMetaTagHandler.apply(DelegatingMetaTagHandler.java:120)
at javax.faces.view.facelets.CompositeFaceletHandler.apply(CompositeFaceletHandler.java:95)
at com.sun.faces.facelets.tag.jsf.core.ViewHandler.apply(ViewHandler.java:188)
at com.sun.faces.facelets.tag.ui.DefineHandler.applyDefinition(DefineHandler.java:106)
at com.sun.faces.facelets.tag.ui.CompositionHandler.apply(CompositionHandler.java:178)
at com.sun.faces.facelets.impl.DefaultFaceletContext$TemplateManager.apply(DefaultFaceletContext.java:395)
at com.sun.faces.facelets.impl.DefaultFaceletContext.includeDefinition(DefaultFaceletContext.java:366)
at com.sun.faces.facelets.tag.ui.InsertHandler.apply(InsertHandler.java:111)
at javax.faces.view.facelets.CompositeFaceletHandler.apply(CompositeFaceletHandler.java:95)
at javax.faces.view.facelets.DelegatingMetaTagHandler.applyNextHandler(DelegatingMetaTagHandler.java:137)
at org.richfaces.view.facelets.html.BehaviorsAddingComponentHandlerWrapper.applyNextHandler(BehaviorsAddingComponentHandlerWrapper.java:53)
at com.sun.faces.facelets.tag.jsf.ComponentTagHandlerDelegateImpl.apply(ComponentTagHandlerDelegateImpl.java:187)
at javax.faces.view.facelets.DelegatingMetaTagHandler.apply(DelegatingMetaTagHandler.java:120)
at javax.faces.view.facelets.CompositeFaceletHandler.apply(CompositeFaceletHandler.java:95)
at com.sun.faces.facelets.compiler.NamespaceHandler.apply(NamespaceHandler.java:93)
at javax.faces.view.facelets.CompositeFaceletHandler.apply(CompositeFaceletHandler.java:95)
at com.sun.faces.facelets.compiler.EncodingHandler.apply(EncodingHandler.java:87)
at com.sun.faces.facelets.impl.DefaultFacelet.include(DefaultFacelet.java:320)
at com.sun.faces.facelets.impl.DefaultFacelet.include(DefaultFacelet.java:379)
at com.sun.faces.facelets.impl.DefaultFacelet.include(DefaultFacelet.java:358)
at com.sun.faces.facelets.impl.DefaultFaceletContext.includeFacelet(DefaultFaceletContext.java:199)
at com.sun.faces.facelets.tag.ui.CompositionHandler.apply(CompositionHandler.java:155)
at com.sun.faces.facelets.compiler.NamespaceHandler.apply(NamespaceHandler.java:93)
at com.sun.faces.facelets.compiler.EncodingHandler.apply(EncodingHandler.java:87)
at com.sun.faces.facelets.impl.DefaultFacelet.include(DefaultFacelet.java:320)
at com.sun.faces.facelets.impl.DefaultFacelet.include(DefaultFacelet.java:379)
at com.sun.faces.facelets.impl.DefaultFacelet.include(DefaultFacelet.java:358)
at com.sun.faces.facelets.impl.DefaultFaceletContext.includeFacelet(DefaultFaceletContext.java:199)
at com.sun.faces.facelets.tag.ui.IncludeHandler.apply(IncludeHandler.java:120)
at com.sun.faces.facelets.tag.jstl.core.ChooseWhenHandler.apply(ChooseWhenHandler.java:83)
at com.sun.faces.facelets.tag.jstl.core.ChooseHandler.apply(ChooseHandler.java:105)
at com.sun.faces.facelets.tag.ui.CompositionHandler.apply(CompositionHandler.java:166)
at com.sun.faces.facelets.compiler.NamespaceHandler.apply(NamespaceHandler.java:93)
at com.sun.faces.facelets.compiler.EncodingHandler.apply(EncodingHandler.java:87)
at com.sun.faces.facelets.impl.DefaultFacelet.include(DefaultFacelet.java:320)
at com.sun.faces.facelets.impl.DefaultFacelet.include(DefaultFacelet.java:379)
at com.sun.faces.facelets.impl.DefaultFacelet.include(DefaultFacelet.java:358)
at com.sun.faces.facelets.impl.DefaultFaceletContext.includeFacelet(DefaultFaceletContext.java:199)
at com.sun.faces.facelets.tag.ui.IncludeHandler.apply(IncludeHandler.java:120)
at com.sun.faces.facelets.tag.jstl.core.ChooseWhenHandler.apply(ChooseWhenHandler.java:83)
at com.sun.faces.facelets.tag.jstl.core.ChooseHandler.apply(ChooseHandler.java:105)
at com.sun.faces.facelets.tag.ui.CompositionHandler.apply(CompositionHandler.java:166)
at com.sun.faces.facelets.compiler.NamespaceHandler.apply(NamespaceHandler.java:93)
at com.sun.faces.facelets.compiler.EncodingHandler.apply(EncodingHandler.java:87)
at com.sun.faces.facelets.impl.DefaultFacelet.apply(DefaultFacelet.java:164)
at com.sun.faces.application.view.FaceletViewHandlingStrategy.buildView(FaceletViewHandlingStrategy.java:914)
at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:99)
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:594)
... 48 more
Caused by: javax.el.ELException: /include/formRenderer.xhtml @110,74 id="form-ct-#{form.id}": /workitem/workItemForm.xhtml @53,70 value="#{workItemForm.formBean}": Error reading 'formBean' on type sailpoint.web.WorkItemFormBean
at com.sun.faces.facelets.el.TagValueExpression.getValue(TagValueExpression.java:114)
at com.sun.faces.facelets.tag.TagAttributeImpl.getObject(TagAttributeImpl.java:329)
... 121 more
Caused by: java.lang.NullPointerException
at sailpoint.server.BSFRuleRunner.getPreParsedSource(BSFRuleRunner.java:516)
at sailpoint.server.BSFRuleRunner.runScript(BSFRuleRunner.java:227)
at sailpoint.server.InternalContext.runScript(InternalContext.java:1191)
at sailpoint.server.InternalContext.runScript(InternalContext.java:1172)
at sailpoint.api.DynamicValuator.evaluate(DynamicValuator.java:399)
at sailpoint.api.Formicator.expandField(Formicator.java:1006)
at sailpoint.api.Formicator.expandInner(Formicator.java:658)
at sailpoint.api.Formicator.expand(Formicator.java:555)
at sailpoint.web.FormHandler.expandForm(FormHandler.java:237)
at sailpoint.web.FormHandler.initializeForm(FormHandler.java:208)
at sailpoint.web.WorkItemFormBean.getFormBean(WorkItemFormBean.java:522)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at javax.el.BeanELResolver.getValue(BeanELResolver.java:99)
at com.sun.faces.el.DemuxCompositeELResolver._getValue(DemuxCompositeELResolver.java:176)
at com.sun.faces.el.DemuxCompositeELResolver.getValue(DemuxCompositeELResolver.java:203)
at com.sun.el.parser.AstValue.getValue(AstValue.java:116)
at com.sun.el.parser.AstValue.getValue(AstValue.java:163)
at com.sun.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:219)
at com.sun.faces.facelets.el.TagValueExpression.getValue(TagValueExpression.java:109)
at com.sun.el.parser.AstIdentifier.getValue(AstIdentifier.java:95)
at com.sun.el.parser.AstValue.getValue(AstValue.java:158)
at com.sun.el.parser.AstDeferredExpression.getValue(AstDeferredExpression.java:59)
at com.sun.el.parser.AstCompositeExpression.getValue(AstCompositeExpression.java:64)
at com.sun.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:219)
at com.sun.faces.facelets.el.TagValueExpression.getValue(TagValueExpression.java:109)
... 122 more

is it working fine in your case ?

Again, please post this in forum. From your log I see it could not create the work item (Form) for you. Yes, it works for me and couple other from this community told me it works. But I understand you may have problem. If you post in forum, many experts will be able to help you. Thanks.

Hello tonmay.bhattacharjee​,

It is a great functionality and a very helpful utility although there is a good scope of little code tweaks where instead of using the IIQ objects and months in String variable we can define them in the Custom objects where it can be managed easily and we don't need to touch the code again and again from a maintenance standpoint. Other than that it is really amazing and appreciate you for sharing it.

Thanks!

Sumit Gupta

Hello menno.pieters​,

Were you able to create the plugin for this or do any enhancement on this. If yes, can you please let me know.

Thanks

Sumit Gupta

Version history
Revision #:
2 of 2
Last update:
‎Jul 28, 2023 12:25 AM
Updated by: