블로그 이미지
평범하게 살고 싶은 월급쟁이 기술적인 토론 환영합니다.같이 이야기 하고 싶으시면 부담 말고 연락주세요:이메일-bwcho75골뱅이지메일 닷컴. 조대협


Archive»


 
 

XML 변환 성능

프로그래밍/XML 관련 | 2009.04.17 19:41 | Posted by 조대협
SOA 프로젝트를 진행하면서 가장 골치거리 중의 하나가 XML 변환에 소요되는 CPU와 응답시간이다.
통상 SOA나 요즘의 많은 Remote call들이 XML을 기반으로 하다보니, 특히나 XML 메세지 변환에 대한 요건이 많다.

자료들을 찾아보니 몇가지 흥미로운 자료들이 있는데,
XSLT가 전체적으로 변환에는 가장 많이 사용되는 듯 (OSB의 경우 XQuery가 편해서 XQuery를 많이 사용하긴 하지만.)한데 그중 흥미로운것인 XSLT를 compile time에 translet이라는 것으로 변환해서 사용할 수 있는 프레임웍

그리고 재미있는 것중의 하나가 Intel에서 만든 XML 변환 가속기인데, Native 코드로 이부분을 구현하여 Intel CPU에서 최적화된 성능을 낼 수 있게 해준다.
 사실 성능이 얼마나 늘어날지는 미지수지만 http://cache-www.intel.com/cd/00/00/34/42/344227_344227.pdf
그래도 Itaniuem 기반의 OS에서만이라도 사용할 수 있다면 꽤나 아키텍쳐 설계에서 유연성을 얻을 수 있지 않을까?
www.intel.com/software/XML
저작자 표시
신고

'프로그래밍 > XML 관련' 카테고리의 다른 글

XML 변환 성능  (0) 2009.04.17
Soap Handler  (0) 2009.04.17
WebLogic Workshop을 이용한 웹서비스 프로그래밍  (0) 2009.04.17
XMLBean  (3) 2008.12.22
JAX-WS를 이용한 쉬운 웹서비스 개발 방법  (0) 2008.12.12
XML에서 Namespace 제거하는 XSLT  (0) 2008.12.10

Soap Handler

프로그래밍/XML 관련 | 2009.04.17 10:42 | Posted by 조대협

SOA 아키텍쳐중에 요건중의 하나가 웹서비스로 들어오고 나가는 데이타에 대한 Transformation과 Filtering이 문제인데, 일반적으로 ESB에서 이를 구현하고 결과적으로 과도한 XQuery로 성능저하로 아주 많은 문제를 일으키는 경우가 있는데, 이에 대한 대응 아키텍쳐로 SoapHandler를 사용해 보는 방법을 고려해볼 수 있다.

WebService는 일반적인 형태로 개발하고, Filtering이 필요할 경우 앞에 Filter의 기능에 따라서 SoapHandler를 붙이고 다른 endpoint를 부여 하는 방식을 사용할 수 있다.
자세한 내용은 여기에..


조만간 Reference implementation을 만들어봐야 겠다.

저작자 표시
신고

'프로그래밍 > XML 관련' 카테고리의 다른 글

XML 변환 성능  (0) 2009.04.17
Soap Handler  (0) 2009.04.17
WebLogic Workshop을 이용한 웹서비스 프로그래밍  (0) 2009.04.17
XMLBean  (3) 2008.12.22
JAX-WS를 이용한 쉬운 웹서비스 개발 방법  (0) 2008.12.12
XML에서 Namespace 제거하는 XSLT  (0) 2008.12.10
WebLogic Workshop에서 JAX-WS로, WebService 개발하기.
예전에 올렸던 동영상인데, 화질이 나쁘다는 피드백이 있어서 편집했는데. 어렵네요...

저작자 표시
신고

'프로그래밍 > XML 관련' 카테고리의 다른 글

XML 변환 성능  (0) 2009.04.17
Soap Handler  (0) 2009.04.17
WebLogic Workshop을 이용한 웹서비스 프로그래밍  (0) 2009.04.17
XMLBean  (3) 2008.12.22
JAX-WS를 이용한 쉬운 웹서비스 개발 방법  (0) 2008.12.12
XML에서 Namespace 제거하는 XSLT  (0) 2008.12.10

XMLBean

프로그래밍/XML 관련 | 2008.12.22 13:20 | Posted by 조대협
요즘 진행하고 있는 프로젝트 성격상 XML에 관련된 작업이 많습니다.
그중에서 흥미로운것을 하나 발견해서 Posting을 하는데
JAVA2XML 솔루션입니다.

Java2XML 솔루션이란 한마디로 Java ValueObject를 XML 문서로 변환해주거나
XML 문서를 Java ValueObject로 변환해주는 라이브러리들을 이야기 합니다.

XML Scheme가 Class의 데이타 타입을 정의해주는 원리입니다.
예전에는 Castor와 같은 오픈소스 프레임웍들이 유행을 했지만
요즘은 J2EE5부터 JAXB2.0이 들어 있어서 JAXB2.0을 추천할만합니다.
사용법도 쉽고, 성능도 상당히 좋아져서 프로젝트에 사용하기에 무리가 없습니다.

그런데 재미있는 녀석중에 하나가
XMLBeans입니다. JAXB의 경우 JAVA2XML 상호 변환에는 그럭저럭 사용할 수 있겠지만 좀더 고 수준의 데이타 변환 예를 들어 XSLT변환이나 XPath사용, XQuery 사용등을 지원할만큼 Powerful하지는 않습니다.

그에 반해 XMLBeans는 Java2XML을 지원하면서도 위에 언급한 모든 기능을 제공하기 때문에 XML 을 훨씬 더 수월하고 많은 기능으로 다룰 수 있습니다.

XMLBeans의 유례는 BEA에서 WLI(WebLogic Integration)등의 제품 개발을 위해 개발 되었다가 아파치 재단에 기부되어 오픈소스로 운용되고 있는 프레임웍입니다.

실제로도 BEA 제품중 많은 수가 이 XML Bean을 기반으로 합니다. ESB, WebLogic Workshop Framework, WebLogic Integration(EAI)

좀더 고급의 XML 기능들이 필요한 경우에는 한번쯤 살펴 보심이 좋지 않을까 싶습니다.

Apache XML Beans : http://xmlbeans.apache.org/

저작자 표시
신고

'프로그래밍 > XML 관련' 카테고리의 다른 글

Soap Handler  (0) 2009.04.17
WebLogic Workshop을 이용한 웹서비스 프로그래밍  (0) 2009.04.17
XMLBean  (3) 2008.12.22
JAX-WS를 이용한 쉬운 웹서비스 개발 방법  (0) 2008.12.12
XML에서 Namespace 제거하는 XSLT  (0) 2008.12.10
XML2JSON Transform XSLT  (0) 2008.12.10
JAX-WS를 이용해서 웹서비스를 만드는 방법입니다.
영어로 작성했지만 내용은 쉽습니다.

Overview

This is a programming guide for component developer to make a webservice easily.

Technical Standard

This is webservice creation guide for component team.
We will use webservice development standard like this.

  • JAX-WS
  • JAXB

Standard IDE is WebLogic workshop 10.3. You can use any IDE that you want. JAX-WS is standard.WebLogic provides eaisest development environment. If you want to find any alternatives, i want to recommend CXF in Apache. It is easily integrated with Spring framework

Restriction

Here is webservice development restriction for more easy development

  • Synchronous WebService Call
    You can just use synchronous message exchange pattern. If you want to use async,pub-sub, or queuing etc. Please talk with Application Architect.
  • DataTypes in Value Object has a restriction.
    Because of we are using JAXB. We have a restriction to use data type in Value Object that is used as parameter or return type of webservice.
    Here is list of data type you can use it to define ValueObject
    Java Data Types XML Scheme Data Type
    boolean boolean
    byte byte
    double double
    float float
    long long
    int int
    String string
    java.math.BigInteger integer
    java.util.Calendar dateTime
    java.util.Data dateTime

    In addtion you properbly need a use a some of array type. Here is a guide. You have to remember that you cannot use Map or Hashtable data type. You have to covert the types into ArrayList etc.

    Java Data Types XML Scheme Data Type
    java.util.Collection Literal Array
    java.util.List Literal Array
    java.util.ArrayList Literal Array
    java.util.LinkedList Literal Array
    java.util.Vector Literal Array
    java.util.Stack Literal Array
    java.util.Set Literal Array
    java.util.TreeSet Literal Array
    java.utils.SortedSet Literal Array
    java.utils.HashSet Literal Array

Programming Steps

1. Make a ValueObject
Make a ValueObject.You can easily make a ValueObject with datatype decribed above.
You have to use some notation to provide more clarified WSDL generation.

Item.java
package osp.sample.valueObject;
import javax.xml.bind.annotation.*;
@XmlAccessorType(XmlAccessType.FIELD) @XmlType (propOrder={ "name", "price", "quantity"} )
public class Item { @XmlElement(required=true) String name;
@XmlElement(required=true) int price;
@XmlElement(required=true) int quantity;
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public int getPrice() { return price; }
public void setPrice(int price) { this.price = price; }
public int getQuantity() { return quantity; }
public void setQuantity(int quantity) { this.quantity = quantity; }

}
  • First import java.xml.bind.annotation.* to use JAXB annotation
  • specify XmlAccessorType with XmlAccessType.FIELD
  • specify XmlType and propOrder. This for sequence of element generated by Java Class.
  • Each of java variable. Specify XmlElement and required=true. This is just for the Xml parsing performance. If the data type is List or Array. You don't have to specify XmlElement

2. Create WebService
Create WebService in WebLogic Workshop IDE and implement a Webservice.

OrderWebService.java
package bcho.sample.webservice;
import javax.jws.WebMethod; import javax.jws.WebParam; import javax.jws.WebResult; import javax.jws.WebService;

import bcho.sample.valueObject.PurchaseOrder;

@WebService public class OrderWebService {
@WebMethod public @WebResult(name="purchaseOrder")PurchaseOrder addOrder( @WebParam(name="purchaseOrder")PurchaseOrder po)
{ return po; }
}
  • You also import javax.jws.* to use JAX-WS annotation.
  • Use @WebService annotation into a class to declare the class is webservice.
  • Use @WebMethod annotation into method, the method will be automatically generated "operation" in webserivce.
  • Use @WebResult and @WebParam in return value and parameter. As i mentioned earlier, please use one result value and one result parameter.
    The name of @WebResult and @WebMethod should be equals with ClassName.

3. Run a Test
You can test a webservice in WebLogic Workshop IDE.

4. Package and deploy

  • After testing, in WebLogic Workshop . Select a project in Project explorer.
  • Click right button of Mouse and select Export.
  • Select war in export menu. The *.war file automatically generated.
  • Please delpoy the war file into Pilot Project environment (WebLogic Server)

Here is a short tutorial movie of WebService development.
[pilot:JAX-WS based Web Service Programming Guide^WebLogic 10.3 JAX-WS Creation guide.mpeg]

Reference

JAXB Development http://edocs.bea.com/wls/docs103/webserv/data_types.html#wp223908
JAX-WS WebService Development http://edocs.bea.com/wls/docs103/webserv/jws.html#program_jws_file

저작자 표시
신고

XML에서 Namespace 제거하는 XSLT

프로그래밍/XML 관련 | 2008.12.10 14:16 | Posted by 조대협
SOAP2REST 변환에서 유용하게 사용할 수 있음

==
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" exclude-result-prefixes="xsl">
    <xsl:template match="comment()|processing-instruction()|/">
        <xsl:copy>
            <xsl:apply-templates />
        </xsl:copy>
    </xsl:template>
    <xsl:template match="*">
        <xsl:element name="{local-name()}">
            <xsl:apply-templates select="@*|node()" />
        </xsl:element>
    </xsl:template>
    <xsl:template match="@*">
        <xsl:attribute name="{local-name()}">
            <xsl:value-of select="." />
        </xsl:attribute>
    </xsl:template>
</xsl:stylesheet>
==

저작자 표시
신고

XML2JSON Transform XSLT

프로그래밍/XML 관련 | 2008.12.10 14:15 | Posted by 조대협
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<!--
  Copyright (c) 2006, Doeke Zanstra
  All rights reserved.

  Redistribution and use in source and binary forms, with or without modification,
  are permitted provided that the following conditions are met:

  Redistributions of source code must retain the above copyright notice, this
  list of conditions and the following disclaimer. Redistributions in binary
  form must reproduce the above copyright notice, this list of conditions and the
  following disclaimer in the documentation and/or other materials provided with
  the distribution.

  Neither the name of the dzLib nor the names of its contributors may be used to
  endorse or promote products derived from this software without specific prior
  written permission.

  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
  INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
  BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
  OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
  THE POSSIBILITY OF SUCH DAMAGE.
-->

  <xsl:output indent="no" omit-xml-declaration="yes" method="text" encoding="UTF-8" media-type="text/xml"/>
    <xsl:strip-space elements="*"/>
  <!--contant-->
  <xsl:variable name="d">0123456789</xsl:variable>

  <!-- ignore document text -->
  <xsl:template match="text()[preceding-sibling::node() or following-sibling::node()]"/>

  <!-- string -->
  <xsl:template match="text()">
    <xsl:call-template name="escape-string">
      <xsl:with-param name="s" select="."/>
    </xsl:call-template>
  </xsl:template>
 
  <!-- Main template for escaping strings; used by above template and for object-properties
       Responsibilities: placed quotes around string, and chain up to next filter, escape-bs-string -->
  <xsl:template name="escape-string">
    <xsl:param name="s"/>
    <xsl:text>"</xsl:text>
    <xsl:call-template name="escape-bs-string">
      <xsl:with-param name="s" select="$s"/>
    </xsl:call-template>
    <xsl:text>"</xsl:text>
  </xsl:template>
 
  <!-- Escape the backslash (\) before everything else. -->
  <xsl:template name="escape-bs-string">
    <xsl:param name="s"/>
    <xsl:choose>
      <xsl:when test="contains($s,'\')">
        <xsl:call-template name="escape-quot-string">
          <xsl:with-param name="s" select="concat(substring-before($s,'\'),'\\')"/>
        </xsl:call-template>
        <xsl:call-template name="escape-bs-string">
          <xsl:with-param name="s" select="substring-after($s,'\')"/>
        </xsl:call-template>
      </xsl:when>
      <xsl:otherwise>
        <xsl:call-template name="escape-quot-string">
          <xsl:with-param name="s" select="$s"/>
        </xsl:call-template>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>
 
  <!-- Escape the double quote ("). -->
  <xsl:template name="escape-quot-string">
    <xsl:param name="s"/>
    <xsl:choose>
      <xsl:when test="contains($s,'&quot;')">
        <xsl:call-template name="encode-string">
          <xsl:with-param name="s" select="concat(substring-before($s,'&quot;'),'\&quot;')"/>
        </xsl:call-template>
        <xsl:call-template name="escape-quot-string">
          <xsl:with-param name="s" select="substring-after($s,'&quot;')"/>
        </xsl:call-template>
      </xsl:when>
      <xsl:otherwise>
        <xsl:call-template name="encode-string">
          <xsl:with-param name="s" select="$s"/>
        </xsl:call-template>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>
 
  <!-- Replace tab, line feed and/or carriage return by its matching escape code. Can't escape backslash
       or double quote here, because they don't replace characters (&#x0; becomes \t), but they prefix
       characters (\ becomes \\). Besides, backslash should be seperate anyway, because it should be
       processed first. This function can't do that. -->
  <xsl:template name="encode-string">
    <xsl:param name="s"/>
    <xsl:choose>
      <!-- tab -->
      <xsl:when test="contains($s,'&#x9;')">
        <xsl:call-template name="encode-string">
          <xsl:with-param name="s" select="concat(substring-before($s,'&#x9;'),'\t',substring-after($s,'&#x9;'))"/>
        </xsl:call-template>
      </xsl:when>
      <!-- line feed -->
      <xsl:when test="contains($s,'&#xA;')">
        <xsl:call-template name="encode-string">
          <xsl:with-param name="s" select="concat(substring-before($s,'&#xA;'),'\n',substring-after($s,'&#xA;'))"/>
        </xsl:call-template>
      </xsl:when>
      <!-- carriage return -->
      <xsl:when test="contains($s,'&#xD;')">
        <xsl:call-template name="encode-string">
          <xsl:with-param name="s" select="concat(substring-before($s,'&#xD;'),'\r',substring-after($s,'&#xD;'))"/>
        </xsl:call-template>
      </xsl:when>
      <xsl:otherwise><xsl:value-of select="$s"/></xsl:otherwise>
    </xsl:choose>
  </xsl:template>

  <!-- number (no support for javascript mantise) -->
  <xsl:template match="text()[not(string(number())='NaN')]">
    <xsl:value-of select="."/>
  </xsl:template>

  <!-- boolean, case-insensitive -->
  <xsl:template match="text()[translate(.,'TRUE','true')='true']">true</xsl:template>
  <xsl:template match="text()[translate(.,'FALSE','false')='false']">false</xsl:template>

  <!-- item:null -->
  <xsl:template match="*[count(child::node())=0]">
    <xsl:call-template name="escape-string">
      <xsl:with-param name="s" select="local-name()"/>
    </xsl:call-template>
    <xsl:text>:null</xsl:text>
    <xsl:if test="following-sibling::*">,</xsl:if>
  </xsl:template>

  <!-- object -->
  <xsl:template match="*" name="base">
    <xsl:if test="not(preceding-sibling::*)">{</xsl:if>
    <xsl:call-template name="escape-string">
      <xsl:with-param name="s" select="local-name()"/>
    </xsl:call-template>
    <xsl:text>:</xsl:text>
    <xsl:apply-templates select="child::node()"/>
    <xsl:if test="following-sibling::*">,</xsl:if>
    <xsl:if test="not(following-sibling::*)">}</xsl:if>
  </xsl:template>

  <!-- array -->
  <xsl:template match="*[count(../*[name(../*)=name(.)])=count(../*) and count(../*)&gt;1]">
    <xsl:if test="not(preceding-sibling::*)">[</xsl:if>
    <xsl:choose>
      <xsl:when test="not(child::node())">
        <xsl:text>null</xsl:text>
      </xsl:when>
      <xsl:otherwise>
        <xsl:apply-templates select="child::node()"/>
      </xsl:otherwise>
    </xsl:choose>
    <xsl:if test="following-sibling::*">,</xsl:if>
    <xsl:if test="not(following-sibling::*)">]</xsl:if>
  </xsl:template>
 
  <!-- convert root element to an anonymous container -->
  <xsl:template match="/">
      <return type="json">
        <xsl:apply-templates select="node()"/>
    </return>
  </xsl:template>
   
</xsl:stylesheet>
저작자 표시
신고
WebLogic 10.3 에서, WebLogic Workshop (이클립스 기반 IDE)를 가지고
JAX-WS 기반으로 웹서비스를 생성하기
JAXB를 표준 데이타 포맷으로 사용하였고. 매우 심플하고 간단함


저작자 표시 비영리 변경 금지
신고

재미있는 XML 라이브러리 하나

프로그래밍/XML 관련 | 2008.09.09 12:59 | Posted by 조대협
http://www.ociweb.com/mark/programming/WAX.html

XML 파싱및 문서 생성이 무지 쉽네 그랴..
시간 나면 한번 써봐야겄다.
신고
TAG WAX, XML