sitelink1  
sitelink2  
sitelink3  
extra_vars4  
extra_vars5  
extra_vars6  
 1. ServerConfig.xml

<?xml version="1.0" encoding="EUC-KR" ?>  
  
<server name="madvirus.net">  
    <documentRoot>c:/webserver/docRoot</documentRoot>  
    <port>80</port>  
       
    <virtual-mapping-list>  
        <virtual-mapping>  
            <uri>/madvirus</uri>  
            <path>c:/personal/madvirus</path>  
            <file-list>  
                <xml-file>level3_1.xml</xml-file>  
                <text-file>level3_1.txt</text-file>  
                <hwp-file>level3_1.hwp</hwp-file>  
            </file-list>  
        </virtual-mapping>  
        <virtual-mapping>  
            <uri>/commonImage</uri>  
            <path>c:/webserver/commonImage</path>  
            <file-list>  
                <xml-file>level3_2.xml</xml-file>  
                <text-file>level3_2.txt</text-file>  
                <hwp-file>level3_2.hwp</hwp-file>  
            </file-list>               
        </virtual-mapping>  
        <virtual-mapping>  
            <uri>/commonText</uri>  
            <path>c:/webserver/commonText</path>               
        </virtual-mapping>         
    </virtual-mapping-list>  
  
</server>  


 2. ServerConfig.java

import java.util.HashMap;   
  
public class ServerConfig {   
       
    private int port;   
    private String serverName;   
    private String documentRoot;   
    private HashMap mapping = new HashMap();   
       
    public void setInformation(String serverName, String documentRoot, int port) {   
        this.setServerName(serverName);   
        this.setPort(port);   
        this.setDocumentRoot(documentRoot);   
    }   
       
    // ... Get, Set메서드들 정의   
       
    public void addMapping(VirtualMapping map) {   
        mapping.put(map.getVirtualURI(), map);   
    }   
    public VirtualMapping getMapping(String uri) {   
        return (VirtualMapping)mapping.get(uri);   
    }   
  
}  


 3. ConfigReader.java

package madvirus.webserver.config;
import org.apache.commons.digester.Digester;   
import java.io.File;   
import java.io.IOException;   
import org.xml.sax.SAXException;   
    
public class ConfigReader {   
       
    public static ServerConfig readConfiguration(String configFile)   
    throws IOException, SAXException {   
        Digester digester = new Digester();   
        digester.setValidating(false);   
           
        digester.addObjectCreate("server", ServerConfig.class);   
        //digester.addSetProperties("server", "name", "serverName" );   
        //digester.addBeanPropertySetter("server/documentRoot", "documentRoot");   
        //digester.addBeanPropertySetter("server/port", "port");   
        Class[] paramType = { String.class, String.class, Integer.TYPE };   
        digester.addCallMethod("server", "setInformation", 3, paramType);   
        digester.addCallParam("server", 0, "name");   
        digester.addCallParam("server/documentRoot", 1);   
        digester.addCallParam("server/port", 2);   
           
        digester.addObjectCreate("server/virtual-mapping-list/virtual-mapping", VirtualMapping.class);   
        digester.addBeanPropertySetter("server/virtual-mapping-list/virtual-mapping/uri", "virtualURI");   
        digester.addBeanPropertySetter("server/virtual-mapping-list/virtual-mapping/path", "realPath");   
        digester.addSetNext("server/virtual-mapping-list/virtual-mapping", "addMapping");   
           
        File file = new File(configFile);   
        ServerConfig config = (ServerConfig)digester.parse(file);   
           
        return config;   
    }   
}

  
 4. ConfigReader 클래스의 코드 내용 
  1) <server> 1레벨 정의
  - server의 정보를 저장하는 객체(ServerConfig)를 서술한다.
  - server의 정보에는 속성과 서버의 2레벨 정보(<server virtual-mapping virtual-mapping-list>)가 있다.
  - 속성에는 documentRoot, port 정보가 있다.

  2) <server virtual-mapping virtual-mapping-list> 2레벨 정의
  - virtual-mapping(server/virtual-mapping-list의 하위 레벨) 정보를 저장하는 객체(VirtualMapping)를 서술한다.
  - virtual-mapping의 정보에는 속성 정보가 있다.
  - 속성에는 uri, path 정보가 있다.
  - 2레벨은 server내에서 반복형태를 띄고 있어서 server객체에 uri를 키로하여 HashMap형태로 객체(VirtualMapping)리스트를 담아두게 된다.


 5. ConfigReader2.java & ServerConfigRule.xml 

package madvirus.webserver.config;   
  
import org.apache.commons.digester.Digester;   
import org.apache.commons.digester.xmlrules.DigesterLoader;   
import java.io.File;   
import java.io.IOException;   
import org.xml.sax.SAXException;   
    
public class ConfigReader2 {   
       
    public static ServerConfig readConfiguration(String configFile, String ruleXmlFile)   
    throws IOException, SAXException {   
        Digester digester = DigesterLoader.createDigester(new URL("file:"+ruleXmlFile));   
           
        File file = new File(configFile);   
        ServerConfig config = (ServerConfig)digester.parse(file);   
           
        return config;   
    }   
}  


<?xml version="1.0"?>  
  
<digester-rules>  
    <object-create-rule pattern="server" classname="madvirus.webserver.config.ServerConfig" />  
    <set-properties-rule pattern="server">  
        <alias attr-name="name" prop-name="serverName" />  
    </set-properties-rule>  
       
    <bean-property-setter-rule pattern="server/documentRoot" prop-name="documentRoot" />  
    <bean-property-setter-rule pattern="server/port" prop-name="port" />  
       
    <pattern value="server/virtual-mapping-list/virtual-mapping">  
        <object-create-rule classname="madvirus.webserver.config.VirtualMapping" />  
        <call-method-rule pattern="uri" methodname="setVirtualURI" paramcount="0" />  
        <call-method-rule pattern="path" methodname="setRealPath" paramcount="0" />  
        <pattern value="file-list" >  
            <object-create-rule classname="madvirus.webserver.config.FileMapping" />  
            <call-method-rule pattern="xml-file" methodname="setXmlFile" paramcount="0" />  
            <call-method-rule pattern="text-file" methodname="setTextFile" paramcount="0" />  
            <call-method-rule pattern="hwp-file" methodname="setHwpFile" paramcount="0" />  
            <set-next-rule methodname="addFileMapping" />  
        </pattern>  
        <set-next-rule methodname="addMapping" />  
   </pattern>  
</digester-rules>  


 6. VirtualMapping.java & FileMapping.java 

package madvirus.webserver.config;   
  
import java.util.ArrayList;   
import java.util.Collections;   
import java.util.List;   
  
public class VirtualMapping {   
       
    private String virtualURI;   
    private String realPath;   
    private List list = Collections.synchronizedList(new ArrayList());   
       
    public String getVirtualURI() {   
        return virtualURI;   
    }   
    public void setVirtualURI(String virtualURI) {   
        this.virtualURI = virtualURI;   
    }   
       
    public String getRealPath() {   
        return realPath;   
    }   
    public void setRealPath(String realPath) {   
        this.realPath = realPath;   
    }   
       
    public void addFileMapping(FileMapping files) {   
        list.add(files);   
    }   
    public List getFileMappingList() {   
        return list;   
    }   
}  


package madvirus.webserver.config;   
  
public class FileMapping {   
  
    private String xmlFile;   
    private String textFile;   
    private String hwpFile;   
       
    public String getXmlFile() {   
        return xmlFile;   
    }   
    public void setXmlFile(String xmlFile) {   
        this.xmlFile = xmlFile;   
    }   
    public String getTextFile() {   
        return textFile;   
    }   
    public void setTextFile(String textFile) {   
        this.textFile = textFile;   
    }   
    public String getHwpFile() {   
        return hwpFile;   
    }   
    public void setHwpFile(String hwpFile) {   
        this.hwpFile = hwpFile;   
    }   
}  


 7. ConfigReader2 클래스의 코드 내용 
  1) rulexml 을 읽어들인다.
  2) rulexml 정보에 맞추어 ServerConfig.xml 을 파싱한다.
  2) VirtualMapping 클래스내의 변수명에 맞추어 값이 셋팅된다.
  3) < file-list >태그를 만나면 FileMapping 객체를 생성하여 VirtualMapping 클래스에 add한다.