public static <S> S createService(Class<S> serviceClass, int api_type) {

    OkHttpClient client = new OkHttpClient();
    Retrofit retrofit =
        new Retrofit.Builder()
            .baseUrl(RestConfig.getBaseUrl(api_type))
            .addConverterFactory(GsonConverterFactory.create(GsonFactory.createGson(api_type)))
            .client(client)
            .build();

    return retrofit.create(serviceClass);
  }
 @Override
 protected void transformResponse(DSResponse dsResponse, DSRequest dsRequest, Object data) {
   if (RestConfig.isStatusOk(dsResponse)) {
     Record[] records = dsResponse.getData();
     for (Record record : records) {
       String mid = record.getAttribute(FIELD_ID);
       String way = record.getAttribute(FIELD_WAY);
       String pk = mid;
       if (way != null) {
         pk = mid + way;
       }
       record.setAttribute(PRIMARY_KEY, pk);
     }
   }
   super.transformResponse(dsResponse, dsRequest, data);
 }
  public WorkflowMaterialDataSource() {
    setID(ID);
    setDataFormat(DSDataFormat.JSON);
    setDataURL(RestConfig.URL_WORKFLOW_MATERIAL);
    final ClientMessages i18n = GWT.create(ClientMessages.class);

    DataSourceTextField primaryKey = new DataSourceTextField(PRIMARY_KEY);
    primaryKey.setCanEdit(false);
    primaryKey.setCanSave(false);
    primaryKey.setHidden(true);
    primaryKey.setPrimaryKey(true);

    DataSourceTextField fieldId = new DataSourceTextField(FIELD_ID);
    fieldId.setCanEdit(false);
    fieldId.setDetail(true);
    fieldId.setTitle(i18n.WorkflowMaterial_Field_Id_Title());

    DataSourceTextField note = new DataSourceTextField(FIELD_NOTE);
    note.setTitle(i18n.WorkflowMaterial_Field_Note_Title());

    DataSourceTextField value = new DataSourceTextField(FIELD_VALUE);
    value.setTitle(i18n.WorkflowMaterial_Field_Label_Title());

    DataSourceTextField profile = new DataSourceTextField(FIELD_PROFILENAME);
    profile.setTitle(i18n.WorkflowMaterial_Field_Profile_Title());
    profile.setDisplayField(WorkflowModelConsts.MATERIAL_PROFILELABEL);

    DataSourceEnumField type = new DataSourceEnumField(FIELD_TYPE);
    type.setTitle(i18n.WorkflowMaterial_Field_Type_Title());
    type.setValueMap(
        new LinkedHashMap<String, String>() {
          {
            put(MaterialType.FOLDER.name(), i18n.WorkflowMaterial_Type_Folder_Title());
            put(MaterialType.PHYSICAL_DOCUMENT.name(), i18n.WorkflowMaterial_Type_Physical_Title());
            put(MaterialType.DIGITAL_OBJECT.name(), i18n.WorkflowMaterial_Type_Digital_Title());
          }
        });

    DataSourceEnumField way = new DataSourceEnumField(FIELD_WAY);
    way.setTitle(i18n.WorkflowMaterial_Field_Way_Title());
    way.setPrompt(i18n.WorkflowMaterial_Field_Way_Hint());
    way.setValueMap(
        new LinkedHashMap<String, String>() {
          {
            put(Way.INPUT.name(), i18n.WorkflowMaterial_Way_Input_Title());
            put(Way.OUTPUT.name(), i18n.WorkflowMaterial_Way_Output_Title());
          }
        });

    DataSourceTextField path = new DataSourceTextField(FIELD_FOLDER_PATH);
    path.setTitle(i18n.WorkflowMaterial_Field_Path_Title());
    path.setDetail(true);

    DataSourceTextField catalog = new DataSourceTextField(FIELD_PHYSICAL_CATALOG);
    catalog.setTitle(i18n.WorkflowMaterial_Field_Catalog_Title());
    catalog.setDetail(true);

    DataSourceTextField barcode = new DataSourceTextField(FIELD_PHYSICAL_BARCODE);
    barcode.setTitle(i18n.WorkflowMaterial_Field_Barcode_Title());
    barcode.setDetail(true);

    DataSourceTextField field001 = new DataSourceTextField(FIELD_PHYSICAL_FIELD001);
    field001.setTitle(i18n.WorkflowMaterial_Field_Field001_Title());
    field001.setDetail(true);

    DataSourceTextField rdCzId = new DataSourceTextField(FIELD_PHYSICAL_RDCZID);
    rdCzId.setTitle(i18n.WorkflowMaterial_Field_RdCzId_Title());
    rdCzId.setDetail(true);

    DataSourceTextField signature = new DataSourceTextField(FIELD_PHYSICAL_SIGNATURE);
    signature.setTitle(i18n.WorkflowMaterial_Field_Signature_Title());
    signature.setDetail(true);

    DataSourceTextField pid = new DataSourceTextField(FIELD_DIGITAL_PID);
    pid.setTitle(i18n.WorkflowMaterial_Field_Pid_Title());
    pid.setDetail(true);

    DataSourceTextField metadata = new DataSourceTextField(FIELD_PHYSICAL_METADATA);
    metadata.setTitle(i18n.WorkflowMaterial_Field_Metadata_Title());
    metadata.setDetail(true);

    setFields(
        profile,
        type,
        value,
        way,
        note,
        fieldId,
        primaryKey,
        path,
        barcode,
        field001,
        signature,
        rdCzId,
        catalog,
        metadata,
        pid);
    setRequestProperties(RestConfig.createRestRequest(getDataFormat()));
    setOperationBindings(RestConfig.createUpdatePostOperation());
  }