HCL Commerce Developer

Creación de servicios REST utilizando el mandato de controlador basado en configuración y la infraestructura de correlación de beans de datos

Puede crear servicios REST utilizando el mandato de controlador basado en configuración y la infraestructura de correlación de beans de datos. Ayuda a crear servicios REST y automatiza las correlaciones utilizando el programa de utilidad restClassicSampleGen.

Procedimiento

  1. Cree el manejador de recursos, siguiendo el formato especificado como base.
    El siguiente manejador de recursos de ejemplo acepta dos recursos. Uno obtiene los datos CatalogEntry de un bean de datos y el otro actualiza una CatalogEntry con un mandato:
    
    import java.util.logging.Logger;
    
    import javax.ws.rs.GET;
    import javax.ws.rs.POST;
    import javax.ws.rs.Path;
    import javax.ws.rs.PathParam;
    import javax.ws.rs.Produces;
    import javax.ws.rs.QueryParam;
    import javax.ws.rs.core.MediaType;
    import javax.ws.rs.core.Response;
    
    import com.ibm.commerce.beans.DataBean;
    import com.ibm.commerce.catalog.beans.CatalogEntryDataBean;
    import com.ibm.commerce.catalogmanagement.commands.CatalogEntryUpdateCmd;
    import com.ibm.commerce.command.ControllerCommand;
    import com.ibm.commerce.foundation.logging.LoggingHelper;
    import com.ibm.commerce.rest.classic.core.AbstractConfigBasedClassicHandler;
    
    /**
    * This is a very simple REST handler that extends the configuration-based REST
    * classic handler. It demonstrates how to create REST resources based on a
    * {@link DataBean} and a {@link ControllerCommand} with minimal coding, as all
    * the input/output information is stored in a configuration mapping file.
    * 
    */
    
    @Path("store/{storeId}/sample")
    public class SampleCatalogEntryClassicRestHandler extends AbstractConfigBasedClassicHandler
    {
      /**
      * IBM Copyright notice field.
      */
      public static final String COPYRIGHT = com.ibm.commerce.copyright.IBMCopyright.SHORT_COPYRIGHT;
      
      private static final String CLASSNAME = RestClassicDataBeanHandler.class.getName();
      
      private static final Logger LOGGER = LoggingHelper.getLogger(RestClassicDataBeanHandler.class);
      
      private static final String RESOURCE_NAME = "sample";
      
      /*
      * (non-Javadoc)
      * @see com.ibm.commerce.foundation.rest.resourcehandler.IResourceHandler#getResourceName()
      */
      @Override
      public String getResourceName()
      {
        return RESOURCE_NAME;
      }
      
      /**
      * Used with WC to instantiate handler.
      */
      public SampleCatalogEntryClassicRestHandler()
      {
        super();
      }
      
      /**
      * A sample REST GET that executes the {@link CatalogEntryDataBean} based on
      * the request parameters and profile specified.
      * 
      * @param storeId
      * @param responseFormat
      * @param profileName
      * @param catalogEntryID
      * @return the response
      */
      @GET
      @Path("catalogEntry")
      @Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML, 
      MediaType.APPLICATION_XHTML_XML, MediaType.APPLICATION_ATOM_XML })
      public Response processRequest(
      @PathParam("storeId") String storeId,
      @QueryParam("responseFormat") String responseFormat,
      @QueryParam("profileName") String profileName,
      @QueryParam("catalogEntryID") String catalogEntryID)
      {
        final String METHODNAME = "processRequest(String storeId, String profileName, 
        String responseFormat, String catalogEntryID) ";
        boolean entryExitTraceEnabled = LoggingHelper.isEntryExitTraceEnabled(LOGGER);
        if (entryExitTraceEnabled)
        {
          Object[] objArr = new Object[] { storeId, profileName, responseFormat, catalogEntryID };
          LOGGER.entering(CLASSNAME, METHODNAME, objArr);
        }
        
        Response result = executeConfigBasedBeanWithContext(CatalogEntryDataBean.class.getName(), 
        profileName, responseFormat, null);
        
        if (entryExitTraceEnabled)
        {
          LOGGER.exiting(CLASSNAME, METHODNAME, result);
        }
        
        return result;
      }
      
      /**
      * A sample REST POST that executes the {@link CatalogEntryUpdateCmd} based on
      * the request parameters and profile specified.
      * 
      * @param storeId
      * @param responseFormat
      * @param profileName
      * @return the response
      */
      @POST
      @Path("catalogEntryUpdate")
      @Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML, 
      MediaType.APPLICATION_XHTML_XML, MediaType.APPLICATION_ATOM_XML })
      public Response processRequest(@PathParam("storeId") String storeId,
      @QueryParam(value = "responseFormat") String responseFormat,
      @QueryParam(value = "profileName") String profileName)
      {
        final String METHODNAME = "processRequest(String storeId, String profileName, 
        String responseFormat) ";
        boolean entryExitTraceEnabled = LoggingHelper.isEntryExitTraceEnabled(LOGGER);
        if (entryExitTraceEnabled)
        {
          Object[] objArr = new Object[] { storeId, profileName, responseFormat };
          LOGGER.entering(CLASSNAME, METHODNAME, objArr);
        }
        
        Response result = executeConfigBasedCommandWithContext(CatalogEntryUpdateCmd.class.getName(), 
        profileName, responseFormat, storeId, null);
        
        if (entryExitTraceEnabled)
        {
          LOGGER.exiting(CLASSNAME, METHODNAME, result);
        }
      
        return result;
      } 
    }
  2. Decida qué clase de punto de entrada (bean de datos o mandato de controlador) desea utilizar en el manejador de recursos.

    Las llamadas REST normalmente requieren un manejador que contiene un punto de entrada en la clase de manejador clásico basado en la configuración. De forma predeterminada están disponibles los siguientes puntos de entrada:

    1. public Response executeConfigBasedBeanWithContext(String beanClassName, String profileName, String responseFormat, Map<String, Object> paramOverrideMap)

      Este método configura la solicitud de inicio {@link BusinessContextService}, luego delega a {@link #executeConfigBasedBean(String, String, String, Map)} y finalmente finaliza la solicitud BCS.

      Los parámetros siguientes están disponibles de forma predeterminada:
      nombreClaseBean
      El nombre de clase de bean de datos.
      profileName
      El nombre de perfil para el bean de datos en la configuración.
      responseFormat
      El formato de respuesta que se utiliza para generar el resultado.
      paramOverrideMap
      Define los parámetros que desea añadir o sustituir del objeto de solicitud que está asociado a este manejador.
      Normalmente se utiliza si hay parámetros de vía de acceso o datos de entidad que desea incluir cuando correlaciona los parámetros de consulta con la entrada del mandato.
      La clave debe ser una cadena. El valor puede ser cualquier objeto de tipo.
      El valor puede ser nulo.
    2. public JSONObject executeConfigBasedBean(String beanClassName, String profileName, String responseFormat, Map<String, Object> paramOverrideMap) throws Exception

      Este método procesa una solicitud de bean de datos mediante las correlaciones de perfil basadas en configuración. Presupone que el llamante trata con el {@link BusinessContextService}.

      Los parámetros de entrada se completan automáticamente basándose en los parámetros de vía de acceso especificados en el URL, seguidos de los parámetros de consulta.

      Se puede proporcionar un mapa de alteración temporal para inyectar más parámetros o sustituir los parámetros preexistentes.

      Los parámetros siguientes están disponibles de forma predeterminada:
      nombreClaseBean
      El nombre de clase de bean de datos.
      profileName
      El nombre de perfil para el bean de datos en la configuración.
      responseFormat
      El formato de respuesta que se utiliza para generar el resultado.
      paramOverrideMap
      Define los parámetros que desea añadir o sustituir del objeto de solicitud que está asociado a este manejador.
      Normalmente se utiliza si hay parámetros de vía de acceso o datos de entidad que desea incluir cuando correlaciona los parámetros de consulta con la entrada del mandato.
      La clave debe ser una cadena. El valor puede ser cualquier objeto de tipo.
      El valor puede ser nulo.
    3. public Response executeConfigBasedCommandWithContext(String commandInterfaceName, String profileName, String responseFormat, String storeId, Map<String, Object> paramOverrideMap)

      Este método configura la solicitud de inicio {@link BusinessContextService}, luego delega a * {@link #executeControllerCommand(String, String, TypedProperty, String)} y finalmente finaliza la solicitud BCS.

      Los parámetros siguientes están disponibles de forma predeterminada:
      commandInterfaceName
      El nombre de la interfaz de mandatos de controlador.
      profileName
      El nombre de perfil para el mandato de controlador en la configuración.
      responseFormat
      El formato de respuesta que se utiliza para generar el resultado.
      paramOverrideMap
      Define los parámetros que desea añadir o sustituir del objeto de solicitud que está asociado a este manejador.
      Normalmente se utiliza si hay parámetros de vía de acceso o datos de entidad que desea incluir cuando correlaciona los parámetros de consulta con la entrada del mandato.
      La clave debe ser una cadena. El valor puede ser cualquier objeto de tipo.
      El valor puede ser nulo.
    4. public JSONObject executeConfigBasedCommand(String pCmdInterfaceName, String profileName, String responseFormat, String storeId, Map<String, Object> paramOverrideMap) throws Exception

      Este método procesa una solicitud de mandato de controlador mediante las correlaciones de perfil basadas en configuración. Presupone que el llamante trata con el {@link BusinessContextService}.

      Los parámetros de entrada se completan automáticamente basándose en los parámetros de vía de acceso especificados en el URL, seguidos de los parámetros que se encuentran en el cuerpo de la solicitud.

      Se puede proporcionar un mapa de alteración temporal para inyectar más parámetros o sustituir los parámetros preexistentes.

      Aunque el ID de tienda se especifica en la llamada de método, no se incluye automáticamente en la lista de parámetros que se proporcionan para rellenar los setters del mandato. Debe añadirlo explícitamente al mapa de alteración temporal o hacer que se incluya con los parámetros de vía de acceso URL o el cuerpo de solicitud.

      pCmdInterfaceName
      El nombre de la interfaz de mandatos de controlador.
      profileName
      El nombre de perfil para el mandato de controlador en la configuración.
      responseFormat
      El formato de respuesta que se utiliza para generar el resultado.
      storeId
      El ID de la tienda.
      paramOverrideMap
      Define los parámetros que desea añadir o sustituir del objeto de solicitud que está asociado a este manejador.
      Normalmente se utiliza si hay parámetros de vía de acceso o datos de entidad que desea incluir cuando correlaciona los parámetros de consulta con la entrada del mandato.
      La clave debe ser una cadena. El valor puede ser cualquier objeto de tipo.
      El valor puede ser nulo.
  3. Cree los archivos de correlaciones XML, ya sea utilizando el programa de utilidad restClassicSampleGen o manualmente:
    • Recomendado: Mediante el programa de utilidad restClassicSampleGen:

      Vaya al directorio WCDE_installdir\bin y ejecute el programa de utilidad:

      restClassicSampleGen.bat searchType=searchType basePackage=basePackage locationType=locationType location=location outputDir=outputDir classTypes=classTypes inputPrefix=inputPrefix sampleDepth=sampleDepth additionalClassPath=additionalClassPath

      Donde:
      searchType
      Utilice ABSOLUTE cuando se indican de forma explícita las clases para las que generar correlaciones.
      Utilice PATTERN para buscar clases que coincidan con los patrones de expresión regular Java especificados.
      El valor predeterminado es ABSOLUTE.
      basePackage
      El paquete Java base (excluyendo el punto final) para los que generar correlaciones.
      El valor predeterminado es *.
      locationType
      Utilice FILE para especificar que se utiliza un archivo que contiene entradas separadas por líneas de patrones de expresión regular Java, o clases explícitas en el formato com/example/MyClass.java.
      Utilice DIRECT si se especifica directamente un nombre de clase o un patrón de expresión regular Java.
      El valor predeterminado es DIRECT.
      location
      Si se ha especificado location TypeFILE, se trata de la vía de acceso al archivo.
      Si se ha especificado locationType DIRECT, es la expresión regular Java real o la clase explícita.
      outputDir
      El directorio de salida. El directorio se crea si no existe. Los subdirectorios se crean para cada tipo de clase generada.
      classTypes
      Uno o más de los valores separados por comas DATABEAN, CONTROLLERCOMMAND y ALL.
      El valor predeterminado es ALL.
      inputPrefix
      Especifica los caracteres que se indican como prefijo en los parámetros de entrada con el archivo de correlaciones.
      El valor predeterminado es *.
      sampleDepth
      La profundidad de las correlaciones que se van a crear cuando se atraviesan repetidamente las clases.
      El valor predeterminado es 3.
      additionalClassPath
      Especifica directorios y archivos JAR adicionales que se deben incluir para localizar clases, que están separadas con ;.
      Nota:
      • Si se utilizan espacios en alguno de los valores de propiedad, debe especificar toda la propiedad y el valor entre comillas. Por ejemplo, "property1=value 1".
      • Los valores predefinidos como ABSOLUTE no distinguen entre mayúsculas y minúsculas.
      Por ejemplo:
      • Para generar una correlación para el bean de datos especificado:
        
        restClassicSampleGen.bat location=com.ibm.commerce.catalog.beans.AttributeFloatValueDataBean 
         outputDir=C:/Temp/ClassicSamples
        
      • Para generar correlaciones únicamente para los beans de datos, a partir del paquete base com.example.myclasses, especificando un patrón directamente como una propiedad e indicando el prefijo q en todos los parámetros de entrada:
        
        restClassicSampleGen.bat searchType=pattern basePackage=com.example.myclasses classTypes=DATABEAN 
        "location=.*" inputPrefix=q outputDir=C:/Temp/ClassicSamples
        
      • Generar las clases que se especifican en un archivo, con una profundidad de correlación de 1. A continuación, añadir un archivo JAR y el directorio a la vía de acceso de clases para localizar las clases:
        
        restClassicSampleGen.bat locationType=file "location=C:/users/admin/mapping list.txt" 
        sampleDepth=1 "additionalClassPath=c:/lib/MyJar.jar;c:/classdir" outputDir=c:/users/admin/samples
        

      Asegúrese de que el programa de utilidad se ejecuta correctamente. Consulte el archivo WCDE_installdir\logs\restclassic.log para conocer más detalles.

    • De lo contrario, para crear manualmente los archivos de correlaciones XML, cree archivos de correlaciones parecidos a los siguientes ejemplos y guárdelos en las siguientes ubicaciones:
      Rest.war/WebContent/WEB-INF/config/beanMapping-ext
      El directorio para publicar beans de datos nuevos, o para ampliar los beans de datos existentes.
      Rest.war/WebContent/WEB-INF/config/commandMapping-ext
      El directorio para publicar mandatos de controlador nuevos, o para ampliar los mandatos de controlador existentes.
      Archivo de correlación de beans de datos de ejemplo (com.ibm.commerce.catalog.beans.CatalogEntryDataBean.xml):
      
      <?xml version="1.0" encoding="UTF-8"?>
      <bean>
         <profiles>
            <profile name="sample">
               <inputs>
                  <input inputName="associationType" methodName="setAssociationType"/>
                  <input inputName="attachmentUsage" methodName="setAttachmentUsage"/>
                  <input inputName="availabilityDate" methodName="setAvailabilityDate"/>
                  <input inputName="baseItemId" methodName="setBaseItemId"/>
                  <input inputName="buyable" methodName="setBuyable"/>
                  <input inputName="catalogEntryID" methodName="setCatalogEntryID"/>
                  <input inputName="compactProperties" methodName="setCompactProperties"/>
                  <input inputName="description" methodName="setDescription"/>
                  <input inputName="discontinueDate" methodName="setDiscontinueDate"/>
                  <input inputName="endDate" methodName="setEndDate"/>
                  <input inputName="endOfServiceDate" methodName="setEndOfServiceDate"/>
                  <input inputName="field1" methodName="setField1"/>
                  <input inputName="field2" methodName="setField2"/>
                  <input inputName="field3" methodName="setField3"/>
                  <input inputName="field4" methodName="setField4"/>
                  <input inputName="field5" methodName="setField5"/>
                  <input inputName="initKey_catalogEntryReferenceNumber" 
                   methodName="setInitKey_catalogEntryReferenceNumber"/>
                  <input inputName="itemspc_id" methodName="setItemspc_id"/>
                  <input inputName="language_id" methodName="setLanguage_id"/>
                  <input inputName="lastOrderDate" methodName="setLastOrderDate"/>
                  <input inputName="lastUpdate" methodName="setLastUpdate"/>
                  <input inputName="manufacturerName" methodName="setManufacturerName"/>
                  <input inputName="manufacturerPartNumber" 
                   methodName="setManufacturerPartNumber"/>
                  <input inputName="markForDelete" methodName="setMarkForDelete"/>
                  <input inputName="memberId" methodName="setMemberId"/>
                  <input inputName="oid" methodName="setOid"/>
                  <input inputName="onAuction" methodName="setOnAuction"/>
                  <input inputName="onSpecial" methodName="setOnSpecial"/>
                  <input inputName="partNumber" methodName="setPartNumber"/>
                  <input inputName="shipping" methodName="setShipping"/>
                  <input inputName="startDate" methodName="setStartDate"/>
                  <input inputName="state" methodName="setState"/>
                  <input inputName="url" methodName="setUrl"/>
               </inputs>
               <outputs>
                  <output methodName="getApplicableContractIds" 
                   outputName="applicableContractIds"/>
                  <output methodName="getAvailabilityDate" outputName="availabilityDate"/>
                  <output methodName="getAvailabilityDay" outputName="availabilityDay"/>
                  <output methodName="getAvailabilityMonth" outputName="availabilityMonth"/>
                  <output methodName="getAvailabilityYear" outputName="availabilityYear"/>
                  <output methodName="getBaseItemIdInEJBType" outputName="baseItemId"/>
                  <output methodName="getBuyableInEJBType" outputName="buyable"/>
                  <output methodName="getCatalogEntryID" outputName="catalogEntryID"/>
                  <output methodName="getCatalogEntryReferenceNumberInEJBType" 
                   outputName="catalogEntryReferenceNumber"/>
                  <output methodName="getDiscontinueDate" outputName="discontinueDate"/>
                  <output methodName="getDiscontinueDay" outputName="discontinueDay"/>
                  <output methodName="getDiscontinueMonth" outputName="discontinueMonth"/>
                  <output methodName="getDiscontinueYear" outputName="discontinueYear"/>
                  <output methodName="getEndDate" outputName="endDate"/>
                  <output methodName="getEndDay" outputName="endDay"/>
                  <output methodName="getEndMonth" outputName="endMonth"/>
                  <output methodName="getEndOfServiceDate" outputName="endOfServiceDate"/>
                  <output methodName="getEndOfServiceDay" outputName="endOfServiceDay"/>
                  <output methodName="getEndOfServiceMonth" outputName="endOfServiceMonth"/>
                  <output methodName="getEndOfServiceYear" outputName="endOfServiceYear"/>
                  <output methodName="getEndYear" outputName="endYear"/>
                  <output methodName="getField1InEJBType" outputName="field1"/>
                  <output methodName="getField2InEJBType" outputName="field2"/>
                  <output methodName="getField3InEJBType" outputName="field3"/>
                  <output methodName="getField4" outputName="field4"/>
                  <output methodName="getField5" outputName="field5"/>
                  <output methodName="getFormattedAvailabilityDate" 
                   outputName="formattedAvailabilityDate"/>
                  <output methodName="getFormattedDiscontinueDate" 
                   outputName="formattedDiscontinueDate"/>
                  <output methodName="getFormattedEndDate" 
                   outputName="formattedEndDate"/>
                  <output methodName="getFormattedEndOfServiceDate" 
                   outputName="formattedEndOfServiceDate"/>
                  <output methodName="getFormattedLastOrderDate" 
                   outputName="formattedLastOrderDate"/>
                  <output methodName="getFormattedStartDate" 
                   outputName="formattedStartDate"/>
                  <output methodName="isAnyMerchandisingAssociated" 
                   outputName="isAnyMerchandisingAssociated"/>
                  <output methodName="isBundle" outputName="isBundle"/>
                  <output methodName="isCalculatedContractPriced" 
                   outputName="isCalculatedContractPriced"/>
                  <output methodName="isCatalogEntryAllowedPriceRanges" 
                   outputName="isCatalogEntryAllowedPriceRanges"/>
                  <output methodName="isDynamicKit" outputName="isDynamicKit"/>
                  <output methodName="isItem" outputName="isItem"/>
                  <output methodName="isListPriced" outputName="isListPriced"/>
                  <output methodName="isMerchandisingAssociated" 
                   outputName="isMerchandisingAssociated"/>
                  <output methodName="isPackage" outputName="isPackage"/>
                  <output methodName="isProduct" outputName="isProduct"/>
                  <output methodName="getItemspc_idInEJBType" outputName="itemspc_id"/>
                  <output methodName="getLanguage_idInEJBType" outputName="language_id"/>
                  <output methodName="getLastOrderDate" outputName="lastOrderDate"/>
                  <output methodName="getLastOrderDay" outputName="lastOrderDay"/>
                  <output methodName="getLastOrderMonth" outputName="lastOrderMonth"/>
                  <output methodName="getLastOrderYear" outputName="lastOrderYear"/>
                  <output methodName="getLastUpdateInEJBType" outputName="lastUpdate"/>
                  <output methodName="getManufacturerName" outputName="manufacturerName"/>
                  <output methodName="getManufacturerPartNumber" 
                   outputName="manufacturerPartNumber"/>
                  <output methodName="getMarkForDeleteInEJBType" 
                   outputName="markForDelete"/>
                  <output methodName="getMemberIdInEJBType" outputName="memberId"/>
                  <output methodName="getObjectPath" outputName="objectPath"/>
                  <output methodName="getOid" outputName="oid"/>
                  <output methodName="getOnAuctionInEJBType" outputName="onAuction"/>
                  <output methodName="getOnSpecialInEJBType" outputName="onSpecial"/>
                  <output methodName="getParentCatalogEntryIds" 
                   outputName="parentCatalogEntryIds"/>
                  <output methodName="getPartNumber" outputName="partNumber"/>
                  <output methodName="getStartDate" outputName="startDate"/>
                  <output methodName="getStartDay" outputName="startDay"/>
                  <output methodName="getStartMonth" outputName="startMonth"/>
                  <output methodName="getStartYear" outputName="startYear"/>
                  <output methodName="getState" outputName="state"/>
                  <output methodName="getType" outputName="type"/>
                  <output methodName="getUrl" outputName="url"/>
               </outputs>
            </profile>
         </profiles>
      </bean>
      
      Archivo de correlación de mandatos controlador de ejemplo (com.ibm.commerce.catalogmanagement.commands.CatalogEntryUpdateCmd.xml):
      
      <?xml version="1.0" encoding="UTF-8"?>
      <command>
         <profiles>
            <profile name="sample">
               <inputs>
                  <input inputName="URL" methodName="setURL"/>
                  <input inputName="XMLdetail" methodName="setXMLdetail"/>
                  <input inputName="auxdescription1" methodName="setAuxdescription1"/>
                  <input inputName="auxdescription2" methodName="setAuxdescription2"/>
                  <input inputName="availabilityDate" methodName="setAvailabilityDate"/>
                  <input inputName="availabilitydate" methodName="setAvailabilitydate"/>
                  <input inputName="available" methodName="setAvailable"/>
                  <input inputName="buyable" methodName="setBuyable"/>
                  <input inputName="catEntURL" methodName="setCatEntURL"/>
                  <input inputName="catentryId" methodName="setCatentryId"/>
                  <input inputName="descLanguage" methodName="setDescLanguage"/>
                  <input inputName="discontinueDate" methodName="setDiscontinueDate"/>
                  <input inputName="endDate" methodName="setEndDate"/>
                  <input inputName="endOfServiceDate" methodName="setEndOfServiceDate"/>
                  <input inputName="expirationdate" methodName="setExpirationdate"/>
                  <input inputName="field1" methodName="setField1"/>
                  <input inputName="field2" methodName="setField2"/>
                  <input inputName="field3" methodName="setField3"/>
                  <input inputName="field4" methodName="setField4"/>
                  <input inputName="field5" methodName="setField5"/>
                  <input inputName="fullimage" methodName="setFullimage"/>
                  <input inputName="keyword" methodName="setKeyword"/>
                  <input inputName="lastOrderDate" methodName="setLastOrderDate"/>
                  <input inputName="longdescription" methodName="setLongdescription"/>
                  <input inputName="markfordelete" methodName="setMarkfordelete"/>
                  <input inputName="memberId" methodName="setMemberId"/>
                  <input inputName="mfname" methodName="setMfname"/>
                  <input inputName="mfpartnumber" methodName="setMfpartnumber"/>
                  <input inputName="name" methodName="setName"/>
                  <input inputName="onauction" methodName="setOnauction"/>
                  <input inputName="onspecial" methodName="setOnspecial"/>
                  <input inputName="partnumber" methodName="setPartnumber"/>
                  <input inputName="published" methodName="setPublished"/>
                  <input inputName="shortdescription" methodName="setShortdescription"/>
                  <input inputName="startDate" methodName="setStartDate"/>
                  <input inputName="thumbnail" methodName="setThumbnail"/>
               </inputs>
               <outputs>
                  <output methodName="getCatentryId" outputName="catentryId"/>
                  <output methodName="getPartnumber" outputName="partnumber"/>
               </outputs>
            </profile>
         </profiles>
      </command>