6 Customizing Web Services for a Standalone Server

Learn how to customize Oracle Communications Billing and Revenue Management (BRM) Web Services Manager to expose your customized opcodes or support custom web services when running on a standalone server.

Topics in this document:

For information about enabling or disabling validation of input and output XML data, see "Validating Input and Output XML Data".

Setting Up Web Services Manager to Support Custom Fields in Opcodes

You can expose custom fields in BRM opcodes that are exposed by default as web services by doing the following:

  1. Add the custom field to the opcode in BRM. See "Creating Custom Fields and Storable Classes" in BRM Developer's Guide for instructions.

  2. If you are using the standalone server, update the appropriate .xsd file with the new fields. The location of the schema files is specified in the webservices.schema.location parameter in the BRM_home/apps/brm_wsm/config/Infranet.properties file.

  3. If you want to control the XML validation, see "Validating Input and Output XML Data" for more information.

Setting Up Web Services Manager to Support Unexposed Opcodes for XML-Element Services

You can expose BRM opcodes that are not exposed by default as web services by following the procedure below.

See "About WSDL Files and BRM Opcodes" for information about the opcodes that are exposed by default.

To enable Web Services Manager to support these opcodes:

  1. Generate the XSD file for your system. See "Generating the Schema Files for Your System" for instructions.

  2. Copy the generated XSD file to the location specified in webservices.schema.location in the BRM_home/apps/brm_wsm/config/Infranet.properties file.

  3. Create a WSDL file for the web service. See "Generating WSDL Files for Web Services" in BRM JCA Resource Adapter.

  4. Generate the sun-jaxws.xml file using one of the following endpoints:

    • /configurations/endpoints/default (to use the default deployment descriptor)

    • /configurations/endpoints (to use a custom deployment descriptor)
  5. Update the corresponding <endpoint> tag in the generated sun-jaxws.xml file for your implementation so that it points to your customized endpoint:

    <endpoint name="endpointName"
        implementation="pathToClass"
        url-pattern="urlPattern"
        wsdl="WEB-INF/wsdl/customDir/customWsdl" />

    where:

    • endpointName is the logical name of the endpoint for the web service.

    • pathToClass is the fully qualified path to the implementation class.

    • urlPattern is the URL pattern to access the web service.

    • customDir is a custom directory created to avoid conflicts with the standard Web Services Manager WSDL files. Ensure that your custom WSDL is located in this directory.

    • customWsdl is the name of the WSDL file you created in step 3. Ensure that you add the same custom WSDL file to the .jar file later in this procedure.

    For example:

    <endpoint name="JAXWS_BRMCustomService"
        implementation="com.oracle.communications.brm.wsm.jaxws.services.cust.BRMCustomServicePttImpl"
        url-pattern="/jaxws/BRMCustomService"
        wsdl="WEB-INF/wsdl/customDir/BRMCustomServices_v2.wsdl" />
  6. Create a JAR file that contains your WSDL file and your edited sun-jaxws.xml file in the following structure:

    • WEB-INF/wsdl/customDir/customWsdl

    • sunjavawxPath/sun-jaxws.xml

    where:

    • customDir is the custom folder used to distinguish your custom WSDL from the standard WSDL files.

    • customWsdl is the name of your WSDL file.

    • sunjavawxPath is the path to the sun-jaxws.xml you created during this procedure.

  7. Update the Infranet.properties file with the following new values:

    webservices.descriptor=sunjavawxPath/sun-jaxws.xml
    webservices.loadcustomschema=true

    where sunjavawxPath is the path to the sun-jaxws.xml you created during this procedure.

  8. Set the BRM_WSM_CLASSPATH_EXT environment variable to the full path of the jar file you created above.

Setting Up Web Services Manager to Support Custom Opcodes

You can expose your custom opcodes as web services by following the procedures below.

See "About WSDL Files and BRM Opcodes" for information about the opcodes that are exposed by default.

See the following sections for details of how to support custom opcodes:

Supporting Custom Opcodes for XML-Element Services

To enable Web Services Manager to support these opcodes for the web services that expect an XML element payload:

  1. Generate the XSD file for your system. See "Generating the Schema Files for Your System" for instructions.

  2. Copy the generated XSD file to the location specified in webservices.schema.location in the BRM_home/apps/brm_wsm/config/Infranet.properties file.

  3. Create a WSDL file for the web service. See "Generating WSDL Files for Web Services" in BRM JCA Resource Adapter.

  4. Do one of the following:

    • Create the CustomOp.java file by entering the following command:

      parse_custom_ops_fields -L pcmjava -I input -O output -P java_package

      where:

      • input is the header file you create for your custom opcodes and fields.

      • output is the memory-mapped file or directory for the output of the script. output must be a directory having some correspondence with the Java package. For example, if java_package is in com.portal.classFiles, output must be f:/mysource/com/portal/classFiles.

      • java_package is the Java package in which to put the generated classes.

      For more information, see "parse_custom_ops_fields" in BRM Developer's Guide.

    • Manually create the CustomOp.java file.

  5. Verify that the CustomOp.java file contains the following:

    • The mapping between opcode names and opcode numbers for all the custom opcodes in the file.

      Note:

      Verify that the mapping includes the full name of each opcode. If any opcode name is truncated, replace the truncated name with the full name.

    • The opToString method, which converts opcode numbers to opcode names.

    • The stringToOp method, which converts opcode names to opcode numbers.

    The following is a sample CustomOp.java file:

    public class CustomOp {
       public static final int CUSTOM_OP_ACT_INFO= 100000;
       public static final int CUSTOM_OP_READ_ACT_PRODUCT = 100001;        
       public static String opToString( int op ) {           try {
                     java.lang.reflect.Field[] flds = 
    CustomOp.class.getFields();
               for( int i = 0; i < flds.length; i++ ) {
                     try {
                        int val = flds[i].getInt(null);
                        if( val == op ) {
                            return flds[i].getName();
                        }
                } catch( IllegalAccessException e ) { continue; 
                } catch( IllegalArgumentException e ) { continue; }
                        }
                 } catch( SecurityException e ) {}                
                  return null;
    }  
    public static int stringToOp( String op ) {
                  try {
                        java.lang.reflect.Field[] flds = 
    CustomOp.class.getFields();
                     for( int i = 0; i < flds.length; i++ ) {
                        try {
                            String name = flds[i].getName();
                            if( name.equals(op) ) {
                              return flds[i].getInt(null);
                             }
                         } catch( IllegalAccessException e ) { continue; 
    }
                            catch( IllegalArgumentException e ) { continue; }
                   }
              } catch( SecurityException e ) {}
           return -1;
         }
    }
  6. Compile the CustomOp.java file into the CustomOp.class file by entering the following command:

    javac -d . path/CustomOp.java

    For example:

    javac -d . com/portal/classFiles/CustomOp.java
  7. Package the CustomOp.class file into the CustomFields.jar file by entering the following command:

    jar -cvf CustomFields.jar path/CustomOp.class

    For example:

    jar -cvf CustomFields.jar com/portal/classFiles/CustomOp.class
  8. Make the CustomFields.jar file available to Web Services Manager by doing the following:

    1. Copy the path/CustomFields.jar file to the CustJarLoc directory, where path is the path to the CustomFields.jar file (for example, BRM_home/apps/brm_wsm) and CustJarLoc is a directory that the Web Services Manager has permission to access.

    2. Open the BRM_home/apps/brm_wsm/config/Infranet.properties file in a text editor.

    3. Add or modify the following entry:

      infranet.custom.field.package = package

      where package is the name of the package that contains the CustomOp.java file; for example, com.portal.classFiles.

    4. Add all the custom fields to the Infranet.properties file.

    5. Save and close the file.

    6. Add the full path of CustJarLoc to the BRM_WSM_CLASSPATH_EXT environment variable.

    7. Stop and restart the Web Services Manager. See "Running and Stopping Standalone Web Services Manager" for more information.

  9. Generate the web service implementation class for the custom service by doing the following:

    1. Create an implementation class for your new web service. Following is a sample implementation class. Ensure that you update the packageName, ServiceName, PortName, ServiceClassName, and BindingSOAPVersion with your custom values.

      package packageName;
      
      // Copyright (c) 2024, 2025, Oracle and/or its affiliates.
      
      import java.util.List;
      import java.util.logging.Logger;
      import java.util.logging.Level;
      import java.util.concurrent.ConcurrentHashMap;
      import java.time.Duration;
      import io.helidon.metrics.api.MeterRegistry;
      import io.helidon.metrics.api.Metrics;
      import io.helidon.metrics.api.Timer;
      import io.helidon.metrics.api.Tag;
      import io.helidon.tracing.Span;
      import jakarta.annotation.Resource;
      import jakarta.jws.HandlerChain;
      import jakarta.jws.soap.SOAPBinding;
      import jakarta.xml.ws.Provider;
      import jakarta.xml.ws.ServiceMode;
      import jakarta.xml.ws.BindingType;
      import jakarta.xml.ws.WebServiceContext;
      import jakarta.xml.ws.WebServiceProvider;
      import jakarta.xml.ws.soap.SOAPFaultException;
      import jakarta.xml.soap.SOAPMessage;
      import jakarta.xml.soap.SOAPException;
      import jakarta.xml.soap.SOAPElement;
      import jakarta.xml.soap.SOAPFactory;
      import jakarta.xml.soap.Detail;
      import jakarta.xml.soap.SOAPFault;
      import jakarta.xml.soap.SOAPConstants;
      import javax.xml.namespace.QName;
      import org.w3c.dom.Document;
      import com.portal.pcm.DeterminateException;
      import com.portal.pcm.EBufException;
      import com.oracle.communications.brm.wsm.jaxws.ApiRequestProcessor;
      import com.oracle.communications.brm.wsm.utils.WebServicesUtilities;
      import com.oracle.communications.brm.wsm.utils.TracerHandler;
      import com.oracle.communications.brm.wsm.utils.SOAPFaultResponse;
      import com.oracle.communications.brm.wsm.utils.ApplicationException;
      
      @WebServiceProvider(targetNamespace = "http://xmlns.oracle.com/BRM/schemas/BusinessOpcodes", serviceName = "ServiceName", portName = "PortName")
      @ServiceMode(value = jakarta.xml.ws.Service.Mode.MESSAGE)
      @SOAPBinding(style = SOAPBinding.Style.DOCUMENT, parameterStyle = SOAPBinding.ParameterStyle.BARE)
      @BindingType(jakarta.xml.ws.soap.SOAPBinding.BindingSOAPVersion)
      @HandlerChain(file = "handler-chain.xml")
      public class ServiceClassName implements Provider<SOAPMessage> {
          private static Logger m_logger = Logger.getLogger(ServiceClassName.class.getName());
          private final MeterRegistry registry = Metrics.globalRegistry();
      
          private final Tag successTag = Tag.create("status", "success");
          private final Tag failTag = Tag.create("status", "fail");
      
          private final ConcurrentHashMap<Integer,Timer> successResponseTimerMap = new ConcurrentHashMap<Integer,Timer>();
          private final ConcurrentHashMap<Integer,Timer> failedResponseTimerMap = new ConcurrentHashMap<Integer,Timer>();
      
          @Override
          public SOAPMessage invoke(SOAPMessage request) {
              m_logger.entering(ServiceClassName.class.getName(), "Starting invoke method execution for request");
              Span span = TracerHandler.startSpan(null, ServiceClassName.class.getName() + "." + "invoke");
              Exception spanException = null;
      
              String opcodeName = null, soapVersion = null, soapNamespaceUri = null;
              int opcodeNumber = -1;
              long startTime = System.nanoTime();
              SOAPMessage response = null;
              Timer currentTimer;
      
              try{
                  // Determining SOAP request protocol version (1.1 or 1.2)
                  soapNamespaceUri = request.getSOAPPart().getEnvelope().getNamespaceURI();
      
                  if (SOAPConstants.URI_NS_SOAP_1_1_ENVELOPE.equals(soapNamespaceUri)) {
                      soapVersion = SOAPConstants.SOAP_1_1_PROTOCOL;
                  } 
                  else if (SOAPConstants.URI_NS_SOAP_1_2_ENVELOPE.equals(soapNamespaceUri)) {
                      soapVersion = SOAPConstants.SOAP_1_2_PROTOCOL;
                  } 
                  else {
                      soapVersion = SOAPConstants.DEFAULT_SOAP_PROTOCOL;
                      soapNamespaceUri = SOAPConstants.URI_NS_SOAP_ENVELOPE;
                  }
                  m_logger.log(Level.FINEST, "SOAP Protocol Version: " + soapVersion + ", SOAP Namespace URI: " + soapNamespaceUri);
                  Document reqDoc = request.getSOAPBody().extractContentAsDocument();
      
                  opcodeName = WebServicesUtilities.getOpcodeName(span.context(), reqDoc);
                  opcodeNumber = WebServicesUtilities.getOpcode(span.context(), opcodeName);
      
                  m_logger.log(Level.FINEST, "Opcode name obtained from request payload: " + opcodeName);
      
                  if(!successResponseTimerMap.containsKey(opcodeNumber)){
                      m_logger.log(Level.FINEST, "Initializing success & failure metric timers");
      
                      Tag apiTag = Tag.create("api", opcodeName);
      
                      successResponseTimerMap.put(
                              opcodeNumber,
                              registry.getOrCreate(Timer.builder("http_request_duration").tags(List.of(apiTag, successTag)))
                      );
                      failedResponseTimerMap.put(
                              opcodeNumber,
                              registry.getOrCreate(Timer.builder("http_request_duration").tags(List.of(apiTag, failTag)))
                      );
                  }
                  ApiRequestProcessor processor = new ApiRequestProcessor();
                  response = processor.processApiRequest(span.context(), reqDoc, opcodeName, opcodeNumber, soapVersion, soapNamespaceUri);
      
                  currentTimer = successResponseTimerMap.get(opcodeNumber);
                  currentTimer.record(Duration.ofNanos((System.nanoTime() - startTime)));
              } catch (ApplicationException e) {
                  spanException = e;
                  if (opcodeNumber != -1) {
                      currentTimer = failedResponseTimerMap.get(opcodeNumber);
                      currentTimer.record(Duration.ofNanos((System.nanoTime() - startTime)));
                  }
                  throw SOAPFaultResponse.createErrorResponse(e, soapVersion, soapNamespaceUri);
              } catch (SOAPException ex) {
                  spanException = ex;
                  if (opcodeNumber != -1) {
                      currentTimer = failedResponseTimerMap.get(opcodeNumber);
                      currentTimer.record(Duration.ofNanos((System.nanoTime() - startTime)));
                  }
                  throw SOAPFaultResponse.createErrorResponse(
                      new ApplicationException(ex, ApplicationException.SERVER_EXCEPTION), soapVersion, soapNamespaceUri
                  );
              } finally {
                  TracerHandler.endSpan(span, spanException);
                  m_logger.exiting(ServiceClassName.class.getName(), "Completed invoke method execution for request");
              }
              return response;
          }
      }
    2. Create BRMCustomServicePttImpl.java and compile it using the following command:

      javac -d . -cp '.:$PIN_HOME/jars/*' packageName/BRMCustomServicePttImpl.java

      where packageName is the package name configured in your implementation class.

  10. Generate the sun-jaxws.xml file using one of the following endpoints:

    • /configurations/endpoints/default (to use the default deployment descriptor)

    • /configurations/endpoints (to use a custom deployment descriptor)
  11. Add the new endpoint in the generated sun-jaxws.xml file for your implementation:

    <endpoint name="endpointName"
        implementation="pathToClass"
        url-pattern="urlPattern"
        wsdl=wsdl="WEB-INF/wsdl/customDir/customWsdl" />

    where:

    • endpointName is the logical name of the new endpoint for the web service.

    • pathToClass is the fully qualified path to the implementation class.

    • urlPattern is the URL pattern to access the web service.

    • customDir is a custom directory created to avoid conflicts with the standard Web Services Manager WSDL files. Ensure that your custom WSDL is located in this directory.

    • customWsdl is the name of the WSDL file you created in step 3. Ensure that you add the same custom WSDL file to the .jar file later in this procedure.

    For example:

    <endpoint name="JAXWS_BRMCustomService"
        implementation="CustomPackage.BRMCustomServicePttImpl"
        url-pattern="/jaxws/BRMCustomService"
        wsdl=""WEB-INF/wsdl/customDir/BRMCustomServices_v2.wsdl" />
  12. Create a JAR file that contains your implementation class, its WSDL file, and your edited sun-jaxws.xml file in the following structure:

    • WEB-INF/wsdl/customDir/customWsdl

    • sunjavawxPath/sun-jaxws.xml

    • packageName/BRMCustomServicePttImpl.class

    where:

    • customDir is the custom folder used to distinguish your custom WSDL from the standard WSDL files.

    • customWsdl is the name of your WSDL file.

    • sunjavawxPath is the path to the /sun-jaxws.xml you created during this procedure.

    • packageName is the package name configured in your implementation class.

  13. Update the Infranet.properties file with the following new values:

    webservices.descriptor=sunjavawxPath/sun-jaxws.xml
    webservices.loadcustomschema=true
    infranet.custom.field.package=CustomOp_package

    where:

    • sunjavawxPath is the path to the /sun-jaxws.xml you created during this procedure.

    • CustomOp_package is the path to the CustomOp.class file you created earlier in this procedure.

  14. Add the full paths of CustomFields.jar file and the JAR file you created in step 12 to the BRM_WSM_CLASSPATH_EXT environment variable.

Supporting Custom Opcodes for XML-String Services

To enable Web Services Manager to support these opcodes for the web services that expect an XML string payload:

  1. Do one of the following:

    • Create the CustomOp.java file by entering the following command:

      parse_custom_ops_fields -L pcmjava -I input -O output -P java_package

      where:

      • input is the header file you create for your custom opcodes and fields.

      • output is the memory-mapped file or directory for the output of the script. output must be a directory having some correspondence with the Java package. For example, if java_package is in com.portal.classFiles, output must be f:/mysource/com/portal/classFiles.

      • java_package is the Java package in which to put the generated classes.

      For more information, see "parse_custom_ops_fields" utility in BRM Developer's Guide.

    • Manually create the CustomOp.java file.

  2. Verify that the CustomOp.java file contains the following:

    • The mapping between opcode names and opcode numbers for all the custom opcodes in the file.

      Note:

      Verify that the mapping includes the full name of each opcode. If any opcode name is truncated, replace the truncated name with the full name.

    • The opToString method, which converts opcode numbers to opcode names.

    • The stringToOp method, which converts opcode names to opcode numbers.

    The following is a sample CustomOp.java file:

    public class CustomOp {
       public static final int CUSTOM_OP_ACT_INFO= 100000;
       public static final int CUSTOM_OP_READ_ACT_PRODUCT = 100001;        
       public static String opToString( int op ) {           try {
                     java.lang.reflect.Field[] flds = 
    CustomOp.class.getFields();
               for( int i = 0; i < flds.length; i++ ) {
                     try {
                        int val = flds[i].getInt(null);
                        if( val == op ) {
                            return flds[i].getName();
                        }
                } catch( IllegalAccessException e ) { continue; 
                } catch( IllegalArgumentException e ) { continue; }
                        }
                 } catch( SecurityException e ) {}                
                  return null;
    }  
    public static int stringToOp( String op ) {
                  try {
                        java.lang.reflect.Field[] flds = 
    CustomOp.class.getFields();
                     for( int i = 0; i < flds.length; i++ ) {
                        try {
                            String name = flds[i].getName();
                            if( name.equals(op) ) {
                              return flds[i].getInt(null);
                             }
                         } catch( IllegalAccessException e ) { continue; 
    }
                            catch( IllegalArgumentException e ) { continue; }
                   }
              } catch( SecurityException e ) {}
           return -1;
         }
    }
  3. Compile the CustomOp.java file into the CustomOp.class file by entering the following command:

    javac -d . path/CustomOp.java

    For example:

    javac -d . com/portal/classFiles/CustomOp.java
  4. Package the CustomOp.class file into the CustomFields.jar file by entering the following command:

    jar -cvf CustomFields.jar path/CustomOp.class

    For example:

    jar -cvf CustomFields.jar com/portal/classFiles/CustomOp.class
  5. Make the CustomFields.jar file available to Web Services Manager by doing the following:

    1. Copy the path/CustomFields.jar file to the CustJarLoc directory, where path is the path to the CustomFields.jar file (for example, BRM_home/apps/brm_wsm/) and CustJarLoc is a directory that the Web Services Manager has permission to access.

    2. Open the BRM_home/apps/brm_wsm/config/Infranet.properties file in a text editor.

    3. Add or modify the following entry:

      infranet.custom.field.package = package

      where package is the name of the package that contains the CustomOp.java file; for example, com.portal.classFiles.

    4. Add all the custom fields to the BRM_home/apps/brm_wsm/config/Infranet.properties file.

    5. Save and close the file.

    6. Set the BRM_WSM_CLASSPATH_EXT environment variable to the full path of CustJarLoc.

  6. Generate the web service implementation class for the custom service by doing the following:

    1. Create an implementation class for your new web service. Following is a sample implementation class. Ensure that you update the packageName with your custom value.

      package packageName;
      
      // Copyright (c) 2025, Oracle and/or its affiliates.
      
      import com.oracle.communications.brm.wsm.utils.ApplicationException;
      import com.oracle.communications.brm.wsm.utils.OpcodeCaller;
      import com.oracle.communications.brm.wsm.utils.SOAPFaultResponse;
      
      import jakarta.jws.WebMethod;
      import jakarta.jws.WebParam;
      import jakarta.jws.WebResult;
      import jakarta.jws.WebService;
      import jakarta.jws.soap.SOAPBinding;
      import jakarta.xml.soap.SOAPConstants;
      import jakarta.jws.HandlerChain;
      
      /**
       * Class that implements OOB Infranet CUST Web Service.
       * Implementation detail: This class delegates to OpcodeCaller all functionality
       * related to communicating with Infranet and calling opcodes. This allows
       * flexibility in reimplementing the web service, for a different app server,
       * for example. In that case, the new implementation can simply call the
       * OpcodeCaller utility functions.
       *
       * CUSTOM_OP_GENERIC<br/>
       */
      
      @WebService (name = "BRMCustomService",
                  targetNamespace = "http://xmlns.oracle.com/BRM/schemas/BusinessOpcodes/",
                  portName = "BRMCustomService_ptt")
      @SOAPBinding(style = SOAPBinding.Style.RPC)
      @HandlerChain(file = "handler-chain.xml")
      public class BRMCustomInfra {
      @WebMethod(operationName = "customOpGeneric")
          public  @WebResult(name = "CUSTOM_OP_GENERIC_response") String customGeneric(
              @WebParam(name = "flags")int  flag,
              @WebParam(name = "CUSTOM_OP_GENERIC_request")String inFlist)
          {
              String    CUSTOM_OP_GENERIC_response = null;
              OpcodeCaller oc = new OpcodeCaller();
              try {
                   CUSTOM_OP_GENERIC_response =  oc.opcodeWithFlags("CUSTOM_OP_GENERIC", flag, inFlist,"CUSTOM_OP_GENERIC.xsd");
                   return CUSTOM_OP_GENERIC_response;
              } catch (ApplicationException ex) {
                   throw SOAPFaultResponse.createErrorResponse(ex, SOAPConstants.SOAP_1_1_PROTOCOL, SOAPConstants.URI_NS_SOAP_1_1_ENVELOPE);
              }
          }
      }
    2. Compile it using the following command:

      javac -d . -cp '.:$PIN_HOME/jars/*' packageName/BRMCustomInfra.java

      where packageName is the package name configured in your implementation class.

  7. Generate the sun-jaxws.xml file using one of the following endpoints:

    • /configurations/endpoints/default (to use the default deployment descriptor)

    • /configurations/endpoints (to use a custom deployment descriptor)
  8. Add the new endpoint in the generated sun-jaxws.xml file for your implementation:

    <endpoint name="endpointName"
        implementation="pathToClass"
        url-pattern="urlPattern />

    where:

    • endpointName is the logical name of the new endpoint for the web service.

    • pathToClass is the fully qualified path to the implementation class.

    • urlPattern is the URL pattern to access the web service.

    For example:

    <endpoint
        name="JAXWS_STR_BRMCustomService"
        implementation="CustomPackage.BRMCustomInfra"
        url-pattern="/jaxws_str/BRMCustomService" />
  9. Create a JAR file that contains your implementation class and your edited sun-jaxws.xml file in the following structure:

    • sunjavawxPath/sun-jaxws.xml

    • packageName/BRMCustomInfra.class

    where:

    • sunjavawxPath is the path to the sun-jaxws.xml you created during this procedure.

    • packageName is the package name configured in your implementation class.

  10. Update the Infranet.properties file with the following new values:

    webservices.descriptor=sunjavawxPath/sun-jaxws.xml

    where sunjavawxPath is the path to the sun-jaxws.xml you created during this procedure.

  11. Add the full paths of CustomFields.jar file and the JAR file you created in step 9 to the BRM_WSM_CLASSPATH_EXT environment variable.

  12. Stop and restart the Web Services Manager. See "Running and Stopping Standalone Web Services Manager" for more information.