예제 #1
0
 @Override
 public boolean innerSupports(ParamMetaData metaData) {
   return List.class == metaData.getParamType()
       || Collection.class == metaData.getParamType()
       || (!Modifier.isAbstract(metaData.getParamType().getModifiers())
           && List.class.isAssignableFrom(metaData.getParamType()));
 }
예제 #2
0
 public Map<?, ?> resolve(Invocation inv, ParamMetaData metaData) {
   if (StringUtils.isNotEmpty(metaData.getParamName())) {
     Class<?>[] genericTypes = (Class[]) metaData.getUserObject(this);
     Class<?> keyType = genericTypes[0];
     Class<?> valueType = genericTypes[1];
     Map<?, ?> toConvert =
         WebUtils.getParametersStartingWith(
             inv.getRequest(), metaData.getParamName() + MAP_SEPARATOR);
     if (toConvert != null) {
       if (keyType != String.class || valueType != String.class) {
         Map<Object, Object> ret = new HashMap<Object, Object>();
         for (Map.Entry<?, ?> entry : toConvert.entrySet()) {
           Object key = entry.getKey();
           Object value = entry.getValue();
           TypeConverter typeConverter = SafedTypeConverterFactory.getCurrentConverter();
           if (keyType != String.class) {
             key = typeConverter.convertIfNecessary(key, keyType);
           }
           if (valueType != String.class) {
             value = typeConverter.convertIfNecessary(value, valueType);
           }
           ret.put(key, value);
         }
         return ret;
       }
       return toConvert;
     }
   }
   return new HashMap<Object, Object>(2);
 }
예제 #3
0
 public BindingResult resolve(Invocation inv, ParamMetaData metaData) {
   if (metaData.getParamName() != null) {
     return inv.getBindingResult(metaData.getParamName());
   } else {
     return inv.getParameterBindingResult();
   }
 }
예제 #4
0
 public boolean supports(ParamMetaData metaData) {
   if (ClassUtils.isPrimitiveOrWrapper(metaData.getParamType())) {
     return true;
   }
   SimpleTypeConverter simpleTypeConverter = SafedTypeConverterFactory.getCurrentConverter();
   return simpleTypeConverter.findCustomEditor(metaData.getParamType(), null) != null
       || simpleTypeConverter.getDefaultEditor(metaData.getParamType()) != null;
 }
예제 #5
0
 @Override
 @SuppressWarnings("unchecked")
 protected Collection create(ParamMetaData metaData, int len) throws Exception {
   if (metaData.getParamType().isInterface()) {
     return new HashSet<Object>(len);
   } else {
     return (Collection<?>) metaData.getParamType().getConstructor().newInstance();
   }
 }
예제 #6
0
 public boolean supports(ParamMetaData metaData) {
   boolean result = metaData.getParamType() == Mvc.class;
   if (result) {
     if (!metaData.getControllerClass().getName().startsWith("com.sinosoft.one.mvc")) {
       throw new IllegalStateException("Mvc is not allowed as a method parameter:" + metaData);
     }
   }
   return result;
 }
예제 #7
0
 @SuppressWarnings("unchecked")
 private static Object resolveArray(
     Invocation inv, ParamMetaData metaData, Class<?> compnentType) {
   if (compnentType == MultipartFile.class) {
     String filterName = metaData.getParamName();
     if (filterName == null) {
       filterName = "";
     }
     if (inv.getRequest() instanceof MultipartRequest) {
       List<MultipartFile> files = new LinkedList<MultipartFile>();
       MultipartRequest multipartRequest = (MultipartRequest) inv.getRequest();
       Iterator<String> names = multipartRequest.getFileNames();
       while (names.hasNext()) {
         String name = names.next();
         if (name.startsWith(filterName)) {
           files.add(multipartRequest.getFile(name));
         }
       }
       return files.toArray(new MultipartFile[0]);
     } else {
       if (logger.isDebugEnabled()) {
         logger.debug(
             "cann't "
                 + "set MultipartFile param to method "
                 + ", the request is not a MultipartRequest");
       }
     }
   } else {
     Object toConvert = null;
     for (String paramName : metaData.getParamNames()) {
       if (paramName != null) {
         toConvert = inv.getRequest().getParameterValues(paramName);
         if (toConvert != null) {
           break;
         }
       }
     }
     if (toConvert != null) {
       if (((String[]) toConvert).length == 1) {
         toConvert = ((String[]) toConvert)[0].split(",");
       }
       Class<?> arrayType;
       if (metaData.getParamType().isArray()) {
         arrayType = metaData.getParamType();
       } else {
         arrayType = arrayTypeMap.get(compnentType);
         if (arrayType == null) {
           arrayType = Array.newInstance((Class<?>) compnentType, 0).getClass();
         }
       }
       TypeConverter typeConverter = SafedTypeConverterFactory.getCurrentConverter();
       Object array = typeConverter.convertIfNecessary(toConvert, arrayType);
       return array;
     }
   }
   return Array.newInstance((Class<?>) compnentType, 0);
 }
예제 #8
0
 @SuppressWarnings("unchecked")
 public Object resolve(Invocation inv, ParamMetaData metaData) {
   for (String paramName : metaData.getParamNames()) {
     if (paramName != null) {
       String value = inv.getParameter(paramName);
       if (value != null) {
         return Enum.valueOf((Class<? extends Enum>) metaData.getParamType(), value);
       }
     }
   }
   return null;
 }
예제 #9
0
 public Date resolve(Invocation inv, ParamMetaData metaData) throws Exception {
   String text = null;
   for (String paramName : metaData.getParamNames()) {
     if (paramName != null) {
       text = inv.getParameter(paramName);
       if (text != null && (text = text.trim()).length() > 0) {
         break;
       }
     }
   }
   Date date = resolveUtilDate(text, metaData);
   return DatePatterns.changeType(date, metaData.getParamType());
 }
예제 #10
0
 public Object resolve(Invocation inv, ParamMetaData metaData) {
   Object bean = MvcBeanUtils.instantiateClass(metaData.getParamType());
   ServletRequestDataBinder binder;
   if (!metaData.isAnnotationPresent(Param.class)) {
     binder = new ServletRequestDataBinder(bean);
   } else {
     binder = new ServletRequestDataBinder(bean, metaData.getParamName());
   }
   binder.bind(inv.getRequest());
   String bindingResultName =
       BindingResult.MODEL_KEY_PREFIX + metaData.getParamName() + "BindingResult";
   inv.addModel(bindingResultName, binder.getBindingResult());
   return bean;
 }
예제 #11
0
 public HttpSession resolve(Invocation inv, ParamMetaData metaData) {
   boolean create = true;
   Create createAnnotation = metaData.getAnnotation(Create.class);
   if (createAnnotation != null) {
     create = createAnnotation.value();
   }
   return inv.getRequest().getSession(create);
 }
예제 #12
0
 public MultipartFile resolve(Invocation inv, ParamMetaData metaData) {
   MultipartFile multipartFile = null;
   if (inv.getRequest() instanceof MultipartRequest) {
     MultipartRequest multipartRequest = (MultipartRequest) inv.getRequest();
     String fileName = metaData.getParamName();
     if (StringUtils.isBlank(fileName)) {
       @SuppressWarnings("unchecked")
       Iterator<String> allFileNames = multipartRequest.getFileNames();
       if (allFileNames.hasNext()) {
         fileName = allFileNames.next();
       }
     }
     if (StringUtils.isNotBlank(fileName)) {
       multipartFile = multipartRequest.getFile(fileName);
     }
     if (multipartFile == null) {
       if (StringUtils.isNotBlank(fileName)) {
         if (logger.isDebugEnabled()) {
           logger.debug(
               "not found multipartFile named "
                   + fileName
                   + " in this request: "
                   + inv.getRequestPath().getUri());
         }
       } else {
         if (logger.isDebugEnabled()) {
           logger.debug(
               "not found MultipartFile named:"
                   + metaData.getParamName()
                   + " in this request: "
                   + inv.getRequestPath().getUri());
         }
       }
     }
   } else {
     if (logger.isDebugEnabled()) {
       logger.debug(
           "cann't set MultipartFile param to method "
               + ", the request is not a MultipartRequest");
     }
   }
   return multipartFile;
 }
예제 #13
0
 protected Date resolveUtilDate(String text, ParamMetaData metaData) throws ParseException {
   if (StringUtils.isEmpty(text)) {
     DefValue defaultValudeAnnotation = metaData.getAnnotation(DefValue.class);
     if (defaultValudeAnnotation != null
         && !DefValue.NATIVE_DEFAULT.equals(defaultValudeAnnotation.value())) {
       if (StringUtils.isEmpty(defaultValudeAnnotation.value())) {
         return new Date(); // 当前时间!
       } else {
         text = defaultValudeAnnotation.value(); // 改变要被解析的文本!
       }
     } else {
       return null; // 保留null,而非当前时间
     }
   }
   Annotation[] paramAnnotations =
       metaData.getMethod().getParameterAnnotations()[metaData.getIndex()];
   for (Annotation annotation : paramAnnotations) {
     if (annotation instanceof Pattern) {
       String[] patterns = Pattern.class.cast(annotation).value();
       for (String pattern : patterns) {
         // 以long为时间
         if ("long".equals(pattern)) {
           boolean digit = true;
           for (int i = 0; i < text.length(); i++) {
             if (!Character.isDigit(text.charAt(i))) {
               digit = false;
               break;
             }
           }
           if (digit) {
             return new Date(Long.parseLong(text));
           }
         }
         // 可以配置多个pattern!! 通过长度匹配
         if (text.length() == pattern.length()) {
           return new SimpleDateFormat(pattern).parse(text);
         }
       }
       break;
     }
   }
   return DatePatterns.parse(text);
 }
예제 #14
0
 @SuppressWarnings("unchecked")
 public Object resolve(Invocation inv, ParamMetaData metaData) throws Exception {
   Object array = resolveArray(inv, metaData, (Class<?>) metaData.getUserObject(this));
   int len = ArrayUtils.getLength(array);
   Collection collection = create(metaData, len);
   for (int i = 0; i < len; i++) {
     collection.add(Array.get(array, i));
   }
   return collection;
 }
예제 #15
0
 public String resolve(Invocation inv, ParamMetaData metaData) {
   for (String paramName : metaData.getParamNames()) {
     if (paramName != null) {
       String value = inv.getParameter(paramName);
       if (value != null) {
         return value;
       }
     }
   }
   return null;
 }
예제 #16
0
 public boolean supports(ParamMetaData metaData) {
   boolean supports =
       Map.class == metaData.getParamType() || HashMap.class == metaData.getParamType();
   if (supports) {
     Class<?>[] generics =
         compileGenericParameterTypesDetail(metaData.getMethod(), metaData.getIndex());
     if (generics == null || generics.length == 0) {
       throw new IllegalArgumentException(
           "please use generic for "
               + metaData.getParamType().getName()
               + " ["
               + metaData.getControllerClass().getName()
               + "."
               + metaData.getMethod().getName()
               + "]");
     }
     metaData.setUserObject(this, generics);
   }
   return supports;
 }
예제 #17
0
 private static boolean addIndexAliasParamNameIfNeccessary(ParamMetaData metaData) {
   Class<?>[] paramTypes = metaData.getMethod().getParameterTypes();
   int index = metaData.getIndex(); // index是从0开始的
   int uriParamIndex = 0; // uriParamIndex,有效的值是从**1**开始的
   int breakIndex = 0; // breakIndex从0开始的
   for (; breakIndex < paramTypes.length && breakIndex <= index; breakIndex++) {
     Class<?> type = paramTypes[breakIndex];
     if (type.isArray()) {
       type = type.getComponentType();
     } else if (Collection.class.isAssignableFrom(type)) {
       Class<?>[] generics = compileGenericParameterTypesDetail(metaData.getMethod(), breakIndex);
       if (generics == null) {
         return false;
       }
       Assert.isTrue(generics.length > 0);
       type = generics[0];
     }
     if (ClassUtils.isPrimitiveOrWrapper(type)
         || type == String.class
         || Date.class.isAssignableFrom(type)) {
       uriParamIndex++;
     }
   }
   if ((breakIndex - 1) == index && uriParamIndex > 0) {
     String alias = "$" + uriParamIndex;
     metaData.addAliasParamName(alias);
     if (logger.isDebugEnabled()) {
       logger.debug(
           "add index alias paramName: '"
               + alias
               + "' for "
               + metaData.getControllerClass().getName()
               + "."
               + metaData.getMethod().getName()
               + "(..."
               + metaData.getParamType()
               + "[index="
               + breakIndex
               + "] ...)");
     }
     return true;
   }
   return false;
 }
예제 #18
0
 public final boolean supports(ParamMetaData metaData) {
   if (innerSupports(metaData)) {
     Class<?>[] generics =
         compileGenericParameterTypesDetail(metaData.getMethod(), metaData.getIndex());
     if (generics == null || generics.length == 0) {
       throw new IllegalArgumentException(
           "please use generic for "
               + metaData.getParamType().getName()
               + " ["
               + metaData.getControllerClass().getName()
               + "."
               + metaData.getMethod().getName()
               + "]");
     }
     metaData.setUserObject(this, generics[0]);
     return true;
   }
   return false;
 }
예제 #19
0
 public boolean supports(ParamMetaData metaData) {
   return HttpServletResponse.class == metaData.getParamType()
       || ServletResponse.class == metaData.getParamType();
 }
예제 #20
0
    public Object resolve(Invocation inv, ParamMetaData metaData) {
      String toConvert = null;
      //
      FlashParam flashParam = metaData.getAnnotation(FlashParam.class);
      if (flashParam != null) {
        toConvert = inv.getFlash().get(flashParam.value());
      }

      for (String paramName : metaData.getParamNames()) {
        if (paramName != null) {
          toConvert = inv.getRequest().getParameter(paramName);
          if (toConvert != null) {
            break;
          }
        }
      }
      if (toConvert == null) {
        DefValue defValudeAnnotation = metaData.getAnnotation(DefValue.class);
        if (defValudeAnnotation != null
            && !DefValue.NATIVE_DEFAULT.equals(defValudeAnnotation.value())) {
          toConvert = defValudeAnnotation.value();
        }
      }
      if (toConvert != null) {
        SimpleTypeConverter typeConverter = SafedTypeConverterFactory.getCurrentConverter();
        return typeConverter.convertIfNecessary(toConvert, metaData.getParamType());
      }
      if (metaData.getParamType().isPrimitive()) {
        // 对这最常用的类型做一下if-else判断,其他类型就简单使用converter来做吧
        if (metaData.getParamType() == int.class) {
          return Integer.valueOf(0);
        } else if (metaData.getParamType() == long.class) {
          return Long.valueOf(0);
        } else if (metaData.getParamType() == boolean.class) {
          return Boolean.FALSE;
        } else if (metaData.getParamType() == double.class) {
          return Double.valueOf(0);
        } else if (metaData.getParamType() == float.class) {
          return Float.valueOf(0);
        } else {
          SimpleTypeConverter typeConverter = SafedTypeConverterFactory.getCurrentConverter();
          return typeConverter.convertIfNecessary("0", metaData.getParamType());
        }
      }
      return null;
    }
예제 #21
0
 public boolean supports(ParamMetaData metaData) {
   return HttpSession.class == metaData.getParamType();
 }
예제 #22
0
 public boolean supports(ParamMetaData metaData) {
   return String.class == metaData.getParamType();
 }
예제 #23
0
 public boolean supports(ParamMetaData metaData) {
   return MultipartHttpServletRequest.class == metaData.getParamType();
 }
예제 #24
0
 public boolean supports(ParamMetaData metaData) {
   return Date.class == metaData.getParamType()
       || java.sql.Date.class == metaData.getParamType()
       || java.sql.Time.class == metaData.getParamType()
       || java.sql.Timestamp.class == metaData.getParamType();
 }
예제 #25
0
 public boolean supports(ParamMetaData metaData) {
   return MultipartFile.class == metaData.getParamType();
 }
예제 #26
0
 public boolean supports(ParamMetaData metaData) {
   return !Modifier.isAbstract(metaData.getParamType().getModifiers());
 }
예제 #27
0
 public boolean supports(ParamMetaData metaData) {
   return BindingResult.class == metaData.getParamType()
       || Errors.class == metaData.getParamType();
 }
예제 #28
0
 public boolean supports(ParamMetaData metaData) {
   return ServletContext.class == metaData.getParamType();
 }
예제 #29
0
 public boolean supports(ParamMetaData metaData) {
   return metaData.getParamType().isArray();
 }
예제 #30
0
 public Object resolve(Invocation inv, ParamMetaData metaData) {
   return resolveArray(inv, metaData, metaData.getParamType().getComponentType());
 }