content: #set( $symbol_pound = '#' )
  #set( $symbol_dollar = '$' )
  #set( $symbol_escape = '\' )
  package ${package};
  
  import java.math.BigInteger;
  import java.util.Map;
  
  import org.apache.chemistry.opencmis.commons.impl.server.AbstractServiceFactory;
  import org.apache.chemistry.opencmis.commons.server.CallContext;
  import org.apache.chemistry.opencmis.commons.server.CmisService;
  import org.apache.chemistry.opencmis.server.support.wrapper.ConformanceCmisServiceWrapper;
  
  /**
   * CMIS Service Factory.
   */
  public class ${projectPrefix}CmisServiceFactory extends AbstractServiceFactory {
  
      /** Default maxItems value for getTypeChildren()}. */
      private static final BigInteger DEFAULT_MAX_ITEMS_TYPES = BigInteger.valueOf(1000);
  
      /** Default depth value for getTypeDescendants(). */
      private static final BigInteger DEFAULT_DEPTH_TYPES = BigInteger.valueOf(-1);
  
      /**
       * Default maxItems value for getChildren() and other methods returning
       * lists of objects.
       */
      private static final BigInteger DEFAULT_MAX_ITEMS_OBJECTS = BigInteger.valueOf(100000);
  
      /** Default depth value for getDescendants(). */
      private static final BigInteger DEFAULT_DEPTH_OBJECTS = BigInteger.valueOf(10);
  
      @Override
      public void init(Map<String, String> parameters) {
      }
  
      @Override
      public void destroy() {
      }
  
      @Override
      public CmisService getService(CallContext context) {
          // get the user name and password that the CallContextHandler has determined
          // - if the user is null, this is either an anonymous request or the CallContextHandler configuration is wrong
          // - the password may be null depending on the authentication method
          String user = context.getUsername();
          String password = context.getPassword();
  
          // if the authentication fails, throw a CmisPermissionDeniedException
  
          // create a new service object
          // (can also be pooled or stored in a ThreadLocal)
          ${projectPrefix}CmisService service = new ${projectPrefix}CmisService();
  
          // add the conformance CMIS service wrapper
          // (The wrapper catches invalid CMIS requests and sets default values
          // for parameters that have not been provided by the client.)
          ConformanceCmisServiceWrapper wrapperService = 
                  new ConformanceCmisServiceWrapper(service, DEFAULT_MAX_ITEMS_TYPES, DEFAULT_DEPTH_TYPES, 
                          DEFAULT_MAX_ITEMS_OBJECTS, DEFAULT_DEPTH_OBJECTS);
  
          // hand over the call context to the service object
          wrapperService.setCallContext(context);
  
          return wrapperService;
      }
  
  }
  