본문 바로가기

개발환경/이클립스

JET2에서 XML 머징하기

EMFT/M2T의 JET2에서 java 파일 및 properties 병합(merging)은 <java:merge />를 통해 쉽게 수행할 수 있다. 그러나 XML 과 같은 자원은 쉽게 구현할 수 있는 태그가 존재하지 않기때문에 태그라이브러리를 직접구현하거나 <c:load/>, <c:addElement/>, <c:set/>, <c:dump/> 태그를 통해 해당 기능을 처리해야만 한다.

또 한가지 고려할 것은 동적 자원(리소스)에 대한 존재여부이다.
정적 자원의 경우에 urlContext("transform", "workspace")에 따라 해당 위치에 반드시 존재해야 하기 때문에 큰 문제가 되지 않는다. 그러나 동적 자원을 생각해 보자. c:load 태그로 해당 자원을 불러와야 하는데 특정 위치(url)에 존재하지 않을 수도 있다. 이럴 경우 어떻게 할 것인가?

동적 자원에 대한 고민을 하다가 고정된 위치에 정적자원을 두고 동적자원의 위치에 해당 자원이 존재하지 않을 경우 정적자원을 불러 동적자원의 위치에 복사하는 과정을 두기로 했다. 이후 두번째 작업에서는 동적자원의 위치에 해당 자원이 존재할 것이다.

아래 코드는 위에서 고려한 내용이다.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMapConfig
  PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0//EN"
  "http://ibatis.apache.org/dtd/sql-map-config-2.dtd">
<c:setVariable select="translate(packageName($daoInterfaceName), '.', '/')" var="daoPackagePath"/>
<c:setVariable select="concat($project.name, '/src/main/resources/', $daoPackagePath, '/sqlmap/sqlmap-config.xml')" var="sqlmap-configURL"/>
<c:setVariable select="concat($daoPackagePath, '/sqlmap/maps/', $class.name, '.xml')" var="sqlmapPath"/>
<%
        String sqlmap_configURL = "platform:/resource/" + context.getVariable("sqlmap-configURL");
        org.eclipse.core.runtime.IPath path = new org.eclipse.core.runtime.Path(sqlmap_configURL);
        path = path.removeFirstSegments(1);
        org.eclipse.core.resources.IResource resource = org.eclipse.core.resources.ResourcesPlugin.getWorkspace().getRoot().findMember(path);
        if(resource != null) {
%>
<c:load url="{$sqlmap-configURL}" var="root" urlContext="workspace"/>
<c:if test="not($root/sqlMapConfig/sqlMap[@resource = $sqlmapPath])">
  <c:addElement select="$root/sqlMapConfig" name="sqlMap" var="sqlmapNode"/>
  <c:set select="$sqlmapNode" name="resource"><c:get select="$sqlmapPath"/></c:set>
</c:if>
<%
        }
        else {
%>
<c:load url="templates/sqlmap-config.xml" var="root" urlContext="transform"/>
<c:set select="$root/sqlMapConfig/sqlMap[@resource = '']" name="resource"><c:get select="$sqlmapPath"/></c:set>
<%
        }
%>
<c:dump select="$root/*" format="true"/>