<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>simple note</title>
    <link>https://smplnote.tistory.com/</link>
    <description>simple note</description>
    <language>ko</language>
    <pubDate>Thu, 9 Jul 2026 06:40:00 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>smplnote</managingEditor>
    <image>
      <title>simple note</title>
      <url>https://t1.daumcdn.net/cfile/tistory/2037785A4E00168E12</url>
      <link>https://smplnote.tistory.com</link>
    </image>
    <item>
      <title>[IT] spring Restful api documentation</title>
      <link>https://smplnote.tistory.com/315</link>
      <description>&lt;p&gt;[purpose]&lt;br /&gt;- RESTful API Documentation&amp;nbsp;&lt;/p&gt;&lt;p&gt;- Using Spring framework&amp;nbsp;&lt;/p&gt;&lt;p&gt;- autogenerated&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[Review solutions]&lt;br /&gt;
&amp;nbsp;SPRINGDOCLET : javadoc style로 rest api user document 로는 부족함&lt;br /&gt;
&lt;br /&gt;
RESTDOCLET : 목적에 부합&lt;br /&gt;
maven plugin, web application type&lt;br /&gt;
param description not support, rest error code not support&lt;br /&gt;
controller에 정의한 mapping 미인식&lt;br /&gt;
&lt;br /&gt;
WSDOC : simple 충분하지않음 rest error, param description nor support&lt;br /&gt;
&lt;br /&gt;
SWAGGER : spring 지원 불충분, 복잡...&lt;br /&gt;
&lt;br /&gt;
[try - restdoclet]&lt;br /&gt;
- fail maven setting&lt;br /&gt;
- use library&lt;br /&gt;
- process : java source -&amp;gt; xml using  xmldoc -&amp;gt; xml using jibx -&amp;gt; html using template&lt;br /&gt;
- preperation&lt;br /&gt;
spring restful application source &amp;amp; libraries&lt;br /&gt;
library : jibx, spring, log4j, commons, restdoc, tools.jar, ant&lt;/p&gt;&lt;p&gt;retdoclet lib : restdoclet-doclet-2.2.0.jar, restdoclet-plugin-2.2.0.jar,&amp;nbsp;jibx-run-1.2.1.jar, from&amp;nbsp;&lt;a href=&quot;https://oss.sonatype.org/index.html#nexus-search;classname~RESTdoclet&quot;&gt;https://oss.sonatype.org/index.html#nexus-search;classname~RESTdoclet&lt;/a&gt;&lt;/p&gt;&lt;p&gt;spring lib : spring-web-3.0.5.RELEASE.jar, spring-context-3.0.5.RELEASE.jar,&amp;nbsp;commons-lang-2.6.jar,&lt;/p&gt;&lt;p&gt;javadoc lib :&amp;nbsp;tools.jar,&amp;nbsp;&lt;/p&gt;&lt;p&gt;ant lib : ant-launcher.jar,&amp;nbsp;ant.jar&lt;/p&gt;&lt;p&gt;etc :&amp;nbsp;commons-collections-3.2.jar,&amp;nbsp;&amp;nbsp;log4j-1.2.15.jar,&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;
- setting&lt;br /&gt;
srcpath&lt;br /&gt;
version&lt;br /&gt;
excludes method&lt;br /&gt;
reportdir&lt;br /&gt;
&lt;br /&gt;demo sample.&lt;br /&gt;&lt;blockquote class=&quot;tx-quote-tistory&quot;&gt;&lt;p&gt;import groovy.text.SimpleTemplateEngine&lt;/p&gt;&lt;p&gt;import org.apache.commons.collections.CollectionUtils&lt;/p&gt;&lt;p&gt;import org.jibx.runtime.JiBXException&lt;/p&gt;&lt;p&gt;import com.iggroup.oss.restdoclet.doclet.XmlDoclet&lt;/p&gt;&lt;p&gt;import com.iggroup.oss.restdoclet.doclet.type.*&lt;/p&gt;&lt;p&gt;import com.iggroup.oss.restdoclet.doclet.util.*&lt;/p&gt;&lt;p&gt;import com.iggroup.oss.restdoclet.plugin.io.*&lt;/p&gt;&lt;p&gt;import com.iggroup.oss.restdoclet.plugin.util.ServiceUtils&lt;/p&gt;&lt;p&gt;import com.sun.tools.javac.util.*&lt;/p&gt;&lt;p&gt;import com.sun.tools.javadoc.*&lt;/p&gt;&lt;p&gt;class MySample {&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;static def SERVICES_TEMPLATE = &quot;src/main/resources/services.jsp&quot;;&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;static def SERVICE_TEMPLATE = &quot;src/main/resources/service.jsp&quot;;&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;def reportDir;&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;def restsrcDir;&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;def packageNames = []&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;def appname = &quot;&quot;&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;def version = 1.0&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;static main(args) {&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;def me = new MySample();&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre; &quot;&gt;	&lt;/span&gt;me.restsrcDir = &quot;../my-rest-web/src/main/java&quot;&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;me.reportDir = &quot;../my-rest-web/doc/restdoc&quot;&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;me.packageNames = {&quot;com.simple.rest&quot;}&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;me.appname = &amp;nbsp;[&quot;APPLICATION&quot;:&quot;my-rest&quot; ]&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;me.version = [&quot;version&quot;:1.0, timestamp:new Date()]&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre; &quot;&gt;	&lt;/span&gt;me.setup()&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;me.makexmldoc()&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;me.build();&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;me.clean()&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;def ant = new AntBuilder()&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;def controllers = []// ArrayList&amp;lt;Controller&amp;gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;List&amp;lt;String&amp;gt; excludes = [&quot;exceptionHandler&quot;];&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;def outputDirectory = &quot;my-rest&quot;;&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre; &quot;&gt;	&lt;/span&gt;def setup(){&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;clean();&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;ant.delete(dir:reportDir, quiet:true, verbose:false)&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;ant.mkdir(dir:reportDir);&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;}&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;def clean(){&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;ant.delete(dir:&quot;com&quot;, quiet:true, verbose:false);&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;ant.delete(dir:&quot;target/restdoc&quot;, quiet:true, verbose:false);&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre; &quot;&gt;	&lt;/span&gt;// gathering Controller.java files ( except Sample)&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;def getRestControllers(){&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;def list = []&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;new File(restsrcDir).eachFileRecurse {&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;if(it.name.endsWith(&quot;Controller.java&quot;)){&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;				&lt;/span&gt;list.add(it)&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;return list;&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre; &quot;&gt;	&lt;/span&gt;def makexmldoc(){&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;Context context = new Context();&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;Options compOpts = Options.instance(context);&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;compOpts.put(&quot;-sourcepath&quot;, new File(restsrcDir).absolutePath);&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;compOpts.put(&quot;-classpath&quot;, getClassLibs());&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre; &quot;&gt;		&lt;/span&gt;ListBuffer&amp;lt;String&amp;gt; javaNames = new ListBuffer&amp;lt;String&amp;gt;();&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;for (File fileName : getRestControllers()) {&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;javaNames.append(fileName.getPath());&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;ListBuffer&amp;lt;String&amp;gt; subPackages = new ListBuffer&amp;lt;String&amp;gt;();&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;for (String packageName : packageNames) {&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;log.info(&quot;Adding sub-packages to documentation path: &quot; + packageName);&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;subPackages.append(packageName);&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;new Messager(context,&quot;application&quot;)&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;JavadocTool javadocTool = JavadocTool.make0(context);&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;def bQuiet = true&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;def rootDoc = javadocTool.getRootDocImpl(&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;&quot;, &quot;utf-8&quot;, new ModifierFilter(ModifierFilter.ALL_ACCESS),&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; javaNames.toList(), new ListBuffer&amp;lt;String[]&amp;gt;().toList(), false,&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; subPackages.toList(), new ListBuffer&amp;lt;String&amp;gt;().toList(),&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; false, false, bQuiet);&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre; &quot;&gt;		&lt;/span&gt;rootDoc.env.silent = true; // clear javadoc warning message&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre; &quot;&gt;		&lt;/span&gt;new XmlDoclet().start(rootDoc);&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;def myDir = &quot;target/restdoc&quot;&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;ant.mkdir(dir:myDir)&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;new ControllerUriAppender().add(rootDoc, myDir);&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;def build() &amp;nbsp; {&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;def myDir = &quot;target/restdoc&quot;&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt; &amp;nbsp; &amp;nbsp;javadocs(myDir);&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt; &amp;nbsp; &amp;nbsp;services(myDir);&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre; &quot;&gt;	&lt;/span&gt;def javadocs(rootDir){&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;new File(rootDir).eachFileRecurse {&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;if(it.name.endsWith(Controller.FILE_SUFFIX)){&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;				&lt;/span&gt;final Controller cntrl = JiBXUtils.unmarshallController(it);&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;				&lt;/span&gt;if (!controllers.contains(cntrl)) {&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;				&lt;/span&gt; &amp;nbsp; controllers.add(cntrl);&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;				&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre; &quot;&gt;	&lt;/span&gt;def services(baseDirectory) &amp;nbsp;{&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt; &amp;nbsp; List&amp;lt;Service&amp;gt; services = new ArrayList&amp;lt;Service&amp;gt;();&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre; &quot;&gt;	&lt;/span&gt; &amp;nbsp; def uriMethodMappings = [:]&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt; &amp;nbsp; HashMap&amp;lt;String, Controller&amp;gt; uriControllerMappings =&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt; &amp;nbsp;new HashMap&amp;lt;String, Controller&amp;gt;();&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt; &amp;nbsp; HashMap&amp;lt;String, Collection&amp;lt;Uri&amp;gt;&amp;gt; multiUriMappings =&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt; &amp;nbsp;new HashMap&amp;lt;String, Collection&amp;lt;Uri&amp;gt;&amp;gt;();&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt; &amp;nbsp; for (Controller controller : controllers) {&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt; &amp;nbsp;for (Method method : controller.getMethods()) {&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt; if (excludeMethod(method)) { continue; }&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt; Collection&amp;lt;Uri&amp;gt; uris = method.getUris();&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt; if (!uris.isEmpty()) {&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;				&lt;/span&gt;String multiUri = uris.join(&quot;, &quot;)&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;				&lt;/span&gt;multiUriMappings.put(multiUri, uris);&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;				&lt;/span&gt;ArrayList&amp;lt;Method&amp;gt; methodList = uriMethodMappings.get(multiUri);&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;				&lt;/span&gt;if (methodList == null) {&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;				&lt;/span&gt; &amp;nbsp; methodList = new ArrayList&amp;lt;Method&amp;gt;();&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;				&lt;/span&gt; &amp;nbsp; uriMethodMappings.put(multiUri, methodList);&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;				&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;				&lt;/span&gt;methodList.add(method);&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;				&lt;/span&gt;uriControllerMappings.put(multiUri, controller);&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt; }&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt; &amp;nbsp;}&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt; &amp;nbsp; }&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre; &quot;&gt;	&lt;/span&gt; &amp;nbsp; int identifier = 1;&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt; &amp;nbsp; for (String uri : uriControllerMappings.keySet()) {&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt; &amp;nbsp;Controller controller = uriControllerMappings.get(uri);&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt; &amp;nbsp;ArrayList&amp;lt;Method&amp;gt; matches = uriMethodMappings.get(uri);&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt; &amp;nbsp;Service service =&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt; new Service(identifier, multiUriMappings.get(uri), new Controller(&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;				&lt;/span&gt;controller.getType(), controller.getJavadoc(), matches));&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt; &amp;nbsp;services.add(service);&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt; &amp;nbsp;service.assertValid();&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt; &amp;nbsp;generateServiceHtml( appname, version, service)&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt; &amp;nbsp;identifier++;&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt; &amp;nbsp; }&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre; &quot;&gt;	&lt;/span&gt; &amp;nbsp; Services list = new Services();&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt; &amp;nbsp; for (Service service : services) {&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt; &amp;nbsp;org.apache.commons.collections.Predicate predicate =&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt; new ControllerTypePredicate(service.getController().getType());&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt; &amp;nbsp;if (CollectionUtils.exists(list.getControllers(), predicate)) {&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt; ControllerSummary controller = (ControllerSummary) CollectionUtils.find(list.getControllers(), predicate);&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt; controller.addService(service);&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt; &amp;nbsp;} else {&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt; ControllerSummary controller = new ControllerSummary(service.getController().getType(), service.getController().getJavadoc());&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt; controller.addService(service);&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt; list.addController(controller);&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt; &amp;nbsp;}&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt; &amp;nbsp; }&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt; &amp;nbsp; generateServiceListHtml( &amp;nbsp;appname, version, list.getServices())&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre; &quot;&gt;	&lt;/span&gt;def generateServiceListHtml( &amp;nbsp;param, props, svcs){&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;def binding = [&quot;param&quot; : param, &amp;nbsp;&quot;props&quot;:props, &quot;services&quot;:svcs]&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;def toFile = reportDir+&quot;/services.html&quot;&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;generateHtml(toFile, binding, SERVICES_TEMPLATE);&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;def generateServiceHtml( &amp;nbsp;param, props, svc){&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;def binding = [&quot;param&quot; : param, &amp;nbsp;&quot;props&quot;:props, &quot;service&quot;:svc]&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;def toFile = reportDir+&quot;/service-&quot; + svc.identifier &amp;nbsp;+ &quot;.html&quot;&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;generateHtml(toFile, binding, SERVICE_TEMPLATE);&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;def generateHtml(def toFile, def binding, def templateFile, encoding = &quot;UTF-8&quot;){&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;def reader = new File(templateFile).newReader();&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;def template = new SimpleTemplateEngine().createTemplate(reader).make(binding);&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;new File(toFile).write(template.toString(), encoding)&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre; &quot;&gt;	&lt;/span&gt;private boolean excludeMethod(Method method) {&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;return excludes.contains(method.getName().equalsIgnoreCase())&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt; }&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre; &quot;&gt;	&lt;/span&gt;// for javadoc compile&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;def getClassLibs(){&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;return [&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;&quot;../my-rest/WEB-INF/lib/commons-logging.jar&quot;,&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;&quot;../my-rest/WEB-INF/lib/spring-XXXX-X.X.X.RELEASE.jar&quot;&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;// ... &amp;nbsp;other libraries&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;].join(&quot;;&quot;)&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;}&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;ControllerUriAppender&amp;nbsp;( for controller's uri appending)&lt;/p&gt;&lt;p&gt;&lt;blockquote class=&quot;tx-quote-tistory&quot;&gt;&lt;p&gt;import static com.iggroup.oss.restdoclet.doclet.util.AnnotationUtils.*&lt;/p&gt;&lt;p&gt;import static com.iggroup.oss.restdoclet.doclet.util.JiBXUtils.marshallController&lt;/p&gt;&lt;p&gt;import groovy.util.slurpersupport.GPathResult&lt;/p&gt;&lt;p&gt;import groovy.xml.*&lt;/p&gt;&lt;p&gt;import org.springframework.web.bind.annotation.RequestMapping&lt;/p&gt;&lt;p&gt;import com.iggroup.oss.restdoclet.doclet.type.Controller&lt;/p&gt;&lt;p&gt;import com.sun.javadoc.*&lt;/p&gt;&lt;p&gt;class ControllerUriAppender {&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;def add(RootDoc rootDoc, outputpath){&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;for (ClassDoc classDoc : rootDoc.classes()) {&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;if (isAnnotated(classDoc, org.springframework.stereotype.Controller.class)) {&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt; &amp;nbsp; AnnotationValue value = elementValue(&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;classDoc, RequestMapping.class, &quot;value&quot;)&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt; &amp;nbsp; def rooturi &amp;nbsp;= value.toString().replaceAll(&quot;\&quot;&quot;,&quot;&quot;);&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt; &amp;nbsp; def xmlname = classDoc.qualifiedName().replace('.' as char, File.separatorChar) + Controller.FILE_SUFFIX&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt; &amp;nbsp; def root = new XmlSlurper().parse(new File(xmlname));&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt; &amp;nbsp; if(value!=null){&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;				&lt;/span&gt; &amp;nbsp; root.method.each{ mtd -&amp;gt;&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;					&lt;/span&gt; &amp;nbsp; def mtdname = mtd.name.toString()&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;					&lt;/span&gt; &amp;nbsp; if(mtdname.endsWith(&quot;Null&quot;)||mtdname.endsWith(&quot;Error&quot;)){ // remove null filter mapping&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;						&lt;/span&gt; &amp;nbsp; mtd.replaceNode{}&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;					&lt;/span&gt; &amp;nbsp; }else{&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;						&lt;/span&gt; &amp;nbsp; if(mtd.uri==&quot;&quot;){&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;							&lt;/span&gt; &amp;nbsp; mtd.javadoc + {&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;								&lt;/span&gt; &amp;nbsp; uri {&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;									&lt;/span&gt; &amp;nbsp; uri(rooturi)&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;									&lt;/span&gt; &amp;nbsp; deprecated(false)&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;									&lt;/span&gt; &amp;nbsp; type(&quot;java.lang.String&quot;)&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;								&lt;/span&gt; &amp;nbsp; }&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;							&lt;/span&gt; &amp;nbsp; }&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;						&lt;/span&gt; &amp;nbsp; }else{&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;						&lt;/span&gt; &amp;nbsp; &lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;mtd.uri.uri = rooturi + mtd.uri.uri&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;						&lt;/span&gt; &amp;nbsp; }&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre; &quot;&gt;						&lt;/span&gt; &amp;nbsp; //// add parameter comment&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;						&lt;/span&gt; &amp;nbsp; def mtddoc = classDoc.methods().find {&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;							&lt;/span&gt; &amp;nbsp; it.name().equals(mtdname)&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;						&lt;/span&gt; &amp;nbsp; }&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre; &quot;&gt;						&lt;/span&gt; &amp;nbsp; mtd.&quot;request-param&quot;.each{ rqparam -&amp;gt;&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;							&lt;/span&gt; &amp;nbsp; if(rqparam.javadoc==&quot;&quot;){&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;								&lt;/span&gt; &amp;nbsp; def paramdoc = mtddoc.paramTags().find{ paramtag -&amp;gt;&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;									&lt;/span&gt; &amp;nbsp; paramtag.parameterName().equals(rqparam.name)&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;								&lt;/span&gt; &amp;nbsp; }&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;								&lt;/span&gt; &amp;nbsp; rqparam.type + {&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;									&lt;/span&gt; &amp;nbsp; javadoc(paramdoc?.parameterComment() )&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;								&lt;/span&gt; &amp;nbsp; }&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;							&lt;/span&gt; &amp;nbsp; }&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;						&lt;/span&gt; &amp;nbsp; }&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre; &quot;&gt;						&lt;/span&gt; &amp;nbsp; // add response-param exception javadoc&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;						&lt;/span&gt; &amp;nbsp; mtd.&quot;response-param&quot;.each{ rpparam -&amp;gt;&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;							&lt;/span&gt; &amp;nbsp; if(rpparam.name.equals(&quot;Exception&quot;)){&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;								&lt;/span&gt; &amp;nbsp; def exceptiondoc = mtddoc.throwsTags().find{ paramtag -&amp;gt;&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;									&lt;/span&gt; &amp;nbsp; paramtag.exceptionName() .equals(rpparam.name.toString())&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;								&lt;/span&gt; &amp;nbsp; }&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;								&lt;/span&gt; &amp;nbsp; if(rpparam.javadoc==&quot;&quot;){&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;									&lt;/span&gt; &amp;nbsp; rpparam.type + {&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;										&lt;/span&gt; &amp;nbsp; javadoc(exceptiondoc?.exceptionComment() )&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;									&lt;/span&gt; &amp;nbsp; }&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;								&lt;/span&gt; &amp;nbsp; }&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;							&lt;/span&gt; &amp;nbsp; }&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;						&lt;/span&gt; &amp;nbsp; }&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;					&lt;/span&gt; &amp;nbsp; }&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;				&lt;/span&gt; &amp;nbsp; }&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt; &amp;nbsp; }&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt; &amp;nbsp; def outputBuilder = new StreamingMarkupBuilder()&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt; &amp;nbsp; outputBuilder.encoding =&quot;UTF-8&quot;&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre; &quot;&gt;			&lt;/span&gt; &amp;nbsp; def result = outputBuilder.bind{&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;				&lt;/span&gt; &amp;nbsp; mkp.xmlDeclaration()&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;				&lt;/span&gt; &amp;nbsp; mkp.yield root&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt; &amp;nbsp; }&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt; &amp;nbsp; def ant = new AntBuilder()&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt; &amp;nbsp; def myDir = outputpath + &quot;/&quot;+xmlname&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt; &amp;nbsp; ant.touch(file:myDir, mkdirs:true, verbose:false)&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre; &quot;&gt;			&lt;/span&gt; &amp;nbsp; def fwriter = new FileWriter(myDir &amp;nbsp;);// .write(result);&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt; &amp;nbsp; XmlUtil.serialize(result, fwriter)&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt; &amp;nbsp; fwriter.close();&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt; }&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;}&lt;/p&gt;&lt;/blockquote&gt;&lt;/p&gt;&lt;p&gt;services.jsp ( template 1 )&lt;/p&gt;&lt;p&gt;&lt;blockquote class=&quot;tx-quote-tistory&quot;&gt;&lt;p&gt;&amp;lt;div class=&quot;projectDetails&quot;&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;&amp;lt;h1 class=&quot;mainHeading&quot;&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;span class=&quot;title&quot;&amp;gt;RESTdoclet for:&amp;lt;/span&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;span class=&quot;application&quot;&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;em&amp;gt;&amp;lt;span class=&quot;application&quot;&amp;gt;${param[&quot;APPLICATION&quot;]}&amp;lt;/span&amp;gt;&amp;lt;/em&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/span&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;&amp;lt;/h1&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;&amp;lt;h3&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;span class=&quot;version&quot;&amp;gt;Version: &amp;lt;em&amp;gt;${props.version}&amp;lt;/em&amp;gt;&amp;lt;/span&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;span class=&quot;timestamp&quot;&amp;gt;Creation: &amp;lt;em&amp;gt;${props.timestamp}&amp;lt;/em&amp;gt;&amp;lt;/span&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;&amp;lt;/h3&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;lt;/div&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;lt;div class=&quot;services&quot;&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;&amp;lt;table class=&quot;topLevel&quot;&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;thead&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;tr&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;th&amp;gt;URI&amp;lt;/th&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;th&amp;gt;Actions&amp;lt;/th&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/tr&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/thead&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;tbody&amp;gt;&amp;lt;% services.each{ service -&amp;gt; %&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;tr&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;td class=&quot;uri&quot;&amp;gt;&amp;lt;% &amp;nbsp;service.uris.each{ urix -&amp;gt; %&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;div class=&quot;active&quot;&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;a href=&quot;service-${service.identifier}.html&quot;&amp;gt;${urix.uri}&amp;lt;/a&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;/div&amp;gt;&amp;lt;% } %&amp;gt;&amp;lt;/td&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;td&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;table class=&quot;methods&quot;&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;% service.methods.each{ method-&amp;gt; %&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;tr&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;td class=&quot;requestMethod&quot;&amp;gt;${method.requestMethod}&amp;lt;/td class=&quot;javadoc&quot;&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;td class=&quot;javadoc&quot;&amp;gt;${method.javadoc}&amp;lt;/td&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/tr&amp;gt;&amp;lt;% } %&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/table&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;/td&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/tr&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;% } &amp;nbsp;%&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/tbody&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;&amp;lt;/table&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;lt;/div&amp;gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;/p&gt;&lt;p&gt;service.jsp ( template 2 )&lt;/p&gt;&lt;p&gt;&lt;blockquote class=&quot;tx-quote-tistory&quot;&gt;&lt;p&gt;&amp;lt;div class=&quot;projectDetails&quot;&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;&amp;lt;h1 class=&quot;mainHeading&quot;&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;span class=&quot;title&quot;&amp;gt;REST for:&amp;lt;/span&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;em&amp;gt;&amp;lt;a href=&quot;services.html&quot;&amp;gt;${param[&quot;APPLICATION&quot;]}&amp;lt;/a&amp;gt;&amp;lt;/em&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;% service.uris.each{ urix -&amp;gt; %&amp;gt;&amp;lt;span class=&quot;path&quot;&amp;gt;&amp;lt;em&amp;gt;${urix.uri}&amp;lt;/em&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;% } %&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;&amp;lt;/h1&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;&amp;lt;h3&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;span class=&quot;version&quot;&amp;gt;Version: &amp;lt;em&amp;gt;${props.version}&amp;lt;/em&amp;gt;&amp;lt;/span&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;span class=&quot;timestamp&quot;&amp;gt;Creation: &amp;lt;em&amp;gt;${props.timestamp}&amp;lt;/em&amp;gt;&amp;lt;/span&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;&amp;lt;/h3&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;lt;/div&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;lt;% service.controller.methods.each{ method-&amp;gt; %&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;&amp;lt;div class=&quot;method&quot;&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;h3 class=&quot;httpMethod&quot;&amp;gt;${method.requestMethod}&amp;lt;/h3&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;p class=&quot;methodJsDoc&quot;&amp;gt;${method.javadoc}&amp;lt;/p&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;% if(method.pathParams.size()&amp;gt;0 || method.restParams.size() &amp;gt;0 || method.requestParams.size()&amp;gt;0 ){ %&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;div class=&quot;input&quot;&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;h3&amp;gt;Request input&amp;lt;/h3&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;table class=&quot;topLevel methodDetails&quot;&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;thead&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;Name&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;Description&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;Param Type&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/thead&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;tbody&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;% method.pathParams.each{ parameter-&amp;gt; %&amp;gt;&amp;lt;tr&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;td class=&quot;name&quot;&amp;gt;${parameter.type} ${parameter.name}&amp;lt;/td&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;td class=&quot;javadoc&quot;&amp;gt;${parameter.javadoc}&amp;lt;/td&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;td class=&quot;path&quot;&amp;gt;Path (Mandatory)&amp;lt;/td&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/tr&amp;gt;&amp;lt;% } %&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;% method.restParams.each{ parameter-&amp;gt; %&amp;gt;&amp;lt;tr&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;td class=&quot;name&quot;&amp;gt;${parameter.type} ${parameter.name}&amp;lt;/td&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;td class=&quot;javadoc&quot;&amp;gt;${parameter.javadoc}&amp;lt;/td&amp;gt;&amp;lt;td class=&quot;path&quot;&amp;gt;REST&amp;lt;/td&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/tr&amp;gt;&amp;lt;% } %&amp;gt;&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;&amp;lt;% method.requestParams.each{ parameter-&amp;gt; %&amp;gt;&amp;lt;tr&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;td class=&quot;name&quot;&amp;gt;${parameter.type} ${parameter.name}&amp;lt;/td&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;td class=&quot;javadoc&quot;&amp;gt;${parameter.javadoc}&amp;lt;/td&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;td class=&quot;path&quot;&amp;gt;Request&amp;lt;% if(parameter.required){ %&amp;gt;(Mandatory)&amp;lt;% }else{ %&amp;gt;(Optional)&amp;lt;% } %&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;% if(parameter.defaultValue){ %&amp;gt;(Default=${parameter.defaultValue})&amp;lt;% } %&amp;gt;&amp;lt;/td&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/tr&amp;gt;&amp;lt;% } %&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;/tbody&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/table&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;/div&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;% } %&amp;gt;&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;&amp;lt;% if( method.responseParams.size()&amp;gt;0){ %&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;div class=&quot;response&quot;&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;h3&amp;gt;Response contents&amp;lt;/h3&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;table class=&quot;topLevel methodDetails&quot;&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;thead&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;th class=&quot;type&quot;&amp;gt;Response Type&amp;lt;/th&amp;gt;&amp;lt;th class=&quot;description&quot;&amp;gt;Description&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/thead&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;tbody&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;% method.responseParams.each{ parameter-&amp;gt; %&amp;gt;&amp;lt;tr&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;td class=&quot;type&quot;&amp;gt;${parameter.type}&amp;lt;/td&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;td class=&quot;javadoc&quot;&amp;gt;${parameter.javadoc}&amp;lt;/td&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/tr&amp;gt;&amp;lt;% } %&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;/tbody&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/table&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;/div&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;% } %&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;&amp;lt;/div&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;lt;% } %&amp;gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;/p&gt;&lt;br /&gt;
ref) http://mestachs.wordpress.com/2012/08/06/rest-api-documentation/&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>IT</category>
      <author>smplnote</author>
      <guid isPermaLink="true">https://smplnote.tistory.com/315</guid>
      <comments>https://smplnote.tistory.com/315#entry315comment</comments>
      <pubDate>Fri, 24 Aug 2012 10:15:38 +0900</pubDate>
    </item>
    <item>
      <title>why xacml?</title>
      <link>https://smplnote.tistory.com/314</link>
      <description>세상은 왜!&lt;br /&gt;
&lt;br /&gt;
xacml (eXtensible Access Control Markup Language)&lt;br /&gt;
saml이 authentication(인증)에대한 것이라면 xacml은 authorization(ㅎㅓ가)&lt;br /&gt;
&lt;br /&gt;
good&lt;br /&gt;
 - it's standard. no lock in by OASIS&lt;br /&gt;
- no hard coded. externalize &amp;amp; xml &lt;br /&gt;
- policy based approach, attribute based approach&lt;br /&gt;
- fine-grained authorization&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
reference&lt;br /&gt;
http://en.m.wikipedia.org/wiki/XACML&lt;br /&gt;
http://blogs.kuppingercole.com/kuppinger/2009/10/22/xacml-why-it-is-so-important/&lt;br /&gt;
xacmlinfo.com/2011/10/30/whyxacml/&lt;br /&gt;
http://xacmlguide.blogspot.kr/2012/06/introduction-to-xacml-xacml-stands-for.html?m=1&lt;br /&gt;
validator http://www.webfarmr.eu/xacml-validator-schema-axiomatics/</description>
      <category>IT</category>
      <category>xacml</category>
      <author>smplnote</author>
      <guid isPermaLink="true">https://smplnote.tistory.com/314</guid>
      <comments>https://smplnote.tistory.com/314#entry314comment</comments>
      <pubDate>Sat, 18 Aug 2012 12:00:48 +0900</pubDate>
    </item>
    <item>
      <title>xacml 확장하기. html element 에 대한 ACL 적용</title>
      <link>https://smplnote.tistory.com/313</link>
      <description>&lt;p&gt;배경 : xacml 을&amp;nbsp;버튼에 대해서도 적용해달란다.&lt;/p&gt;&lt;p&gt;이미 적용된 상태에서 또다른 솔루션 (spring security 등등)을 적용하는 경우 관리 비용이 증가할 것을 우려하여, 한곳에서 관리하고 싶어했다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;구현방향 : interceptor대신 validation을&amp;nbsp;처리할 controller 와 javascript function 을 제공.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;1. javascript로 object (button, image etc.. ) 의 id를 &amp;nbsp;전달.&lt;/p&gt;&lt;p&gt;2. controller에 해당 object 에 대한 권한 여부를 확인&lt;/p&gt;&lt;p&gt;3. 결과에 따라 disable, enable 처리&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;단점 :&amp;nbsp;&lt;/p&gt;&lt;p&gt;- 버튼 권한까지 서버에게 물어봐야 하니???&lt;/p&gt;&lt;p&gt;- id가 중복될 경우 잘못 처리될 수 있음.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;구현내용&lt;/p&gt;&lt;p&gt;1. javascript function&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;blockquote class=&quot;tx-quote-tistory&quot;&gt;&lt;p&gt;$.authorizeWebElement = function(objectid){&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre; &quot;&gt;			&lt;/span&gt;$.ajax({&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;				&lt;/span&gt;type: &quot;POST&quot;,&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;				&lt;/span&gt;dataType: &quot;json&quot;,&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;				&lt;/span&gt;url:&amp;nbsp;
&quot;/authorize&quot;&amp;nbsp;,&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;				&lt;/span&gt;data : {&quot;objectId&quot;:objectid},&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre; &quot;&gt;				&lt;/span&gt;success: function(data){&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;					&lt;/span&gt;$(objectid)[data.message]();&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;				&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;});&lt;/p&gt;&lt;p&gt;};&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;2. controller&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;blockquote class=&quot;tx-quote-tistory&quot;&gt;&lt;p&gt;public @ResponseBody&amp;nbsp;Map&amp;lt;String, Object&amp;gt; authorize(@RequestParam(value=&quot;objectId&quot;) String objectId, HttpServletRequest request){&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;ACManager acm = ACManager.getInstance(this.pdpPath);&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; List&amp;lt;String&amp;gt; roles = getRoles(request); // get&amp;nbsp;user role from session or persistence data&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Map map = new HashMap();&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre; &quot;&gt;		&lt;/span&gt;if(acm.evaluate(roles, objectId)){&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre; &quot;&gt;			&lt;/span&gt;map.put(&quot;message
&quot;,&amp;nbsp;&quot;&amp;nbsp;show&quot;);&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;}else{&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre; &quot;&gt;			&lt;/span&gt;map.put(&quot;message
&quot;,&amp;nbsp;&quot;&amp;nbsp;hide&quot;);&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre; &quot;&gt;		&lt;/span&gt;return map;&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;}&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;3. screen&amp;nbsp;&lt;/p&gt;&lt;blockquote class=&quot;tx-quote-tistory&quot;&gt;&lt;p&gt;function xxx(){&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;$.authorizeUI(&quot;#OnlyAdminAvailableButton&quot;);&lt;/p&gt;&lt;p&gt;}&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;cf) 주의사항&amp;nbsp;&lt;/p&gt;&lt;p&gt;반드시 elementId 는 유일해야한다. ...&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;</description>
      <category>IT</category>
      <category>accesscontrol</category>
      <category>Web</category>
      <category>xacml</category>
      <author>smplnote</author>
      <guid isPermaLink="true">https://smplnote.tistory.com/313</guid>
      <comments>https://smplnote.tistory.com/313#entry313comment</comments>
      <pubDate>Fri, 17 Aug 2012 20:35:26 +0900</pubDate>
    </item>
    <item>
      <title>[javascript] jqgrid auto refresh button (reloadgrid)</title>
      <link>https://smplnote.tistory.com/312</link>
      <description>&lt;p&gt;목적 : refresh 기능을 추가했더니 가끔 끄고 싶을때가 있더라..&lt;/p&gt;&lt;p&gt;그래서 버튼으로 추가구현.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;사용기술 : jquery , jqgrid 의 custom button&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://www.trirand.com/jqgridwiki/doku.php?id=wiki:custom_buttons&quot;&gt;http://www.trirand.com/jqgridwiki/doku.php?id=wiki:custom_buttons&lt;/a&gt;
&lt;/p&gt;&lt;p&gt;setTimeout&amp;nbsp;&lt;a href=&quot;http://www.w3schools.com/js/js_timing.asp&quot;&gt;http://www.w3schools.com/js/js_timing.asp&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;1. set global variable&lt;/p&gt;&lt;p&gt;var timeoutHnd&lt;/p&gt;&lt;p&gt;var LIST_ID = &quot;#mylist&quot;;&lt;/p&gt;&lt;p&gt;var BTN_ID = &quot;#reload&quot;;t&lt;/p&gt;&lt;p&gt;2. add refresh function&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // listid : list div element&amp;nbsp;id ex) #mylist&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // btnid : button element id ex) #myrefreshbuttono&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // timeoutHnd : global variable for timeout handler&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// change : boolean . if you want change button text, icon then true.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;function&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;gridRefresh(listId, btnId,timeoutHnd,change){&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;if(timeoutHnd){&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;clearTimeout(timeoutHnd);&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;timeoutHnd = null;&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;}&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre; &quot;&gt;		&lt;/span&gt;var on = $(btnId).attr(&quot;title&quot;)==&quot;start refresh&quot;;&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;if(change&amp;amp;&amp;amp;on || !change&amp;amp;&amp;amp;!on){&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre; &quot;&gt;		&lt;/span&gt; &lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre; &quot;&gt;	&lt;/span&gt;timeoutHnd = setTimeout(function () { $(listId).trigger('reloadGrid'); },10000);&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre; &quot;&gt;		&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre; &quot;&gt;		&lt;/span&gt;if(change){&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;changeRefreshButton(btnId);&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre; &quot;&gt;		&lt;/span&gt;return timeoutHnd;&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;};&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre; &quot;&gt;	&lt;/span&gt;function changeRefreshButton(btnId){&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;if($(btnId).attr(&quot;title&quot;)==&quot;stop refresh&quot;){&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;$(btnId).attr(&quot;title&quot;,&quot;start refresh&quot;);&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;$(btnId).find(&quot;.ui-icon&quot;).removeClass(&quot;ui-icon-cancel&quot;).addClass(&quot;ui-icon-refresh&quot;);&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;}else{&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre; &quot;&gt;		&lt;/span&gt; &lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre; &quot;&gt;	&lt;/span&gt;$(btnId).attr(&quot;title&quot;,&quot;stop refresh&quot;);&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt; &lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;$(btnId).find(&quot;.ui-icon&quot;).removeClass(&quot;ui-icon-refresh&quot;).addClass(&quot;ui-icon-cancel&quot;);&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;3. set timer&lt;/p&gt;&lt;p&gt;loadComplete: function(){&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt; &lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;if( $(
LIST_ID&amp;nbsp;).jqGrid(&quot;getGridParam&quot;, &quot;records&quot;)&amp;gt;0){&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt; &lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;timeoutHnd = gridRefresh(LIST_ID,
BTN_ID&amp;nbsp;,timeoutHnd, false);&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt; &lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;$(
BTN_ID&amp;nbsp;).show();&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt; &lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;}else{&amp;nbsp;// 0건이면 refresh 안하고 버튼 숨김.&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt; &lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;if(timeoutHnd){&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;						&lt;/span&gt;clearTimeout(timeoutHnd);&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;						&lt;/span&gt;timeoutHnd = null;&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;					&lt;/span&gt;}&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt; &lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;$(
BTN_ID&amp;nbsp;).hide();&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt; &lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;&amp;nbsp;},&lt;/p&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;3. add button &amp;nbsp;to navigator&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;}).navGrid(&quot;#pager&quot;) &amp;nbsp;&lt;/p&gt;&lt;p&gt;.navButtonAdd(&quot;#pager5&quot;,&lt;/p&gt;&lt;p&gt;&amp;nbsp; {title:&quot;stop refresh&quot;,&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;caption:&quot;&quot;,&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;buttonicon:&quot;ui-icon-cancel&quot;,&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;id:&quot;reload&quot; ,&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;onClickButton: function(){ gridRefresh(LIST_ID,
BTN_ID&amp;nbsp;&amp;nbsp;,timeoutHnd,true);}&lt;/p&gt;&lt;p&gt;}&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;);&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;</description>
      <category>IT</category>
      <category>jqGrid</category>
      <category>jQuery</category>
      <category>navButtonAdd</category>
      <category>reloadgrid</category>
      <category>setTimeout</category>
      <author>smplnote</author>
      <guid isPermaLink="true">https://smplnote.tistory.com/312</guid>
      <comments>https://smplnote.tistory.com/312#entry312comment</comments>
      <pubDate>Fri, 17 Aug 2012 19:41:44 +0900</pubDate>
    </item>
    <item>
      <title>xacml 웹 적용하기</title>
      <link>https://smplnote.tistory.com/311</link>
      <description>&lt;p&gt;&lt;/p&gt;&lt;p&gt;목적 : Access Control 표준이 XACML 이란다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;경과 :&amp;nbsp;&lt;/p&gt;&lt;p&gt;몇가지 xacml 관련 구현체들을 찾아보았는데,&lt;/p&gt;&lt;p&gt;상용이 아닌 것으로 가장 활발한 곳은 jboss xacml 구현체인 picketbox 였다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;Picketbox는&amp;nbsp;&lt;span style=&quot;color: rgb(85, 85, 85); font-family: 'Lucida Sans Unicode', 'Lucida Grande', sans-serif; &quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: rgb(85, 85, 85); font-family: 'Lucida Sans Unicode', 'Lucida Grande', sans-serif; &quot;&gt;Java Security Framework의 하나인데,&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: rgb(85, 85, 85); font-family: 'Lucida SansPOST /admin/entry/post/saveEntry.php HTTP/1.1
Host: pffm.tistory.com
Connection: keep-alive
Content-Length: 81586
Origin: http://pffm.tistory.com
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.57 Safari/536.11
Content-Type: application/x-www-form-urlencoded
charset: utf-8
Accept: */*
Referer: http://pffm.tistory.com/admin/entry/post
Accept-Encoding: gzip,deflate,sdch
Accept-Language: ko-KR,ko;q=0.8,en-US;q=0.6,en;q=0.4
Accept-Charset: windows-949,utf-8;q=0.7,*;q=0.3
Cookie: visited=1345075677; checkLogin=true; uuid=20e9d24ad6b54fdf81032714d295bf827c8fd3c7; TSSESSION=cbf4d4a95ab128cd; UF=tistory.AssG7HaCDlnDZnYxfNI6eQgGrTdzs91l; daum_cookie=tistory.AssG7HaCDlnDZnYxfNI6eQgGrTdzs91l; daum_cookie_temp=4mnyMZJxubE0; editorSidebar=o|o|fo|c|c|c|fc

 Unicode', 'Lucida Grande', sans-serif; &quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: rgb(85, 85, 85); font-family: 'Lucida Sans Unicode', 'Lucida Grande', sans-serif; &quot;&gt;Oasis XACML v2.0 에 호환되는 엔진을 제공한다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: rgb(85, 85, 85); font-family: 'Lucida Sans Unicode', 'Lucida Grande', sans-serif; &quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;절차&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;1. xacml library download&lt;/p&gt;&lt;p&gt;from&amp;nbsp;&lt;a href=&quot;http://www.jboss.org/picketbox/downloads&quot;&gt;http://www.jboss.org/picketbox/downloads&lt;/a&gt;&lt;/p&gt;&lt;p&gt;jbossxacml-2.0.8.Final.jar&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;2. add library&amp;nbsp;&lt;/p&gt;&lt;p&gt;WEB-INF/lib 또는 기타 classpath 상에 해당 jar 파일을 배치한다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;3. register ACL Interceptor to&amp;nbsp;spring mvc context&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;gt; context/servlet-context.xml&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;blockquote class=&quot;tx-quote-tistory&quot;&gt;&lt;p style=&quot;margin-bottom: 0.0001pt; line-height: normal; &quot;&gt;&lt;span style=&quot;font-size: 10pt; color: teal; &quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; color: rgb(63, 127, 127); background-color: silver; background-position: initial initial; background-repeat: initial initial; &quot;&gt;mvc:interceptors&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; color: teal; &quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;B&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/span&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;p  style=&quot; margin-bottom:=&quot;&quot; 0.0001pt;=&quot;&quot; line-height:=&quot;&quot; normal;=&quot;&quot; &quot;=&quot;&quot;&gt;&lt;span style=&quot;font-size: 10pt; color: black; &quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; color: teal; &quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; color: rgb(63, 127, 127); &quot;&gt;mvc:mapping&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; &quot;&gt;&amp;nbsp;&lt;span style=&quot;color: rgb(127, 0, 127); &quot;&gt;path&lt;/span&gt;&lt;span style=&quot;color: black; &quot;&gt;=&lt;/span&gt;&lt;i&gt;&lt;span style=&quot;color: rgb(42, 0, 255); &quot;&gt;&quot;/*&quot;&lt;/span&gt;&lt;/i&gt;&lt;span style=&quot;color: teal; &quot;&gt;/&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: black; &quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-bottom: 0.0001pt; line-height: normal; &quot;&gt;&lt;span style=&quot;font-size: 10pt; color: black; &quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; color: teal; &quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; color: rgb(63, 127, 127); &quot;&gt;bean&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; &quot;&gt;&amp;nbsp;&lt;span style=&quot;color: rgb(127, 0, 127); &quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color: black; &quot;&gt;=&lt;/span&gt;&lt;i&gt;&lt;span style=&quot;color: rgb(42, 0, 255); &quot;&gt;&quot;com&lt;/span&gt;&lt;span style=&quot;color: red; &quot;&gt;.MyACLInterceptor&quot;&lt;/span&gt;&lt;/i&gt;&amp;nbsp;&lt;span style=&quot;color: teal; &quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-bottom: 0.0001pt; line-height: normal; &quot;&gt;&lt;span style=&quot;font-size: 10pt; color: black; &quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; color: teal; &quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; color: rgb(63, 127, 127); &quot;&gt;property&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; &quot;&gt;&amp;nbsp;&lt;span style=&quot;color: rgb(127, 0, 127); &quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color: black; &quot;&gt;=&lt;/span&gt;&lt;i&gt;&lt;span style=&quot;color: rgb(42, 0, 255); &quot;&gt;&quot;config&quot;&lt;/span&gt;&lt;/i&gt;&amp;nbsp;&lt;span style=&quot;color: rgb(127, 0, 127); &quot;&gt;value&lt;/span&gt;&lt;span style=&quot;color: black; &quot;&gt;=&lt;/span&gt;&lt;i&gt;&lt;span style=&quot;color: rgb(42, 0, 255); &quot;&gt;&quot;config/policyConfig.xml&quot;&lt;/span&gt;&lt;/i&gt;&lt;span style=&quot;color: teal; &quot;&gt;/&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(63, 95, 191); &quot;&gt;&amp;lt;!--&amp;nbsp;&lt;u&gt;pdp&lt;/u&gt;&amp;nbsp;file classpath --&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-bottom: 0.0001pt; line-height: normal; &quot;&gt;&lt;span style=&quot;font-size: 10pt; color: black; &quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; color: teal; &quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; color: rgb(63, 127, 127); &quot;&gt;bean&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; color: teal; &quot;&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-bottom: 0.0001pt; line-height: normal; &quot;&gt;&lt;span style=&quot;font-size: 10pt; color: teal; &quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; color: rgb(63, 127, 127); &quot;&gt;mvc:interceptor&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; color: teal; &quot;&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;line-height: 13px; font-family: Consolas; &quot;&gt;...&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 10pt; font-family: '맑은 고딕'; color: teal; &quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; font-family: '맑은 고딕'; color: rgb(63, 127, 127); &quot;&gt;mvc:interceptors&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; font-family: '맑은 고딕'; color: teal; &quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; font-family: '맑은 고딕'; color: black; &quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;4. write&amp;nbsp;PDP (&lt;span style=&quot;font-family: 굴림체; font-size: 11pt; &quot;&gt;Policy Decision Point)&lt;/span&gt;&amp;nbsp; configuration file&lt;br /&gt;Caching과 관련해서는 아래 Reference 를 참조&lt;/p&gt;&lt;p&gt;&amp;gt; config/policyConfig.xml&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;blockquote class=&quot;tx-quote-tistory&quot;&gt;&lt;p style=&quot;margin-bottom:0cm;margin-bottom:.0001pt;line-height:
normal;mso-pagination:none;mso-layout-grid-align:none;text-autospace:none&quot;&gt;&lt;span style=&quot;font-size:10.0pt;mso-bidi-font-family:&amp;quot;맑은 고딕&amp;quot;;color:teal;
mso-fareast-language:KO;mso-bidi-language:AR-SA&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;font-size:10.0pt;mso-bidi-font-family:&amp;quot;맑은 고딕&amp;quot;;color:#3F7F7F;background:
silver;mso-highlight:silver;mso-fareast-language:KO;mso-bidi-language:AR-SA&quot;&gt;ns:jbosspdp&lt;/span&gt;&lt;span style=&quot;font-size:10.0pt;mso-bidi-font-family:&amp;quot;맑은 고딕&amp;quot;;mso-fareast-language:
KO;mso-bidi-language:AR-SA&quot;&gt; &lt;span style=&quot;color:#7F007F&quot;&gt;xmlns:ns&lt;/span&gt;&lt;span style=&quot;color:black&quot;&gt;=&lt;/span&gt;&lt;i&gt;&lt;span style=&quot;color:#2A00FF&quot;&gt;&quot;urn:jboss:xacml:2.0&quot;&lt;/span&gt;&lt;/i&gt;&lt;span style=&quot;color:teal&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-bottom:0cm;margin-bottom:.0001pt;line-height:
normal;mso-pagination:none;mso-layout-grid-align:none;text-autospace:none&quot;&gt;&lt;span style=&quot;font-size:10.0pt;mso-bidi-font-family:&amp;quot;맑은 고딕&amp;quot;;color:black;
mso-fareast-language:KO;mso-bidi-language:AR-SA&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;font-size:10.0pt;
mso-bidi-font-family:&amp;quot;맑은 고딕&amp;quot;;color:teal;mso-fareast-language:KO;mso-bidi-language:
AR-SA&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;font-size:10.0pt;mso-bidi-font-family:
&amp;quot;맑은 고딕&amp;quot;;color:#3F7F7F;mso-fareast-language:KO;mso-bidi-language:AR-SA&quot;&gt;ns:Policies&lt;/span&gt;&lt;span style=&quot;font-size:10.0pt;mso-bidi-font-family:&amp;quot;맑은 고딕&amp;quot;;color:teal;
mso-fareast-language:KO;mso-bidi-language:AR-SA&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-bottom:0cm;margin-bottom:.0001pt;line-height:
normal;mso-pagination:none;mso-layout-grid-align:none;text-autospace:none&quot;&gt;&lt;span style=&quot;font-size:10.0pt;mso-bidi-font-family:&amp;quot;맑은 고딕&amp;quot;;color:black;
mso-fareast-language:KO;mso-bidi-language:AR-SA&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;font-size:10.0pt;
mso-bidi-font-family:&amp;quot;맑은 고딕&amp;quot;;color:teal;mso-fareast-language:KO;mso-bidi-language:
AR-SA&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;font-size:10.0pt;mso-bidi-font-family:
&amp;quot;맑은 고딕&amp;quot;;color:#3F7F7F;mso-fareast-language:KO;mso-bidi-language:AR-SA&quot;&gt;ns:PolicySet&lt;/span&gt;&lt;span style=&quot;font-size:10.0pt;mso-bidi-font-family:&amp;quot;맑은 고딕&amp;quot;;color:teal;
mso-fareast-language:KO;mso-bidi-language:AR-SA&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-bottom:0cm;margin-bottom:.0001pt;line-height:
normal;mso-pagination:none;mso-layout-grid-align:none;text-autospace:none&quot;&gt;&lt;span style=&quot;font-size:10.0pt;mso-bidi-font-family:&amp;quot;맑은 고딕&amp;quot;;color:black;
mso-fareast-language:KO;mso-bidi-language:AR-SA&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;font-size:10.0pt;mso-bidi-font-family:&amp;quot;맑은 고딕&amp;quot;;color:teal;mso-fareast-language:
KO;mso-bidi-language:AR-SA&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;font-size:10.0pt;
mso-bidi-font-family:&amp;quot;맑은 고딕&amp;quot;;color:#3F7F7F;mso-fareast-language:KO;mso-bidi-language:
AR-SA&quot;&gt;ns:Location&lt;/span&gt;&lt;span style=&quot;font-size:10.0pt;mso-bidi-font-family:
&amp;quot;맑은 고딕&amp;quot;;color:teal;mso-fareast-language:KO;mso-bidi-language:AR-SA&quot;&gt;&amp;gt;config/mypolicyset.xml&lt;/span&gt;&lt;span style=&quot;font-size:10.0pt;mso-bidi-font-family:&amp;quot;맑은 고딕&amp;quot;;color:teal;
mso-fareast-language:KO;mso-bidi-language:AR-SA&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;font-size:10.0pt;mso-bidi-font-family:&amp;quot;맑은 고딕&amp;quot;;color:#3F7F7F;mso-fareast-language:
KO;mso-bidi-language:AR-SA&quot;&gt;ns:Location&lt;/span&gt;&lt;span style=&quot;font-size:10.0pt;mso-bidi-font-family:&amp;quot;맑은 고딕&amp;quot;;color:teal;mso-fareast-language:
KO;mso-bidi-language:AR-SA&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;font-size:10.0pt;
mso-bidi-font-family:&amp;quot;맑은 고딕&amp;quot;;color:black;mso-fareast-language:KO;mso-bidi-language:
AR-SA&quot;&gt; &lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-bottom:0cm;margin-bottom:.0001pt;line-height:
normal;mso-pagination:none;mso-layout-grid-align:none;text-autospace:none&quot;&gt;&lt;span style=&quot;font-size:10.0pt;mso-bidi-font-family:&amp;quot;맑은 고딕&amp;quot;;color:black;
mso-fareast-language:KO;mso-bidi-language:AR-SA&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;font-size:10.0pt;
mso-bidi-font-family:&amp;quot;맑은 고딕&amp;quot;;color:teal;mso-fareast-language:KO;mso-bidi-language:
AR-SA&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;font-size:10.0pt;mso-bidi-font-family:
&amp;quot;맑은 고딕&amp;quot;;color:#3F7F7F;mso-fareast-language:KO;mso-bidi-language:AR-SA&quot;&gt;ns:PolicySet&lt;/span&gt;&lt;span style=&quot;font-size:10.0pt;mso-bidi-font-family:&amp;quot;맑은 고딕&amp;quot;;color:teal;
mso-fareast-language:KO;mso-bidi-language:AR-SA&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-bottom:0cm;margin-bottom:.0001pt;line-height:
normal;mso-pagination:none;mso-layout-grid-align:none;text-autospace:none&quot;&gt;&lt;span style=&quot;font-size:10.0pt;mso-bidi-font-family:&amp;quot;맑은 고딕&amp;quot;;color:black;
mso-fareast-language:KO;mso-bidi-language:AR-SA&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;font-size:10.0pt;
mso-bidi-font-family:&amp;quot;맑은 고딕&amp;quot;;color:teal;mso-fareast-language:KO;mso-bidi-language:
AR-SA&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;font-size:10.0pt;mso-bidi-font-family:
&amp;quot;맑은 고딕&amp;quot;;color:#3F7F7F;mso-fareast-language:KO;mso-bidi-language:AR-SA&quot;&gt;ns:Policies&lt;/span&gt;&lt;span style=&quot;font-size:10.0pt;mso-bidi-font-family:&amp;quot;맑은 고딕&amp;quot;;color:teal;
mso-fareast-language:KO;mso-bidi-language:AR-SA&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-bottom:0cm;margin-bottom:.0001pt;line-height:
normal;mso-pagination:none;mso-layout-grid-align:none;text-autospace:none&quot;&gt;&lt;span style=&quot;font-size:10.0pt;mso-bidi-font-family:&amp;quot;맑은 고딕&amp;quot;;color:teal;
mso-fareast-language:KO;mso-bidi-language:AR-SA&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;font-size:10.0pt;mso-bidi-font-family:&amp;quot;맑은 고딕&amp;quot;;color:#3F7F7F;mso-fareast-language:
KO;mso-bidi-language:AR-SA&quot;&gt;ns:Locators&lt;/span&gt;&lt;span style=&quot;font-size:10.0pt;mso-bidi-font-family:&amp;quot;맑은 고딕&amp;quot;;color:teal;mso-fareast-language:
KO;mso-bidi-language:AR-SA&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-bottom:0cm;margin-bottom:.0001pt;line-height:
normal;mso-pagination:none;mso-layout-grid-align:none;text-autospace:none&quot;&gt;&lt;span style=&quot;font-size:10.0pt;mso-bidi-font-family:&amp;quot;맑은 고딕&amp;quot;;color:teal;
mso-fareast-language:KO;mso-bidi-language:AR-SA&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;font-size:10.0pt;mso-bidi-font-family:&amp;quot;맑은 고딕&amp;quot;;color:#3F7F7F;mso-fareast-language:
KO;mso-bidi-language:AR-SA&quot;&gt;ns:Locator&lt;/span&gt;&lt;span style=&quot;font-size:
10.0pt;mso-bidi-font-family:&amp;quot;맑은 고딕&amp;quot;;mso-fareast-language:KO;mso-bidi-language:
AR-SA&quot;&gt; &lt;span style=&quot;color:#7F007F&quot;&gt;Name&lt;/span&gt;&lt;span style=&quot;color:black&quot;&gt;=&lt;/span&gt;&lt;i&gt;&lt;span style=&quot;color:#2A00FF&quot;&gt;&quot;org.jboss.security.xacml.locators.JBossPolicySetLocator&quot;&lt;/span&gt;&lt;/i&gt;&lt;span style=&quot;color:teal&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-bottom:0cm;margin-bottom:.0001pt;line-height:
normal;mso-pagination:none;mso-layout-grid-align:none;text-autospace:none&quot;&gt;&lt;span style=&quot;font-size: 10pt; color: teal; &quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; color: rgb(63, 127, 127); &quot;&gt;ns:Locators&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; color: teal; &quot;&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-bottom:0cm;margin-bottom:.0001pt;line-height:
normal;mso-pagination:none;mso-layout-grid-align:none;text-autospace:none&quot;&gt;&lt;span style=&quot;font-size: 10pt; color: teal; &quot;&gt;&lt;span style=&quot;font-size: 10pt; font-family: '맑은 고딕'; &quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; font-family: '맑은 고딕'; color: rgb(63, 127, 127); background-color: silver; &quot;&gt;ns:jbosspdp&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; font-family: '맑은 고딕'; &quot;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;

















5. policy set 정의&lt;p&gt;&lt;/p&gt;&lt;p&gt;&amp;gt; config/mypolicyset.xml&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;blockquote class=&quot;tx-quote-tistory&quot;&gt;&lt;p style=&quot;margin-bottom:0cm;margin-bottom:.0001pt;line-height:
normal;mso-pagination:none;mso-layout-grid-align:none;text-autospace:none&quot;&gt;&lt;span style=&quot;font-size:10.0pt;mso-bidi-font-family:&amp;quot;맑은 고딕&amp;quot;;color:teal;
mso-fareast-language:KO;mso-bidi-language:AR-SA&quot;&gt;&amp;lt;?&lt;/span&gt;&lt;span style=&quot;font-size:10.0pt;mso-bidi-font-family:&amp;quot;맑은 고딕&amp;quot;;color:#3F7F7F;mso-fareast-language:
KO;mso-bidi-language:AR-SA&quot;&gt;xml&lt;/span&gt;&lt;span style=&quot;font-size:10.0pt;
mso-bidi-font-family:&amp;quot;맑은 고딕&amp;quot;;mso-fareast-language:KO;mso-bidi-language:AR-SA&quot;&gt; &lt;span style=&quot;color:#7F007F&quot;&gt;version&lt;/span&gt;&lt;span style=&quot;color:black&quot;&gt;=&lt;/span&gt;&lt;i&gt;&lt;span style=&quot;color:#2A00FF&quot;&gt;&quot;1.0&quot;&lt;/span&gt;&lt;/i&gt; &lt;span style=&quot;color:#7F007F&quot;&gt;encoding&lt;/span&gt;&lt;span style=&quot;color:black&quot;&gt;=&lt;/span&gt;&lt;i&gt;&lt;span style=&quot;color:#2A00FF&quot;&gt;&quot;UTF-8&quot;&lt;/span&gt;&lt;/i&gt;
&lt;span style=&quot;color:#7F007F&quot;&gt;standalone&lt;/span&gt;&lt;span style=&quot;color:black&quot;&gt;=&lt;/span&gt;&lt;i&gt;&lt;span style=&quot;color:#2A00FF&quot;&gt;&quot;yes&quot;&lt;/span&gt;&lt;/i&gt;&lt;span style=&quot;color:teal&quot;&gt;?&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-bottom:0cm;margin-bottom:.0001pt;line-height:
normal;mso-pagination:none;mso-layout-grid-align:none;text-autospace:none&quot;&gt;&lt;span style=&quot;font-size:10.0pt;mso-bidi-font-family:&amp;quot;맑은 고딕&amp;quot;;color:teal;
mso-fareast-language:KO;mso-bidi-language:AR-SA&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;font-size:10.0pt;mso-bidi-font-family:&amp;quot;맑은 고딕&amp;quot;;color:#3F7F7F;mso-fareast-language:
KO;mso-bidi-language:AR-SA&quot;&gt;PolicySet&lt;/span&gt;&lt;span style=&quot;font-size:
10.0pt;mso-bidi-font-family:&amp;quot;맑은 고딕&amp;quot;;mso-fareast-language:KO;mso-bidi-language:
AR-SA&quot;&gt; &lt;span style=&quot;color:#7F007F&quot;&gt;xmlns&lt;/span&gt;&lt;span style=&quot;color:black&quot;&gt;=&lt;/span&gt;&lt;i&gt;&lt;span style=&quot;color:#2A00FF&quot;&gt;&quot;urn:oasis:names:tc:xacml:2.0:policy:schema:os&quot;&amp;nbsp;&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; &quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; color: rgb(127, 0, 127); &quot;&gt;PolicySetId&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; color: black; &quot;&gt;=&lt;/span&gt;&lt;i style=&quot;font-size: 10pt; &quot;&gt;&lt;span style=&quot;color:#2A00FF&quot;&gt;&quot;policyset&quot;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;&lt;p style=&quot;margin-bottom:0cm;margin-bottom:.0001pt;line-height:
normal;mso-pagination:none;mso-layout-grid-align:none;text-autospace:none&quot;&gt;&lt;span style=&quot;font-size:10.0pt;mso-bidi-font-family:&amp;quot;맑은 고딕&amp;quot;;mso-fareast-language:
KO;mso-bidi-language:AR-SA&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#7F007F&quot;&gt;PolicyCombiningAlgId&lt;/span&gt;&lt;span style=&quot;color:black&quot;&gt;=&lt;/span&gt;&lt;i&gt;&lt;span style=&quot;color:#2A00FF&quot;&gt;&quot;urn:oasis:names:tc:xacml:1.0:policy-combining-algorithm:&lt;/span&gt;&lt;b&gt;&lt;span style=&quot;color:red&quot;&gt;first-applicable&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;color:#2A00FF&quot;&gt;&quot;&lt;/span&gt;&lt;/i&gt;&lt;span style=&quot;color:teal&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-bottom:0cm;margin-bottom:.0001pt;line-height:
normal;mso-pagination:none;mso-layout-grid-align:none;text-autospace:none&quot;&gt;&lt;span style=&quot;font-size:10.0pt;mso-bidi-font-family:&amp;quot;맑은 고딕&amp;quot;;color:black;
mso-fareast-language:KO;mso-bidi-language:AR-SA&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;font-size:10.0pt;
mso-bidi-font-family:&amp;quot;맑은 고딕&amp;quot;;color:teal;mso-fareast-language:KO;mso-bidi-language:
AR-SA&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;font-size:10.0pt;mso-bidi-font-family:
&amp;quot;맑은 고딕&amp;quot;;color:#3F7F7F;mso-fareast-language:KO;mso-bidi-language:AR-SA&quot;&gt;Target&lt;/span&gt;&lt;span style=&quot;font-size:10.0pt;mso-bidi-font-family:&amp;quot;맑은 고딕&amp;quot;;mso-fareast-language:
KO;mso-bidi-language:AR-SA&quot;&gt; &lt;span style=&quot;color:teal&quot;&gt;/&amp;gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-bottom:0cm;margin-bottom:.0001pt;line-height:
normal;mso-pagination:none;mso-layout-grid-align:none;text-autospace:none&quot;&gt;&lt;span style=&quot;font-size:10.0pt;mso-bidi-font-family:&amp;quot;맑은 고딕&amp;quot;;color:black;
mso-fareast-language:KO;mso-bidi-language:AR-SA&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;font-size:10.0pt;
mso-bidi-font-family:&amp;quot;맑은 고딕&amp;quot;;color:teal;mso-fareast-language:KO;mso-bidi-language:
AR-SA&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;font-size:10.0pt;mso-bidi-font-family:
&amp;quot;맑은 고딕&amp;quot;;color:#3F7F7F;mso-fareast-language:KO;mso-bidi-language:AR-SA&quot;&gt;Policy&lt;/span&gt;&lt;span style=&quot;font-size:10.0pt;mso-bidi-font-family:&amp;quot;맑은 고딕&amp;quot;;mso-fareast-language:
KO;mso-bidi-language:AR-SA&quot;&gt; &lt;span style=&quot;color:#7F007F&quot;&gt;xmlns&lt;/span&gt;&lt;span style=&quot;color:black&quot;&gt;=&lt;/span&gt;&lt;i&gt;&lt;span style=&quot;color:#2A00FF&quot;&gt;&quot;urn:oasis:names:tc:xacml:2.0:policy:schema:os&quot;&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-bottom:0cm;margin-bottom:.0001pt;line-height:
normal;mso-pagination:none;mso-layout-grid-align:none;text-autospace:none&quot;&gt;&lt;span style=&quot;font-size:10.0pt;mso-bidi-font-family:&amp;quot;맑은 고딕&amp;quot;;mso-fareast-language:
KO;mso-bidi-language:AR-SA&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:#7F007F&quot;&gt;xmlns:xsi&lt;/span&gt;&lt;span style=&quot;color:black&quot;&gt;=&lt;/span&gt;&lt;i&gt;&lt;span style=&quot;color:#2A00FF&quot;&gt;&quot;http://www.w3.org/2001/XMLSchema-instance&quot;&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-bottom:0cm;margin-bottom:.0001pt;line-height:
normal;mso-pagination:none;mso-layout-grid-align:none;text-autospace:none&quot;&gt;&lt;span style=&quot;font-size:10.0pt;mso-bidi-font-family:&amp;quot;맑은 고딕&amp;quot;;mso-fareast-language:
KO;mso-bidi-language:AR-SA&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:#7F007F&quot;&gt;xsi:schemaLocation&lt;/span&gt;&lt;span style=&quot;color:black&quot;&gt;=&lt;/span&gt;&lt;i&gt;&lt;span style=&quot;color:#2A00FF&quot;&gt;&quot;urn:oasis:names:tc:xacml:2.0:policy:schema:os&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-bottom:0cm;margin-bottom:.0001pt;line-height:
normal;mso-pagination:none;mso-layout-grid-align:none;text-autospace:none&quot;&gt;&lt;i&gt;&lt;span style=&quot;font-size:10.0pt;mso-bidi-font-family:&amp;quot;맑은 고딕&amp;quot;;color:#2A00FF;
mso-fareast-language:KO;mso-bidi-language:AR-SA&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
access_control-xacml-2.0-policy-schema-os.xsd&quot;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;&lt;p style=&quot;margin-bottom:0cm;margin-bottom:.0001pt;line-height:
normal;mso-pagination:none;mso-layout-grid-align:none;text-autospace:none&quot;&gt;&lt;span style=&quot;font-size:10.0pt;mso-bidi-font-family:&amp;quot;맑은 고딕&amp;quot;;mso-fareast-language:
KO;mso-bidi-language:AR-SA&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:#7F007F&quot;&gt;PolicyId&lt;/span&gt;&lt;span style=&quot;color:black&quot;&gt;=&lt;/span&gt;&lt;i&gt;&lt;span style=&quot;color:#2A00FF&quot;&gt;&quot;my-policy&quot;&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-bottom:0cm;margin-bottom:.0001pt;line-height:
normal;mso-pagination:none;mso-layout-grid-align:none;text-autospace:none&quot;&gt;&lt;span style=&quot;font-size:10.0pt;mso-bidi-font-family:&amp;quot;맑은 고딕&amp;quot;;mso-fareast-language:
KO;mso-bidi-language:AR-SA&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:#7F007F&quot;&gt;RuleCombiningAlgId&lt;/span&gt;&lt;span style=&quot;color:black&quot;&gt;=&lt;/span&gt;&lt;i&gt;&lt;span style=&quot;color:#2A00FF&quot;&gt;&quot;urn:oasis:names:tc:xacml:1.0:rule-combining-algorithm:&lt;/span&gt;&lt;b&gt;&lt;span style=&quot;color:red&quot;&gt;first-applicable&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;color:#2A00FF&quot;&gt;&quot;&lt;/span&gt;&lt;/i&gt;&lt;span style=&quot;color:teal&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-bottom:0cm;margin-bottom:.0001pt;line-height:
normal;mso-pagination:none;mso-layout-grid-align:none;text-autospace:none&quot;&gt;&lt;span style=&quot;font-size: 10pt; color: black; &quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; color: teal; &quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; color: rgb(63, 127, 127); &quot;&gt;Description&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; color: teal; &quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; color: black; &quot;&gt;access control policy&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; color: teal; &quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; color: rgb(63, 127, 127); &quot;&gt;Description&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; color: teal; &quot;&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-bottom:0cm;margin-bottom:.0001pt;line-height:
normal;mso-pagination:none;mso-layout-grid-align:none;text-autospace:none&quot;&gt;&lt;span style=&quot;font-size:10.0pt;mso-bidi-font-family:&amp;quot;맑은 고딕&amp;quot;;color:black;
mso-fareast-language:KO;mso-bidi-language:AR-SA&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;font-size:10.0pt;
mso-bidi-font-family:&amp;quot;맑은 고딕&amp;quot;;color:teal;mso-fareast-language:KO;mso-bidi-language:
AR-SA&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;font-size:10.0pt;mso-bidi-font-family:
&amp;quot;맑은 고딕&amp;quot;;color:#3F7F7F;mso-fareast-language:KO;mso-bidi-language:AR-SA&quot;&gt;Target&lt;/span&gt;&lt;span style=&quot;font-size:10.0pt;mso-bidi-font-family:&amp;quot;맑은 고딕&amp;quot;;mso-fareast-language:
KO;mso-bidi-language:AR-SA&quot;&gt; &lt;span style=&quot;color:teal&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-bottom:0cm;margin-bottom:.0001pt;line-height:
normal;mso-pagination:none;mso-layout-grid-align:none;text-autospace:none&quot;&gt;&lt;span style=&quot;font-size:10.0pt;mso-bidi-font-family:&amp;quot;맑은 고딕&amp;quot;;color:teal;
mso-fareast-language:KO;mso-bidi-language:AR-SA&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; color: teal; &quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; color: rgb(63, 127, 127); &quot;&gt;Rule&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; &quot;&gt; &lt;span style=&quot;color:#7F007F&quot;&gt;RuleId&lt;/span&gt;&lt;span style=&quot;color:black&quot;&gt;=&lt;/span&gt;&lt;i&gt;&lt;span style=&quot;color:#2A00FF&quot;&gt;&quot;myruleid&quot; &lt;/span&gt;&lt;/i&gt;&lt;span style=&quot;color:#7F007F&quot;&gt;Effect&lt;/span&gt;&lt;span style=&quot;color:black&quot;&gt;=&lt;/span&gt;&lt;i&gt;&lt;span style=&quot;color:#2A00FF&quot;&gt;&quot;Permit&quot;&lt;/span&gt;&lt;/i&gt;&lt;span style=&quot;color:teal&quot;&gt;&amp;gt;&amp;lt;!— Permit
/ Deny &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; color: teal; &quot;&gt;&lt;span&gt;&amp;nbsp;--&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-bottom:0cm;margin-bottom:.0001pt;line-height:
normal;mso-pagination:none;mso-layout-grid-align:none;text-autospace:none&quot;&gt;&lt;span style=&quot;font-size:10.0pt;mso-bidi-font-family:&amp;quot;맑은 고딕&amp;quot;;color:black;
mso-fareast-language:KO;mso-bidi-language:AR-SA&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;font-size:10.0pt;
mso-bidi-font-family:&amp;quot;맑은 고딕&amp;quot;;color:teal;mso-fareast-language:KO;mso-bidi-language:
AR-SA&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;font-size:10.0pt;mso-bidi-font-family:
&amp;quot;맑은 고딕&amp;quot;;color:#3F7F7F;mso-fareast-language:KO;mso-bidi-language:AR-SA&quot;&gt;Description&lt;/span&gt;&lt;span style=&quot;font-size:10.0pt;mso-bidi-font-family:&amp;quot;맑은 고딕&amp;quot;;color:teal;
mso-fareast-language:KO;mso-bidi-language:AR-SA&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;font-size:10.0pt;mso-bidi-font-family:&amp;quot;맑은 고딕&amp;quot;;color:black;mso-fareast-language:
KO;mso-bidi-language:AR-SA&quot;&gt;my rule&lt;/span&gt;&lt;span style=&quot;font-size:10.0pt;mso-bidi-font-family:&amp;quot;맑은 고딕&amp;quot;;color:teal;mso-fareast-language:
KO;mso-bidi-language:AR-SA&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;font-size:10.0pt;
mso-bidi-font-family:&amp;quot;맑은 고딕&amp;quot;;color:#3F7F7F;mso-fareast-language:KO;mso-bidi-language:
AR-SA&quot;&gt;Description&lt;/span&gt;&lt;span style=&quot;font-size:10.0pt;mso-bidi-font-family:
&amp;quot;맑은 고딕&amp;quot;;color:teal;mso-fareast-language:KO;mso-bidi-language:AR-SA&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-bottom:0cm;margin-bottom:.0001pt;line-height:
normal;mso-pagination:none;mso-layout-grid-align:none;text-autospace:none&quot;&gt;&lt;span style=&quot;font-size:10.0pt;mso-bidi-font-family:&amp;quot;맑은 고딕&amp;quot;;color:black;
mso-fareast-language:KO;mso-bidi-language:AR-SA&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;font-size:10.0pt;
mso-bidi-font-family:&amp;quot;맑은 고딕&amp;quot;;color:teal;mso-fareast-language:KO;mso-bidi-language:
AR-SA&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;font-size:10.0pt;mso-bidi-font-family:
&amp;quot;맑은 고딕&amp;quot;;color:#3F7F7F;mso-fareast-language:KO;mso-bidi-language:AR-SA&quot;&gt;Target&lt;/span&gt;&lt;span style=&quot;font-size:10.0pt;mso-bidi-font-family:&amp;quot;맑은 고딕&amp;quot;;mso-fareast-language:
KO;mso-bidi-language:AR-SA&quot;&gt; &lt;span style=&quot;color:teal&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-bottom:0cm;margin-bottom:.0001pt;line-height:
normal;mso-pagination:none;mso-layout-grid-align:none;text-autospace:none&quot;&gt;&lt;span style=&quot;font-size:10.0pt;mso-bidi-font-family:&amp;quot;맑은 고딕&amp;quot;;color:black;
mso-fareast-language:KO;mso-bidi-language:AR-SA&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;font-size:10.0pt;
mso-bidi-font-family:&amp;quot;맑은 고딕&amp;quot;;color:teal;mso-fareast-language:KO;mso-bidi-language:
AR-SA&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;font-size:10.0pt;mso-bidi-font-family:
&amp;quot;맑은 고딕&amp;quot;;color:#3F7F7F;mso-fareast-language:KO;mso-bidi-language:AR-SA&quot;&gt;Subjects&lt;/span&gt;&lt;span style=&quot;font-size:10.0pt;mso-bidi-font-family:&amp;quot;맑은 고딕&amp;quot;;color:teal;
mso-fareast-language:KO;mso-bidi-language:AR-SA&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-bottom:0cm;margin-bottom:.0001pt;line-height:
normal;mso-pagination:none;mso-layout-grid-align:none;text-autospace:none&quot;&gt;&lt;span style=&quot;font-size:10.0pt;mso-bidi-font-family:&amp;quot;맑은 고딕&amp;quot;;color:black;
mso-fareast-language:KO;mso-bidi-language:AR-SA&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;font-size:10.0pt;
mso-bidi-font-family:&amp;quot;맑은 고딕&amp;quot;;color:teal;mso-fareast-language:KO;mso-bidi-language:
AR-SA&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;font-size:10.0pt;mso-bidi-font-family:
&amp;quot;맑은 고딕&amp;quot;;color:#3F7F7F;mso-fareast-language:KO;mso-bidi-language:AR-SA&quot;&gt;Resources&lt;/span&gt;&lt;span style=&quot;font-size:10.0pt;mso-bidi-font-family:&amp;quot;맑은 고딕&amp;quot;;color:teal;
mso-fareast-language:KO;mso-bidi-language:AR-SA&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;font-size:10.0pt;mso-bidi-font-family:&amp;quot;맑은 고딕&amp;quot;;color:black;mso-fareast-language:
KO;mso-bidi-language:AR-SA&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-bottom:0cm;margin-bottom:.0001pt;line-height:
normal;mso-pagination:none;mso-layout-grid-align:none;text-autospace:none&quot;&gt;&lt;span style=&quot;font-size:10.0pt;mso-bidi-font-family:&amp;quot;맑은 고딕&amp;quot;;color:black;
mso-fareast-language:KO;mso-bidi-language:AR-SA&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;font-size:10.0pt;mso-bidi-font-family:&amp;quot;맑은 고딕&amp;quot;;color:teal;
mso-fareast-language:KO;mso-bidi-language:AR-SA&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;font-size:10.0pt;mso-bidi-font-family:&amp;quot;맑은 고딕&amp;quot;;color:#3F7F7F;mso-fareast-language:
KO;mso-bidi-language:AR-SA&quot;&gt;Resource&lt;/span&gt;&lt;span style=&quot;font-size:
10.0pt;mso-bidi-font-family:&amp;quot;맑은 고딕&amp;quot;;color:teal;mso-fareast-language:KO;
mso-bidi-language:AR-SA&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;font-size:10.0pt;
mso-bidi-font-family:&amp;quot;맑은 고딕&amp;quot;;color:black;mso-fareast-language:KO;mso-bidi-language:
AR-SA&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-bottom:0cm;margin-bottom:.0001pt;line-height:
normal;mso-pagination:none;mso-layout-grid-align:none;text-autospace:none&quot;&gt;&lt;span style=&quot;font-size: 10pt; color: black; &quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; color: teal; &quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; color: rgb(63, 127, 127); &quot;&gt;ResourceMatch&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; &quot;&gt; &lt;span style=&quot;color:#7F007F&quot;&gt;MatchId&lt;/span&gt;&lt;span style=&quot;color:black&quot;&gt;=&lt;/span&gt;&lt;i&gt;&lt;span style=&quot;color:#2A00FF&quot;&gt;&quot;urn:oasis:names:tc:xacml:1.0:function:string-regexp-match&quot;&lt;/span&gt;&lt;/i&gt;&lt;span style=&quot;color:teal&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:black&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-bottom:0cm;margin-bottom:.0001pt;line-height:
normal;mso-pagination:none;mso-layout-grid-align:none;text-autospace:none&quot;&gt;&lt;span style=&quot;font-size:10.0pt;mso-bidi-font-family:&amp;quot;맑은 고딕&amp;quot;;color:black;
mso-fareast-language:KO;mso-bidi-language:AR-SA&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;font-size:10.0pt;mso-bidi-font-family:&amp;quot;맑은 고딕&amp;quot;;color:teal;mso-fareast-language:
KO;mso-bidi-language:AR-SA&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;font-size:10.0pt;
mso-bidi-font-family:&amp;quot;맑은 고딕&amp;quot;;color:#3F7F7F;mso-fareast-language:KO;mso-bidi-language:
AR-SA&quot;&gt;AttributeValue&lt;/span&gt;&lt;span style=&quot;font-size:10.0pt;
mso-bidi-font-family:&amp;quot;맑은 고딕&amp;quot;;mso-fareast-language:KO;mso-bidi-language:AR-SA&quot;&gt; &lt;span style=&quot;color:#7F007F&quot;&gt;DataType&lt;/span&gt;&lt;span style=&quot;color:black&quot;&gt;=&lt;/span&gt;&lt;i&gt;&lt;span style=&quot;color:#2A00FF&quot;&gt;&quot;http://www.w3.org/2001/XMLSchema#string&quot;&lt;/span&gt;&lt;/i&gt;&lt;span style=&quot;color:teal&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:black&quot;&gt;^/( accessuri1|accessuri2)&lt;/span&gt;&lt;span style=&quot;color:teal&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#3F7F7F&quot;&gt;AttributeValue&lt;/span&gt;&lt;span style=&quot;color:teal&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:black&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-bottom:0cm;margin-bottom:.0001pt;line-height:
normal;mso-pagination:none;mso-layout-grid-align:none;text-autospace:none&quot;&gt;&lt;span style=&quot;font-size:10.0pt;mso-bidi-font-family:&amp;quot;맑은 고딕&amp;quot;;color:black;
mso-fareast-language:KO;mso-bidi-language:AR-SA&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;font-size:10.0pt;mso-bidi-font-family:&amp;quot;맑은 고딕&amp;quot;;color:teal;
mso-fareast-language:KO;mso-bidi-language:AR-SA&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;font-size:10.0pt;mso-bidi-font-family:&amp;quot;맑은 고딕&amp;quot;;color:#3F7F7F;mso-fareast-language:
KO;mso-bidi-language:AR-SA&quot;&gt;ResourceAttributeDesignator&lt;/span&gt;&lt;span style=&quot;font-size:10.0pt;mso-bidi-font-family:&amp;quot;맑은 고딕&amp;quot;;mso-fareast-language:KO;
mso-bidi-language:AR-SA&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-bottom:0cm;margin-bottom:.0001pt;line-height:
normal;mso-pagination:none;mso-layout-grid-align:none;text-autospace:none&quot;&gt;&lt;span style=&quot;font-size:10.0pt;mso-bidi-font-family:&amp;quot;맑은 고딕&amp;quot;;mso-fareast-language:
KO;mso-bidi-language:AR-SA&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:#7F007F&quot;&gt;AttributeId&lt;/span&gt;&lt;span style=&quot;color:black&quot;&gt;=&lt;/span&gt;&lt;i&gt;&lt;span style=&quot;color:#2A00FF&quot;&gt;&quot;urn:oasis:names:tc:xacml:1.0:resource:resource-id&quot;&lt;/span&gt;&lt;/i&gt;
&lt;span style=&quot;color:#7F007F&quot;&gt;DataType&lt;/span&gt;&lt;span style=&quot;color:black&quot;&gt;=&lt;/span&gt;&lt;i&gt;&lt;span style=&quot;color:#2A00FF&quot;&gt;&quot;http://www.w3.org/2001/XMLSchema#string&quot;&lt;/span&gt;&lt;/i&gt;&lt;span style=&quot;color:teal&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:black&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-bottom:0cm;margin-bottom:.0001pt;line-height:
normal;mso-pagination:none;mso-layout-grid-align:none;text-autospace:none&quot;&gt;&lt;span style=&quot;font-size:10.0pt;mso-bidi-font-family:&amp;quot;맑은 고딕&amp;quot;;color:black;
mso-fareast-language:KO;mso-bidi-language:AR-SA&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;font-size:10.0pt;mso-bidi-font-family:&amp;quot;맑은 고딕&amp;quot;;color:teal;
mso-fareast-language:KO;mso-bidi-language:AR-SA&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;font-size:10.0pt;mso-bidi-font-family:&amp;quot;맑은 고딕&amp;quot;;color:#3F7F7F;mso-fareast-language:
KO;mso-bidi-language:AR-SA&quot;&gt;ResourceMatch&lt;/span&gt;&lt;span style=&quot;font-size:10.0pt;mso-bidi-font-family:&amp;quot;맑은 고딕&amp;quot;;color:teal;mso-fareast-language:
KO;mso-bidi-language:AR-SA&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;font-size:10.0pt;
mso-bidi-font-family:&amp;quot;맑은 고딕&amp;quot;;color:black;mso-fareast-language:KO;mso-bidi-language:
AR-SA&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-bottom:0cm;margin-bottom:.0001pt;line-height:
normal;mso-pagination:none;mso-layout-grid-align:none;text-autospace:none&quot;&gt;&lt;span style=&quot;font-size:10.0pt;mso-bidi-font-family:&amp;quot;맑은 고딕&amp;quot;;color:black;
mso-fareast-language:KO;mso-bidi-language:AR-SA&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;  &lt;/span&gt;&lt;span style=&quot;font-size:10.0pt;mso-bidi-font-family:&amp;quot;맑은 고딕&amp;quot;;color:teal;
mso-fareast-language:KO;mso-bidi-language:AR-SA&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;font-size:10.0pt;mso-bidi-font-family:&amp;quot;맑은 고딕&amp;quot;;color:#3F7F7F;mso-fareast-language:
KO;mso-bidi-language:AR-SA&quot;&gt;Resource&lt;/span&gt;&lt;span style=&quot;font-size:
10.0pt;mso-bidi-font-family:&amp;quot;맑은 고딕&amp;quot;;color:teal;mso-fareast-language:KO;
mso-bidi-language:AR-SA&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;font-size:10.0pt;
mso-bidi-font-family:&amp;quot;맑은 고딕&amp;quot;;color:black;mso-fareast-language:KO;mso-bidi-language:
AR-SA&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-bottom:0cm;margin-bottom:.0001pt;line-height:
normal;mso-pagination:none;mso-layout-grid-align:none;text-autospace:none&quot;&gt;&lt;span style=&quot;font-size:10.0pt;mso-bidi-font-family:&amp;quot;맑은 고딕&amp;quot;;color:black;
mso-fareast-language:KO;mso-bidi-language:AR-SA&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;font-size:10.0pt;mso-bidi-font-family:&amp;quot;맑은 고딕&amp;quot;;color:teal;
mso-fareast-language:KO;mso-bidi-language:AR-SA&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;font-size:10.0pt;mso-bidi-font-family:&amp;quot;맑은 고딕&amp;quot;;color:#3F7F7F;mso-fareast-language:
KO;mso-bidi-language:AR-SA&quot;&gt;Resources&lt;/span&gt;&lt;span style=&quot;font-size:
10.0pt;mso-bidi-font-family:&amp;quot;맑은 고딕&amp;quot;;color:teal;mso-fareast-language:KO;
mso-bidi-language:AR-SA&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;font-size:10.0pt;
mso-bidi-font-family:&amp;quot;맑은 고딕&amp;quot;;color:black;mso-fareast-language:KO;mso-bidi-language:
AR-SA&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-bottom:0cm;margin-bottom:.0001pt;line-height:
normal;mso-pagination:none;mso-layout-grid-align:none;text-autospace:none&quot;&gt;&lt;span style=&quot;font-size:10.0pt;mso-bidi-font-family:&amp;quot;맑은 고딕&amp;quot;;color:black;
mso-fareast-language:KO;mso-bidi-language:AR-SA&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;font-size:10.0pt;
mso-bidi-font-family:&amp;quot;맑은 고딕&amp;quot;;color:teal;mso-fareast-language:KO;mso-bidi-language:
AR-SA&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;font-size:10.0pt;mso-bidi-font-family:
&amp;quot;맑은 고딕&amp;quot;;color:#3F7F7F;mso-fareast-language:KO;mso-bidi-language:AR-SA&quot;&gt;Target&lt;/span&gt;&lt;span style=&quot;font-size:10.0pt;mso-bidi-font-family:&amp;quot;맑은 고딕&amp;quot;;color:teal;
mso-fareast-language:KO;mso-bidi-language:AR-SA&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-bottom:0cm;margin-bottom:.0001pt;line-height:
normal;mso-pagination:none;mso-layout-grid-align:none;text-autospace:none&quot;&gt;&lt;span style=&quot;font-size: 10pt; color: black; &quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; color: teal; &quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; color: rgb(63, 127, 127); &quot;&gt;Condition&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; color: teal; &quot;&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-bottom:0cm;margin-bottom:.0001pt;line-height:
normal;mso-pagination:none;mso-layout-grid-align:none;text-autospace:none&quot;&gt;&lt;span style=&quot;font-size:10.0pt;mso-bidi-font-family:&amp;quot;맑은 고딕&amp;quot;;color:black;
mso-fareast-language:KO;mso-bidi-language:AR-SA&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;font-size:10.0pt;mso-bidi-font-family:&amp;quot;맑은 고딕&amp;quot;;color:teal;
mso-fareast-language:KO;mso-bidi-language:AR-SA&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;font-size:10.0pt;mso-bidi-font-family:&amp;quot;맑은 고딕&amp;quot;;color:#3F7F7F;mso-fareast-language:
KO;mso-bidi-language:AR-SA&quot;&gt;Apply&lt;/span&gt;&lt;span style=&quot;font-size:10.0pt;
mso-bidi-font-family:&amp;quot;맑은 고딕&amp;quot;;mso-fareast-language:KO;mso-bidi-language:AR-SA&quot;&gt; &lt;span style=&quot;color:#7F007F&quot;&gt;FunctionId&lt;/span&gt;&lt;span style=&quot;color:black&quot;&gt;=&lt;/span&gt;&lt;i&gt;&lt;span style=&quot;color:#2A00FF&quot;&gt;&quot;urn:oasis:names:tc:xacml:1.0:function:string-is-in&quot;&lt;/span&gt;&lt;/i&gt;&lt;span style=&quot;color:teal&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-bottom:0cm;margin-bottom:.0001pt;line-height:
normal;mso-pagination:none;mso-layout-grid-align:none;text-autospace:none&quot;&gt;&lt;span style=&quot;font-size:10.0pt;mso-bidi-font-family:&amp;quot;맑은 고딕&amp;quot;;color:black;
mso-fareast-language:KO;mso-bidi-language:AR-SA&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;font-size:10.0pt;mso-bidi-font-family:&amp;quot;맑은 고딕&amp;quot;;color:teal;mso-fareast-language:
KO;mso-bidi-language:AR-SA&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;font-size:10.0pt;
mso-bidi-font-family:&amp;quot;맑은 고딕&amp;quot;;color:#3F7F7F;mso-fareast-language:KO;mso-bidi-language:
AR-SA&quot;&gt;AttributeValue&lt;/span&gt;&lt;span style=&quot;font-size:10.0pt;
mso-bidi-font-family:&amp;quot;맑은 고딕&amp;quot;;mso-fareast-language:KO;mso-bidi-language:AR-SA&quot;&gt; &lt;span style=&quot;color:#7F007F&quot;&gt;DataType&lt;/span&gt;&lt;span style=&quot;color:black&quot;&gt;=&lt;/span&gt;&lt;i&gt;&lt;span style=&quot;color:#2A00FF&quot;&gt;&quot;http://www.w3.org/2001/XMLSchema#string&quot;&lt;/span&gt;&lt;/i&gt;&lt;span style=&quot;color:teal&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:black&quot;&gt;ACCESSIBLE_ROLE_NAME&lt;/span&gt;&lt;span style=&quot;color:teal&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#3F7F7F&quot;&gt;AttributeValue&lt;/span&gt;&lt;span style=&quot;color:teal&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-bottom:0cm;margin-bottom:.0001pt;line-height:
normal;mso-pagination:none;mso-layout-grid-align:none;text-autospace:none&quot;&gt;&lt;span style=&quot;font-size:10.0pt;mso-bidi-font-family:&amp;quot;맑은 고딕&amp;quot;;color:black;
mso-fareast-language:KO;mso-bidi-language:AR-SA&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;font-size:10.0pt;mso-bidi-font-family:&amp;quot;맑은 고딕&amp;quot;;color:teal;mso-fareast-language:
KO;mso-bidi-language:AR-SA&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;font-size:10.0pt;
mso-bidi-font-family:&amp;quot;맑은 고딕&amp;quot;;color:#3F7F7F;mso-fareast-language:KO;mso-bidi-language:
AR-SA&quot;&gt;SubjectAttributeDesignator&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-bottom:0cm;margin-bottom:.0001pt;line-height:
normal;mso-pagination:none;mso-layout-grid-align:none;text-autospace:none&quot;&gt;&lt;span style=&quot;font-size:10.0pt;mso-bidi-font-family:&amp;quot;맑은 고딕&amp;quot;;mso-fareast-language:
KO;mso-bidi-language:AR-SA&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:#7F007F&quot;&gt;DataType&lt;/span&gt;&lt;span style=&quot;color:black&quot;&gt;=&lt;/span&gt;&lt;i&gt;&lt;span style=&quot;color:#2A00FF&quot;&gt;&quot;http://www.w3.org/2001/XMLSchema#string&quot;&lt;/span&gt;&lt;/i&gt;
&lt;span style=&quot;color:#7F007F&quot;&gt;AttributeId&lt;/span&gt;&lt;span style=&quot;color:black&quot;&gt;=&lt;/span&gt;&lt;i&gt;&lt;span style=&quot;color:#2A00FF&quot;&gt;&quot;urn:oasis:names:tc:xacml:2.0:subject:role&quot;&lt;/span&gt;&lt;/i&gt;
&lt;span style=&quot;color:teal&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-bottom:0cm;margin-bottom:.0001pt;line-height:
normal;mso-pagination:none;mso-layout-grid-align:none;text-autospace:none&quot;&gt;&lt;span style=&quot;font-size:10.0pt;mso-bidi-font-family:&amp;quot;맑은 고딕&amp;quot;;color:black;
mso-fareast-language:KO;mso-bidi-language:AR-SA&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;font-size:10.0pt;
mso-bidi-font-family:&amp;quot;맑은 고딕&amp;quot;;color:teal;mso-fareast-language:KO;mso-bidi-language:
AR-SA&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;font-size:10.0pt;mso-bidi-font-family:
&amp;quot;맑은 고딕&amp;quot;;color:#3F7F7F;mso-fareast-language:KO;mso-bidi-language:AR-SA&quot;&gt;Apply&lt;/span&gt;&lt;span style=&quot;font-size:10.0pt;mso-bidi-font-family:&amp;quot;맑은 고딕&amp;quot;;color:teal;
mso-fareast-language:KO;mso-bidi-language:AR-SA&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-bottom:0cm;margin-bottom:.0001pt;line-height:
normal;mso-pagination:none;mso-layout-grid-align:none;text-autospace:none&quot;&gt;&lt;span style=&quot;font-size:10.0pt;mso-bidi-font-family:&amp;quot;맑은 고딕&amp;quot;;color:black;
mso-fareast-language:KO;mso-bidi-language:AR-SA&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;font-size:10.0pt;
mso-bidi-font-family:&amp;quot;맑은 고딕&amp;quot;;color:teal;mso-fareast-language:KO;mso-bidi-language:
AR-SA&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;font-size:10.0pt;mso-bidi-font-family:
&amp;quot;맑은 고딕&amp;quot;;color:#3F7F7F;mso-fareast-language:KO;mso-bidi-language:AR-SA&quot;&gt;Condition&lt;/span&gt;&lt;span style=&quot;font-size:10.0pt;mso-bidi-font-family:&amp;quot;맑은 고딕&amp;quot;;color:teal;
mso-fareast-language:KO;mso-bidi-language:AR-SA&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-bottom:0cm;margin-bottom:.0001pt;line-height:
normal;mso-pagination:none;mso-layout-grid-align:none;text-autospace:none&quot;&gt;&lt;span style=&quot;font-size:10.0pt;mso-bidi-font-family:&amp;quot;맑은 고딕&amp;quot;;color:teal;
mso-fareast-language:KO;mso-bidi-language:AR-SA&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;font-size:10.0pt;mso-bidi-font-family:&amp;quot;맑은 고딕&amp;quot;;color:#3F7F7F;mso-fareast-language:
KO;mso-bidi-language:AR-SA&quot;&gt;Rule&lt;/span&gt;&lt;span style=&quot;font-size:10.0pt;
mso-bidi-font-family:&amp;quot;맑은 고딕&amp;quot;;color:teal;mso-fareast-language:KO;mso-bidi-language:
AR-SA&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-bottom:0cm;margin-bottom:.0001pt;line-height:
normal;mso-pagination:none;mso-layout-grid-align:none;text-autospace:none&quot;&gt;&lt;span style=&quot;font-size:10.0pt;mso-bidi-font-family:&amp;quot;맑은 고딕&amp;quot;;mso-fareast-language:
KO;mso-bidi-language:AR-SA&quot;&gt;. . .&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-bottom: 0.0001pt; &quot;&gt;&lt;/p&gt;&lt;p style=&quot;margin-bottom: 0.0001pt; &quot;&gt;&lt;font size=&quot;2&quot;&gt;&lt;span style=&quot;line-height: normal;&quot;&gt;&amp;lt;Rule RuleId=&quot;ImplicitDeny&quot; Effect=&quot;Deny&quot; /&amp;gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p style=&quot;margin-bottom: 0.0001pt; &quot;&gt;&lt;span style=&quot;line-height: normal; font-size:10pt; &quot;&gt;&amp;lt;/Policy&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-bottom: 0.0001pt; &quot;&gt;&lt;span style=&quot;line-height: normal; font-size:10pt; &quot;&gt;&amp;lt;/PolicySet&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/blockquote&gt;





































































&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 13px; line-height: normal; &quot;&gt;&lt;span style=&quot;color: rgb(0, 0, 0); &quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 13px; line-height: normal; &quot;&gt;&lt;span style=&quot;color: rgb(0, 0, 0); &quot;&gt;- &amp;nbsp; policy-combining-algorithm은 경우에 따라 적절하게 사용할 것. ( first-applicable은 첫번째 걸리는 Rule을 따른다는 의미 )&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 13px; line-height: normal; &quot;&gt;&lt;span style=&quot;color: rgb(0, 0, 0); &quot;&gt;- Rule의 Effect는 Permit 아니면 Deny 를 선택할수 있음&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 13px; line-height: normal; &quot;&gt;&lt;span style=&quot;color: rgb(0, 0, 0); &quot;&gt;-&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;line-height: normal; font-size: 10pt; color: rgb(63, 127, 127); &quot;&gt;ResourceMatch&lt;/span&gt;&lt;span style=&quot;line-height: normal; font-size: 10pt; &quot;&gt;&amp;nbsp; 로 대상 Resource 를 정의할 수 있음&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;line-height: normal; font-size: 10pt; &quot;&gt;-&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: rgb(63, 127, 127); font-size: 13px; line-height: normal; &quot;&gt;Condition&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-size: 13px; line-height: normal; color: rgb(0, 0, 0); &quot;&gt;으로 Rule의 detail을 표현할 수 있음&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;i style=&quot;font-size: 13px; line-height: normal; &quot;&gt;&lt;span style=&quot;color: rgb(42, 0, 255); &quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;&lt;p&gt;&lt;font color=&quot;#2a00ff&quot; size=&quot;2&quot;&gt;&lt;span style=&quot;line-height: normal; &quot;&gt;&lt;span style=&quot;color: rgb(0, 0, 0); &quot;&gt;cf)&lt;/span&gt;&lt;/span&gt;&lt;/font&gt;&amp;nbsp;Policy 작성 BP. ( Ref. 1 - 2.7 )&lt;/p&gt;&lt;p&gt;- policy와 file 이름을 동일하게.&lt;/p&gt;&lt;p&gt;- 룰 조합 규칙은 가능한 심플하게. first-applicable 권고&lt;/p&gt;&lt;p&gt;- Permit, Deny 를 섞기말고 가능한 한쪽으로 모는것이 좋음.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;6. Interceptor 작성&lt;/p&gt;&lt;p&gt;&amp;gt;&amp;nbsp;&lt;i style=&quot;font-size: 13px; line-height: normal; &quot;&gt;&lt;span style=&quot;color: red; &quot;&gt;MyACLInterceptor.java&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;&lt;blockquote class=&quot;tx-quote-tistory&quot;&gt;&lt;p&gt;&lt;span style=&quot;font-size: 13px; line-height: normal; &quot;&gt;&lt;/span&gt;&lt;font color=&quot;#000000&quot; size=&quot;2&quot;&gt;&lt;span style=&quot;line-height: normal;&quot;&gt;public class MyACLInterceptor&amp;nbsp;extends HandlerInterceptorAdapter {&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;line-height: normal; color: rgb(0, 0, 0); font-size:10pt; white-space: pre; &quot;&gt;	&lt;/span&gt;&lt;span style=&quot;line-height: normal; color: rgb(0, 0, 0); font-size:10pt; &quot;&gt;private String config = &quot;&quot;;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;line-height: normal; color: rgb(0, 0, 0); font-size:10pt; white-space: pre; &quot;&gt;	&lt;/span&gt;&lt;span style=&quot;line-height: normal; color: rgb(0, 0, 0); font-size:10pt; &quot;&gt;public &amp;nbsp;String getConfig(){&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;font color=&quot;#000000&quot; size=&quot;2&quot;&gt;&lt;span style=&quot;line-height: normal;&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;return this.config;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font color=&quot;#000000&quot; size=&quot;2&quot;&gt;&lt;span style=&quot;line-height: normal;&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;}&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font color=&quot;#000000&quot; size=&quot;2&quot;&gt;&lt;span style=&quot;line-height: normal;&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;public void setConfig(String config){&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font color=&quot;#000000&quot; size=&quot;2&quot;&gt;&lt;span style=&quot;line-height: normal;&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;this.config = config;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font color=&quot;#000000&quot; size=&quot;2&quot;&gt;&lt;span style=&quot;line-height: normal;&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre; &quot;&gt;	&lt;/span&gt;}&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;public boolean preHandle(HttpServletRequest request,&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;HttpServletResponse response, Object handler) throws Exception {&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre; &quot;&gt;		&lt;/span&gt;if (!hasAccessRole(request)) {&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;throw new Exception(&quot;access not allowed.&quot;);&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre; &quot;&gt;		&lt;/span&gt;return true;&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;}&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;private boolean hasAccessRole(HttpServletRequest request) {&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre; &quot;&gt;		&lt;/span&gt;String&amp;nbsp;
resourceId&amp;nbsp;&amp;nbsp;= request.getRequestURI(); // URI&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;List&amp;lt;String&amp;gt; userRoles = getUserRoles(request);&amp;nbsp;// User ROLES&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre; &quot;&gt;		&lt;/span&gt;ACLManager acm = ACLManager.getInstance(this.config);&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre; &quot;&gt;		&lt;/span&gt;return&amp;nbsp;acm.evaluate(userRoles, resourceId);&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;}&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; List&amp;lt;String&amp;gt; getUserRoles(HttpServletRequest request){&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return &quot;get user role from session or persistence data&quot;.....&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/div&gt;&lt;div&gt;}&lt;/div&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;7. ACLManager 작성&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;blockquote class=&quot;tx-quote-tistory&quot;&gt;&lt;p&gt;public class ACLManager {&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;private static ACLManager instance;&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;private PolicyDecisionPoint pdp = null;&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre; &quot;&gt;	&lt;/span&gt;public boolean evaluate(List&amp;lt;String&amp;gt;userRoles, String resourceId) throws Exception{&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;RequestContext request = createXACMLRequest(userRoles, resourceId);&lt;/p&gt;&lt;p&gt;//&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;try {&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;request.marshall(System.out); &lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;} catch (IOException e) {&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;ResponseContext response = this.pdp.evaluate(request);&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;return XACMLConstants.DECISION_PERMIT == response.getDecision();&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;public RequestContext createXACMLRequest(List&amp;lt;String&amp;gt;userRoles, String resourceId) throws Exception{&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;RequestContext requestCtx = RequestResponseContextFactory.createRequestCtx();&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;SubjectType subject = new SubjectType();&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;subject.getAttribute().add(RequestAttributeFactory.createStringAttributeType(XACMLConstants.ATTRIBUTEID_SUBJECT_ID, &quot;myissuer&quot;, &quot;mysubject&quot;));&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;for(String role : userRoles) {&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; AttributeType attSubjectID = RequestAttributeFactory.createStringAttributeType(XACMLConstants.ATTRIBUTEID_ROLE, &quot;myissuer&quot;, role);&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; subject.getAttribute().add(attSubjectID);&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;ResourceType resourceType = new ResourceType();&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;resourceType.getAttribute().add(RequestAttributeFactory.createStringAttributeType(XACMLConstants.ATTRIBUTEID_RESOURCE_ID, null,&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;resourceId ));&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;ActionType actionType = new ActionType();&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;actionType.getAttribute().add(RequestAttributeFactory.createStringAttributeType(&quot;action-id&quot;, &quot;myissuer&quot;, &quot;read&quot;));&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;RequestType requestType = new RequestType();&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;requestType.getSubject().add(subject);&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;requestType.getResource().add(resourceType);&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;requestType.setAction(actionType);&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;requestCtx.setRequest(requestType);&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;return requestCtx;&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;private void setPDP(String pdpPath) throws Exception&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;{&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt; &amp;nbsp; InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream(pdpPath);&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt; &amp;nbsp; this.pdp = new JBossPDP(is);&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;private ACLManager(String pdpPath) throws Exception{&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;setPDP(pdpPath);&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;public static synchronized ACLManager getInstance(String pdpPath) throws Exception{&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;if (instance == null) {&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;instance = new ACLManager(pdpPath);&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;return instance;&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;}&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;[References]&lt;/p&gt;&lt;p&gt;1) XACML Function List :&amp;nbsp;&lt;a href=&quot;http://fedora-commons.org/download/2.2/userdocs/server/security/XACMLPolicyGuide.htm&quot;&gt;http://fedora-commons.org/download/2.2/userdocs/server/security/XACMLPolicyGuide.htm&lt;/a&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;XACML caching for Performance :&amp;nbsp;&lt;a href=&quot;https://community.jboss.org/wiki/XACMLCachingForPerformance&quot;&gt;https://community.jboss.org/wiki/XACMLCachingForPerformance&lt;/a&gt;&lt;/p&gt;&lt;br class=&quot;Apple-interchange-newline&quot;&gt;&lt;p&gt;&lt;/p&gt;</description>
      <category>IT</category>
      <category>accesscontrol</category>
      <category>java</category>
      <category>picketbox</category>
      <category>xacml</category>
      <author>smplnote</author>
      <guid isPermaLink="true">https://smplnote.tistory.com/311</guid>
      <comments>https://smplnote.tistory.com/311#entry311comment</comments>
      <pubDate>Thu, 16 Aug 2012 09:08:08 +0900</pubDate>
    </item>
    <item>
      <title>[IT] jqgrid polling</title>
      <link>https://smplnote.tistory.com/310</link>
      <description>&lt;p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;var timeoutHnd;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;...&lt;/p&gt;&lt;p&gt;$(GRID_ID).jqGrid({&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;&lt;/p&gt;&lt;p&gt;...&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt; &lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;loadComplete: function(){&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt; &lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;if(timeoutHnd){ // 기존 핸들은 clear&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt; &lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;clearTimeout(timeoutHnd);&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt; &lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt; &lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;if( $(GRID_ID).jqGrid(&quot;getGridParam&quot;, &quot;records&quot;)&amp;gt;0){ // 한건이라도 있으면..&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt; &lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;timeoutHnd = setTimeout(function () { $(GRID_ID).trigger('reloadGrid'); },10000);&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt; &lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt; &lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;},&lt;/p&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;...&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;// has any issue?&lt;/div&gt;&lt;/p&gt;</description>
      <category>IT</category>
      <category>JavaScript</category>
      <category>jqGrid</category>
      <category>jQuery</category>
      <category>loadcomplete</category>
      <category>settimeo</category>
      <category>태그를 입력해 주세요.</category>
      <author>smplnote</author>
      <guid isPermaLink="true">https://smplnote.tistory.com/310</guid>
      <comments>https://smplnote.tistory.com/310#entry310comment</comments>
      <pubDate>Mon, 6 Aug 2012 19:12:09 +0900</pubDate>
    </item>
    <item>
      <title>[groovy] log backup script</title>
      <link>https://smplnote.tistory.com/309</link>
      <description>&lt;p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;서버에서 로그를 지우고 싶은데,,, 쉘 스크립트를 짜고 싶지 않았다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;그래서 그루비 쉘로... ;;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;로그 파일을 대상으로&amp;nbsp;lastModified date가 오늘보다&amp;nbsp;1달 전인 것들을&amp;nbsp;&lt;/p&gt;&lt;p&gt;월별 디렉토리에 백업해주는 기능. &amp;nbsp;cron에 등록해놓으면 편할듯.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;cf) TimeCategory 기능 같은게 편하다...&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;import groovy.time.TimeCategory;&lt;/p&gt;&lt;p&gt;def backup( def searchPath, def backupdate, def postfix = ~/.*log$/ ){&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; def today = new Date();&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; def loglist = new File(searchPath).listFiles().grep(postfix);&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; def cnt = 0;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; loglist.each{ file -&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; def dt = new Date( file.lastModified())&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if( backupdate &amp;gt; dt ){&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; def backupdir = searchPath + &quot;/&quot; + dt.format(&quot;yyyyMM&quot;)&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; new File(backupdir).mkdir();&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;mv ${searchPath}/${file.name} &amp;nbsp;${backupdir}&quot;.execute();&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; cnt++;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; println &quot; ${cnt} files moved &quot;&lt;/p&gt;&lt;p&gt;}&lt;/p&gt;&lt;p&gt;def log_dir_list = [&quot;/software/log&quot;,&amp;nbsp;&quot;/software/log/access&quot;&amp;nbsp;];&lt;/p&gt;&lt;p&gt;def backupdate;&lt;/p&gt;&lt;p&gt;use(TimeCategory) {&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; backupdate = new Date() &amp;nbsp;- 1.month&lt;/p&gt;&lt;p&gt;}&lt;/p&gt;&lt;p&gt;println &quot;[ LOG Backup ] log &amp;lt; &quot; + backupdate.format(&quot;yyyyMMdd&quot;) + &quot; (lastModified date)&quot;&lt;/p&gt;&lt;p&gt;log_dir_list.each{&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; print &quot;\t log backup target : &amp;nbsp;${it} &amp;nbsp;-&amp;gt; &quot;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; backup(it, backupdate);&lt;/p&gt;&lt;p&gt;}&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;/p&gt;</description>
      <category>IT</category>
      <category>backup</category>
      <category>Groovy</category>
      <category>script</category>
      <category>timecategory</category>
      <author>smplnote</author>
      <guid isPermaLink="true">https://smplnote.tistory.com/309</guid>
      <comments>https://smplnote.tistory.com/309#entry309comment</comments>
      <pubDate>Fri, 27 Jul 2012 19:20:02 +0900</pubDate>
    </item>
    <item>
      <title>[groovy] lightweight web framework Ratpack ( using eclipse dynamic web project )</title>
      <link>https://smplnote.tistory.com/308</link>
      <description>&lt;p&gt;a mircro Groovy web framework&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/bleedingwolf/Ratpack&quot;&gt;https://github.com/bleedingwolf/Ratpack&lt;/a&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;License : Apache License, Version 2.0&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;groovy 하면 RoR에 영감을 얻었다는 grails가 떠오르지만.. 마찬가지로 &lt;span style=&quot;font-family: Helvetica, arial, freesans, clean, sans-serif; font-size: 14px; line-height: 22px; &quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;http://www.sinatrarb.com/&quot; style=&quot;margin: 0px; padding: 0px; border: 0px; color: rgb(65, 131, 196); font-family: Helvetica, arial, freesans, clean, sans-serif; font-size: 14px; line-height: 22px; &quot;&gt;Sinatra&lt;/a&gt;&lt;span style=&quot;font-family: Helvetica, arial, freesans, clean, sans-serif; font-size: 14px; line-height: 22px; &quot;&gt;&amp;nbsp;&lt;/span&gt;에 영향을 받은 Ratpack 이라는 경량 web framework이 있습니다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;물론 아직 beta 수준이라서 어디 써먹기에는 참 애매하지만... 하여튼 잠깐의 틈을 내서 &amp;nbsp;study.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;홈페이지에 간단하게 설치절차가 나와있지만,&lt;/p&gt;&lt;p&gt;eclipse 기반으로 작업할때 어떻게 하면 좋은지에 대한 경험을 기록하고자 합니다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;- Requirements&lt;/p&gt;&lt;p&gt;jdk 1.5 이상?&lt;/p&gt;&lt;p&gt;groovy 1.7.1+&lt;/p&gt;&lt;p&gt;gradle&lt;/p&gt;&lt;p&gt;eclipse ,&amp;nbsp;groovy&amp;nbsp;eclipse plugin (option)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;- ratpack build&amp;nbsp;&lt;/p&gt;&lt;p&gt;1. 다운로드 받은 ratpack project를 새로운 eclipse groovy project로 생성하고나서 복사합니다.&lt;/p&gt;&lt;p&gt;2. gradle&amp;nbsp;buildDistro 를 실행&lt;/p&gt;&lt;p&gt;cf)&amp;nbsp;&lt;a href=&quot;http://pffm.tistory.com/294&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;[gradle] Using Gradle from Ant (via gradlew)&lt;/a&gt; 글을 이용하여 ant build 파일을 이용해 돌릴 수 도 있습니다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;3. build/libs 위치에 library 들이 모두 생성되었는지 확인되면 OK.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;- make ratpack project&amp;nbsp;&lt;/p&gt;&lt;p&gt;1. eclipse에서&amp;nbsp;dynamic web project로 HelloRatpack 을 생성.&lt;/p&gt;&lt;p&gt;2. $webapp/WEB-INF/lib &amp;nbsp;에 위에서 생성한 build/libs 의 모든 jar 를 복사.&amp;nbsp;&lt;br /&gt;cf) except servlet-*.jar , jetty-*.jar&lt;/p&gt;&lt;p&gt;3. web.xml 에 servlet 을 등록&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;blockquote class=&quot;tx-quote-tistory&quot;&gt;&lt;p&gt;&amp;nbsp; &amp;lt;servlet&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;lt;servlet-name&amp;gt;Ratpack&amp;lt;/servlet-name&amp;gt;&lt;/p&gt;&lt;div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;lt;servlet-class&amp;gt;com.bleedingwolf.ratpack.RatpackServlet&amp;lt;/servlet-class&amp;gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;lt;init-param&amp;gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;param-name&amp;gt;app-script-filename&amp;lt;/param-name&amp;gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;param-value&amp;gt;hello.groovy&amp;lt;/param-value&amp;gt;&amp;lt;!-- &amp;nbsp;WEB-INF/lib/xxx.groovy &amp;nbsp;--&amp;gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;lt;/init-param&amp;gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;lt;/servlet&amp;gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&amp;nbsp; &amp;lt;servlet-mapping&amp;gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;lt;servlet-name&amp;gt;Ratpack&amp;lt;/servlet-name&amp;gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;lt;url-pattern&amp;gt;*&amp;lt;/url-pattern&amp;gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;lt;/servlet-mapping&amp;gt;&lt;/div&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;div&gt;이경우 app-script 파일의 위치는 WEB-INF/lib &amp;nbsp;으로 고정됨.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;따라서 원하는 곳으로 수정하려면...&amp;nbsp;RatpackServlet 을 상속받아서 하나 만듭니다.&lt;/div&gt;&lt;div&gt;ex)&amp;nbsp;&lt;/div&gt;&lt;blockquote class=&quot;tx-quote-tistory&quot;&gt;&lt;div&gt;class RatpackExtendServlet extends&amp;nbsp;RatpackServlet{&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;void init() {&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;if(app == null) {&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;def appScriptName = getServletConfig().getInitParameter(&quot;app-script-filename&quot;)&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt; &amp;nbsp;def fullScriptPath = getServletContext().getRealPath(&quot;WEB-INF/${appScriptName}&quot;)&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre; &quot;&gt;		&lt;/span&gt;app = new RatpackApp()&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre; &quot;&gt;	&lt;/span&gt;app.prepareScriptForExecutionOnApp(
fullScriptPath&amp;nbsp;)&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;}&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;mimetypesFileTypeMap.addMimeTypes(this.class.getResourceAsStream('mime.types').text)&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre; &quot;&gt;	&lt;/span&gt;}&lt;/div&gt;&lt;div&gt;&amp;nbsp; }&lt;/div&gt;&lt;/div&gt;&lt;div&gt;}&lt;/div&gt;&lt;/blockquote&gt;&lt;div&gt;cf) mime.types 파일도 위 클래스와 같은 위치에 있어야 합니다. (없으면 에러 나죠.. )&lt;/div&gt;&lt;div&gt;cf) 새로 만들었으면 web.xml 의 servlet-class 이름도 바꿔주어야 합니다. 이제부터는 application groovy 파일을&amp;nbsp;WEB-INF 아래부터 원하는 경로로 배치하면 됩니다. ( WEB-INF 밑으로 잡은 이유는... 웹에서 직접 접근이 안되는 곳이니까요. )&lt;/div&gt;&lt;div&gt;&lt;blockquote class=&quot;tx-quote-tistory&quot;&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;lt;servlet-class&amp;gt;com.yourcompany.yourpkgname.RatpackExtendServlet&amp;lt;/servlet-class&amp;gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;param-value&amp;gt;ratpack/hello.groovy&amp;lt;/param-value&amp;gt;&amp;lt;!-- &amp;nbsp;WEB-INF/ratpack/hello.groovy &amp;nbsp;--&amp;gt;&lt;/div&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;div&gt;4. &amp;nbsp;write your application&amp;nbsp;&lt;/div&gt;&lt;div&gt;ex) /WEB-INF/ratpack/hello.groovy&lt;/div&gt;&lt;div&gt;&lt;div&gt;set 'port', 8282 &amp;nbsp;// jetty 에서 쓸때만 적용됨.&amp;nbsp;&lt;/div&gt;&lt;div&gt;get(&quot;/&quot;) {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; def ua = headers['user-agent']&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &quot;Hello, World! ${ua}&quot;&lt;/div&gt;&lt;div&gt;}&lt;/div&gt;&lt;div&gt;get(&quot;/person/:personid&quot;) { // path parameter sample&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;&quot;This is the page for person ${urlparams.personid}&quot;&lt;/div&gt;&lt;div&gt;}&lt;/div&gt;&lt;div&gt;get(&quot;/person&quot;){ // paramter sample&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;&quot;this is your param ${params}&quot;&lt;/div&gt;&lt;div&gt;}&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;p style=&quot;text-align: left; clear: none; float: none; &quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 284px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/1707E3485011FCA622&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F1707E3485011FCA622&quot; width=&quot;284&quot; height=&quot;454&quot; filename=&quot;capture.png&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;hello.groovy &amp;nbsp;파일이 바로 ratapck application&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;5. 배포 및 테스트 (war로 만들어도 됨.)&lt;/div&gt;&lt;div&gt;ant task&lt;/div&gt;&lt;div&gt;&amp;lt;target name=&quot;ratpack-deploy&quot;&amp;gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;&amp;lt;war destfile=&quot;dist/${ant.project.name}.war&quot; webxml=&quot;${web.dir}/WEB-INF/web.xml&quot;&amp;gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;&amp;lt;fileset dir=&quot;${web.dir}&quot;&amp;gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;				&lt;/span&gt;&amp;lt;exclude name=&quot;**/*test/**&quot;/&amp;gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;&amp;lt;/fileset&amp;gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;&amp;lt;/war&amp;gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&amp;lt;/target&amp;gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;6. 확인.&lt;/div&gt;&lt;div&gt;앗 썰렁해.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;p style=&quot;text-align: center; clear: none; float: none; &quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 516px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/19628F3F5011F1AC29&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F19628F3F5011F1AC29&quot; width=&quot;516&quot; height=&quot;173&quot; filename=&quot;capture.png&quot; filemime=&quot;image/jpeg&quot; style=&quot;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;기타. 에러페이지는 다음과 같습니다. &amp;nbsp;( def x = 1 /0 ; 을 실행하게 했음.&amp;nbsp;)&amp;nbsp;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;p style=&quot;text-align: center; clear: none; float: none; &quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 625px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/191D92405011F13317&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F191D92405011F13317&quot; width=&quot;625&quot; height=&quot;368&quot; filename=&quot;capture.png&quot; filemime=&quot;image/jpeg&quot; style=&quot;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;- 평가&lt;/div&gt;&lt;div&gt;GOOD :&amp;nbsp;&lt;/div&gt;&lt;div&gt;쉽고 가볍다. &amp;nbsp;(Grails는 Spring Hibernate 같은 거인들 위에 올라타 앉아서 보기엔 쉽지만 까보면 복잡하다는 단점이 있다. 사실 그 모든기능이 필요하진 않을수도 있는데.)&lt;/div&gt;&lt;div&gt;간단한 REST SERVICE 만들때 편하겠다.&amp;nbsp;&lt;/div&gt;&lt;div&gt;앞으로 성장 가능성이 있다.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;BAD :&amp;nbsp;&lt;/div&gt;&lt;div&gt;URL 바인딩이 늘어날 경우 한개 파일에 들어가 복잡해진다. ( &amp;nbsp;당연히 분리/모듈화가 진행될듯)&amp;nbsp;&lt;/div&gt;&lt;div&gt;아직 베타라서 장난감 수준이 아닌가 싶다.&amp;nbsp;Sinatra 수준이 되려면 좀 걸리겠다.&amp;nbsp;&lt;/div&gt;&lt;div&gt;충분히 성장할 수 있을까? 글쎄... ratpack 자체는 아닐 수 있지만 경량화는 추세인듯.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;ANOTHER THINKING:&lt;/div&gt;&lt;div&gt;최근의 기술 경향은 유연하고 확장성 있는 범용 시스템을 제공하기보다는,&lt;/div&gt;&lt;div&gt;특정 도메인의&amp;nbsp;필요에 따라 적절한 기능과 성능을 제공하는 SMART한 시스템을 추구하는 경향이 보인다.&amp;nbsp;&lt;/div&gt;&lt;div&gt;Ratpack도 그렇고, 이벤트방식의 vert.x 도 그렇고...&amp;nbsp;&lt;/div&gt;&lt;div&gt;기술 트렌드에 대해 계속 관심을 가져야 겠다는 생각을....&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;참고자료 :&amp;nbsp;&lt;/div&gt;&lt;div&gt;Presentation : Ratpack (&amp;nbsp;Classy and Compact Groovy WebApps ) -&amp;nbsp;JamesWilliams&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;http://www.slideshare.net/ecspike/ratpack-classy-and-compact-groovy-web-apps&quot;&gt;http://www.slideshare.net/ecspike/ratpack-classy-and-compact-groovy-web-apps&lt;/a&gt;
&lt;/div&gt;&lt;div&gt;동영상 : http://www.infoq.com/presentation/Ratpack&amp;nbsp;&lt;/div&gt;&lt;div&gt;샘플 :&amp;nbsp;&lt;a href=&quot;https://github.com/jwill/Conference-Demos/tree/master/strangeloop/2011&quot;&gt;https://github.com/jwill/Conference-Demos/tree/master/strangeloop/2011&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;</description>
      <category>IT</category>
      <category>Eclipse</category>
      <category>Groovy</category>
      <category>ratpack</category>
      <category>Tutorial</category>
      <category>webapp</category>
      <author>smplnote</author>
      <guid isPermaLink="true">https://smplnote.tistory.com/308</guid>
      <comments>https://smplnote.tistory.com/308#entry308comment</comments>
      <pubDate>Fri, 27 Jul 2012 11:29:33 +0900</pubDate>
    </item>
    <item>
      <title>ORA-28001 the password has expired</title>
      <link>https://smplnote.tistory.com/307</link>
      <description>&lt;p&gt;어느날 찾아온 ORA-28001&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;XE를 쓰고 있으니 License 만료일리는 만무고..&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;패스워드 변경할때가 다 됐다는 얘기.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;조치방법&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;sqlplus 같은걸로..&amp;nbsp;connect 하면 로그인 되면서 password 변경하라고 나온다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;그다음에.. 다시 원래 암호로 하고 싶으면...&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;alter user XXXXUSER identified by 새암호.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>IT</category>
      <category>ora-28001</category>
      <category>oracle</category>
      <author>smplnote</author>
      <guid isPermaLink="true">https://smplnote.tistory.com/307</guid>
      <comments>https://smplnote.tistory.com/307#entry307comment</comments>
      <pubDate>Wed, 25 Jul 2012 17:21:19 +0900</pubDate>
    </item>
    <item>
      <title>[java] springmvc document auto generation (try)</title>
      <link>https://smplnote.tistory.com/306</link>
      <description>&lt;p&gt;[배경]&amp;nbsp;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;- 문서따로 소스따로를 해결하고 싶었다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;- 매번 변경이 생길때마다 둘다를 손보는건 번거롭다.&lt;/p&gt;&lt;p&gt;- 구글은 REST Java 에 대해&amp;nbsp;소스로부터 문서 자동 생성으로 방향을 잡았다고 들었다.&lt;/p&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;p&gt;[전제사항]&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;- Spring MVC 를 쓰고 있다. (혹은 annotation에 기반한 개발을 하고 있다.. )&lt;/p&gt;&lt;p&gt;- 대상 클래스들이 classpath에 포함되어 있어야 한다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;[처리흐름]&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;1. filter Controller class //&amp;nbsp;자바소스 중에서 Controller, RequestMapping Annotation을 가진 class들을 추출한다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;2. filter RequestMapping Method // 추출된 class들에서&amp;nbsp;RequestMapping&amp;nbsp;Annotation을 가진&amp;nbsp;method들을 추출한다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;3. get return type // 추출된 method에서 return type을 가져온다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; // method.getGenericReturnType()&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;4. get request mapping method // 사용하고 있다면 mapping method&amp;nbsp;값도 가져온다. (cf. REST)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;5. filter&amp;nbsp;RequestParam arguments // method 의&amp;nbsp;RequestParam&amp;nbsp;으로 정의한&amp;nbsp;parameter 정보도 추출한다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;6. do pretty print // 예쁘게 출력한다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;[출력결과 샘플]&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;### XXXXX Specification Document&lt;/p&gt;&lt;p&gt;### Created Mon Jul 23 09:12:08 KST 2012 ###&lt;/p&gt;&lt;p&gt;============================&lt;/p&gt;&lt;p&gt;Resource : xxxxxxx&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;GET&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;URI : &amp;lt;BASE_URL&amp;gt;/xxxxxxx/{xxxxxxid}&lt;/p&gt;&lt;p&gt;PAREMETERS : N/A&lt;/p&gt;&lt;p&gt;RETURN : Sample&lt;/p&gt;&lt;p&gt;RETURN DETAIL :&lt;/p&gt;&lt;p&gt;{&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &quot;Sample&quot;: [&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;ID&quot;: &quot;long&quot;,&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;Name&quot;: &quot;String&quot;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;]&lt;/p&gt;&lt;p&gt;}&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;[회고]&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;1. java,&amp;nbsp;Spring이 제공하는 Annotation 만으로는 문서를 만드는데 필요한 충분한 정보가 부족하더라.&lt;/p&gt;&lt;p&gt;ex. description, 예외처리정보 등... =&amp;gt; 개발초기에 custom annotation 을 고려해야겠더라.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;2. 엑셀, 워드로 뽑아주려고 했더니 회사 문서보안시스템이 허용하지 않더라.&amp;nbsp;&lt;/p&gt;&lt;p&gt;혹시 누군가 필요로 한다면 MS가 추가한 xml의 축복을 누리시길. ( http://www.docx4java.org )&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;3. 재미나는 작업이었지만 결국 실제적인 도움을 주지는 못했다. (자동생성하기에는 담을 수 있는&amp;nbsp;내용이 부족했다.) =&amp;gt; 다음엔 좀더 가치있게 되도록 사전에 고려를..&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;4. 반대로 Spec 문서에서 Skeleton 코드를 생성할 수도 있지 않을까...&amp;nbsp;&lt;/p&gt;&lt;p&gt;(가능은 하지만 당장은&amp;nbsp;One source, Multi use 를 하는게 더 정신건강에 이로울듯 싶다. )&amp;nbsp;&lt;/p&gt;</description>
      <category>IT</category>
      <category>annotation</category>
      <category>documentation</category>
      <category>docx4java</category>
      <category>springMVC</category>
      <author>smplnote</author>
      <guid isPermaLink="true">https://smplnote.tistory.com/306</guid>
      <comments>https://smplnote.tistory.com/306#entry306comment</comments>
      <pubDate>Mon, 23 Jul 2012 09:24:25 +0900</pubDate>
    </item>
  </channel>
</rss>