timeout = 1; if ($request->send()){ $rst = $request->responseText; } // $rst = html_entity_decode($rst); $rst = uft8html2utf8($rst); $xmls = new XMLStruct(); $xmls->open($rst); if($xmls->doesExist('/rss/channel/title')) { $title=$xmls->getValue('/rss/channel/title'); } if($xmls->doesExist('/rss/channel/link')) { $link=$xmls->getValue('/rss/channel/link'); } $rankicon = ($data['icon_use']=='T')?" style=\"margin:4px 0px 0px 0px;padding:0px;list-style:none;margin-left:1px;\"":""; list($me2dayer, $temp) = split('님의 ', $title); $me2day .= $data['md_header']."\n"; $me2day .= "\n"; $me2day .= $data['md_footer']; } return $me2day; } function Me2DayConfig_ko($plugin) { global $service; $manifest = ''; $manifest .= ''.CRLF; $manifest .= ''.CRLF; $manifest .= ' '.CRLF; $manifest .= '
'.CRLF; $manifest .= ' '; $manifest .= ' '.CRLF; $manifest .= ' http://me2day.net/doa라면 doa를 입력하면 됩니다. 하나 이상의 주소를 입력하려면 주소와 주소를 쉼표로 구분(예: doa,taemy)하면 됩니다. 주소와 주소 사이에는 공백이 있어서는 안됩니다.'.CRLF; $manifest .= ' ]]>'.CRLF; $manifest .= ' '.CRLF; $manifest .= ' '.CRLF; $manifest .= '
'.CRLF; $manifest .= '
'.CRLF; $manifest .= ' '; $manifest .= ' '; $manifest .= ' '.CRLF; $manifest .= ' 글의 수에는 목록에 표시할 글의 수를 지정하고 글자 수에는 글 하나당 표시할 글자 수를 입력합니다.'.CRLF; $manifest .= ' ]]>'.CRLF; $manifest .= ' '.CRLF; $manifest .= ' '.CRLF; $manifest .= '
'.CRLF; $manifest .= '
'.CRLF; $manifest .= ' '; $manifest .= ' 사용'.CRLF; $manifest .= ' 사용 안 함'.CRLF; $manifest .= ' '.CRLF; $manifest .= ' '.CRLF; $manifest .= ' '.CRLF; $manifest .= ' '.CRLF; $manifest .= '
'.CRLF; $manifest .= '
'.CRLF; $manifest .= ' '; $manifest .= ' 날짜'.CRLF; $manifest .= ' 시간'.CRLF; $manifest .= ' '.CRLF; $manifest .= ' 날짜 - 글 제목(시간)입니다.'.CRLF; $manifest .= ' ]]>'.CRLF; $manifest .= ' '.CRLF; $manifest .= ' '.CRLF; $manifest .= '
'.CRLF; $manifest .= '
'.CRLF; $manifest .= ' 미투데이]]>'.CRLF; $manifest .= '
'.CRLF; $manifest .= '
'.CRLF; $manifest .= ' ]]>'.CRLF; $manifest .= '
'.CRLF; $manifest .= '
'.CRLF; $manifest .= ' '; $manifest .= ' 사용'.CRLF; $manifest .= ' 사용 안 함'.CRLF; $manifest .= ' '.CRLF; $manifest .= ' 사용을 선택합니다. 치환자를 사용할 사람은 사이드바를 사용 안 함으로 설정하고 치환자를 스킨 파일의 원하는 위치에 삽입하면 됩니다.

이 플러그인에 대한 더 자세한 정보는 미투와 블로그를 하나로, 태터툴즈 미투데이 플러그인을 읽어보기 바랍니다.'.CRLF; $manifest .= ' ]]>'.CRLF; $manifest .= ' '.CRLF; $manifest .= '
'.CRLF; $manifest .= '
'.CRLF; $manifest .= '
'; return $manifest; } ?> #dhtmltooltip{ position: absolute; border: 1px solid #ccc; padding: 0px 5px; visibility: hidden; z-index: 100; color : #000; font-size: 11px; text-align: left; } #tooltip_ul{ list-style-type:none; margin: 0px !important; padding : 0 !important; } #tooltip_ul li{ margin: 4px !important; padding: 0px 0px 2px 18px !important; line-height: 16px !important; } #tooltip_date{ font-size: 12px; color : #000060; font-weight: bold; background : url(".$pluginURL."/date-plain.png) no-repeat 0px 50% !important; border-bottom-width: 1px !important; border-top-style: none !important; border-right-style: none !important; border-bottom-style: solid !important; border-left-style: none !important; border-bottom-color: #EEE !important; } #tooltip_post{ background : url(".$pluginURL."/doc-option-edit.png) no-repeat 0px 50% !important; border : none !important; } #tooltip_guest{ background : url(".$pluginURL."/user-plain-blue_mod.png) no-repeat 0px 50% !important; border : none !important; } #draco_counter { margin: 0px !important; padding: 0px !important;"; $target .= " font-family: Tahoma; font-size: 9px;"; if(isset($xy_color)) {$target .="color : ".$xy_color.";";} $target .=" } #draco_counter_y p{ display: block !important; margin: 0px !important; line-height: 12px !important; } #draco_counter_x p{ display: inline !important; margin: 0px !important; line-height: 12px !important; padding: 0px !important; } #draco_counter_y{ width: 30px; height: 100px; text-align: right; } #draco_counter_y_mid{ padding: 34px 0px 46px 0px; } #draco_counter_x { width : ".($graph_width)."px; height: 12px; margin: 0px !important; padding: 0px !important; } #draco_counter_x1{ float: left !important; text-align: left; } #draco_counter_x2{ float: right !important; text-align: right; }
"; $target .= ""; #그래프 왼쪽 Y축 if($disp_y=='true'){ $target .=""; } $target .= ""; #그래프 하단 X축 if($disp_x=='true'){ $target .=""; if($disp_y=='true') $target .=""; $target .=""; } $target .= "

$max_data[visits]

"; if($cut_peak == 'true') $target .= $avg; else $target .= round($max_data[visits]/2); $target .="

"; $chd = ""; $map_x = 0; $map_x_next = $map_x + intval($graph_barwidth/2); $loopcount = 0; #그래프 그리기 반복 부분 while($dcount_data=mysql_fetch_array($dcount_result)) { # 그래프 크기 계산 $dcount_data[visits]=stripslashes($dcount_data[visits]); $graph_high = round($dcount_data[visits] / $graph_max *95); if($graph_high>95) $graph_high = 95; else if($graph_high<0) $graph_high = 0; if($chd!="") $chd .= ","; $chd .= $graph_high.".0"; # 날짜 데이터 년월일로 쪼개기 $y = intval($dcount_data[date]/10000); $m = intval(($dcount_data[date]%10000)/100); $d = $dcount_data[date]%100; # 날짜 데이터 mktime $day_post1_time = mktime(0, 0, 0, $m, $d, $y); $day_post2_time = $day_post1_time + 86400; # 해당 날짜에 몇개의 글을 썼나 찾기 $day_post_query = "SELECT id FROM `".$database['prefix']."Entries` WHERE `published` >= $day_post1_time AND `published` < $day_post2_time AND `".$blogid_col."` = $owner AND `visibility` >= 2 AND `category` > 0"; $day_post_data = mysql_query($day_post_query) or die("쿼리 실패6 : " . mysql_error()); $day_post = mysql_num_rows($day_post_data); # 툴팁 창 만들기 $dcount_day = "
  • ".$y."년 ".$m."월 ".$d."일
  • 포스팅 "; if($day_post) $dcount_day .= ": ".$day_post."개"; else $dcount_day .= "없음"; $dcount_day .= "
  • 방문자 : ".$dcount_data[visits]."명
"; #이미지 맵 만들기 if($day_post){ $target .= ""; } else { $target .= ""; } $map_x = $map_x_next+1; $map_x_next = $map_x -1 + $graph_barwidth; $loopcount ++; $lastvisit = $dcount_data[visits]; } #구글 api 이미지 주소 만들기 $chart_img = "http://chart.apis.google.com/chart?chs=".$graph_width."x100&chd=t:".$chd."&cht=lc&chco=".str_replace("#","",$graph_color)."&chf=bg,s,".str_replace("#","",$graph_backcolor); if($view_grid=='true') $chart_img .="&chg=".(100/$how_day*7).",50"; if($line_blank=='true') $chart_img .= "&chls=".$line_thickness.",".($line_thickness*2).",".$line_thickness; else $chart_img .= "&chls=".$line_thickness.",".($line_thickness*2).",0"; if($graph_fillcolor) $chart_img .="&chm=B,".str_replace("#","",$graph_fillcolor).",0,0,0"; if($view_marker=='true'){ if(!$graph_fillcolor) $chart_img .="&chm="; else $chart_img .="|"; $chart_img .="c,6C57E2,0,$high_diff.0,10.0|x,E25757,0,$low_diff.0,10.0"; } if($graph_fillcolor || $view_marker=='true') $chart_overimg = $chart_img."|"; else $chart_overimg = $chart_img."&chm="; $target .= "
"; $target .= "

-$how_day days

today : $lastvisit

"; #------------------------------------------------------------------------------------------ return $target; } ?> JCF TEAM BLOG

JCF TEAM BLOG

관리자 글쓰기
블로그 »
블로그 »

요즘은 iBATIS에서 ResultSetMetadata 값을 함께 받아오기 위해 aspectj로 처리를 테스트하고 있습니다.

테스트하는 동안 오픈소스 프로젝트의 소스를 건드리지 않는다는 원칙 하에 LTW를 하고 있었으나 애플리케이션 로딩 시간이 지나치게 길어지는 단점이 있어 다시 컴파일 타임에 weaving하기로 했습니다.

아래 pom.xml 설정을 보시면 weaving 결과물로 ibatis-sqlmap.jar에 포함된 클래스 전체가 나오기 때문에 원본 jar는 war 패키지에서 제외시켜버렸습니다. (이렇게 하지 않으면 실행환경에 따라 충돌이 일어날 수 있습니다.)

maven 프로젝트인 경우에는 아래와 같이 설정하면 되지만 eclipse project style로 하자면 미리 weaving 된 ibatis-sqlmap.jar artifact를 배포해서 사용하도록 해야겠습니다.

.
.
        <dependency>
            <groupId>org.apache.ibatis</groupId>
            <artifactId>ibatis-sqlmap</artifactId>

            <version>2.3.0</version>
            <scope>provided</scope>
        </dependency>
.
.
        <plugins>
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>aspectj-maven-plugin</artifactId>
                <executions>
                    <execution>
                        <goals>
                            <goal>compile</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <weaveDependencies>
                        <weaveDependency>
                            <groupId>org.apache.ibatis</groupId>
                            <artifactId>ibatis-sqlmap</artifactId>
                        </weaveDependency>
                    </weaveDependencies>

                    <complianceLevel>${java.version}</complianceLevel>
                    <encoding>${encoding}</encoding>
                    <source>${java.version}</source>
                    <target>${java.version}</target>
                    <verbose>true</verbose>
                </configuration>
            </plugin>
        </plugins>
.
.

크리에이티브 커먼즈 라이센스
Creative Commons License
Writer profile
author image
setq
2008/02/18 16:14 2008/02/18 16:14

(go to top)

블로그 »

현재까지 iBatis에서는 JDBC 메타데이터를 가져올 수 있는 API 를 제공하지 않고 있습니다.
문제는 Gauce나 MiPlatform 같은 X인터넷 솔루션을 사용할 경우는 데이타 컬럼 크기를 알아야만 합니다.
이럴 경우 AOP 구현기술인 AspectJ를 활용할 수 있습니다.

가장 중요한 것은 Aspect를 적용해야 하는 소스상의 위치(Pointcut) 찾아내는 것입니다.
손쉬운 방법 중에 하나는 Stacktrace를 이용하는 것입니다.
아래 Stacktrace를 보면 Resutset 객체를 참조할 수 있는 SqlExecutor.handleResults(RequestScope, ResultSet, int, int, RowHandlerCallback) 를 Pointcut으로 해야 함을 알 수 있습니다.

Thread [main] (Suspended (breakpoint at line 28 in DefaultRowHandler))
 DefaultRowHandler.handleRow(Object) line: 28
 RowHandlerCallback.handleResultObject(RequestScope, Object[], ResultSet) line: 76
 SqlExecutor.handleResults(RequestScope, ResultSet, int, int, RowHandlerCallback) line: 395
 
SqlExecutor.executeQuery(RequestScope, Connection, String, Object[], int, int, RowHandlerCallback) line: 185
 SelectStatement(GeneralStatement).sqlExecuteQuery(RequestScope, Connection, String, Object[], int, int, RowHandlerCallback) line: 205
 SelectStatement(GeneralStatement).executeQueryWithCallback(RequestScope, Connection, Object, Object, RowHandler, int, int) line: 173
 SelectStatement(GeneralStatement).executeQueryForList(RequestScope, Transaction, Object, int, int) line: 123
 SqlMapExecutorDelegate.queryForList(SessionScope, String, Object, int, int) line: 610
 SqlMapExecutorDelegate.queryForList(SessionScope, String, Object) line: 584
 SqlMapSessionImpl.queryForList(String, Object) line: 101
 SqlMapClientTemplate$3.doInSqlMapClient(SqlMapExecutor) line: 255
 SqlMapClientTemplate.execute(SqlMapClientCallback) line: 188
 SqlMapClientTemplate.executeWithListResult(SqlMapClientCallback) line: 214
 SqlMapClientTemplate.queryForList(String, Object) line: 253
 LookupDaoiBatis.getRoles() line: 22



다음 작업으로는 Pointcut에 적용될 Aspect를 만듭니다.

public aspect IBatisJDBCMetadata {
 public pointcut sqlExecutorCall() :
         execution(* SqlExecutor.executeQuery(..)) ;
 public pointcut handleResults() :
           execution(* SqlExecutor.handleResults(..)) ;
 public pointcut executeQueryForList() :
         execution(* com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.executeQueryForList(..)) ;
 before(RequestScope request, ResultSet rs, int skipResults, int maxResults, RowHandlerCallback callback) :
     handleResults() && args(request, rs, skipResults, maxResults, callback) {
 
   SessionScope session = request.getSession();
   // rs를 이용하여 메타데이터 정보가져오기
    session.setAttribute("metadata", 메타정보);
  }
 after(RequestScope request, Transaction trans, Object parameterObject,
   int skipResults, int maxResults) returning(List list):
  executeQueryForList() && args(request, trans, parameterObject, skipResults, maxResults) {
  SessionScope session = request.getSession();
  //메타정보 = session.getAttribute("metadata");
  //메타정보를 조회된 리스트와 함께 반환

 }
}



사용자 삽입 이미지



 
사용자 삽입 이미지

크리에이티브 커먼즈 라이센스
Creative Commons License
Writer profile
그래도 꿈이 있어서 행복하다^^
2008/01/10 16:53 2008/01/10 16:53

(go to top)