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(); // cls에 선언된 모든 메소드를 반환 Pattern p = Pattern.compile("get_fileUpload_(\\d+)FileName"); // 패턴 설정. \d+ 는 정수 하나 이상(정규식) 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 { // group으로 매칭된 내용(메소드명)을 받아서 그 메소드를 실행. 파일명을 얻음. mStr = FileUploadInfo.getValueOfMethod(info, m.group()); if(mStr != null) { // 파일명이 존재하는 경우만 // group(1)으로 매칭된 번호를 얻어서 메소드 실행. 콘텐트 타입을 얻음. 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}; // 메소드를 찾는데, 메소드명이 "set...."이고 cParam형식을 파라미터로 갖는 메소드를 반환. null이면 파라미터 없는 메소드 // cParam이 Class 배열인 것은 파라미터가 여럿인 메소드가 있기 때문에. // 여기서는 String을 파라미터로 갖는 set_fileUp.... 메소드를 반환. Method cMtd = cls.getMethod("set_fileUpload_" + m.group(1) + "FileName", cParam); Object[] oParam = new Object[]{mStr}; // FileUploadInfo에 등록 cMtd.invoke(info, oParam); // info의 set_fileUpload_XFileName 메소드를 실행. 파라미터는 oParam // 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); // 서브콘텐츠info에 저장함. } } 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(); Method mtd = cls.getMethod(methodName, null); // 넘겨받은 오브젝트의 클래스의 메소드를 얻어서 str = (String)mtd.invoke(obj, null); // 메소드를 실행시킴. // 이때 파라미터로 받은 오브젝트는 메소드가 실행될 대상 오브젝트. 즉, obj의 메소드 mtd를 실행함. return str; } |
동적으로 움직이는 기능을 만들기 위해서는 필수적.
'프로그래밍 > Java' 카테고리의 다른 글
[java] Convert Milliseconds to Date (0) | 2010.03.15 |
---|---|
[java] invoke (0) | 2010.03.09 |
[java] Pattern / Matcher (0) | 2010.01.22 |
[java] 파일 관련 (0) | 2010.01.07 |
[java] thorws ..... (0) | 2009.12.11 |