[java] 소스 분석

프로그래밍/Java 2009. 9. 6. 15:19 Posted by galad
public static void setAllowedTypes(FileUploadInfo info, SubContentInfo sinfo) throws ContentException {
        log.debug("<< setAllowedTypes >> START");
       
        Class cls = info.getClass();
        Class scls = sinfo.getClass();
        Method[] mtd = cls.getDeclaredMethods();
        Pattern p = Pattern.compile("get_fileUpload_(\\d+)FileName");
        Matcher m = null;
        String mStr = null;
        String mType = null;
        String defExt = null;
        int i;
       
        for(i = 0; i < mtd.length; i++) {
            m = p.matcher(mtd[i].getName());
            if(m.find()) {
                try {
                    // 파일명이 존재하는 경우만
                    mStr = FileUploadInfo.getValueOfMethod(info, m.group());
                    if(mStr != null) {
                        mType = FileUploadInfo.getValueOfMethod(info, "get_fileUpload_" + m.group(1) + "ContentType");
                        // 기본 확장자 지정
                        defExt = "";
                        if(mType != null) {
                            defExt = mStr.substring(mStr.lastIndexOf(".") + 1);
                            defExt = defExt.toLowerCase().trim();
                           
                            log.debug("defExt = " + defExt);
                           
                            if("jpg".equals(defExt) ||
                               "gif".equals(defExt) ||
                               "xml".equals(defExt) ||
                               "xmp".equals(defExt) ||
                               "png".equals(defExt) ||
                               "zip".equals(defExt) ) {
                                // 진행
                            }else {
                                // 오류 발생
                                throw new ContentException("지원하지 않는 파일입니다.");
                            }
                        }
                       
                        Class[] cParam = new Class[]{String.class};
                        Method cMtd = cls.getMethod("set_fileUpload_" + m.group(1) + "FileName", cParam);
                        Object[] oParam = new Object[]{mStr};
                        // FileUploadInfo에 등록
                        cMtd.invoke(info, oParam); // 마찬가지로 첫번째 인자는 실행시킬 메소드를 갖고 있는 obj, 두번째는 실제 메소드의 파라미터
                        // SubContentInfo에 등록
                        // 1. FileUPloadInfo의 FieldName을 찾는다.
                        cMtd = cls.getMethod("get_fileUpload_" + m.group(1) + "FieldName", null);
                        String tmpFieldName = (String)cMtd.invoke(info, null);
                        // 2. SubContentInfo의 의 1번의 Method에 등록한다.
                        cMtd = scls.getMethod("set" + tmpFieldName.substring(0, 1).toUpperCase() + tmpFieldName.substring(1)  , cParam);
                        cMtd.invoke(sinfo, oParam);

                    }
                }
                catch (ContentException e) {
                    log.debug("지원하지 않는 파일 예외 발생", e);
                    throw e;
                }
                catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
       
    }
   
public static String getValueOfMethod(Object obj, String methodName) throws SecurityException, NoSuchMethodException,                               IllegalArgumentException, IllegalAccessException, InvocationTargetException {
        String str = "";
        Class cls = obj.getClass(); // obj의 클래스 종류를 얻고
        Method mtd = cls.getMethod(methodName, null); // 위에서 얻은 클래스의 어떤 메소드를 얻는데, 메소드명을 인자로 받음
        str = (String)mtd.invoke(obj, null); // 위에서 얻은 메소드를 실행하는데, 그 메소드를 갖고 있는 obj를 인자로 받음?
        return str;
    }