Programming Languages

2011年10月6日 星期四

使用EMF來Serialize XML

EMF提供了將定義好的metamodel serialize成XMI(XML Interchange)格式的功能。使用這個功能,可以將Object 序列化為XMI文檔。程式如下:(此範例程式使用了由My.ecore這個EMF meta model產生出來的model code。此處可下載emftest.zip(內含My.ecore),下載後需再用EMF的工具,產生EMFTest這些package的Java code)

import EMFTest.EMFTestFactory;
  import EMFTest.EMFTestPackage;
  import EMFTest.vincent;
  import EMFTest.impl.EMFTestPackageImpl;

public class TestData {

    /**
     * @param args
     */
    public static void main(String[] args) {
        //要先Initial PackageImpl,才能使用EMF的功能
        EMFTestPackageImpl.init();
        //Serialize時,所需的參數儲存於 saveOptions
        Map<String, Object> saveOptions = new HashMap<String, Object>();
        //啟用OPTION_EXTENDED_META_DATA後,才能指定要讓某個attribute Serialize為Element,而不是Attributes
        saveOptions.put(XMLResource.OPTION_EXTENDED_META_DATA, Boolean.TRUE);
        //設定vincent.company及vincent.location這2個attribute要serialize成Element
        EMFTestPackage testPackage = EMFTestPackageImpl.eINSTANCE;
        EAttribute companyAttr = testPackage.getvincent_Company();
        EAttribute locationAttr = testPackage.getvincent_Location();
        XMLMapImpl map = new XMLMapImpl();
        XMLInfoImpl x = new XMLInfoImpl();
        x.setXMLRepresentation(XMLInfoImpl.ELEMENT);
        map.add(companyAttr, x);
        map.add(locationAttr, x);
        saveOptions.put(XMLResource.OPTION_XML_MAP, map); 
        saveOptions.put(XMLResource.OPTION_ENCODING, "UTF-8");      

     EMFTestFactory testFactory = EMFTestFactory.eINSTANCE;
        vincent testElement = testFactory.createvincent();
        testElement.setAge(32);
        testElement.setCompany("IBM");
        testElement.setLocation("Taipei");
        ResourceSet resourceSet = new ResourceSetImpl();
        // Register XML resource factory
        resourceSet.getResourceFactoryRegistry().getExtensionToFactoryMap().put("xml", new XMLResourceFactoryImpl());
        Resource resource = resourceSet.createResource(URI.createFileURI("Vincent.xml"));
        // add the root object to the resource
        resource.getContents().add(testElement);
        // serialize resource – you can specify also serialization
        // options which defined on org.eclipse.emf.ecore.xmi.XMIResource
        try {
            resource.save(saveOptions);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}

上面的程式中,透過啟用OPTION_EXTENDED_META_DATA,使得可以設定那些EMF model的attribute要產生成XML的element。另一種做法為,直接在Ecore model的diagram中,增加Extended Meta Data,把要設定的Attribute設為element。如下圖

注意:這個方法要work,一樣要在serialize XML的程式中,加入

saveOptions.put(XMLResource.OPTION_EXTENDED_META_DATA, Boolean.TRUE);

image

參考資料:

2011年10月3日 星期一

XSLT及Eclipse Tutorial

  1. 更新Eclipse,安裝 Helios下的Eclipse XSL Developer Tools
    image
  2. 安裝完後,Eclipse會要求重啟。重新啟動完Eclipse後,建立一個新的Java Project
  3. 在新建的Java Project下新增一個files的目錄
  4. 在files目錄下, 建立source.xml,內容如下
    <?xml version="1.0"?>
    <!-- This is a comment -->
    <people>
    <address type="personal">
    <name>Lars </name>
    <street> Test </street>
    <telephon number="0123" />
    </address>
    <address type="personal">
    <name>Joe </name>
    <street> Test2 </street>
    <telephon number="1234" />
    </address>
    <address type="business">
    <name>Jim</name>
    <street> Test3 </street>
    <telephon number="2345" />
    </address>
    </people>
  5. 在同一目錄下,建立一個transform2.xsl檔案,內容如下
  6. <?xml version="1.0"?>
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
        version="1.0">

        <xsl:output method="xml" />

        <!-- Copy everything -->
        <xsl:template match="*">
            <xsl:copy>
                <xsl:copy-of select="@*" />
                <xsl:apply-templates />
            </xsl:copy>
        </xsl:template>

        <!-- Do some adjustments for the address -->
        <xsl:template match="address">
            <xsl:element name="place-where-person-live">
                <xsl:apply-templates />
            </xsl:element>
        </xsl:template>

        <!-- Put the name in a <hubba> tag -->
        <xsl:template match="name">
            <xsl:element name="name">
                <hubba>
                    <xsl:apply-templates />
                </hubba>
            </xsl:element>
        </xsl:template>
    </xsl:stylesheet>

  7. 於Project explore中,對新建立的transform2.xsl按右鍵—>Run As—>XSL Transformation
    image
  8. Eclipse會跳出一個視窗,選取要轉換的XML檔案
    image 
  9. 轉換的結果會存在同目錄下的 source.out.xml檔案內

翻譯自 http://www.vogella.de/articles/XSLT/article.html

2011年10月2日 星期日

用SQL產生具有Referential Integrity的測試資料

題目:

假設有兩個表格parent_table及child_table,其結構如下

parent_table:

parent_id child_count
101 2
102 1
103 3

child_table:

parent_id child_id
101 11
101 12
102 13
103 14
103 15
103 16

其中,parent_id為parent_table的主鍵, child_id為child_table的主鍵 而child_count的數目表示該parent_id可以map到多少個child_id。試圖自動產生child_table的內容,使其能夠符合parent_table的child_count數目。也就是說,產生出來的child_table需要出現2次parent_id:101,1次parent_id:102以及3次parent_id:103,如同上圖所示child_table的內容。

解答:

  1. 遇到這類的情況,必需把parent_table中的rows展開,產生一個中介的表格。方法為把parent_table與一個sequence table做cartesian join。所需的SQL及產生的結果如下
    select parent_table.parent_id,parent_table.child_count, sequence_tab.id
    from parent_table join (select row_number() over()  as id from syscat.tables) as sequence_tab on sequence_tab.id between 1 and parent_table.child_count

    image
  2. 接著,Select 上述結果的parent_id,進行primay key編號,即為chile_table的內容。所需的SQL如下
    select temp_tab.parent_id, row_number() over()+10 as child_id from (select parent_table.parent_id,parent_table.child_count, sequence_tab.id
    from parent_table join (select row_number() over()  as id from syscat.tables) as sequence_tab on sequence_tab.id between 1 and parent_table.child_count)
    as temp_tab

    image
  3. 最後將上述SQL放在INSET INTO Child_table 之後,即告完成
    INSERT INTO CHILD_TABLE
    select temp_tab.parent_id, row_number() over()+10 as child_id from
    (select parent_table.parent_id,parent_table.child_count, sequence_tab.id
    from parent_table join (select row_number() over()  as id from syscat.tables) as sequence_tab on sequence_tab.id between 1 and parent_table.child_count)
    as temp_tab

參考來源:http://www.ibm.com/developerworks/data/library/techarticle/dm-0405kuznetsov/index.html
 

2011年9月29日 星期四

取消Java mixed components warning

在Java 1.6以後,Sun加入了新的安全機制,會檢視一個有signed過的程式是否摻雜unsigned的component。遇到這樣的情況,browser預設會跳出如下視窗,讓使用者確認。
這個情況下,若是按Yes,這個應用程式將會無法正常執行。所以如相信這個應用程式,必需選擇No。

 

若不想出現這個視窗,可以點選控制台-->Java,開啟Java主控台。然後選取進階-->安全-->混合程式碼。下面有四個選項,預設是選第一個 啟用 - 必要程顯示警告。若想直接執行類似的元件而不要跳出上面的視窗,可以如下圖所示,選取啟用-隱藏警告並在防護下執行 

image

 


資料來源:http://download.oracle.com/javase/6/docs/technotes/guides/jweb/mixed_code.html#manifest

2011年9月17日 星期六

如何安裝EMF

依照http://www.vogella.de/articles/EclipseEMF/article.html#emfinstallation 連結的介紹,只要裝Ecore Tools SDK及EMF-Eclipse Modeling Framework SDK。然而在安裝時卻遇到缺乏core-platform的訊息。經Google了一下,發現要先裝http://www.eclipse.org/eclipse/platform-core/downloads.php#updates這個東西後,就可以安裝所要的EMF元件了

2011年7月13日 星期三

Web Security考量

Robust Defenses for Corss-Site Request Forgery這篇paper主要是介紹Cross-Site-Request-Forgery這個攻擊的手法以及防治方法。不過同時也提到了其它Web應用程式應該注意的security issue。如下列

  • XSS(Cross-Site-Scripting)
  • DNS Rebinding
  • Certificate Errors
  • Phishing
  • User Tracking

2011年6月9日 星期四

客製化Sun的JAXB implemtation--XJC

使用Sun的XJC建立Java code時,預設遇xml schema中有fixed attribute時,不會自動把它轉成Java的constant,要達到這個目的,必需客製化XJC的 binding方式。作法如下(XJC提供inline及external的customization,其中inline的客製化是直接把客製化設定寫在要進行轉換的xml schema中;而exetrnal的customization則是另外寫在一個外部檔案,這裡使用external customization為例子)

  1. 撰寫customization檔案(xjc根目錄下的 samples/external-customize 子目錄有更詳細的例子)
       <jxb:bindings version="1.0"
                xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
                xmlns:xsd="http://www.w3.org/2001/XMLSchema">
      <jxb:bindings schemaLocation="ExercisePrescription - reference - 20110530 hugang.xsd" node="/*">
      <jxb:globalBindings
        fixedAttributeAsConstantProperty="true"/>
      </jxb:bindings>
    </jxb:bindings>
  2. 執行轉換指令
    xjc   xml_schema_to_convert     -b   customization_file_name
  3. 如此一來,xjc在轉換java code時,會把fixed value轉成java constant