<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;AkIMSHoycCp7ImA9WhRUFU4.&quot;"><id>tag:blogger.com,1999:blog-7852536510622031749</id><updated>2012-01-26T09:43:09.498+09:00</updated><category term="mail" /><category term="proxy" /><category term="backup_restore" /><category term="jdbc" /><category term="java" /><category term="cygwin" /><category term="process" /><category term="cccq" /><category term="ram" /><category term="feature4.0" /><category term="scm" /><category term="tomcat" /><category term="rqm" /><category term="ccrc" /><category term="db2" /><category term="clm" /><category term="rest" /><category term="testrt" /><category term="purify" /><category term="rpe" /><category term="ldap" /><category term="scrum" /><category term="agile" /><category term="git" /><category term="ha" /><category term="jaf" /><category term="log" /><category term="tuning" /><category term="license" /><category term="gcc" /><category term="ppt" /><category term="servlet" /><category term="was" /><category term="eclipse" /><category term="caching" /><category term="cmd" /><category term="workitem" /><category term="json" /><category term="plainJavaLib" /><category term="oslc-cm" /><category term="rtc" /><category term="oslc" /><title>풍차의 블로그</title><subtitle type="html" /><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://poongcha.blogspot.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://poongcha.blogspot.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/7852536510622031749/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>풍차</name><uri>http://www.blogger.com/profile/10628167383220311152</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="23" height="32" src="http://2.bp.blogspot.com/_icOPzB_w_RA/SinjXnz8NRI/AAAAAAAAABA/13rtJajEtZI/S220/%EC%9A%B0%EB%B6%84%ED%88%AC.png" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>195</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/blogspot/icXPN" /><feedburner:info uri="blogspot/icxpn" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry gd:etag="W/&quot;CU4DRnY_eSp7ImA9WhRVE04.&quot;"><id>tag:blogger.com,1999:blog-7852536510622031749.post-8417931266285322518</id><published>2012-01-12T11:06:00.001+09:00</published><updated>2012-01-12T11:06:17.841+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-12T11:06:17.841+09:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="testrt" /><title>TESTRT - TP.dll 또는 TP.so 사용법</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/-gBskUO2kZxXdhyoVLjGY7iuU5o/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/-gBskUO2kZxXdhyoVLjGY7iuU5o/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/-gBskUO2kZxXdhyoVLjGY7iuU5o/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/-gBskUO2kZxXdhyoVLjGY7iuU5o/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;
* c/cpp 혼합인 경우에 쓸수 있는 환경변수&lt;br /&gt;
&amp;nbsp; &amp;nbsp; ATL_FORCE_C &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; is off (default)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; ATL_FORCE_CPLUSPLUS is off (default)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; ATL_FORCE_C_TDP &amp;nbsp; &amp;nbsp; is off (default)&lt;br /&gt;
&lt;br /&gt;
* tp.dll 또는 tp.so 등 공유라이브러리 사용시 쓸수 있는 환경변수&lt;br /&gt;
&amp;nbsp; &amp;nbsp; ATL_NO_TDP_COMPILE &amp;nbsp;is off (default)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; ATL_SHARED_TDP &amp;nbsp; &amp;nbsp; &amp;nbsp;is off (default)&lt;br /&gt;
&lt;br /&gt;
ATL_NO_TDP_COMPILE&lt;br /&gt;
If set, the Target Deployment Port Library is never compiled, even at link time&lt;br /&gt;
ATL_SHARED_TDP&lt;br /&gt;
If set and used in conjunction with ATL_NO_TDP_COMPILE, it must contain&lt;br /&gt;
the name of the shared library containing the TP.o[bj] file to be put&lt;br /&gt;
in place of TP.o[bj] on the link command line&lt;br /&gt;
&lt;br /&gt;
1) attolcc를 사용하는 경우 예제&lt;br /&gt;
On Suse 7.2 or RedHat 7.2&lt;br /&gt;
cmd&amp;gt; attolcc -force_tdp_cc --cflags=-fPIC&lt;br /&gt;
cmd&amp;gt; ld -shared -rpath `pwd` TP.o -o TP.so&lt;br /&gt;
cmd&amp;gt; export ATL_NO_TDP_COMPILE=on&lt;br /&gt;
cmd&amp;gt; export ATL_SHARED_TDP=TP.so&lt;br /&gt;
cmd&amp;gt; attolcc -- cc -g -o toto toto.c&lt;br /&gt;
cmd&amp;gt; ldd ./toto&lt;br /&gt;
TP.so =&amp;gt; TP.so (0x40018000)&lt;br /&gt;
libc.so.6 =&amp;gt; /lib/libc.so.6 (0x40039000)&lt;br /&gt;
/lib/ld-linux.so.2 =&amp;gt; /lib/ld-linux.so.2 (0x40000000)&lt;br /&gt;
&lt;br /&gt;
On SuSe 8.0&lt;br /&gt;
cmd&amp;gt; attolcc -force_tdp_cc --cflags=-fPIC&lt;br /&gt;
cmd&amp;gt; ld -Wl,-rpath,. TP.o -o TP.so&lt;br /&gt;
cmd&amp;gt; export ATL_NO_TDP_COMPILE=on&lt;br /&gt;
cmd&amp;gt; export ATL_SHARED_TDP=TP.so&lt;br /&gt;
cmd&amp;gt; attolcc -- cc -g -o toto toto.c&lt;br /&gt;
cmd&amp;gt; ldd ./toto&lt;br /&gt;
TP.so =&amp;gt; TP.so (0x40018000)&lt;br /&gt;
libc.so.6 =&amp;gt; /lib/libc.so.6 (0x40039000)&lt;br /&gt;
/lib/ld-linux.so.2 =&amp;gt; /lib/ld-linux.so.2 (0x40000000)&lt;br /&gt;
&lt;br /&gt;
2) 일반적인 빌드 경우 예제 - 다소 옛날식...&lt;br /&gt;
&lt;br /&gt;
[build.bat]&lt;br /&gt;
------------------------------------------------------------------------&lt;br /&gt;
del *.exe *.dll *.obj *.fdc *.tsf *.tpf *.tqf *.tdf *.tio *.spt *.pdb *.ilk *.lib *.idb *.exp Products.h&lt;br /&gt;
set CC=cl /MDd /Zi &amp;nbsp;&lt;br /&gt;
set LD=link /INCREMENTAL:NO /debug&lt;br /&gt;
&lt;br /&gt;
rem compil the dll sources&lt;br /&gt;
%CC% -c mydll.cpp&lt;br /&gt;
%CC% -c mydll2.cpp&lt;br /&gt;
&lt;br /&gt;
rem generate the dll&lt;br /&gt;
%LD% /dll /machine:I386 /out:"mydll.dll" &amp;nbsp;mydll.obj&lt;br /&gt;
%LD% /dll /machine:I386 /out:"mydll2.dll" mydll2.obj&lt;br /&gt;
&lt;br /&gt;
rem compil the main application&lt;br /&gt;
%CC% -c example.c&lt;br /&gt;
&lt;br /&gt;
rem link the main app with its dll&lt;br /&gt;
%LD% example.obj&lt;br /&gt;
&lt;br /&gt;
rem run app without any instrumentation&lt;br /&gt;
example.exe&lt;br /&gt;
pause&lt;br /&gt;
&lt;br /&gt;
del *.exe *.dll *.obj *.pdb *.ilk *.lib *.idb *.exp&lt;br /&gt;
&lt;br /&gt;
rem do the same thing with instrumentation&lt;br /&gt;
set ATLTGT=%TESTRTDIR%\targets\cvisual6&lt;br /&gt;
set OPTIONS=-proc=ret -block=implicit -mempro&lt;br /&gt;
set CC=%ATLTGT%\cmd\attolcc %OPTIONS% -verbose -force_tdp_cc -- %CC% -DRTRT_RMDLL&lt;br /&gt;
set ATL_SHARED_TDP=TP.lib&lt;br /&gt;
set LD=%ATLTGT%\cmd\attolcc %OPTIONS% -verbose -force_tdp_cc -- %LD%&lt;br /&gt;
rem make the TP.dll&lt;br /&gt;
&lt;br /&gt;
rem compil the dll sources and the TP thanks to -force_tdp_cc&lt;br /&gt;
%CC% -DRTRT_UNLOADABLE -DRTRT_RMDLL -c mydll.cpp&lt;br /&gt;
%CC% -DRTRT_UNLOADABLE -DRTRT_RMDLL -c mydll2.cpp&lt;br /&gt;
&lt;br /&gt;
rem generate the TPdll.dll&lt;br /&gt;
del tp.obj&lt;br /&gt;
cl -c -DRTRT_RMDLL -I. "%ATLTGT%\lib\tpdll.cpp"&lt;br /&gt;
link /INCREMENTAL:NO /dll /debug /machine:I386 /out:"TP.dll" /implib:"TP.lib" TPdll.obj&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
rem generate the dll&lt;br /&gt;
%LD% /dll /machine:I386 /out:"mydll.dll" &amp;nbsp;mydll.obj&lt;br /&gt;
%LD% /dll /machine:I386 /out:"mydll2.dll" mydll2.obj&lt;br /&gt;
&lt;br /&gt;
rem compil the main application&lt;br /&gt;
%CC% -c example.c&lt;br /&gt;
&lt;br /&gt;
rem link the main app with its dll&lt;br /&gt;
%LD% example.obj&lt;br /&gt;
&lt;br /&gt;
rem run app with instrumentation&lt;br /&gt;
example.exe&lt;br /&gt;
&lt;br /&gt;
atlsplit atlout.spt&lt;br /&gt;
rem studio *.fdc *.tsf *.tpf *.tqf *.tdf *.tio&lt;br /&gt;
------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
3) TestRT GUI이용시 예제&lt;br /&gt;
TestMyLib-&amp;gt;Settings-&amp;gt;Build-&amp;gt;Target Deployment Port-&amp;gt;TDP output format : Dynamic Libary&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7852536510622031749-8417931266285322518?l=poongcha.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/icXPN/~4/0PcUTqOd88w" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://poongcha.blogspot.com/feeds/8417931266285322518/comments/default" title="댓글" /><link rel="replies" type="text/html" href="http://poongcha.blogspot.com/2012/01/testrt-tpdll-tpso.html#comment-form" title="0개의 덧글" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7852536510622031749/posts/default/8417931266285322518?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7852536510622031749/posts/default/8417931266285322518?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/icXPN/~3/0PcUTqOd88w/testrt-tpdll-tpso.html" title="TESTRT - TP.dll 또는 TP.so 사용법" /><author><name>풍차</name><uri>http://www.blogger.com/profile/10628167383220311152</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="23" height="32" src="http://2.bp.blogspot.com/_icOPzB_w_RA/SinjXnz8NRI/AAAAAAAAABA/13rtJajEtZI/S220/%EC%9A%B0%EB%B6%84%ED%88%AC.png" /></author><thr:total>0</thr:total><feedburner:origLink>http://poongcha.blogspot.com/2012/01/testrt-tpdll-tpso.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Dk8BRXo6fSp7ImA9WhRVEUw.&quot;"><id>tag:blogger.com,1999:blog-7852536510622031749.post-8738660359216817871</id><published>2012-01-09T22:14:00.000+09:00</published><updated>2012-01-09T22:14:14.415+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-09T22:14:14.415+09:00</app:edited><title>openSUSE - vmware-config-tools.pl 요구사항</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/vjwKeIcSuAWHQOtWVVPO0a7zJDI/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/vjwKeIcSuAWHQOtWVVPO0a7zJDI/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/vjwKeIcSuAWHQOtWVVPO0a7zJDI/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/vjwKeIcSuAWHQOtWVVPO0a7zJDI/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;
&lt;br /&gt;
1. Become root&lt;br /&gt;
2. Install gcc, kernel-source, kernel-syms, make, binutils&lt;br /&gt;
# yast2 --install gcc kernel-source kernel-syms make binutils&lt;br /&gt;
3. cd /usr/src/linux&lt;br /&gt;
4. make cloneconfig&lt;br /&gt;
5. make modules_prepare&lt;br /&gt;
&lt;br /&gt;
That should generate the kernel-headers that /usr/bin/vmware-config-tools.pl requires.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7852536510622031749-8738660359216817871?l=poongcha.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/icXPN/~4/veXn4fYCaUs" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://poongcha.blogspot.com/feeds/8738660359216817871/comments/default" title="댓글" /><link rel="replies" type="text/html" href="http://poongcha.blogspot.com/2012/01/opensuse-vmware-config-toolspl.html#comment-form" title="0개의 덧글" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7852536510622031749/posts/default/8738660359216817871?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7852536510622031749/posts/default/8738660359216817871?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/icXPN/~3/veXn4fYCaUs/opensuse-vmware-config-toolspl.html" title="openSUSE - vmware-config-tools.pl 요구사항" /><author><name>풍차</name><uri>http://www.blogger.com/profile/10628167383220311152</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="23" height="32" src="http://2.bp.blogspot.com/_icOPzB_w_RA/SinjXnz8NRI/AAAAAAAAABA/13rtJajEtZI/S220/%EC%9A%B0%EB%B6%84%ED%88%AC.png" /></author><thr:total>0</thr:total><feedburner:origLink>http://poongcha.blogspot.com/2012/01/opensuse-vmware-config-toolspl.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUAASXw9cCp7ImA9WhRVEUU.&quot;"><id>tag:blogger.com,1999:blog-7852536510622031749.post-3523969833407565309</id><published>2012-01-09T22:12:00.000+09:00</published><updated>2012-01-10T17:22:28.268+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-10T17:22:28.268+09:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="purify" /><title>Purify - 기본 사용법</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/rlDKzuH3AURNeg5ZZF8nGLM-9KE/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/rlDKzuH3AURNeg5ZZF8nGLM-9KE/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/rlDKzuH3AURNeg5ZZF8nGLM-9KE/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/rlDKzuH3AURNeg5ZZF8nGLM-9KE/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;출처 :&amp;nbsp;&lt;a href="http://www.ibm.com/developerworks/rational/library/06/0822_satish-giridhar/"&gt;http://www.ibm.com/developerworks/rational/library/06/0822_satish-giridhar/&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Purify는 프로그램 실행 분석을 통해 프로그램에서 발생하는 메모리 에러를 탐지합니다. 프로그램의 적절한 위치에 추가코드를 삽입한 후 해당 프로그램의 실행을 통해 메모리에 대한 데이터 수집 및 검증을 수행합니다. 메모리 체크 실패시 해당 에러를 보고를 하며, 프로그램 종료시점에 메모리 누수 블럭에 대한 스캔을 수행합니다(물론 중간에 누수 스캔 요청을 할 수 있습니다).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Purify는 프로그램과 라이브러리 오브젝트 코드에 삽입을 합니다. 이 과정을 오브젝트 코드 삽입 object code instrumentation (OCI)이라 합니다. Purify는 오브젝트 코드에 삽입을 하며, 소스코드에 삽입하는 것이 아님을 알아두시기 바랍니다. 때문에 소스코드가 없는 써드파티 라이브러리에 대한 메모리 체크가 가능합니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
여러분의 코드를 디버그 옵션으로 컴파일한다면, Purify는 디버그 정보를 활용하여 에러를 소스라인과 연계할 수 있으며, 에러 보고시에 관련 코드를 보여줄 수 있습니다. 디버그 정보를 포함하지 않는 부분에는, 에러를 오브젝트 코드 정보, 예를 들어 프로그램 카운터(PC), 명령어 등과 에러를 연계할 수 있습니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Purify는 메모리 사용 에러와 함께 함수 콜 체인 정보를 보고합니다. 써드파티 라이브러리에서 에러가 발생한 경우에도, 여러분의 소스코드로 부터 라이브러리에 있는 함수를 호출할겁니다. 그러므로 콜 체인에서 소스있는 디버그 정보를 통해 여러분의 코드 어느부분에서 해당 라이브러리 함수를 호출했는 지 파악할 수 있습니다. 이는 에러가 발생한 경우에 대한 귀중한 단서를 제공합니다. 이러한 정보로 부터, 에러가 여러분의 코드에서 발생한 것인지(예를 들어, 초기화하지 않은 인자를 라이브러리에 넘긴 경우) 아니면 써드파티 라이브러리에서 발생한 것인지(예를 들어 라이브러리에 초기화하지 않은 변수가 있는 경우)를 분석할 수 있습니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Purify는 다음 단계들과 관련있습니다: &lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;디버그 옵션으로 여러분의 코드를 컴파일합니다&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Purify를 이용해 바이너리에 오브젝트 코드를 삽입합니다&amp;nbsp;&lt;/li&gt;
&lt;li&gt;삽입처리된 프로그램을 실행합니다&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Purify가 보고한 에러를 조사하고 수정합니다&amp;nbsp;&lt;/li&gt;
&lt;/ol&gt;
&lt;br /&gt;
&lt;br /&gt;
삽입처리 과정은 윈도우즈와 유닉스 플랫폼 간 차이점이 있습니다. 플랫폼별 Purify에 대한&amp;nbsp;사용방법은 아래 내용을 참고합니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;span style="font-size: large;"&gt;윈도우즈 플랫폼에서의 Purify 사용방법&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
윈도우즈 플랫폼에서, Purify를 사용하는 방법은 두가지 방법이 있습니다: &lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;첫번째 방법: Purify를 Microsoft® Visual Studio® IDE에 통합 설치를 하고, Purify 연계 또는 비연계를 버튼으로 지정할 수 있습니다. Purify를 연계한 경우, 프로젝트 빌드를 하면, Purify는 자동으로 빌드하는 실행파일에 삽입처리를 합니다. 해당 프로그램을 실행하면, Purify의 에러체크 코드가 실행되고 IDE에 에러를 메모리사용 통계와 함께 보고합니다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;두번째 방법: Purify GUI를 사용하여 프로그램 삽입처리 및 다양한 삽입처리 옵션 설정을 합니다. 삽입처리된 프로그램을 실행하면, Purify GUI 내 윈도우에 에러를 표시합니다. 아래에서는 프로그램 삽입처리, 삽입처리된 프로그램 실행, 보고된 에러조사 등의 단계에 대해 기술합니다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;br /&gt;
Purify는 "정밀" 에러체크를 위해서 Visual Studio의 디폴트 설정에서 만들지 않는 재배치 정보를 필요로 합니다. &lt;b&gt;/fixed:no&lt;/b&gt; 와 &lt;b&gt;/incremental:no&lt;/b&gt; 등의 링커 옵션을 사용하면 재배치 정보를 추가할 수 있습니다. 재배치 정보가 없는 경우, Purify는 "최소" 에러체크를 시행합니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
프로그램에 대한 삽입처리 및 실행을 하기 위해, 먼저 Purify를 띄우고 아래 단계를 따릅니다: &lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;memerrors.c 파일 (&lt;a href="http://www.ibm.com/developerworks/rational/library/06/0822_satish-giridhar/#download"&gt;Download&lt;/a&gt; 참조)을 디버그옵션을 이용해 컴파일하고 실행 프로그램을 생성합니다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;File &amp;gt; Run&lt;/b&gt;을 선택하여 &lt;b&gt;Run Program&lt;/b&gt; 대화상자 (Figure 1) 를 띄웁니다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Program name&lt;/b&gt; 상자에 실행 파일 경로를 지정합니다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Collect &lt;/b&gt;옵션에서 &lt;b&gt;Error and leak data&lt;/b&gt; 선택 버튼을 클릭합니다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;프로그램 실행 후에도 콘솔을 유지하기 위해 &lt;b&gt;Pause console after exit&lt;/b&gt; 체크 박스를 선택합니다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;(옵션) &lt;b&gt;Settings&lt;/b&gt;를 클릭하여 Purify 설정을 변경합니다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Run&lt;/b&gt;을 클릭합니다.&amp;nbsp;&lt;/li&gt;
&lt;/ol&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Figure 1. Run Program dialog to instrument an executable program&lt;/b&gt;&lt;br /&gt;
&lt;img src="http://www.ibm.com/developerworks/rational/library/06/0822_satish-giridhar/fig-PurifyWinRun72dpi.jpg" /&gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Purify는 바이너리 파일을 삽입처리하고 프로그램을 실행합니다. Figure 2와 같이 프로그램 및 관련 라이브러리들에 대한 삽입처리 과정을 보여줍니다. &lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Figure 2. Instrumentation Progress of the executable and DLLs&lt;/b&gt;&lt;br /&gt;
&lt;img src="http://www.ibm.com/developerworks/rational/library/06/0822_satish-giridhar/fig-PurifyWinProgress72dpi.jpg" /&gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
삽입처리가 끝나면, 프로그램을 실행됩니다. 실행 중, Purify는 탐지한 메모리 엑세스 에러를 보고합니다. 말미에, Purify는 메모리 누수에 대한 보고를 합니다. Figure 3에서 처럼 Purify 에러와 누수 보고서를 보여줍니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Figure 3. Memory errors found by Purify (on Windows)&lt;/b&gt;&lt;br /&gt;
&lt;img src="http://www.ibm.com/developerworks/rational/library/06/0822_satish-giridhar/fig-PurifyWinErrorReport72d.jpg" /&gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Purify는 에러, 경고, 메모리 누수에 대한 요약 등을 보고합니다. 에러를 클릭하면, 통계, 스택 추적, 라인 번호 등 자세한 정보를 알수있습니다. 예를 들어, array bounds read (ABR) 에러를 클릭하면, 에러 위치와 메모리 할당 위치를 볼수 있습니다(Figure 4). 에러 위치의 소스코드를 보면, ABR 에러가 memerrors.c 파일의 100번째 라인 즉, 스트링 str이 printf 함수로 전달되는 라인에서 발생했습니다. printf 함수는 스트링 str을 NULL바이트를 만날때까지 처리합니다. 여기서는 printf 함수 호출 전에, name으로 부터 10바이트를 str로 복사를 했고,&amp;nbsp;str[11]에 NULL을 설정하여 스트링을 끝처리 했습니다. 그래서 printf는 필시 11 바이트를 읽게 되었습니다. 메모리 할당 위치를 보면, memerrors.c 파일의 107 라인에서 str은 10개의 문자를 갖도록 할당되었습니다. 이를 종합해 보면, str[11]은 배열의 범위 밖을 엑세스하게 되어, array bounds read (ABR) 에러가 발생한 것입니다. 이는 NULL 문자열 끝처리와 배열의 크기에 관련된 오해에서 비롯된 전형적인 에러입니다. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Figure 4. Details of ABR error including source code and line number information (on Windows)&lt;/b&gt;&lt;br /&gt;
&lt;img src="http://www.ibm.com/developerworks/rational/library/06/0822_satish-giridhar/fig-PurifyWinABR72dpi.jpg" /&gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Purify가 보고한 각각의 에러를 조사합니다. Purify가 제공한 상세한 정보의 도움을 받아, 에러에 대한 디버그와 수정작업을 합니다. 결함 수정 후에는 다시 Purify를 실행하여 에러가 없다는 것을 검증합니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Purify는 다양한 맞춤 설정 옵션을 통해서 여러분의 요구에 맞는 분석 유형에 탄력적으로 대응합니다. 여러분이 수정할 수 없는 써드파티 라이브러리에서 발생하는 에러를 보고에서 억제하는 방법 또한 제공합니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
아래 단계는 윈도우즈 플랫폼에서 UMC 에러, 그와 관련된 스택 변수를 명시하기 위한 단계를 제시합니다: &lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;&lt;b&gt;Run Program&lt;/b&gt; 대화상자(Figure 1)에서 &lt;b&gt;Settings&lt;/b&gt;를 클릭합니다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Errors and Leaks&lt;/b&gt; 탭에서 &lt;b&gt;Show UMC messages&lt;/b&gt; (Figure 5)를 체크합니다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Files&lt;/b&gt; 탭에서 &lt;b&gt;Additional options&lt;/b&gt; 박스 (Figure 6)에 &lt;b&gt;-stack-load-checking&lt;/b&gt;을 입력하여, Purify가 스택변수에 UMR 에러를 체크하도록 합니다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;OK&lt;/b&gt;를 클릭하고 &lt;b&gt;Run&lt;/b&gt;을 클릭합니다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Purify가 실행하면 UMC 메모리 사용 에러를 보고합니다(Figure 3).&amp;nbsp;&lt;/li&gt;
&lt;/ol&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Figure 5. Tick the Checkbox "Show UMC messages" in the Settings dialog (on Windows)&lt;/b&gt;&lt;br /&gt;
&lt;img src="http://www.ibm.com/developerworks/rational/library/06/0822_satish-giridhar/fig-PurifyWinSettingsUmc72d.jpg" /&gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Figure 6. Additional options to check UMR errors on stack variables (on Windows)&lt;/b&gt;&lt;br /&gt;
&lt;img src="http://www.ibm.com/developerworks/rational/library/06/0822_satish-giridhar/fig-PurifyWinSettingsAdd.jpg" /&gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
여러분은 필터를 정의하여 관심없는 에러 보고를 억제할 수 있습니다. Purify 좌측 영역에서, &lt;b&gt;Run&lt;/b&gt;을 우클릭하고 &lt;b&gt;Filter Manager&lt;/b&gt; 대화상자를 선택합니다 (Figure 7). Purify는 특정 에러 유형, 특정 콜 스택상의 또는 특정 라이브러리의 에러에 대한 억제할 수 있는 기능을 제공합니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Figure 7. Invoking Filter Manager to suppress uninteresting errors (on Windows)&lt;/b&gt;&lt;br /&gt;
&lt;img src="http://www.ibm.com/developerworks/rational/library/06/0822_satish-giridhar/fig-PurifyWinFilter72dpi.jpg" /&gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Purify 기능에 관련된 자세한 내용은 &lt;b&gt;Help &lt;/b&gt;메뉴을 참고합니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: large;"&gt;&lt;b&gt;유닉스/리눅스 플랫폼에서의 Purify 사용방법&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
UNIX 플랫폼상에서는 프로그램을 삽입처리하는 다양한 방법이 있습니다. 가장 간단한 방법은 프로그램 빌드하는 커맨드라인에 &lt;b&gt;purify&lt;/b&gt;를 접두어로 추가하는 방법입니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
예를 들어, 아래와 같이 memerrors.c (&lt;a href="http://www.ibm.com/developerworks/rational/library/06/0822_satish-giridhar/#download"&gt;Download&lt;/a&gt; 참조)파일을 빌드하여 a.out를 생성합니다:&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;ksh% cc -g memerrors.c&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
여기에 &lt;b&gt;purify&lt;/b&gt;를 접두어로 추가시키면, 삽입처리된 a.out을 빌드합니다:&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;ksh% purify cc -g memerrors.c&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
만약 Makefile를 이용해 프로그램을 빌드한다면, 삽입처리용 빌드타겟을 추가할 수 있습니다:&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;a.out: foo.c bar.c&lt;br /&gt;&amp;nbsp; &amp;nbsp; $(CC) $(FLAGS) -o $@ $?&lt;br /&gt;a.out.pure: foo.c bar.c&lt;br /&gt;&amp;nbsp; &amp;nbsp; purify $(CC) $(FLAGS) -o $@ $?&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
빌드 타켓을 복사하는 경우 아래 두가지 변경만이 필요합니다 (위의 a.out의 경우):&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;빌드 타겟 이름을 변경합니다 (a.out.pure).&amp;nbsp;&lt;/li&gt;
&lt;li&gt;빌드 타켓 커맨드에 &lt;b&gt;purify&lt;/b&gt;를 접두어로 추가합니다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
삽입처리는 모든 플랫폼에서 링크시에 실행됩니다. AIX에서는, 실행파일에 바로 삽입처리를 적용할 수 있습니다:&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;ksh% purify a.out&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
아래는 AIX에서 memerrors.c 파일을 컴파일, 삽입처리, 실행시 로그를 보여줍니다:&lt;br /&gt;
&lt;table border="0" cellpadding="0" cellspacing="0" style="background-color: white; color: black; text-align: left;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td class="code-outline" style="background-color: rgb(247, 247, 247) !important; border-bottom-color: rgb(204, 204, 204); border-bottom-style: solid; border-bottom-width: 1px; border-image: initial; border-left-color: rgb(204, 204, 204); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(204, 204, 204); border-right-style: solid; border-right-width: 1px; border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.75em; padding-bottom: 5px; padding-left: 2px; padding-right: 2px; padding-top: 2px;"&gt;&lt;pre class="displaycode" style="background-attachment: initial !important; background-clip: initial !important; background-image: initial !important; background-origin: initial !important; font-family: 'Andale Mono', 'Lucida Console', Monaco, Liberation, fixed, monospace; font-size: 11px; overflow-x: auto; overflow-y: auto; width: 694px;"&gt;ksh % cc &lt;strong&gt;-g memerrors.c&lt;/strong&gt;
ksh % &lt;strong&gt;purify a.out&lt;/strong&gt;
Purify 7.0 AIX (32-bit) (C) Copyright IBM Corporation. 1992, 2006 All Rights Reserved.  
Instrumenting: a.out. libc.a,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.......,,,,, libcrypt.a., 
Instrumented &lt;strong&gt;a.out&lt;/strong&gt; is &lt;strong&gt;a.out.pure&lt;/strong&gt;.
Done.
ksh % &lt;strong&gt;./a.out.pure&lt;/strong&gt;
&lt;/pre&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
삽입처리된 프로그램을 실행하면 Purify GUI는 메모리 에러를 탐지하면 바로 나타냅니다(Figure 8).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Figure 8. Memory errors found by Purify (on UNIX)&lt;/b&gt;&lt;br /&gt;
&lt;img src="http://www.ibm.com/developerworks/rational/library/06/0822_satish-giridhar/fig-PurifyUnixErrorReport72.jpg" /&gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
에러를 클릭하면 자세한 정보를 얻을 수 있습니다. Figure 9는 ABR 에러에 대한 자세한 정보를 보여줍니다. 이 정보로 부터 memerrors.c의 107번째 라인에서 NULL 처리된 str 메모리를 할당받았다는 것을 알수 있습니다. 하지만 genABRandABW에서 잘못 계산한 까닭에, name 스트림을 str로 복사한 후에, NULL 바이트가 str[11]에 저장되었습니다. 이로 인해 printf가 str의 범위 밖을 읽게되어 array bounds read (ABR) 에러가 110번째 라인에서 발생했습니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Figure 9. Details of ABR errors, including source code and line number information (on UNIX)&lt;/b&gt;&lt;br /&gt;
&lt;img src="http://www.ibm.com/developerworks/rational/library/06/0822_satish-giridhar/fig-PurifyUnixABR72dpi.jpg" /&gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
유닉스 및 리눅스 시스템상에서 Purify는 모든 UMC 에러와 관련된 스택변수를 추적합니다. 디폴트로 해당 에러는 억제되어 있습니다. 억제된 에러를 보려면 &lt;b&gt;View &amp;gt; Suppressed messages&lt;/b&gt; (Figure 10)를 선택합니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Figure 10. Seeing suppressed errors (on UNIX)&lt;/b&gt;&lt;br /&gt;
&lt;img src="http://www.ibm.com/developerworks/rational/library/06/0822_satish-giridhar/fig-PurifyUnixSeeSuppressed.jpg" /&gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
관심없는 에러 보고를 억제하는 방법은 간단합니다. 에러유형을 선택하고 우클릭후 &lt;b&gt;Suppress &lt;/b&gt;메뉴를 선택합니다(Figure 11).&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Figure 11. Suppressing an error (on UNIX)&lt;/b&gt;&lt;br /&gt;
&lt;img src="http://www.ibm.com/developerworks/rational/library/06/0822_satish-giridhar/fig-PurifyUnixSuppress72dpi.jpg" /&gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Purify 기능에 대한 자세한 정는 &lt;b&gt;Help &lt;/b&gt;메뉴를 사용합니다.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7852536510622031749-3523969833407565309?l=poongcha.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/icXPN/~4/6pFUsVyiKm0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://poongcha.blogspot.com/feeds/3523969833407565309/comments/default" title="댓글" /><link rel="replies" type="text/html" href="http://poongcha.blogspot.com/2012/01/purify.html#comment-form" title="0개의 덧글" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7852536510622031749/posts/default/3523969833407565309?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7852536510622031749/posts/default/3523969833407565309?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/icXPN/~3/6pFUsVyiKm0/purify.html" title="Purify - 기본 사용법" /><author><name>풍차</name><uri>http://www.blogger.com/profile/10628167383220311152</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="23" height="32" src="http://2.bp.blogspot.com/_icOPzB_w_RA/SinjXnz8NRI/AAAAAAAAABA/13rtJajEtZI/S220/%EC%9A%B0%EB%B6%84%ED%88%AC.png" /></author><thr:total>0</thr:total><feedburner:origLink>http://poongcha.blogspot.com/2012/01/purify.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUAHQX4_cCp7ImA9WhRVEUU.&quot;"><id>tag:blogger.com,1999:blog-7852536510622031749.post-1129121722012252936</id><published>2012-01-09T21:39:00.001+09:00</published><updated>2012-01-10T17:22:10.048+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-10T17:22:10.048+09:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="purify" /><title>Purify - Daily 빌드 및 테스트과의 연계</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/bK9AGrWyR3s4iAo37RDPQAmYg0A/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/bK9AGrWyR3s4iAo37RDPQAmYg0A/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/bK9AGrWyR3s4iAo37RDPQAmYg0A/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/bK9AGrWyR3s4iAo37RDPQAmYg0A/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;출처 :&amp;nbsp;http://www.ibm.com/developerworks/rational/library/08/0513_gupta-gaurav/index.html&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Purify is a very useful tool throughout the software development life cycle.&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Developers can use it to ensure that the new code that they have written is not
        going to inadvertently cause any memory corruption errors or leaks.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Test engineers
        can use it to catch memory errors during functional verification and system
        integration testing.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;And field and support engineers can use it to diagnose memory
        issues encountered after the software has been deployed.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
Because the cost of
        detecting and fixing a defect is least during early phases of the software development life cycle, it is best to catch
        and fix as many issues as possible during development and testing phases. You can
        achieve that ideal by methodical and systematic use of Purify throughout the
        software development life cycle. The best way to accomplish this is by automating
        the use of Purify and integrating it into your software development and testing
        process.&lt;br /&gt;
&lt;br /&gt;
Automation of a tool eliminates the overhead and makes it effortless to use,
        which in turn reduces the resistance to its adoption as part of the process. Thus,
        automation is the key in streamlining the process. For example, you can integrate
        Purify with your unit or smoke test suite that developers must run before checking
        in any code changes and require them to fix any new memory errors reported by
        Purify. In this way, an error is caught as soon as it is introduced and fixed
        easily, because the code changes are still fresh in the developer's mind.
        Similarly, you can integrate Purify with your functional and system verification
        test suite, which you might be running nightly or weekly. Testers can analyze and
        file defect reports for memory errors reported by Purify. This ensures that new
        memory errors are caught within a day or a week from the time that they were
        introduced, which is much better than catching them after releasing the software.&lt;br /&gt;
&lt;br /&gt;
You can learn about using Purify and integrating it into your build
        &lt;code&gt;makefiles&lt;/code&gt; in the article: &lt;a href="http://www.ibm.com/developerworks/rational/library/06/0822_satish-giridhar/"&gt;Navigating C in a leaky boat?
        Try Purify.&lt;/a&gt; If you are already familiar with Purify, you can skip or skim that
        article. In this article, you will first learn how to change your build and test
        environment to incorporate Purify into it and about conversions symbols that you
        can use with Purify options to automate using Purify. Then you will see an example
        where all of these capabilities are exploited to automate reporting a summary of
        Purify errors on a Web page.&lt;br /&gt;
&lt;br /&gt;
&lt;span class="atitle" style="font-size: large;"&gt;&lt;b&gt;Incorporating Purify
        into your build and test environment&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
The first step in integrating Purify into your software development and testing
        process is to modify your build and test system. The build system builds an
        application and the test system runs the application with a test suite (shown in
        blue in &lt;a href="http://www.ibm.com/developerworks/rational/library/08/0513_gupta-gaurav/index.html#figure1"&gt;Figure 1&lt;/a&gt;). Typically, the process of building the application and running
        the test suite is automated and scheduled as nightly or weekly jobs. &lt;br /&gt;
&lt;br /&gt;
You need to modify your build system to build a Purify'd
        application along with the normal application. Normally, you will be building the
        application without having any debug information (release bits). For building a
        Purify'd application, it is advisable (although not required) to build
        the application with debug information (debug bits), and then purify it.&lt;br /&gt;
&lt;br /&gt;
You also
        need to modify your test system to run the test suite with the Purify'd
        application, in addition to running it with the normal application. These
        additional build and test steps are shown in green in &lt;a href="http://www.ibm.com/developerworks/rational/library/08/0513_gupta-gaurav/index.html#figure1"&gt;Figure 1&lt;/a&gt;. After making these
        changes, add building the Purify'd application and running it with your
        test suite to your automated nightly or weekly jobs. Later in this article, you
        will learn about various ways of controlling and automating the actions to be
        taken when Purify detects memory errors or leaks.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Figure 1. Modifications in the
          build and the test systems&lt;/b&gt;&lt;br /&gt;
&lt;img alt="Comparison of before and after modifications" height="285" src="http://www.ibm.com/developerworks/rational/library/08/0513_gupta-gaurav/figure1.gif" width="284" /&gt;
            &lt;br /&gt;
&lt;span class="atitle"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="atitle" style="font-size: large;"&gt;&lt;b&gt;Using conversion symbols &lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Purify provides various &lt;b&gt;conversion symbols&lt;/b&gt; that you can use to specify
        values for various options, such as &lt;code&gt;
                    &lt;strong&gt;-view-file&lt;/strong&gt;
                &lt;/code&gt;
        and &lt;code&gt;
                    &lt;strong&gt;-log-file&lt;/strong&gt;
                &lt;/code&gt; (these options send Purify output
        to a Purify view file and to an ASCII log file, respectively). Purify replaces
        these symbols by meaningful expansions and computes a unique file name for saving
        data. For example, you can put the program name and process ID in the name of log
        file: &lt;br /&gt;
&lt;table border="0" cellpadding="0" cellspacing="0"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td class="code-outline"&gt;&lt;pre class="displaycode"&gt;$ purify -log-file=./purifyerrors_%v_%p.plog cc -o progname foo.c bar.c
      &lt;/pre&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
This command will create an instrumented executable named &lt;b&gt;progname&lt;/b&gt;. If you
        run this, and the process ID for that run is 1234, all Purify errors will be
        logged in a file named &lt;b&gt;purifyerrors_progname_1234.plog&lt;/b&gt;. In the log file
        name, Purify expands &lt;code&gt;%v&lt;/code&gt; to the program executable name and the
        &lt;code&gt;%p&lt;/code&gt; to the process ID.&lt;br /&gt;
&lt;br /&gt;
&lt;span class="smalltitle" style="font-size: large;"&gt;&lt;b&gt;Adding operations after a Purify run&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Automating what happens &lt;i&gt;before&lt;/i&gt; running your instrumented application is
        easy, because you have all of the controls. You can control and automate what
        happens &lt;i&gt;after&lt;/i&gt; running the application by exploiting various Purify features
        that let you add custom post-processing tasks. Purify enables you to run a script
        after exiting the instrumented application. You can use this to report a summary
        of all of the errors reported after the instrumented program exits. To do this,
        you use the Purify &lt;code&gt;
                    &lt;strong&gt;-run-at-exit&lt;/strong&gt;

                &lt;/code&gt; runtime option.
       &lt;br /&gt;
&lt;br /&gt;
For example, if your instrumented application is
        &lt;code&gt;test.pure&lt;/code&gt;, you can use this option as follows to print
        a summary of errors found:&lt;br /&gt;
&lt;table border="0" cellpadding="0" cellspacing="0"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td class="code-outline"&gt;&lt;pre class="displaycode"&gt;$ setenv PURIFYOPTIONS '-run-at-exit="if %z ; then \
  echo \"%v : %e errors, %l bytes leaked.\" ; fi"'
      &lt;/pre&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
The string that follows the &lt;code&gt;
                    &lt;strong&gt;-run-at-exit&lt;/strong&gt;

                &lt;/code&gt; option
        is executed by the shell after the program exits. Conversion symbol substitutions are made, such as
        turning &lt;code&gt;%z&lt;/code&gt; into &lt;code&gt;false&lt;/code&gt; if
        there were no Purify errors or leaks during the run. Because of that, the
        &lt;code&gt;if&lt;/code&gt; statement in this example says: "Execute
        the 'echo' only if there were errors." The
        &lt;code&gt;echo&lt;/code&gt; command, in turn, uses more substitution strings
        to report how many errors there were. Upon exiting the program, Purify sends a
        message similar to one:&lt;br /&gt;
&lt;table border="0" cellpadding="0" cellspacing="0"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td class="code-outline"&gt;&lt;pre class="displaycode"&gt;$ test.pure
test.pure : 2 errors, 10 bytes leaked
      &lt;/pre&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
This is a simple example. However, you can put complex processing into a script,
        or even in a program, and pass various conversion symbols as arguments to the script
        or program. For example:&lt;br /&gt;
&lt;table border="0" cellpadding="0" cellspacing="0"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td class="code-outline"&gt;&lt;pre class="displaycode"&gt;$ setenv PURIFYOPTIONS '-run-at-exit="postprocess.csh %v %z %e %l "'
      &lt;/pre&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
Table 1 and Table 2 show more details of the substitution strings for conversion symbols.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Table 1. Conversion symbols that can be used with Purify options&lt;/b&gt;&lt;br /&gt;
&lt;table border="1" cellpadding="0" cellspacing="0" class="ibm-data-table" summary="Conversion symbols that can be used with Purify options"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;th scope="col"&gt;Character&lt;/th&gt;&lt;th scope="col"&gt;Converts to&lt;/th&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th class="tb-row" scope="row"&gt;%v&lt;/th&gt;&lt;td&gt;Program executable name, lowercase V (name of the instrumented executable that you are running)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th class="tb-row" scope="row"&gt;%V&lt;/th&gt;&lt;td&gt;Full path name of the program, uppercase V (&lt;b&gt;/ &lt;/b&gt;replaced by &lt;b&gt;_&lt;/b&gt;)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th class="tb-row" scope="row"&gt;%p&lt;/th&gt;&lt;td&gt;Process ID (pid or PID)&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Table 2. Conversion symbols that can be used in Exit-command (-run-at-exit)&lt;/b&gt;&lt;br /&gt;
&lt;table border="1" cellpadding="0" cellspacing="0" class="ibm-data-table" summary="Conversion symbols that can be used in Exit-command"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;th scope="col"&gt;Character&lt;/th&gt;&lt;th scope="col"&gt;Converts to&lt;/th&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th class="tb-row" scope="row"&gt;%z&lt;/th&gt;&lt;td&gt;String value &lt;code&gt;true&lt;/code&gt; or &lt;code&gt;false&lt;/code&gt;, indicating whether any call chains for errors
            or leaks were printed (use it to have your exit script act conditionally when
            Purify finds something of interest to you)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th class="tb-row" scope="row"&gt;%x&lt;/th&gt;&lt;td&gt;Program's exit status (&lt;b&gt;0&lt;/b&gt; if the program did not call an exit)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th class="tb-row" scope="row"&gt;%e&lt;/th&gt;&lt;td&gt;Number of distinct access errors printed (displayed)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th class="tb-row" scope="row"&gt;%E&lt;/th&gt;&lt;td&gt;Total number of errors printed&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th class="tb-row" scope="row"&gt;%l&lt;/th&gt;&lt;td&gt;Number of bytes of memory leaked (lowercase L)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th class="tb-row" scope="row"&gt;%L&lt;/th&gt;&lt;td&gt;Number of bytes of memory potentially leaked (uppercase L)&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
&lt;span class="atitle"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="atitle" style="font-size: large;"&gt;&lt;b&gt;Using program exit status&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="atitle"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
You have already learned how to run your scripts at the end of instrumented
        program run. Purify also gives you some information through its exit status. By
        default, Purify does not modify the normal exit status of your program. However,
        you can choose to have your program exit with a special exit status if Purify
        finds any access errors or memory leaks. This is a convenient way to flag failing
        runs in test suites. Use the &lt;code&gt;
                    &lt;strong&gt;-exit-status=yes&lt;/strong&gt;
                &lt;/code&gt;
        option to enable Purify to insert flags that indicate types of runtime errors. If
        there are unsuppressed Purify errors, the status code is computed by doing &lt;i&gt;bit-wise OR&lt;/i&gt;
        of the following values, depending upon the type of memory error present:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;
                    &lt;b&gt;0x40:&lt;/b&gt; Memory access errors&lt;/li&gt;
&lt;li&gt;
                    &lt;b&gt;0x20:&lt;/b&gt; Memory leaks &lt;/li&gt;
&lt;li&gt;
                    &lt;b&gt;0x10:&lt;/b&gt; Potential memory leaks &lt;/li&gt;
&lt;/ul&gt;
Alternatively, you can replace the calls to
        &lt;code&gt;
                    &lt;strong&gt;exit(status)&lt;/strong&gt;
                &lt;/code&gt; in your code and the
        &lt;code&gt;
                    &lt;strong&gt;return&lt;/strong&gt;
                &lt;/code&gt; statement in &lt;code&gt;main()&lt;/code&gt;
        function with a call to the &lt;code&gt;
                    &lt;strong&gt;purify_exit(status)&lt;/strong&gt;
                &lt;/code&gt;
        function. (See &lt;a href="http://www.ibm.com/developerworks/rational/library/08/0513_gupta-gaurav/index.html#resources"&gt;Resources&lt;/a&gt; for the article on Purify
        Application Programming Interface functions.) If you are concerned only about the
        memory access errors, you can either turn off leak detection at exit by using the
        &lt;code&gt;
                    &lt;strong&gt;-leaks-at-exit=no&lt;/strong&gt;
                &lt;/code&gt; option, or you can suppress
        memory leak and potential leak messages. You can also ignore the appropriate bits
        of exit status. However, the program summary message in the Purify report always
        shows your original exit status before any other Purify result status bits are OR'ed into it.&lt;br /&gt;
Listing 1 is an example that exploits the
        &lt;code&gt;
                    &lt;strong&gt;-exit-status&lt;/strong&gt;
                &lt;/code&gt; option and uses the exit status to
        determine whether any errors were found in the program.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Listing 1. Exit status option example&lt;/b&gt;&lt;br /&gt;
&lt;table border="0" cellpadding="0" cellspacing="0"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td class="code-outline"&gt;&lt;pre class="displaycode"&gt;                
$ cat prog.c
#include &amp;lt;stdio.h&amp;gt;

int main() {
    int i,j;
    i = j+1;  /* UMR: Reading un-initialized variable j */
    return 0;
} 

$ purify -exit-status=yes cc -g prog.c -o prog.pure
$ prog.pure
$ echo $?
64
&lt;/pre&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
The exit value is not 0 (zero), as returned in function
        &lt;code&gt;main&lt;/code&gt;. It is 64, which is 0x40 in hexadecimal. That is
        because Purify detects an Uninitialized Memory Read (UMR) memory access error in
        the program. This option can be easily incorporated in a script that checks the
        exit status after running the Purify'd executable and takes appropriate
        actions upon finding errors, such as filing a defect report with the test program
        or noting the result in the Purify log.&lt;br /&gt;
&lt;br /&gt;
If you want your instrumented application to exit upon detecting the first
        error, you can use the &lt;code&gt;
                    &lt;strong&gt;-exit-on-error&lt;/strong&gt;

                &lt;/code&gt; option.
        When you use that option, the program exits the moment that Purify encounters an
        error (errors that are hidden by using the &lt;code&gt;suppress&lt;/code&gt; and
        &lt;code&gt;kill&lt;/code&gt; directives do not count).&lt;br /&gt;
&lt;span class="atitle"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="atitle" style="font-size: large;"&gt;&lt;b&gt;Mailing Purify results
        and assisting analysis&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Purify has a &lt;code&gt;
                    &lt;strong&gt;-mail-to-user&lt;/strong&gt;
                &lt;/code&gt; option that you can
        use to automate reporting of daily or weekly Purify results. When you use this
        option, Purify will e-mail the error report to the specified addresses of testers
        and developers, and they can verify the results when they receive the e-mail. For
        example, suppose that you purify your program this way:&lt;br /&gt;
&lt;table border="0" cellpadding="0" cellspacing="0"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td class="code-outline"&gt;&lt;pre class="displaycode"&gt;$ purify -mail-to-user=yourid cc -g prog.c -o prog.pure
      &lt;/pre&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
When you run the &lt;code&gt;prog.pure&lt;/code&gt; executable thereafter, the Purify report will be sent
        automatically to &lt;code&gt;yourid&lt;/code&gt; email address.&lt;br /&gt;
&lt;br /&gt;
Sometimes, while analyzing the errors, it is useful to look at not only the
        function names but also other details, such as the complete path of the file where
        it is located or the PC values. You can enable Purify to display such information
        by using these options:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;
                    &lt;b&gt;-show-pc&lt;/b&gt; shows you the full PC value&lt;/li&gt;
&lt;li&gt;
                    &lt;b&gt;-show-pc-offset&lt;/b&gt; shows you the pc-offset from the start of the function &lt;/li&gt;
&lt;li&gt;
                    &lt;b&gt;-show-directory&lt;/b&gt; shows you the directory listing where the file containing
          the function exists (requires program build with debugging)&lt;/li&gt;
&lt;/ul&gt;
&lt;span class="atitle" style="font-size: large;"&gt;&lt;b&gt;Example&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
In this section, you will see an example that uses most of the options that you
        learned about in this article. Listing 2 shows the
        &lt;code&gt;GNUMakefile&lt;/code&gt; that contains modified build and test
        systems (see &lt;a href="http://www.ibm.com/developerworks/rational/library/08/0513_gupta-gaurav/index.html#downloads"&gt;Downloads&lt;/a&gt; to get the source code used in
        this article). If the application name is &lt;code&gt;memerrors&lt;/code&gt;, a new target is added for
        building a Purify'd application named &lt;code&gt;memerrors.pure&lt;/code&gt;. Similarly, a new
        target is added to run tests with the Purify'd application. &lt;br /&gt;
&lt;br /&gt;
Purify runtime options are set before running the test. For the
        &lt;code&gt;-log-file&lt;/code&gt; option, a unique log file name is
        created, using conversion symbols and the date command (the file name includes
        program name, process ID, date, and time). The
        &lt;code&gt;-run-at-exit&lt;/code&gt; option is used to indicate that, after
        program exits, the &lt;code&gt;addsummary.sh&lt;/code&gt; script should be run,
        along with the arguments specified through conversion symbols (namely, the log
        file name, whether any error call chain was printed, exit status, count of memory
        errors found, size of memory leaks, and potential memory leaks). 
        Since the &lt;code&gt;-exit-status=yes&lt;/code&gt; option
        is not used, Purify will not overwrite the exit status and retain the original
        exit status of the program. &lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Listing 2. GNUMakefile with modified build and test systems&lt;/b&gt;&lt;br /&gt;
&lt;table border="0" cellpadding="0" cellspacing="0"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td class="code-outline"&gt;&lt;pre class="displaycode"&gt;                
# Name of Logfile using Purify conversion symbols and date command
DATEANDTIME     := `date +%Y_%b_%d_%H_%M_%S`
LOGFILENAME     := %v_pid%p_$(DATEANDTIME).plog

# Script to run when Purify'ed program exits
PURIFYEXITSCRIPT:= \"addsummary.sh $(DATEANDTIME) $(LOGFILENAME) %z %x %e %l %L\"

# Purify Options
PURIFYOPTIONS   := -log-file=$(LOGFILENAME) -run-at-exit=$(PURIFYEXITSCRIPT)

# Targets and Rules
all: runtest runpurifytest

# Clean
clean:
 $(RM) memerrors memerrors.pure

# Build Application
memerrors: memerrors.c
 $(CC) -o $@ $? 

# Build Purify'ed application
memerrors.pure: memerrors.c
 purify $(CC) -g -o $@ $? 

# Run Test Suite
runtest: memerrors
 ./memerrors

# Run Test Suite with Purify'ed application
runpurifytest: memerrors.pure
 echo Starting test at $(DATEANDTIME) .....
 env PURIFYOPTIONS="$(PURIFYOPTIONS)" ./memerrors.pure

# End of GNUMakefile
      &lt;/pre&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
The &lt;code&gt;addsummary.sh&lt;/code&gt; script shown in Listing 3 creates an
        HTML report. It maintains a list file that has one HTML table row for each Purify
        run so far, in reverse chronological order. When the script is executed upon
        exiting Purify, it creates a new list file that contains an HTML table row for the
        latest run, appends the file with previous rows, and replaces the old list file
        with the new list file. Then it generates an HTML file by an wrapping HTML header
        and footer around the list file.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Listing 3.Content of the addsummary.sh shell script &lt;/b&gt;&lt;br /&gt;
&lt;table border="0" cellpadding="0" cellspacing="0"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td class="code-outline"&gt;&lt;pre class="displaycode"&gt;                
#!/bin/sh

DATEANDTIME=$1
LOGFILENAME=$2
LOGFULLNAME=`pwd`/$LOGFILENAME
ERRORFOUND=$3
EXITSTATUS=$4
ERRORCOUNT=$5
LEAKSIZE=$6
PLEAKSIZE=$7

PURIFYREPORT="purify_reports"
REPORTLIST="$PURIFYREPORT.list"
REPORTNEWLIST="$REPORTLIST.new"
REPORTHTML="$PURIFYREPORT.html"

# Start
echo Processing $LOGFILENAME created at $DATEANDTIME

# Create report list file if it does not exist
touch $REPORTLIST

# Create a row for the latest Purify run
echo "&amp;lt;tr&amp;gt;" &amp;gt;&amp;gt; $REPORTNEWLIST
echo "&amp;lt;td&amp;gt;$DATEANDTIME&amp;lt;/td&amp;gt;" &amp;gt;&amp;gt; $REPORTNEWLIST
if ($ERRORFOUND == "true"); then
    echo "&amp;lt;td&amp;gt;FAILED&amp;lt;/td&amp;gt;" &amp;gt;&amp;gt; $REPORTNEWLIST
else
    echo "&amp;lt;td&amp;gt;Pass&amp;lt;/td&amp;gt;" &amp;gt;&amp;gt; $REPORTNEWLIST
fi
echo "&amp;lt;td&amp;gt;$EXITSTATUS&amp;lt;/td&amp;gt;" &amp;gt;&amp;gt; $REPORTNEWLIST
echo "&amp;lt;td&amp;gt;$ERRORCOUNT&amp;lt;/td&amp;gt;" &amp;gt;&amp;gt; $REPORTNEWLIST
echo "&amp;lt;td&amp;gt;$LEAKSIZE bytes&amp;lt;/td&amp;gt;" &amp;gt;&amp;gt; $REPORTNEWLIST
echo "&amp;lt;td&amp;gt;$PLEAKSIZE bytes&amp;lt;/td&amp;gt;" &amp;gt;&amp;gt; $REPORTNEWLIST
echo "&amp;lt;td&amp;gt;&amp;lt;a href=\"$LOGFULLNAME\"&amp;gt;$LOGFILENAME&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;" &amp;gt;&amp;gt; $REPORTNEWLIST
echo "&amp;lt;/tr&amp;gt;\n" &amp;gt;&amp;gt; $REPORTNEWLIST

# Add this row at the beginning of the table
cat $REPORTLIST &amp;gt;&amp;gt; $REPORTNEWLIST
mv $REPORTNEWLIST $REPORTLIST

# Create HTML page
# Header
echo "&amp;lt;html&amp;gt;"  &amp;gt; $REPORTHTML
echo "&amp;lt;body&amp;gt;" &amp;gt;&amp;gt; $REPORTHTML
echo "&amp;lt;table border=1&amp;gt;" &amp;gt;&amp;gt; $REPORTHTML
echo "&amp;lt;caption&amp;gt;Purify Test Summary&amp;lt;/caption&amp;gt;" &amp;gt;&amp;gt; $REPORTHTML
echo "&amp;lt;tr&amp;gt;" &amp;gt;&amp;gt; $REPORTHTML
echo "&amp;lt;th&amp;gt;Date &amp;amp; Time&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;Result&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;Exit Status&amp;lt;/th&amp;gt;"  &amp;gt;&amp;gt; $REPORTHTML
echo "&amp;lt;th&amp;gt;Errors&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;Leaks&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;Potential Leaks&amp;lt;/th&amp;gt;" &amp;gt;&amp;gt; $REPORTHTML
echo "&amp;lt;th&amp;gt;Log File&amp;lt;/th&amp;gt;"  &amp;gt;&amp;gt; $REPORTHTML
echo "&amp;lt;/tr&amp;gt;\n" &amp;gt;&amp;gt; $REPORTHTML
# Add rows for Purify results
cat $REPORTLIST &amp;gt;&amp;gt; $REPORTHTML
# Footer
echo "&amp;lt;/table&amp;gt;" &amp;gt;&amp;gt; $REPORTHTML
echo "&amp;lt;/body&amp;gt;" &amp;gt;&amp;gt; $REPORTHTML
echo "&amp;lt;/html&amp;gt;" &amp;gt;&amp;gt; $REPORTHTML

# Done
echo "Successfully updated $REPORTHTML"

# End of addsummary.sh
&lt;/pre&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
Figure 2 shows the HTML page generated after three runs of the test suite. Each
        run is represented by a row, and each row has a hyperlink to the Purify log file.
        Each successive run of the test suite will add a new row at the beginning of the
        table.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Figure 2. Purify Test Summary
          report in the browser&lt;/b&gt;&lt;br /&gt;
&lt;img alt="Screen capture shows 3 failed tests and details" height="248" src="http://www.ibm.com/developerworks/rational/library/08/0513_gupta-gaurav/figure2.jpg" width="572" /&gt;
            &lt;br /&gt;
&lt;br /&gt;
&lt;span class="atitle" style="font-size: large;"&gt;&lt;b&gt;Summary &lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
As this article explains, you get maximum benefits when you use Purify regularly
        and systematically. You now know how to incorporate Purify into your software
        development and testing process and to automate its use with the help of
        conversions symbols and options. &lt;br /&gt;
Although the example used in this article is simple, it 
demonstrates how easy it
        is to integrate Purify into your build and test environment and 
the value of automating Purify usage. Think about the simplicity of 
checking the Purify test
        results summary on a Web page that gets updated automatically 
every time your test
        suite is executed. All existing log files are also accessible 
through the same Web
        page. The example here is intentionally simple, just to show you
 the
        possibilities. You can create a quite sophisticated system that 
compares results
        and sends e-mail notifications with precise details upon finding
 any additional
        memory errors and leaks. You can fix them as soon as they are 
introduced. With
        this knowledge, you are ready to reap the maximum benefits of 
Rational Purify.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7852536510622031749-1129121722012252936?l=poongcha.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/icXPN/~4/1f4RJD6g1t8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://poongcha.blogspot.com/feeds/1129121722012252936/comments/default" title="댓글" /><link rel="replies" type="text/html" href="http://poongcha.blogspot.com/2012/01/purify-daily.html#comment-form" title="0개의 덧글" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7852536510622031749/posts/default/1129121722012252936?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7852536510622031749/posts/default/1129121722012252936?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/icXPN/~3/1f4RJD6g1t8/purify-daily.html" title="Purify - Daily 빌드 및 테스트과의 연계" /><author><name>풍차</name><uri>http://www.blogger.com/profile/10628167383220311152</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="23" height="32" src="http://2.bp.blogspot.com/_icOPzB_w_RA/SinjXnz8NRI/AAAAAAAAABA/13rtJajEtZI/S220/%EC%9A%B0%EB%B6%84%ED%88%AC.png" /></author><thr:total>0</thr:total><feedburner:origLink>http://poongcha.blogspot.com/2012/01/purify-daily.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUEMQHgzeCp7ImA9WhRVEUU.&quot;"><id>tag:blogger.com,1999:blog-7852536510622031749.post-2941720051249733523</id><published>2012-01-08T20:15:00.000+09:00</published><updated>2012-01-10T17:21:21.680+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-10T17:21:21.680+09:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="purify" /><title>Purify - 메모리 에러 설명</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/LmcjRnpCXwtno21kYCR1xFHzanM/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/LmcjRnpCXwtno21kYCR1xFHzanM/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/LmcjRnpCXwtno21kYCR1xFHzanM/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/LmcjRnpCXwtno21kYCR1xFHzanM/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;출처 :&amp;nbsp;http://www.ibm.com/developerworks/rational/library/06/0822_satish-giridhar/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Introduction&lt;/b&gt;&lt;br /&gt;
Most programmers agree that defects related to incorrect memory usage
 and management are the hardest to isolate, analyze, and fix. Therefore,
 they are the costliest defects to have in your programs. These defects 
are typically caused by using uninitialized memory, using un-owned 
memory, buffer overruns, or faulty heap management.&lt;br /&gt;
&lt;br /&gt;
IBM® Rational® Purify® is an advanced memory usage error detecting 
tool that enables software developers and testers to detect memory 
errors in C and C++ programs. While a program runs, Purify collects and 
analyzes data to accurately identify memory errors that are about to 
happen. It provides detailed information, such as the error location 
(function call stack) and size of the affected memory, to assist you in 
quickly locating the problem areas. It also greatly reduces debugging 
time and complexity, so you can focus on fixing the flaw in the 
application logic that is causing the error. &lt;br /&gt;
&lt;br /&gt;
Purify is available for all prominent platforms, including IBM® AIX® 
on Power PC®, HP-UX® on PA-RISC, Linux™ on x86 and x86/64, Sun™ Solaris™
 on SPARC®, and the Microsoft® Windows® on x86 (check documentation for 
updated list of supported platform). In this article, you will first 
learn about various types of memory access errors with the help of 
examples, and then learn how to use Purify for detecting and fixing 
those errors. In the &lt;a href="http://www.ibm.com/developerworks/rational/library/06/0822_satish-giridhar/#download"&gt;Download&lt;/a&gt;
 section, you will find the C source file (memerrors.c) with the code 
samples in this article, and you can use them to experiment with Purify.&lt;br /&gt;
&lt;span class="atitle"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;b&gt;Memory errors&lt;/b&gt;&lt;span class="atitle"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
Memory errors can be broadly classified into four categories:&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt; Using memory that you have not initialized&lt;/li&gt;
&lt;li&gt; Using memory that you do not own&lt;/li&gt;
&lt;li&gt; Using more memory than you have allocated (buffer overruns)&lt;/li&gt;
&lt;li&gt; Using faulty heap memory management&lt;/li&gt;
&lt;/ol&gt;
Purify detects errors in all of these categories and identifies 
the &lt;i&gt;type&lt;/i&gt; of the error within a category. Understanding the types of 
errors helps you identify and isolate subtle mistakes in your program 
that may cause the program to act strangely and unpredictably. In rest 
of this section, various error types are explained using code samples.
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Using memory that you have not initialized&lt;/b&gt;&lt;br /&gt;
When you read from memory that you forgot to initialize, you get 
garbage value. This error looks deceptively innocent, but it has 
the potential to cause mysterious program behavior. &lt;br /&gt;
&lt;br /&gt;
The garbage value that you get could fortuitously happen to be a 
meaningful value that your program can handle. For example, some 
operating systems initialize a memory block with zeros when it is 
allocated for the first time. If zero is a meaningful value for your 
program, it may run smoothly, initially. However, after the program runs
 for a while, the memory might be freed and reallocated. When a memory 
block is recycled, it has the values that were stored in it when it was 
last used. These values are unpredictable. Depending upon the value, 
your program may crash immediately, may run for a while and crash 
sometime later, or may run smoothly but produce strange results. Since 
the value could be different in each run, the behavior of the program 
can be baffling, making it hard to reproduce the problem consistently.&lt;br /&gt;
&lt;br /&gt;
Purify detects such errors and reports an &lt;i&gt;Uninitialized Memory Read (UMR)&lt;/i&gt;
 error for every use of uninitialized memory. It 
further differentiates between using uninitialized memory and copying 
value from an uninitialized memory location to another memory location. 
When an uninitialized memory is copied, Purify reports an &lt;i&gt;Uninitialized Memory Copy (UMC)&lt;/i&gt;
 error. After the copying, the destination location also has 
uninitialized memory; therefore, whenever this memory is used, Purify 
reports a UMR.
&lt;br /&gt;
&lt;br /&gt;
Listing 1 shows a simple example. There are two integers: &lt;code&gt;i&lt;/code&gt; and 
&lt;code&gt;j&lt;/code&gt;. The integer &lt;code&gt;i&lt;/code&gt; is initialized with 10. Then the value of &lt;code&gt;j&lt;/code&gt; is copied into &lt;code&gt;i&lt;/code&gt;. Since &lt;code&gt;j&lt;/code&gt; has not been initialized, &lt;code&gt;i&lt;/code&gt; also has garbage value after &lt;code&gt;j&lt;/code&gt; is copied into it. Purify maintains status of each memory location. It is capable of the analysis that reveals that, although &lt;code&gt;i&lt;/code&gt; has been initialized with 10, copying an uninitialized value has made &lt;code&gt;i&lt;/code&gt; also uninitialized. Therefore, Purify reports any usage of &lt;code&gt;i&lt;/code&gt; (for example, as an argument to &lt;code&gt;printf&lt;/code&gt; in the next line) as a UMR error.
&lt;br /&gt;
&lt;br /&gt;
Listing 1. An example of UMR and UMC errors&lt;br /&gt;
&lt;pre class="displaycode"&gt;void uninit_memory_errors() {
    int i=10, j;
    i = j;     /* UMC: j is uninitialized, copied into i */
    printf("i = %d\n", i); /* UMR: Using i, which has junk value */
}&lt;/pre&gt;
&lt;br /&gt;
This example is intentionally trivial to make it easy for you to 
identify the problem just by inspecting the code. But real-world 
applications have many thousands lines of code and have complex control 
flow. The location where a valid value is corrupted by 
copying a garbage value into it, could be in a different function, and 
potentially in a different sub-system or library. If you inspect 
the &lt;code&gt;bar&lt;/code&gt; method in Listing 2, and you do not know much about &lt;code&gt;foo&lt;/code&gt; method, you would not suspect that &lt;code&gt;i&lt;/code&gt; would be corrupted after calling the &lt;code&gt;foo&lt;/code&gt;
 method. Depending upon the size and complexity of the source code, you 
may have to spend considerable time and effort to analyze and then to 
rectify this type of defect. Purify eliminates this effort and reports 
UMRs, indicating the use of uninitialized memory value.&lt;br /&gt;
&lt;br /&gt;
Listing 2. Another example of UMR and UMC errors&lt;br /&gt;
&lt;pre class="displaycode"&gt;void foo(int *pi) {
    int j;
    *pi = j; /* UMC: j is uninitialized, copied into *pi */
}

void bar() {
    int i=10;
    foo(&amp;amp;i);
    printf("i = %d\n", i); /* UMR: Using i, which is now junk value */
}&lt;/pre&gt;
&lt;br /&gt;
As you notice, whenever a memory location with a UMC error is finally
 used, Purify reports a UMR error for that same memory location. UMC 
errors may not always be critical, and Purify hides them by default. 
Later in this article, you will learn how to see UMC and other errors 
that Purify hides.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Using memory that you don't own&lt;/b&gt;&lt;br /&gt;
Explicit memory management and pointer arithmetic present 
opportunities for designing compact and efficient programs. However, 
incorrect use of these features can lead to complex defects, such as a 
pointer referring to memory that you don't own. In this case, too, 
reading memory through such pointers may give garbage value or cause 
segmentation faults and core dumps, and using garbage values can cause 
unpredictable program behavior or crashes.&lt;br /&gt;
&lt;br /&gt;
Purify detects these errors. In addition to reporting the type of 
error, Purify indicates the memory area that the pointer refers to 
and where that memory has been allocated. This is typically a good clue 
for identifying the cause of the error. This category includes following
 types of errors:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Null pointer read or write (NPR, NPW)&lt;/li&gt;
&lt;li&gt;Zero page read or write (ZPR, ZPW)&lt;/li&gt;
&lt;li&gt;Invalid pointer read or write (IPR, IPW)&lt;/li&gt;
&lt;li&gt;Free memory read or write (FMR, FMW)&lt;/li&gt;
&lt;li&gt;Beyond stack read or write (BSR, BSW)&lt;/li&gt;
&lt;/ul&gt;
&lt;b&gt;Null Pointer Read/Write (NPR, NPW) and Zero Page Read/Write (ZPR, ZPW):&lt;/b&gt;&lt;br /&gt;
If a pointer's value can potentially be null (NULL), the pointer 
should not be de-referenced without checking it for being null. For 
example, a call to &lt;code&gt;malloc&lt;/code&gt; can return a null result if no memory is available. Before using the pointer returned by &lt;code&gt;malloc&lt;/code&gt;,
 you need to check it to make sure that isn't null. For example, a 
linked list or tree traversal algorithm needs to check whether the next 
node or child node is null. &lt;br /&gt;
&lt;br /&gt;
It is common to forget these checks. Purify detects any memory access
 through de-referencing a null pointer, and reports an NPR or NPW error.
 When you see this error, examine whether you need to add a null pointer
 check or whether you wrongly assumed that your program logic guaranteed
 a non-null pointer. On AIX, HP, and under some linker options in 
Solaris, dereferencing a null pointer produces a zero value, not a 
segmentation fault signal.&lt;br /&gt;
&lt;br /&gt;
The memory is divided into pages, and it is "illegal" to read from or
 write to a memory location on the zero'th page. This error is 
typically due to null pointer or incorrect pointer arithmetic 
computations. For example, if you have a null pointer to a structure and
 you attempt to access various fields of that structure, it will lead to
 a zero page read error, or ZPR.&lt;br /&gt;
&lt;br /&gt;
Listing 3 shows a simple example of both NPR and ZPR problems. The &lt;code&gt;findLastNodeValue&lt;/code&gt; method has a defect, in that it does not check whether the &lt;code&gt;head&lt;/code&gt; parameter is null. NPR and ZPR errors occur when the &lt;code&gt;next&lt;/code&gt; and &lt;code&gt;val&lt;/code&gt; 
fields are accessed, respectively.&lt;br /&gt;
&lt;br /&gt;
Listing 3. An example of NPR and ZPR errors&lt;br /&gt;
&lt;pre class="displaycode"&gt;typedef struct node {
    struct node* next;
    int          val;
} Node;

int findLastNodeValue(Node* head) {
    while (head-&amp;gt;next != NULL) { /* Expect NPR */
        head = head-&amp;gt;next;
    }
    return head-&amp;gt;val; /* Expect ZPR */
}

void genNPRandZPR() {
    int i = findLastNodeValue(NULL);
}&lt;/pre&gt;
&lt;br /&gt;
&lt;b&gt;Invalid Pointer Read or Write (IPR, IPW):&lt;/b&gt;&lt;br /&gt;
Purify tracks all memory operations. When it detects a pointer to a 
memory location that has not been allocated to the program, it reports 
either an IPR or IPW error, depending on whether it was a read or write 
operation. The error can happen for multiple reasons. For example, you 
will get this type of error if you have an uninitialized pointer 
variable and the garbage value happens to be invalid.  As another 
example, if you wanted to do &lt;code&gt;*pi = i;&lt;/code&gt;, where &lt;code&gt;pi&lt;/code&gt; 
is a pointer to an integer and &lt;code&gt;i&lt;/code&gt; is an integer. But, by mistake, you didn't type the &lt;code&gt;*&lt;/code&gt; and wrote just &lt;code&gt;pi = i;&lt;/code&gt;. With the help of implicit casting, an integer value is copied as a pointer value. When you dereference &lt;code&gt;pi&lt;/code&gt;
 again, you may get an IPR or IPW error. This can also happen when 
pointer arithmetic results in an invalid address, even when it is not on
 the zero'th page. (See Listing 4.)
&lt;br /&gt;
&lt;br /&gt;
Listing 4. An example of IPR and IPW errors&lt;br /&gt;
&lt;pre class="displaycode"&gt;void genIPR() {
    int *ipr = (int *) malloc(4 * sizeof(int));
    int i, j;
    i = *(ipr - 1000); j = *(ipr + 1000); /* Expect IPR */
    free(ipr);
}

void genIPW() {
    int *ipw = (int *) malloc(5 * sizeof(int));
    *(ipw - 1000) = 0; *(ipw + 1000) = 0; /* Expect IPW */
    free(ipw);
}&lt;/pre&gt;
&lt;br /&gt;
IPR and IPW are encountered commonly while using functions that return a pointer (e.g. &lt;code&gt;malloc&lt;/code&gt;)
 in 64-bit applications because pointer is 8 byte long and integer is 4 
byte long. If the method declaration is not included, compiler assumes 
that the method returns an integer, and implicitly casts the return 
value and retains only lower 4 bytes of the pointer value. Purify 
reports IPR and IPW upon using this invalid pointer. (See Listing 5.)&lt;br /&gt;
&lt;br /&gt;
Listing 5. Another example of IPR and IPW errors&lt;br /&gt;
&lt;pre class="displaycode"&gt;/*Forgot to include following in a 64-bit application:
#include &amp;lt;malloc.h&amp;gt;
#include &amp;lt;stdlib.h&amp;gt;
 */

void illegalPointer() {
    int *pi = (int*) malloc(4 * sizeof(int));
    pi[0] = 10; /* Expect IPW */
    printf("Array value = %d\n", pi[0]); /* Expect IPR */
}&lt;/pre&gt;
&lt;br /&gt;
&lt;b&gt;Free Memory Read or Write (FMR, FMW):&lt;/b&gt;&lt;br /&gt;
When you use &lt;code&gt;malloc&lt;/code&gt; or &lt;code&gt;new&lt;/code&gt;, the operating 
system allocates memory from heap and returns a pointer to the location 
of that memory. When you don't need this memory anymore, you de-allocate
 it by calling &lt;code&gt;free&lt;/code&gt; or &lt;code&gt;delete&lt;/code&gt;. Ideally, after de-allocation, the memory at that location should not be accessed thereafter. &lt;br /&gt;
&lt;br /&gt;
However, you may have more than one pointer in your program pointing 
to the same memory location. For instance, while traversing a linked 
list, you may have a pointer to a node, but a pointer to that node is 
also stored as &lt;code&gt;next&lt;/code&gt; in the previous node. Therefore, you 
have two pointers to the same memory block. Upon freeing that node, 
these pointers will become &lt;i&gt;heap dangling pointers&lt;/i&gt;, because they point to memory that has already been freed. Another common cause for 
this error is usage of &lt;code&gt;realloc&lt;/code&gt; method. (See Listing 6 code.)&lt;br /&gt;
&lt;br /&gt;
The heap management system may respond to another &lt;code&gt;malloc&lt;/code&gt;
 call in the same program and allocate this freed memory to other, 
unrelated objects. If you use a dangling pointer and access the memory 
through it, the behavior of the program is undefined. It may result in 
strange behavior or crash. The value read from that location would be 
completely unrelated and garbage. If you modify memory through a 
dangling pointer, and later that value is used for the intended purpose 
and unrelated context, the behavior will be unpredictable. Of course, 
either an uninitialized pointer or incorrect pointer arithmetic can also
 result in pointing to already freed heap memory.&lt;br /&gt;
&lt;br /&gt;
Listing 6. An example of FMR and FMW errors&lt;br /&gt;
&lt;pre class="displaycode"&gt;int* init_array(int *ptr, int new_size) {
    ptr = (int*) realloc(ptr, new_size*sizeof(int));
    memset(ptr, 0, new_size*sizeof(int));
    return ptr;
}

int* fill_fibonacci(int *fib, int size) {
    int i;
    /* oops, forgot: fib = */ init_array(fib, size);
    /* fib[0] = 0; */ fib[1] = 1;
    for (i=2; i&amp;lt;size; i++)
        fib[i] = fib[i-1] + fib[i-2];
    return fib;
}

void genFMRandFMW() {
    int *array = (int*)malloc(10);
    fill_fibonacci(array, 3);
}&lt;/pre&gt;
&lt;br /&gt;
&lt;b&gt;Beyond Stack Read or Write (BSR, BSW) :&lt;/b&gt;&lt;br /&gt;
If the address of a local variable in a function is directly or 
indirectly stored in a global variable, in a heap memory location, 
or somewhere in the stack frame of an ancestor function in the call 
chain, upon returning from the function, it becomes a &lt;i&gt;stack dangling pointer&lt;/i&gt;.
 When a stack dangling pointer is de-referenced to read from or write to
 the memory location, it accesses memory outside of the current stack 
boundaries, and Purify reports a BSR or BSW error. Uninitialized pointer
 variables or incorrect pointer arithmetic can also result in BSR or BSW
 errors.
&lt;br /&gt;
&lt;br /&gt;
In the example in Listing 7, the &lt;code&gt;append&lt;/code&gt;
 method returns the address 
of a local variable. Upon returning from that method, the stack frame 
for the method is freed, and stack boundry shrinks. Now the 
returned pointer would be outside the stack bounds. If you use that 
pointer, Purify will report a BSR or BSW error. In the example,
you would expect &lt;code&gt;append("IBM ", append("Rational ", "Purify"))&lt;/code&gt; to return &lt;code&gt;"IBM Rational Purify"&lt;/code&gt;, but it returns garbage manifesting BSR and BSW errors.&lt;br /&gt;
&lt;br /&gt;
Listing 7. An example of BSR and BSW errors&lt;br /&gt;
&lt;pre class="displaycode"&gt;char *append(const char* s1, const char *s2) {
    const int MAXSIZE = 128; 
    char result[128];
    int i=0, j=0;

    for (j=0; i&amp;lt;MAXSIZE-1 &amp;amp;&amp;amp; j&amp;lt;strlen(s1); i++,j++) {
        result[i] = s1[j];
    }

    for (j=0; i&amp;lt;MAXSIZE-1 &amp;amp;&amp;amp; j&amp;lt;strlen(s2); i++,j++) {
        result[i] = s2[j];
    }

    result[++i] = '\0';
    return result;
}

void genBSRandBSW() {
    char *name = append("IBM ", append("Rational ", "Purify"));
    printf("%s\n", name); /* Expect BSR */
    *name = '\0'; /* Expect BSW */
}&lt;/pre&gt;
&lt;br /&gt;
&lt;b&gt;Using memory that you haven't allocated, or buffer overruns&lt;/b&gt;&lt;br /&gt;
When you don't do a boundary check correctly on an array, and then 
you go beyond the array boundary while in a loop, that is 
called buffer overrun. Buffer overruns are a very common programming 
error resulting from using more memory than you have allocated. Purify 
can detect buffer overruns in arrays residing in heap memory, and it 
reports them as &lt;i&gt;array bound read (ABR)&lt;/i&gt; or &lt;i&gt;array bound write (ABW)&lt;/i&gt; errors. (See Listing 8.)&lt;br /&gt;
&lt;br /&gt;
Listing 8. An example of ABR and ABW errors&lt;br /&gt;
&lt;pre class="displaycode"&gt;void genABRandABW() {
    const char *name = "IBM Rational Purify";
    char *str = (char*) malloc(10);
    strncpy(str, name, 10);
    str[11] = '\0'; /* Expect ABW */
    printf("%s\n", str); /* Expect ABR */
}&lt;/pre&gt;
&lt;br /&gt;
&lt;b&gt;Using faulty heap memory management&lt;/b&gt;&lt;br /&gt;
Explicit memory management in C and C++ programming puts the onus of 
managing memory on the programmers. Therefore, you must be vigilant 
while allocating and freeing heap memory. These are the common memory 
management mistakes:
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt; Memory leaks and potential memory leaks (MLK, PLK, MPK) &lt;/li&gt;
&lt;li&gt; Freeing invalid memory (FIM)
     &lt;ul&gt;
&lt;li&gt; Freeing mismatched memory (FMM) &lt;/li&gt;
&lt;li&gt; Freeing non-heap memory (FNH) &lt;/li&gt;
&lt;li&gt; Freeing unallocated memory (FUM) &lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;b&gt;Memory leaks and potential memory leaks:&lt;/b&gt;&lt;br /&gt;
When all pointers to a heap memory block are lost, that is commonly 
called a memory leak. With no valid pointer to that memory, there is no 
way you can use or release that memory. You lose a pointer to a memory 
when you overwrite it with another address, or when a pointer variable 
goes out of the scope, or when you free a structure or an array that has
 pointers stored in it. Purify scans all of the memory and reports all 
memory blocks without any pointers pointing to them as memory leaks 
(MLK). In addition, it reports all blocks as potential leaks, or PLK 
(called MPK on Windows platforms) when there are no pointers to the 
beginning of the block but there are pointers to the middle of the 
block.&lt;br /&gt;
&lt;br /&gt;
Linsting 9 shows a simple example of a memory leak and a heap dangling pointer. In this example, interestingly, methods &lt;code&gt;foo&lt;/code&gt; and &lt;code&gt;main&lt;/code&gt;
 independently seem to be error-free, but together they manifest both 
errors. This example demonstrates that interactions between methods may 
expose 
multiple flaws that you may not find simply by inspecting individual 
functions. Real-world applications are very complex, thus tedious and 
time-consuming for you to inspect and to analyze the control flow and 
its consequences. Using Purify gives you vital help in detecting errors 
in such situations.&lt;br /&gt;
&lt;br /&gt;
First, in the method &lt;code&gt;foo&lt;/code&gt;, the pointer &lt;code&gt;pi&lt;/code&gt; is
 overwritten with a new memory allocation, and all pointers to the old 
memory block are lost. This results in leaking the memory block that was
 allocated in method &lt;code&gt;main&lt;/code&gt;. Purify reports a memory leak 
(MLK) and specifies the line where the leaked memory was allocated. It 
eliminates the slow process of hunting down the memory block that is 
leaking, therefore shortens the debugging time. You can start debugging 
at the memory allocation site where the leak is reported, and then track
 what you are doing with that pointer and where you are overwriting it.&lt;br /&gt;
&lt;br /&gt;
Later, the method &lt;code&gt;foo&lt;/code&gt; frees up the memory it has allocated, but the pointer &lt;code&gt;pi&lt;/code&gt; still holds the address (it is not set to &lt;code&gt;null&lt;/code&gt;). After returning from method &lt;code&gt;foo&lt;/code&gt; to &lt;code&gt;main&lt;/code&gt;, when you use the pointer &lt;code&gt;pi&lt;/code&gt;, it refers to the memory that has already been freed, so &lt;code&gt;pi&lt;/code&gt; becomes a dangling pointer. Purify promptly reports a FMW error at that location.&lt;br /&gt;
&lt;br /&gt;
Listing 9. An example of a memory leak and a dangling pointer&lt;br /&gt;
&lt;pre class="displaycode"&gt;int *pi;
void foo() { 
    pi = (int*) malloc(8*sizeof(int)); /* Allocate memory for pi */
    /* Oops, leaked the old memory pointed by pi holding 4 ints */
    /* use pi */
    free(pi); /* foo() is done with pi, so free it */
}
void main() {
    pi = (int*) malloc(4*sizeof(int)); /* Expect MLK: foo leaks it */
    foo();
    pi[0] = 10; /* Expect FMW: oops, pi is now a dangling pointer */
}&lt;/pre&gt;
&lt;br /&gt;
Listing 10 shows an example of a potential memory leak. After incrementing pointer &lt;code&gt;plk&lt;/code&gt;,
 it points to the middle of the memory block, but there is no pointer 
pointing to the beginning of that memory block. Therefore, a potential 
memory leak is reported at the memory allocation site for that block.&lt;br /&gt;
&lt;br /&gt;
Listing 10. An example of potential memory leak&lt;br /&gt;
&lt;pre class="displaycode"&gt;int *plk = NULL;
void genPLK() {
    plk = (int *) malloc(2 * sizeof(int)); /* Expect PLK */
    plk++;
}&lt;/pre&gt;
&lt;br /&gt;
&lt;b&gt;Freeing invalid memory:&lt;/b&gt;&lt;br /&gt;
This error occurs whenever you attempt to free memory that you are 
not allowed to free. This may happen for various reasons: allocating and
 freeing memory through inconsistent mechanisms, freeing a non-heap 
memory (say, freeing a pointer that points to stack memory), or freeing 
memory that you haven't allocated. When using Purify for the Windows 
platform, all such errors are reported as &lt;i&gt;freeing invalid memory (FIM)&lt;/i&gt;.
 On the UNIX® system, Purify further classifies these errors by 
reporting freeing mismatched memory (FMM), freeing non-heap memory 
(FNH), and freeing unallocated memory (FUM) to indicate the exact reason
 for the error.&lt;br /&gt;
&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;br /&gt;
&lt;i&gt;Freeing mismatched memory (FMM)&lt;/i&gt; is reported when a memory 
location is de-allocated by using a function from a different family 
than the one used for allocation. For example, you use &lt;code&gt;new&lt;/code&gt; operator to allocate memory, but use method &lt;code&gt;free&lt;/code&gt; to de-allocate it. Purify checks for the following families, or matching pairs:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;malloc()&lt;/code&gt; / &lt;code&gt;free()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;calloc()&lt;/code&gt; / &lt;code&gt;free()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;realloc()&lt;/code&gt; / &lt;code&gt;free()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;operator &lt;code&gt;new&lt;/code&gt; / operator &lt;code&gt;delete&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;operator &lt;code&gt;new[]&lt;/code&gt; / operator &lt;code&gt;delete[]&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
Purify reports any incompatible use of memory allocation and de-allocation routine as an FMM error. In the example in 
Listing 11, the memory was allocated using the &lt;code&gt;malloc&lt;/code&gt; method but freed using the &lt;code&gt;delete&lt;/code&gt;
 operator, which is not the correct counterpart, thus incompatible. 
Another common example of an FMM error is C++ programs that allocate an 
array using the &lt;code&gt;new[]&lt;/code&gt; operator, but &lt;code&gt;free&lt;/code&gt; the memory using a scalar &lt;code&gt;delete&lt;/code&gt; operator instead of array &lt;code&gt;delete[]&lt;/code&gt;
 operator. These errors are hard to detect through code inspection, 
because the memory allocation and de-allocation locations may not be 
located close to each other, and because there is no difference in 
syntax between an integer pointer and a pointer to an integer array.&lt;br /&gt;
&lt;br /&gt;
Listing 11. An example of a freeing mismatched memory error&lt;br /&gt;
&lt;pre class="displaycode"&gt;void genFMM() {
    int *pi = (int*) malloc(4 * sizeof(int));
    delete pi; /* Expect FMM/FIM: should have used free(pi); */
    pi = new int[5];
    delete pi; /* Expect FMM/FIM: should have used delete[] pi; */
}&lt;/pre&gt;
&lt;br /&gt;
&lt;i&gt;Freeing non-heap memory (FNH)&lt;/i&gt; error is reported when you call &lt;code&gt;free&lt;/code&gt; with a non-heap address (a stack address, for instance). &lt;i&gt;Freeing unallocated memory (FUM)&lt;/i&gt;
 is reported when you try to free unallocated memory, such as memory 
that you have already freed, or the pointer you are trying to free 
points to the middle of a memory block. Listing 12 shows examples of these errors.&lt;br /&gt;
&lt;br /&gt;
Listing 12. Examples of freeing non-heap memory and freeing unallocated memory errors&lt;br /&gt;
&lt;pre&gt;void genFNH() {
    int fnh = 0;
    free(&amp;amp;fnh); /* Expect FNH: freeing stack memory */
}

void genFUM() {
    int *fum = (int *) malloc(4 * sizeof(int));
    free(fum+1); /* Expect FUM: fum+1 points to middle of a block */
    free(fum);
    free(fum); /* Expect FUM: freeing already freed memory */
}&lt;/pre&gt;
&lt;pre class="displaycode"&gt;&lt;/pre&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7852536510622031749-2941720051249733523?l=poongcha.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/icXPN/~4/KnB7ORYaAtI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://poongcha.blogspot.com/feeds/2941720051249733523/comments/default" title="댓글" /><link rel="replies" type="text/html" href="http://poongcha.blogspot.com/2012/01/purify-detecting-memory-errors.html#comment-form" title="0개의 덧글" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7852536510622031749/posts/default/2941720051249733523?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7852536510622031749/posts/default/2941720051249733523?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/icXPN/~3/KnB7ORYaAtI/purify-detecting-memory-errors.html" title="Purify - 메모리 에러 설명" /><author><name>풍차</name><uri>http://www.blogger.com/profile/10628167383220311152</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="23" height="32" src="http://2.bp.blogspot.com/_icOPzB_w_RA/SinjXnz8NRI/AAAAAAAAABA/13rtJajEtZI/S220/%EC%9A%B0%EB%B6%84%ED%88%AC.png" /></author><thr:total>0</thr:total><feedburner:origLink>http://poongcha.blogspot.com/2012/01/purify-detecting-memory-errors.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUEBQXY9eip7ImA9WhRVEUU.&quot;"><id>tag:blogger.com,1999:blog-7852536510622031749.post-6250233659100154523</id><published>2012-01-08T00:32:00.001+09:00</published><updated>2012-01-10T17:20:50.862+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-10T17:20:50.862+09:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="purify" /><title>Purify - 고급 사용법</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/9Nn6ZaTlElxefNc2rYzX7w3mM64/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/9Nn6ZaTlElxefNc2rYzX7w3mM64/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/9Nn6ZaTlElxefNc2rYzX7w3mM64/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/9Nn6ZaTlElxefNc2rYzX7w3mM64/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;출처 :&amp;nbsp;http://www.ibm.com/developerworks/rational/library/08/0226_gupta-gaurav/index.html&lt;br /&gt;
&lt;br /&gt;
본 자료는 &lt;b&gt;Purify&lt;/b&gt; &lt;b&gt;옵션&lt;/b&gt;과 &lt;b&gt;지시문&lt;/b&gt;에 대한 개요를 먼저 소개하고 다음 항목에 대한 설명을 하고자 합니다:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;캐시 관리:&lt;/b&gt;&amp;nbsp;삽입한 바이너리 파일의 관리 및 공유하는 방법&lt;/li&gt;
&lt;li&gt;
                    &lt;b&gt;부분 Purify: &lt;/b&gt;프로그램의 일부부만을 삽입하여 실행 시간 오버헤드와 탐지 영역을 줄이는 방법&lt;/li&gt;
&lt;li&gt;&lt;b&gt;힙 메모리 관리:&lt;/b&gt;&amp;nbsp;프로그램 실행시 메모리 오버헤드를 제한하고 힙 사용 보고서를 맞춤 설정하는 방법&lt;/li&gt;
&lt;/ul&gt;
&lt;span class="atitle" style="font-size: large;"&gt;&lt;b&gt;Purify 옵션&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Purify에서는 아래의 두가지 옵션을 통해 세밀한 제어를 제공합니다.&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;빌드타임 옵션&lt;/li&gt;
&lt;li&gt;런타임 옵션&lt;/li&gt;
&lt;/ul&gt;
&lt;b&gt;빌드타임 옵션&lt;/b&gt;은 삽입시에 사용됩니다. 예를 들어, 정적 데이터에 대한 &lt;b&gt;버퍼 오버런&lt;/b&gt;을 체크하지 않을 경우, 삽입시에 &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;b&gt;-static-checking &lt;/b&gt;&lt;/span&gt;옵션을 사용합니다:&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;$ purify &lt;b&gt;-static-checking=no&lt;/b&gt; cc your_prog.c&lt;/span&gt;&lt;br /&gt;
&lt;table border="0" cellpadding="0" cellspacing="0"&gt;&lt;tbody&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
&lt;b&gt;런타임 옵션&lt;/b&gt;은 삽입된 프로그램의 런타임 행위에 영향을 줍니다. 예를 들어 보고된 에러에 대한 콜 스택 체인을 더 길게 보여주고자 할 때 아래와 같은 옵션을 사용합니다:&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;$ purify &lt;b&gt;-chain-length=10&lt;/b&gt; cc your_prog.c&lt;/span&gt;&lt;br /&gt;
&lt;table border="0" cellpadding="0" cellspacing="0"&gt;&lt;tbody&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
옵션은 링크 라인 뿐아니라 환경변수&amp;nbsp;&lt;b&gt;PUREOPTIONS&lt;/b&gt;&amp;nbsp;와&amp;nbsp;&lt;b&gt;PURIFYOPTIONS&lt;/b&gt;&amp;nbsp;를 통해 표현할 수 있습니다. &lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;환경변수&amp;nbsp;&lt;b&gt;PUREOPTIONS&lt;/b&gt;는 Purify, Quantify 및 PureCoverage에도 적용됩니다. &lt;/li&gt;
&lt;li&gt;환경변수&amp;nbsp;&lt;b&gt;PURIFYOPTIONS&lt;/b&gt;는 Purify에만 적용됩니다. &lt;/li&gt;
&lt;/ul&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;sh, ksh, 및&lt;/span&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;bash 쉘을 사용하는 경우&lt;/span&gt;:&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;$ export PURIFYOPTIONS="-static-checking=no -chain-length=10"&lt;/span&gt;&lt;br /&gt;
&lt;table border="0" cellpadding="0" cellspacing="0"&gt;&lt;tbody&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;csh &lt;/span&gt;또는&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;tcsh 쉘을 사용하는 경우&lt;/span&gt;:&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;% setenv PURIFYOPTIONS "-static-checking=no -chain-length=10"&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;table border="0" cellpadding="0" cellspacing="0"&gt;&lt;tbody&gt;&lt;/tbody&gt;&lt;/table&gt;
링크 라인에 명시된&amp;nbsp;&lt;b&gt;빌드타임 옵션&lt;/b&gt;은 환경변수에 나타난 같은 옵션을 덮어씁니다.&lt;br /&gt;
&lt;br /&gt;
Purify는 삽입시점의 &lt;b&gt;런타임 옵션&lt;/b&gt;을 삽입된 프로그램에 저장합니다. 실행시,&amp;nbsp;(&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;b&gt;-ignore-runtime-environment &lt;/b&gt;&lt;/span&gt;빌드타임 옵션을 사용하지 않는 경우) 환경변수는 삽입된 프로그램에 저장된 런타임 옵션을 덮어씁니다.&lt;br /&gt;
&lt;br /&gt;
Purify GUI를 통해 명시한&amp;nbsp;&lt;b&gt;런타임 옵션&lt;/b&gt;은 환경변수 및 링크라인에 명시된 옵션을 덮어씁니다.&lt;br /&gt;
&lt;br /&gt;
Purify는 도움말 및 버전 문자열을 제공하기 위해 여러 &lt;b&gt;빌드타임 옵션&lt;/b&gt;을 제공합니다:&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;$ purify -version&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;$ purify -usage&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;$ purify -help&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;$ purify -onlinehelp&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;table border="0" cellpadding="0" cellspacing="0"&gt;&lt;tbody&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
&lt;b style="font-family: 'Courier New', Courier, monospace;"&gt;-print-home-dir 빌드타임 옵션&lt;/b&gt;은 Purify가 설치된 디렉토리를 출력합니다. 이를 이용하여, 아래처럼 &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;b&gt;purify_what_options &lt;/b&gt;&lt;/span&gt;스크립트를 실행하여 삽입시 사용된 옵션을 알아볼 수 있습니다:&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;b&gt;$ `purify -print-home-dir`/purify_what_options &amp;lt;your_prog.pure&amp;gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;table border="0" cellpadding="0" cellspacing="0"&gt;&lt;tbody&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
Purify API를 사용하기 위해 &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;purify.h를 프로그램에 포함시키는 경우, 컴파일러의 헤더파일 탐색경로를 아래처럼 표기할 수 있습니다&lt;/span&gt;:&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;$ cc -c -I`purify -print-home-dir` your_prog.c
&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="atitle" style="font-size: large;"&gt;&lt;b&gt;Purify 지시문&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;a href="http://www.blogger.com/blogger.g?blogID=7852536510622031749" name="N10158"&gt;&lt;span class="atitle"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;
커맨드 라인 옵션외에 추가로 다양한 지시문을 명시함으로써 삽입 및 에러 보고에 대한 상세 제어를 할 수 있습니다.&lt;br /&gt;
&lt;br /&gt;
예를 들어 써드파티 라이브러리(&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;libfoo&lt;/span&gt;)에 있는 함수(&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;foo&lt;/span&gt;)에 메모리에러(uninitialized memory read, UMR)가 있다고 가정해 봅니다. 라이브러리 제공 벤더에 에러를 보고했고, 이에 대한 픽스를 기다리는 동안에, Purify 분석 결과에서 해당 에러를 보이지 않게 하고 싶다면, &lt;b&gt;suppress&lt;/b&gt;&amp;nbsp;지시문을 아래와 같이 사용합니다:&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;suppress umr foo&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;table border="0" cellpadding="0" cellspacing="0"&gt;&lt;tbody&gt;&lt;/tbody&gt;&lt;/table&gt;
만약 &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;suppress 지시문을 통해 보이지않는 에러를 보고싶다면&amp;nbsp;&lt;/span&gt;Purify GUI의&amp;nbsp;&lt;b&gt;View&amp;nbsp;&lt;/b&gt;메뉴에서 &lt;b&gt;Suppressed&lt;/b&gt;를 클릭합니다.&lt;br /&gt;
&lt;br /&gt;
Purify는 아래 예처럼 구체적으로 또는 일반적으로 기술할 수 있도록 합니다:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;특정 콜 체인 상의 UMR를 숨기고자 할때는 전체 콜 체인을 제시합니다:&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;suppress umr printf; foo; bar; main&lt;/span&gt;&lt;br /&gt;&lt;table border="0" cellpadding="0" cellspacing="0"&gt;&lt;tbody&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
                &lt;/li&gt;
&lt;li&gt;일부 콜 체인과 매칭되는 UMR를 숨기고자 할때는 생략(...) 기호를 통해 제시합니다:&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;suppress umr ...; foo; ...; main &lt;/span&gt;&lt;br /&gt;&lt;table border="0" cellpadding="0" cellspacing="0"&gt;&lt;tbody&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
                &lt;/li&gt;
&lt;li&gt;특정 라이브러리의 모든 UMR를 숨기고자 할때는 해당 라이브러리를 제시합니다:&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;suppress umr "libfoo*"&lt;/span&gt;&lt;br /&gt;&lt;table border="0" cellpadding="0" cellspacing="0"&gt;&lt;tbody&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
                &lt;/li&gt;
&lt;li&gt;모든 UMR를 숨기고자 할때는 다음과 같습니다 (물론 위험천만한(?) 생각입니다):&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;suppress umr *&lt;/span&gt;&lt;br /&gt;&lt;table border="0" cellpadding="0" cellspacing="0"&gt;&lt;tbody&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
                &lt;/li&gt;
&lt;/ul&gt;
Purify는 지시문이 저장된 세곳의&lt;b&gt;&amp;nbsp;.purify&lt;/b&gt;&amp;nbsp;파일을 다음 순서로 검색합니다:&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;lt;purify-installation-home&amp;gt;/.purify&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;lt;users-home-dir&amp;gt;/.purify&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;lt;current-working-directory&amp;gt;/.purify&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
모든 Purify 사용자, 프로젝트 사용자, 자기 자신 등 맞춤 설정 영역에 맞게 해당 파일을 수정하여 지시문을 제공합니다.&lt;br /&gt;
&lt;br /&gt;
또 다른 방법으로 Purify GUI에서 에러를 선택하고 팝업메뉴에서 &lt;b&gt;Suppress&lt;/b&gt;를 선택할 수 있습니다. 그리고 그림 1에서 처럼, 에러타입, 콜체인타입 등을 명시할 수 있습니다. .purify 파일 위치를 지정한 후&amp;nbsp;&lt;b&gt;Make permanent&lt;/b&gt;를 클릭하여 저장할 수도 있습니다.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;그림 1. Purify Suppression 대화상자&lt;/b&gt;&lt;br /&gt;
&lt;img alt="Purify Suppression dialog screen capture" height="442" src="http://www.ibm.com/developerworks/rational/library/08/0226_gupta-gaurav/figure1.jpg" width="424" /&gt;
            &lt;br /&gt;
&lt;br /&gt;
또다른 지시문&amp;nbsp;&lt;b&gt;kill&lt;/b&gt;은 &amp;nbsp;&lt;b&gt;suppress&lt;/b&gt;와 거의 유사하지만, &amp;nbsp;GUI에서 &lt;b&gt;View &amp;gt; Suppressed
          Messages&lt;/b&gt;&amp;nbsp;메뉴를 사용해도 볼 수 없습니다. 어떤 에러가 아주 많이 발생하는 경우에 &lt;b&gt;suppress&lt;/b&gt; 대신 &lt;b&gt;kill&lt;/b&gt;을 사용하면 프로그램 실행이 더 빨라집니다.&lt;br /&gt;
&lt;a href="http://www.blogger.com/blogger.g?blogID=7852536510622031749" name="N101E1"&gt;&lt;span class="atitle"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;
&lt;span class="atitle" style="font-size: large;"&gt;&lt;b&gt;캐시 관리&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;a href="http://www.blogger.com/blogger.g?blogID=7852536510622031749" name="N101E1"&gt;&lt;span class="atitle"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;
프로그램에 대한 삽입시에, Purify는 프로그램에서 직접 또는 간접적으로(예&amp;nbsp;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;libc&lt;/span&gt;) 사용하는 모든 라이브러리들 또한 삽입을 하고 삽입된 라이브러리를 원 라이브러리 대신 프로그램과 바인딩을 합니다. 만약 라이브러리가 있는 디렉토리에 쓰기권한이 있다면 해당 라이브러리 디렉토리에 삽입된 라이브러리를 생성합니다.&lt;br /&gt;
&lt;br /&gt;
만약 쓰기 권한이 없다면, Purify 설치 영역내 디폴트 캐시 디렉토리에 삽입된 라이브러리를 생성합니다. &lt;br /&gt;
이러한 캐시관련된 여러 &lt;b&gt;빌드타임 옵션&lt;/b&gt;이 있습니다. 삽입된 라이브러리를 여러 디렉토리에 산재하지 않고 캐시 디렉토리에 저장하기를 원한다면 &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;b&gt;-always-use-cache-dir &lt;/b&gt;&lt;/span&gt;옵션을 사용합니다. 디폴트 캐시 디렉토리 대신 별도 캐시 디렉토리를 지정하길 원한다면 &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;b&gt;-cache-dir=&amp;lt;dir-name&amp;gt;&amp;nbsp;&lt;/b&gt;&lt;/span&gt;옵션을 사용합니다. 이러한 옵션들을 통해서, 손쉽게 캐시 디렉토리를 삭제함으로써 모든 삽입된 라이브러리를 제거할 수 있습니다.&lt;br /&gt;
&lt;br /&gt;
프로그램에 대한 삽입시에, Purify는 마지막 삽입이후 변경이 있거나 삽입된 라이브러리를 찾을 수 없는 경우에만 라이브러리를 삽입합니다. 이는 삽입 시간을 절약하는 데 도움이 됩니다. 만약 이전에 삽입된 라이브러리를 무시하고 모든 필요한 라이브러리를 삽입하고자 할때는&amp;nbsp;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;b&gt;-force-rebuild &lt;/b&gt;&lt;/span&gt;옵션을 사용합니다. 이는 고급 옵션 (예&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;b&gt;&amp;nbsp;-static-checking-guardzone&lt;/b&gt;&lt;/span&gt;)를 사용하여 재 삽입을 강제할 경우 유용합니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
일반적으론, 하나의 머신에서 삽입한 프로그램은 다른 머신에서 실행할 수 없습니다. 일반적으로 프로그램은 시스템 라이브러리들(예&amp;nbsp;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;libc&lt;/span&gt;)에 의존하는 데, 시스템 라이브러리들은 OS 패키지들의 다양한 패치 수준에 따라서 머신마다 달라질 수 있습니다.&lt;br /&gt;
&lt;br /&gt;
프로그램이 같은 시스템의 원래 라이브러리에 상응하는 삽입된 라이브러리를 사용하도록 보장하기 위해서, Purify는 삽입된 라이브러리를&amp;nbsp;호스트 이름 별로&amp;nbsp;캐시하는 메커니즘을 제공합니다.&lt;br /&gt;
&lt;br /&gt;
한편, 프로그램은 모든 머신에서 똑같거나 같은 네트워크 위치로 접근할 수 있는 라이브러리나 써드파티 라이브러리를 사용할 수도 있습니다. 이런 경우, 각각의 호스트별로 삽입된 해당 라이브러리를 가지고 싶어하지 않을 겁니다. 사본이 똑같기에 저장공간을 낭비하기 때문입니다. 이를 위해 Purify는&amp;nbsp;IBM® AIX®, Linux® 및 Solaris® UNIX® 플랫폼에서&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;b&gt;&amp;nbsp;repure &lt;/b&gt;&lt;/span&gt;메커니즘을 제공합니다. 다만 삽입시에 다음과 같은 점을 주의해야 합니다:&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;먼저, 모든 머신상에 존재하는 로컬 경로를 선정합니다.예를 들어&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&lt;b&gt;/tmp&lt;/b&gt; &lt;/span&gt;디렉토리는 모든 머신에 있지만 로컬 경로이고, 머신 간에 공유되고 있지 않습니다. &lt;b&gt;팁:&lt;/b&gt;&amp;nbsp;홈 디렉토리나 NFS 상의 디렉토리를 사용하지 마십시요.&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;b&gt;-local-cache-dir &lt;/b&gt;&lt;/span&gt;옵션을 사용하여, 시스템에 특화된 라이브러리의 삽입 결과를 저장할 경로를 지정합니다. 예:&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;$ purify -always-use-cache-dir -local-cache-dir=/tmp -cache-dir=./cache \&lt;br /&gt;&amp;nbsp;cc -g test.c -o test.pure&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;같은 머신에서 삽입된 프로그램을 실행할 수 있습니다:&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;$ ./test.pure&lt;/span&gt;&lt;br /&gt;&lt;table border="0" cellpadding="0" cellspacing="0"&gt;&lt;tbody&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
                &lt;/li&gt;
&lt;li&gt;다른 머신에서 삽입된 프로그램을 실행하길 원한다면, 다른 머신에서&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;repure&lt;/span&gt;를 실행합니다:&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;$ repure ./test.pure&lt;/span&gt;&lt;br /&gt;&lt;table border="0" cellpadding="0" cellspacing="0"&gt;&lt;tbody&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
                &lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;repure&amp;nbsp;&lt;/span&gt;실행 후 &amp;nbsp;다른 머신에서 프로그램을 실행할 수 있습니다:&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;$ ./test.pure&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;br /&gt;
오래된 삽입된 파일들을 삭제하고 싶다면, Purify 설치 영역의&amp;nbsp;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;b&gt;pure_remove_old_files &lt;/b&gt;&lt;/span&gt;스크립트를 실행합니다:&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;`purify -print-home-dir`/pure_remove_old_files &amp;lt;path&amp;gt; &amp;lt;days&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;table border="0" cellpadding="0" cellspacing="0"&gt;&lt;tbody&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
이 스크립트는 &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;b&gt;_pure_&lt;/b&gt;&lt;/span&gt;를 포함한 파일이나 &lt;b style="font-family: 'Courier New', Courier, monospace;"&gt;.so &lt;/b&gt;나&amp;nbsp;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;b&gt;.sl &lt;/b&gt;&lt;/span&gt;확장자를 갖는 공유 라이브러리 파일등 삽입된 라이브러리들만을 제거합니다. 예를 들어 파일시스템 상의 14일 이상된 모든 삽입된 파일을 삭제할 경우, 아래와 같이 실행합니다:&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;$ pure_remove_old_files / 14
&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="atitle"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="atitle" style="font-size: large;"&gt;&lt;b&gt;부분 Purify&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;a href="http://www.blogger.com/blogger.g?blogID=7852536510622031749" name="N1029B"&gt;&lt;span class="atitle"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;
Purify는 부당한 메모리 엑세스를 체크하기 위해 관심있는 곳에 삽입을 합니다. 체크를 하고, 체크에 필요한 데이터를 관리하는 것은 성능 상의 오버헤드를 초래합니다. 때때로 프로그램의 특정 콤포넌트들에 있는 메모리 에러에만 관심이 가능 경우도 있습니다. 이러한 경우 부분적으로 프로그램에 삽입을 하고 관심없는 공유 라이브러리를 배제할 수 있는 메커니즘을 통해 삽입된 프로그램 실행시 실행시 오버헤드를 많이 줄일 수 있습니다.&lt;br /&gt;
&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;주의:&lt;/b&gt;
                &lt;br /&gt;
부분 삽입은 HP-UX와 AIX 플랫폼에서만 동작합니다. Solaris SPARC 플랫폼은 제한적으로 지원하고, Solaris
        x86 및 Linux 플랫폼은 지원하지 않습니다.&lt;br /&gt;
공유 라이브러리를 배제하더라도, Purify는 배제된 공유라이브러리에서 할당받은 메모리 누스 등 힙 관리 에러를 탐지합니다.&lt;br /&gt;
부분 삽입을 통해 아래처럼 라이브러리를 배제할 수 있습니다:&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;$ purify -selective -exclude-libs=libfoo1.so:libfoo2.so cc -g app.c \&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;-o a.out.pure -lfoo1 -lfoo2 -lbar&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;b&gt;-exclude-libs &lt;/b&gt;&lt;/span&gt;옵션에 콜론으로 나열한 라이브러리 목록을 제공하거나&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;b&gt;&amp;nbsp;.purify &lt;/b&gt;&lt;/span&gt;지시문 파일에&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;b&gt;&amp;nbsp;exclude&amp;nbsp;&lt;/b&gt;&lt;/span&gt;지시문을 사용할 수도 있습니다:&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;exclude libfoo*&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;table border="0" cellpadding="0" cellspacing="0"&gt;&lt;tbody&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;b&gt;-selective &lt;/b&gt;&lt;/span&gt;옵션을 사용하면 Purify가 라이브러리 배제로 인해 발행할 수 있는 에러를 탐지해서 배제할 수 있도록 지시합니다:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;예를 들어 main()이 foo()를 호출하고, foo()는 bar()를 호출하는 경우에 foo()를 삽입에서 배제한다고 가정합니다. 추가로 main()에서 메모리를 할당받고, foo()에서 메모리를 초기화 하고, bar()에서 메모리를 사용한다고 가정합니다. foo()를 삽입처리하지 않은 경우, Purify는 foo()에서 메모리가 초기화되었다는 것을 알지 못하므로, bar()에서 메모리를 사용할 때, uninitialized memory read (UMR) 에러를 보고할 수 있습니다. &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;b&gt;-selective &lt;/b&gt;&lt;/span&gt;옵션은 이런 경우 Purify가 이런 류의 에러를 제거하도록 지시합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;라이브러리를 배제한 경우 Purify가 몇몇 에러를 찾지 못할 수 있습니다.&amp;nbsp;예를 들어 main()이 foo()를 호출하고 초기화되지 않은 버퍼를 전달한다고 가정합니다. Purify는 foo()에서 버퍼를 사용할 때마다 UMR를 보고합니다. 만약 foo()가 libfoo.so 공유라이브러리에 있고, 이를 배제했다고 한다면, Purify는 관련 메모리 체킹 코드를 삽입하지 못했기 때문에, 삽입된 코드에서 실행이 된다고 하더라도 foo()에서 초기화하지 않은 버퍼를 사용하더라도 탐지를 할 수 없습니다.&lt;/li&gt;
&lt;/ul&gt;
위의 두개의 예는 포괄적인 에러탐지와 실행시의 오버헤드에는 상당한 상충이 있다는 것을 보여줍니다. 그러므로, 신중히 라이브러리의 역할을 파악해서 배제할 공유 라이브러리를 선택해야 합니다.&lt;br /&gt;
&lt;br /&gt;
Purify는 삽입처리되지 않는 코드에서 발생한 버퍼 오버런 에러를 탐지할 수 있습니다만 에러가 발생한 시점이 아닌 버퍼가 해제되는 시점에 탐지합니다. Purify는 에러가 발생할 때 보고를 하지만 삽입되지 않는 코드에 대한 에러는 제때 보고할 수 없습니다. &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;b&gt;-late-detect-logic &lt;/b&gt;&lt;/span&gt;옵션은 힙 메모리 블럭이 해제될 때 추가적인 체크를 하도록 합니다. 버퍼 오버런을 탐지한 경우, Array Bound Write Late (ABWL) 에러를 보고합니다.&lt;br /&gt;
&lt;a href="http://www.blogger.com/blogger.g?blogID=7852536510622031749" name="N10351"&gt;&lt;span class="atitle" style="font-size: large;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;
&lt;span class="atitle" style="font-size: large;"&gt;&lt;b&gt;힙 메모리 관리 에러&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Purify 는 삽입된 프로그램 실행시 메모리 및 실행 시간 오버헤드를 제어할 수 있는 몇가지 옵션을 제공합니다. 프로그램이 메모리블럭을 해제할 때, Purify는 곧바로 해당 메모리를 해제하지 않습니다. 대신에, 해제된 메모리를 FIFO 큐에 넣습니다. 이를 통해 Purify는 해제된 메모리를 가리키는 포인터에 대한 에러(Free Memory&amp;nbsp;Read/Write, FMR/FMW)를 탐지하고 보고할 수 있습니다. 만약 해제된 메모리가 바로 힙으로 반환됐다면 곧바로 재사용될 수 있었지만 Purify는 해제된 블럭에 대한 부당한 엑세스인지 할당된 블럭에 대한 합당한 엑세스인지 알수 없을 겁니다.&lt;br /&gt;
&lt;br /&gt;
큐의 디폴트 크기는 100입니다. 큐가 꽉 차면, Purify는 큐의 첫번째 메모리 블럭을 해제한 뒤 새로 할당받은 블럭을 추가합니다. 큐의 크기는 &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;b&gt;-free-queue-length=&amp;lt;value&amp;gt;&amp;nbsp;&lt;/b&gt;&lt;/span&gt;옵션으로 변경할 수 있습니다. 큐 크기가 커지면 부당한 포인터를 탐지할 가능성을 높이지만, 메모리 오버헤드 비용은 커지게 됩니다..&lt;br /&gt;
&lt;br /&gt;
프리 큐는 작은 블럭에만 사용되며 임계치 이하의 블럭을 관리합니다. 큰 블럭은 바로 해제하여 힙으로 넘겨서 많은 메모리 사용의 위험성을 회피합니다. &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;b&gt;-free-queue-threshold=&amp;lt;value&amp;gt;&amp;nbsp;&lt;/b&gt;&lt;/span&gt;옵션으로 해당 임계치를 명시할 수 있습니다. 디폴트는 10000 바이트입니다. 즉 10000 바이트 이상의 블럭은 곧바로 해제됩니다.&lt;br /&gt;
&lt;br /&gt;
Purify는 프로그램 종료시점에 모든 메모리 누수를 보고합니다. 사용중인 메모리 블럭에 대한 정보가 필요하다면, &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;b&gt;-inuse-at-exit=yes &lt;/b&gt;&lt;/span&gt;옵션을 사용합니다. 마찬가지로 프로그램 종료시에 사용중인 파일 디스크립터에 대한 정보가 필요하면, &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;b&gt;-fds-inuse-at-exit=yes &lt;/b&gt;&lt;/span&gt;옵션을 사용합니다.&lt;br /&gt;
&lt;br /&gt;
AIX 시스템에서는, 메모리 누수에만 관심이 있는 경우, &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;b&gt;-memory-leaks-only&lt;/b&gt;&lt;/span&gt;&amp;nbsp;옵션을 사용할 수 있으며, 이 경우 Purify는 메모리 누수 및 Freeing Memory Mismatch (FMM) 에러 같은&amp;nbsp;몇몇&amp;nbsp;힙 관리 에러 탐지를 위한 매우 가벼운 삽입처리를 합니다. 이로 인해 실행시 일상적인 메모리 엑세스 검증을 하지 않아서 실행이 훨씬 빨리집니다.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7852536510622031749-6250233659100154523?l=poongcha.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/icXPN/~4/EdUaXGI-2nM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://poongcha.blogspot.com/feeds/6250233659100154523/comments/default" title="댓글" /><link rel="replies" type="text/html" href="http://poongcha.blogspot.com/2012/01/advanced-features-of-ibm-rational.html#comment-form" title="0개의 덧글" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7852536510622031749/posts/default/6250233659100154523?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7852536510622031749/posts/default/6250233659100154523?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/icXPN/~3/EdUaXGI-2nM/advanced-features-of-ibm-rational.html" title="Purify - 고급 사용법" /><author><name>풍차</name><uri>http://www.blogger.com/profile/10628167383220311152</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="23" height="32" src="http://2.bp.blogspot.com/_icOPzB_w_RA/SinjXnz8NRI/AAAAAAAAABA/13rtJajEtZI/S220/%EC%9A%B0%EB%B6%84%ED%88%AC.png" /></author><thr:total>0</thr:total><feedburner:origLink>http://poongcha.blogspot.com/2012/01/advanced-features-of-ibm-rational.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUEHRHo9eip7ImA9WhRVEUU.&quot;"><id>tag:blogger.com,1999:blog-7852536510622031749.post-4606195792274718446</id><published>2012-01-07T23:54:00.000+09:00</published><updated>2012-01-10T17:20:35.462+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-10T17:20:35.462+09:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="purify" /><title>Purify Linux - 사용법 개요</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/8EQyMZMByU2L9lTm_tdUgZD-pFk/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/8EQyMZMByU2L9lTm_tdUgZD-pFk/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/8EQyMZMByU2L9lTm_tdUgZD-pFk/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/8EQyMZMByU2L9lTm_tdUgZD-pFk/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;출처 : http://www.ibm.com/developerworks/rational/library/05/r-3120/index.html&lt;br /&gt;
&lt;br /&gt;
간단한 프로그램 분석을 통해 다음 두가지를 보여주고자 합니다.&lt;br /&gt;
(1) 리눅스에 Purify가 제대로 설치되어 있는 지 확인합니다.&lt;br /&gt;
(2) 작고 간단한 프로그램이지만 에러가 발생하기가 쉬우며 어떤 수정이 필요한지 보여줍니다.&lt;br /&gt;
&lt;br /&gt;
아래 conv.c는 화씨를 섭씨로 변경하는 C 프로그램으로 Kernighan 및 Ritchie의&amp;nbsp;&lt;a href="http://www.ibm.com/developerworks/rational/library/05/r-3120/index.html#re"&gt;The C Programming Language&lt;/a&gt;에 예시된 프로그램을 조금 변경한 것입니다.&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;#include &amp;lt;stdio.h&amp;gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;#include &amp;lt;stdlib.h&amp;gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;#include &amp;lt;malloc.h&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;main()&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;{&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;int *fahr;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;fahr = (int *)malloc(sizeof(int));&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;int celsius;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;int lower, upper, step;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;celsius = lower + 10;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;lower = 0; /* lower limit of temperature table */&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;upper = 300; /* upper limit */&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;step = 20; /* step size */&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;*fahr = lower;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;while(*fahr &amp;lt;= upper){&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp;celsius = 5 * (*fahr - 32) / 9;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp;printf("%d\t%d\n", *fahr, celsius);&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp;*fahr = *fahr + step;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;}&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;}&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Purify를 이용해 이 프로그램을 분석하기 위해, 링크 커맨드 앞에 purify를 추가함으로써 프로그램에 삽입을 합니다. Purify 분석 메세지를 상세화하기 위해서 -g 옵션을 추가할 수 있습니다:&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;purify gcc [-g] conv.c&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
그림 1: gcc 컴파일러와 Purify를 이용한 conv.c 프로그램 빌드 및 삽입&lt;br /&gt;
&lt;a href="http://3.bp.blogspot.com/-BJtH0tfa1nU/TwqW-3XyoKI/AAAAAAAAARw/G1CPimukgTA/s1600/conv-instrement.png"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-BJtH0tfa1nU/TwqW-3XyoKI/AAAAAAAAARw/G1CPimukgTA/s640/conv-instrement.png" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
만약 프로그램 컴파일 및 링크를 단계별로 수행할 경우에는 링크 라인에만 purify를 명시합니다:&lt;br /&gt;
컴파일 라인:&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;gcc -c [-g] conv.c&lt;/span&gt;&lt;br /&gt;
링크 라인:&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;purify gcc [-g] conv.o&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Rational PurifyPlus for Linux and UNIX에서 지원하는 컴파일러 목록은 아래와 같습니다.&lt;br /&gt;
출처:&amp;nbsp;&lt;a href="http://www-01.ibm.com/software/awdtools/purifyplus/unix/sysreq/"&gt;http://www-01.ibm.com/software/awdtools/purifyplus/unix/sysreq/&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;table border="1" cellpadding="1" cellspacing="1"&gt;&lt;thead&gt;
&lt;tr&gt;&lt;th scope="col" style="width: 45%;"&gt;&lt;span style="font-size: x-small;"&gt;Operating System&lt;/span&gt;&lt;/th&gt;&lt;th scope="col" style="width: 35%;"&gt;&lt;span style="font-size: x-small;"&gt;Software&lt;/span&gt;&lt;/th&gt;&lt;th scope="col" style="width: 20%;"&gt;&lt;span style="font-size: x-small;"&gt;Hardware&lt;/span&gt;&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;th class="ibm-table-row" scope="row"&gt;&lt;span style="font-size: x-small;"&gt;Solaris® 10 base through 5/09&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: x-small;"&gt;Solaris 9 base through 9/05&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: x-small;"&gt;Solaris 8 base through 2/04&lt;/span&gt;&lt;/th&gt;&lt;td&gt;&lt;span style="font-size: x-small;"&gt;Sun C/C++ 5.3 through 5.10&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: x-small;"&gt;GNU gcc/g++ 4.0 through 4.4&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: x-small;"&gt;GNU gcc/g++ 3.0 through 3.4&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-size: x-small;"&gt;Sun UltraSPARC®&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th class="ibm-table-row" scope="row"&gt;&lt;span style="font-size: x-small;"&gt;Solaris 10 6/06 through 5/09&lt;/span&gt;&lt;/th&gt;&lt;td&gt;&lt;span style="font-size: x-small;"&gt;Sun C/C++ 5.8 through 5.10&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: x-small;"&gt;GNU gcc/g++ 4.0 through 4.4&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: x-small;"&gt;GNU gcc/g++ 3.4&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-size: x-small;"&gt;AMD64™&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: x-small;"&gt;Intel® 64&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th class="ibm-table-row" scope="row"&gt;&lt;span style="font-size: x-small;"&gt;RHEL 5 (Server/Desktop) base through 5.4&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: x-small;"&gt;RHEL 4 (AS/ES/WS) base through 4.8&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: x-small;"&gt;RHEL 3 (AS/ES/WS) base through U9&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: x-small;"&gt;SLES 11 base&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: x-small;"&gt;SLES 10 base through SP2&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: x-small;"&gt;SLES 9 base through SP4&lt;/span&gt;&lt;/th&gt;&lt;td&gt;&lt;span style="font-size: x-small;"&gt;GNU gcc/g++ 4.0 through 4.4&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: x-small;"&gt;GNU gcc/g++ 3.2 through 3.4&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: x-small;"&gt;Intel icc 11.0&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: x-small;"&gt;Intel icc 10.1&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-size: x-small;"&gt;Intel IA-32&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th class="ibm-table-row" scope="row"&gt;&lt;span style="font-size: x-small;"&gt;RHEL 5 (Server/Desktop) base through 5.4&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: x-small;"&gt;RHEL 4 (AS/ES/WS) base through 4.8&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: x-small;"&gt;SLES 11 base&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: x-small;"&gt;SLES 10 base through SP2&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: x-small;"&gt;SLES 9 base through SP4&lt;/span&gt;&lt;/th&gt;&lt;td&gt;&lt;span style="font-size: x-small;"&gt;GNU gcc/g++ 4.0 through 4.4&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: x-small;"&gt;GNU gcc/g++ 3.2 through 3.4&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: x-small;"&gt;Intel icc 11.0&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: x-small;"&gt;Intel icc 10.1&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-size: x-small;"&gt;AMD64&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: x-small;"&gt;Intel 64&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th class="ibm-table-row" scope="row"&gt;&lt;span style="font-size: x-small;"&gt;AIX® 6.1 base through TL3&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: x-small;"&gt;AIX 5L v5.3 TL5 through TL9&lt;/span&gt;&lt;/th&gt;&lt;td&gt;&lt;span style="font-size: x-small;"&gt;IBM® XL C/C++ 10.1&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: x-small;"&gt;IBM XL C/C++ 9.0&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: x-small;"&gt;IBM XL C/C++ 8.0&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: x-small;"&gt;IBM XL C/C++ 7.0&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: x-small;"&gt;GNU gcc/g++ 3.4&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style="font-size: x-small;"&gt;IBM POWER4&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: x-small;"&gt;IBM POWER5&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: x-small;"&gt;IBM POWER6&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;u&gt;7.0.1.0-002&lt;/u&gt;&lt;/b&gt; &lt;br /&gt;
&lt;span style="font-size: x-small;"&gt;&lt;br /&gt; &lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: x-small;"&gt;Solaris &lt;/span&gt;&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style="font-size: x-small;"&gt;Solaris 10 update 8&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-size: x-small;"&gt;Solaris Studio 12.1&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-size: x-small;"&gt;gcc 4.5&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-size: x-small;"&gt;gdb 6.8, 6.9, 7.0, 7.1&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;span style="font-size: x-small;"&gt; Linux &lt;/span&gt;&lt;br /&gt;
&lt;ul&gt;&lt;span style="font-size: x-small;"&gt;
&lt;li&gt;Red Hat Enterprise Linux 5.5 (Server/Desktop)&amp;nbsp;&lt;/li&gt;
&lt;li&gt;SUSE Linux Enterprise Server 10 SP3&amp;nbsp;&lt;/li&gt;
&lt;li&gt;gcc 4.5&amp;nbsp;&lt;/li&gt;
&lt;li&gt;gdb 6.8, 6.9, 7.0, 7.1&amp;nbsp;&lt;/li&gt;
&lt;li&gt;icc 11.1&amp;nbsp;&lt;/li&gt;
&lt;/span&gt;&lt;/ul&gt;
&lt;span style="font-size: x-small;"&gt;
AIX &lt;/span&gt;&lt;br /&gt;
&lt;ul&gt;&lt;span style="font-size: x-small;"&gt;
&lt;li&gt;AIX 6.1 TL4&amp;nbsp;&lt;/li&gt;
&lt;li&gt;AIX 5.3 TL10, TL11&amp;nbsp;&lt;/li&gt;
&lt;/span&gt;&lt;/ul&gt;
&lt;span style="font-size: x-small;"&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
이제 삽입된 프로그램을 실행하여 결과를 보도록 하겠습니다. 실행 결과가 그림 2처럼 커맨드 라인에 표시되는 동안, Purify는 분석 결과를 그림 3처럼 윈도우에 표시를 합니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
그림 2: 프로그램 실행 출력 화면&lt;br /&gt;
&lt;a href="http://3.bp.blogspot.com/-h8nAzWgZQ2o/TwqYny9ItMI/AAAAAAAAAR4/hVQvwhnRjFM/s1600/conv-run-output.png"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-h8nAzWgZQ2o/TwqYny9ItMI/AAAAAAAAAR4/hVQvwhnRjFM/s1600/conv-run-output.png" /&gt;&lt;/a&gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
그림 3: 프로그램 실행 분석 화면&lt;br /&gt;
&lt;a href="http://2.bp.blogspot.com/-WFGWr-ZQLJ0/TwqZIYNnA8I/AAAAAAAAASA/Aju_wMlqxv4/s1600/conv-run-analysis.png"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-WFGWr-ZQLJ0/TwqZIYNnA8I/AAAAAAAAASA/Aju_wMlqxv4/s640/conv-run-analysis.png" /&gt;&lt;/a&gt; &lt;br /&gt;
&lt;br /&gt;
&lt;div&gt;
탐지된 에러와 누수 정보를 보다 자세히 보려면 그림 4처럼 해당 메뉴항목을 확장합니다. Purify는 문제가 발생한 지점을 자세히 보여줍니다. &lt;br /&gt;
&lt;br /&gt;
그림 4: 문제에 대한 상세 보기 (-g 옵션을 사용하지 않은 경우)&lt;br /&gt;
&lt;a href="http://2.bp.blogspot.com/-e_Rlwlpho0g/TwqamUUkNWI/AAAAAAAAASI/25bdS-jKUJo/s1600/conv-run-analysis-detail.png"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-e_Rlwlpho0g/TwqamUUkNWI/AAAAAAAAASI/25bdS-jKUJo/s640/conv-run-analysis-detail.png" /&gt;&lt;/a&gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
그림 4-1: 문제에 대한 상세 보기 (-g 옵션을 사용한 경우) &lt;br /&gt;
&lt;img border="0" src="http://2.bp.blogspot.com/-J6UEBRae8wU/TwqkEbmVHyI/AAAAAAAAASY/txOwEmglQdo/s1600/conv-run-analysis-detail-with-debug.png" /&gt;&lt;br /&gt;
&lt;br /&gt;
문제 해결에 필요한 도움말이 필요할 경우에는 에러(예 그림 4, "UMR: Uninitialized memory read")를 선택한 후 물음표를 클릭합니다.혹은 Actions 메뉴에서 그림 5처럼 Explain message를 선택합니다.&lt;br /&gt;
&lt;br /&gt;
그림 5: Actions 메뉴의 메뉴 항목&lt;br /&gt;
&lt;img src="http://www.ibm.com/developerworks/rational/library/05/r-3120/3120_fig5.jpg" /&gt; &lt;br /&gt;
&lt;br /&gt;
그림 6처럼 UMR 에러 메시지 관련 정보가 나타납니다.&lt;br /&gt;
&lt;br /&gt;
그림 6: UMR 에러 메세지에 대한 설명&lt;img src="http://www.ibm.com/developerworks/rational/library/05/r-3120/3120_fig6.jpg" /&gt;&lt;br /&gt;
&lt;br /&gt;
도움말을 통해서, Purify가 탐지한 문제에 대한 해결책을 아래 처럼 결정할 수 있습니다: &lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;정의되지 않은 lower 변수 값을 사용하는 celsius 변수에 대한 assignment 라인을 삭제합니다. (celsius assignment 라인을 lower 변수 정의 이후로 옮길 수도 있지만 여기선 &amp;nbsp;그럴 필요가 없습니다) 이는 Purify가 분석한 UMR 문제를 해결합니다.&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;celsius = lower + 10;&lt;/span&gt;&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;fahr 변수에 대한 free 함수를 호출하여 fahr 변수에 할당된 메모리를 해제합니다. 이는 Purify가 분석한 메모리 누수 MLK를 해결합니다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
문제를 해결한 뒤, Purify를 다시 적용하여 문제가 처리되었는 지 확인하십시요. 그림 7처럼 문제 해결을 확인할 수 있습니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
그림 7: 문제 해결 후의 Purify 분석 결과 화면&lt;br /&gt;
&lt;img src="http://www.ibm.com/developerworks/rational/library/05/r-3120/3120_fig7.jpg" /&gt;&lt;br /&gt;
에러가 해결되었고 메모리 누수를 잡았습니다. 프로그램은 이제 좋은 상태입니다.&lt;/div&gt;
&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7852536510622031749-4606195792274718446?l=poongcha.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/icXPN/~4/whRaElAIr6g" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://poongcha.blogspot.com/feeds/4606195792274718446/comments/default" title="댓글" /><link rel="replies" type="text/html" href="http://poongcha.blogspot.com/2012/01/using-rational-purify-for-linux-with.html#comment-form" title="0개의 덧글" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7852536510622031749/posts/default/4606195792274718446?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7852536510622031749/posts/default/4606195792274718446?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/icXPN/~3/whRaElAIr6g/using-rational-purify-for-linux-with.html" title="Purify Linux - 사용법 개요" /><author><name>풍차</name><uri>http://www.blogger.com/profile/10628167383220311152</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="23" height="32" src="http://2.bp.blogspot.com/_icOPzB_w_RA/SinjXnz8NRI/AAAAAAAAABA/13rtJajEtZI/S220/%EC%9A%B0%EB%B6%84%ED%88%AC.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-BJtH0tfa1nU/TwqW-3XyoKI/AAAAAAAAARw/G1CPimukgTA/s72-c/conv-instrement.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://poongcha.blogspot.com/2012/01/using-rational-purify-for-linux-with.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUEGQn88cSp7ImA9WhRVEUU.&quot;"><id>tag:blogger.com,1999:blog-7852536510622031749.post-6721391064254616481</id><published>2012-01-07T19:57:00.000+09:00</published><updated>2012-01-10T17:20:23.179+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-10T17:20:23.179+09:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="jaf" /><title>Linked Data</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/pmH8ugfcie7-V-Xt5ApzUYwdJ6k/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/pmH8ugfcie7-V-Xt5ApzUYwdJ6k/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/pmH8ugfcie7-V-Xt5ApzUYwdJ6k/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/pmH8ugfcie7-V-Xt5ApzUYwdJ6k/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;출처 :&amp;nbsp;&lt;a href="http://www.ibm.com/developerworks/rational/library/basic-profile-linked-data/index.html"&gt;http://www.ibm.com/developerworks/rational/library/basic-profile-linked-data/index.html&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
There is interest in using Linked Data technologies for more than one purpose. We have seen interest in it to expose information -- public records, for example -- on the Internet in a machine-readable format. The IBM® Rational® team has been using Linked Data as an architectural model and implementation technology for application integration.&lt;br /&gt;
&lt;br /&gt;
We would like to share information about how we are using these technologies, the best practices and anti-patterns that we have identified, and the specification gaps that we have had to fill. These best practices and anti-patterns can be classified according to (but are not limited to) the following categories:&lt;br /&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Resources&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
A summary of the HTTP and RDF standard techniques and best practices that you should use, and anti-patterns you should avoid, when constructing clients and servers that read and write Linked Data&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Containers&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
Defines resources that allow new resources to be created using HTTP POST and existing resources to be found using HTTP GET&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Paging&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
Defines a mechanism for splitting the information in large resources into pages that can be fetched incrementally&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Validation&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
Defines a simple mechanism for describing the properties that a particular type of resource must or may have&lt;br /&gt;
&lt;br /&gt;
The following sections provide details regarding this proposal for a Basic Profile for Linked Data.&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://www.blogger.com/blogger.g?blogID=7852536510622031749"&gt;&lt;b&gt;&lt;span style="font-size: large;"&gt;Basic Profile Resources&lt;/span&gt;&lt;/b&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Basic Profile Resources are HTTP Linked Data resources that conform to simple patterns and conventions. Most Basic Profile Resources are domain-specific resources that contain data for an entity in a domain. All Basic Profile Resources follow the rules of&amp;nbsp;&lt;a href="http://www.w3.org/DesignIssues/LinkedData.html"&gt;Linked Data&lt;/a&gt;:&lt;/div&gt;
&lt;div&gt;
&lt;ol&gt;
&lt;li&gt;Use URIs as names for things.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Use HTTP URIs so that people can look up those names.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;When someone looks up a URI, provide useful information, using the standards (RDF*, SPARQL).&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Include links to other URIs so that people can discover more things.&lt;/li&gt;
&lt;/ol&gt;
Basic Profile adds a few rules. Some of these rules could be thought of as clarification of the basic Linked Data rules.&lt;/div&gt;
&lt;div&gt;
&lt;ol&gt;
&lt;li&gt;&lt;b&gt;Basic Profile Resources are HTTP resources that can be created, modified, deleted and read using standard HTTP methods.&lt;/b&gt;&lt;br /&gt;Basic Profile Resources are created by HTTP POST (or PUT) to an existing resource, deleted by HTTP DELETE, updated by HTTP PUT or PATCH, and "fetched" using HTTP GET. Additionally, Basic Profile Resources can be created, updated, and deleted by using SPARQL Update.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Basic Profile Resources use RDF to define their states.&lt;/b&gt;&lt;br /&gt;The state of a Basic Profile Resource (in the sense of state used in the REST architecture) is defined by a set of RDF triples. Binary resources and text resources are not Basic Profile Resources since their states cannot be easily or fully represented in RDF. XML resources might or might not be suitable as Basic Profile Resources. Some XML resources are really data-oriented resources encoded in XML that can be easily represented in RDF. Other XML documents are essentially marked up text documents that are not easily represented in RDF. Basic Profile Resources can be mixed with other resources in the same application.&lt;span style="background-color: white; text-align: left;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="background-color: white; text-align: left;"&gt;&lt;b&gt;You can request an RDF/XML representation of any Basic Profile Resource&lt;/b&gt;.&lt;/span&gt;&lt;span style="background-color: white; text-align: left;"&gt;The resource might have other representations, as well. These could be other RDF formats, such as Turtle, N3, or NTriples, but non-RDF formats such as HTML and JSON would also be popular additions, and Basic Profile sets no limits&lt;/span&gt;.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Basic Profile clients use Optimistic Collision Detection during update.&lt;/b&gt;&lt;br /&gt;Because the update process involves getting a resource first, and then modifying it and later putting it back on the server, there is the possibility of a conflict (for example, another client might have updated the resource since the GET action). To mitigate this problem, Basic Profile implementations should use the HTTP If-Match header and HTTP ETags to detect collisions.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Basic Profile Resources use standard media types.&lt;/b&gt;&lt;br /&gt;Basic Profile does not require and does not encourage the definition of any new media types. A Basic Profile goal is that any standards-based RDF or Linked Data client be able to read and write Basic Profile data, and defining new media types would prevent that in most cases.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Basic Profile Resources use standard vocabularies.&lt;/b&gt;&lt;br /&gt;Basic Profile Resources use common vocabularies (classes, properties, and so forth) for common concepts. Many websites define their own vocabularies for common concepts such as resource type, label, description, creator, last modification time, priority, enumeration of priority values, and so on. This is usually viewed as a good feature by users who want their data to match their local terminology and processes, but it makes it much harder for organizations to subsequently integrate information in a larger view. Basic Profile requires all resources to expose common concepts using a common vocabulary for properties. Sites can choose to additionally expose the same values under their own private property names in the same resources. In general, Basic Profile avoids inventing property names where possible. Instead, it uses ones from popular RDF-based standards, such as the RDF standards themselves, Dublin Core, and so on. Basic Profile invents property URLs where no match is found in popular standard vocabularies.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Basic Profile Resources set rdf:type explicitly.&lt;/b&gt;&lt;br /&gt;A resource's membership in a class extent can be derived implicitly or indicated explicitly by a triple in the resource representation that uses the rdf:type predicate and the URL of the class or derived implicitly. In RDF, there is no requirement to place an rdf:type triple in each resource, but this is a good practice, because it makes a query more useful in cases where inferencing is not supported. Remember also that a single resource can have multiple values for rdf:type. Basic Profile sets no limits to the number of types a resource can have.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Basic Profile Resources use a restricted number of standard data types.&lt;/b&gt;&lt;br /&gt;RDF does not define data types to be used for property values, so Basic Profile lists a set of standard datatypes to be used in Basic Profile.&lt;br /&gt; &lt;/li&gt;
&lt;li&gt;&lt;b&gt;Basic Profile clients expect to encounter unknown properties and content.&lt;/b&gt;&lt;br /&gt;Basic Profile provides mechanisms for clients to discover lists of expected properties for resources for particular purposes, but it also assumes that any given resource might have many more properties than those listed. Some servers will support only a fixed set of properties for a particular type of resource. Clients should always assume that the set of properties for a resource of a particular type at an arbitrary server might be open, in the sense that different resources of the same type might not all have the same properties, and the set of properties that are used in the state of a resource is not limited to any predefined set. However, when dealing with Basic Profile Resources, clients should assume that a Basic Profile server might discard triples for properties when it has prior knowledge. In other words, servers can restrict themselves to a known set of properties, but clients cannot. When doing an update using HTTP PUT, a Basic Profile client must preserve all property values retrieved by using HTTP GET. This includes all property values that it doesn't change or understand. (Use of HTTP PATCH or SPARQL Update rather than HTTP PUT for updates avoids this burden for clients.)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Basic Profile clients do not assume the type of a resource at the end of a link.&lt;/b&gt;&lt;br /&gt;Many specifications and most traditional applications have a "closed model," by which we mean that any reference from a resource in the specification or application necessarily identifies a resource in the same specification (or a referenced specification) or application. In contrast, the HTML anchor tag can point to any resource addressable by an HTTP URI, not just other HTML resources. Basic Profile works like HTML in this sense. An HTTP URI reference in one Basic Profile Resource can, in general, point to any resource, not just a Basic Profile Resource. There are numerous reasons to maintain an open model like HTML's. One is that it allows data that has not yet been defined to be incorporated in the web in the future. Another reason is that it allows individual applications and sites to evolve over time. If clients assume that they know what will be at the other end of a link, then the data formats of all resources across the transitive closure of all links must be kept stable for version upgrade.&amp;nbsp;A consequence of this independence is that client implementations that traverse HTTP URI links from one resource to another should always code defensively and be prepared for any resource at the end of the link. Defensive coding by client implementers is necessary to allow sets of applications that communicate through Basic Profile to be independently upgraded and flexibly extended.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Basic Profile servers implement simple validations for Create and Update.&lt;/b&gt;&lt;br /&gt;Basic Profile servers should try to make it easy for programmatic clients to create and update resources. If Basic Profile implementations associate a lot of very complex validation rules that need to be satisfied for an update or creation to be accepted, it becomes difficult or impossible for a client to use the protocol without extensive additional information specific to the server that needs to be communicated outside of the Basic Profile specifications. The recommended approach is for servers to allow creation and updates based on the sort of simple validations that can be communicated programmatically through a Shape (see the &lt;a href="http://www.ibm.com/developerworks/rational/library/basic-profile-linked-data/index.html#constraints"&gt;Constraints&lt;/a&gt; section). Additional checks that are required to implement more complex policies and constraints should result in the resource being flagged as requiring more attention, but should not cause the basic Create or Update action to fail.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Basic Profile Resources always use simple RDF predicates to represent links.&lt;/b&gt;&lt;br /&gt;By always representing links as simple predicate values, Basic Profile makes it very simple to know how links will appear in representations and also makes it very simple to query them. When there is a need to express properties on a link, Basic Profile adds an RDF statement with the same subject, object, and predicate as the original link, which is retained, plus any additional "link properties." Basic Profile Resources do not use "inverse links" to support navigation of a relationship in the opposite direction, because this creates a data synchronization problem and complicates a query. Instead, Basic Profile assumes that clients can use queries to navigate relationships in the opposite direction from the direction supported by the&lt;br /&gt;underlying link.&lt;/li&gt;
&lt;/ol&gt;
&lt;a href="http://www.blogger.com/blogger.g?blogID=7852536510622031749"&gt;&lt;b&gt;&lt;span style="font-size: large;"&gt;&lt;/span&gt;&lt;/b&gt;&lt;/a&gt;&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;a href="http://www.blogger.com/blogger.g?blogID=7852536510622031749"&gt;&lt;b&gt;&lt;span style="font-size: large;"&gt;Common properties&lt;/span&gt;&lt;/b&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
The tables that follow list properties from well-known RDF vocabularies that are recommended for use in Basic Profile Resources. Basic Profile requires none of them, but a specification based on Basic Profile might require one or more of these properties for a particular type of resource.&lt;br /&gt;
&lt;br /&gt;
Commonly used namespace prefixes
&lt;br /&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;div style="background-color: white; padding-bottom: 0.7em; padding-left: 5px; padding-right: 5px; padding-top: 0.3em;"&gt;
&lt;div style="font-family: arial, sans-serif; font-size: 0.76em;"&gt;
&lt;/div&gt;
&lt;table border="0" cellpadding="0" cellspacing="0" class="ibm-data-table" style="border-bottom-color: rgb(204, 204, 204); border-bottom-style: solid; border-bottom-width: 1px; border-image: initial; border-left-color: rgb(204, 204, 204); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(204, 204, 204); border-right-style: solid; border-right-width: 1px; border-top-color: initial; border-top-style: initial; border-top-width: 0px; color: black; font-family: Gulim; text-align: left; width: 708px;" summary="Commonly used namespace prefixes"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;th scope="col" style="background-attachment: initial; background-clip: initial; background-color: #f7f8fc; background-image: url(http://1.www.s81c.com/i/v16/t/text-tabs-bg.gif); background-origin: initial; background-repeat: repeat no-repeat; border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: top;"&gt;Prefix&lt;/th&gt;&lt;th scope="col" style="background-attachment: initial; background-clip: initial; background-color: #f7f8fc; background-image: url(http://1.www.s81c.com/i/v16/t/text-tabs-bg.gif); background-origin: initial; background-repeat: repeat no-repeat; border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: top;"&gt;Namespace URI&lt;/th&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td style="border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: top;"&gt;&lt;code style="font-size: small !important;"&gt;dcterms&lt;/code&gt;&lt;/td&gt;&lt;td style="border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: top;"&gt;http://purl.org/dc/terms/&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td style="border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: top;"&gt;&lt;code style="font-size: small !important;"&gt;rdf&lt;/code&gt;&lt;/td&gt;&lt;td style="border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: top;"&gt;http://www.w3.org/1999/02/22-rdf-syntax-ns&lt;strong&gt;#&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td style="border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: top;"&gt;&lt;code style="font-size: small !important;"&gt;rdfs&lt;/code&gt;&lt;/td&gt;&lt;td style="border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: top;"&gt;http://www.w3.org/2000/01/rdf-schema#&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td style="border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: top;"&gt;&lt;code style="font-size: small !important;"&gt;bp&lt;/code&gt;&lt;/td&gt;&lt;td style="border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: top;"&gt;http://open-services.net/ns/basicProfile#&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td style="border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: top;"&gt;&lt;code style="font-size: small !important;"&gt;xsd&lt;/code&gt;&lt;/td&gt;&lt;td style="border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: top;"&gt;http://www.w3.org/2001/XMLSchema#&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
&lt;br /&gt;
From Dublin Core&lt;br /&gt;
URI: http://purl.org/dc/terms/&lt;/div&gt;
&lt;div style="background-color: white; padding-bottom: 0.7em; padding-left: 5px; padding-right: 5px; padding-top: 0.3em;"&gt;
&lt;br /&gt;
&lt;table border="0" cellpadding="0" cellspacing="0" class="ibm-data-table" style="border-bottom-color: rgb(204, 204, 204); border-bottom-style: solid; border-bottom-width: 1px; border-image: initial; border-left-color: rgb(204, 204, 204); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(204, 204, 204); border-right-style: solid; border-right-width: 1px; border-top-color: initial; border-top-style: initial; border-top-width: 0px; color: black; font-family: Gulim; font-size: 0.76em; text-align: left; width: 708px;" summary=""&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;th scope="col" style="background-attachment: initial; background-clip: initial; background-color: #f7f8fc; background-image: url(http://1.www.s81c.com/i/v16/t/text-tabs-bg.gif); background-origin: initial; background-repeat: repeat no-repeat; border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: top;"&gt;Property&lt;/th&gt;&lt;th scope="col" style="background-attachment: initial; background-clip: initial; background-color: #f7f8fc; background-image: url(http://1.www.s81c.com/i/v16/t/text-tabs-bg.gif); background-origin: initial; background-repeat: repeat no-repeat; border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: top;"&gt;Range&lt;/th&gt;&lt;th scope="col" style="background-attachment: initial; background-clip: initial; background-color: #f7f8fc; background-image: url(http://1.www.s81c.com/i/v16/t/text-tabs-bg.gif); background-origin: initial; background-repeat: repeat no-repeat; border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: top;"&gt;Comment&lt;/th&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td style="border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: top;"&gt;dcterms:contributor&lt;/td&gt;&lt;td style="border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: top;"&gt;dcterms:Agent&lt;/td&gt;&lt;td style="border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: top;"&gt;The identifier of a resource (or blank node) that is a contributor of information. This resource can be a person or group of people or, possibly, an automated system.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td style="border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: top;"&gt;dcterms:creator&lt;/td&gt;&lt;td style="border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: top;"&gt;dcterms:Agent&lt;/td&gt;&lt;td style="border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: top;"&gt;The identifier of a resource (or blank node) that is the original creator of the resource. This resource can be a person or group of people or, possibly, an automated system.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td style="border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: top;"&gt;dcterms:created&lt;/td&gt;&lt;td style="border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: top;"&gt;xsd:dateTime&lt;/td&gt;&lt;td style="border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: top;"&gt;The creation timestamp.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td style="border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: top;"&gt;dcterms:description&lt;/td&gt;&lt;td style="border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: top;"&gt;rdf:XMLLiteral&lt;/td&gt;&lt;td style="border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: top;"&gt;Descriptive text about the resource represented as rich text in XHTML format.&amp;nbsp;&lt;strong&gt;Should&lt;/strong&gt;&amp;nbsp;include only content that is valid and suitable inside an XHTML &lt;br /&gt;
&lt;div&gt;
element.&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td style="border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: top;"&gt;dcterms:identifier&lt;/td&gt;&lt;td style="border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: top;"&gt;rdfs:Literal&lt;/td&gt;&lt;td style="border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: top;"&gt;A unique identifier for the resource. Typically read-only and assigned by the service provider when a resource is created. Not typically intended for end-user display.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td style="border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: top;"&gt;dcterms:modified&lt;/td&gt;&lt;td style="border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: top;"&gt;xsd:dateTime&lt;/td&gt;&lt;td style="border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: top;"&gt;Date on which the resource was changed.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td style="border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: top;"&gt;dcterms:relation&lt;/td&gt;&lt;td style="border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: top;"&gt;rdfs:Resource&lt;/td&gt;&lt;td style="border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: top;"&gt;The URI of a related resource. This is the predicate to use when you do not know what else to use. If you know what kind of relationship it is, use a more specific predicate.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td style="border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: top;"&gt;dcterms:subject&lt;/td&gt;&lt;td style="border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: top;"&gt;rdfs:Resource&lt;/td&gt;&lt;td style="border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: top;"&gt;Should be a URI (see dbpedia.org). From Dublin Core: "Typically, the subject will be represented using keywords, key phrases, or classification codes. Recommended best practice is to use a controlled vocabulary. To describe the spatial or temporal topic of the resource, use the Coverage element."&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td style="border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: top;"&gt;dcterms:title&lt;/td&gt;&lt;td style="border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: top;"&gt;rdf:XMLLiteral&lt;/td&gt;&lt;td style="border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: top;"&gt;A name given to the resource. Represented as rich text in XHTML format.&amp;nbsp;&lt;strong&gt;Should&lt;/strong&gt;&amp;nbsp;include only content that is valid inside an XHTML  element.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
From RDF&lt;br /&gt;
&lt;span style="background-color: white;"&gt;URI: http://www.w3.org/1999/02/22-rdf-syntax-ns#&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: white;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;table border="0" cellpadding="0" cellspacing="0" class="ibm-data-table" style="border-bottom-color: rgb(204, 204, 204); border-bottom-style: solid; border-bottom-width: 1px; border-image: initial; border-left-color: rgb(204, 204, 204); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(204, 204, 204); border-right-style: solid; border-right-width: 1px; border-top-color: initial; border-top-style: initial; border-top-width: 0px; color: black; font-family: Gulim; font-size: 0.76em; text-align: left; width: 708px;" summary=""&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;th scope="col" style="background-attachment: initial; background-clip: initial; background-color: #f7f8fc; background-image: url(http://1.www.s81c.com/i/v16/t/text-tabs-bg.gif); background-origin: initial; background-repeat: repeat no-repeat; border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: top;"&gt;Property&lt;/th&gt;&lt;th scope="col" style="background-attachment: initial; background-clip: initial; background-color: #f7f8fc; background-image: url(http://1.www.s81c.com/i/v16/t/text-tabs-bg.gif); background-origin: initial; background-repeat: repeat no-repeat; border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: top;"&gt;Range&lt;/th&gt;&lt;th scope="col" style="background-attachment: initial; background-clip: initial; background-color: #f7f8fc; background-image: url(http://1.www.s81c.com/i/v16/t/text-tabs-bg.gif); background-origin: initial; background-repeat: repeat no-repeat; border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: top;"&gt;Comment&lt;/th&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td style="border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: top;"&gt;rdf:type&lt;/td&gt;&lt;td style="border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: top;"&gt;rdfs:Class&lt;/td&gt;&lt;td style="border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: top;"&gt;The type or types of the resource. Basic Profile recommends that the rdf:type(s) of a resource be set explicitly in resource representations to facilitate query with non-inferencing query engines.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
From RDF Schema&lt;br /&gt;
&lt;span style="background-color: white;"&gt;URI: http://www.w3.org/2000/01/rdf-schema#&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;table border="0" cellpadding="0" cellspacing="0" class="ibm-data-table" style="border-bottom-color: rgb(204, 204, 204); border-bottom-style: solid; border-bottom-width: 1px; border-image: initial; border-left-color: rgb(204, 204, 204); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(204, 204, 204); border-right-style: solid; border-right-width: 1px; border-top-color: initial; border-top-style: initial; border-top-width: 0px; color: black; font-family: Gulim; font-size: 0.76em; text-align: left; width: 708px;" summary=""&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;th scope="col" style="background-attachment: initial; background-clip: initial; background-color: #f7f8fc; background-image: url(http://1.www.s81c.com/i/v16/t/text-tabs-bg.gif); background-origin: initial; background-repeat: repeat no-repeat; border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: top;"&gt;Property&lt;/th&gt;&lt;th scope="col" style="background-attachment: initial; background-clip: initial; background-color: #f7f8fc; background-image: url(http://1.www.s81c.com/i/v16/t/text-tabs-bg.gif); background-origin: initial; background-repeat: repeat no-repeat; border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: top;"&gt;Range&lt;/th&gt;&lt;th scope="col" style="background-attachment: initial; background-clip: initial; background-color: #f7f8fc; background-image: url(http://1.www.s81c.com/i/v16/t/text-tabs-bg.gif); background-origin: initial; background-repeat: repeat no-repeat; border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: top;"&gt;Comment&lt;/th&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td style="border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: middle;"&gt;rdfs:member&lt;/td&gt;&lt;td style="border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: middle;"&gt;rdf:Resource&lt;/td&gt;&lt;td style="border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: middle;"&gt;The URI (or blank node identifier) of a member of a Container.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td style="border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: middle;"&gt;rdfs:label&lt;/td&gt;&lt;td style="border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: middle;"&gt;rdf:Resource&lt;/td&gt;&lt;td style="border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: middle;"&gt;"Provides a human-readable version of a resource name." (From RDFS)&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
&lt;b&gt;&lt;span style="font-size: large;"&gt;Basic Profile Container&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
Many HTTP applications and sites have organizing concepts that partition the overall space of resources into smaller Containers. Blog posts are grouped into blogs, wiki pages are grouped into wikis, and products are grouped into catalogs. Each resource created in the application or site is created within an instance of one of these Container-like entities, and users can list the existing artifacts within one. There is no agreement across applications or sites, even within a particular domain, on what these grouping concepts should be called, but they commonly exist and are important. Containers answer two basic questions:&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;&lt;span style="background-color: white;"&gt;To which URLs can I POST to create new resources?&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="background-color: white;"&gt;Where can I GET a list of existing resources?&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
We call these RDF Containers that you can POST to Basic Profile Containers. Here are some of their characteristics:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style="background-color: white;"&gt;Clients can retrieve the list of existing resources in a Basic Profile Container.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="background-color: white;"&gt;New resources are created in Basic Profile Containers by POSTing to them.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="background-color: white;"&gt;Any resource can be POSTed to a Basic Profile Container. A resource does not have to be a Basic Profile Resource with an RDF representation to be POSTed to a Basic Profile Container.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="background-color: white;"&gt;After POSTing a new resource to a Container, the new resource will appear as a member of the Container until it is deleted. A Container can also contain resources that were added through other means, for example through the user interface of the site that implements the Container.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="background-color: white;"&gt;The same resource can appear in multiple Containers. This happens commonly if one Container is a "view" onto a larger Container.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="background-color: white;"&gt;Clients can get partial information about a Basic Profile Container without retrieving a full representation of all of its contents.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
The representation of a Basic Profile Container is a standard RDF Container representation that uses the &lt;a href="http://www.w3.org/TR/rdf-schema/#ch_member"&gt;rdfs:member predicate&lt;/a&gt;. &lt;br /&gt;
&lt;br /&gt;
Representation of a Basic Profile Container&lt;/div&gt;
&lt;div style="background-color: white; padding-bottom: 0.7em; padding-left: 5px; padding-right: 5px; padding-top: 0.3em;"&gt;
&lt;table border="0" cellpadding="0" cellspacing="0" style="color: black; text-align: left;" summary="This table contains a code listing."&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td class="code-outline" style="background-color: rgb(247, 247, 247) !important; border-bottom-color: rgb(204, 204, 204); border-bottom-style: solid; border-bottom-width: 1px; border-image: initial; border-left-color: rgb(204, 204, 204); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(204, 204, 204); border-right-style: solid; border-right-width: 1px; border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.75em; padding-bottom: 5px; padding-left: 2px; padding-right: 2px; padding-top: 2px;"&gt;&lt;pre class="displaycode" style="background-attachment: initial !important; background-clip: initial !important; background-image: initial !important; background-origin: initial !important; font-family: 'Andale Mono', 'Lucida Console', Monaco, Liberation, fixed, monospace; font-size: 11px; overflow-x: auto; overflow-y: auto; width: 694px;"&gt;@prefix rdfs: &lt;http: 01="" 2000="" rdf-schema#="" www.w3.org=""&gt;.
&lt;http: basicprofile="" container1="" example.org=""&gt;
        a rdfs:Container;
        rdfs:member &lt;http: 000000000="" acme.com="" members=""&gt;;
        # … 999999998 more triples here …
        rdfs:member &lt;http: 999999999="" acme.com="" members=""&gt;.
&lt;/http:&gt;&lt;/http:&gt;&lt;/http:&gt;&lt;/http:&gt;&lt;/pre&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
The Basic Profile does not recognize or recommend the use of other forms of an RDF Container, such as Bag and Seq, because they are not friendly to query. This follows standard Linked Data &lt;a href="http://linkeddatabook.com/editions/1.0/#htoc16"&gt;guidance for RDF use&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
The Basic Profile recommends the use of a set of standard Dublin Core properties with Containers. The subject of triples using these properties is the Container itself.&lt;/div&gt;
&lt;b&gt;rdfs:Container domain properties&lt;/b&gt;&lt;br /&gt;
&lt;div style="background-color: white; padding-bottom: 0.7em; padding-left: 5px; padding-right: 5px; padding-top: 0.3em;"&gt;
&lt;table border="0" cellpadding="0" cellspacing="0" class="ibm-data-table" style="border-bottom-color: rgb(204, 204, 204); border-bottom-style: solid; border-bottom-width: 1px; border-image: initial; border-left-color: rgb(204, 204, 204); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(204, 204, 204); border-right-style: solid; border-right-width: 1px; border-top-color: initial; border-top-style: initial; border-top-width: 0px; color: black; width: 708px;" summary="rdfs:Container domain properties"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;th scope="col" style="background-attachment: initial; background-clip: initial; background-color: #f7f8fc; background-image: url(http://1.www.s81c.com/i/v16/t/text-tabs-bg.gif); background-origin: initial; background-repeat: repeat no-repeat; border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: top;"&gt;Property&lt;/th&gt;&lt;th scope="col" style="background-attachment: initial; background-clip: initial; background-color: #f7f8fc; background-image: url(http://1.www.s81c.com/i/v16/t/text-tabs-bg.gif); background-origin: initial; background-repeat: repeat no-repeat; border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: top;"&gt;Occurs&lt;/th&gt;&lt;th scope="col" style="background-attachment: initial; background-clip: initial; background-color: #f7f8fc; background-image: url(http://1.www.s81c.com/i/v16/t/text-tabs-bg.gif); background-origin: initial; background-repeat: repeat no-repeat; border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: top;"&gt;Range&lt;/th&gt;&lt;th scope="col" style="background-attachment: initial; background-clip: initial; background-color: #f7f8fc; background-image: url(http://1.www.s81c.com/i/v16/t/text-tabs-bg.gif); background-origin: initial; background-repeat: repeat no-repeat; border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: top;"&gt;Comment&lt;/th&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td style="border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: top;"&gt;dcterms:title&lt;/td&gt;&lt;td style="border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: top;"&gt;zero or one&lt;/td&gt;&lt;td style="border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: top;"&gt;rdf:XMLLiteral&lt;/td&gt;&lt;td style="border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: top;"&gt;A name given to the resource. Represented as rich text in XHTML format.&amp;nbsp;&lt;strong&gt;Should&lt;/strong&gt;&amp;nbsp;include only content that is valid inside an XHTML&amp;nbsp;&lt;code style="font-size: small !important;"&gt;&lt;/code&gt;&amp;nbsp;element.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td style="border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: top;"&gt;dcterms:description&lt;/td&gt;&lt;td style="border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: top;"&gt;zero or one&lt;/td&gt;&lt;td style="border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: top;"&gt;rdf:XMLLiteral&lt;/td&gt;&lt;td style="border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: top;"&gt;Descriptive text about resource represented as rich text in XHTML format.&amp;nbsp;&lt;strong&gt;Should&lt;/strong&gt;&amp;nbsp;include only content that is valid and suitable inside an XHTML&amp;nbsp;&lt;code style="font-size: small !important;"&gt;&lt;/code&gt;&lt;br /&gt;
&lt;div&gt;
&lt;code style="font-size: small !important;"&gt;&lt;/code&gt;&amp;nbsp;element.&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td style="border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: top;"&gt;dcterms:publisher&lt;/td&gt;&lt;td style="border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: top;"&gt;zero or one&lt;/td&gt;&lt;td style="border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: top;"&gt;dcterms:Agent&lt;/td&gt;&lt;td style="border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: top;"&gt;An entity responsible for making the Basic Profile Container and its members available.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td style="border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: top;"&gt;bp:containerPredicate&lt;/td&gt;&lt;td style="border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: top;"&gt;exactly one&lt;/td&gt;&lt;td style="border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: top;"&gt;rdfs:Property&lt;/td&gt;&lt;td style="border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: top;"&gt;The predicate of the triples whose objects define the contents of the Container.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
&lt;b&gt;Retrieving non-member properties&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
The representation of a Container that has many members will be large. When we looked at our use cases, we saw that there were several important cases where clients needed to access only the non-member properties of the Container. Because retrieving the whole Container representation to get these information is onerous, we were motivated to define a way to retrieve only the non-member property values. We do this by defining a corresponding resource for each Basic Profile Container, called the "non-member resource," which has a state that is a subset of the state of the Container. The non-member resource's HTTP URI can be derived in the following way:&lt;br /&gt;
&lt;br /&gt;
If the HTTP URI of the Container is {url}, then the HTTP URI of the related non-member resource is {url}?non-member-properties. The representation of {url}?non-member-properties is identical to the representation of {url}, except that the membership triples are missing. The subjects of the triples will still be {url}, not {url}?non-member-properties. Any server that does not support non-member-resources should return an HTTP 404 File Not Found error when a non-member-resource is requested.&lt;br /&gt;
&lt;br /&gt;
This approach is analogous to using HTTP HEAD rather that HTTP GET. The difference is that HTTP HEAD is used to fetch the response headers for a resource, as opposed to requesting the entire representation of a resource using HTTP GET.&lt;br /&gt;
&lt;br /&gt;
HTTP GET example, request&lt;br /&gt;
&lt;table border="0" cellpadding="0" cellspacing="0" style="color: black; text-align: left;" summary="This table contains a code listing."&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td class="code-outline" style="background-color: rgb(247, 247, 247) !important; border-bottom-color: rgb(204, 204, 204); border-bottom-style: solid; border-bottom-width: 1px; border-image: initial; border-left-color: rgb(204, 204, 204); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(204, 204, 204); border-right-style: solid; border-right-width: 1px; border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.75em; padding-bottom: 5px; padding-left: 2px; padding-right: 2px; padding-top: 2px;"&gt;&lt;pre class="displaycode" style="background-attachment: initial !important; background-clip: initial !important; background-image: initial !important; background-origin: initial !important; font-family: 'Andale Mono', 'Lucida Console', Monaco, Liberation, fixed, monospace; font-size: 11px; overflow-x: auto; overflow-y: auto; width: 694px;"&gt;GET /container1?non-member-properties HTTP/1.1
HOST: example.org 
Accept: text/turtle&lt;/pre&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;div style="background-color: white; padding-bottom: 0.7em; padding-left: 5px; padding-right: 5px; padding-top: 0.3em;"&gt;
&lt;br /&gt;
HTTP GET example, response&lt;br /&gt;
&lt;table border="0" cellpadding="0" cellspacing="0" style="color: black; text-align: left;" summary="This table contains a code listing."&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td class="code-outline" style="background-color: rgb(247, 247, 247) !important; border-bottom-color: rgb(204, 204, 204); border-bottom-style: solid; border-bottom-width: 1px; border-image: initial; border-left-color: rgb(204, 204, 204); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(204, 204, 204); border-right-style: solid; border-right-width: 1px; border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.75em; padding-bottom: 5px; padding-left: 2px; padding-right: 2px; padding-top: 2px;"&gt;&lt;pre class="displaycode" style="background-attachment: initial !important; background-clip: initial !important; background-image: initial !important; background-origin: initial !important; font-family: 'Andale Mono', 'Lucida Console', Monaco, Liberation, fixed, monospace; font-size: 11px; overflow-x: auto; overflow-y: auto; width: 694px;"&gt;@prefix rdfs: &lt;http: 01="" 2000="" rdf-schema#="" www.w3.org=""&gt;.
@prefix dcterms: &lt;http: dc="" purl.org="" terms=""&gt;. 
@prefix bp: &lt;http: basicprofile#="" ns="" open-services.net=""&gt;.
&lt;http: container1="" example.org=""&gt;
        a rdfs:Container;
        dcterms:title "An Basic Profile Container of Acme Resources";
        bp:containerPredicate rdfs:member;
        dcterms:publisher &lt;http: acme.com=""&gt;.
&lt;/http:&gt;&lt;/http:&gt;&lt;/http:&gt;&lt;/http:&gt;&lt;/http:&gt;&lt;/pre&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="background-color: white; padding-bottom: 0.7em; padding-left: 5px; padding-right: 5px; padding-top: 0.3em;"&gt;
&lt;b&gt;&lt;span style="font-size: large;"&gt;Basic Profile validation and constraints&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&lt;span style="background-color: white;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style="background-color: white; padding-bottom: 0.7em; padding-left: 5px; padding-right: 5px; padding-top: 0.3em;"&gt;
&lt;span style="background-color: white;"&gt;Basic Profile resources are RDF resources, and RDF has the happy characteristic that "it can say anything about anything." This means that, in principle, any resource can have any property and there is no requirement that any two resources have the same set of properties, even if they have the same type or types. In practice, though, the properties that are set on resources usually follow regular patterns that are dictated by the uses of those resources. Although a particular resource might have arbitrary properties, when viewed from the perspective of a particular application or use case, the set of properties and property values that are appropriate for that resource in that application will often be predictable and constrained. For example, if a server has resources that represent software products and bugs, for the purposes of displaying information in tabular formats, creating and updating resources, or other purposes, a client might want to know what properties software products and bugs have on that server. The Basic Profile Validation and Constraints specification aims to capture information about those properties and constraints.&lt;/span&gt;&lt;/div&gt;
&lt;div style="background-color: white; padding-bottom: 0.7em; padding-left: 5px; padding-right: 5px; padding-top: 0.3em;"&gt;
The distinction between the resource and the use cases that it participates in is important to us. Traditional technologies such as relational databases constrain the total set of properties that an entity can have. In the Basic Profile, we aim only to define the properties that a resource can have when viewed through the lens of a particular application or use case, yet retaining the ability of the same resource to have an arbitrary set of properties to support other applications and use cases.&lt;br /&gt;
&lt;br /&gt;
The set of properties that a resource can or will have is not necessarily linked to its type, but exploiting the pattern where resources of the same type have the same properties is a very traditional approach that supports the development of many useful applications. Sometimes, knowledge of types and properties for the application is hard-coded in software, but there are many cases where it is desirable to represent this knowledge in data. The Basic Profile provides resource types called Shape and PropertyConstraint to represent this data.&lt;/div&gt;
&lt;div style="background-color: white; padding-bottom: 0.7em; padding-left: 5px; padding-right: 5px; padding-top: 0.3em;"&gt;
&lt;div style="font-family: arial, sans-serif; font-size: 0.76em; padding-bottom: 0.7em; padding-left: 5px; padding-right: 5px; padding-top: 0.3em; text-align: left;"&gt;
&lt;strong&gt;Note on the relationship of Shape to other standards:&lt;/strong&gt;&lt;br /&gt;
Although we're all very familiar from relational databases and object-oriented programming with the model where the valid properties are constrained by the type, it is not the "natural" model of RDF, nor is it the model of the natural world. The familiar model says that if you are of type X, you will have these properties that will have values of certain types. RDF and, to a large degree, the natural world work the other way around; if you have these properties, you must be of type X. We are not aware of any OWL or RDFS construct that lets you say "from the perspective of application X, resources with an RDF type of Y will have the list of properties Z," nor of constraining the types of the values of these properties.&lt;/div&gt;
&lt;br /&gt;
Class: PropertyConstraint&lt;br /&gt;
URI: http://open-services.net/ns/basicProfile#PropertyConstraint&lt;br /&gt;
bp:PropertyConstraint domain properties&lt;/div&gt;
&lt;div style="background-color: white; padding-bottom: 0.7em; padding-left: 5px; padding-right: 5px; padding-top: 0.3em;"&gt;
&lt;br /&gt;
&lt;table border="0" cellpadding="0" cellspacing="0" class="ibm-data-table" style="border-bottom-color: rgb(204, 204, 204); border-bottom-style: solid; border-bottom-width: 1px; border-image: initial; border-left-color: rgb(204, 204, 204); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(204, 204, 204); border-right-style: solid; border-right-width: 1px; border-top-color: initial; border-top-style: initial; border-top-width: 0px; color: black; text-align: left; width: 708px;" summary=""&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;th scope="col" style="background-attachment: initial; background-clip: initial; background-color: #f7f8fc; background-image: url(http://1.www.s81c.com/i/v16/t/text-tabs-bg.gif); background-origin: initial; background-repeat: repeat no-repeat; border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: top;"&gt;Property&lt;/th&gt;&lt;th scope="col" style="background-attachment: initial; background-clip: initial; background-color: #f7f8fc; background-image: url(http://1.www.s81c.com/i/v16/t/text-tabs-bg.gif); background-origin: initial; background-repeat: repeat no-repeat; border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: top;"&gt;Occurs&lt;/th&gt;&lt;th scope="col" style="background-attachment: initial; background-clip: initial; background-color: #f7f8fc; background-image: url(http://1.www.s81c.com/i/v16/t/text-tabs-bg.gif); background-origin: initial; background-repeat: repeat no-repeat; border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: top;"&gt;Range&lt;/th&gt;&lt;th scope="col" style="background-attachment: initial; background-clip: initial; background-color: #f7f8fc; background-image: url(http://1.www.s81c.com/i/v16/t/text-tabs-bg.gif); background-origin: initial; background-repeat: repeat no-repeat; border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: top;"&gt;Comment&lt;/th&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td style="border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: top;"&gt;rdfs:label&lt;/td&gt;&lt;td style="border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: top;"&gt;zero or one&lt;/td&gt;&lt;td style="border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: top;"&gt;rdfs:Literal&lt;/td&gt;&lt;td style="border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: top;"&gt;A human-readable name for the subject. (from rdfs)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td style="border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: top;"&gt;rdfs:comment&lt;/td&gt;&lt;td style="border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: top;"&gt;zero or one&lt;/td&gt;&lt;td style="border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: top;"&gt;rdfs:Literal&lt;/td&gt;&lt;td style="border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: top;"&gt;A description of the subject resource. (from rdfs)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td style="border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: top;"&gt;bp:constrainedProperty&lt;/td&gt;&lt;td style="border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: top;"&gt;exactly one&lt;/td&gt;&lt;td style="border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: top;"&gt;rdfs:Property&lt;/td&gt;&lt;td style="border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: top;"&gt;The URI of the predicate being constrained.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td style="border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: top;"&gt;bp:rangeShape&lt;/td&gt;&lt;td style="border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: top;"&gt;zero or one&lt;/td&gt;&lt;td style="border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: top;"&gt;bp:Shape&lt;/td&gt;&lt;td style="border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: top;"&gt;A bp:Shape that describes the rdfs:Class that is range of the property.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td style="border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: top;"&gt;bp:allowedValue&lt;/td&gt;&lt;td style="border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: top;"&gt;zero or many&lt;/td&gt;&lt;td style="border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: top;"&gt;range of the subject&lt;/td&gt;&lt;td style="border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: top;"&gt;A value allowed for the property. If there are both&amp;nbsp;&lt;code style="font-size: small !important;"&gt;bp:allowedValue&lt;/code&gt;&amp;nbsp;elements and an&lt;code style="font-size: small !important;"&gt;bp:AllowedValue&lt;/code&gt;&amp;nbsp;resource, then the full set of allowed values is the union of both.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td style="border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: top;"&gt;bp:AllowedValues&lt;/td&gt;&lt;td style="border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: top;"&gt;zero or many&lt;/td&gt;&lt;td style="border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: top;"&gt;bp:AllowedValues&lt;/td&gt;&lt;td style="border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: top;"&gt;A resource with allowed values for the property being defined.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td style="border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: top;"&gt;bp:defaultValue&lt;/td&gt;&lt;td style="border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: top;"&gt;zero or one&lt;/td&gt;&lt;td style="border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: top;"&gt;range of the object&lt;/td&gt;&lt;td style="border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: top;"&gt;A default value for the property&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td style="border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: top;"&gt;bp:occurs&lt;/td&gt;&lt;td style="border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: top;"&gt;exactly one&lt;/td&gt;&lt;td style="border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: top;"&gt;rdfs:Resource&lt;/td&gt;&lt;td style="border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: top;"&gt;&lt;strong&gt;Must&lt;/strong&gt;&amp;nbsp;be one of these three:&lt;br /&gt;
&lt;code style="font-size: small !important;"&gt;http://open-service.net/ns/basicProfile#Exactly-one&lt;/code&gt;&lt;br /&gt;
or&lt;code style="font-size: small !important;"&gt;http://open-service.net/ns/ basicProfile#Zero-or-one&lt;/code&gt;,&amp;nbsp;&lt;code style="font-size: small !important;"&gt;http://open-service.net/ns/basicProfile#Zero-or-many&lt;/code&gt;&lt;br /&gt;
or&amp;nbsp;&lt;code style="font-size: small !important;"&gt;http://open-service.net/ns/ basicProfile#One-or-many&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td style="border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: top;"&gt;bp:readOnly&lt;/td&gt;&lt;td style="border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: top;"&gt;zero or one&lt;/td&gt;&lt;td style="border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: top;"&gt;Boolean&lt;/td&gt;&lt;td style="border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: top;"&gt;&lt;code style="font-size: small !important;"&gt;true&lt;/code&gt;&amp;nbsp;if the property is read-only. If not set or set to&amp;nbsp;&lt;code style="font-size: small !important;"&gt;false&lt;/code&gt;, then the property is writable. Providers&amp;nbsp;&lt;strong&gt;should&lt;/strong&gt;&amp;nbsp;declare a property read-only when changes to the value of that property will not be accepted on PUT. Consumers should note that the converse does not apply: Providers&amp;nbsp;&lt;strong&gt;may&lt;/strong&gt;&amp;nbsp;reject a change to the value of a writable property.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td style="border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: top;"&gt;bp:maxSize&lt;/td&gt;&lt;td style="border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: top;"&gt;zero or one&lt;/td&gt;&lt;td style="border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: top;"&gt;Integer&lt;/td&gt;&lt;td style="border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: top;"&gt;For String properties only, specifies maximum characters allowed. If not set, then there is no maximum or maximum is specified elsewhere.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td style="border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: top;"&gt;bp:valueType&lt;/td&gt;&lt;td style="border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: top;"&gt;zero or one&lt;/td&gt;&lt;td style="border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: top;"&gt;rdfs:Resource&lt;/td&gt;&lt;td style="border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: top;"&gt;For literals, see XSD Datatypes.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
&lt;br /&gt;
It is debatable whether we should have a separate bp:PropertyConstraint class with a property on it called bp:constrainedProperty, or whether it would be better to use rdfs:Property and simply define new predicates with rdfs:Property as the domain.&lt;br /&gt;
&lt;br /&gt;
Important:&lt;br /&gt;
However, it is important not to use rdfs:range, because the semantics are different.&lt;br /&gt;
&lt;br /&gt;
Class: AllowedValues&lt;br /&gt;
URI: http://open-services.net/ns/basicProfile#AllowedValues&lt;br /&gt;
bp:AllowedValues domain properties&lt;/div&gt;
&lt;div style="background-color: white; padding-bottom: 0.7em; padding-left: 5px; padding-right: 5px; padding-top: 0.3em;"&gt;
&lt;div style="text-align: -webkit-auto;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;table border="0" cellpadding="0" cellspacing="0" class="ibm-data-table" style="border-bottom-color: rgb(204, 204, 204); border-bottom-style: solid; border-bottom-width: 1px; border-image: initial; border-left-color: rgb(204, 204, 204); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(204, 204, 204); border-right-style: solid; border-right-width: 1px; border-top-color: initial; border-top-style: initial; border-top-width: 0px; color: black; text-align: left; width: 708px;" summary=""&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;th scope="col" style="background-attachment: initial; background-clip: initial; background-color: #f7f8fc; background-image: url(http://1.www.s81c.com/i/v16/t/text-tabs-bg.gif); background-origin: initial; background-repeat: repeat no-repeat; border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: top;"&gt;Property&lt;/th&gt;&lt;th scope="col" style="background-attachment: initial; background-clip: initial; background-color: #f7f8fc; background-image: url(http://1.www.s81c.com/i/v16/t/text-tabs-bg.gif); background-origin: initial; background-repeat: repeat no-repeat; border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: top;"&gt;Occurs&lt;/th&gt;&lt;th scope="col" style="background-attachment: initial; background-clip: initial; background-color: #f7f8fc; background-image: url(http://1.www.s81c.com/i/v16/t/text-tabs-bg.gif); background-origin: initial; background-repeat: repeat no-repeat; border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: top;"&gt;Range&lt;/th&gt;&lt;th scope="col" style="background-attachment: initial; background-clip: initial; background-color: #f7f8fc; background-image: url(http://1.www.s81c.com/i/v16/t/text-tabs-bg.gif); background-origin: initial; background-repeat: repeat no-repeat; border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: top;"&gt;Comment&lt;/th&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td style="border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: top;"&gt;bp:allowedValue&lt;/td&gt;&lt;td style="border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: top;"&gt;zero or many&lt;/td&gt;&lt;td style="border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: top;"&gt;same as range of owning property&lt;/td&gt;&lt;td style="border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: top;"&gt;Allowed value&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
&lt;br /&gt;
Class: Shape&lt;br /&gt;
URI: http://open-services.net/ns/basicProfile#Shape&lt;br /&gt;
bp:Shape domain properties&lt;br /&gt;
&lt;div style="text-align: left;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;table border="0" cellpadding="0" cellspacing="0" class="ibm-data-table" style="border-bottom-color: rgb(204, 204, 204); border-bottom-style: solid; border-bottom-width: 1px; border-image: initial; border-left-color: rgb(204, 204, 204); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(204, 204, 204); border-right-style: solid; border-right-width: 1px; border-top-color: initial; border-top-style: initial; border-top-width: 0px; color: black; text-align: left; width: 708px;" summary=""&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: top;"&gt;&lt;strong&gt;Property&lt;/strong&gt;&lt;/td&gt;&lt;td style="border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: top;"&gt;&lt;strong&gt;Occurs&lt;/strong&gt;&lt;/td&gt;&lt;td style="border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: top;"&gt;&lt;strong&gt;Range&lt;/strong&gt;&lt;/td&gt;&lt;td style="border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: top;"&gt;&lt;strong&gt;Comment&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td style="border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: top;"&gt;dcterms:title&lt;/td&gt;&lt;td style="border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: top;"&gt;zero or one&lt;/td&gt;&lt;td style="border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: top;"&gt;rdfs:XMLLiteral&lt;/td&gt;&lt;td style="border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: top;"&gt;Title&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td style="border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: top;"&gt;bp:describedClass&lt;/td&gt;&lt;td style="border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: top;"&gt;exactly one&lt;/td&gt;&lt;td style="border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: top;"&gt;rdfs:Class&lt;/td&gt;&lt;td style="border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: top;"&gt;Class described&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td style="border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: top;"&gt;bp:propertyConstraints&lt;/td&gt;&lt;td style="border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: top;"&gt;zero or one&lt;/td&gt;&lt;td style="border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: top;"&gt;rdfs:List&lt;/td&gt;&lt;td style="border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: top;"&gt;The list of propertyConstraints for properties of this Shape. The domains of the PropertyConstraints must be compatible with the describedClass.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
&lt;br /&gt;
Validation semantics&lt;br /&gt;
&lt;br /&gt;
Validation semantics are expressed by mapping the property and class definitions in terms of SPARQL ASK semantics. This enables a declarative way in RDF to define the constraints while using the existing SPARQL ASK specification.&lt;br /&gt;
&lt;br /&gt;
Associating Shapes and Containers&lt;br /&gt;
&lt;br /&gt;
It is useful to be able to specify for a Container what types of members it will return and accept, plus what properties it expects to be used with resources of those types. To enable this, the Basic Profile defines two new Container properties.&lt;br /&gt;
rdfs:Container domain properties&lt;/div&gt;
&lt;div style="background-color: white; padding-bottom: 0.7em; padding-left: 5px; padding-right: 5px; padding-top: 0.3em;"&gt;
&lt;div style="text-align: -webkit-auto;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;table border="0" cellpadding="0" cellspacing="0" class="ibm-data-table" style="border-bottom-color: rgb(204, 204, 204); border-bottom-style: solid; border-bottom-width: 1px; border-image: initial; border-left-color: rgb(204, 204, 204); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(204, 204, 204); border-right-style: solid; border-right-width: 1px; border-top-color: initial; border-top-style: initial; border-top-width: 0px; color: black; text-align: left; width: 708px;" summary="rdfs:Container domain properties"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;th scope="col" style="background-attachment: initial; background-clip: initial; background-color: #f7f8fc; background-image: url(http://1.www.s81c.com/i/v16/t/text-tabs-bg.gif); background-origin: initial; background-repeat: repeat no-repeat; border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: top;"&gt;Property&lt;/th&gt;&lt;th scope="col" style="background-attachment: initial; background-clip: initial; background-color: #f7f8fc; background-image: url(http://1.www.s81c.com/i/v16/t/text-tabs-bg.gif); background-origin: initial; background-repeat: repeat no-repeat; border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: top;"&gt;Occurs&lt;/th&gt;&lt;th scope="col" style="background-attachment: initial; background-clip: initial; background-color: #f7f8fc; background-image: url(http://1.www.s81c.com/i/v16/t/text-tabs-bg.gif); background-origin: initial; background-repeat: repeat no-repeat; border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: top;"&gt;Range&lt;/th&gt;&lt;th scope="col" style="background-attachment: initial; background-clip: initial; background-color: #f7f8fc; background-image: url(http://1.www.s81c.com/i/v16/t/text-tabs-bg.gif); background-origin: initial; background-repeat: repeat no-repeat; border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: top;"&gt;Comment&lt;/th&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td style="border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: top;"&gt;bp:createShape&lt;/td&gt;&lt;td style="border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: top;"&gt;zero or many&lt;/td&gt;&lt;td style="border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: top;"&gt;bp:Shape&lt;/td&gt;&lt;td style="border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: top;"&gt;One or more Shapes that provide information on the expected data formats of resources that can be POSTed to the Container to create new members.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td style="border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: top;"&gt;bp:readShape&lt;/td&gt;&lt;td style="border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: top;"&gt;zero or many&lt;/td&gt;&lt;td style="border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: top;"&gt;bp:Shape&lt;/td&gt;&lt;td style="border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; font-family: arial, sans-serif; font-size: 0.7em; padding-bottom: 8px; padding-left: 5px; padding-right: 5px; padding-top: 8px; vertical-align: top;"&gt;One or more Shapes that provide information on the expected data formats of resources that can be found as members of the Container.&lt;br /&gt;
Containers often add properties of their own to POSTed and PUT resources (creation date, modification date, creator), and it's useful for clients to know what these might be.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7852536510622031749-6721391064254616481?l=poongcha.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/icXPN/~4/iurwUGpk4LA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://poongcha.blogspot.com/feeds/6721391064254616481/comments/default" title="댓글" /><link rel="replies" type="text/html" href="http://poongcha.blogspot.com/2012/01/linked-data.html#comment-form" title="0개의 덧글" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7852536510622031749/posts/default/6721391064254616481?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7852536510622031749/posts/default/6721391064254616481?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/icXPN/~3/iurwUGpk4LA/linked-data.html" title="Linked Data" /><author><name>풍차</name><uri>http://www.blogger.com/profile/10628167383220311152</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="23" height="32" src="http://2.bp.blogspot.com/_icOPzB_w_RA/SinjXnz8NRI/AAAAAAAAABA/13rtJajEtZI/S220/%EC%9A%B0%EB%B6%84%ED%88%AC.png" /></author><thr:total>0</thr:total><feedburner:origLink>http://poongcha.blogspot.com/2012/01/linked-data.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0cCRXwzcCp7ImA9WhRWGE4.&quot;"><id>tag:blogger.com,1999:blog-7852536510622031749.post-1727293315152804799</id><published>2012-01-06T17:37:00.002+09:00</published><updated>2012-01-06T17:37:44.288+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-06T17:37:44.288+09:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="rqm" /><title>RQM - DOORS Integration Architecture</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/V2HV58dRuq4Pzl_DioOzMh0fdbg/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/V2HV58dRuq4Pzl_DioOzMh0fdbg/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/V2HV58dRuq4Pzl_DioOzMh0fdbg/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/V2HV58dRuq4Pzl_DioOzMh0fdbg/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;b&gt;as-is&lt;/b&gt;&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: -webkit-auto;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: -webkit-auto;"&gt;
&lt;a href="http://3.bp.blogspot.com/-zqSsqL49yJI/TwaylVrGEwI/AAAAAAAAARg/-r43d9_DreI/s1600/as-is.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em; text-align: center;"&gt;&lt;img border="0" height="140" src="http://3.bp.blogspot.com/-zqSsqL49yJI/TwaylVrGEwI/AAAAAAAAARg/-r43d9_DreI/s400/as-is.png" width="400" /&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;to-be&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://2.bp.blogspot.com/-cKBDuARcyQw/Twayl2LmTkI/AAAAAAAAARo/8zBGrFB-I40/s1600/to-be.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em; text-align: center;"&gt;&lt;img border="0" height="160" src="http://2.bp.blogspot.com/-cKBDuARcyQw/Twayl2LmTkI/AAAAAAAAARo/8zBGrFB-I40/s400/to-be.png" width="400" /&gt;&lt;/a&gt;
&lt;br /&gt;
&lt;br /&gt;
-&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7852536510622031749-1727293315152804799?l=poongcha.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/icXPN/~4/rs0ZPL5N18U" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://poongcha.blogspot.com/feeds/1727293315152804799/comments/default" title="댓글" /><link rel="replies" type="text/html" href="http://poongcha.blogspot.com/2012/01/rqm-doors-integration-architecture.html#comment-form" title="0개의 덧글" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7852536510622031749/posts/default/1727293315152804799?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7852536510622031749/posts/default/1727293315152804799?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/icXPN/~3/rs0ZPL5N18U/rqm-doors-integration-architecture.html" title="RQM - DOORS Integration Architecture" /><author><name>풍차</name><uri>http://www.blogger.com/profile/10628167383220311152</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="23" height="32" src="http://2.bp.blogspot.com/_icOPzB_w_RA/SinjXnz8NRI/AAAAAAAAABA/13rtJajEtZI/S220/%EC%9A%B0%EB%B6%84%ED%88%AC.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-zqSsqL49yJI/TwaylVrGEwI/AAAAAAAAARg/-r43d9_DreI/s72-c/as-is.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://poongcha.blogspot.com/2012/01/rqm-doors-integration-architecture.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUMER345eCp7ImA9WhRVEUU.&quot;"><id>tag:blogger.com,1999:blog-7852536510622031749.post-6158465679477028553</id><published>2012-01-06T17:11:00.003+09:00</published><updated>2012-01-10T17:16:46.020+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-10T17:16:46.020+09:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="jaf" /><title>Analytic Reporting &amp; Live Reporting</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/fkMAvG15DxfL-V02J7GOIT9peb0/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/fkMAvG15DxfL-V02J7GOIT9peb0/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/fkMAvG15DxfL-V02J7GOIT9peb0/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/fkMAvG15DxfL-V02J7GOIT9peb0/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;출처 :&amp;nbsp;https://jazz.net/wiki/bin/view/Main/LinkedLifecycleData&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://www.w3.org/DesignIssues/LinkedData.html" target="_top"&gt;Linked Data&lt;/a&gt; is a design for sharing decentralized, but interrelated, data on the Web.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
At any given point in the development lifecycle it is of great 
interest to understand how requirements, source code, test cases, and 
defects are related. Typical questions are,  &lt;br /&gt;
&lt;ul&gt;
&lt;li&gt; "Which requirements don't have any test cases?" and 
&lt;/li&gt;
&lt;li&gt; "How many defects are unresolved for each requirement?"&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;br /&gt;
&lt;b&gt;&lt;u&gt;Design 1.&lt;/u&gt;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
One design for integrating this lifecycle data is to develop relational 
models for each type of development artifact and then store the 
corresponding relational representations of all the artifacts in a data 
warehouse where they can be queried, reported on, and analyzed using 
conventional business intelligence tools such as BIRT and Cognos.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-pUvwxCdsOFI/TwasVRpp0oI/AAAAAAAAARY/Vxm6fQjcJcc/s1600/analytical-reporting.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="480" src="http://4.bp.blogspot.com/-pUvwxCdsOFI/TwasVRpp0oI/AAAAAAAAARY/Vxm6fQjcJcc/s640/analytical-reporting.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;b&gt;Analytical Reporting&lt;/b&gt;&lt;/div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;
&lt;b&gt;&lt;u&gt;Design 2.&lt;/u&gt;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Linked Data offers an alternative way to solve the data integration 
problem. The key advance here is that Linked Data provides a uniform way
 to identify artifacts, namely HTTP Uniform Resource Identifiers (URI), 
and a common data model and representation format for them, Resource 
Description Framework (RDF).&amp;nbsp;Data integration among mutliple sources of development artifacts is 
achieved by loading the RDF representations of all the development 
artifacts into a shared triple store, e.g. Jena, which can be queried 
using the powerful SPARQL query language.
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
The main tiers of this architecture are as follows:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt; Data Source Tier - CLM Development Tools that provide Linked Data
&lt;/li&gt;
&lt;li&gt; Reporting and Query Service Tier - Indexer, RDF Triple Store (Jena/TDB), SPARQL Endpoint
&lt;/li&gt;
&lt;li&gt; Presentation Tier - Business Intelligence reporting and analysis (Cognos, BIRT), Document generation (RPE), Faceted browsing&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-HV1ypHc1edc/Twarpp7T3zI/AAAAAAAAARQ/9druLWhvs1g/s1600/live-reporting.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="480" src="http://2.bp.blogspot.com/-HV1ypHc1edc/Twarpp7T3zI/AAAAAAAAARQ/9druLWhvs1g/s640/live-reporting.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;b&gt;Live Reporting&lt;/b&gt;&lt;/div&gt;
&lt;br /&gt;
-&lt;br /&gt;
&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7852536510622031749-6158465679477028553?l=poongcha.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/icXPN/~4/Npcq_b1tOFs" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://poongcha.blogspot.com/feeds/6158465679477028553/comments/default" title="댓글" /><link rel="replies" type="text/html" href="http://poongcha.blogspot.com/2012/01/linked-lifecycle-data.html#comment-form" title="0개의 덧글" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7852536510622031749/posts/default/6158465679477028553?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7852536510622031749/posts/default/6158465679477028553?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/icXPN/~3/Npcq_b1tOFs/linked-lifecycle-data.html" title="Analytic Reporting &amp; Live Reporting" /><author><name>풍차</name><uri>http://www.blogger.com/profile/10628167383220311152</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="23" height="32" src="http://2.bp.blogspot.com/_icOPzB_w_RA/SinjXnz8NRI/AAAAAAAAABA/13rtJajEtZI/S220/%EC%9A%B0%EB%B6%84%ED%88%AC.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-pUvwxCdsOFI/TwasVRpp0oI/AAAAAAAAARY/Vxm6fQjcJcc/s72-c/analytical-reporting.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://poongcha.blogspot.com/2012/01/linked-lifecycle-data.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUQHQn48eSp7ImA9WhRVEUU.&quot;"><id>tag:blogger.com,1999:blog-7852536510622031749.post-6257146942299391147</id><published>2012-01-06T16:55:00.000+09:00</published><updated>2012-01-10T17:15:33.071+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-10T17:15:33.071+09:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="jaf" /><title>Indexing &amp; Query</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/PmZgkb7_qgVdv--7FuzlOZzIjEw/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/PmZgkb7_qgVdv--7FuzlOZzIjEw/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/PmZgkb7_qgVdv--7FuzlOZzIjEw/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/PmZgkb7_qgVdv--7FuzlOZzIjEw/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;1. 다양한 형태의 resource는 storage에 저장됩니다.&lt;br /&gt;
&lt;br /&gt;
2. property indexing은 저장된 resource로 부터 정보를 추출하여 공통 RDF 형태로 storage에 저장합니다.&lt;br /&gt;
&lt;br /&gt;
3. query는 공통 RDF 형태에 대해 질의하여 결과를 리턴합니다.&lt;br /&gt;
&lt;br /&gt;
예) 내가 작성(공통 property dc:creator에 기반)한 resource(요구사항/작업항목/테스트케이스/...)에 대한 query&lt;br /&gt;
&lt;br /&gt;
예) change set에 link(다양한 storage에 저장된 resource간의 link에 기반)된 resource(작업항목/요구사항/테스트케이스/...)에 대한 query&lt;br /&gt;
&lt;br /&gt;
4. JFS는 두 종류의 index를 빌드합니다. 하나는 property index이고 다른 하나는 full text index입니다.&lt;br /&gt;
&lt;br /&gt;
5. Property 기반 indexer는 resource로 부터 구조화된 property를 추출하여 SQL 비슷한 방식의 query (structured query)를 사용할 수 있도록 합니다.&lt;br /&gt;
&lt;br /&gt;
6. Text indexer는 resource로 부터 text를 추출하여 Apache Lucene 엔진에 제공하여 full text search ("fuzzy" query)를 제공합니다.&lt;br /&gt;
&lt;br /&gt;
7. repotools -reindex는 offline server에 대해 수행됩니다. 기본적으로 query triple store와 Lucene text store를 빌드합니다. 기본적으로 resource의 최근 버전에 대해서만 빌드합니다. 전체 버전에 대한 빌드는 시간비용이 많이 소요되기 때문입니다.&lt;br /&gt;
&lt;br /&gt;
참고 : Jazz Integration Architecture (&amp;nbsp;&lt;a href="https://jazz.net/projects/DevelopmentItem.jsp?href=content/project/plans/jia-overview/index.html"&gt;https://jazz.net/projects/DevelopmentItem.jsp?href=content/project/plans/jia-overview/index.html&lt;/a&gt;&amp;nbsp;)&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://1.bp.blogspot.com/-THRyKgeqoPE/Ttl6uQuIP1I/AAAAAAAAAH8/7t6dXfzKscs/s1600/query-and-index.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em; text-align: center;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-THRyKgeqoPE/Ttl6uQuIP1I/AAAAAAAAAH8/7t6dXfzKscs/s1600/query-and-index.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
8. indexing repository에는 두 종류가 있습니다. 하나는 RDF triple store 로써 SPARQL queriy에서 사용되고, 다른 하나는 full-text search index 입니다.&lt;br /&gt;
&lt;br /&gt;
9. 시스템 정의된 property들은 RDF triple store에 저장됩니다.&lt;br /&gt;
&lt;br /&gt;
&lt;table border="1" cellpadding="1" cellspacing="1"&gt;&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;property&lt;/th&gt;&lt;th&gt;Type&lt;/th&gt;&lt;th&gt;Description&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;dc:creator&lt;/code&gt;&lt;/td&gt;&lt;td&gt;URI&lt;/td&gt;&lt;td&gt;a URI to a resource that represents the user that created this resource.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;dc:created&lt;/code&gt;&lt;/td&gt;&lt;td&gt;datetime&lt;/td&gt;&lt;td&gt;the date and time the resource was created.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;dc:contributor&lt;/code&gt;&lt;/td&gt;&lt;td&gt;URI&lt;/td&gt;&lt;td&gt;a URI to a resource that represents the user that last modified this resource.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;dc:modified&lt;/code&gt;&lt;/td&gt;&lt;td&gt;datetime&lt;/td&gt;&lt;td&gt;the date and time the resource was last modified.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;dc:format&lt;/code&gt;&lt;/td&gt;&lt;td&gt;string&lt;/td&gt;&lt;td&gt;the content-type provided by the client on the last modification of the resource.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;dc:isPartOf&lt;/code&gt;&lt;/td&gt;&lt;td&gt;URI&lt;/td&gt;&lt;td&gt;the URI of the storage namespace this resource belongs to.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;jazz:etag&lt;/code&gt;&lt;/td&gt;&lt;td&gt;string&lt;/td&gt;&lt;td&gt;the ETag value last calculated for the resource.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;jazz:resourceContext&lt;/code&gt;&lt;/td&gt;&lt;td&gt;URI&lt;/td&gt;&lt;td&gt;the URI of the owning security context.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;jazz:resourceLocation&lt;/code&gt;&lt;/td&gt;&lt;td&gt;URI&lt;/td&gt;&lt;td&gt;the internal storage URI of this resource.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;rdf:type&lt;/code&gt;&lt;/td&gt;&lt;td&gt;URI&lt;/td&gt;&lt;td&gt;If the resource is XML or RDF then this represents a URI constructed from the root element in the document.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
참고자료 : &lt;a href="https://jazz.net/wiki/bin/view/Main/QueryServicesRequirements"&gt;https://jazz.net/wiki/bin/view/Main/QueryServicesRequirements&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
resource store와 index store의 분리&lt;br /&gt;
&lt;br /&gt;
&lt;div style="text-align: left;"&gt;
&lt;a href="http://3.bp.blogspot.com/-6eD1Muwzi5Y/Ttl6vEp0qvI/AAAAAAAAAIE/vZHbx5Pw1fo/s1600/resource-index-store.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em; text-align: center;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-6eD1Muwzi5Y/Ttl6vEp0qvI/AAAAAAAAAIE/vZHbx5Pw1fo/s1600/resource-index-store.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
indexing 과정&lt;br /&gt;
&lt;br /&gt;
&lt;div style="text-align: left;"&gt;
&lt;a href="http://2.bp.blogspot.com/-9UjII_qF2cw/Ttl6s539yQI/AAAAAAAAAHw/6uZWY7ogr8Q/s1600/jfs-indexing-path.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em; text-align: center;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-9UjII_qF2cw/Ttl6s539yQI/AAAAAAAAAHw/6uZWY7ogr8Q/s1600/jfs-indexing-path.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
query 과정&lt;br /&gt;
&lt;br /&gt;
&lt;div style="text-align: left;"&gt;
&lt;a href="http://3.bp.blogspot.com/-bCnpvFL5mjE/Ttl6tqFRbSI/AAAAAAAAAH0/pxrq3nsYrQk/s1600/jfs-query-path.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em; text-align: center;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-bCnpvFL5mjE/Ttl6tqFRbSI/AAAAAAAAAH0/pxrq3nsYrQk/s1600/jfs-query-path.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7852536510622031749-6257146942299391147?l=poongcha.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/icXPN/~4/cHfm6EvvYng" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://poongcha.blogspot.com/feeds/6257146942299391147/comments/default" title="댓글" /><link rel="replies" type="text/html" href="http://poongcha.blogspot.com/2011/11/indexing-and-query.html#comment-form" title="0개의 덧글" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7852536510622031749/posts/default/6257146942299391147?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7852536510622031749/posts/default/6257146942299391147?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/icXPN/~3/cHfm6EvvYng/indexing-and-query.html" title="Indexing &amp; Query" /><author><name>풍차</name><uri>http://www.blogger.com/profile/10628167383220311152</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="23" height="32" src="http://2.bp.blogspot.com/_icOPzB_w_RA/SinjXnz8NRI/AAAAAAAAABA/13rtJajEtZI/S220/%EC%9A%B0%EB%B6%84%ED%88%AC.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-THRyKgeqoPE/Ttl6uQuIP1I/AAAAAAAAAH8/7t6dXfzKscs/s72-c/query-and-index.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://poongcha.blogspot.com/2011/11/indexing-and-query.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUMGQX8-fip7ImA9WhRVEUU.&quot;"><id>tag:blogger.com,1999:blog-7852536510622031749.post-6618335937386802935</id><published>2012-01-06T15:35:00.000+09:00</published><updated>2012-01-10T17:17:00.156+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-10T17:17:00.156+09:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="jaf" /><title>RDF &amp; SPAQL</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/tefBFR-MPm4SHikZb7JTGE6eOvc/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/tefBFR-MPm4SHikZb7JTGE6eOvc/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/tefBFR-MPm4SHikZb7JTGE6eOvc/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/tefBFR-MPm4SHikZb7JTGE6eOvc/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;출처 :&amp;nbsp;&lt;a href="http://www.w3.org/TR/rdf-concepts/"&gt;http://www.w3.org/TR/rdf-concepts/&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
The Resource Description Framework (RDF) is a framework for representing information in the Web. &lt;br /&gt;
&lt;br /&gt;
The underlying structure of any expression in RDF is a collection of triples, each consisting of a subject, a predicate and an object. A set of such triples is called an RDF graph.&lt;br /&gt;
&lt;br /&gt;
&lt;img src="http://www.w3.org/TR/rdf-concepts/Graph-ex.gif" /&gt;&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;a &lt;b&gt;subject&lt;/b&gt;,&amp;nbsp;&lt;/li&gt;
&lt;li&gt;an &lt;b&gt;object&lt;/b&gt;, and&amp;nbsp;&lt;/li&gt;
&lt;li&gt;a &lt;b&gt;predicate &lt;/b&gt;(also called a &lt;b&gt;property&lt;/b&gt;) that denotes a &lt;b&gt;relationship&lt;/b&gt;.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;
&lt;b&gt;&lt;u&gt;RDF 예&lt;/u&gt;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;lt;http://reqs.com/req/1234&amp;gt; &amp;nbsp; rdf:type &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;oslc_rm:Requirement&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;lt;http://reqs.com/req/1234&amp;gt; &amp;nbsp; dcterms:title &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; "Smooth upgrade path"&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;lt;http://reqs.com/req/1234&amp;gt; &amp;nbsp; oslc_rm:elaboratedBy &amp;nbsp; &amp;nbsp;&amp;lt;http://reqs.com/req/7772&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;lt;http://reqs.com/req/1234&amp;gt; &amp;nbsp; oslc_rm:validatedBy &amp;nbsp; &amp;nbsp; &amp;lt;http://tests.com/test/521&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;lt;http://tests.com/test/521&amp;gt; &amp;nbsp; rdf:type &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;oslc_qm:TestCase&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;lt;http://tests.com/test/521&amp;gt; &amp;nbsp; dcterms:title &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; "Verify compatibility"&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;lt;http://tests.com/test/521&amp;gt; &amp;nbsp; oslc_qm:usesTestScript &amp;nbsp;&amp;lt;http://tests.com/script/13&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
SPARQL is standard query language for RDF datasets&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;
&lt;b&gt;&lt;u&gt;SPARQL 예&lt;/u&gt;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;SELECT ?uri ?title WHERE {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;  &amp;nbsp;?uri rdf:type &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;oslc_rm:Requirement .&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;  &amp;nbsp;?uri dcterms:title &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ?title .}&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;
결과&lt;/div&gt;
&lt;div&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;table cellpadding="1" cellspacing="1"&gt;
 &lt;tbody&gt;
&lt;tr&gt;
  &lt;td style="border-bottom-color: black; border-bottom-style: solid; border-bottom-width: 1px; border-left-color: black; border-left-style: solid; border-left-width: 1px; border-right-color: black; border-right-style: solid; border-right-width: 1px; border-top-color: black; border-top-style: solid; border-top-width: 1px; vertical-align: top;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;uri
&lt;/span&gt;&lt;/td&gt;
  &lt;td style="border-bottom-color: black; border-bottom-style: solid; border-bottom-width: 1px; border-left-color: black; border-left-style: solid; border-left-width: 1px; border-right-color: black; border-right-style: solid; border-right-width: 1px; border-top-color: black; border-top-style: solid; border-top-width: 1px; vertical-align: top;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;title
&lt;/span&gt;&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr&gt;
  &lt;td style="border-bottom-color: black; border-bottom-style: solid; border-bottom-width: 1px; border-left-color: black; border-left-style: solid; border-left-width: 1px; border-right-color: black; border-right-style: solid; border-right-width: 1px; border-top-color: black; border-top-style: solid; border-top-width: 1px; vertical-align: top;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;lt;http://reqs.com/req/1234&amp;gt;
&lt;/span&gt;&lt;/td&gt;
  &lt;td style="border-bottom-color: black; border-bottom-style: solid; border-bottom-width: 1px; border-left-color: black; border-left-style: solid; border-left-width: 1px; border-right-color: black; border-right-style: solid; border-right-width: 1px; border-top-color: black; border-top-style: solid; border-top-width: 1px; vertical-align: top;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;"Smooth upgrade path"&lt;/span&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;div&gt;
-&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7852536510622031749-6618335937386802935?l=poongcha.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/icXPN/~4/V-QL3NAF1VQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://poongcha.blogspot.com/feeds/6618335937386802935/comments/default" title="댓글" /><link rel="replies" type="text/html" href="http://poongcha.blogspot.com/2012/01/rdfresource-description-framework.html#comment-form" title="0개의 덧글" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7852536510622031749/posts/default/6618335937386802935?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7852536510622031749/posts/default/6618335937386802935?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/icXPN/~3/V-QL3NAF1VQ/rdfresource-description-framework.html" title="RDF &amp; SPAQL" /><author><name>풍차</name><uri>http://www.blogger.com/profile/10628167383220311152</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="23" height="32" src="http://2.bp.blogspot.com/_icOPzB_w_RA/SinjXnz8NRI/AAAAAAAAABA/13rtJajEtZI/S220/%EC%9A%B0%EB%B6%84%ED%88%AC.png" /></author><thr:total>0</thr:total><feedburner:origLink>http://poongcha.blogspot.com/2012/01/rdfresource-description-framework.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEcNQ389fip7ImA9WhRWF0g.&quot;"><id>tag:blogger.com,1999:blog-7852536510622031749.post-7433776512508449690</id><published>2012-01-05T17:01:00.003+09:00</published><updated>2012-01-05T18:34:52.166+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-05T18:34:52.166+09:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="testrt" /><title>TESTRT - Using Eclipse CDT on Windows</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/7ELiFX4PXFF9was4jFDRUpa7NFs/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/7ELiFX4PXFF9was4jFDRUpa7NFs/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/7ELiFX4PXFF9was4jFDRUpa7NFs/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/7ELiFX4PXFF9was4jFDRUpa7NFs/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;출처 :&amp;nbsp;&lt;a href="http://www.ibm.com/developerworks/opensource/library/os-eclipse-stlcdt/"&gt;http://www.ibm.com/developerworks/opensource/library/os-eclipse-stlcdt/&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Get products and technologies&lt;/b&gt;&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Learn about &lt;a href="http://www.mingw.org/"&gt;MinGW&lt;/a&gt;, the GNU C/C++ tools for Windows included with Cygwin.&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;Download &lt;a href="http://cygwin.com/"&gt;Cygwin&lt;/a&gt; a Linux-like environment for Windows. It consists of two parts: A DLL that acts as a Linux API emulation layer providing substantial Linux API functionality and a collection of tools that provide a Linux look and feel.&lt;/li&gt;
&lt;li&gt;Once you're done installing, you'll need to add &lt;b&gt;gcc, g++, make, and GDB&lt;/b&gt; to your path. (예 :&amp;nbsp;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;;C:\MinGW\msys\1.0\bin;C:\MinGW\bin&lt;/span&gt; )&lt;/li&gt;
&lt;li&gt;The &lt;a href="http://www.eclipse.org/cdt/downloads.php"&gt;Eclipse C/C++ Development Toolkit (CDT)&lt;/a&gt; download information contains the latest information about the available versions of CDT. (TestRT 이클립스 클라이언트 사용시 설치 필요없음)&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;(1) New C project&lt;/b&gt;&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-ugdcHsR9vac/TwVkvkb5GXI/AAAAAAAAAOI/8XQjyRaRLgw/s1600/new-c-project.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="270" src="http://2.bp.blogspot.com/-ugdcHsR9vac/TwVkvkb5GXI/AAAAAAAAAOI/8XQjyRaRLgw/s320/new-c-project.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-mR_ZiAgGqgY/TwVlc6KB7oI/AAAAAAAAAOg/aL95e36wP1M/s1600/helloworld-prj.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="316" src="http://1.bp.blogspot.com/-mR_ZiAgGqgY/TwVlc6KB7oI/AAAAAAAAAOg/aL95e36wP1M/s320/helloworld-prj.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-UHXiACGIb0k/TwVlwmaFRJI/AAAAAAAAAOs/t4SLTFKlaJU/s1600/prj-configuration.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="316" src="http://3.bp.blogspot.com/-UHXiACGIb0k/TwVlwmaFRJI/AAAAAAAAAOs/t4SLTFKlaJU/s320/prj-configuration.png" width="320" /&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;b&gt;(2) New &amp;gt; Source Folder&lt;/b&gt;. &lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-JI7nojT6-7k/TwVmSX37ZII/AAAAAAAAAO4/fCl9vvoMsQg/s1600/new-folder.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="237" src="http://1.bp.blogspot.com/-JI7nojT6-7k/TwVmSX37ZII/AAAAAAAAAO4/fCl9vvoMsQg/s400/new-folder.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;(3) New &amp;gt; Source File&lt;/b&gt;&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-yfa2fL4Yf14/TwVm35XGEDI/AAAAAAAAAPE/499dHhQzAT0/s1600/new-file.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="237" src="http://3.bp.blogspot.com/-yfa2fL4Yf14/TwVm35XGEDI/AAAAAAAAAPE/499dHhQzAT0/s400/new-file.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;(4) Project &amp;gt; Build Project&lt;/b&gt;&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-oGOvOS1_rx4/TwVn8Inr3UI/AAAAAAAAAPQ/obouCluSPL4/s1600/prj-build.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="225" src="http://2.bp.blogspot.com/-oGOvOS1_rx4/TwVn8Inr3UI/AAAAAAAAAPQ/obouCluSPL4/s400/prj-build.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;(5) Run &amp;gt; Run Configurations&lt;/b&gt;&lt;br /&gt;
- 실행할 바이너리를 선택한 후 Apply를 함&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-r5_0l_T8MNM/TwVoo39B1-I/AAAAAAAAAPc/Xc2wk_K09lk/s1600/run-configuration.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="443" src="http://2.bp.blogspot.com/-r5_0l_T8MNM/TwVoo39B1-I/AAAAAAAAAPc/Xc2wk_K09lk/s640/run-configuration.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
- run 버튼을 클릭하여 실행함&lt;br /&gt;
- 콘솔의 실행결과를 확인함&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-HSYTxGYyQf4/TwVpEJOJeWI/AAAAAAAAAPo/2Gx8yNUuktA/s1600/console-output.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="109" src="http://4.bp.blogspot.com/-HSYTxGYyQf4/TwVpEJOJeWI/AAAAAAAAAPo/2Gx8yNUuktA/s320/console-output.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
(6) C Project를 TestRT Project로 변경&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-5YT5-80_U7o/TwVqDo2clfI/AAAAAAAAAP0/S4aGcilX4SY/s1600/convert-2-testrt-pjt.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="257" src="http://1.bp.blogspot.com/-5YT5-80_U7o/TwVqDo2clfI/AAAAAAAAAP0/S4aGcilX4SY/s400/convert-2-testrt-pjt.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
- TDP를 선택합니다.&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-Alw4FuJjIDo/TwVqXmbmuiI/AAAAAAAAAQA/YSs9lB9161A/s1600/select-tdp.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="326" src="http://4.bp.blogspot.com/-Alw4FuJjIDo/TwVqXmbmuiI/AAAAAAAAAQA/YSs9lB9161A/s400/select-tdp.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
(7) 프로젝트를 빌드합니다. (Active Configuration은 Debug에서 TestRT로 바뀐 상태임)&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-hYJ09AIx2SY/TwVrKvcNNqI/AAAAAAAAAQM/TVagSmeXWpA/s1600/prj-instrument.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="326" src="http://2.bp.blogspot.com/-hYJ09AIx2SY/TwVrKvcNNqI/AAAAAAAAAQM/TVagSmeXWpA/s400/prj-instrument.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
(8) 실행파일을 우 클릭 후 Run As &amp;gt; Run instrumented application으로 실행합니다.&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-H_NR94hqwRM/TwVrwO7_mCI/AAAAAAAAAQY/YnjHH8665ng/s1600/run-instrumented.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-H_NR94hqwRM/TwVrwO7_mCI/AAAAAAAAAQY/YnjHH8665ng/s1600/run-instrumented.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
(9) 실행결과를 클릭하여 coverage report를 봅니다.&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-g0d5EqqF1fs/TwVsr3jJvYI/AAAAAAAAAQk/4o0aSnW1KJQ/s1600/coverage-report.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="425" src="http://3.bp.blogspot.com/-g0d5EqqF1fs/TwVsr3jJvYI/AAAAAAAAAQk/4o0aSnW1KJQ/s640/coverage-report.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
옵션 : 다른 리포트를 보고자 하는 경우에는 TestRT build configuration을 수정합니다.&lt;br /&gt;
- 프로젝트 속성에서 다른 리포트를 선택합니다.&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-XvV6oHQDNWI/TwVtaOuv5RI/AAAAAAAAAQw/5iU6mR4iI70/s1600/select-instrument.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="537" src="http://3.bp.blogspot.com/-XvV6oHQDNWI/TwVtaOuv5RI/AAAAAAAAAQw/5iU6mR4iI70/s640/select-instrument.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
- build clean, build project, run instrumented application을 실행합니다.&lt;br /&gt;
&lt;br /&gt;
- 결과를 보기 위해 command windows에서 studio를 실행합니다.&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-OFzmcjMy9Ok/TwVuDBy6mTI/AAAAAAAAAQ8/BSEErty9x6Q/s1600/run-studio.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="340" src="http://3.bp.blogspot.com/-OFzmcjMy9Ok/TwVuDBy6mTI/AAAAAAAAAQ8/BSEErty9x6Q/s640/run-studio.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
- 결과 리포트를 열람합니다.&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-r2kfFJTPT0A/TwVucr0lXhI/AAAAAAAAARI/hRm1-p5TJA0/s1600/runtime-analysis-rpt.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="298" src="http://4.bp.blogspot.com/-r2kfFJTPT0A/TwVucr0lXhI/AAAAAAAAARI/hRm1-p5TJA0/s640/runtime-analysis-rpt.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
-&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7852536510622031749-7433776512508449690?l=poongcha.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/icXPN/~4/77s8aWiZBYE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://poongcha.blogspot.com/feeds/7433776512508449690/comments/default" title="댓글" /><link rel="replies" type="text/html" href="http://poongcha.blogspot.com/2012/01/using-eclipse-cdt-on-windows.html#comment-form" title="0개의 덧글" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7852536510622031749/posts/default/7433776512508449690?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7852536510622031749/posts/default/7433776512508449690?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/icXPN/~3/77s8aWiZBYE/using-eclipse-cdt-on-windows.html" title="TESTRT - Using Eclipse CDT on Windows" /><author><name>풍차</name><uri>http://www.blogger.com/profile/10628167383220311152</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="23" height="32" src="http://2.bp.blogspot.com/_icOPzB_w_RA/SinjXnz8NRI/AAAAAAAAABA/13rtJajEtZI/S220/%EC%9A%B0%EB%B6%84%ED%88%AC.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-ugdcHsR9vac/TwVkvkb5GXI/AAAAAAAAAOI/8XQjyRaRLgw/s72-c/new-c-project.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://poongcha.blogspot.com/2012/01/using-eclipse-cdt-on-windows.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Dk8NQ3s_eip7ImA9WhRWFkg.&quot;"><id>tag:blogger.com,1999:blog-7852536510622031749.post-1078680724372909207</id><published>2012-01-04T14:22:00.002+09:00</published><updated>2012-01-04T14:28:12.542+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-04T14:28:12.542+09:00</app:edited><title>RTC Project Area 목록을 구하기 위한 OSLC 코드</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/UvFr5nP5FbJT6UO7xxMDGaYtoeQ/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/UvFr5nP5FbJT6UO7xxMDGaYtoeQ/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/UvFr5nP5FbJT6UO7xxMDGaYtoeQ/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/UvFr5nP5FbJT6UO7xxMDGaYtoeQ/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;출처 :&amp;nbsp;https://jazz.net/forums/viewtopic.php?t=12745&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;
Http http = new Http();&lt;br /&gt;
HttpRequest req = new HttpRequest();&lt;br /&gt;
&lt;br /&gt;
// get the root document link to the catalog&lt;br /&gt;
&lt;br /&gt;
req.setEndpoint(settings[0].ServerAddress__c+settings[0].BaseDocument__c); &amp;nbsp; &amp;nbsp; &lt;br /&gt;
req.setMethod('GET');&lt;br /&gt;
res = http.send(req);&lt;br /&gt;
if(res.getStatusCode()==200)&lt;br /&gt;
{&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;// get the providers element&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;Dom.XMLNode providers = res.getBodyDocument().getRootElement().getChildElement('cmServiceProviders', 'http://open-services.net/xmlns/cm/1.0/');&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;// and the catalog URL&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;String attr=providers.getAttributeValue('resource','http://www.w3.org/1999/02/22-rdf-syntax-ns#');&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;req.setEndpoint(attr);&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;req.setMethod('GET');&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;// set the userid/pw to operate under.&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;Blob headerValue = Blob.valueOf(settings[0].UserName__c + ':' + settings[0].UserPW__c);&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;String authorizationHeader = 'BASIC ' + EncodingUtil.base64Encode(headerValue);&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;req.setHeader('Authorization', authorizationHeader);&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;// send the request&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;res = http.send(req);&lt;br /&gt;
&amp;nbsp; &lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;// should come back with an authorization request redirect (302)&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;if(res.getStatusCode()==302)&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;{ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;// get the sessionid string from the returned cookies &lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;String[] cookies = res.getHeader('Set-Cookie').split(';');&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;String sessionid='';&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;for(Integer i=0;i&amp;lt;cookies.size();i++)&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;{&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;   &lt;/span&gt;if (cookies[i].startswith('JSESSIONID'))&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;   &lt;/span&gt;{ &amp;nbsp; &amp;nbsp; &lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;    &lt;/span&gt;sessionid=cookies[i]; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;    &lt;/span&gt;break;&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;   &lt;/span&gt;}&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;}&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;// set the redirect endpoint&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;req.setEndpoint(res.getHeader('Location')); &lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;// and the session id&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;req.setHeader('Cookie',sessionid);&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;req.setMethod('GET');&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;res = http.send(req);&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;//&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;if(res.getStatusCode()==200)&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;{&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;   &lt;/span&gt;// &amp;nbsp;we will have to deal with form logon later&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;   &lt;/span&gt;String pw = settings[0].SecurityString__c;&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;   &lt;/span&gt;pw=pw.replaceFirst('uname',settings[0].Username__c);&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;   &lt;/span&gt;pw=pw.replaceFirst('upw',settings[0].Userpw__c);&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;   &lt;/span&gt;req.setEndpoint(settings[0].ServerAddress__c + pw);&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;   &lt;/span&gt;//req.setHeader('Referer',res.getHeader('Location'));&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;   &lt;/span&gt;req.setMethod('GET');&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;   &lt;/span&gt;req.setHeader('ContentType','application/x-www-form-urlencoded');&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;   &lt;/span&gt;req.setHeader('Cookie',sessionid);&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;   &lt;/span&gt;res = http.send(req); &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;}&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;// spin thru the remaining redirects..&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;while(res.getStatusCode()==302)&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;{ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;   &lt;/span&gt;// redirect after login&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;   &lt;/span&gt;req.setEndpoint(res.getHeader('Location')); &lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;   &lt;/span&gt;req.setHeader('Cookie',sessionid);&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;   &lt;/span&gt;req.setMethod('GET');&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;   &lt;/span&gt;res = http.send(req);&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;}&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;// we should have the project list document now&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;System.debug(res.getHeaderKeys());&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;System.debug(res.getBody());&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;// find the first project 'entry' node&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;Dom.XMLNode project = res.getBodyDocument().getRootElement().getChildElement('entry','http://open-services.net/xmlns/discovery/1.0/');&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;do&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;{&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;   &lt;/span&gt; Dom.XMLnode provider = project.getChildElement('ServiceProvider','http://open-services.net/xmlns/discovery/1.0/');&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;   &lt;/span&gt; String projectName =provider.getChildElement('title','http://purl.org/dc/terms/').getText();&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;   &lt;/span&gt; String projectServicesURL = provider.getChildElement('services','http://open-services.net/xmlns/discovery/1.0/').getAttributeValue('resource','http://www.w3.org/1999/02/22-rdf-syntax-ns#'); &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &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;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;   &lt;/span&gt; req.setEndpoint(projectServicesURL); &lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;   &lt;/span&gt; req.setHeader('Cookie',sessionid);&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;   &lt;/span&gt; req.setMethod('GET');&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;   &lt;/span&gt; res = http.send(req);&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;   &lt;/span&gt; // get the services list document&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;   &lt;/span&gt; if(res.getStatusCode()==200)&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;   &lt;/span&gt; {&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;    &lt;/span&gt; DOM.XMLNode serviceslist = res.getBodydocument().getRootElement();&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;    &lt;/span&gt; //System.debug(serviceslist);&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;    &lt;/span&gt; Dom.XMLNode changeRequests = serviceslist.getChildElement('changeRequests','http://open-services.net/xmlns/cm/1.0/');&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;    &lt;/span&gt; //System.debug(changeRequests);&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;    &lt;/span&gt; Dom.XMLNode workitemFactory = changeRequests.getChildElement('factory','http://open-services.net/xmlns/cm/1.0/');&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;    &lt;/span&gt; String workitemCreateUrl;&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;    &lt;/span&gt; if(workitemFactory.getAttributeValue('default','http://open-services.net/xmlns/cm/1.0/')=='true')&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;    &lt;/span&gt; {&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;     &lt;/span&gt; workitemCreateUrl = workitemFactory.getChildElement('url','http://open-services.net/xmlns/cm/1.0/').getText();&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;     &lt;/span&gt; system.debug(workitemCreateUrl);&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;    &lt;/span&gt; }&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;    &lt;/span&gt; String workitemQueryURL = (changeRequests.getChildElement('simpleQuery','http://open-services.net/xmlns/cm/1.0/')).getChildElement('url','http://open-services.net/xmlns/cm/1.0/').getText();&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;    &lt;/span&gt; //system.debug(workitemQueryUrl);&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;    &lt;/span&gt; //System.debug(workitemfactory);&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;    &lt;/span&gt; ExportValue e=new ExportValue(projectName, workitemCreateUrl, workitemQueryURL);&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;    &lt;/span&gt; result.add(e);&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;   &lt;/span&gt; }&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;   &lt;/span&gt; // find the projects parent node&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;   &lt;/span&gt; Dom.XMLNode parent = project.getparent();&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;   &lt;/span&gt; // remove the project node from the document&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;   &lt;/span&gt; parent.removeChild(project);&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;   &lt;/span&gt; // find the next project entry&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;   &lt;/span&gt; project = parent.getChildElement('entry','http://open-services.net/xmlns/discovery/1.0/');&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;} while (project!=null);&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;}&lt;br /&gt;
}&lt;br /&gt;
&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7852536510622031749-1078680724372909207?l=poongcha.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/icXPN/~4/kJkNSTb8_eY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://poongcha.blogspot.com/feeds/1078680724372909207/comments/default" title="댓글" /><link rel="replies" type="text/html" href="http://poongcha.blogspot.com/2012/01/rtc-project-area-oslc.html#comment-form" title="0개의 덧글" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7852536510622031749/posts/default/1078680724372909207?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7852536510622031749/posts/default/1078680724372909207?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/icXPN/~3/kJkNSTb8_eY/rtc-project-area-oslc.html" title="RTC Project Area 목록을 구하기 위한 OSLC 코드" /><author><name>풍차</name><uri>http://www.blogger.com/profile/10628167383220311152</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="23" height="32" src="http://2.bp.blogspot.com/_icOPzB_w_RA/SinjXnz8NRI/AAAAAAAAABA/13rtJajEtZI/S220/%EC%9A%B0%EB%B6%84%ED%88%AC.png" /></author><thr:total>0</thr:total><feedburner:origLink>http://poongcha.blogspot.com/2012/01/rtc-project-area-oslc.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEcNQng-fSp7ImA9WhRWFEQ.&quot;"><id>tag:blogger.com,1999:blog-7852536510622031749.post-348122549149856423</id><published>2012-01-02T16:40:00.000+09:00</published><updated>2012-01-02T18:21:33.655+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-02T18:21:33.655+09:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="cccq" /><category scheme="http://www.blogger.com/atom/ns#" term="ccrc" /><title>CCCQ8 CM Architecture Change</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/FiXXdX_8xoFt5pOx55MnhX75bXM/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/FiXXdX_8xoFt5pOx55MnhX75bXM/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/FiXXdX_8xoFt5pOx55MnhX75bXM/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/FiXXdX_8xoFt5pOx55MnhX75bXM/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;간단해진 CCRC WAN Server Version 8 구조&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;버전8로 오면서 CCRC WAN Server의 성능과 확장성이 배가되었습니다.&lt;/li&gt;
&lt;li&gt;UCM/CQ 통합시 OSLC(HTTP연결)를 사용하며 CQIntSrv를 사용하지 않음&lt;/li&gt;
&lt;li&gt;Base CC/CQ 통합시에는 기존의 방식을 사용함&lt;/li&gt;
&lt;li&gt;&lt;a href="http://1.bp.blogspot.com/-OXMYSkehUxI/TwFdnRnsPXI/AAAAAAAAANA/WXAPkGKeZBU/s1600/ccrc-wan-server.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em; text-align: center;"&gt;&lt;img border="0" height="347" src="http://1.bp.blogspot.com/-OXMYSkehUxI/TwFdnRnsPXI/AAAAAAAAANA/WXAPkGKeZBU/s640/ccrc-wan-server.png" width="640" /&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;CQ CM Server (7.x와 동일)&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;-&lt;/li&gt;
&lt;li&gt;-&lt;/li&gt;
&lt;li&gt;&lt;a href="http://4.bp.blogspot.com/-49b7V57mtsg/TwFi7SQ6cyI/AAAAAAAAANM/WJfHoq0x1Fo/s1600/cq-cm-server.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em; text-align: center;"&gt;&lt;img border="0" height="320" src="http://4.bp.blogspot.com/-49b7V57mtsg/TwFi7SQ6cyI/AAAAAAAAANM/WJfHoq0x1Fo/s320/cq-cm-server.png" width="144" /&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
참고 : 기존 CCCQ7 CM Architecture&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
&lt;a href="http://4.bp.blogspot.com/-R62yS9SxLDc/TwFn5K_U8hI/AAAAAAAAANY/E2RrdMhWMuc/s1600/cm-7.1-architecture.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="396" src="http://4.bp.blogspot.com/-R62yS9SxLDc/TwFn5K_U8hI/AAAAAAAAANY/E2RrdMhWMuc/s640/cm-7.1-architecture.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
-&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7852536510622031749-348122549149856423?l=poongcha.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/icXPN/~4/-6kDenoe4P0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://poongcha.blogspot.com/feeds/348122549149856423/comments/default" title="댓글" /><link rel="replies" type="text/html" href="http://poongcha.blogspot.com/2012/01/cccq8-cm-architecture-chanage.html#comment-form" title="0개의 덧글" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7852536510622031749/posts/default/348122549149856423?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7852536510622031749/posts/default/348122549149856423?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/icXPN/~3/-6kDenoe4P0/cccq8-cm-architecture-chanage.html" title="CCCQ8 CM Architecture Change" /><author><name>풍차</name><uri>http://www.blogger.com/profile/10628167383220311152</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="23" height="32" src="http://2.bp.blogspot.com/_icOPzB_w_RA/SinjXnz8NRI/AAAAAAAAABA/13rtJajEtZI/S220/%EC%9A%B0%EB%B6%84%ED%88%AC.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-OXMYSkehUxI/TwFdnRnsPXI/AAAAAAAAANA/WXAPkGKeZBU/s72-c/ccrc-wan-server.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://poongcha.blogspot.com/2012/01/cccq8-cm-architecture-chanage.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkQGRnwzcCp7ImA9WhRWEkQ.&quot;"><id>tag:blogger.com,1999:blog-7852536510622031749.post-3038648569145490277</id><published>2011-12-31T11:09:00.000+09:00</published><updated>2011-12-31T11:25:27.288+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-12-31T11:25:27.288+09:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="jaf" /><title>Jazz Application Framework Overview</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/rmWJLxmFdPUadsxp9d9ipHkmERo/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/rmWJLxmFdPUadsxp9d9ipHkmERo/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/rmWJLxmFdPUadsxp9d9ipHkmERo/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/rmWJLxmFdPUadsxp9d9ipHkmERo/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;a href="https://jazz.net/wiki/bin/view/Main/JAFIntroduction"&gt;https://jazz.net/wiki/bin/view/Main/JAFIntroduction&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;ol&gt;
&lt;/ol&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-_v7mfbaiGfo/TvJ1vFJ5F5I/AAAAAAAAAMM/hpxTSQ8NMMY/s1600/jazz-platform.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="432" src="http://4.bp.blogspot.com/-_v7mfbaiGfo/TvJ1vFJ5F5I/AAAAAAAAAMM/hpxTSQ8NMMY/s640/jazz-platform.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
When building an application using JAF, it is helpful to simplify the&amp;nbsp;&lt;b&gt;topology&lt;/b&gt;&amp;nbsp;and think about the following pieces:&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-ZOSm-oNev4Y/TvJ2D9pAdoI/AAAAAAAAAMY/3aM94WSv0NA/s1600/JFS-Overview.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-ZOSm-oNev4Y/TvJ2D9pAdoI/AAAAAAAAAMY/3aM94WSv0NA/s1600/JFS-Overview.png" /&gt;&lt;/a&gt;&lt;/div&gt;
-&lt;br /&gt;
When building an application on the Jazz platform, there are two distinct kinds of shared implementation capabilities:&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;&lt;b&gt;Integration services&lt;/b&gt;, which can be employed for the purpose of integrating tools. These integration services should have the same loosely-coupled, protocol-driven characterstics as&amp;nbsp;&lt;a href="http://open-services.net/" target="_top"&gt;&lt;b&gt;OSLC&lt;/b&gt;&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Application frameworks&lt;/b&gt;, which can be used to develop Jazz-based products from the ground up. These frameworks may make use of the integration services.&amp;nbsp;&lt;/li&gt;
&lt;/ol&gt;
The Jazz Application Frameworks (JAF) aims to provide:&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;&lt;b&gt; Architectural guidance&lt;/b&gt; for designing new Jazz products that have a common look, behavior and collaboration capabilities.
&lt;/li&gt;
&lt;li&gt; An &lt;a class="twikiLink" href="https://jazz.net/wiki/bin/view/Main/JAFSdk"&gt;&lt;b&gt;JAF SDK&lt;/b&gt;&lt;/a&gt; in the form of an empty OSGi application shell that provides a framework for a richer, more dynamic and layered application.
&lt;br /&gt;참고:&amp;nbsp;&lt;a href="https://jazz.net/wiki/bin/view/Main/JAFSdkContents"&gt;https://jazz.net/wiki/bin/view/Main/JAFSdkContents&lt;/a&gt;&lt;/li&gt;
&lt;li&gt; A set of reusable features packaged as OSGi bundles that can 
optionally be embedded in the SDK to provide a range of common 
functionalities, including &lt;b&gt;Web UI frameworks or toolkits&lt;/b&gt;, &lt;b&gt;process 
capabilities&lt;/b&gt;, a &lt;b&gt;persistance layer&lt;/b&gt; with &lt;b&gt;query capabilities&lt;/b&gt;, &lt;b&gt;reporting&lt;/b&gt; and
 &lt;b&gt;data warehousing&lt;/b&gt;, and others.
&lt;/li&gt;
&lt;li&gt; A set of low-level common utils and libraries that can be 
deployed as OSGi bundles or plain JARs. For example, &lt;b&gt;OAuth helpers&lt;/b&gt;, &lt;b&gt;Jazz
 HTTP clients&lt;/b&gt;.
&lt;/li&gt;
&lt;li&gt; A &lt;b&gt;Jazz Team Server (JTS)&lt;/b&gt; providing &lt;b&gt;common user 
admininistration&lt;/b&gt;, &lt;b&gt;delegated authentication&lt;/b&gt;, &lt;b&gt;licensing&lt;/b&gt;, &lt;b&gt;dashboards&lt;/b&gt;, and 
&lt;b&gt;data warehousing&lt;/b&gt; to the applications associated with it.&lt;/li&gt;
&lt;/ol&gt;
-&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7852536510622031749-3038648569145490277?l=poongcha.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/icXPN/~4/y7H61CJvSaY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://poongcha.blogspot.com/feeds/3038648569145490277/comments/default" title="댓글" /><link rel="replies" type="text/html" href="http://poongcha.blogspot.com/2011/12/application-framework.html#comment-form" title="0개의 덧글" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7852536510622031749/posts/default/3038648569145490277?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7852536510622031749/posts/default/3038648569145490277?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/icXPN/~3/y7H61CJvSaY/application-framework.html" title="Jazz Application Framework Overview" /><author><name>풍차</name><uri>http://www.blogger.com/profile/10628167383220311152</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="23" height="32" src="http://2.bp.blogspot.com/_icOPzB_w_RA/SinjXnz8NRI/AAAAAAAAABA/13rtJajEtZI/S220/%EC%9A%B0%EB%B6%84%ED%88%AC.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-_v7mfbaiGfo/TvJ1vFJ5F5I/AAAAAAAAAMM/hpxTSQ8NMMY/s72-c/jazz-platform.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://poongcha.blogspot.com/2011/12/application-framework.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DU8DQXY9eyp7ImA9WhRWEkQ.&quot;"><id>tag:blogger.com,1999:blog-7852536510622031749.post-372654230596025806</id><published>2011-12-31T10:30:00.000+09:00</published><updated>2011-12-31T11:17:50.863+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-12-31T11:17:50.863+09:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="jaf" /><title>Jazz Application Framework Transition</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/chvK0cL9KR_i_XBJjF2aHYCFV7s/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/chvK0cL9KR_i_XBJjF2aHYCFV7s/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/chvK0cL9KR_i_XBJjF2aHYCFV7s/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/chvK0cL9KR_i_XBJjF2aHYCFV7s/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;https://jazz.net/wiki/bin/view/Main/JAFSdkTransition&lt;br /&gt;
&lt;br /&gt;
FROM&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;an application that was developed with the older &lt;a class="twikiLink" href="https://jazz.net/wiki/bin/view/Main/AppSdk"&gt;Application SDK&lt;/a&gt;&amp;nbsp;3.x.x.x, using functional services from a shared Jazz Team Server (JTS).&lt;/li&gt;
&lt;li&gt;The Application SDK included a framework for defining application REST services. Application services were declared in &lt;code&gt;plugin.xml&lt;/code&gt; files as extensions of the &lt;code&gt;com.ibm.team.jfs.app.restServices&lt;/code&gt; extension point, and implemented as extensions of the &lt;code&gt;com.ibm.team.jfs.app.RestService&lt;/code&gt; class.&lt;/li&gt;
&lt;li&gt;Fronting applications only needed to build against a few Foundation features:&amp;nbsp;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;com.ibm.team.jfs.sdk.runtime.feature&amp;nbsp;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;net.jazz.ajax.app.jfs.feature&amp;nbsp;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;net.jazz.ajax.app.jfs.feature&lt;/code&gt;&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;br /&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
TO&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;use the new &lt;a class="twikiLink" href="https://jazz.net/wiki/bin/view/Main/JAFSdk"&gt;JAF SDK&lt;/a&gt;&amp;nbsp;4.x.x.x, using local functional services and data storage.&lt;/li&gt;
&lt;li&gt;the JAF SDK includes the Jazz OSGi services framework (see &lt;a class="twikiLink" href="https://jazz.net/wiki/bin/view/Main/JAFTutorial"&gt;the HelloJAF tutorial&lt;/a&gt; for a brief introduction).&lt;/li&gt;
&lt;li&gt;the JAF SDK is considered to be this set of features:
&lt;ul&gt;
&lt;li&gt;com.ibm.team.app.server.jfs.feature&lt;/li&gt;
&lt;li&gt;com.ibm.team.dashboard.server.jfs.feature&lt;/li&gt;
&lt;li&gt;com.ibm.team.gateway.server.jfs.feature&lt;/li&gt;
&lt;li&gt;com.ibm.team.jazz.server.feature&lt;/li&gt;
&lt;li&gt;com.ibm.team.process.server.jfs.feature&lt;/li&gt;
&lt;li&gt;com.ibm.team.reports.server.jfs.feature&lt;/li&gt;
&lt;li&gt;com.ibm.team.repository.server.jfs.feature&lt;/li&gt;
&lt;li&gt;com.ibm.team.repository.services.jfs.feature&lt;/li&gt;
&lt;li&gt;net.jazz.ajax.app.jfs.feature&lt;/li&gt;
&lt;li&gt;net.jazz.ajax.jfs.feature&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;br /&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
https://jazz.net/wiki/bin/view/Main/JAFSdkIntroduction&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;

Jazz Application Frameworks SDK &lt;/h2&gt;
One of the primary deliverables of the Jazz Application Frameworks is an
 SDK for building applications. This SDK takes the form of an empty OSGi
 application shell that provides a framework for a rich, dynamic layered
 application. Applications embed &lt;b&gt;functional services&lt;/b&gt; from this SDK, 
which they invoke locally. Some &lt;b&gt;integration services&lt;/b&gt;, such as user 
management, licensing and authentication, are delegated to a Jazz Team 
Server (JTS) which may be shared amongst multiple applications. This SDK
 will be part of the Jazz Application Frameworks 4.0 release.
&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;

&lt;a href="http://www.blogger.com/blogger.g?blogID=7852536510622031749" name="The_legacy_of_the_SDK"&gt;&lt;/a&gt; The history of the SDK &lt;/h2&gt;
A brief word is required here to explain the multiple SDKs which exist, and where the JAF SDK fits in to the story.
&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;

&lt;a href="http://www.blogger.com/blogger.g?blogID=7852536510622031749" name="Jazz_0_6_SDK"&gt;&lt;/a&gt; Jazz 0.6 SDK &lt;/h3&gt;
The "0.6 SDK" included local execution of functional services in an OSGi
 application. It included a repository service framework, a persistence 
story, process, reporting, Web UI, and dashboards. Such an application 
has a local database for storage. RTC and RQM are based on the 
Jazz 0.6 SDK.
&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;

&lt;a href="http://www.blogger.com/blogger.g?blogID=7852536510622031749" name="Application_SDK"&gt;&lt;/a&gt; Application SDK &lt;/h3&gt;
The &lt;a class="twikiLink" href="https://jazz.net/wiki/bin/view/Main/AppSdk"&gt;Application SDK&lt;/a&gt;
 described OSGi or pure Java "fronting applications" which rely on a 
shared JTS for functional services such as storage. It communicated with
 the JTS using REST to consume these services. RRC is a fronting 
application based on the Application SDK.
&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;

&lt;a href="http://www.blogger.com/blogger.g?blogID=7852536510622031749" name="JAF_SDK"&gt;&lt;/a&gt; JAF SDK &lt;/h3&gt;
In 2012, the preferred approach for building applications on JAF is 
changing. Instead of creating fronting applications that consume 
functional services from a shared JTS, applications will embed the 
functional services and invoke them locally. There are a number of 
advantages to this approach, including reducing the load on the JTS and 
unifying two SDK stories into one. The JAF SDK is essentially the 0.6 
SDK, with some compatibility and transition add-ons to aid applications 
which are currently build on the Application SDK. Applications will 
continue to use the JTS for integration services.&lt;br /&gt;
&lt;br /&gt;
-&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7852536510622031749-372654230596025806?l=poongcha.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/icXPN/~4/CzTVGjsfZrw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://poongcha.blogspot.com/feeds/372654230596025806/comments/default" title="댓글" /><link rel="replies" type="text/html" href="http://poongcha.blogspot.com/2011/12/fronting-app-transition.html#comment-form" title="0개의 덧글" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7852536510622031749/posts/default/372654230596025806?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7852536510622031749/posts/default/372654230596025806?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/icXPN/~3/CzTVGjsfZrw/fronting-app-transition.html" title="Jazz Application Framework Transition" /><author><name>풍차</name><uri>http://www.blogger.com/profile/10628167383220311152</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="23" height="32" src="http://2.bp.blogspot.com/_icOPzB_w_RA/SinjXnz8NRI/AAAAAAAAABA/13rtJajEtZI/S220/%EC%9A%B0%EB%B6%84%ED%88%AC.png" /></author><thr:total>0</thr:total><feedburner:origLink>http://poongcha.blogspot.com/2011/12/fronting-app-transition.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUYERHs-cSp7ImA9WhRWEkg.&quot;"><id>tag:blogger.com,1999:blog-7852536510622031749.post-8845884718381354121</id><published>2011-12-30T23:40:00.000+09:00</published><updated>2011-12-30T23:58:25.559+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-12-30T23:58:25.559+09:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="log" /><title>Jazz 로그</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/kjXpMoGO-yYod-IRimM8qKKrMzQ/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/kjXpMoGO-yYod-IRimM8qKKrMzQ/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/kjXpMoGO-yYod-IRimM8qKKrMzQ/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/kjXpMoGO-yYod-IRimM8qKKrMzQ/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;
&lt;b&gt;&lt;span style="font-size: large;"&gt;서버 로그&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;째즈서버 로그 : &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;jazz/server/logs/jazz.log&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;톰캣서버 로그 : &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;jazz/server/tomcat/logs/*.log&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;u&gt;서버 로그를 영문으로 캡처하는 방법&lt;/u&gt;&lt;/b&gt;&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;톰캣 :  &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;\jazz\server\server.startup.bat&lt;/span&gt; 파일을 수정&lt;/li&gt;
&lt;/ul&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;set JAVA_OPTS=%JAVA_OPTS% &lt;span style="color: red;"&gt;&lt;b&gt;-Duser.language=en -Duser.region=US&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;set JAVA_OPTS=%JAVA_OPTS% -Djava.awt.headless=true&lt;br /&gt;...&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;
&lt;b&gt;&lt;u&gt;Jazz 빌드엔진을 영문으로 띄우는 방법&lt;/u&gt;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;\jazz\buildsystem\buildengine\eclipse\jbe.ini&lt;/span&gt; 파일을 수정합니다.&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;-vmargs&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;-Dosgi.requiredJavaVersion=1.5&lt;/span&gt;&lt;br /&gt;
&lt;b&gt;&lt;span style="color: red; font-family: 'Courier New', Courier, monospace;"&gt;-Duser.language=en&lt;br /&gt;-Duser.region=US&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;u&gt;Jazz 웹 자바스크립트 에러 로그를 캡처하는 방법&lt;/u&gt;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
1. 디버그 모드를 활성화하는 방법&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;https://host:port/jazz/web/projects/ProjectArea?&lt;b&gt;&lt;span style="color: red;"&gt;debug=true&lt;/span&gt;&lt;/b&gt;#action=com.ibm.team.workitem.viewWorkItem&amp;amp;id=131615&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
2. Firebug를 통한 javascript 콘솔 로그를 잡는 방법&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;span style="font-size: large;"&gt;클라이언트 로그&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;이클립스 로그&lt;/b&gt; : &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;작업공간\.metadata\.log&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;u&gt;이클립스 영문로그를 캡처하는 방법&lt;/u&gt;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;\jazz\client\eclipse\eclipe.exe&lt;/span&gt;의 바로 가기를 만들고, 바로 가기의 속성창에서&lt;br /&gt;
대상에 &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;\jazz\client\eclipse\eclipse.exe&amp;nbsp;&lt;b&gt;&lt;span style="color: red;"&gt;-nl en_US&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&amp;nbsp;를 추가해 줍니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br class="Apple-interchange-newline" /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7852536510622031749-8845884718381354121?l=poongcha.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/icXPN/~4/JY1HX4CJzq8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://poongcha.blogspot.com/feeds/8845884718381354121/comments/default" title="댓글" /><link rel="replies" type="text/html" href="http://poongcha.blogspot.com/2011/11/jazz.html#comment-form" title="0개의 덧글" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7852536510622031749/posts/default/8845884718381354121?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7852536510622031749/posts/default/8845884718381354121?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/icXPN/~3/JY1HX4CJzq8/jazz.html" title="Jazz 로그" /><author><name>풍차</name><uri>http://www.blogger.com/profile/10628167383220311152</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="23" height="32" src="http://2.bp.blogspot.com/_icOPzB_w_RA/SinjXnz8NRI/AAAAAAAAABA/13rtJajEtZI/S220/%EC%9A%B0%EB%B6%84%ED%88%AC.png" /></author><thr:total>0</thr:total><feedburner:origLink>http://poongcha.blogspot.com/2011/11/jazz.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0QMQXg7eip7ImA9WhRWEkg.&quot;"><id>tag:blogger.com,1999:blog-7852536510622031749.post-7480064578163401410</id><published>2011-12-30T23:04:00.001+09:00</published><updated>2011-12-30T23:29:40.602+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-12-30T23:29:40.602+09:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="scm" /><category scheme="http://www.blogger.com/atom/ns#" term="rtc" /><category scheme="http://www.blogger.com/atom/ns#" term="log" /><title>SCM - 소스코드 엑세스 로그</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/rZ4HvShFFKWZvgqg5eofQ6lQUjU/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/rZ4HvShFFKWZvgqg5eofQ6lQUjU/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/rZ4HvShFFKWZvgqg5eofQ6lQUjU/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/rZ4HvShFFKWZvgqg5eofQ6lQUjU/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;a href="https://jazz.net/wiki/bin/view/Main/SCMScaa"&gt;https://jazz.net/wiki/bin/view/Main/SCMScaa&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In your RTC deployment, you may wish to log access to the File content 
in your repository, for traceability rationale.  While this support is 
disabled by default, it can be enabled through the use of &lt;a href="http://logging.apache.org/log4j/1.2/manual.html" target="_top"&gt;log4j&lt;/a&gt;.  
&lt;br /&gt;
&lt;br /&gt;
To enable logging, uncomment the following section from the bottom of of &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;jazz/server/conf/jazz/log4j.properties
&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;#log4j.appender.scm_scaa=org.apache.log4j.RollingFileAppender
#log4j.appender.scm_scaa.layout=org.apache.log4j.PatternLayout
#log4j.appender.scm_scaa.layout.ConversionPattern=%m %n
#log4j.appender.scm_scaa.File=scaa_content.log
#log4j.appender.scm_scaa.MaxBackupIndex=10
#log4j.appender.scm_scaa.MaxFileSize=7000KB&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;#log4j.logger.scm_scaa=TRACE, scm_scaa
&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This will create a &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;scaa_content.log&lt;/span&gt; file in &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;jazz/server/logs&lt;/span&gt;.  The log will be rotated between 10 files of 7MB each.  
&lt;br /&gt;
Logging will occur as users access content from the server.  Nothing will be written to the logs if there is no user activity.
&lt;br /&gt;
To process this data for use in another tool, you should convert this configuration &lt;a href="http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/FileAppender.html" target="_top"&gt;FileAppender&lt;/a&gt; and pipe the file into the script or program.  
&lt;br /&gt;
&lt;br /&gt;
The format of the log entries are as follows: 
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt; SCAA:{0}/{1},{2},{3},{4}/{5},{6}&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
where :&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt; {0} is the contributor's userid
&lt;/li&gt;
&lt;li&gt; {1} is the item type (in RTC 2.0, most commonly &lt;span class="twikiNewLink"&gt;FileItem&lt;a href="https://jazz.net/wiki/bin/edit/Main/FileItem?topicparent=Main.SCMScaa" rel="nofollow" title="Create this topic"&gt;&lt;sup&gt;?&lt;/sup&gt;&lt;/a&gt;&lt;/span&gt;)
&lt;/li&gt;
&lt;li&gt; {2} is the last segment of the item's path (Foo.java)
&lt;/li&gt;
&lt;li&gt; {3} is the item's identifier
&lt;/li&gt;
&lt;li&gt; {4} is the item's state or version identifier
&lt;/li&gt;
&lt;li&gt; {5} is the component's name or label
&lt;/li&gt;
&lt;li&gt; {6} is the component's identifier 
&lt;/li&gt;
&lt;/ul&gt;
While there is not a huge overhead to logging content access, the 
logfiles can grow fairly large quickly.  In the default configuration, 
it may take less than a day for the 10 logfiles to completely rollover, 
depending on the number of developers and build engines your server 
hosts.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7852536510622031749-7480064578163401410?l=poongcha.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/icXPN/~4/ufOPhocdubQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://poongcha.blogspot.com/feeds/7480064578163401410/comments/default" title="댓글" /><link rel="replies" type="text/html" href="http://poongcha.blogspot.com/2011/12/blog-post_5054.html#comment-form" title="0개의 덧글" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7852536510622031749/posts/default/7480064578163401410?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7852536510622031749/posts/default/7480064578163401410?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/icXPN/~3/ufOPhocdubQ/blog-post_5054.html" title="SCM - 소스코드 엑세스 로그" /><author><name>풍차</name><uri>http://www.blogger.com/profile/10628167383220311152</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="23" height="32" src="http://2.bp.blogspot.com/_icOPzB_w_RA/SinjXnz8NRI/AAAAAAAAABA/13rtJajEtZI/S220/%EC%9A%B0%EB%B6%84%ED%88%AC.png" /></author><thr:total>0</thr:total><feedburner:origLink>http://poongcha.blogspot.com/2011/12/blog-post_5054.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUAERHw7fSp7ImA9WhRWFkk.&quot;"><id>tag:blogger.com,1999:blog-7852536510622031749.post-2338982247500597935</id><published>2011-12-30T22:54:00.001+09:00</published><updated>2012-01-04T11:21:45.205+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-04T11:21:45.205+09:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="log" /><category scheme="http://www.blogger.com/atom/ns#" term="was" /><category scheme="http://www.blogger.com/atom/ns#" term="tomcat" /><title>Jazz 서버 - 로그인/엑세스 로그</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/VANDhR8cYUxnWY013g5czRHLImY/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/VANDhR8cYUxnWY013g5czRHLImY/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/VANDhR8cYUxnWY013g5czRHLImY/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/VANDhR8cYUxnWY013g5czRHLImY/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;span class="postbody"&gt;&lt;span class="postbody"&gt;-&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;JTS : login information in the server log.&lt;/li&gt;
&lt;li&gt;&lt;span class="postbody"&gt;Tomcat : &lt;jts&gt;\server\tomcat\logs\localhost_access_log.yyyy-mm-dd -&amp;nbsp;&lt;/jts&gt;&lt;/span&gt;pick out some information about login from the tomcat local access log.&lt;/li&gt;
&lt;li&gt;WAS :&amp;nbsp;C:\Program Files\IBM\WebSphere\AppServer\profiles\AppSrv01\logs&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
-&lt;br /&gt;
&lt;br /&gt;
&lt;span class="postbody"&gt;&lt;span class="postbody"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7852536510622031749-2338982247500597935?l=poongcha.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/icXPN/~4/SX8_aD3tve4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://poongcha.blogspot.com/feeds/2338982247500597935/comments/default" title="댓글" /><link rel="replies" type="text/html" href="http://poongcha.blogspot.com/2011/12/blog-post_30.html#comment-form" title="0개의 덧글" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7852536510622031749/posts/default/2338982247500597935?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7852536510622031749/posts/default/2338982247500597935?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/icXPN/~3/SX8_aD3tve4/blog-post_30.html" title="Jazz 서버 - 로그인/엑세스 로그" /><author><name>풍차</name><uri>http://www.blogger.com/profile/10628167383220311152</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="23" height="32" src="http://2.bp.blogspot.com/_icOPzB_w_RA/SinjXnz8NRI/AAAAAAAAABA/13rtJajEtZI/S220/%EC%9A%B0%EB%B6%84%ED%88%AC.png" /></author><thr:total>0</thr:total><feedburner:origLink>http://poongcha.blogspot.com/2011/12/blog-post_30.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0IAR384eSp7ImA9WhRWEkg.&quot;"><id>tag:blogger.com,1999:blog-7852536510622031749.post-6374593383538951351</id><published>2011-12-30T22:22:00.000+09:00</published><updated>2011-12-30T22:25:46.131+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-12-30T22:25:46.131+09:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="rtc" /><title>RTC를 이용한 Code Review Process</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/rLdPmos0ufY1ofRT9eUFWYqXExw/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/rLdPmos0ufY1ofRT9eUFWYqXExw/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/rLdPmos0ufY1ofRT9eUFWYqXExw/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/rLdPmos0ufY1ofRT9eUFWYqXExw/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;span class="postbody"&gt;&lt;b&gt;&lt;u&gt;Project configuration&lt;/u&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Precondition : "Require Work Item Approval"&amp;nbsp;&lt;/li&gt;
&lt;li&gt;for "Deliver (client)" 
operation&amp;nbsp;&lt;/li&gt;
&lt;li&gt;for "Everyone" role.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;In the "Required approvals", for the "Review" type, at least one from "Everyone" role (or "Team Member" role) is set.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;"User may overrule" may also be checked if not all code delivery may require a review process.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;span class="postbody"&gt;

&lt;br /&gt;&lt;b&gt;&lt;u&gt;Scenario&lt;/u&gt;&lt;/b&gt;&lt;br /&gt;There are three developers - D1, D2 &amp;amp; D3 - all using RTC Eclipse client. &lt;/span&gt;&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;D1 does the code change for files f1 &amp;amp; f2 in her local workspace 
and saves them. f1 and f2 appears as unresolved in the pending changes view.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;D1 checks-in f1 &amp;amp; f2 into a new change set "CS".&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Right clicks on 
"CS" and select "Submit for Review" menu option and associate to a WI&amp;nbsp;(existing or a new one) and select approvers - D2 as the approver for f1
 review (subject field is used to tell what to review) and D3 as approver for f2 review.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;The approval/Review process will be in the pending state.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;D2 &amp;amp; D3 gets intimation of the review task assigned to them through a query - "Pending approvals for me".&amp;nbsp;&lt;/li&gt;
&lt;li&gt;D2 opens the WI and in the Links section, double clicks on the f1 in 
the change set and see the diff in the Change Explorer. Does the review.
 Optionally, adds comment for D1 in the discussion field of the WI. 
Changes the Review approval state from pending to approved.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;D3 follows 
the same process as D2 but rejects because the f3 code change is not 
acceptable. Changes the Review approval state from pending to rejected.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;D1 gets the review comment via email/feed - because D1 is the owner and the subscriber of the WI.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;D1 fixes the code in f2 based on D3's review and checks in to the same changeset.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;D1 adds D3 again for the new review approval in the same WI.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;D3 gets intimation of the review task assigned to him through a query - "Pending approvals for me".&amp;nbsp;&lt;/li&gt;
&lt;li&gt;D3 opens the WI and in the Links section, double clicks on the f2 in 
the changeset and see the diff in the Change Explorer. Does the review.
 Optionally, adds comment for D1 in the discussion field of the WI. 
Changes the Review approval state from pending to approved.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;D1 gets the review comment via email/feed - because D1 is the owner and the subscriber of the WI.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;D1 delivers the changeset (or invokes "Complete" action on the 
changeset) because all the approvals in the WI are in approved state.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;The complete history of the code review process (rejected ones, approved ones) are in the "Approvals" tab.&lt;/li&gt;
&lt;/ol&gt;
&lt;br /&gt;
제안&amp;nbsp;&lt;a href="https://jazz.net/wiki/bin/view/Main/SCMChangeSetReview"&gt;https://jazz.net/wiki/bin/view/Main/SCMChangeSetReview&lt;/a&gt;&lt;br /&gt;
&lt;span class="postbody"&gt;-&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7852536510622031749-6374593383538951351?l=poongcha.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/icXPN/~4/A9cpbfOe-yM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://poongcha.blogspot.com/feeds/6374593383538951351/comments/default" title="댓글" /><link rel="replies" type="text/html" href="http://poongcha.blogspot.com/2011/12/rtc-code-review-process.html#comment-form" title="0개의 덧글" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7852536510622031749/posts/default/6374593383538951351?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7852536510622031749/posts/default/6374593383538951351?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/icXPN/~3/A9cpbfOe-yM/rtc-code-review-process.html" title="RTC를 이용한 Code Review Process" /><author><name>풍차</name><uri>http://www.blogger.com/profile/10628167383220311152</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="23" height="32" src="http://2.bp.blogspot.com/_icOPzB_w_RA/SinjXnz8NRI/AAAAAAAAABA/13rtJajEtZI/S220/%EC%9A%B0%EB%B6%84%ED%88%AC.png" /></author><thr:total>0</thr:total><feedburner:origLink>http://poongcha.blogspot.com/2011/12/rtc-code-review-process.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUEGQXo-eip7ImA9WhRWGE8.&quot;"><id>tag:blogger.com,1999:blog-7852536510622031749.post-3049771797981636528</id><published>2011-12-30T19:31:00.000+09:00</published><updated>2012-01-06T14:27:00.452+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-06T14:27:00.452+09:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="scm" /><category scheme="http://www.blogger.com/atom/ns#" term="feature4.0" /><category scheme="http://www.blogger.com/atom/ns#" term="rtc" /><category scheme="http://www.blogger.com/atom/ns#" term="cmd" /><title>SCM - 베이스라인 BOM CLI</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/fj_mfwDTPm0EHxlOzPEYV3jlPZA/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/fj_mfwDTPm0EHxlOzPEYV3jlPZA/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/fj_mfwDTPm0EHxlOzPEYV3jlPZA/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/fj_mfwDTPm0EHxlOzPEYV3jlPZA/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;
https://jazz.net/wiki/bin/view/Main/SCMCommandLineBillOfMaterials&lt;br /&gt;
&lt;br /&gt;
This story is to support the following workflow with the RTC Command line: &lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;A user will be able to navigate to a &lt;b&gt;baseline&lt;/b&gt; or &lt;b&gt;snapshot&lt;/b&gt; using scm list command&lt;/li&gt;
&lt;li&gt;A user will be able to run a command to output a listing which describes the configuration as follows&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;for every item in the snapshot/baseline, we print a row which describes the &lt;b&gt;path&lt;/b&gt;, &lt;b&gt;item-id&lt;/b&gt; &amp;amp; &lt;b&gt;state-id&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
A user will be able to extract a particular content from the repository using the state-id as a selector&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
참조 : When storing a reference to 
another item, RTC store an item handle, which is: item type + item UUID 
[+ optional state id (if referring to a particular state of an auditable
 item)].&lt;br /&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;span class="postbody"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;IItemHandle handle = IComponent.ITEM_TYPE.createHandle(uuid, null);
&lt;br /&gt;
ITeamRepository repo = ...;
&lt;br /&gt;
IItem item = repo.itemManager.fetchCompleteItem(handle, IItemManager.DEFAULT, null);
&lt;br /&gt;
IItemType type = item.getItemType();
&lt;br /&gt;
System.out.println("Simple type name: " + type.getName());
&lt;br /&gt;
System.out.println("Type's namespace: " + type.getNamespaceURI());&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
-&lt;br /&gt;
웹브라우저 이용시&lt;br /&gt;
&lt;span class="postbody"&gt;- copy the UUID
&lt;br /&gt;
- paste it into a URL of the form:
&lt;br /&gt;
&lt;your_repo&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;/resource/itemOid/com.ibm.team.scm.Component/_DC6QYM0yEd2CTNaxDdYRfg?_mediaType=text/xml
&lt;/span&gt;&lt;br /&gt;
(replacing the UUID there with yours)
&lt;br /&gt;
- open this in a web browser
&lt;br /&gt;
- there the XML should indicate the type&lt;/your_repo&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="postbody"&gt;&lt;your_repo&gt;&lt;br /&gt;&lt;/your_repo&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;URI format for IVersionedContentService is:&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;span dojoattachpoint="_commentBodySPAN"&gt;&lt;service binding="" prefix=""&gt;/&lt;service name=""&gt;/content/&lt;item namespace="" type=""&gt;/&lt;item name="" type=""&gt;/&lt;item id=""&gt;/&lt;state id=""&gt;/&lt;content hash=""&gt;&lt;/content&gt;&lt;/state&gt;&lt;/item&gt;&lt;/item&gt;&lt;/item&gt;&lt;/service&gt;&lt;/service&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span dojoattachpoint="_commentBodySPAN"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;URI format for IFilesystemContentService is:&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;span dojoattachpoint="_commentBodySPAN"&gt;&lt;span dojoattachpoint="_commentBodySPAN"&gt;https://&lt;host&gt;:&lt;port&gt;/jazz/service/com.ibm.team.filesystem.service.internal.rest.IFilesystemContentService/-/COMPONENT_UUID/filename.txt?itemId=RESOURCE_UUID&amp;amp;stateId=RESOURCE__STATE_UUID&amp;amp;platformLineDelimiter=CRLF&lt;/port&gt;&lt;/host&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7852536510622031749-3049771797981636528?l=poongcha.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/icXPN/~4/2wp6txDVxQ8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://poongcha.blogspot.com/feeds/3049771797981636528/comments/default" title="댓글" /><link rel="replies" type="text/html" href="http://poongcha.blogspot.com/2011/12/bom-cli.html#comment-form" title="0개의 덧글" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7852536510622031749/posts/default/3049771797981636528?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7852536510622031749/posts/default/3049771797981636528?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/icXPN/~3/2wp6txDVxQ8/bom-cli.html" title="SCM - 베이스라인 BOM CLI" /><author><name>풍차</name><uri>http://www.blogger.com/profile/10628167383220311152</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="23" height="32" src="http://2.bp.blogspot.com/_icOPzB_w_RA/SinjXnz8NRI/AAAAAAAAABA/13rtJajEtZI/S220/%EC%9A%B0%EB%B6%84%ED%88%AC.png" /></author><thr:total>0</thr:total><feedburner:origLink>http://poongcha.blogspot.com/2011/12/bom-cli.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEQFRnY9cCp7ImA9WhRWFUo.&quot;"><id>tag:blogger.com,1999:blog-7852536510622031749.post-9148016642709820196</id><published>2011-12-30T18:39:00.001+09:00</published><updated>2012-01-03T16:38:37.868+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-03T16:38:37.868+09:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="rest" /><category scheme="http://www.blogger.com/atom/ns#" term="oslc" /><category scheme="http://www.blogger.com/atom/ns#" term="cccq" /><category scheme="http://www.blogger.com/atom/ns#" term="oslc-cm" /><title>CQ OSLC CM 2.0 REST API</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/4kq7ovtj5HNeE7uBh-AfoXGfJHs/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/4kq7ovtj5HNeE7uBh-AfoXGfJHs/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/4kq7ovtj5HNeE7uBh-AfoXGfJHs/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/4kq7ovtj5HNeE7uBh-AfoXGfJHs/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;https://jazz.net/wiki/bin/view/Main/CqOslcV2&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: large;"&gt;&lt;b&gt;&lt;a href="http://www.blogger.com/blogger.g?blogID=7852536510622031749" name="What_is_OSLC"&gt;&lt;/a&gt;OSLC 란?&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
OSLC는 소프트웨어 딜러버리 라이프싸이클 관련 리소스 및 인터페이스 표준화 관련 커뮤니티입니다. 이를 통해 ALM 도구 간의 통합을 지원합니다. 다른 한편으로 CQ 같은 하나의 도구의 리소스를 작업하기 위한 API로 사용할 수 있습니다.
&lt;br /&gt;
더 자세한 정보는 &lt;a href="http://open-services.net/" target="_top"&gt;http://open-services.net/&lt;/a&gt;.
&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: large;"&gt;&lt;b&gt;&lt;a href="http://www.blogger.com/blogger.g?blogID=7852536510622031749" name="What_is_REST"&gt;&lt;/a&gt;REST 란?&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
REST는 아키텍처 스타일로서&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;리소스는 &lt;b&gt;URI&lt;/b&gt;를 가집니다.
&lt;/li&gt;
&lt;li&gt;리소스는 다양한 &lt;b&gt;표현&lt;/b&gt;을 가집니다.
&lt;/li&gt;
&lt;li&gt;리소스는 이러한 표현을 통해 &lt;b&gt;변경&lt;/b&gt;할 수 있습니다.
&lt;/li&gt;
&lt;/ul&gt;
CQ의 리소스의 예로 레코드, 쿼리 등이 있습니다. CQ는 각 리소스를 RDF/XML, JSON 등 다양한 표현을 지원합니다.&amp;nbsp;OSLC는 다양한 HTTP 메쏘드를 제공합니다.&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt; GET 메쏘드는 리소스를 가져옵니다.
&lt;/li&gt;
&lt;li&gt; PUT 메쏘드는 리소스를 갱신합니다.
&lt;/li&gt;
&lt;li&gt; POST 메쏘드는 새로운 리소스를 생성합니다.
&lt;/li&gt;
&lt;li&gt; DELETE 메쏘드는 리소스를 삭제합니다.
&lt;/li&gt;
&lt;/ul&gt;
예를 들어, 리소스를 갱신할 때는 먼저 GET 메쏘드를 통해 리소스를 가져오고, 프로퍼티를 수정한 뒤에, PUT 메쏘드를 통해 다시 리소스를 갱신합니다. 보다 자세한 정보는&amp;nbsp;&lt;a href="http://www.blogger.com/blogger.g?blogID=7852536510622031749#Working_with_Records"&gt;Working with Records&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: large;"&gt;&lt;b&gt;&lt;a href="http://www.blogger.com/blogger.g?blogID=7852536510622031749" name="ClearQuest_REST_API_Versions"&gt;CQ REST API 버전들&lt;/a&gt;&lt;/b&gt;&lt;/span&gt;&lt;a href="http://www.blogger.com/blogger.g?blogID=7852536510622031749" name="ClearQuest_REST_API_Versions"&gt;&lt;br /&gt;
&lt;/a&gt;&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;CQ 7.1.0.0 웹에서 REST API를 처음 지원합니다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;RTC 2.0과 CQ 7.1.1.0에서 &lt;a href="https://jazz.net/wiki/bin/view/Main/RcmRestCmApi"&gt;OSLC-CM 1.0 REST API&lt;/a&gt;를 지원합니다.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://jazz.net/wiki/bin/view/Main/ClearQuest"&gt;CQ&lt;/a&gt;&amp;nbsp;7.1.2.1에서 여기 소개된 OSLC-CM 2.0을 지원합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;b&gt;OSLC 2.0 사용법
&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
OSLC 2.0 API를 사용할 때는 HTTP 요청 전 요청 헤더 &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;OSLC-Core-Version&lt;/span&gt;의 값을 &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;2.0&lt;/span&gt;으로 설정합니다.&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;b&gt;OSLC-Core-Version: 2.0
&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
이 헤더를 설정하지 않으면&amp;nbsp;하위 호환성을 위해&amp;nbsp;OSLC-CM 1.0 응답을 제공합니다.&lt;br /&gt;
&lt;br /&gt;
&lt;div style="background-color: white; color: #333333; font-family: arial, 'Lucida Grande', verdana, sans-serif; font-size: 14px; line-height: 1.5; margin-top: 1em; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left;"&gt;
&lt;/div&gt;
&lt;b&gt;CQ OSLC 1.0과 CQ OSLC 2.0의 차이점&lt;/b&gt;&lt;br /&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;CQ OSLC 2.0의 XML 응답은 RDF/XML 표현입니다. &lt;a href="http://www.blogger.com/blogger.g?blogID=7852536510622031749" name="Resource_Representations"&gt;Resource Representations&lt;/a&gt;&amp;nbsp;참고하세요.&lt;/li&gt;
&lt;li&gt;CQ OSLC 2.0의 RDF/XML와 JSON 응답은 &lt;a href="http://www.blogger.com/blogger.g?blogID=7852536510622031749#Support_for_OSLC_CM_2_0_ChangeRe"&gt;표준 OSLC ChangeRequest 프로퍼티&lt;/a&gt;와 CQ 필드 값을 함께 제공합니다.&lt;/li&gt;
&lt;li&gt;PUT 요청시,&amp;nbsp;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;oslc.properties&lt;/span&gt; 패리미터를 설정하지 않을 경우에는,&amp;nbsp;모든 필드 값을 제공해야 합니다.&amp;nbsp;Working with Records: PUT&amp;nbsp;참고하세요.&lt;/li&gt;
&lt;li&gt;CQ OSLC 2.0에서는 각 레코드 유형별 쿼리 URL을 제공합니다.&lt;/li&gt;
&lt;li&gt;네임스페이스 및 패러미터 이름은 &lt;a href="http://open-services.net/bin/view/Main/CmSpecificationV2"&gt;OSLC-CM 2.0 Specification&lt;/a&gt;를 참고하세요.&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;span style="font-size: large;"&gt;리소스의 표현&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
CQ는 모든 리소스에 대한 RDF/XML (&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;application/rdf+xml&lt;/span&gt;) 표현, JSON (&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;application/json&lt;/span&gt;) 표현을 제공합니다. 쿼리인 경우, Atom (&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;application/atom+xml&lt;/span&gt;) 표현도 지원하고, 레코드인 경우, HTML (&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;text/html&lt;/span&gt;) 표현을 제공합니다. 콘텐츠 유형은 HTTP &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;Accept&lt;/span&gt; 요청 헤더를 통해 표시합니다 (&lt;a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html"&gt;RFC 2616&lt;/a&gt;&amp;nbsp;참조). 예를 들면 RDF/XML 콘텐츠 유형을 요청할 경우, 아래 요청 헤더를 사용합니다. (Accept 헤더를 설정하지 않은 경우에 디폴트로 아래 값을 사용합니다.)&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt; Accept: application/rdf+xml&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
아래처럼 하나 이상의 콘텐츠 유형을 요청할 수 있습니다.&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt; Accept: text/html,application/atom+xml
&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
아래처럼 &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;rcm.contentType&lt;/span&gt; 패러미터를 이용해 콘텐츠를 요청할 수 있습니다. 이 경우에는 HTTP Accept 헤더에 설정 값을 무시합니다.&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;GET http://quagmire.rtp.raleigh.ibm.com/cqweb/oslc/?rcm.contentType=application/json &lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
RDF/XML를 사용할 때는 사용 편의성 및 에러방지를 위해 RDF/XML 파싱시,&amp;nbsp;&lt;a href="http://jena.sourceforge.net/"&gt;Jena&lt;/a&gt;&amp;nbsp;같은 자바 라이브러리를 사용하길 권장합니다.&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;span style="font-size: large;"&gt;&lt;a href="http://www.blogger.com/blogger.g?blogID=7852536510622031749" name="Authentication"&gt;&lt;/a&gt;인증&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
CQ OSLC-CM REST API는 사용자 인증을 위해 &lt;a href="http://tools.ietf.org/html/rfc2617"&gt;Basic Access Authentication&lt;/a&gt;과 &amp;nbsp;&lt;a href="http://tools.ietf.org/html/rfc5849"&gt;OAuth&lt;/a&gt;를 지원합니다. 리소스에 엑세스할 경우에는 인증에 대한 준비를 해야 합니다. 다만&amp;nbsp;
&lt;a href="http://www.blogger.com/blogger.g?blogID=7852536510622031749#Base_URI"&gt;Base URI&lt;/a&gt;에 GET 요청을 하고 스키마 저장소 목록을 가져올 경우에는 인증이 필요하지 않습니다.&amp;nbsp;인증이 필요할 경우에는&amp;nbsp;401 HTTP 상태 코드를 수반합니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Basic access authentication과 OAuth 중 어느 것을 사용할지?&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
대부분의 경우 Basic access authentication를 사용할 수 있습니다. 간단하며 셋업이 필요하지 않습니다. 다만 SSL을 사용하지 않는 경우 보안이 약합니다. 그리고&amp;nbsp;
RFC2617에서 정의한바 비(非) ASCII 사용자 ID를 지원하지 않습니다.&lt;br /&gt;
&lt;br /&gt;
OAuth는&amp;nbsp;&lt;a href="http://www.blogger.com/blogger.g?blogID=7852536510622031749#Registering_OAuth_Consumers"&gt;관리자 셋업&lt;/a&gt;을 필요로 하지만 여러 장점이 있습니다. 사용자 ID와 암호가 필요하지 않는 까닭에 보다 안전합니다. 대신 CQ가 발행하는 엑세스 토큰으로 인증을 합니다. 엑세스 토큰은 서버 재시작 전까지 유효하며 한명의 사용자만 사용할 수 있습니다. 그렇더라도 SSL을 사용하는 것을 권장합니다.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;a href="http://www.blogger.com/blogger.g?blogID=7852536510622031749" name="Basic_Access_Authentication"&gt;&lt;/a&gt;Basic Access Authentication&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Basic access authentication을 사용할때는 사용자 ID와 암호를&amp;nbsp;
Base64&amp;nbsp;인코딩으로 HTTP 인증 요청 헤더에 명시합니다. SSL을 사용하지 않을 경우 보안에 약합니다.&lt;br /&gt;
&lt;br /&gt;
거의 모든 브라우저에서 Basic access authentication을 지원합니다.&amp;nbsp;CQ OSLC URI를 브라우저에서 탐색을 하게되면, 기존의 활성 세션이 없는 경우에는 사용자의 ID와 암호를 묻게 됩니다.&lt;br /&gt;
&lt;br /&gt;
대부분의 HTTP 클라이언트 라이브러리 또한 Basic access authentication을 지원합니다. 아래 예는 Apache HTTP 클라이언트 사용하여 사용자 ID와 암호를 명시하는 경우입니다.&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;HttpClient http = new HttpClient();&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;Credentials credential&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; = new UsernamePasswordCredentials("user", "password");&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;http.getParams().setAuthenticationPreemptive(true);
 http.getState().setCredentials(AuthScope.ANY, credential);
&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
각 HTTP 클라이언트 라이브러리 문서를 참고하시기 바랍니다.&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;&lt;a href="http://www.blogger.com/blogger.g?blogID=7852536510622031749" name="OAuth"&gt;&lt;/a&gt;OAuth&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
시작하기 전에 먼저 OAuth 개념을 이해바랍니다. &lt;a href="http://hueniverse.com/oauth/"&gt;The Beginner's Guide to OAuth&lt;/a&gt;는 훌륭한 자료입니다.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;a href="http://www.blogger.com/blogger.g?blogID=7852536510622031749" name="OAuth_Libraries"&gt;&lt;/a&gt;OAuth 라이브러리&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
OAuth 인증을 사용할 때는 OAuth 라이브러리를 사용하여 요청에 사인을 합니다. 각각의 프로그래밍 언어별 오픈소스 라이브러리는 &lt;a href="http://oauth.net/code/"&gt;http://oauth.net/code/&lt;/a&gt;에서 찾을 수 있습니다.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;a href="http://www.blogger.com/blogger.g?blogID=7852536510622031749" name="Registering_OAuth_Consumers"&gt;&lt;/a&gt;OAuth 이용자 등록&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
OAuth 인증을 사용하기 위해서는 사용하는 애플리케이션을 OAuth 이용자로 등록해야 합니다. 우선 CQ 웹을 어드민으로 로그인을 하고, "Site Administration" 메뉴에서 "OAuth Consumer Management"를 선택합니다. 설정 대화 상자가 나타나면 아래 나와있는 OAuth 이용자 정보를 입력합니다.&lt;br /&gt;
&lt;table border="1" cellpadding="1" cellspacing="1" style="border-bottom-color: white; border-bottom-width: 1px; border-left-color: white; border-left-width: 1px; border-right-color: white; border-right-width: 1px; border-top-color: white; border-top-width: 1px; color: black; text-align: left;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;th&gt;프로퍼티&lt;/th&gt;&lt;th&gt;설명&lt;/th&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;이용자 이름&lt;/td&gt;&lt;td&gt;애플리케이션 이름, 사용자에게 표시됩니다.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;이용자 키&lt;/td&gt;&lt;td&gt;값을 지정하며 되며 유일해야 합니다.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;이용자 암호&lt;/td&gt;&lt;td&gt;CQ와 애플리케이션간에 공유되는 암호입니다. CQ는 이 암호를 통해서 애플리케이션 요청을 검증합니다. 특정 값을 암호로 지정합니다.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;신뢰됨&lt;/td&gt;&lt;td&gt;선택을 할 경우, CQ는 신뢰하는&amp;nbsp;다른&amp;nbsp;애플리케이션과 인증을 공유할 수 있습니다.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
&lt;a href="http://1.bp.blogspot.com/-m-gwMno7fkE/TwJ6cQq-gTI/AAAAAAAAANw/q0OggE-3yic/s1600/example-oauth-consumer.png"&gt;&lt;img border="0" height="377" src="http://1.bp.blogspot.com/-m-gwMno7fkE/TwJ6cQq-gTI/AAAAAAAAANw/q0OggE-3yic/s640/example-oauth-consumer.png" width="640" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
CQ는&amp;nbsp;&lt;a href="https://jazz.net/wiki/bin/view/Main/RootServicesSpecAddendum2"&gt;RootServicesSpecAddendum2&lt;/a&gt;에 기술된 째즈의 동적 OAuth 이용자 등록 방법 또한 지원합니다. CQ의 루트 서비스 URI는 &amp;nbsp;&lt;a href="http://www.blogger.com/blogger.g?blogID=7852536510622031749#Base_URI"&gt;Base URI&lt;/a&gt;에 기술되어 있습니다.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;a href="http://www.blogger.com/blogger.g?blogID=7852536510622031749" name="Obtaining_OAuth_Tokens"&gt;&lt;/a&gt;OAuth 토큰 획득하기&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
OAuth 엑세스 토큰을 획득하는 절차는 아래와 같습니다.&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;oslc:oauthRequestTokenURI&lt;/span&gt;로 OAuth 요청 토큰을 요청합니다.&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;oslc:authorizationURI&lt;/span&gt;로 사용자 인증 처리를 리다이렉트합니다.&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;oslc:oauthAccessTokenURI&lt;/span&gt;로 OAuth 요청 토큰을 OAuth 엑세스 토큰으로 교환합니다.&amp;nbsp;&lt;/li&gt;
&lt;/ol&gt;
이들 OAuth URI는 &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;oslc:OAuthConfiguration&lt;/span&gt; 자원으로 프로퍼티로써 각 데이터베이스 세트별로 &lt;a href="http://www.blogger.com/blogger.g?blogID=7852536510622031749#Service_Provider_Catalogs"&gt;service provider catalog&lt;/a&gt;에 정의되어 있습니다.&lt;br /&gt;
&lt;br /&gt;
OAuth 엑세스 토큰은 사용자 대신하여 요청을 할 수 있도록 해주며, CQ 서버가 재시작될때까지 유효합니다.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;a href="http://www.blogger.com/blogger.g?blogID=7852536510622031749" name="Signing_Requests"&gt;&lt;/a&gt;요청 사인하기&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
엑세스 토큰으로 요청을 사인할려면 &lt;a href="http://www.blogger.com/blogger.g?blogID=7852536510622031749#OAuth_Libraries"&gt;OAuth 라이브러리&lt;/a&gt;가 필요합니다. CQ는, OAuth의 제공자로써, &lt;a href="http://tools.ietf.org/html/rfc5849#section-3.4.2"&gt;HMAC-SHA1 사인 메쏘드&lt;/a&gt;를 지원하며, &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;Authorization&lt;/span&gt; 헤더, 쿼리 문자열의 일부 및 요청 바디 상의 OAuth 패러미터를 허용합니다. &lt;a href="http://tools.ietf.org/html/rfc5849#section-3.5"&gt;OAuth 1.0a: Parameter Transmission&lt;/a&gt;를 참고하세요.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;span style="font-size: large;"&gt;&lt;a href="http://www.blogger.com/blogger.g?blogID=7852536510622031749" name="Session_Management"&gt;&lt;/a&gt;세션 관리&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
CQ 세션은 클라이언트가 보호된 리소스를 접근할 때 체결되며 비활성 상태로 일정 기간이 지나면 만료됩니다. 만료는 HTTP 세션 타임아웃 또는 CQ 세션 타임아웃시 발생합니다. 일반적으로 세션이 체결될때 라이센스를 가져오며 세션이 만료될 때 라이센스가 릴리즈됩니다.&lt;br /&gt;
&lt;br /&gt;
HTTP 클라이언트로&amp;nbsp;&lt;a href="http://www.blogger.com/blogger.g?blogID=7852536510622031749#Base_URI"&gt;Base URI&lt;/a&gt;&amp;nbsp;아래 /session/ 컨텍스트에 DELETE 메쏘드를&amp;nbsp;호출함으로써 명시적으로 CQ 세션을 무효화할 수 있습니다.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;
요청:&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;DELETE /cqweb/oslc/session/ HTTP/1.1&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;Host: quagmire.rtp.raleigh.ibm.com&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;OSLC-Core-Version: 2.0
&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
응담:&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;HTTP/1.1 204 No Content&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;Content-Length: 0
&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
결과로 세션과 관련된 라이센스는 릴리스됩니다.&lt;br /&gt;
&lt;br /&gt;
세션을 추적하기 위해서는 HTTP 클라이언트 사용시 쿠키를 사용 가능하도록 해야 합니다. Apache HTTP 클라이언트를 사용할 경우, &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;http.protocol.single-cookie-header&lt;/span&gt;를 &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;true&lt;/span&gt;로 설정할 수 있습니다.&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt; HttpClient http = new HttpClient();&amp;nbsp; &lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;http.getParams().setParameter("http.protocol.single-cookie-header", true);
 http.getParams().setCookiePolicy(CookiePolicy.BROWSER_COMPATIBILITY)
&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;span style="font-size: large;"&gt;&lt;a href="http://www.blogger.com/blogger.g?blogID=7852536510622031749" name="Base_URI"&gt;&lt;/a&gt;Base URI&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
OSLC-CM 2.0 엑세스를 위한 Base URI는 아래와 같습니다.&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;http://&lt;server&gt;/cqweb/oslc/
&lt;/server&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
통합를 위한 CQ 루트 서비스 URI는 아애와 같습니다.&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;http://&lt;server&gt;/cqweb/oslc/repo/&lt;database-set&gt;/discovery
&lt;/database-set&gt;&lt;/server&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
만약 데이터베이스 세트 이름에 비 ASCII 문자가 있다면 인코딩이 필요함을 주의하시기 바랍니다.&lt;br /&gt;
&lt;br /&gt;
본 자료는&amp;nbsp;&lt;a href="https://jazz.net/wiki/bin/view/Main/RootServicesSpec"&gt;RootServicesSpec&lt;/a&gt;을 준수하며 째즈 제품과의 통합을 위해&amp;nbsp;많이&amp;nbsp;사용합니다.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;
&lt;b&gt;&lt;span style="font-size: large;"&gt;&lt;a href="http://www.blogger.com/blogger.g?blogID=7852536510622031749" name="Service_Discovery"&gt;&lt;/a&gt;서비스 열람&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
서비스 열람은 OSLC 제공자가 제공하는 기능을 열람하도록 합니다. 그래서 OSLC 제공자와의 작업의 출발점이 됩니다. CQ는 OSLC Core 2.0 스펙을 따른 모델을 제공합니다. 먼저&amp;nbsp;&lt;a href="http://www.blogger.com/blogger.g?blogID=7852536510622031749#Base_URI"&gt;Base URI&lt;/a&gt;에 GET 메쏘드를 호출하여 서비스 제공자 카탈로그를 획득합니다. 카탈로그와 다른 리소스와의 관계는 아래 그림을 참고하세요.&lt;/div&gt;
&lt;div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-3lQpiN_QfRg/TwKOaycPqSI/AAAAAAAAAN8/4u50EH5QKj4/s1600/oslc-core-provider.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="580" src="http://2.bp.blogspot.com/-3lQpiN_QfRg/TwKOaycPqSI/AAAAAAAAAN8/4u50EH5QKj4/s640/oslc-core-provider.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
-&lt;br /&gt;
&lt;b&gt;&lt;a href="http://www.blogger.com/blogger.g?blogID=7852536510622031749" name="Service_Provider_Catalogs"&gt;&lt;/a&gt;서비스 제공자 카탈로그&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
CQ가 제공하는 최상위 카탈로그는 서버에 정의된 데이터베이스 세트들입니다. 각 데이터베이스 세트는 각각의 사용자를 가지는 까닭에 개별적인 OAuth 구성정보를 가집니다. 각 데이터베이스 세트별로 개별 사용자 데이터베이스 카탈로그 위치를 가지고 있습니다.&lt;br /&gt;
&lt;br /&gt;
아래는 CQ 서비스 제공자 카탈로그 리소스의 RDF/XML 표현 예로써 두개의 데이터베이스 세트: DOC, Links를 나타냅니다.&lt;br /&gt;
&lt;br /&gt;
요청:&lt;br /&gt;
&lt;pre style="background-color: white; border-bottom-color: rgb(204, 204, 204); border-bottom-style: solid; border-bottom-width: 1px; border-image: initial; border-left-color: rgb(204, 204, 204); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(204, 204, 204); border-right-style: solid; border-right-width: 1px; border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; color: #7a4707; font-size: inherit; line-height: 19px; margin-bottom: 1em; margin-top: 1em; max-height: 400px; overflow-x: auto !important; overflow-y: auto !important; padding-bottom: 15px; padding-left: 15px; padding-right: 10px; padding-top: 10px; text-align: left; width: auto;"&gt;GET /cqweb/oslc/ HTTP/1.1
Host: quagmire.rtp.raleigh.ibm.com
OSLC-Core-Version: 2.0
Accept: application/rdf+xml&lt;/pre&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;
응답:&lt;br /&gt;
&lt;pre style="background-color: white; border-bottom-color: rgb(204, 204, 204); border-bottom-style: solid; border-bottom-width: 1px; border-image: initial; border-left-color: rgb(204, 204, 204); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(204, 204, 204); border-right-style: solid; border-right-width: 1px; border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; margin-bottom: 1em; margin-top: 1em; overflow-x: auto !important; overflow-y: auto !important; padding-bottom: 15px; padding-left: 15px; padding-right: 10px; padding-top: 10px; text-align: left; width: auto;"&gt;&lt;span style="color: #7a4707;"&gt;&lt;span style="line-height: 19px;"&gt;HTTP/1.1 200 OK
OSLC-Core-Version: 2.0
Transfer-Encoding: chunked
Content-Type: application/rdf+xml; charset=UTF-8

&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;
&amp;lt;rdf:RDF xmlns="http://open-services.net/ns/core#" xmlns:dc="http://purl.org/dc/terms/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"&amp;gt;
&amp;lt;ServiceProviderCatalog rdf:about="http://quagmire.rtp.raleigh.ibm.com/cqweb/oslc"&amp;gt;
&amp;lt;dc:title&amp;gt;Repository&amp;lt;/dc:title&amp;gt;
&amp;lt;dc:publisher&amp;gt;
&amp;lt;Publisher&amp;gt;
&amp;lt;dc:title&amp;gt;RCM/CQ OSLC CM Service Description Document&amp;lt;/dc:title&amp;gt;
&amp;lt;label&amp;gt;RCM/CQ OSLC CM Service Description Document&amp;lt;/label&amp;gt;
&amp;lt;dc:identifier&amp;gt;com.ibm.rational.cm.clearquest&amp;lt;/dc:identifier&amp;gt;
&amp;lt;icon rdf:resource="http://quagmire.rtp.raleigh.ibm.com/cqweb/_rcm-resources/clearquest.ico"/&amp;gt;
&amp;lt;/Publisher&amp;gt;
&amp;lt;/dc:publisher&amp;gt;
&amp;lt;serviceProviderCatalog&amp;gt;
&amp;lt;ServiceProviderCatalog rdf:about="http://quagmire.rtp.raleigh.ibm.com/cqweb/oslc/repo/DOC"&amp;gt;
&amp;lt;dc:title&amp;gt;DOC&amp;lt;/dc:title&amp;gt;
&amp;lt;details rdf:resource="http://quagmire.rtp.raleigh.ibm.com/cqweb/"/&amp;gt;
&amp;lt;oauthConfiguration&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;
아래는 CQ 서비스 제공자 카탈로그 리소스의 JSON 표현 예로써 두개의 데이터베이스 세트: DOC, Links를 나타냅니다.
&lt;br /&gt;
&lt;br /&gt;
요청:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;pre style="background-color: white; border-bottom-color: rgb(204, 204, 204); border-bottom-style: solid; border-bottom-width: 1px; border-image: initial; border-left-color: rgb(204, 204, 204); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(204, 204, 204); border-right-style: solid; border-right-width: 1px; border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; color: #7a4707; font-size: inherit; line-height: 19px; margin-bottom: 1em; margin-top: 1em; max-height: 400px; overflow-x: auto !important; overflow-y: auto !important; padding-bottom: 15px; padding-left: 15px; padding-right: 10px; padding-top: 10px; text-align: left; width: auto;"&gt;GET /cqweb/oslc/ HTTP/1.1
Host: quagmire.rtp.raleigh.ibm.com
OSLC-Core-Version: 2.0
Accept: application/json&lt;/pre&gt;
&lt;br /&gt;
&lt;br /&gt;
응답: 생략&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;a href="http://www.blogger.com/blogger.g?blogID=7852536510622031749" name="Service_Description_Documents"&gt;&lt;/a&gt;서비스 기술 문서&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
각각의 CQ 사용자 데이터베이스는 개별의 서비스 기술 문서를 가지고 있습니다. 이 서비스 기술 문서에는 새로운 레코드 생성과 쿼리를 위한 URL이 정의되어 있고 다른 웹 애플리케이션에서 사용할 수 있는 레코드 선택 및 생성에 필요한 대화상자에 대해 기술하고 있습니다. 각각의 레코드 유형별로 레코드 선택 및 생성 대화상자와 쿼리에 대한 서비스를 제공함을 유의하시기 바랍니다. 또한 디폴트로 제공하는 레코드 선택 대화상자는 레코드 유형을 선택할 수 있는 기능을 제공합니다.&lt;br /&gt;
&lt;br /&gt;
아래는 DefectTracking 스키마의 SAMPL 사용자 데이터베이스가 제공하는 CQ 서비스 기술 문서 리소스에 대한 RDF/XML 표현의 예입니다.&lt;br /&gt;
&lt;br /&gt;
요청:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;pre style="background-color: white; border-bottom-color: rgb(204, 204, 204); border-bottom-style: solid; border-bottom-width: 1px; border-image: initial; border-left-color: rgb(204, 204, 204); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(204, 204, 204); border-right-style: solid; border-right-width: 1px; border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; color: #7a4707; font-size: inherit; line-height: 19px; margin-bottom: 1em; margin-top: 1em; max-height: 400px; overflow-x: auto !important; overflow-y: auto !important; padding-bottom: 15px; padding-left: 15px; padding-right: 10px; padding-top: 10px; text-align: left; width: auto;"&gt;GET /cqweb/oslc/repo/DOC/db/SAMPL/ HTTP/1.1
Host: quagmire.rtp.raleigh.ibm.com
OSLC-Core-Version: 2.0
Accept: application/rdf+xml&lt;/pre&gt;
&lt;br /&gt;
응답:&lt;br /&gt;
&lt;br /&gt;
&lt;div style="background-color: white; color: #333333; font-family: arial, 'Lucida Grande', verdana, sans-serif; font-size: 14px; line-height: 1.5; margin-top: 1em; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left;"&gt;
&lt;/div&gt;
&lt;pre style="background-color: white; border-bottom-color: rgb(204, 204, 204); border-bottom-style: solid; border-bottom-width: 1px; border-image: initial; border-left-color: rgb(204, 204, 204); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(204, 204, 204); border-right-style: solid; border-right-width: 1px; border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; margin-bottom: 1em; margin-top: 1em; max-height: 400px; overflow-x: auto !important; overflow-y: auto !important; padding-bottom: 15px; padding-left: 15px; padding-right: 10px; padding-top: 10px; text-align: left; width: auto;"&gt;&lt;span style="color: #7a4707; font-size: inherit; line-height: 19px;"&gt;HTTP/1.1 200 OK
OSLC-Core-Version: 2.0
Transfer-Encoding: chunked
Content-Type: application/rdf+xml; charset=UTF-8

&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;
&amp;lt;rdf:RDF xmlns="http://open-services.net/ns/core#" xmlns:dc="http://purl.org/dc/terms/" xmlns:cq="http://www.ibm.com/xmlns/prod/rational/clearquest/1.0/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"&amp;gt;
&amp;lt;ServiceProvider rdf:about="http://quagmire.rtp.raleigh.ibm.com/cqweb/oslc/repo/DOC/db/SAMPL"&amp;gt;
&amp;lt;dc:title&amp;gt;RCM/CQ OSLC CM Service Description Document&amp;lt;/dc:title&amp;gt;
&amp;lt;dc:description&amp;gt;Rational Change Management/ClearQuest OSLC CM Services available for DOC/SAMPL.&amp;lt;/dc:description&amp;gt;
&amp;lt;dc:publisher&amp;gt;
&amp;lt;Publisher&amp;gt;
&amp;lt;dc:title&amp;gt;IBM Rational ClearQuest&amp;lt;/dc:title&amp;gt;
&amp;lt;label&amp;gt;IBM Rational ClearQuest&amp;lt;/label&amp;gt;
&amp;lt;dc:identifier&amp;gt;com.ibm.rational.cm.clearquest&amp;lt;/dc:identifier&amp;gt;
&amp;lt;icon rdf:resource="http://quagmire.rtp.raleigh.ibm.com/cqweb/_rcm-resources/clearquest.ico"/&amp;gt;
&amp;lt;/Publisher&amp;gt;
&amp;lt;/dc:publisher&amp;gt;
&amp;lt;details rdf:resource="http://quagmire.rtp.raleigh.ibm.com/cqweb/restapi/DOC/SAMPL?format=html"/&amp;gt;
&amp;lt;prefixDefinition&amp;gt;
&amp;lt;PrefixDefinition&amp;gt;
&amp;lt;prefix&amp;gt;oslc&amp;lt;/prefix&amp;gt;
&amp;lt;prefixBase rdf:resource="http://open-services.net/ns/core#"/&amp;gt;
&amp;lt;/PrefixDefinition&amp;gt;
&amp;lt;/prefixDefinition&amp;gt;
&amp;lt;prefixDefinition&amp;gt;
&amp;lt;PrefixDefinition&amp;gt;
&amp;lt;prefix&amp;gt;oslc_cm&amp;lt;/prefix&amp;gt;
&amp;lt;prefixBase rdf:resource="http://open-services.net/ns/cm#"/&amp;gt;
&amp;lt;/PrefixDefinition&amp;gt;
&amp;lt;/prefixDefinition&amp;gt;
&amp;lt;prefixDefinition&amp;gt;
&amp;lt;PrefixDefinition&amp;gt;
&amp;lt;prefix&amp;gt;dc&amp;lt;/prefix&amp;gt;
&amp;lt;prefixBase rdf:resource="http://purl.org/dc/terms/"/&amp;gt;
&amp;lt;/PrefixDefinition&amp;gt;
&amp;lt;/prefixDefinition&amp;gt;
&amp;lt;prefixDefinition&amp;gt;
&amp;lt;PrefixDefinition&amp;gt;
&amp;lt;prefix&amp;gt;dcterms&amp;lt;/prefix&amp;gt;
&amp;lt;prefixBase rdf:resource="http://purl.org/dc/terms/"/&amp;gt;
&amp;lt;/PrefixDefinition&amp;gt;
&amp;lt;/prefixDefinition&amp;gt;
&amp;lt;prefixDefinition&amp;gt;
&amp;lt;PrefixDefinition&amp;gt;
&amp;lt;prefix&amp;gt;rdf&amp;lt;/prefix&amp;gt;
&amp;lt;prefixBase rdf:resource="http://www.w3.org/1999/02/22-rdf-syntax-ns#"/&amp;gt;
&amp;lt;/PrefixDefinition&amp;gt;
&amp;lt;/prefixDefinition&amp;gt;
&amp;lt;prefixDefinition&amp;gt;
&amp;lt;PrefixDefinition&amp;gt;
&amp;lt;prefix&amp;gt;rdfs&amp;lt;/prefix&amp;gt;
&amp;lt;prefixBase rdf:resource="http://www.w3.org/2000/01/rdf-schema#"/&amp;gt;
&amp;lt;/PrefixDefinition&amp;gt;
&amp;lt;/prefixDefinition&amp;gt;
&amp;lt;prefixDefinition&amp;gt;
&amp;lt;PrefixDefinition&amp;gt;
&amp;lt;prefix&amp;gt;foaf&amp;lt;/prefix&amp;gt;
&amp;lt;prefixBase rdf:resource="http://xmlns.com/foaf/0.1/"/&amp;gt;
&amp;lt;/PrefixDefinition&amp;gt;
&amp;lt;/prefixDefinition&amp;gt;
&amp;lt;prefixDefinition&amp;gt;
&amp;lt;PrefixDefinition&amp;gt;
&amp;lt;prefix&amp;gt;cq&amp;lt;/prefix&amp;gt;
&amp;lt;prefixBase rdf:resource="http://www.ibm.com/xmlns/prod/rational/clearquest/1.0/"/&amp;gt;
&amp;lt;/PrefixDefinition&amp;gt;
&amp;lt;/prefixDefinition&amp;gt;
&amp;lt;prefixDefinition&amp;gt;
&amp;lt;PrefixDefinition&amp;gt;
&amp;lt;prefix&amp;gt;oslc_cmx&amp;lt;/prefix&amp;gt;
&amp;lt;prefixBase rdf:resource="http://open-services.net/ns/cm-x#"/&amp;gt;
&amp;lt;/PrefixDefinition&amp;gt;
&amp;lt;/prefixDefinition&amp;gt;
&amp;lt;service&amp;gt;
&amp;lt;Service&amp;gt;
&amp;lt;domain rdf:resource="http://open-services.net/ns/cm#"/&amp;gt;
&amp;lt;creationFactory&amp;gt;
&amp;lt;CreationFactory&amp;gt;
&amp;lt;dc:title&amp;gt;Unattended location for the creation of ClearQuest Records&amp;lt;/dc:title&amp;gt;
&amp;lt;label&amp;gt;Unattended location for the creation of ClearQuest Records&amp;lt;/label&amp;gt;
&amp;lt;creation rdf:resource="http://quagmire.rtp.raleigh.ibm.com/cqweb/oslc/repo/DOC/db/SAMPL/record"/&amp;gt;
&amp;lt;resourceType rdf:resource="http://open-services.net/ns/cm#ChangeRequest"/&amp;gt;
&amp;lt;usage rdf:resource="http://open-services.net/ns/core#default"/&amp;gt;
&amp;lt;resourceShape rdf:resource="http://quagmire.rtp.raleigh.ibm.com/cqweb/oslc/repo/DOC/db/SAMPL/shape/16777224"/&amp;gt;
&amp;lt;resourceShape rdf:resource="http://quagmire.rtp.raleigh.ibm.com/cqweb/oslc/repo/DOC/db/SAMPL/shape/16777751"/&amp;gt;
&amp;lt;resourceShape rdf:resource="http://quagmire.rtp.raleigh.ibm.com/cqweb/oslc/repo/DOC/db/SAMPL/shape/16777220"/&amp;gt;
&amp;lt;resourceShape rdf:resource="http://quagmire.rtp.raleigh.ibm.com/cqweb/oslc/repo/DOC/db/SAMPL/shape/16777222"/&amp;gt;
&amp;lt;resourceShape rdf:resource="http://quagmire.rtp.raleigh.ibm.com/cqweb/oslc/repo/DOC/db/SAMPL/shape/16777219"/&amp;gt;
&amp;lt;resourceShape rdf:resource="http://quagmire.rtp.raleigh.ibm.com/cqweb/oslc/repo/DOC/db/SAMPL/shape/16777935"/&amp;gt;
&amp;lt;resourceShape rdf:resource="http://quagmire.rtp.raleigh.ibm.com/cqweb/oslc/repo/DOC/db/SAMPL/shape/16777221"/&amp;gt;
&amp;lt;resourceShape rdf:resource="http://quagmire.rtp.raleigh.ibm.com/cqweb/oslc/repo/DOC/db/SAMPL/shape/16777897"/&amp;gt;
&amp;lt;resourceShape rdf:resource="http://quagmire.rtp.raleigh.ibm.com/cqweb/oslc/repo/DOC/db/SAMPL/shape/16777223"/&amp;gt;
&amp;lt;/CreationFactory&amp;gt;
&amp;lt;/creationFactory&amp;gt;
&amp;lt;creationDialog&amp;gt;
&amp;lt;Dialog&amp;gt;
&amp;lt;dc:title&amp;gt;New Defect&amp;lt;/dc:title&amp;gt;
&amp;lt;dc:description&amp;gt;Web dialog for creating new Defect records&amp;lt;/dc:description&amp;gt;
&amp;lt;label&amp;gt;Defect&amp;lt;/label&amp;gt;
&amp;lt;dialog rdf:resource="http://quagmire.rtp.raleigh.ibm.com/cqweb/oslc/repo/DOC/db/SAMPL/record-type/16777224/creationDialog?dc%3Atype=Defect"/&amp;gt;
&amp;lt;hintWidth&amp;gt;703px&amp;lt;/hintWidth&amp;gt;
&amp;lt;hintHeight&amp;gt;510px&amp;lt;/hintHeight&amp;gt;
&amp;lt;resourceType rdf:resource="http://open-services.net/ns/cm#ChangeRequest"/&amp;gt;
&amp;lt;usage rdf:resource="http://open-services.net/ns/core#default"/&amp;gt;
&amp;lt;/Dialog&amp;gt;
&amp;lt;/creationDialog&amp;gt;
&amp;lt;creationDialog&amp;gt;
&amp;lt;Dialog&amp;gt;
&amp;lt;dc:title&amp;gt;New Customer&amp;lt;/dc:title&amp;gt;
&amp;lt;dc:description&amp;gt;Web dialog for creating new Customer records&amp;lt;/dc:description&amp;gt;
&amp;lt;label&amp;gt;Customer&amp;lt;/label&amp;gt;
&amp;lt;dialog rdf:resource="http://quagmire.rtp.raleigh.ibm.com/cqweb/oslc/repo/DOC/db/SAMPL/record-type/16777935/creationDialog?dc%3Atype=Customer"/&amp;gt;
&amp;lt;hintWidth&amp;gt;803px&amp;lt;/hintWidth&amp;gt;
&amp;lt;hintHeight&amp;gt;588px&amp;lt;/hintHeight&amp;gt;
&amp;lt;resourceType rdf:resource="http://open-services.net/ns/cm#ChangeRequest"/&amp;gt;
&amp;lt;/Dialog&amp;gt;
&amp;lt;/creationDialog&amp;gt;
&amp;lt;creationDialog&amp;gt;
&amp;lt;Dialog&amp;gt;
&amp;lt;dc:title&amp;gt;New Email_Rule&amp;lt;/dc:title&amp;gt;
&amp;lt;dc:description&amp;gt;Web dialog for creating new Email_Rule records&amp;lt;/dc:description&amp;gt;
&amp;lt;label&amp;gt;Email_Rule&amp;lt;/label&amp;gt;
&amp;lt;dialog rdf:resource="http://quagmire.rtp.raleigh.ibm.com/cqweb/oslc/repo/DOC/db/SAMPL/record-type/16777751/creationDialog?dc%3Atype=Email_Rule"/&amp;gt;
&amp;lt;hintWidth&amp;gt;727px&amp;lt;/hintWidth&amp;gt;
&amp;lt;hintHeight&amp;gt;471px&amp;lt;/hintHeight&amp;gt;
&amp;lt;resourceType rdf:resource="http://open-services.net/ns/cm#ChangeRequest"/&amp;gt;
&amp;lt;/Dialog&amp;gt;
&amp;lt;/creationDialog&amp;gt;
&amp;lt;creationDialog&amp;gt;
&amp;lt;Dialog&amp;gt;
&amp;lt;dc:title&amp;gt;New Project&amp;lt;/dc:title&amp;gt;
&amp;lt;dc:description&amp;gt;Web dialog for creating new Project records&amp;lt;/dc:description&amp;gt;
&amp;lt;label&amp;gt;Project&amp;lt;/label&amp;gt;
&amp;lt;dialog rdf:resource="http://quagmire.rtp.raleigh.ibm.com/cqweb/oslc/repo/DOC/db/SAMPL/record-type/16777897/creationDialog?dc%3Atype=Project"/&amp;gt;
&amp;lt;hintWidth&amp;gt;651px&amp;lt;/hintWidth&amp;gt;
&amp;lt;hintHeight&amp;gt;294px&amp;lt;/hintHeight&amp;gt;
&amp;lt;resourceType rdf:resource="http://open-services.net/ns/cm#ChangeRequest"/&amp;gt;
&amp;lt;/Dialog&amp;gt;
&amp;lt;/creationDialog&amp;gt;
&amp;lt;creationDialog&amp;gt;
&amp;lt;Dialog&amp;gt;
&amp;lt;dc:title&amp;gt;New groups&amp;lt;/dc:title&amp;gt;
&amp;lt;dc:description&amp;gt;Web dialog for creating new groups records&amp;lt;/dc:description&amp;gt;
&amp;lt;label&amp;gt;groups&amp;lt;/label&amp;gt;
&amp;lt;dialog rdf:resource="http://quagmire.rtp.raleigh.ibm.com/cqweb/oslc/repo/DOC/db/SAMPL/record-type/16777222/creationDialog?dc%3Atype=groups"/&amp;gt;
&amp;lt;hintWidth&amp;gt;722px&amp;lt;/hintWidth&amp;gt;
&amp;lt;hintHeight&amp;gt;194px&amp;lt;/hintHeight&amp;gt;
&amp;lt;resourceType rdf:resource="http://open-services.net/ns/cm#ChangeRequest"/&amp;gt;
&amp;lt;/Dialog&amp;gt;
&amp;lt;/creationDialog&amp;gt;
&amp;lt;creationDialog&amp;gt;
&amp;lt;Dialog&amp;gt;
&amp;lt;dc:title&amp;gt;New ratl_replicas&amp;lt;/dc:title&amp;gt;
&amp;lt;dc:description&amp;gt;Web dialog for creating new ratl_replicas records&amp;lt;/dc:description&amp;gt;
&amp;lt;label&amp;gt;ratl_replicas&amp;lt;/label&amp;gt;
&amp;lt;dialog rdf:resource="http://quagmire.rtp.raleigh.ibm.com/cqweb/oslc/repo/DOC/db/SAMPL/record-type/16777220/creationDialog?dc%3Atype=ratl_replicas"/&amp;gt;
&amp;lt;hintWidth&amp;gt;674px&amp;lt;/hintWidth&amp;gt;
&amp;lt;hintHeight&amp;gt;342px&amp;lt;/hintHeight&amp;gt;
&amp;lt;resourceType rdf:resource="http://open-services.net/ns/cm#ChangeRequest"/&amp;gt;
&amp;lt;/Dialog&amp;gt;
&amp;lt;/creationDialog&amp;gt;
&amp;lt;creationDialog&amp;gt;
&amp;lt;Dialog&amp;gt;
&amp;lt;dc:title&amp;gt;New users&amp;lt;/dc:title&amp;gt;
&amp;lt;dc:description&amp;gt;Web dialog for creating new users records&amp;lt;/dc:description&amp;gt;
&amp;lt;label&amp;gt;users&amp;lt;/label&amp;gt;
&amp;lt;dialog rdf:resource="http://quagmire.rtp.raleigh.ibm.com/cqweb/oslc/repo/DOC/db/SAMPL/record-type/16777223/creationDialog?dc%3Atype=users"/&amp;gt;
&amp;lt;hintWidth&amp;gt;703px&amp;lt;/hintWidth&amp;gt;
&amp;lt;hintHeight&amp;gt;376px&amp;lt;/hintHeight&amp;gt;
&amp;lt;resourceType rdf:resource="http://open-services.net/ns/cm#ChangeRequest"/&amp;gt;
&amp;lt;/Dialog&amp;gt;
&amp;lt;/creationDialog&amp;gt;
&amp;lt;selectionDialog&amp;gt;
&amp;lt;Dialog&amp;gt;
&amp;lt;dc:title&amp;gt;Choose ClearQuest Record&amp;lt;/dc:title&amp;gt;
&amp;lt;dc:description&amp;gt;Web dialog for finding and selecting ClearQuest Record records&amp;lt;/dc:description&amp;gt;
&amp;lt;label&amp;gt;ClearQuest Record&amp;lt;/label&amp;gt;
&amp;lt;dialog rdf:resource="http://quagmire.rtp.raleigh.ibm.com/cqweb/oslc/repo/DOC/db/SAMPL/record-type/16777224/selectionDialog?dc%3Atype=cq.repo.cq-rectype%3A16777224%40DOC%2FSAMPL&amp;amp;restrictType=false"/&amp;gt;
&amp;lt;hintWidth&amp;gt;640px&amp;lt;/hintWidth&amp;gt;
&amp;lt;hintHeight&amp;gt;540px&amp;lt;/hintHeight&amp;gt;
&amp;lt;resourceType rdf:resource="http://open-services.net/ns/cm#ChangeRequest"/&amp;gt;
&amp;lt;usage rdf:resource="http://open-services.net/ns/core#default"/&amp;gt;
&amp;lt;/Dialog&amp;gt;
&amp;lt;/selectionDialog&amp;gt;
&amp;lt;selectionDialog&amp;gt;
&amp;lt;Dialog&amp;gt;
&amp;lt;dc:title&amp;gt;Choose Defect&amp;lt;/dc:title&amp;gt;
&amp;lt;dc:description&amp;gt;Web dialog for finding and selecting Defect records&amp;lt;/dc:description&amp;gt;
&amp;lt;label&amp;gt;Defect&amp;lt;/label&amp;gt;
&amp;lt;dialog rdf:resource="http://quagmire.rtp.raleigh.ibm.com/cqweb/oslc/repo/DOC/db/SAMPL/record-type/16777224/selectionDialog?dc%3Atype=cq.repo.cq-rectype%3A16777224%40DOC%2FSAMPL&amp;amp;restrictType=true"/&amp;gt;
&amp;lt;hintWidth&amp;gt;640px&amp;lt;/hintWidth&amp;gt;
&amp;lt;hintHeight&amp;gt;540px&amp;lt;/hintHeight&amp;gt;
&amp;lt;resourceType rdf:resource="http://open-services.net/ns/cm#ChangeRequest"/&amp;gt;
&amp;lt;/Dialog&amp;gt;
&amp;lt;/selectionDialog&amp;gt;
&amp;lt;selectionDialog&amp;gt;
&amp;lt;Dialog&amp;gt;
&amp;lt;dc:title&amp;gt;Choose Email_Rule&amp;lt;/dc:title&amp;gt;
&amp;lt;dc:description&amp;gt;Web dialog for finding and selecting Email_Rule records&amp;lt;/dc:description&amp;gt;
&amp;lt;label&amp;gt;Email_Rule&amp;lt;/label&amp;gt;
&amp;lt;dialog rdf:resource="http://quagmire.rtp.raleigh.ibm.com/cqweb/oslc/repo/DOC/db/SAMPL/record-type/16777751/selectionDialog?dc%3Atype=cq.repo.cq-rectype%3A16777751%40DOC%2FSAMPL&amp;amp;restrictType=true"/&amp;gt;
&amp;lt;hintWidth&amp;gt;640px&amp;lt;/hintWidth&amp;gt;
&amp;lt;hintHeight&amp;gt;540px&amp;lt;/hintHeight&amp;gt;
&amp;lt;resourceType rdf:resource="http://open-services.net/ns/cm#ChangeRequest"/&amp;gt;
&amp;lt;/Dialog&amp;gt;
&amp;lt;/selectionDialog&amp;gt;
&amp;lt;selectionDialog&amp;gt;
&amp;lt;Dialog&amp;gt;
&amp;lt;dc:title&amp;gt;Choose ratl_replicas&amp;lt;/dc:title&amp;gt;
&amp;lt;dc:description&amp;gt;Web dialog for finding and selecting ratl_replicas records&amp;lt;/dc:description&amp;gt;
&amp;lt;label&amp;gt;ratl_replicas&amp;lt;/label&amp;gt;
&amp;lt;dialog rdf:resource="http://quagmire.rtp.raleigh.ibm.com/cqweb/oslc/repo/DOC/db/SAMPL/record-type/16777220/selectionDialog?dc%3Atype=cq.repo.cq-rectype%3A16777220%40DOC%2FSAMPL&amp;amp;restrictType=true"/&amp;gt;
&amp;lt;hintWidth&amp;gt;640px&amp;lt;/hintWidth&amp;gt;
&amp;lt;hintHeight&amp;gt;540px&amp;lt;/hintHeight&amp;gt;
&amp;lt;resourceType rdf:resource="http://open-services.net/ns/cm#ChangeRequest"/&amp;gt;
&amp;lt;/Dialog&amp;gt;
&amp;lt;/selectionDialog&amp;gt;
&amp;lt;selectionDialog&amp;gt;
&amp;lt;Dialog&amp;gt;
&amp;lt;dc:title&amp;gt;Choose groups&amp;lt;/dc:title&amp;gt;
&amp;lt;dc:description&amp;gt;Web dialog for finding and selecting groups records&amp;lt;/dc:description&amp;gt;
&amp;lt;label&amp;gt;groups&amp;lt;/label&amp;gt;
&amp;lt;dialog rdf:resource="http://quagmire.rtp.raleigh.ibm.com/cqweb/oslc/repo/DOC/db/SAMPL/record-type/16777222/selectionDialog?dc%3Atype=cq.repo.cq-rectype%3A16777222%40DOC%2FSAMPL&amp;amp;restrictType=true"/&amp;gt;
&amp;lt;hintWidth&amp;gt;640px&amp;lt;/hintWidth&amp;gt;
&amp;lt;hintHeight&amp;gt;540px&amp;lt;/hintHeight&amp;gt;
&amp;lt;resourceType rdf:resource="http://open-services.net/ns/cm#ChangeRequest"/&amp;gt;
&amp;lt;/Dialog&amp;gt;
&amp;lt;/selectionDialog&amp;gt;
&amp;lt;selectionDialog&amp;gt;
&amp;lt;Dialog&amp;gt;
&amp;lt;dc:title&amp;gt;Choose history&amp;lt;/dc:title&amp;gt;
&amp;lt;dc:description&amp;gt;Web dialog for finding and selecting history records&amp;lt;/dc:description&amp;gt;
&amp;lt;label&amp;gt;history&amp;lt;/label&amp;gt;
&amp;lt;dialog rdf:resource="http://quagmire.rtp.raleigh.ibm.com/cqweb/oslc/repo/DOC/db/SAMPL/record-type/16777219/selectionDialog?dc%3Atype=cq.repo.cq-rectype%3A16777219%40DOC%2FSAMPL&amp;amp;restrictType=true"/&amp;gt;
&amp;lt;hintWidth&amp;gt;640px&amp;lt;/hintWidth&amp;gt;
&amp;lt;hintHeight&amp;gt;540px&amp;lt;/hintHeight&amp;gt;
&amp;lt;resourceType rdf:resource="http://open-services.net/ns/cm#ChangeRequest"/&amp;gt;
&amp;lt;/Dialog&amp;gt;
&amp;lt;/selectionDialog&amp;gt;
&amp;lt;selectionDialog&amp;gt;
&amp;lt;Dialog&amp;gt;
&amp;lt;dc:title&amp;gt;Choose Customer&amp;lt;/dc:title&amp;gt;
&amp;lt;dc:description&amp;gt;Web dialog for finding and selecting Customer records&amp;lt;/dc:description&amp;gt;
&amp;lt;label&amp;gt;Customer&amp;lt;/label&amp;gt;
&amp;lt;dialog rdf:resource="http://quagmire.rtp.raleigh.ibm.com/cqweb/oslc/repo/DOC/db/SAMPL/record-type/16777935/selectionDialog?dc%3Atype=cq.repo.cq-rectype%3A16777935%40DOC%2FSAMPL&amp;amp;restrictType=true"/&amp;gt;
&amp;lt;hintWidth&amp;gt;640px&amp;lt;/hintWidth&amp;gt;
&amp;lt;hintHeight&amp;gt;540px&amp;lt;/hintHeight&amp;gt;
&amp;lt;resourceType rdf:resource="http://open-services.net/ns/cm#ChangeRequest"/&amp;gt;
&amp;lt;/Dialog&amp;gt;
&amp;lt;/selectionDialog&amp;gt;
&amp;lt;selectionDialog&amp;gt;
&amp;lt;Dialog&amp;gt;
&amp;lt;dc:title&amp;gt;Choose attachments&amp;lt;/dc:title&amp;gt;
&amp;lt;dc:description&amp;gt;Web dialog for finding and selecting attachments records&amp;lt;/dc:description&amp;gt;
&amp;lt;label&amp;gt;attachments&amp;lt;/label&amp;gt;
&amp;lt;dialog rdf:resource="http://quagmire.rtp.raleigh.ibm.com/cqweb/oslc/repo/DOC/db/SAMPL/record-type/16777221/selectionDialog?dc%3Atype=cq.repo.cq-rectype%3A16777221%40DOC%2FSAMPL&amp;amp;restrictType=true"/&amp;gt;
&amp;lt;hintWidth&amp;gt;640px&amp;lt;/hintWidth&amp;gt;
&amp;lt;hintHeight&amp;gt;540px&amp;lt;/hintHeight&amp;gt;
&amp;lt;resourceType rdf:resource="http://open-services.net/ns/cm#ChangeRequest"/&amp;gt;
&amp;lt;/Dialog&amp;gt;
&amp;lt;/selectionDialog&amp;gt;
&amp;lt;selectionDialog&amp;gt;
&amp;lt;Dialog&amp;gt;
&amp;lt;dc:title&amp;gt;Choose Project&amp;lt;/dc:title&amp;gt;
&amp;lt;dc:description&amp;gt;Web dialog for finding and selecting Project records&amp;lt;/dc:description&amp;gt;
&amp;lt;label&amp;gt;Project&amp;lt;/label&amp;gt;
&amp;lt;dialog rdf:resource="http://quagmire.rtp.raleigh.ibm.com/cqweb/oslc/repo/DOC/db/SAMPL/record-type/16777897/selectionDialog?dc%3Atype=cq.repo.cq-rectype%3A16777897%40DOC%2FSAMPL&amp;amp;restrictType=true"/&amp;gt;
&amp;lt;hintWidth&amp;gt;640px&amp;lt;/hintWidth&amp;gt;
&amp;lt;hintHeight&amp;gt;540px&amp;lt;/hintHeight&amp;gt;
&amp;lt;resourceType rdf:resource="http://open-services.net/ns/cm#ChangeRequest"/&amp;gt;
&amp;lt;/Dialog&amp;gt;
&amp;lt;/selectionDialog&amp;gt;
&amp;lt;selectionDialog&amp;gt;
&amp;lt;Dialog&amp;gt;
&amp;lt;dc:title&amp;gt;Choose users&amp;lt;/dc:title&amp;gt;
&amp;lt;dc:description&amp;gt;Web dialog for finding and selecting users records&amp;lt;/dc:description&amp;gt;
&amp;lt;label&amp;gt;users&amp;lt;/label&amp;gt;
&amp;lt;dialog rdf:resource="http://quagmire.rtp.raleigh.ibm.com/cqweb/oslc/repo/DOC/db/SAMPL/record-type/16777223/selectionDialog?dc%3Atype=cq.repo.cq-rectype%3A16777223%40DOC%2FSAMPL&amp;amp;restrictType=true"/&amp;gt;
&amp;lt;hintWidth&amp;gt;640px&amp;lt;/hintWidth&amp;gt;
&amp;lt;hintHeight&amp;gt;540px&amp;lt;/hintHeight&amp;gt;
&amp;lt;resourceType rdf:resource="http://open-services.net/ns/cm#ChangeRequest"/&amp;gt;
&amp;lt;/Dialog&amp;gt;
&amp;lt;/selectionDialog&amp;gt;
&amp;lt;queryCapability&amp;gt;
&amp;lt;QueryCapability&amp;gt;
&amp;lt;resourceType rdf:resource="http://open-services.net/ns/cm#ChangeRequest"/&amp;gt;
&amp;lt;usage rdf:resource="http://open-services.net/ns/core#default"/&amp;gt;
&amp;lt;dc:title&amp;gt;Simple GET-based Record Query&amp;lt;/dc:title&amp;gt;
&amp;lt;label&amp;gt;Defect&amp;lt;/label&amp;gt;
&amp;lt;queryBase rdf:resource="http://quagmire.rtp.raleigh.ibm.com/cqweb/oslc/repo/DOC/db/SAMPL/simpleQuery/16777224"/&amp;gt;
&amp;lt;resourceShape rdf:resource="http://quagmire.rtp.raleigh.ibm.com/cqweb/oslc/repo/DOC/db/SAMPL/queryShape/16777224"/&amp;gt;
&amp;lt;cq:supportsOslcSearchTerms&amp;gt;false&amp;lt;/cq:supportsOslcSearchTerms&amp;gt;
&amp;lt;/QueryCapability&amp;gt;
&amp;lt;/queryCapability&amp;gt;
&amp;lt;queryCapability&amp;gt;
&amp;lt;QueryCapability&amp;gt;
&amp;lt;resourceType rdf:resource="http://open-services.net/ns/cm#ChangeRequest"/&amp;gt;
&amp;lt;dc:title&amp;gt;Simple GET-based Record Query&amp;lt;/dc:title&amp;gt;
&amp;lt;label&amp;gt;Email_Rule&amp;lt;/label&amp;gt;
&amp;lt;queryBase rdf:resource="http://quagmire.rtp.raleigh.ibm.com/cqweb/oslc/repo/DOC/db/SAMPL/simpleQuery/16777751"/&amp;gt;
&amp;lt;resourceShape rdf:resource="http://quagmire.rtp.raleigh.ibm.com/cqweb/oslc/repo/DOC/db/SAMPL/queryShape/16777751"/&amp;gt;
&amp;lt;cq:supportsOslcSearchTerms&amp;gt;false&amp;lt;/cq:supportsOslcSearchTerms&amp;gt;
&amp;lt;/QueryCapability&amp;gt;
&amp;lt;/queryCapability&amp;gt;
&amp;lt;queryCapability&amp;gt;
&amp;lt;QueryCapability&amp;gt;
&amp;lt;resourceType rdf:resource="http://open-services.net/ns/cm#ChangeRequest"/&amp;gt;
&amp;lt;dc:title&amp;gt;Simple GET-based Record Query&amp;lt;/dc:title&amp;gt;
&amp;lt;label&amp;gt;ratl_replicas&amp;lt;/label&amp;gt;
&amp;lt;queryBase rdf:resource="http://quagmire.rtp.raleigh.ibm.com/cqweb/oslc/repo/DOC/db/SAMPL/simpleQuery/16777220"/&amp;gt;
&amp;lt;resourceShape rdf:resource="http://quagmire.rtp.raleigh.ibm.com/cqweb/oslc/repo/DOC/db/SAMPL/queryShape/16777220"/&amp;gt;
&amp;lt;cq:supportsOslcSearchTerms&amp;gt;false&amp;lt;/cq:supportsOslcSearchTerms&amp;gt;
&amp;lt;/QueryCapability&amp;gt;
&amp;lt;/queryCapability&amp;gt;
&amp;lt;queryCapability&amp;gt;
&amp;lt;QueryCapability&amp;gt;
&amp;lt;resourceType rdf:resource="http://open-services.net/ns/cm#ChangeRequest"/&amp;gt;
&amp;lt;dc:title&amp;gt;Simple GET-based Record Query&amp;lt;/dc:title&amp;gt;
&amp;lt;label&amp;gt;groups&amp;lt;/label&amp;gt;
&amp;lt;queryBase rdf:resource="http://quagmire.rtp.raleigh.ibm.com/cqweb/oslc/repo/DOC/db/SAMPL/simpleQuery/16777222"/&amp;gt;
&amp;lt;resourceShape rdf:resource="http://quagmire.rtp.raleigh.ibm.com/cqweb/oslc/repo/DOC/db/SAMPL/queryShape/16777222"/&amp;gt;
&amp;lt;cq:supportsOslcSearchTerms&amp;gt;false&amp;lt;/cq:supportsOslcSearchTerms&amp;gt;
&amp;lt;/QueryCapability&amp;gt;
&amp;lt;/queryCapability&amp;gt;
&amp;lt;queryCapability&amp;gt;
&amp;lt;QueryCapability&amp;gt;
&amp;lt;resourceType rdf:resource="http://open-services.net/ns/cm#ChangeRequest"/&amp;gt;
&amp;lt;dc:title&amp;gt;Simple GET-based Record Query&amp;lt;/dc:title&amp;gt;
&amp;lt;label&amp;gt;history&amp;lt;/label&amp;gt;
&amp;lt;queryBase rdf:resource="http://quagmire.rtp.raleigh.ibm.com/cqweb/oslc/repo/DOC/db/SAMPL/simpleQuery/16777219"/&amp;gt;
&amp;lt;resourceShape rdf:resource="http://quagmire.rtp.raleigh.ibm.com/cqweb/oslc/repo/DOC/db/SAMPL/queryShape/16777219"/&amp;gt;
&amp;lt;cq:supportsOslcSearchTerms&amp;gt;false&amp;lt;/cq:supportsOslcSearchTerms&amp;gt;
&amp;lt;/QueryCapability&amp;gt;
&amp;lt;/queryCapability&amp;gt;
&amp;lt;queryCapability&amp;gt;
&amp;lt;QueryCapability&amp;gt;
&amp;lt;resourceType rdf:resource="http://open-services.net/ns/cm#ChangeRequest"/&amp;gt;
&amp;lt;dc:title&amp;gt;Simple GET-based Record Query&amp;lt;/dc:title&amp;gt;
&amp;lt;label&amp;gt;Customer&amp;lt;/label&amp;gt;
&amp;lt;queryBase rdf:resource="http://quagmire.rtp.raleigh.ibm.com/cqweb/oslc/repo/DOC/db/SAMPL/simpleQuery/16777935"/&amp;gt;
&amp;lt;resourceShape rdf:resource="http://quagmire.rtp.raleigh.ibm.com/cqweb/oslc/repo/DOC/db/SAMPL/queryShape/16777935"/&amp;gt;
&amp;lt;cq:supportsOslcSearchTerms&amp;gt;false&amp;lt;/cq:supportsOslcSearchTerms&amp;gt;
&amp;lt;/QueryCapability&amp;gt;
&amp;lt;/queryCapability&amp;gt;
&amp;lt;queryCapability&amp;gt;
&amp;lt;QueryCapability&amp;gt;
&amp;lt;resourceType rdf:resource="http://open-services.net/ns/cm#ChangeRequest"/&amp;gt;
&amp;lt;dc:title&amp;gt;Simple GET-based Record Query&amp;lt;/dc:title&amp;gt;
&amp;lt;label&amp;gt;attachments&amp;lt;/label&amp;gt;
&amp;lt;queryBase rdf:resource="http://quagmire.rtp.raleigh.ibm.com/cqweb/oslc/repo/DOC/db/SAMPL/simpleQuery/16777221"/&amp;gt;
&amp;lt;resourceShape rdf:resource="http://quagmire.rtp.raleigh.ibm.com/cqweb/oslc/repo/DOC/db/SAMPL/queryShape/16777221"/&amp;gt;
&amp;lt;cq:supportsOslcSearchTerms&amp;gt;false&amp;lt;/cq:supportsOslcSearchTerms&amp;gt;
&amp;lt;/QueryCapability&amp;gt;
&amp;lt;/queryCapability&amp;gt;
&amp;lt;queryCapability&amp;gt;
&amp;lt;QueryCapability&amp;gt;
&amp;lt;resourceType rdf:resource="http://open-services.net/ns/cm#ChangeRequest"/&amp;gt;
&amp;lt;dc:title&amp;gt;Simple GET-based Record Query&amp;lt;/dc:title&amp;gt;
&amp;lt;label&amp;gt;Project&amp;lt;/label&amp;gt;
&amp;lt;queryBase rdf:resource="http://quagmire.rtp.raleigh.ibm.com/cqweb/oslc/repo/DOC/db/SAMPL/simpleQuery/16777897"/&amp;gt;
&amp;lt;resourceShape rdf:resource="http://quagmire.rtp.raleigh.ibm.com/cqweb/oslc/repo/DOC/db/SAMPL/queryShape/16777897"/&amp;gt;
&amp;lt;cq:supportsOslcSearchTerms&amp;gt;false&amp;lt;/cq:supportsOslcSearchTerms&amp;gt;
&amp;lt;/QueryCapability&amp;gt;
&amp;lt;/queryCapability&amp;gt;
&amp;lt;queryCapability&amp;gt;
&amp;lt;QueryCapability&amp;gt;
&amp;lt;resourceType rdf:resource="http://open-services.net/ns/cm#ChangeRequest"/&amp;gt;
&amp;lt;dc:title&amp;gt;Simple GET-based Record Query&amp;lt;/dc:title&amp;gt;
&amp;lt;label&amp;gt;users&amp;lt;/label&amp;gt;
&amp;lt;queryBase rdf:resource="http://quagmire.rtp.raleigh.ibm.com/cqweb/oslc/repo/DOC/db/SAMPL/simpleQuery/16777223"/&amp;gt;
&amp;lt;resourceShape rdf:resource="http://quagmire.rtp.raleigh.ibm.com/cqweb/oslc/repo/DOC/db/SAMPL/queryShape/16777223"/&amp;gt;
&amp;lt;cq:supportsOslcSearchTerms&amp;gt;false&amp;lt;/cq:supportsOslcSearchTerms&amp;gt;
&amp;lt;/QueryCapability&amp;gt;
&amp;lt;/queryCapability&amp;gt;
&amp;lt;cq:queryNavigatorDialog&amp;gt;
&amp;lt;Dialog&amp;gt;
&amp;lt;usage rdf:resource="http://open-services.net/ns/core#default"/&amp;gt;
&amp;lt;resourceType rdf:resource="http://open-services.net/ns/cm#ChangeRequest"/&amp;gt;
&amp;lt;dc:title&amp;gt;Choose Query - IBM Rational ClearQuest&amp;lt;/dc:title&amp;gt;
&amp;lt;dc:description&amp;gt;Web dialog for choosing named queries&amp;lt;/dc:description&amp;gt;
&amp;lt;dialog rdf:resource="http://quagmire.rtp.raleigh.ibm.com/cqweb/oslc/repo/DOC/db/SAMPL/queryNavigatorDialog"/&amp;gt;
&amp;lt;hintWidth&amp;gt;325px&amp;lt;/hintWidth&amp;gt;
&amp;lt;hintHeight&amp;gt;375px&amp;lt;/hintHeight&amp;gt;
&amp;lt;/Dialog&amp;gt;
&amp;lt;/cq:queryNavigatorDialog&amp;gt;
&amp;lt;cq:namedQuery&amp;gt;
&amp;lt;cq:NamedQuery&amp;gt;
&amp;lt;dc:title&amp;gt;Location for named queries and folders&amp;lt;/dc:title&amp;gt;
&amp;lt;url xmlns="http://www.ibm.com/xmlns/prod/rational/clearquest/1.0/"&amp;gt;http://quagmire.rtp.raleigh.ibm.com/cqweb/oslc/repo/DOC/db/SAMPL/query-folder&amp;lt;/url&amp;gt;
&amp;lt;/cq:NamedQuery&amp;gt;
&amp;lt;/cq:namedQuery&amp;gt;
&amp;lt;cq:schema&amp;gt;
&amp;lt;cq:Schema&amp;gt;
&amp;lt;dc:title&amp;gt;URL to request record type definitions in XSD&amp;lt;/dc:title&amp;gt;
&amp;lt;url xmlns="http://www.ibm.com/xmlns/prod/rational/clearquest/1.0/"&amp;gt;http://quagmire.rtp.raleigh.ibm.com/cqweb/oslc/repo/DOC/db/SAMPL/record-type&amp;lt;/url&amp;gt;
&amp;lt;/cq:Schema&amp;gt;
&amp;lt;/cq:schema&amp;gt;
&amp;lt;cq:localReplica&amp;gt;
&amp;lt;cq:Replica&amp;gt;
&amp;lt;dc:title&amp;gt;&amp;lt;local&amp;gt;&amp;lt;/dc:title&amp;gt;
&amp;lt;/cq:Replica&amp;gt;
&amp;lt;/cq:localReplica&amp;gt;
&amp;lt;cq:defaultRecordType&amp;gt;
&amp;lt;cq:RecordType&amp;gt;
&amp;lt;dc:title&amp;gt;URL of the default record type&amp;lt;/dc:title&amp;gt;
&amp;lt;url xmlns="http://www.ibm.com/xmlns/prod/rational/clearquest/1.0/"&amp;gt;http://quagmire.rtp.raleigh.ibm.com/cqweb/oslc/repo/DOC/db/SAMPL/record-type/16777224&amp;lt;/url&amp;gt;
&amp;lt;/cq:RecordType&amp;gt;
&amp;lt;/cq:defaultRecordType&amp;gt;
&amp;lt;/Service&amp;gt;
&amp;lt;/service&amp;gt;
&amp;lt;oslc_cmx:whoami xmlns:oslc_cmx="http://open-services.net/ns/cm-x#" rdf:resource="http://quagmire.rtp.raleigh.ibm.com/cqweb/oslc/repo/DOC/db/SAMPL/whoami"/&amp;gt;
&amp;lt;/ServiceProvider&amp;gt;
&amp;lt;/rdf:RDF&amp;gt;&lt;/span&gt;
&lt;/pre&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;span style="font-size: large;"&gt;&lt;a href="http://www.blogger.com/blogger.g?blogID=7852536510622031749" name="Resource_Shapes"&gt;&lt;/a&gt;리소스 형태&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
CQ는 레코드를 충분히 커스텀할 수 있는 기능을 제공합니다. 새로운 레코드 타입을 정의하고 각 레코드 타입에 들어갈 필드를 선택할 수 있습니다. 그렇다면 특정 CQ 사용자 데이터베이스에 있는 특정 레코드 타입에 정의된 필드는 어떻게 알 수 있을까요?&lt;br /&gt;
&lt;br /&gt;
이를 돕기 위해 OSLC 리소스 형태를 제공합니다. 리소스 형태는 각 필드의 타입 뿐만 아니라 레코드에 정의된 필드들에 대한 정보를 알려줍니다. 또한 어떤 필드가 필수 요소이며 어떤 값이 유효한지 알수 있습니다. OSLC Core 2.0 스펙: 부록 A에 정의된&amp;nbsp;&lt;a href="http://open-services.net/bin/view/Main/OSLCCoreSpecAppendixA?sortcol=table;up=#oslc_ResourceShape_Resource"&gt;oslc:ResourceShape Resource&lt;/a&gt;&amp;nbsp;를 참고하시기 바랍니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;a href="http://www.blogger.com/blogger.g?blogID=7852536510622031749" name="Shapes_for_Record_Types"&gt;&lt;/a&gt;레코드 타입 형태&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
레코드 타입에 대한 형태는 여러 곳에서 파악할 수 있습니다. 예를 들면,&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;레코드의 oslc:instanceShape 프로퍼키&lt;/li&gt;
&lt;li&gt;서비스 기술 문서에 있는 레코드 생성 팩토리의 oslc:resourceShape 프로퍼티&lt;/li&gt;
&lt;li&gt;쿼리 형태의 oslc:valueShape 프로퍼터&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;b&gt;&lt;a href="http://www.blogger.com/blogger.g?blogID=7852536510622031749" name="Shapes_for_Query_Results"&gt;&lt;/a&gt;쿼리 결과 형태&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
CQ는 또 쿼리 결과 형태에 대한 정보를 제공합니다.&lt;/div&gt;
&lt;div&gt;
아래는 CQ 쿼리 결과 형태에 대한 JSON 표현의 예입니다.&lt;/div&gt;
&lt;br /&gt;
요청:&lt;br /&gt;
&lt;div&gt;
&lt;div style="background-color: white; color: #333333; font-family: arial, 'Lucida Grande', verdana, sans-serif; font-size: 14px; line-height: 1.5; margin-top: 1em; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left;"&gt;
&lt;/div&gt;
&lt;pre style="background-color: white; border-bottom-color: rgb(204, 204, 204); border-bottom-style: solid; border-bottom-width: 1px; border-image: initial; border-left-color: rgb(204, 204, 204); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(204, 204, 204); border-right-style: solid; border-right-width: 1px; border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; margin-bottom: 1em; margin-top: 1em; max-height: 400px; overflow-x: auto !important; overflow-y: auto !important; padding-bottom: 15px; padding-left: 15px; padding-right: 10px; padding-top: 10px; text-align: left; width: auto;"&gt;&lt;span style="color: #7a4707; font-size: inherit; line-height: 19px;"&gt;GET /cqweb/oslc/repo/DOC/db/SAMPL/queryShape/16777224
Host: quagmire.rtp.raleigh.ibm.com
OSLC-Core-Version: 2.0
Accept: application/json&lt;/span&gt;
&lt;/pre&gt;
응답:&lt;br /&gt;
&lt;div style="background-color: white; color: #333333; font-family: arial, 'Lucida Grande', verdana, sans-serif; font-size: 14px; line-height: 1.5; margin-top: 1em; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left;"&gt;
&lt;/div&gt;
&lt;pre style="background-color: white; border-bottom-color: rgb(204, 204, 204); border-bottom-style: solid; border-bottom-width: 1px; border-image: initial; border-left-color: rgb(204, 204, 204); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(204, 204, 204); border-right-style: solid; border-right-width: 1px; border-top-color: rgb(204, 204, 204); border-top-style: solid; border-top-width: 1px; margin-bottom: 1em; margin-top: 1em; overflow-x: auto !important; overflow-y: auto !important; padding-bottom: 15px; padding-left: 15px; padding-right: 10px; padding-top: 10px; text-align: left; width: auto;"&gt;&lt;span style="color: #7a4707; font-size: inherit; line-height: 19px;"&gt;HTTP/1.1 200 OK
OSLC-Core-Version: 2.0
Transfer-Encoding: chunked
Content-Type: application/json; charset=UTF-8

{
   "prefixes":{
      "oslc":"http:\/\/open-services.net\/ns\/core#",
      "rdf":"http:\/\/www.w3.org\/1999\/02\/22-rdf-syntax-ns#",
      "dcterms":"http:\/\/purl.org\/dc\/terms\/"
   },
   "rdf:type":[
      {
         "rdf:resource":"http:\/\/open-services.net\/ns\/core#ResourceShape"
      }
   ],
   "rdf:about":"http:\/\/quagmire.rtp.raleigh.ibm.com\/cqweb\/oslc\/repo\/DOC\/db\/SAMPL\/queryShape\/16777224",
   "dcterms:title":"ClearQuest CM V2 Query Result",
   "oslc:describes":"http:\/\/www.w3.org\/1999\/02\/22-rdf-syntax-ns#Description",
   "oslc:property":[
      {
         "rdf:type":[
            {
               "rdf:resource":"http:\/\/open-services.net\/ns\/core#Property"
            }
         ],
         "oslc:name":"member",
         "oslc:propertyDefinition":{
            "rdf:resource":"http:\/\/www.w3.org\/2000\/01\/rdf-schema#member"
         },
         "oslc:valueType":"http:\/\/open-services.net\/ns\/core#AnyResource",
         "oslc:occurs":{
            "rdf:resource":"http:\/\/open-services.net\/ns\/core#Zero-or-many"
         },
         "oslc:range":{
            "rdf:resource":"http:\/\/open-services.net\/ns\/cm#ChangeRequest"
         },
         "oslc:valueShape":{
            "rdf:resource":"http:\/\/quagmire.rtp.raleigh.ibm.com\/cqweb\/oslc\/repo\/DOC\/db\/SAMPL\/shape\/16777224"
         },
         "oslc:representation":{
            "rdf:resource":"http:\/\/open-services.net\/ns\/core#Inline"
         },
         "oslc:readOnly":"true",
         "oslc:isMemberProperty":"true"
      }
   ]
}&lt;/span&gt;
&lt;/pre&gt;
&lt;div style="background-color: white; margin-top: 1em; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left;"&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;b&gt;&lt;span style="font-size: large;"&gt;&lt;a href="http://www.blogger.com/blogger.g?blogID=7852536510622031749" name="Support_for_OSLC_CM_2_0_ChangeRe"&gt;&lt;/a&gt;OSLC-CM 2.0 ChangeRequest 리소스에 대한 지원&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
OSLC 2.0 Change Management 스펙은 &lt;a href="http://open-services.net/bin/view/Main/CmSpecificationV2?sortcol=table;up=#Resource_ChangeRequest"&gt;ChangeRequest&lt;/a&gt;&amp;nbsp;리소스에 대해 정의하고 있습니다. 이 리소스는 OSLC 제공자가 공통으로 갖는 프로퍼티들을 갖고 있습니다. CQ 또한 이러한 프로퍼티 대부분을 지원합니다.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;a href="http://www.blogger.com/blogger.g?blogID=7852536510622031749" name="Standard_Properties_on_All_Recor"&gt;&lt;/a&gt;모든 레코드에 공통인 표준 프로퍼티들&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
아래 표준 ChangeRequest 프로퍼티들은 모든 유형의 레코드에서 제공합니다.&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;dcterms:title&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;rdf:type&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;dcterms:type&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;dcterms:identifier&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;oslc_cm:shortTitle&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;oslc:instanceShape&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
추가로 상태를 갖는 레코드에는 다음 프로퍼티를 제공합니다.&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;oslc_cm:status&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;b&gt;OSLCLinks 패키지에서 제공하는 표준 프로퍼티들&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;
레코드 타입에 OSLCLinks 패키지를 적용한 경우 추가적으로 제공하는 OSLC ChangeRequest 프로퍼티들이 있습니다.&lt;br /&gt;&lt;br /&gt;
&lt;b&gt;OSLCLinks 1.0&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;
OSLCLinks 1.0 패키지는 여느 레코드와의 링크를 허용합니다.&amp;nbsp;OSLC-CM 2.0에서 정의한&amp;nbsp;모든 링크 타입이 지원됩니다.&lt;/div&gt;
&lt;br /&gt;&lt;div&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;oslc_cm:relatedChangeRequest&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;oslc_cm:affectsPlanItem&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;oslc_cm:affectedByDefect&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;oslc_cm:tracksRequirement&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;oslc_cm:implementsRequirement&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;oslc_cm:affectsRequirement&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;oslc_cm:testedByTestCase&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;oslc_cm:affectsTestResult&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;oslc_cm:blocksTestExecutionRecord&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;oslc_cm:relatedTestExecutionRecord&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;oslc_cm:relatedTestCase&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;oslc_cm:relatedTestPlan&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;oslc_cm:relatedTestScript&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;oslc_cm:tracksChangeSet&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;b&gt;OSLCLinks 1.1&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
OSLCLinks 1.1 패키지는 상태 값 프로퍼티를 제공합니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;oslc_cm:closed&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;oslc_cm:inprogress&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;oslc_cm:fixed&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;oslc_cm:approved&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;oslc_cm:reviewed&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;oslc_cm:verified&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
스키마에서 정의된 워크플로우에 맞게 상태 값을 설정하기 위해서는 훅(Hook)이 필요합니다. OSLCLinks 패키지 관련 문서를 참고하세요.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;a href="http://www.blogger.com/blogger.g?blogID=7852536510622031749" name="Other_Standard_Properties"&gt;&lt;/a&gt;그 밖의 표준 프로퍼티들&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
ALM 스키마를 사용한 경우 OOTB로&amp;nbsp;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;oslc:description, dcterms:creator, dcterms:contributor&lt;/span&gt;&amp;nbsp;등의&amp;nbsp;OSLC ChangeRequest 프로퍼티들을 제공합니다. 레코드에서 사용할 수 있는 OSLC 프로퍼티들을 파악하기 위해서는 레코드에 대한 &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;oslc:instanceShape&lt;/span&gt;를 요청해서 알아볼 수 있습니다.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;span style="font-size: large;"&gt;&lt;a href="http://www.blogger.com/blogger.g?blogID=7852536510622031749" name="Working_with_Records"&gt;&lt;/a&gt;레코드에 대한 작업 예제&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
생략&lt;/div&gt;
&lt;div&gt;
-&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7852536510622031749-9148016642709820196?l=poongcha.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/icXPN/~4/j_HTgNgOG8w" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://poongcha.blogspot.com/feeds/9148016642709820196/comments/default" title="댓글" /><link rel="replies" type="text/html" href="http://poongcha.blogspot.com/2011/12/cq-oslc-20-rest-api.html#comment-form" title="0개의 덧글" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7852536510622031749/posts/default/9148016642709820196?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7852536510622031749/posts/default/9148016642709820196?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/icXPN/~3/j_HTgNgOG8w/cq-oslc-20-rest-api.html" title="CQ OSLC CM 2.0 REST API" /><author><name>풍차</name><uri>http://www.blogger.com/profile/10628167383220311152</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="23" height="32" src="http://2.bp.blogspot.com/_icOPzB_w_RA/SinjXnz8NRI/AAAAAAAAABA/13rtJajEtZI/S220/%EC%9A%B0%EB%B6%84%ED%88%AC.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-m-gwMno7fkE/TwJ6cQq-gTI/AAAAAAAAANw/q0OggE-3yic/s72-c/example-oauth-consumer.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://poongcha.blogspot.com/2011/12/cq-oslc-20-rest-api.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkAFR389fSp7ImA9WhRWEkQ.&quot;"><id>tag:blogger.com,1999:blog-7852536510622031749.post-8306808867719083373</id><published>2011-12-30T18:39:00.000+09:00</published><updated>2011-12-31T10:25:16.165+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-12-31T10:25:16.165+09:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="rtc" /><category scheme="http://www.blogger.com/atom/ns#" term="oslc" /><category scheme="http://www.blogger.com/atom/ns#" term="oslc-cm" /><title>RTC OSLC CM 2.0 REST API</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/OTUlI5rW8wOhO7hkUuatmpTAq2w/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/OTUlI5rW8wOhO7hkUuatmpTAq2w/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/OTUlI5rW8wOhO7hkUuatmpTAq2w/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/OTUlI5rW8wOhO7hkUuatmpTAq2w/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;출처 :&amp;nbsp;https://jazz.net/wiki/bin/view/Main/WorkItemAPIsForOSLCCM20&lt;br /&gt;
&lt;br /&gt;
This document is the next version of &lt;a class="twikiLink" href="https://jazz.net/wiki/bin/view/Main/ResourceOrientedWorkItemAPIv2"&gt;ResourceOrientedWorkItemAPIv2&lt;/a&gt;
 and describes services offered by RTC 3.0.1 Work Items Service provider
 implementing OSLC CM 2.0 specifications. This version of service 
provider is much enhanced from earlier version that has more kinds of 
resource formats, operations etc. Most of the services and operations 
existed in previous version are still supported but change is only in 
semantics which are programmatic friendly. This document explains how 
Work item service provider can be consumed by referring to OSLC CM 2.0 
specifications with good examples. The example snippets assume that you 
are authenticated to a server configured for form-based auth. These 
examples can be tried on a browser or by using &lt;code&gt;POSTER&lt;/code&gt; plug in on Fire Fox.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;






Introduction &lt;/h2&gt;
OSLC CM 2.0 Specification document defines a RESTful web services 
interface for Change Management systems, like RTC, the management of 
product change requests, activities, tasks and relation ships between 
those and related resources such as project, category, release, and 
plan. To support these scenarios, it defines a set of HTTP-based RESTful
 interfaces in terms of HTTP methods: GET, POST, PUT, and DELETE, HTTP 
response codes, content type handling and resource formats. RTC Work 
Items Service provider implements these OSLC CM specifications as a 
server which can be consumed by clients.
Some of the specifications defined by OSLC and implemented by Work Items
 Service Provider are listed below:
 &lt;br /&gt;
&lt;ol&gt;
&lt;li&gt; Resource Definitions - Defining resources like Service Provider, 
Work Item and other related resources like Users, Comments etc.,
&lt;/li&gt;
&lt;li&gt; Resource Formats and Representations - Each defined resource is represented in all the formats specified by OSLC. &lt;ul&gt;
&lt;li&gt; Format type - &lt;code&gt;application/rdf+xml&lt;/code&gt; - Resource should be in RDF/XML representation.
&lt;/li&gt;
&lt;li&gt; Format type - &lt;code&gt;application/json&lt;/code&gt; -  Resource should be in JSON representation.
&lt;/li&gt;
&lt;li&gt; Format type - &lt;code&gt;application/xml&lt;/code&gt; -  Resource should be in OSLC-defined abbreviated XML representation.
&lt;/li&gt;
&lt;li&gt; Format type - &lt;code&gt;application/atom+xml&lt;/code&gt; -  Resource should be in Atom Syndication Format XML representation.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;ol&gt;
&lt;li&gt; Resource Operations - Updating or Deleting properties of resources (Work Item and other related resources) using HTTP methods
&lt;/li&gt;
&lt;li&gt; Creation Factories - To create a resource (Work Item and other related resources) by posting its representation.
&lt;/li&gt;
&lt;li&gt; Query Capabilities - To fetch resources (Work Item and other 
related resources) using queryable conditions, search terms, selecting 
properties and sorting orders.
&lt;/li&gt;
&lt;li&gt; Resource Paging - To fetch collection of resources (Work Item and other related resources) in pages with user defined sizes.
&lt;/li&gt;
&lt;li&gt; Delegated UI Dialogs - To create and select resources (Work Item and other related resources).
&lt;/li&gt;
&lt;/ol&gt;
Following sections will explain in detail about each of the services defined above.&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;






Discovery Mechanism &lt;/h2&gt;
Clients that work with RTC or another implementation of the OSLC spec 
need a way to discover which functionality is offered by the 
implementation and where it is surfaced. Clients should not rely on 
specific URLs or perform path math on URLs. Instead, they should use the
 discovery chain offered by RTC. Here's an outline of the process to 
find the Change Management functionality:&lt;br /&gt;
&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt; The root document is exposed at &lt;code&gt;https://&lt;server&gt;:&lt;port&gt;/&lt;app&gt;/rootservices&lt;/app&gt;&lt;/port&gt;&lt;/server&gt;&lt;/code&gt;. In a typical RTC testbed, this is &lt;code&gt;https://localhost:9443/jazz/rootservices&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt; Fetch this document and extract the Change Management Catalog URL (pointed to by &lt;code&gt;rdf:about&lt;/code&gt;) of the element &lt;code&gt;oslc:ServiceProviderCatalog&lt;/code&gt; in&lt;/li&gt;
&lt;li&gt;Fetch the document behind this URL. It contains a list of 
ServiceProvider elements that point to the documents which contain the 
actual service descriptions. In the case of RTC, there is one 
ServiceProvider element for each Project Area. Typically, an application
 would use the title of this element to allow the user to choose between
 the project areas.&lt;/li&gt;
&lt;li value="4"&gt;&amp;nbsp;Fetch the services document pointed to by property &lt;code&gt;rdf:about&lt;/code&gt; of element &lt;code&gt;oslc:ServiceProvider&lt;/code&gt;.
 This document contains references to services and operations like 
Creation Factories to create new work items, Query capabilities that 
allows to query work items, Delegated UI dialogs to create and select 
work items, and CLM Filters that are pre-defined queries on work items.&lt;/li&gt;
&lt;/ol&gt;
Sample of a work item service provider document is illustrated in &lt;a class="twikiCurrentTopicLink twikiAnchorLink" href="https://jazz.net/wiki/bin/view/Main/WorkItemAPIsForOSLCCM20#AppendixA"&gt;Service Provider Document&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;






Resource Definition &lt;/h2&gt;
A Work Item resource is defined by the OSLC Change Request properties and RTC Work Item properties. &lt;a href="http://open-services.net/bin/view/Main/CmSpecificationV2?sortcol=table;table=up#CM_Resource_Definitions" target="_top"&gt;CM Resource Definitions&lt;/a&gt; table has OSLC defined properties for Change Request resource.&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;






OSLC Defined  Work Item Properties&lt;/h3&gt;
&lt;h3&gt;






RTC Defined Work Item properties&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&amp;nbsp;Custom attributes are exposed as: &lt;code&gt;rtc_cm:[attributeId]&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt; Contributed Link Types are exposed as: &lt;code&gt;rtc_cm:[linkTypeId].[endPointId]&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;h2&gt;






Resource Formats &lt;/h2&gt;
Work Items provides representation of work item resource in all defined OSLC CM &lt;strong&gt;MUST&lt;/strong&gt; resource types like RDF/XML, XML, and JSON representations. When requested for a work item in: &lt;br /&gt;
&lt;ul&gt;
&lt;li&gt; &lt;code&gt;application/rdf+xml&lt;/code&gt; Work Item resource in RDF/XML representation is responded.
&lt;/li&gt;
&lt;li&gt; &lt;code&gt;application/json&lt;/code&gt; Work Item resource in JSON representation is responded.
&lt;/li&gt;
&lt;li&gt; &lt;code&gt;application/xml&lt;/code&gt; Work Item resource in OSLC-defined abbreviated XML representation is responded.
&lt;/li&gt;
&lt;li&gt; &lt;code&gt;application/atom+xml&lt;/code&gt; Work Item resource in Atom Syndication Format XML representation is responded.
&lt;/li&gt;
&lt;/ul&gt;
The usage of the OSLC CM 1.0 defined media types of &lt;code&gt;application/x-oslc-cm-change-request+xml&lt;/code&gt;, &lt;code&gt;application/x-oslc-cm-changerequest+xml&lt;/code&gt;, &lt;code&gt;application/x-oslc-cm-change-request+json&lt;/code&gt;, &lt;code&gt;application/x-oslc-cm-changerequest+json&lt;/code&gt; for work item resource is being deprecated for use in OSLC CM 2.0 based services.&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;






Getting Representations &lt;/h3&gt;
Work items are exposed under their Location URI. These URIs are 
typically obtained by a query or by using a reference from another work 
item. Two examples of Location URIs:

&lt;br /&gt;
&lt;pre&gt;https://localhost:9443/jazz/resource/itemName/com.ibm.team.workitem.WorkItem/262
https://localhost:9443/jazz/resource/itemOid/com.ibm.team.workitem.WorkItem/_Kk8YQFElEd6wrL4Qi7w25Q
&lt;/pre&gt;
There is an alternative URL format, called service alias format, which 
is mostly used for non-work item artifacts like enumeration literals, 
users etc. In contrast to the Location URI format, this format allows to
 address sub-resources like a link collection or the work item's 
comments. Using this format, the media type can be specified using an 
extension like &lt;code&gt;.rdf&lt;/code&gt; or &lt;code&gt;.xml&lt;/code&gt; or &lt;code&gt;.json&lt;/code&gt;
 for easier testing in a browser during development time. Note that this
 way of specifying the media type is RTC proprietary and will work only 
on RTC Server. Some examples:
&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;https://localhost:9443/jazz/oslc/workitems/821.rdf
https://localhost:9443/jazz/oslc/workitems/821.xml
https://localhost:9443/jazz/oslc/workitems/821.json
https://localhost:9443/jazz/oslc/workitems/_Kk8YQFElEd6wrL4Qi7w25Q.json
https://localhost:9443/jazz/oslc/workitems/821/rtc_cm:comments.atom
&lt;/pre&gt;
Multiple representations of a work item are available by specifying an &lt;code&gt;Accept&lt;/code&gt; HTTP header or by specifying the required content type as an URL parameter &lt;code&gt;_mediaType&lt;/code&gt;.
 These work for all URL exposed in a resource representation. Specifying
 an extension works only for the non-Location URI format. The first 
option is suitable for programmatic use, the second and third options 
are necessary when you have no control over the Accept header, e.g. in a
 browser or iFrame.
&lt;br /&gt;
&lt;br /&gt;
&lt;table border="0" cellpadding="1" cellspacing="1" class="twikiTable" style="border-width: 0px;"&gt;&lt;tbody&gt;
&lt;tr class="twikiTableEven"&gt;&lt;th bgcolor="#dadada" class="twikiFirstCol" maxcols="0"&gt;&lt;a href="https://jazz.net/wiki/bin/view/Main/WorkItemAPIsForOSLCCM20?sortcol=0;table=3;up=0#sorted_table" rel="nofollow" style="color: black;" title="Sort by this column"&gt;Content Type&lt;/a&gt; &lt;/th&gt;&lt;th bgcolor="#dadada" maxcols="0"&gt;&lt;a href="https://jazz.net/wiki/bin/view/Main/WorkItemAPIsForOSLCCM20?sortcol=1;table=3;up=0#sorted_table" rel="nofollow" style="color: black;" title="Sort by this column"&gt;Extension&lt;/a&gt; &lt;/th&gt;&lt;th bgcolor="#dadada" maxcols="0"&gt;&lt;a href="https://jazz.net/wiki/bin/view/Main/WorkItemAPIsForOSLCCM20?sortcol=2;table=3;up=0#sorted_table" rel="nofollow" style="color: black;" title="Sort by this column"&gt;Format&lt;/a&gt; &lt;/th&gt;&lt;/tr&gt;
&lt;tr class="twikiTableOdd"&gt;&lt;td bgcolor="#eaeaea" class="twikiFirstCol"&gt;&lt;code&gt;application/rdf+xml&lt;/code&gt; &lt;/td&gt;&lt;td bgcolor="#eaeaea"&gt;.rdf &lt;/td&gt;&lt;td bgcolor="#eaeaea"&gt;RDF Format as defined in&lt;a href="http://open-services.net/bin/view/Main/OSLCCoreSpecAppendixRepresentations?sortcol=table;up=#Guidelines_for_application_rdf_x" target="_top"&gt;OSLC Guidelines for RDF+XML representation&lt;/a&gt;. &lt;/td&gt;&lt;/tr&gt;
&lt;tr class="twikiTableEven"&gt;&lt;td bgcolor="#ffffff" class="twikiFirstCol"&gt;&lt;code&gt;application/json&lt;/code&gt; and &lt;code&gt;text/json&lt;/code&gt; &lt;/td&gt;&lt;td bgcolor="#ffffff"&gt;.json &lt;/td&gt;&lt;td bgcolor="#ffffff"&gt;JSON Format as defined in &lt;a href="http://open-services.net/bin/view/Main/OSLCCoreSpecAppendixRepresentations?sortcol=table;table=up#Guidelines_for_JSON" target="_top"&gt;OSLC Guidelines for JSON representation&lt;/a&gt;. The JSON formats can be requested with the additional URL parameter &lt;code&gt;?_pretty=true&lt;/code&gt; which will format the JSON source for better legibility. Otherwise, unnecessary whitespace is omitted. &lt;/td&gt;&lt;/tr&gt;
&lt;tr class="twikiTableOdd"&gt;&lt;td bgcolor="#eaeaea" class="twikiFirstCol"&gt;&lt;code&gt;application/xml&lt;/code&gt; and &lt;code&gt;text/xml&lt;/code&gt; &lt;/td&gt;&lt;td bgcolor="#eaeaea"&gt;.xml &lt;/td&gt;&lt;td bgcolor="#eaeaea"&gt;XML Format as defined in &lt;a href="http://open-services.net/bin/view/Main/OSLCCoreSpecAppendixRepresentations?sortcol=table;table=up#Guidelines_for_application_xml" target="_top"&gt;OSLC Guidelines for XML representation&lt;/a&gt; &lt;/td&gt;&lt;/tr&gt;
&lt;tr class="twikiTableEven"&gt;&lt;td bgcolor="#ffffff" class="twikiFirstCol"&gt;&lt;code&gt;application/x-turtle&lt;/code&gt; and &lt;code&gt;text/turtle&lt;/code&gt; &lt;/td&gt;&lt;td bgcolor="#ffffff"&gt;n/a &lt;/td&gt;&lt;td bgcolor="#ffffff"&gt;Turtle Format as defined in &lt;a href="http://open-services.net/bin/view/Main/OSLCCoreSpecAppendixRepresentations?sortcol=table;table=up;up=#Turtle_Representations" target="_top"&gt;OSLC Guidelines for Turtle representation&lt;/a&gt; &lt;/td&gt;&lt;/tr&gt;
&lt;tr class="twikiTableOdd"&gt;&lt;td bgcolor="#eaeaea" class="twikiFirstCol"&gt;&lt;code&gt;application/x-jazz-compact-rendering&lt;/code&gt; &lt;/td&gt;&lt;td bgcolor="#eaeaea"&gt;n/a &lt;/td&gt;&lt;td bgcolor="#eaeaea"&gt;The &lt;a class="twikiLink" href="https://jazz.net/wiki/bin/view/Main/LinkRendering"&gt;Compact Rendering&lt;/a&gt; discovery format used to get a link title/icon and the URLs pointing to the hover presentations &lt;/td&gt;&lt;/tr&gt;
&lt;tr class="twikiTableEven"&gt;&lt;td bgcolor="#ffffff" class="twikiFirstCol"&gt;&lt;code&gt;text/html&lt;/code&gt; &lt;/td&gt;&lt;td bgcolor="#ffffff"&gt;.hover.html &lt;/td&gt;&lt;td bgcolor="#ffffff"&gt;The HTML hover representations. Additional URL parameters are currently needed: &lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;_selector=hover&lt;/code&gt; for the full representation&lt;/li&gt;
&lt;li&gt;&lt;code&gt;_selector=smallHover&lt;/code&gt; for the smaller representation&lt;/li&gt;
&lt;li&gt;&lt;code&gt;_context=web&lt;/code&gt; for slightly different link handling geared towards the Web UI (e.g. mailto links for users)&lt;/li&gt;
&lt;/ul&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr class="twikiTableOdd"&gt;&lt;td bgcolor="#eaeaea" class="twikiFirstCol"&gt;&lt;code&gt;application/atom+xml&lt;/code&gt; &lt;/td&gt;&lt;td bgcolor="#eaeaea"&gt;.atom &lt;/td&gt;&lt;td bgcolor="#eaeaea"&gt;ATOM Feed format. Useful only for collections of work items, but supported for single work items, too. &lt;a href="http://open-services.net/bin/view/Main/OSLCCoreSpecAppendixRepresentations?sortcol=table;table=up;up=#Atom_Representations" target="_top"&gt;OSLC Guidelines for ATOM representation&lt;/a&gt;. &lt;/td&gt;&lt;/tr&gt;
&lt;tr class="twikiTableEven"&gt;&lt;td bgcolor="#ffffff" class="twikiFirstCol twikiLast"&gt;&lt;code&gt;application/xhtml+xml&lt;/code&gt; &lt;/td&gt;&lt;td bgcolor="#ffffff" class="twikiLast"&gt;.xhtml &lt;/td&gt;&lt;td bgcolor="#ffffff" class="twikiLast"&gt;XHTML intended for exploration/debugging -- do not rely on this format &lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;h3&gt;






Requesting a Subset of Properties (Partial Representations) &lt;/h3&gt;
As supported in previous version, this version of work items service 
provider also allows a work item resource to be represented partially 
with only needed properties in the response format. As per OSLC CM 2.0 
specifications, OSLC core URL parameters &lt;code&gt;oslc_properties=prefixA:propA, prefixB:propB&lt;/code&gt; and &lt;code&gt;oslc_prefixes=prefixA=nsUriA, prefixB=nsUriB&lt;/code&gt;
 should be used to get the partial representation of the resource with 
requested properties. For syntax help on above parameters refer to &lt;a href="http://open-services.net/bin/view/Main/OslcCoreSpecification?sortcol=table;table=up#Selective_Property_Values" target="_top"&gt;Selective Property Values&lt;/a&gt;.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;h2&gt;






Resource Operations &lt;/h2&gt;
Work Item Service provider as an OSLC service, implements operations 
like creating, updating properties of, and deleting a work item resource
 using HTTP POST, PUT, DELETE methods. This section explains how to 
update properties of a work item. Work Item properties can be 
categorized as follows: &lt;br /&gt;
&lt;ul&gt;
&lt;li&gt; Simple property which has native values like literal, string, boolean, timestamp, integers as values. 
&lt;/li&gt;
&lt;li&gt; Reference property, a property which is a reference to another resource and can occur only once. Attributes like &lt;code&gt;dcterms:contributor(owner), oslc:Discussion(comments)&lt;/code&gt;, etc are reference properties.
&lt;/li&gt;
&lt;li&gt; Collection property, a property which is a reference property and can occur more than once. All links such as &lt;code&gt;oslc_cm:implementsRequirement, parent, children&lt;/code&gt; fall into this category.
&lt;/li&gt;
&lt;li&gt; Inline property is a contained composite/collection property,
 whose properties will be always part of the representation of the 
resource containing it. &lt;code&gt;oslc:comment&lt;/code&gt; is an inline property of &lt;code&gt;oslc:Discussion&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;






&lt;a href="http://www.blogger.com/blogger.g?blogID=7852536510622031749" name="Updating_Work_Items"&gt;&lt;/a&gt; Updating Work Items &lt;/h3&gt;
To update a Work Item resource using OSLC CM 2.0 specifications, a 
client should first fetch the representation of that resource as 
mentioned in previous section &lt;a class="twikiCurrentTopicLink twikiAnchorLink" href="https://jazz.net/wiki/bin/view/Main/WorkItemAPIsForOSLCCM20#GetRepresentations"&gt;Getting Representations&lt;/a&gt;. Update the representation and use HTTP PUT to send the new representation to the resource's URI

Steps to update a work items are as follows:
&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt; Fetch the representation of that resource as mentioned in the section &lt;a class="twikiCurrentTopicLink twikiAnchorLink" href="https://jazz.net/wiki/bin/view/Main/WorkItemAPIsForOSLCCM20#GetRepresentations"&gt;Getting Representations&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt; Update the representation by adding, removing or changing values
&lt;/li&gt;
&lt;li&gt; Send the modified representation to the resource's URI using HTTP PUT
&lt;/li&gt;
&lt;/ul&gt;
Two cases deserve special attention:
&lt;br /&gt;
&lt;strong&gt;Avoid overwriting changes done by someone else&lt;/strong&gt;: Because
 the update process involve first getting a work item, modifying it and 
then later putting back to the server there is a possibility of 
conflict. e.g. some other client may have updated the work item since 
the GET. In general, clients should not blindly overwrite the work item 
contents, but make sure that the changes are applied to the state that 
they fetched from the server. To mitigate this problem, clients should 
use the HTTP &lt;code&gt;if-match&lt;/code&gt; header. This is done by including the ETag received on load in the &lt;code&gt;If-Match&lt;/code&gt; header when PUTting the work item back to the server.
&lt;br /&gt;
ETag information can be fetched from HTTP response headers that is 
written when a work item representation is requested using HTTP GET 
request.
&lt;br /&gt;
&lt;pre&gt;HTTP/1.1 200 OK
&lt;strong&gt;ETag:  "_DrhL0KDHEeCbuLDfakk_jw"&lt;/strong&gt;
Last Modified:  Mon, 27 Jun 2011 14:09:22 GMT
Cache-Control: max-age=0, must-revalidate
Expires:  Wed, 06 Jul 2011 07:52:15 GMT
Vary: Accept, Accept-Language
Content-Type:  application/rdf+xml;charset=UTF-8
Transfer-Encoding: chunked
Server:  Jetty(6.1.x)
&lt;/pre&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt; If the HTTP &lt;code&gt;if-match&lt;/code&gt; header is missing, Work Item 
service provider will return HTTP Bad Request (400) status code to 
indicate the header is required.
&lt;/li&gt;
&lt;li&gt; If the HTTP &lt;code&gt;if-match&lt;/code&gt; header is present and it 
does not matches to the existing state (case where the work item was 
modified in the meantime), Work Item service provider behave as 
described in HTTP specification, returning an HTTP &lt;code&gt;412 Precondition Failed&lt;/code&gt; status.
&lt;/li&gt;
&lt;li&gt; If the HTTP &lt;code&gt;if-match&lt;/code&gt; header is present and matches, the update will be executed and on success HTTP &lt;code&gt;200 OK&lt;/code&gt; status is returned
&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;strong&gt;Updating a Subset of Properties (Partial Updates)&lt;/strong&gt;: PUT 
generally has the semantics of updating the entire resource (and 
removing what is not included). In order to allow partial updates via 
the more generally supported PUT, and in order to selectively remove 
entire attributes from a work item, you can specify the set of 
properties to update via the &lt;code&gt;oslc.properties&lt;/code&gt; parameter. If the parameter &lt;code&gt;oslc.properties&lt;/code&gt;.
 contains a valid work item property on the request that is not provided
 in the representation content, such property will be removed. If the 
parameter contains a invalid work item property, then HTTP &lt;code&gt;409 Conflict&lt;/code&gt; is returned.
OSLC Core has defined guidelines &lt;a href="http://open-services.net/bin/view/Main/OSLCCorePartialUpdateDRAFT" target="_top"&gt;OSLC Core Guidance: Partial Update&lt;/a&gt;
 on how to do partial update a resource using HTTP PATCH request which 
is yet to be implemented by Work Items. Work and plan related to this is
 captured in the work item 
&lt;a href="https://jazz.net/jazz/resource/itemName/com.ibm.team.workitem.WorkItem/141545" target="_top"&gt;141545: Implement OSLC-CM v2 partial update using PATCH&lt;/a&gt;.
&lt;br /&gt;
&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;&lt;br /&gt;
&lt;strong&gt;NOTE:&lt;/strong&gt; Clients must preserve any unknown-property-values
 and any other content in the work item representation when doing the 
update with out using &lt;code&gt;oslc.properties&lt;/code&gt; parameter. Because, 
these updates will completely modify/replace the existing representation
 of the work item with the received representation.
&lt;br /&gt;
Let us see how we can update (modify/delete/replace) each of these properties with examples.&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7852536510622031749-8306808867719083373?l=poongcha.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/icXPN/~4/KgWTa_F9Nxg" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://poongcha.blogspot.com/feeds/8306808867719083373/comments/default" title="댓글" /><link rel="replies" type="text/html" href="http://poongcha.blogspot.com/2011/12/oscl-cm-20.html#comment-form" title="0개의 덧글" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7852536510622031749/posts/default/8306808867719083373?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7852536510622031749/posts/default/8306808867719083373?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/icXPN/~3/KgWTa_F9Nxg/oscl-cm-20.html" title="RTC OSLC CM 2.0 REST API" /><author><name>풍차</name><uri>http://www.blogger.com/profile/10628167383220311152</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="23" height="32" src="http://2.bp.blogspot.com/_icOPzB_w_RA/SinjXnz8NRI/AAAAAAAAABA/13rtJajEtZI/S220/%EC%9A%B0%EB%B6%84%ED%88%AC.png" /></author><thr:total>0</thr:total><feedburner:origLink>http://poongcha.blogspot.com/2011/12/oscl-cm-20.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkAMR3c-fSp7ImA9WhRWEkQ.&quot;"><id>tag:blogger.com,1999:blog-7852536510622031749.post-2862963791402343937</id><published>2011-12-30T17:54:00.001+09:00</published><updated>2011-12-31T10:26:26.955+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-12-31T10:26:26.955+09:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="plainJavaLib" /><title>Java HTTP 라이브러리 (OSLC REST 프로그램시)</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/BUXX8PmtyS4yTrOVm0NvM8IZjO8/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/BUXX8PmtyS4yTrOVm0NvM8IZjO8/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/BUXX8PmtyS4yTrOVm0NvM8IZjO8/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/BUXX8PmtyS4yTrOVm0NvM8IZjO8/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;Java&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span class="postbody"&gt;HttpURLConnection&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
Apache HTTP Client&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;v3 :&amp;nbsp;&lt;span class="postbody"&gt;&lt;a href="http://hc.apache.org/httpclient-3.x/" target="_blank"&gt;http://hc.apache.org/httpclient-3.x/&lt;/a&gt;&amp;nbsp;(End of life)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;v4 :&amp;nbsp;&lt;span class="postbody"&gt;&lt;a href="http://hc.apache.org/httpcomponents-client/" target="_blank"&gt;http://hc.apache.org/httpcomponents-client/&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
참고 JFS SDK (&lt;a href="https://jazz.net/wiki/bin/view/Main/ServerSDKOverview"&gt;https://jazz.net/wiki/bin/view/Main/ServerSDKOverview&lt;/a&gt;)&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;REST Framework: The JFS SDK provides a REST framework that can be used by applications to structure their code as a set of REST handlers (also called services). This framework is based on Apache's HTTP Component library. A key characteristic of this framework is that the REST handlers work with the &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;HttpRequest&lt;/span&gt; and &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;HttpResponse&lt;/span&gt; classes provided by the Apache's HTTP Component library, instead of the &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;HttpServletRequest&lt;/span&gt; and &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;HttpServletResponse&lt;/span&gt; classes provided by J2EE. This approach allows us to create a framework that is isolated from application servers-specific behavior (See the &lt;a href="https://jazz.net/wiki/bin/view/Main/ServerSDKQnA"&gt;ServerSDKQnA&lt;/a&gt; for more details).&lt;/li&gt;
&lt;/ul&gt;
-&lt;br /&gt;
참고 bulk operations&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;HTTP pipelining(&lt;a href="http://en.wikipedia.org/wiki/HTTP_pipelining" target="_top"&gt;http://en.wikipedia.org/wiki/HTTP_pipelining&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt; IETF HTTP Batch proposals using MIME multi-part(&lt;a href="http://tools.ietf.org/html/draft-snell-http-batch-01" target="_top"&gt;http://tools.ietf.org/html/draft-snell-http-batch-01&lt;/a&gt; and &lt;a href="http://martin.atkins.me.uk/specs/batchhttp" target="_top"&gt;http://martin.atkins.me.uk/specs/batchhttp&lt;/a&gt;)
&lt;/li&gt;
&lt;li&gt; Microsoft ADO.Net batch requests(&lt;a href="http://msdn.microsoft.com/en-us/library/cc668802%28VS.100%29.aspx" target="_top"&gt;http://msdn.microsoft.com/en-us/library/cc668802(VS.100).aspx&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt; &lt;a class="twikiLink" href="https://jazz.net/wiki/bin/view/Main/WebSockets"&gt;WebSockets&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;JFS bulk operations service(&lt;a href="https://jazz.net/wiki/bin/view/Main/JFSBulkOperations"&gt;https://jazz.net/wiki/bin/view/Main/JFSBulkOperations&lt;/a&gt;).&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
-&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7852536510622031749-2862963791402343937?l=poongcha.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/icXPN/~4/nj7oE7fs3xA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://poongcha.blogspot.com/feeds/2862963791402343937/comments/default" title="댓글" /><link rel="replies" type="text/html" href="http://poongcha.blogspot.com/2011/12/restoslc-java-http.html#comment-form" title="0개의 덧글" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7852536510622031749/posts/default/2862963791402343937?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7852536510622031749/posts/default/2862963791402343937?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/icXPN/~3/nj7oE7fs3xA/restoslc-java-http.html" title="Java HTTP 라이브러리 (OSLC REST 프로그램시)" /><author><name>풍차</name><uri>http://www.blogger.com/profile/10628167383220311152</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="23" height="32" src="http://2.bp.blogspot.com/_icOPzB_w_RA/SinjXnz8NRI/AAAAAAAAABA/13rtJajEtZI/S220/%EC%9A%B0%EB%B6%84%ED%88%AC.png" /></author><thr:total>0</thr:total><feedburner:origLink>http://poongcha.blogspot.com/2011/12/restoslc-java-http.html</feedburner:origLink></entry></feed>

