docs: @Override
      public Object readFrom(Class<Object> c, Type t, Annotation[] anns, MediaType mt,
                             MultivaluedMap<String, String> headers, InputStream is) throws IOException, WebApplicationException {
          // TODO Auto-generated method stub
          //if Type t contains IAttachment, IMutibody, convert to Attachment, Mutibody to adapt CXF MultipartProvider.readFrom
          multipartProvider.setMessageContext(mc);
          ParameterizedType origType = null;
          Type[] actualType = null;
          if (ParameterizedType.class.isAssignableFrom(t.getClass())) {
              origType = (ParameterizedType) t;
              actualType = origType.getActualTypeArguments();
              for (int i = 0; i < actualType.length; i++) {
                  if (actualType[i].equals(IAttachment.class)) {
                      actualType[i] = Attachment.class;
                  } else if (actualType[i].equals(IMultipartBody.class)) {
                      actualType[i] = MultipartBody.class;
                  }
              }
  
              if (actualType != null && origType != null) {
                  t = IBMParameterizedTypeImpl.make(origType.getRawType().getClass(), actualType, origType.getOwnerType());
              }
          } else if (IMultipartBody.class.isAssignableFrom(getActualType(t, 0))) {
              t = MultipartBody.class;
          }
          if (IAttachment.class.equals(c)) {
              c = (Class<Object>) (Object) Attachment.class;
          } else if (IMultipartBody.class.equals(c)) {
              c = (Class<Object>) (Object) MultipartBody.class;
          }
          //add additional converting logic since the above converting doesn't work in personal build server.
          if ("com.ibm.websphere.jaxrs20.multipart.IAttachment".equals(c.getName())) {
              c = (Class<Object>) (Object) Attachment.class;
          } else if ("com.ibm.websphere.jaxrs20.multipart.IMultipartBody".equals(c.getName())) {
              c = (Class<Object>) (Object) MultipartBody.class;
          }
          Object object = multipartProvider.readFrom(c, t, anns, mt, headers, is);
          //if object contains Attachment/MultiBoday for CXF, convert to AttachmentImpl, MultipartBodyImpl for IBM
          //List Value type: DataHandler, DataSource, Attachment, only converty Attachment
          if (object instanceof List<?>) {
              List attList = (List) object;
              List<AttachmentImpl> attImplList;
              if (!attList.isEmpty()) {
                  attImplList = new LinkedList<AttachmentImpl>();
                  AttachmentImpl attImpl;
                  for (Object obj : attList) {
                      if (obj != null && obj instanceof Attachment) {
                          attImpl = new AttachmentImpl((Attachment) obj);
                          attImplList.add(attImpl);
                      }
                  }
                  return attImplList;
              }
              return object;
          }
          //convert Map if contains Attachment, e.g. LinkedHashMap <a.getContentType().toString(),fromAttachment>, fromAttachment== List<>: DataHandler, DataSource, Attachment
          else if (object != null && Map.class.isAssignableFrom(object.getClass())) {
              Map<Object, Object> attMap = (Map) object;
              if (!attMap.isEmpty()) {
                  for (Iterator it = attMap.entrySet().iterator(); it.hasNext();) {
                      Entry entrySet = (Entry) it.next();
                      if (entrySet.getValue() != null && List.class.isAssignableFrom(entrySet.getValue().getClass())) {
                          List attList = (List) entrySet.getValue();
                          List<AttachmentImpl> attImplList;
                          if (!attList.isEmpty()) {
                              attImplList = new LinkedList<AttachmentImpl>();
                              AttachmentImpl attImpl;
                              for (Object obj : attList) {
                                  if (obj != null && Attachment.class.isAssignableFrom(obj.getClass())) {
                                      attImpl = new AttachmentImpl((Attachment) obj);
                                      attImplList.add(attImpl);
                                  }
                              }
                              entrySet.setValue(attImplList);
                          }
                      }
                  }
              }
              return attMap;
          }
          //if object is MultipartBody, convert to MultipartBodayImpl
          else if (object instanceof MultipartBody) {
              IMultipartBody imbody = new MultipartBodyImpl((MultipartBody) object);
              return imbody;
          }
          return object;
      }