diff options
Diffstat (limited to 'site/trunk/site-publish/workingwithcolumnconverters.html')
-rw-r--r-- | site/trunk/site-publish/workingwithcolumnconverters.html | 231 |
1 files changed, 231 insertions, 0 deletions
diff --git a/site/trunk/site-publish/workingwithcolumnconverters.html b/site/trunk/site-publish/workingwithcolumnconverters.html new file mode 100644 index 0000000000..77144bacbb --- /dev/null +++ b/site/trunk/site-publish/workingwithcolumnconverters.html @@ -0,0 +1,231 @@ + +<!-- + + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE- 2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> + + +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> +<HTML> + <HEAD> + <!-- generateKeywords macro --> + <META name="description" content="Apache Tuscany"> + <META name="keywords" content="apache, apache tuscany, tuscany, service, services, fabric, soa, service oriented architecture, sca, service component architecture, das, sdo, csa, ruby, opensource"> + <!-- generateKeywords macro end --> + + <LINK type="text/css" rel="stylesheet" href="http://tuscany.apache.org/stylesheets/default.css"> + <LINK rel="SHORTCUT ICON" href="https://cwiki.apache.org/confluence/display/TUSCANY/$images/favicon.ico"> + <TITLE>Apache Tuscany : WorkingWithColumnConverters</TITLE> + <META http-equiv="Content-Type" content="text/html;charset=UTF-8"></HEAD> + + <BODY onload="init()"> + <!-- topNav macro --> + <TABLE valign="top" border="0" cellspacing="0" cellpadding="0" width="100%" background="http://tuscany.apache.org/images/TuscanyLogoNEW_Text_120px_bg.jpg"> + <TR> + <TD valing="top" align="left"> + <A href="https://cwiki.apache.org/confluence/pages/viewpage.action?spaceKey=TUSCANY&title=$siteroot"><IMG src="http://tuscany.apache.org/images/TuscanyLogoNEW_Text_120px_bg.jpg" height="91" width="25" border="0"></A> + </TD> + <TD> + <A href="http://tuscany.apache.org/"><IMG src="http://tuscany.apache.org/images/TuscanyLogo.jpg" border="0"></A> + </TD> + + <TD width="100%"> + + </TD> + + <!-- Adds the edit page link to the top banner--> + <TD valign="bottom"> + <DIV style="padding: 2px 10px; margin: 0px;"> + <A href="https://cwiki.apache.org/confluence/pages/editpage.action?pageId=52836"> + <IMG src="http://tuscany.apache.org/images/notep_16.gif" height="16" width="16" border="0" align="absmiddle" title="Edit Page"></A> + </DIV> + </TD> + + </TR> + </TABLE> + <!-- topNav macro end --> + + <!-- breadCrumbs macro --> + <TABLE border="0" cellpadding="2" cellspacing="0" width="100%"> + <TR class="topBar"> + <TD align="left" valign="middle" class="topBarDiv" nowrap="true" width="100%"> + <A href="home.html" title="Apache Tuscany">Apache Tuscany</A> > <A href="home.html" title="Home">Home</A> > <A href="das-overview.html" title="DAS Overview">DAS Overview</A> > <A href="das-java.html" title="DAS Java">DAS Java</A> > <A href="das-java-documentation-menu.html" title="DAS Java Documentation Menu">DAS Java Documentation Menu</A> > <A href="das-java-developer-guide.html" title="DAS Java Developer Guide">DAS Java Developer Guide</A> > <A href="rdb-das-java.html" title="RDB DAS Java">RDB DAS Java</A> > <A href="rdb-das-user-guide.html" title="RDB DAS - User Guide">RDB DAS - User Guide</A> > <A href="" title="WorkingWithColumnConverters">WorkingWithColumnConverters</A> + </TD> + + <TD align="right" valign="middle" class="topBarDiv" align="left" nowrap="true"> + <A href="http://mail-archives.apache.org/mod_mbox/tuscany-user">User List</A> | <A href="http://mail-archives.apache.org/mod_mbox/tuscany-dev">Dev List</A> | <A href="http://issues.apache.org/jira/browse/Tuscany">Issue Tracker</A> + </TD> + </TR> + </TABLE> + <!-- breadCrumbs macro end --> + + + <TABLE border="0" cellpadding="0" width="100%" bgcolor="#FFFFFF"> + <TR> + <TD align="left" valign="top"> + + <!-- pageContent macro --> + <DIV id="PageContent"> + + <DIV class="pagecontent"> + <DIV class="wiki-content"> + <H1><A name="WorkingWithColumnConverters-WorkingWithColumnConverters"></A>WorkingWithColumnConverters</H1> + +<P>Sometimes it is desireable to modify a column value retreived from a database column <B>before</B> it is stored into a DataObject property. One example might be a database column with possible values '0' or '1' but the desired DataObject property is 'false' or 'true'. Another example might be a String property that should be obfuscated or encryted before it is stored into a column.</P> + +<P>The RDB DAS provides a simple "converter" framework that can be used for these cases and others. To use this framework the application developer must provide a new Converter class to provide the desired transformations from column to property and from property back to column. The provided converter must implement the following interface:</P> +<DIV class="code panel" style="border-width: 1px;"><DIV class="codeContent panelContent"> +<PRE class="code-java"> +<SPAN class="code-keyword">package</SPAN> org.apache.tuscany.das.rdb; + +/** + * A lightweight Table-column <--> DataObject-property converter framework. Converters allow a user to + * insert a transformation between a column value and is destination DataObject property value. For example, + * by <SPAN class="code-keyword">default</SPAN>, a VARCHAR column will be represented as a <SPAN class="code-object">String</SPAN> in its corresponding DataObject property. + * A user could insert a converter that transforms the the VARCHAR value to an <SPAN class="code-object">Integer</SPAN>. If <SPAN class="code-keyword">this</SPAN> is done then + * although the column returns character data, the DataObject property will be an <SPAN class="code-object">Integer</SPAN> + */ +<SPAN class="code-keyword">public</SPAN> <SPAN class="code-keyword">interface</SPAN> Converter { + + /** + * Transform the columnData object to a <SPAN class="code-keyword">new</SPAN> value and possibly <SPAN class="code-keyword">new</SPAN> type. This should be the inverse + * operation of #getColumnValue + * + * @param columnData + * The column value to transorm + * @<SPAN class="code-keyword">return</SPAN> Returns the transformed value + */ + <SPAN class="code-object">Object</SPAN> getPropertyValue(<SPAN class="code-object">Object</SPAN> columnData); + + /** + * Transform the columnData object to a <SPAN class="code-keyword">new</SPAN> value and possibly <SPAN class="code-keyword">new</SPAN> type. This should be the inverse + * operation of #getPropertyValue + * + * @param propertyData + * The property value to transform + * @<SPAN class="code-keyword">return</SPAN> Returns the transformed value + */ + <SPAN class="code-object">Object</SPAN> getColumnValue(<SPAN class="code-object">Object</SPAN> propertyData); + +} +</PRE> +</DIV></DIV> +<P>The following example illustrates the use of the converter framework to obfuscate a String value before it is stored to the database and deobfuscate it on read.</P> +<DIV class="code panel" style="border-width: 1px;"><DIV class="codeContent panelContent"> +<PRE class="code-java"> +DAS das = DAS.FACTORY.createDAS(getConfig(<SPAN class="code-quote">"CustomerConfig.xml"</SPAN>), getConnection()); + + <SPAN class="code-comment">// Create and initialize command to read customers +</SPAN> Command read = das.getCommand(<SPAN class="code-quote">"getFirstCustomer"</SPAN>); + + <SPAN class="code-comment">// Read +</SPAN> DataObject root = read.executeQuery(); + + <SPAN class="code-comment">//Modify +</SPAN> root.setString(<SPAN class="code-quote">"CUSTOMER[1]/LASTNAME"</SPAN>, <SPAN class="code-quote">"Some <SPAN class="code-keyword">new</SPAN> name"</SPAN>); + + das.applyChanges(root); +</PRE> +</DIV></DIV> +<P>This example just shows a simple read of a customer DataObject followed setting the last name to some new value. You will have to take my word for it that the value is not written as-is but is instead obfuscated. The actual value written to the database table column is "Fbzr arj anzr" based on the ROT13 algorithm used in the converter.</P> + +<P>Converters are specified in the configuration, usually as part of a config.xml file. Here is the config file for the example:</P> +<DIV class="preformatted panel" style="border-width: 1px;"><DIV class="preformattedContent panelContent"> +<PRE><Config xsi:noNamespaceSchemaLocation="http:///org.apache.tuscany.das.rdb/config.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> + + <Command name="getFirstCustomer" SQL="Select * from CUSTOMER where ID = 1" kind="Select"/> + + <Table tableName="CUSTOMER"> + <Column columnName="ID" primaryKey="true"/> + <Column columnName="LASTNAME" converterClassName="org.apache.tuscany.das.rdb.test.mappings.StringObfuscationConverter"/> + </Table> + +</Config> +</PRE> +</DIV></DIV> +<P>Here is the user-defined converter class:</P> +<DIV class="code panel" style="border-width: 1px;"><DIV class="codeContent panelContent"> +<PRE class="code-java"> +<SPAN class="code-keyword">public</SPAN> class StringObfuscationConverter <SPAN class="code-keyword">implements</SPAN> Converter { + + <SPAN class="code-keyword">public</SPAN> StringObfuscationConverter() { + <SPAN class="code-keyword">super</SPAN>(); + } + + <SPAN class="code-keyword">public</SPAN> <SPAN class="code-object">Object</SPAN> getPropertyValue(<SPAN class="code-object">Object</SPAN> columnData) { + <SPAN class="code-keyword">return</SPAN> toRot13((<SPAN class="code-object">String</SPAN>) columnData); + } + + <SPAN class="code-keyword">public</SPAN> <SPAN class="code-object">Object</SPAN> getColumnValue(<SPAN class="code-object">Object</SPAN> propertyData) { + <SPAN class="code-keyword">return</SPAN> toRot13((<SPAN class="code-object">String</SPAN>) propertyData); + } + + <SPAN class="code-comment">// Utilities +</SPAN> + <SPAN class="code-comment">// A simple, reversible, obfuscation algorithm using a ROT13 implementation +</SPAN> <SPAN class="code-keyword">private</SPAN> <SPAN class="code-object">String</SPAN> toRot13(<SPAN class="code-object">String</SPAN> original) { + + <SPAN class="code-object">int</SPAN> abyte = 0; + <SPAN class="code-object">byte</SPAN>[] buffer = {}; + <SPAN class="code-keyword">try</SPAN> { + buffer = original.getBytes(<SPAN class="code-quote">"ISO-8859-1"</SPAN>); + } <SPAN class="code-keyword">catch</SPAN> (UnsupportedEncodingException e) { + <SPAN class="code-keyword">throw</SPAN> <SPAN class="code-keyword">new</SPAN> Error(e); + } + + <SPAN class="code-keyword">for</SPAN> (<SPAN class="code-object">int</SPAN> i = 0; i < buffer.length; i++) { + abyte = buffer[i]; + <SPAN class="code-object">int</SPAN> cap = abyte & 32; + abyte &= ~cap; + abyte = ((abyte >= 'A') && (abyte <= 'Z') ? ((abyte - 'A' + 13) % 26 + 'A') : abyte) | cap; + buffer[i] = (<SPAN class="code-object">byte</SPAN>) abyte; + } + <SPAN class="code-keyword">try</SPAN> { + <SPAN class="code-keyword">return</SPAN> <SPAN class="code-keyword">new</SPAN> <SPAN class="code-object">String</SPAN>(buffer, <SPAN class="code-quote">"ISO-8859-1"</SPAN>); + } <SPAN class="code-keyword">catch</SPAN> (UnsupportedEncodingException e) { + <SPAN class="code-keyword">throw</SPAN> <SPAN class="code-keyword">new</SPAN> Error(e); + } + } +} +</PRE> +</DIV></DIV> + </DIV> + </DIV> + </DIV> + <!-- pageContent macro end --> + + </TD> + </TR> + </TABLE> + + <!-- footer macro --> + <SCRIPT src="http://www.google-analytics.com/urchin.js" type="text/javascript"> + </SCRIPT> + <SCRIPT type="text/javascript"> + _uacct = "UA-1174707-5"; + urchinTracker(); + </SCRIPT> + + <A href="http://www.statcounter.com/" target="_blank"><IMG src="http://c26.statcounter.com/counter.php?sc_project=2619156&java=0&security=94bd7e7d&invisible=0" alt="website stats" border="0"></A> + + <DIV class="footer"> + Copyright � 2003-2012, The Apache Software Foundation </BR> + Apache Tuscany and the Apache Tuscany project logo are trademarks of The Apache Software Foundation. + </DIV> + <!-- footer macro end --> + + </BODY> +</HTML> |