[Jiemamy-notify:2298] commit [3332] XML namespaceの整理。それに伴う、XpathUtilの廃止、SmartXpathの導入。(これでもビミョーだが)

Back to archive index

svnno****@sourc***** svnno****@sourc*****
2009年 4月 21日 (火) 21:13:44 JST


Revision: 3332
          http://svn.sourceforge.jp/view?root=jiemamy&view=rev&rev=3332
Author:   daisuke_m
Date:     2009-04-21 21:13:44 +0900 (Tue, 21 Apr 2009)

Log Message:
-----------
XML namespaceの整理。それに伴う、XpathUtilの廃止、SmartXpathの導入。(これでもビミョーだが)

Modified Paths:
--------------
    artemis/trunk/jiemamy-artemis-test/src/test/java/org/jiemamy/internal/serializer/JiemamySerializerTest.java
    artemis/trunk/jiemamy-core/src/main/java/org/jiemamy/Artemis.java
    artemis/trunk/jiemamy-core/src/main/java/org/jiemamy/ArtemisExtender.java
    artemis/trunk/jiemamy-core/src/main/java/org/jiemamy/internal/JiemamyFacadeImpl.java
    artemis/trunk/jiemamy-core/src/main/java/org/jiemamy/internal/serializer/JiemamyDomBuilder.java
    artemis/trunk/jiemamy-core/src/main/java/org/jiemamy/internal/serializer/JiemamyDomParser.java
    artemis/trunk/jiemamy-core/src/main/java/org/jiemamy/utils/DomUtil.java
    artemis/trunk/jiemamy-core/src/main/java/org/jiemamy/utils/model/DataTypeUtil.java
    artemis/trunk/jiemamy-core/src/main/java/org/jiemamy/xml/JiemamyNamespaceContext.java
    artemis/trunk/jiemamy-core/src/test/java/org/jiemamy/xml/JiemamyNamespaceContextTest.java
    artemis/trunk/jiemamy-view/src/main/java/org/jiemamy/ArtemisView.java
    artemis/trunk/jiemamy-view/src/main/java/org/jiemamy/internal/enhance/ViewDomSerializerEnhancer.java
    zeus/trunk/jiemamy-spec-core/src/main/java/org/jiemamy/Jiemamy.java
    zeus/trunk/jiemamy-spec-core/src/main/java/org/jiemamy/JiemamyImplementation.java
    zeus/trunk/jiemamy-spec-core/src/main/java/org/jiemamy/xml/CoreNamespace.java
    zeus/trunk/jiemamy-spec-core/src/main/java/org/jiemamy/xml/CoreQName.java
    zeus/trunk/jiemamy-spec-core/src/main/java/org/jiemamy/xml/JiemamyNamespace.java
    zeus/trunk/jiemamy-spec-core/src/main/resources/sample.xml
    zeus/trunk/jiemamy-spec-view/src/main/java/org/jiemamy/xml/ViewNamespace.java
    zeus/trunk/jiemamy-spec-view/src/main/java/org/jiemamy/xml/ViewQName.java

Added Paths:
-----------
    artemis/trunk/jiemamy-core/src/main/java/org/jiemamy/utils/SmartXpath.java
    artemis/trunk/jiemamy-core/src/test/java/org/jiemamy/utils/SmartXpathTest.java

Removed Paths:
-------------
    artemis/trunk/jiemamy-core/src/main/java/org/jiemamy/utils/XpathUtil.java
    artemis/trunk/jiemamy-core/src/test/java/org/jiemamy/utils/XpathUtilTest.java


-------------- next part --------------
Modified: artemis/trunk/jiemamy-artemis-test/src/test/java/org/jiemamy/internal/serializer/JiemamySerializerTest.java
===================================================================
--- artemis/trunk/jiemamy-artemis-test/src/test/java/org/jiemamy/internal/serializer/JiemamySerializerTest.java	2009-04-21 01:54:15 UTC (rev 3331)
+++ artemis/trunk/jiemamy-artemis-test/src/test/java/org/jiemamy/internal/serializer/JiemamySerializerTest.java	2009-04-21 12:13:44 UTC (rev 3332)
@@ -30,7 +30,6 @@
 
 import javax.xml.parsers.DocumentBuilder;
 import javax.xml.parsers.DocumentBuilderFactory;
-import javax.xml.xpath.XPathConstants;
 
 import org.apache.commons.collections15.CollectionUtils;
 import org.apache.commons.io.FileUtils;
@@ -52,7 +51,7 @@
 import org.jiemamy.model.node.NodeAdapter;
 import org.jiemamy.model.node.StickyModel;
 import org.jiemamy.serializer.JiemamySerializer;
-import org.jiemamy.utils.XpathUtil;
+import org.jiemamy.utils.SmartXpath;
 
 /**
  * {@link JiemamySerializer}用のテスト抽象クラス。
@@ -87,6 +86,7 @@
 	 */
 	@Test
 	public void test01_シリアライズする() throws Exception {
+		SmartXpath smartXpath = new SmartXpath(jiemamy);
 		ViewTestModelBuilder mb = new ViewTestModelBuilder(jiemamy);
 		mb.build();
 		JiemamyFactory factory = jiemamy.getFactory();
@@ -112,24 +112,20 @@
 //		assertThat(document, hasXPath("/jiemamy/endScript", is("COMMIT;")));
 		assertThat(document, hasXPath("/jiemamy/description", is("Jiemamyテストモデル1")));
 		
-		NodeList domainNodes =
-				(NodeList) XpathUtil.XPATH.evaluate("/jiemamy/domains/domain", document, XPathConstants.NODESET);
+		NodeList domainNodes = smartXpath.getNodes(document, "/jiemamy/domains/domain");
 		assertThat(domainNodes.getLength(), is(2));
 		assertThat(document, hasXPath("/jiemamy/domains/domain[1]/@id", is(mb.domainId.getId().toString())));
 		assertThat(document, hasXPath("/jiemamy/domains/domain[2]/@id", is(mb.domainName.getId().toString())));
 		
 		// テーブルのチェック
-		NodeList tableNodes =
-				(NodeList) XpathUtil.XPATH.evaluate("/jiemamy/entities/table", document, XPathConstants.NODESET);
+		NodeList tableNodes = smartXpath.getNodes(document, "/jiemamy/entities/table");
 		assertThat(tableNodes.getLength(), is(2));
 		assertThat(document, hasXPath(XPATH_T_DEPT + "/name", is("T_DEPT")));
 		
-		NodeList columnNodes =
-				(NodeList) XpathUtil.XPATH.evaluate(XPATH_T_DEPT_COLUMNS, document, XPathConstants.NODESET);
+		NodeList columnNodes = smartXpath.getNodes(document, XPATH_T_DEPT_COLUMNS);
 		assertThat(columnNodes.getLength(), is(4));
 		
-		NodeList viewNodes =
-				(NodeList) XpathUtil.XPATH.evaluate("/jiemamy/entities/view", document, XPathConstants.NODESET);
+		NodeList viewNodes = smartXpath.getNodes(document, "/jiemamy/entities/view");
 		assertThat(viewNodes.getLength(), is(1));
 		assertThat(document, hasXPath("/jiemamy/entities/view/@id", is("516f7961-cb7b-48e2-990b-7fb0c750c3a4")));
 		assertThat(document, hasXPath("/jiemamy/entities/view/name", is("V_HIGH_SAL_EMP")));

Modified: artemis/trunk/jiemamy-core/src/main/java/org/jiemamy/Artemis.java
===================================================================
--- artemis/trunk/jiemamy-core/src/main/java/org/jiemamy/Artemis.java	2009-04-21 01:54:15 UTC (rev 3331)
+++ artemis/trunk/jiemamy-core/src/main/java/org/jiemamy/Artemis.java	2009-04-21 12:13:44 UTC (rev 3332)
@@ -18,6 +18,7 @@
  */
 package org.jiemamy;
 
+import java.util.Arrays;
 import java.util.IdentityHashMap;
 import java.util.List;
 import java.util.Map;
@@ -35,6 +36,8 @@
 import org.jiemamy.utils.enhancer.Enhance;
 import org.jiemamy.utils.enhancer.EnhanceException;
 import org.jiemamy.utils.enhancer.FactoryEnhancer;
+import org.jiemamy.xml.CoreNamespace;
+import org.jiemamy.xml.JiemamyNamespace;
 
 /**
  * Jiemamy仕様の参照実装(コードネーム:Artemis)を表す型。
@@ -61,7 +64,7 @@
 	private final EventBroker eventBroker = new EventBrokerImpl();
 	
 	/** 実装に施された拡張の配列 */
-	private final ArtemisExtender[] extensions;
+	private final ArtemisExtender[] extenders;
 	
 	/** 拡張をほどこされたファクトリの{@link Class} */
 	private Class<? extends JiemamyFactory> enhancedFactoryClass;
@@ -84,14 +87,14 @@
 	/**
 	 * インスタンスを生成する。
 	 * 
-	 * @param extensions Artemis拡張オブジェクト
+	 * @param extenders Artemis拡張オブジェクト
 	 */
-	public Artemis(ArtemisExtender... extensions) {
-		this.extensions = extensions;
+	public Artemis(ArtemisExtender... extenders) {
+		this.extenders = extenders;
 		
 		List<Enhance> allEnhances = CollectionsUtil.newArrayList();
-		for (ArtemisExtender enhance : extensions) {
-			allEnhances.addAll(enhance.getEnhances());
+		for (ArtemisExtender extender : extenders) {
+			allEnhances.addAll(extender.getEnhances());
 		}
 		
 		FactoryEnhancer<JiemamyFactory> enhancer =
@@ -128,6 +131,17 @@
 		return factory;
 	}
 	
+	public JiemamyNamespace[] getNamespaces() {
+		List<JiemamyNamespace> namespaces = CollectionsUtil.newArrayList();
+		namespaces.addAll(Arrays.asList(CoreNamespace.values()));
+		
+		for (ArtemisExtender extender : extenders) {
+			namespaces.addAll(Arrays.asList(extender.getNamespaces()));
+		}
+		
+		return namespaces.toArray(new JiemamyNamespace[namespaces.size()]);
+	}
+	
 	public ReferenceResolver getReferenceResolver() {
 		assert resolver != null;
 		return resolver;
@@ -139,7 +153,7 @@
 	
 	public Set<OptionalSpec> getSupportedSpecs() {
 		Set<OptionalSpec> supportedSpecs = CollectionsUtil.newHashSet();
-		for (ArtemisExtender enhance : extensions) {
+		for (ArtemisExtender enhance : extenders) {
 			supportedSpecs.addAll(enhance.getSpecs());
 		}
 		return supportedSpecs;
@@ -160,8 +174,6 @@
 		
 		private final int release = 0;
 		
-		private final boolean snapshotImplementation = true;
-		
 
 		private ArtemisVersion() {
 		}
@@ -179,7 +191,7 @@
 		}
 		
 		public boolean isSnapshot() {
-			return SNAPSHOT || snapshotImplementation;
+			return SNAPSHOT;
 		}
 		
 		@Override
@@ -190,7 +202,7 @@
 			sb.append(MINOR);
 			sb.append(".");
 			sb.append(release);
-			if (SNAPSHOT || snapshotImplementation) {
+			if (SNAPSHOT) {
 				sb.append("-SNAPSHOT");
 			}
 			return sb.toString();

Modified: artemis/trunk/jiemamy-core/src/main/java/org/jiemamy/ArtemisExtender.java
===================================================================
--- artemis/trunk/jiemamy-core/src/main/java/org/jiemamy/ArtemisExtender.java	2009-04-21 01:54:15 UTC (rev 3331)
+++ artemis/trunk/jiemamy-core/src/main/java/org/jiemamy/ArtemisExtender.java	2009-04-21 12:13:44 UTC (rev 3332)
@@ -22,6 +22,7 @@
 import java.util.Set;
 
 import org.jiemamy.utils.enhancer.Enhance;
+import org.jiemamy.xml.JiemamyNamespace;
 
 /**
  * Jiemamy {@link Artemis} Implementationに対する、拡張インターフェイス。
@@ -37,6 +38,13 @@
 	List<Enhance> getEnhances();
 	
 	/**
+	 * TODO for daisuke
+	 * 
+	 * @return
+	 */
+	JiemamyNamespace[] getNamespaces();
+	
+	/**
 	 * この拡張が実装する「追加仕様」の{@link Set}を取得する。
 	 * 
 	 * @return この拡張が実装する「追加仕様」の{@link Set}

Modified: artemis/trunk/jiemamy-core/src/main/java/org/jiemamy/internal/JiemamyFacadeImpl.java
===================================================================
--- artemis/trunk/jiemamy-core/src/main/java/org/jiemamy/internal/JiemamyFacadeImpl.java	2009-04-21 01:54:15 UTC (rev 3331)
+++ artemis/trunk/jiemamy-core/src/main/java/org/jiemamy/internal/JiemamyFacadeImpl.java	2009-04-21 12:13:44 UTC (rev 3332)
@@ -365,7 +365,7 @@
 			List<ColumnModel> columns = TableUtil.getColumns(tableModel);
 			for (ColumnModel columnModel : columns) {
 				if (columnModel.getDataType().equals(domainRef)) {
-					BuiltinDataType domainDataType = (BuiltinDataType) domainModel.getDataType();
+					BuiltinDataType domainDataType = domainModel.getDataType();
 					BuiltinDataTypeMold mold = dialect.findDataTypeMold(domainDataType);
 					BuiltinDataType newDataType = factory.newDataType(mold);
 					

Modified: artemis/trunk/jiemamy-core/src/main/java/org/jiemamy/internal/serializer/JiemamyDomBuilder.java
===================================================================
--- artemis/trunk/jiemamy-core/src/main/java/org/jiemamy/internal/serializer/JiemamyDomBuilder.java	2009-04-21 01:54:15 UTC (rev 3331)
+++ artemis/trunk/jiemamy-core/src/main/java/org/jiemamy/internal/serializer/JiemamyDomBuilder.java	2009-04-21 12:13:44 UTC (rev 3332)
@@ -211,8 +211,8 @@
 						throw new UnexpectedConditionError("setAccessible(true)しているのでアクセスできるはず", e);
 					}
 					if (value != null) {
-						DomUtil.newChild(adapterElement, new QName(CoreNamespace.NS_CORE.getNamespaceURI(), field
-							.getName()), value);
+						DomUtil.newChild(adapterElement, new QName(CoreNamespace.NS_CORE.getNamespaceURI().toString(),
+								field.getName()), value);
 						existSpecificValue = true;
 					}
 				}
@@ -263,9 +263,13 @@
 		rootElement.setAttribute(CoreQName.ID.getQNameString(), rootModel.getId().toString());
 		rootElement.setAttribute(CoreQName.VERSION.getQNameString(), Version.SPEC);
 		rootElement.setAttribute("xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance");
-		// FIXME locationを正式なURLに
-		rootElement.setAttribute("xsi:schemaLocation", ""
-				+ "http://jiemamy.org/xml/ns/core ../../main/resources/jiemamy-core.xsd");
+		
+		StringBuilder sb = new StringBuilder();
+		sb.append(CoreNamespace.NS_CORE.getNamespaceURI().toString());
+		sb.append(" ");
+		sb.append(CoreNamespace.NS_CORE.getXmlSchemaLocation());
+		rootElement.setAttribute("xsi:schemaLocation", sb.toString());
+		
 		document.appendChild(rootElement);
 		
 		buildMiscSection(rootElement);

Modified: artemis/trunk/jiemamy-core/src/main/java/org/jiemamy/internal/serializer/JiemamyDomParser.java
===================================================================
--- artemis/trunk/jiemamy-core/src/main/java/org/jiemamy/internal/serializer/JiemamyDomParser.java	2009-04-21 01:54:15 UTC (rev 3331)
+++ artemis/trunk/jiemamy-core/src/main/java/org/jiemamy/internal/serializer/JiemamyDomParser.java	2009-04-21 12:13:44 UTC (rev 3332)
@@ -24,6 +24,7 @@
 import java.lang.reflect.Field;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.UUID;
 
 import javax.xml.xpath.XPathConstants;
 import javax.xml.xpath.XPathExpressionException;
@@ -80,9 +81,11 @@
 import org.jiemamy.utils.Adaptable;
 import org.jiemamy.utils.DomUtil;
 import org.jiemamy.utils.IterableNodeList;
-import org.jiemamy.utils.XpathUtil;
+import org.jiemamy.utils.SmartXpath;
+import org.jiemamy.utils.UUIDUtil;
 import org.jiemamy.utils.model.RootModelUtil;
 import org.jiemamy.xml.CoreQName;
+import org.jiemamy.xml.JiemamyQName;
 
 /**
  * Jiemamy XMLモデルのDOMから{@link RootModel}を生成するクラス。
@@ -97,84 +100,14 @@
 	
 	private static Logger logger = LoggerFactory.getLogger(JiemamyDomParser.class);
 	
-
-	private static void readAdapter(Element element, Adaptable jiemamyElement) {
-		NodeList adapterNodeList = XpathUtil.getNodes(element, "core:adapter");
-		Iterable<Node> adapterIterator = new IterableNodeList(adapterNodeList);
-		
-		for (Node adapterNode : adapterIterator) {
-			String className = DomUtil.getAttributeString((Element) adapterNode, CoreQName.CLASS);
-			try {
-				Class<?> clazz = Class.forName(className);
-				Object adapter;
-				if (jiemamyElement.hasAdapter(clazz)) {
-					adapter = jiemamyElement.getAdapter(clazz);
-				} else {
-					try {
-						adapter = clazz.newInstance();
-						jiemamyElement.registerAdapter(adapter);
-					} catch (InstantiationException e) {
-						logger.warn("ModelAdapter must have default constructor.", e);
-						continue;
-					} catch (IllegalAccessException e) {
-						logger.warn("ModelAdapter must be public.", e);
-						continue;
-					}
-				}
-				NodeList propertyNodes = adapterNode.getChildNodes();
-				Iterable<Node> propertyNodesIterator = new IterableNodeList(propertyNodes);
-				
-				for (Node propertyNode : propertyNodesIterator) {
-					if ((propertyNode instanceof Element) == false) {
-						continue;
-					}
-					Element propertyElement = (Element) propertyNode;
-					String fieldName = null;
-					try {
-						fieldName = propertyElement.getTagName();
-						Field field = adapter.getClass().getDeclaredField(fieldName);
-						field.setAccessible(true);
-						String value = propertyElement.getTextContent();
-						Class<?> type = field.getType();
-						if (type == Integer.class || type == int.class) {
-							field.set(adapter, NumberUtils.toInt(value));
-						} else if (type == Long.class || type == long.class) {
-							field.set(adapter, NumberUtils.toLong(value));
-						} else if (type == Float.class || type == float.class) {
-							field.set(adapter, NumberUtils.toFloat(value));
-						} else if (type == Double.class || type == double.class) {
-							field.set(adapter, NumberUtils.toDouble(value));
-						} else if (type == Boolean.class || type == boolean.class) {
-							field.set(adapter, BooleanUtils.toBoolean(value));
-						} else if (type == String.class) {
-							field.set(adapter, value);
-						} else {
-							logger.warn("unsupported model adapter field data type: " + field.getType().getName());
-						}
-					} catch (SecurityException e) {
-						logger.warn("security error", e);
-					} catch (NoSuchFieldException e) {
-						logger.warn("no such field " + fieldName + " in " + className, e);
-					} catch (IllegalArgumentException e) {
-						throw new UnexpectedConditionError("代入する型はifでチェックしているハズ。", e);
-					} catch (IllegalAccessException e) {
-						throw new UnexpectedConditionError("setAccessible(true)したハズ。", e);
-					}
-				}
-				
-			} catch (ClassNotFoundException e) {
-				logger.warn("class not found (ignored): " + className, e);
-			}
-		}
-	}
-	
-
 	private final Jiemamy jiemamy;
 	
 	private final JiemamyFactory factory;
 	
 	private final Document document;
 	
+	private SmartXpath smartXpath;
+	
 
 	/**
 	 * インスタンスを生成する。
@@ -188,6 +121,8 @@
 		this.jiemamy = jiemamy;
 		factory = jiemamy.getFactory();
 		this.document = document;
+		
+		smartXpath = new SmartXpath(jiemamy);
 	}
 	
 	/**
@@ -207,12 +142,12 @@
 	private DataType getDataType(Element element) {
 		try {
 			if (element.getChildNodes().getLength() == 0 && StringUtils.isEmpty(element.getAttribute("ref")) == false) {
-				return new DomainRefImpl(jiemamy, DomUtil.getUUID(element, CoreQName.REF));
+				return new DomainRefImpl(jiemamy, getUUID(element, CoreQName.REF));
 			} else {
 				String typeCategoryString =
-						(String) XpathUtil.XPATH.evaluate("core:typeCategory/text()", element, XPathConstants.STRING);
+						(String) smartXpath.xpath.evaluate("core:typeCategory/text()", element, XPathConstants.STRING);
 				String typeName =
-						(String) XpathUtil.XPATH.evaluate("core:typeName/text()", element, XPathConstants.STRING);
+						(String) smartXpath.xpath.evaluate("core:typeName/text()", element, XPathConstants.STRING);
 				
 				RootModel rootModel = factory.getRootModel();
 				Dialect dialect;
@@ -254,8 +189,23 @@
 		}
 	}
 	
+	/**
+	 * 要素の属性に設定された値を{@link UUID}として取得する。
+	 * 
+	 * @param domNode ノード
+	 * @param node 属性指定
+	 * @return {@link UUID}
+	 * @throws IllegalArgumentException 引数に{@code null}を与えた場合
+	 */
+	private UUID getUUID(Node domNode, JiemamyQName node) {
+		Validate.notNull(node);
+		
+		String uuidStr = smartXpath.getAttr(domNode, "@" + node.getQNameString()).getValue();
+		return UUIDUtil.valueOfOrRandom(uuidStr);
+	}
+	
 	private void parseAttributes(Element tableElement, TableModel tableModel) {
-		NodeList attributeNodeList = XpathUtil.getNodes(tableElement, "core:attributes/*");
+		NodeList attributeNodeList = smartXpath.getNodes(tableElement, "core:attributes/*");
 		Iterable<Node> attributeIterableNodeList = new IterableNodeList(attributeNodeList);
 		for (Node attributeNode : attributeIterableNodeList) {
 			if ((attributeNode instanceof Element) == false) {
@@ -279,83 +229,80 @@
 	}
 	
 	private void parseColumn(Element columnElement, TableModel tableModel) {
-		ColumnModel columnModel = factory.newModel(ColumnModel.class, DomUtil.getUUID(columnElement, CoreQName.ID));
-		columnModel.setName(XpathUtil.getTextContent(columnElement, EL_CORE_NAME));
-		columnModel.setLogicalName(XpathUtil.getTextContent(columnElement, EL_CORE_LOGICALNAME));
-		columnModel.setDataType(getDataType((Element) XpathUtil.getNode(columnElement, "core:dataType")));
-		columnModel.setDefaultValue(XpathUtil.getTextContent(columnElement, "core:defaultValue"));
+		ColumnModel columnModel = factory.newModel(ColumnModel.class, getUUID(columnElement, CoreQName.ID));
+		columnModel.setName(smartXpath.getTextContent(columnElement, EL_CORE_NAME));
+		columnModel.setLogicalName(smartXpath.getTextContent(columnElement, EL_CORE_LOGICALNAME));
+		columnModel.setDataType(getDataType((Element) smartXpath.getNode(columnElement, "core:dataType")));
+		columnModel.setDefaultValue(smartXpath.getTextContent(columnElement, "core:defaultValue"));
 		
-		Element nnElement = (Element) XpathUtil.getNode(columnElement, "core:notNull");
+		Element nnElement = (Element) smartXpath.getNode(columnElement, "core:notNull");
 		if (nnElement != null) {
-			NotNullConstraint nnModel =
-					factory.newModel(NotNullConstraint.class, DomUtil.getUUID(nnElement, CoreQName.ID));
-			nnModel.setName(XpathUtil.getTextContent(nnElement, EL_CORE_NAME));
+			NotNullConstraint nnModel = factory.newModel(NotNullConstraint.class, getUUID(nnElement, CoreQName.ID));
+			nnModel.setName(smartXpath.getTextContent(nnElement, EL_CORE_NAME));
 			readAdapter(nnElement, nnModel);
 			columnModel.setNotNullConstraint(nnModel);
 		}
 		
-		Element ukElement = (Element) XpathUtil.getNode(columnElement, "core:columnUniqueKey");
+		Element ukElement = (Element) smartXpath.getNode(columnElement, "core:columnUniqueKey");
 		if (ukElement != null) {
-			UniqueKey uniqueKey = factory.newModel(UniqueKey.class, DomUtil.getUUID(ukElement, CoreQName.ID));
-			uniqueKey.setName(XpathUtil.getTextContent(ukElement, EL_CORE_NAME));
+			UniqueKey uniqueKey = factory.newModel(UniqueKey.class, getUUID(ukElement, CoreQName.ID));
+			uniqueKey.setName(smartXpath.getTextContent(ukElement, EL_CORE_NAME));
 			uniqueKey.getKeyColumns().add(factory.newReference(columnModel));
 			readAdapter(ukElement, uniqueKey);
 			columnModel.setUniqueKey(uniqueKey);
 		}
 		
-		Element pkElement = (Element) XpathUtil.getNode(columnElement, "core:columnPrimaryKey");
+		Element pkElement = (Element) smartXpath.getNode(columnElement, "core:columnPrimaryKey");
 		if (pkElement != null) {
-			PrimaryKey primaryKey = factory.newModel(PrimaryKey.class, DomUtil.getUUID(pkElement, CoreQName.ID));
-			primaryKey.setName(XpathUtil.getTextContent(pkElement, EL_CORE_NAME));
+			PrimaryKey primaryKey = factory.newModel(PrimaryKey.class, getUUID(pkElement, CoreQName.ID));
+			primaryKey.setName(smartXpath.getTextContent(pkElement, EL_CORE_NAME));
 			primaryKey.getKeyColumns().add(factory.newReference(columnModel));
 			readAdapter(pkElement, primaryKey);
 			columnModel.setPrimaryKey(primaryKey);
 		}
 		
-		Element checkElement = (Element) XpathUtil.getNode(columnElement, "core:columnCheck");
+		Element checkElement = (Element) smartXpath.getNode(columnElement, "core:columnCheck");
 		if (checkElement != null) {
 			ColumnCheckConstraint checkConstraint =
-					factory.newModel(ColumnCheckConstraint.class, DomUtil.getUUID(checkElement, CoreQName.ID));
-			checkConstraint.setName(XpathUtil.getTextContent(checkElement, EL_CORE_NAME));
-			checkConstraint.setExpression(XpathUtil.getTextContent(checkElement, "core:expression"));
+					factory.newModel(ColumnCheckConstraint.class, getUUID(checkElement, CoreQName.ID));
+			checkConstraint.setName(smartXpath.getTextContent(checkElement, EL_CORE_NAME));
+			checkConstraint.setExpression(smartXpath.getTextContent(checkElement, "core:expression"));
 			readAdapter(checkElement, checkConstraint);
 			columnModel.setCheckConstraint(checkConstraint);
 		}
 		
-		columnModel.setDescription(XpathUtil.getTextContent(columnElement, "core:description"));
+		columnModel.setDescription(smartXpath.getTextContent(columnElement, "core:description"));
 		readAdapter(columnElement, columnModel);
 		tableModel.getAttributes().add(columnModel);
 	}
 	
 	private void parseDataSetSection(RootModel rootModel) {
-		NodeList dataSetNodeList = XpathUtil.getNodes(document, "/core:jiemamy/core:dataSets/core:dataSet");
+		NodeList dataSetNodeList = smartXpath.getNodes(document, "/core:jiemamy/core:dataSets/core:dataSet");
 		Iterable<Node> dataSetIterableNodeList = new IterableNodeList(dataSetNodeList);
 		for (Node dataSetNode : dataSetIterableNodeList) {
 			
-			DataSetModel dataSetModel =
-					factory.newModel(DataSetModel.class, DomUtil.getUUID(dataSetNode, CoreQName.ID));
-			dataSetModel.setName(XpathUtil.getTextContent(dataSetNode, EL_CORE_NAME));
+			DataSetModel dataSetModel = factory.newModel(DataSetModel.class, getUUID(dataSetNode, CoreQName.ID));
+			dataSetModel.setName(smartXpath.getTextContent(dataSetNode, EL_CORE_NAME));
 			
-			NodeList tableRefNodeList = XpathUtil.getNodes(dataSetNode, "core:tableRef");
+			NodeList tableRefNodeList = smartXpath.getNodes(dataSetNode, "core:tableRef");
 			Iterable<Node> tableRefIterableNodeList = new IterableNodeList(tableRefNodeList);
 			for (Node tableRefNode : tableRefIterableNodeList) {
 				
-				TableRef tableRef = new TableRefImpl(jiemamy, DomUtil.getUUID(tableRefNode, CoreQName.REF));
+				TableRef tableRef = new TableRefImpl(jiemamy, getUUID(tableRefNode, CoreQName.REF));
 				List<RecordModel> recordModels = dataSetModel.getRecords().get(tableRef);
 				if (recordModels == null) {
 					recordModels = new ArrayList<RecordModel>();
 				}
 				
-				NodeList recordNodeList = XpathUtil.getNodes(tableRefNode, "core:record");
+				NodeList recordNodeList = smartXpath.getNodes(tableRefNode, "core:record");
 				Iterable<Node> recordIterableNodeList = new IterableNodeList(recordNodeList);
 				for (Node recordNode : recordIterableNodeList) {
-					RecordModel recordModel =
-							factory.newModel(RecordModel.class, DomUtil.getUUID(recordNode, CoreQName.ID));
+					RecordModel recordModel = factory.newModel(RecordModel.class, getUUID(recordNode, CoreQName.ID));
 					
-					NodeList columnRefNodeList = XpathUtil.getNodes(recordNode, "core:columnRef");
+					NodeList columnRefNodeList = smartXpath.getNodes(recordNode, "core:columnRef");
 					Iterable<Node> columnRefIterableNodeList = new IterableNodeList(columnRefNodeList);
 					for (Node columnRefNode : columnRefIterableNodeList) {
-						ColumnRef columnRef = new ColumnRefImpl(jiemamy, DomUtil.getUUID(columnRefNode, CoreQName.REF));
+						ColumnRef columnRef = new ColumnRefImpl(jiemamy, getUUID(columnRefNode, CoreQName.REF));
 						recordModel.getValues().put(columnRef, columnRefNode.getTextContent());
 					}
 					recordModels.add(recordModel);
@@ -368,15 +315,16 @@
 	}
 	
 	private void parseDeferrability(Element keyElement, KeyConstraint keyModel) {
-		Node deferrabilityElement = XpathUtil.getNode(keyElement, "core:deferrability");
+		Node deferrabilityElement = smartXpath.getNode(keyElement, "core:deferrability");
 		
 		if (deferrabilityElement != null) {
 			Deferrability deferrability =
-					factory.newModel(Deferrability.class, DomUtil.getUUID(deferrabilityElement, CoreQName.ID));
-			String deferrableString = XpathUtil.getTextContent(deferrabilityElement, "core:deferrable");
+					factory.newModel(Deferrability.class, getUUID(deferrabilityElement, CoreQName.ID));
+			String deferrableString = smartXpath.getTextContent(deferrabilityElement, "core:deferrable");
 			deferrability.setDeferrable(BooleanUtils.toBoolean(deferrableString));
 			
-			String initiallyCheckTimeString = XpathUtil.getTextContent(deferrabilityElement, "core:initiallyCheckTime");
+			String initiallyCheckTimeString =
+					smartXpath.getTextContent(deferrabilityElement, "core:initiallyCheckTime");
 			if (StringUtils.isEmpty(initiallyCheckTimeString) == false) {
 				deferrability.setInitiallyCheckTime(InitiallyCheckTime.valueOf(initiallyCheckTimeString));
 			}
@@ -387,37 +335,36 @@
 	}
 	
 	private void parseDomainSection(RootModel rootModel) {
-		NodeList domainsNodeList = XpathUtil.getNodes(document, "/core:jiemamy/core:domains/core:domain");
+		NodeList domainsNodeList = smartXpath.getNodes(document, "/core:jiemamy/core:domains/core:domain");
 		Iterable<Node> domainsIterableNodeList = new IterableNodeList(domainsNodeList);
 		for (Node domainNode : domainsIterableNodeList) {
-			DomainModel domainModel = factory.newModel(DomainModel.class, DomUtil.getUUID(domainNode, CoreQName.ID));
-			domainModel.setName(XpathUtil.getTextContent(domainNode, EL_CORE_NAME));
-			domainModel.setLogicalName(XpathUtil.getTextContent(domainNode, EL_CORE_LOGICALNAME));
-			domainModel.setDataType((BuiltinDataType) getDataType((Element) XpathUtil.getNode(domainNode,
+			DomainModel domainModel = factory.newModel(DomainModel.class, getUUID(domainNode, CoreQName.ID));
+			domainModel.setName(smartXpath.getTextContent(domainNode, EL_CORE_NAME));
+			domainModel.setLogicalName(smartXpath.getTextContent(domainNode, EL_CORE_LOGICALNAME));
+			domainModel.setDataType((BuiltinDataType) getDataType((Element) smartXpath.getNode(domainNode,
 					"core:dataType")));
 			
-			Node nnNode = XpathUtil.getNode(domainNode, "core:notNull");
+			Node nnNode = smartXpath.getNode(domainNode, "core:notNull");
 			if (nnNode != null) {
 				Element nnElement = (Element) nnNode;
-				NotNullConstraint nnModel =
-						factory.newModel(NotNullConstraint.class, DomUtil.getUUID(nnNode, CoreQName.ID));
-				nnModel.setName(XpathUtil.getTextContent(nnElement, EL_CORE_NAME));
+				NotNullConstraint nnModel = factory.newModel(NotNullConstraint.class, getUUID(nnNode, CoreQName.ID));
+				nnModel.setName(smartXpath.getTextContent(nnElement, EL_CORE_NAME));
 				readAdapter(nnElement, nnModel);
 				domainModel.setNotNullConstraint(nnModel);
 			}
 			
-			Node checkNode = XpathUtil.getNode(domainNode, "core:columnCheck");
+			Node checkNode = smartXpath.getNode(domainNode, "core:columnCheck");
 			if (checkNode != null) {
 				Element checkElement = (Element) checkNode;
 				ColumnCheckConstraint checkConstraint =
-						factory.newModel(ColumnCheckConstraint.class, DomUtil.getUUID(checkNode, CoreQName.ID));
-				checkConstraint.setExpression(XpathUtil.getTextContent(checkElement, "core:expression"));
+						factory.newModel(ColumnCheckConstraint.class, getUUID(checkNode, CoreQName.ID));
+				checkConstraint.setExpression(smartXpath.getTextContent(checkElement, "core:expression"));
 				readAdapter(checkElement, checkConstraint);
-				checkConstraint.setName(XpathUtil.getTextContent(checkElement, EL_CORE_NAME));
+				checkConstraint.setName(smartXpath.getTextContent(checkElement, EL_CORE_NAME));
 				domainModel.setCheckConstraint(checkConstraint);
 			}
 			
-			domainModel.setDescription(XpathUtil.getTextContent(domainNode, "core:description"));
+			domainModel.setDescription(smartXpath.getTextContent(domainNode, "core:description"));
 			
 			readAdapter((Element) domainNode, domainModel);
 			rootModel.getDomains().add(domainModel);
@@ -425,7 +372,7 @@
 	}
 	
 	private void parseEntitiesSection(RootModel rootModel) {
-		NodeList entitityNodeList = XpathUtil.getNodes(document, "/core:jiemamy/core:entities/*");
+		NodeList entitityNodeList = smartXpath.getNodes(document, "/core:jiemamy/core:entities/*");
 		Iterable<Node> entitityIterableNodeList = new IterableNodeList(entitityNodeList);
 		for (Node entityNode : entitityIterableNodeList) {
 			if ((entityNode instanceof Element) == false) {
@@ -450,30 +397,30 @@
 	}
 	
 	private void parseForeignKey(Element fkElement, TableModel tableModel) {
-		ForeignKey foreignKey = factory.newModel(ForeignKey.class, DomUtil.getUUID(fkElement, CoreQName.ID));
-		foreignKey.setName(XpathUtil.getTextContent(fkElement, EL_CORE_NAME));
-		foreignKey.setLogicalName(XpathUtil.getTextContent(fkElement, EL_CORE_LOGICALNAME));
-		NodeList columnRefNodeList = XpathUtil.getNodes(fkElement, "core:columnRefs/core:columnRef");
+		ForeignKey foreignKey = factory.newModel(ForeignKey.class, getUUID(fkElement, CoreQName.ID));
+		foreignKey.setName(smartXpath.getTextContent(fkElement, EL_CORE_NAME));
+		foreignKey.setLogicalName(smartXpath.getTextContent(fkElement, EL_CORE_LOGICALNAME));
+		NodeList columnRefNodeList = smartXpath.getNodes(fkElement, "core:columnRefs/core:columnRef");
 		Iterable<Node> columnRefIterableNodeList = new IterableNodeList(columnRefNodeList);
 		for (Node node : columnRefIterableNodeList) {
-			ColumnRef columnRef = new ColumnRefImpl(jiemamy, DomUtil.getUUID(node, CoreQName.REF));
+			ColumnRef columnRef = new ColumnRefImpl(jiemamy, getUUID(node, CoreQName.REF));
 			foreignKey.getKeyColumns().add(columnRef);
 		}
-		NodeList referenceColumnRefNodeList = XpathUtil.getNodes(fkElement, "core:referenceColumns/core:columnRef");
+		NodeList referenceColumnRefNodeList = smartXpath.getNodes(fkElement, "core:referenceColumns/core:columnRef");
 		Iterable<Node> referenceColumnRefIterableNodeList = new IterableNodeList(referenceColumnRefNodeList);
 		for (Node node : referenceColumnRefIterableNodeList) {
-			ColumnRef columnRef = new ColumnRefImpl(jiemamy, DomUtil.getUUID(node, CoreQName.REF));
+			ColumnRef columnRef = new ColumnRefImpl(jiemamy, getUUID(node, CoreQName.REF));
 			foreignKey.getReferenceColumns().add(columnRef);
 		}
 		
 		parseDeferrability(fkElement, foreignKey);
 		
-		String onDeleteString = XpathUtil.getTextContent(fkElement, "core:onDelete");
+		String onDeleteString = smartXpath.getTextContent(fkElement, "core:onDelete");
 		if (StringUtils.isEmpty(onDeleteString) == false) {
 			foreignKey.setOnDelete(ReferentialAction.valueOf(onDeleteString));
 		}
 		
-		String onUpdateString = XpathUtil.getTextContent(fkElement, "core:onUpdate");
+		String onUpdateString = smartXpath.getTextContent(fkElement, "core:onUpdate");
 		if (StringUtils.isEmpty(onUpdateString) == false) {
 			foreignKey.setOnUpdate(ReferentialAction.valueOf(onUpdateString));
 		}
@@ -483,28 +430,28 @@
 	}
 	
 	private void parseIndexes(Element tableElement, TableModel tableModel) {
-		NodeList indexNodeList = XpathUtil.getNodes(tableElement, "core:indexes/*");
+		NodeList indexNodeList = smartXpath.getNodes(tableElement, "core:indexes/*");
 		Iterable<Node> indexIterableNodeList = new IterableNodeList(indexNodeList);
 		for (Node indexNode : indexIterableNodeList) {
 			if ((indexNode instanceof Element) == false) {
 				continue;
 			}
 			Element indexElement = (Element) indexNode;
-			IndexModel indexModel = factory.newModel(IndexModel.class, DomUtil.getUUID(indexElement, CoreQName.ID));
-			indexModel.setName(XpathUtil.getTextContent(indexElement, EL_CORE_NAME));
-			indexModel.setUnique(BooleanUtils.toBoolean(XpathUtil.getTextContent(indexElement, "core:unique")));
+			IndexModel indexModel = factory.newModel(IndexModel.class, getUUID(indexElement, CoreQName.ID));
+			indexModel.setName(smartXpath.getTextContent(indexElement, EL_CORE_NAME));
+			indexModel.setUnique(BooleanUtils.toBoolean(smartXpath.getTextContent(indexElement, "core:unique")));
 			
-			NodeList indexColumnNodeList = XpathUtil.getNodes(indexElement, "core:indexColumns/core:indexColumn");
+			NodeList indexColumnNodeList = smartXpath.getNodes(indexElement, "core:indexColumns/core:indexColumn");
 			Iterable<Node> indexColumnIterableNodeList = new IterableNodeList(indexColumnNodeList);
 			for (Node node : indexColumnIterableNodeList) {
 				IndexColumnModel indexColumnModel =
-						factory.newModel(IndexColumnModel.class, DomUtil.getUUID(node, CoreQName.ID));
-				Node columnRefNode = XpathUtil.getNode(node, "core:columnRef");
-				ColumnRef columnRef = new ColumnRefImpl(jiemamy, DomUtil.getUUID(columnRefNode, CoreQName.REF));
+						factory.newModel(IndexColumnModel.class, getUUID(node, CoreQName.ID));
+				Node columnRefNode = smartXpath.getNode(node, "core:columnRef");
+				ColumnRef columnRef = new ColumnRefImpl(jiemamy, getUUID(columnRefNode, CoreQName.REF));
 				indexColumnModel.setColumnRef(columnRef);
 				indexModel.getIndexColumns().add(indexColumnModel);
 				
-				String sortOrderString = XpathUtil.getTextContent(node, "core:sortOrder");
+				String sortOrderString = smartXpath.getTextContent(node, "core:sortOrder");
 				if (StringUtils.isEmpty(sortOrderString) == false) {
 					indexColumnModel.setSortOrder(SortOrder.valueOf(sortOrderString));
 				}
@@ -515,13 +462,13 @@
 	}
 	
 	private void parsePrimaryKey(Element pkElement, TableModel tableModel) {
-		PrimaryKey primaryKey = factory.newModel(PrimaryKey.class, DomUtil.getUUID(pkElement, CoreQName.ID));
-		primaryKey.setName(XpathUtil.getTextContent(pkElement, EL_CORE_NAME));
-		primaryKey.setLogicalName(XpathUtil.getTextContent(pkElement, EL_CORE_LOGICALNAME));
-		NodeList columnRefNodeList = XpathUtil.getNodes(pkElement, "core:columnRefs/core:columnRef");
+		PrimaryKey primaryKey = factory.newModel(PrimaryKey.class, getUUID(pkElement, CoreQName.ID));
+		primaryKey.setName(smartXpath.getTextContent(pkElement, EL_CORE_NAME));
+		primaryKey.setLogicalName(smartXpath.getTextContent(pkElement, EL_CORE_LOGICALNAME));
+		NodeList columnRefNodeList = smartXpath.getNodes(pkElement, "core:columnRefs/core:columnRef");
 		Iterable<Node> columnRefIterableNodeList = new IterableNodeList(columnRefNodeList);
 		for (Node node : columnRefIterableNodeList) {
-			ColumnRef columnRef = new ColumnRefImpl(jiemamy, DomUtil.getUUID(node, CoreQName.REF));
+			ColumnRef columnRef = new ColumnRefImpl(jiemamy, getUUID(node, CoreQName.REF));
 			primaryKey.getKeyColumns().add(columnRef);
 		}
 		
@@ -534,28 +481,28 @@
 	private RootModel parseRoot() throws SerializationException {
 		Element rootElement = document.getDocumentElement();
 		
-		Attr verAttribute = XpathUtil.getAttr(document, "/core:jiemamy/@version");
+		Attr verAttribute = smartXpath.getAttr(document, "/core:jiemamy/@version");
 		String version = verAttribute.getValue();
 		if (Version.SPEC.equals(version) == false) {
 			throw new SerializationException("Version mismatch: serializer=" + Version.SPEC + ", xml=" + version);
 		}
-		RootModel rootModel = factory.getRootModel(DomUtil.getUUID(rootElement, CoreQName.ID));
-		rootModel.setDialectClassName(XpathUtil.getTextContent(document, "/core:jiemamy/core:dialect"));
-		rootModel.setSchemaName(XpathUtil.getTextContent(document, "/core:jiemamy/core:schemaName"));
-		rootModel.setBeginScript(XpathUtil.getTextContent(document, "/core:jiemamy/core:beginScript"));
-		rootModel.setEndScript(XpathUtil.getTextContent(document, "/core:jiemamy/core:endScript"));
-		rootModel.setDescription(XpathUtil.getTextContent(document, "/core:jiemamy/core:description"));
+		RootModel rootModel = factory.getRootModel(getUUID(rootElement, CoreQName.ID));
+		rootModel.setDialectClassName(smartXpath.getTextContent(document, "/core:jiemamy/core:dialect"));
+		rootModel.setSchemaName(smartXpath.getTextContent(document, "/core:jiemamy/core:schemaName"));
+		rootModel.setBeginScript(smartXpath.getTextContent(document, "/core:jiemamy/core:beginScript"));
+		rootModel.setEndScript(smartXpath.getTextContent(document, "/core:jiemamy/core:endScript"));
+		rootModel.setDescription(smartXpath.getTextContent(document, "/core:jiemamy/core:description"));
 		
 		return rootModel;
 	}
 	
 	private TableModel parseTable(Element tableElement) {
-		TableModel tableModel = factory.newModel(TableModel.class, DomUtil.getUUID(tableElement, CoreQName.ID));
-		tableModel.setName(XpathUtil.getTextContent(tableElement, EL_CORE_NAME));
-		tableModel.setLogicalName(XpathUtil.getTextContent(tableElement, EL_CORE_LOGICALNAME));
-		tableModel.setBeginScript(XpathUtil.getTextContent(tableElement, "core:beginScript"));
-		tableModel.setEndScript(XpathUtil.getTextContent(tableElement, "core:endScript"));
-		tableModel.setDescription(XpathUtil.getTextContent(tableElement, "core:description"));
+		TableModel tableModel = factory.newModel(TableModel.class, getUUID(tableElement, CoreQName.ID));
+		tableModel.setName(smartXpath.getTextContent(tableElement, EL_CORE_NAME));
+		tableModel.setLogicalName(smartXpath.getTextContent(tableElement, EL_CORE_LOGICALNAME));
+		tableModel.setBeginScript(smartXpath.getTextContent(tableElement, "core:beginScript"));
+		tableModel.setEndScript(smartXpath.getTextContent(tableElement, "core:endScript"));
+		tableModel.setDescription(smartXpath.getTextContent(tableElement, "core:description"));
 		
 		parseAttributes(tableElement, tableModel);
 		parseIndexes(tableElement, tableModel);
@@ -566,22 +513,22 @@
 	
 	private void parseTableCheckConstraint(Element checkElement, TableModel tableModel) {
 		TableCheckConstraint checkConstraint =
-				factory.newModel(TableCheckConstraint.class, DomUtil.getUUID(checkElement, CoreQName.ID));
-		checkConstraint.setName(XpathUtil.getTextContent(checkElement, EL_CORE_NAME));
-		checkConstraint.setLogicalName(XpathUtil.getTextContent(checkElement, EL_CORE_LOGICALNAME));
-		checkConstraint.setExpression(XpathUtil.getTextContent(checkElement, "core:expression"));
+				factory.newModel(TableCheckConstraint.class, getUUID(checkElement, CoreQName.ID));
+		checkConstraint.setName(smartXpath.getTextContent(checkElement, EL_CORE_NAME));
+		checkConstraint.setLogicalName(smartXpath.getTextContent(checkElement, EL_CORE_LOGICALNAME));
+		checkConstraint.setExpression(smartXpath.getTextContent(checkElement, "core:expression"));
 		readAdapter(checkElement, checkConstraint);
 		tableModel.getAttributes().add(checkConstraint);
 	}
 	
 	private void parseUniqueKey(Element ukElement, TableModel tableModel) {
-		UniqueKey uniqueKey = factory.newModel(UniqueKey.class, DomUtil.getUUID(ukElement, CoreQName.ID));
-		uniqueKey.setName(XpathUtil.getTextContent(ukElement, EL_CORE_NAME));
-		uniqueKey.setLogicalName(XpathUtil.getTextContent(ukElement, EL_CORE_LOGICALNAME));
-		NodeList columnRefNodeList = XpathUtil.getNodes(ukElement, "core:columnRefs/core:columnRef");
+		UniqueKey uniqueKey = factory.newModel(UniqueKey.class, getUUID(ukElement, CoreQName.ID));
+		uniqueKey.setName(smartXpath.getTextContent(ukElement, EL_CORE_NAME));
+		uniqueKey.setLogicalName(smartXpath.getTextContent(ukElement, EL_CORE_LOGICALNAME));
+		NodeList columnRefNodeList = smartXpath.getNodes(ukElement, "core:columnRefs/core:columnRef");
 		Iterable<Node> columnRefIterableNodeList = new IterableNodeList(columnRefNodeList);
 		for (Node node : columnRefIterableNodeList) {
-			ColumnRef columnRef = new ColumnRefImpl(jiemamy, DomUtil.getUUID(node, CoreQName.REF));
+			ColumnRef columnRef = new ColumnRefImpl(jiemamy, getUUID(node, CoreQName.REF));
 			uniqueKey.getKeyColumns().add(columnRef);
 		}
 		
@@ -592,15 +539,86 @@
 	}
 	
 	private ViewModel parseView(Element viewElement) {
-		ViewModel viewModel = factory.newModel(ViewModel.class, DomUtil.getUUID(viewElement, CoreQName.ID));
-		viewModel.setName(XpathUtil.getTextContent(viewElement, EL_CORE_NAME));
-		viewModel.setLogicalName(XpathUtil.getTextContent(viewElement, EL_CORE_LOGICALNAME));
-		viewModel.setBeginScript(XpathUtil.getTextContent(viewElement, "core:beginScript"));
-		viewModel.setEndScript(XpathUtil.getTextContent(viewElement, "core:endScript"));
-		viewModel.setDescription(XpathUtil.getTextContent(viewElement, "core:description"));
-		viewModel.setDefinition(XpathUtil.getTextContent(viewElement, "core:definition"));
+		ViewModel viewModel = factory.newModel(ViewModel.class, getUUID(viewElement, CoreQName.ID));
+		viewModel.setName(smartXpath.getTextContent(viewElement, EL_CORE_NAME));
+		viewModel.setLogicalName(smartXpath.getTextContent(viewElement, EL_CORE_LOGICALNAME));
+		viewModel.setBeginScript(smartXpath.getTextContent(viewElement, "core:beginScript"));
+		viewModel.setEndScript(smartXpath.getTextContent(viewElement, "core:endScript"));
+		viewModel.setDescription(smartXpath.getTextContent(viewElement, "core:description"));
+		viewModel.setDefinition(smartXpath.getTextContent(viewElement, "core:definition"));
 		readAdapter(viewElement, viewModel);
 		return viewModel;
 	}
 	
+	private void readAdapter(Element element, Adaptable jiemamyElement) {
+		NodeList adapterNodeList = smartXpath.getNodes(element, "core:adapter");
+		Iterable<Node> adapterIterator = new IterableNodeList(adapterNodeList);
+		
+		for (Node adapterNode : adapterIterator) {
+			Attr attr = smartXpath.getAttr(adapterNode, "@" + CoreQName.CLASS.getQNameString());
+			String className = attr.getValue();
+			try {
+				Class<?> clazz = Class.forName(className);
+				Object adapter;
+				if (jiemamyElement.hasAdapter(clazz)) {
+					adapter = jiemamyElement.getAdapter(clazz);
+				} else {
+					try {
+						adapter = clazz.newInstance();
+						jiemamyElement.registerAdapter(adapter);
+					} catch (InstantiationException e) {
+						logger.warn("ModelAdapter must have default constructor.", e);
+						continue;
+					} catch (IllegalAccessException e) {
+						logger.warn("ModelAdapter must be public.", e);
+						continue;
+					}
+				}
+				NodeList propertyNodes = adapterNode.getChildNodes();
+				Iterable<Node> propertyNodesIterator = new IterableNodeList(propertyNodes);
+				
+				for (Node propertyNode : propertyNodesIterator) {
+					if ((propertyNode instanceof Element) == false) {
+						continue;
+					}
+					Element propertyElement = (Element) propertyNode;
+					String fieldName = null;
+					try {
+						fieldName = propertyElement.getTagName();
+						Field field = adapter.getClass().getDeclaredField(fieldName);
+						field.setAccessible(true);
+						String value = propertyElement.getTextContent();
+						Class<?> type = field.getType();
+						if (type == Integer.class || type == int.class) {
+							field.set(adapter, NumberUtils.toInt(value));
+						} else if (type == Long.class || type == long.class) {
+							field.set(adapter, NumberUtils.toLong(value));
+						} else if (type == Float.class || type == float.class) {
+							field.set(adapter, NumberUtils.toFloat(value));
+						} else if (type == Double.class || type == double.class) {
+							field.set(adapter, NumberUtils.toDouble(value));
+						} else if (type == Boolean.class || type == boolean.class) {
+							field.set(adapter, BooleanUtils.toBoolean(value));
+						} else if (type == String.class) {
+							field.set(adapter, value);
+						} else {
+							logger.warn("unsupported model adapter field data type: " + field.getType().getName());
+						}
+					} catch (SecurityException e) {
+						logger.warn("security error", e);
+					} catch (NoSuchFieldException e) {
+						logger.warn("no such field " + fieldName + " in " + className, e);
+					} catch (IllegalArgumentException e) {
+						throw new UnexpectedConditionError("代入する型はifでチェックしているハズ。", e);
+					} catch (IllegalAccessException e) {
+						throw new UnexpectedConditionError("setAccessible(true)したハズ。", e);
+					}
+				}
+				
+			} catch (ClassNotFoundException e) {
+				logger.warn("class not found (ignored): " + className, e);
+			}
+		}
+	}
+	
 }

Modified: artemis/trunk/jiemamy-core/src/main/java/org/jiemamy/utils/DomUtil.java
===================================================================
--- artemis/trunk/jiemamy-core/src/main/java/org/jiemamy/utils/DomUtil.java	2009-04-21 01:54:15 UTC (rev 3331)
+++ artemis/trunk/jiemamy-core/src/main/java/org/jiemamy/utils/DomUtil.java	2009-04-21 12:13:44 UTC (rev 3332)
@@ -18,16 +18,12 @@
  */
 package org.jiemamy.utils;
 
-import java.util.UUID;
-
 import javax.xml.namespace.QName;
 
 import org.apache.commons.lang.StringUtils;
 import org.apache.commons.lang.Validate;
-import org.w3c.dom.Attr;
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
-import org.w3c.dom.Node;
 
 import org.jiemamy.exception.UnexpectedConditionError;
 import org.jiemamy.xml.JiemamyQName;
@@ -40,47 +36,6 @@
 public final class DomUtil {
 	
 	/**
-	 * 要素の属性に設定された値を文字列として取得する。
-	 * 
-	 * @param domElement 要素
-	 * @param node 属性指定
-	 * @return 値
-	 * @throws IllegalArgumentException 引数に{@code null}を与えた場合
-	 */
-	public static String getAttributeString(Element domElement, JiemamyQName node) {
-		Attr attr = XpathUtil.getAttr(domElement, "@" + node.getQNameString());
-		return attr.getValue();
-	}
-	
-	/**
-	 * 要素の属性に設定された値を{@link UUID}として取得する。
-	 * 
-	 * @param domNode ノード
-	 * @param node 属性指定
-	 * @return {@link UUID}
-	 * @throws IllegalArgumentException 引数に{@code null}を与えた場合
-	 */
-	public static UUID getUUID(Node domNode, JiemamyQName node) {
-		Validate.notNull(node);
-		return getUUID(domNode, node.getQNameString());
-	}
-	
-	/**
-	 * 要素の属性に設定された値を{@link UUID}として取得する。
-	 * 
-	 * @param domNode ノード
-	 * @param attributeName 属性指定完全修飾名
-	 * @return {@link UUID}
-	 * @throws IllegalArgumentException 引数に{@code null}を与えた場合
-	 */
-	public static UUID getUUID(Node domNode, String attributeName) {
-		Validate.notNull(attributeName);
-		
-		String uuidStr = XpathUtil.getAttr(domNode, "@" + attributeName).getValue();
-		return UUIDUtil.valueOfOrRandom(uuidStr);
-	}
-	
-	/**
 	 * XML要素が、指定された完全修飾名を持つ要素かどうかを調べる。
 	 * 
 	 * @param element 検査対象要素

Added: artemis/trunk/jiemamy-core/src/main/java/org/jiemamy/utils/SmartXpath.java
===================================================================
--- artemis/trunk/jiemamy-core/src/main/java/org/jiemamy/utils/SmartXpath.java	                        (rev 0)
+++ artemis/trunk/jiemamy-core/src/main/java/org/jiemamy/utils/SmartXpath.java	2009-04-21 12:13:44 UTC (rev 3332)
@@ -0,0 +1,136 @@
+/*
+ * Copyright 2007-2009 Jiemamy Project and the Others.
+ * Created on 2009/04/21
+ *
+ * This file is part of Jiemamy.
+ *
+ * Licensed 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.
+ */
+package org.jiemamy.utils;
+
+import javax.xml.xpath.XPath;
+import javax.xml.xpath.XPathConstants;
+import javax.xml.xpath.XPathExpressionException;
+import javax.xml.xpath.XPathFactory;
+
+import org.apache.commons.lang.Validate;
+import org.w3c.dom.Attr;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+import org.jiemamy.Jiemamy;
+import org.jiemamy.exception.UnexpectedConditionError;
+import org.jiemamy.xml.JiemamyNamespaceContext;
+
+/**
+ * TODO for daisuke
+ * 
+ * @author daisuke
+ */
+public class SmartXpath {
+	
+	/** XPathインスタンス */
+	public final XPath xpath = XPathFactory.newInstance().newXPath();
+	
+
+	/**
+	 * インスタンスを生成する。
+	 * 
+	 * @param jiemamy
+	 */
+	public SmartXpath(Jiemamy jiemamy) {
+		xpath.setNamespaceContext(new JiemamyNamespaceContext(jiemamy.getNamespaces()));
+	}
+	
+	/**
+	 * XPath式で特定される{@link Attr}を取得する。
+	 * 
+	 * @param root 対象ノード
+	 * @param strExpr XPath式
+	 * @return 取得した {@link Attr}
+	 * @throws IllegalArgumentException 引数に{@code null}を与えた場合
+	 */
+	public Attr getAttr(Node root, String strExpr) {
+		Validate.notNull(root);
+		Validate.notNull(strExpr);
+		
+		try {
+			return (Attr) xpath.evaluate(strExpr, root, XPathConstants.NODE);
+		} catch (XPathExpressionException e) {
+			throw new UnexpectedConditionError("XPath expression error: " + strExpr, e);
+		}
+	}
+	
+	/**
+	 * XPath式で特定される{@link Node}を取得する。
+	 * 
+	 * @param root 対象ノード
+	 * @param strExpr XPath式
+	 * @return 取得した {@link Node}
+	 * @throws IllegalArgumentException 引数に{@code null}を与えた場合
+	 */
+	public Node getNode(Node root, String strExpr) {
+		Validate.notNull(root);
+		Validate.notNull(strExpr);
+		
+		try {
+			return (Node) xpath.evaluate(strExpr, root, XPathConstants.NODE);
+		} catch (XPathExpressionException e) {
+			throw new UnexpectedConditionError("XPath expression error: " + strExpr, e);
+		}
+	}
+	
+	/**
+	 * XPath式で特定される{@link NodeList}を取得する。
+	 * 
+	 * @param root 対象ノード
+	 * @param strExpr XPath式
+	 * @return 取得した {@link NodeList}
+	 * @throws IllegalArgumentException 引数に{@code null}を与えた場合
+	 */
+	public NodeList getNodes(Node root, String strExpr) {
+		Validate.notNull(root);
+		Validate.notNull(strExpr);
+		
+		try {
+			return (NodeList) xpath.evaluate(strExpr, root, XPathConstants.NODESET);
+		} catch (XPathExpressionException e) {
+			throw new UnexpectedConditionError("XPath expression error: " + strExpr, e);
+		}
+	}
+	
+	/**
+	 * XPath式で特定されるノードの内容文字列を取得する。
+	 * 
+	 *<p> ノードが見つからなかった場合は{@code null}を返す。ノードはあるが空だった場合は空文字列を返す。</p>
+	 * 
+	 * @param root 対象ノード
+	 * @param strExpr XPath式
+	 * @return 取得した文字列
+	 * @throws IllegalArgumentException 引数に{@code null}を与えた場合
+	 */
+	public String getTextContent(Node root, String strExpr) {
+		Validate.notNull(root);
+		Validate.notNull(strExpr);
+		
+		try {
+			Node node = (Node) xpath.evaluate(strExpr, root, XPathConstants.NODE);
+			if (node == null) {
+				return null;
+			}
+			return node.getTextContent();
+		} catch (XPathExpressionException e) {
+			throw new UnexpectedConditionError("XPath expression error: " + strExpr, e);
+		}
+	}
+}


Property changes on: artemis/trunk/jiemamy-core/src/main/java/org/jiemamy/utils/SmartXpath.java
___________________________________________________________________
Added: svn:mime-type
   + text/plain

Deleted: artemis/trunk/jiemamy-core/src/main/java/org/jiemamy/utils/XpathUtil.java
===================================================================
--- artemis/trunk/jiemamy-core/src/main/java/org/jiemamy/utils/XpathUtil.java	2009-04-21 01:54:15 UTC (rev 3331)
+++ artemis/trunk/jiemamy-core/src/main/java/org/jiemamy/utils/XpathUtil.java	2009-04-21 12:13:44 UTC (rev 3332)
@@ -1,134 +0,0 @@
-/*
- * Copyright 2007-2009 Jiemamy Project and the Others.
- * Created on 2009/01/29
- *
- * This file is part of Jiemamy.
- *
- * Licensed 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.
- */
-package org.jiemamy.utils;
-
-import javax.xml.xpath.XPath;
-import javax.xml.xpath.XPathConstants;
-import javax.xml.xpath.XPathExpressionException;
-import javax.xml.xpath.XPathFactory;
-
-import org.apache.commons.lang.Validate;
-import org.w3c.dom.Attr;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-import org.jiemamy.exception.UnexpectedConditionError;
-import org.jiemamy.xml.JiemamyNamespaceContext;
-
-/**
- * XPathを使用するユーティリティクラス。
- * 
- * @author daisuke
- */
-public final class XpathUtil {
-	
-	/** XPathインスタンス */
-	public static final XPath XPATH = XPathFactory.newInstance().newXPath();
-	
-	static {
-		XPATH.setNamespaceContext(new JiemamyNamespaceContext());
-	}
-	
-
-	/**
-	 * XPath式で特定される{@link Attr}を取得する。
-	 * 
-	 * @param root 対象ノード
-	 * @param strExpr XPath式
-	 * @return 取得した {@link Attr}
-	 * @throws IllegalArgumentException 引数に{@code null}を与えた場合
-	 */
-	public static Attr getAttr(Node root, String strExpr) {
-		Validate.notNull(root);
-		Validate.notNull(strExpr);
-		
-		try {
-			return (Attr) XPATH.evaluate(strExpr, root, XPathConstants.NODE);
-		} catch (XPathExpressionException e) {
-			throw new UnexpectedConditionError("XPath expression error: " + strExpr, e);
-		}
-	}
-	
-	/**
-	 * XPath式で特定される{@link Node}を取得する。
-	 * 
-	 * @param root 対象ノード
-	 * @param strExpr XPath式
-	 * @return 取得した {@link Node}
-	 * @throws IllegalArgumentException 引数に{@code null}を与えた場合
-	 */
-	public static Node getNode(Node root, String strExpr) {
-		Validate.notNull(root);
-		Validate.notNull(strExpr);
-		
-		try {
-			return (Node) XPATH.evaluate(strExpr, root, XPathConstants.NODE);
-		} catch (XPathExpressionException e) {
-			throw new UnexpectedConditionError("XPath expression error: " + strExpr, e);
-		}
-	}
-	
-	/**
-	 * XPath式で特定される{@link NodeList}を取得する。
-	 * 
-	 * @param root 対象ノード
-	 * @param strExpr XPath式
-	 * @return 取得した {@link NodeList}
-	 * @throws IllegalArgumentException 引数に{@code null}を与えた場合
-	 */
-	public static NodeList getNodes(Node root, String strExpr) {
-		Validate.notNull(root);
-		Validate.notNull(strExpr);
-		
-		try {
-			return (NodeList) XPATH.evaluate(strExpr, root, XPathConstants.NODESET);
-		} catch (XPathExpressionException e) {
-			throw new UnexpectedConditionError("XPath expression error: " + strExpr, e);
-		}
-	}
-	
-	/**
-	 * XPath式で特定されるノードの内容文字列を取得する。
-	 * 
-	 *<p> ノードが見つからなかった場合は{@code null}を返す。ノードはあるが空だった場合は空文字列を返す。</p>
-	 * 
-	 * @param root 対象ノード
-	 * @param strExpr XPath式
-	 * @return 取得した文字列
-	 * @throws IllegalArgumentException 引数に{@code null}を与えた場合
-	 */
-	public static String getTextContent(Node root, String strExpr) {
-		Validate.notNull(root);
-		Validate.notNull(strExpr);
-		
-		try {
-			Node node = (Node) XPATH.evaluate(strExpr, root, XPathConstants.NODE);
-			if (node == null) {
-				return null;
-			}
-			return node.getTextContent();
-		} catch (XPathExpressionException e) {
-			throw new UnexpectedConditionError("XPath expression error: " + strExpr, e);
-		}
-	}
-	
-	private XpathUtil() {
-	}
-	
-}

Modified: artemis/trunk/jiemamy-core/src/main/java/org/jiemamy/utils/model/DataTypeUtil.java
===================================================================
--- artemis/trunk/jiemamy-core/src/main/java/org/jiemamy/utils/model/DataTypeUtil.java	2009-04-21 01:54:15 UTC (rev 3331)
+++ artemis/trunk/jiemamy-core/src/main/java/org/jiemamy/utils/model/DataTypeUtil.java	2009-04-21 12:13:44 UTC (rev 3332)
@@ -62,7 +62,7 @@
 		if (dataType instanceof DomainRef) {
 			DomainRef domainRef = (DomainRef) dataType;
 			DomainModel domainModel = resolver.resolve(domainRef);
-			builtin = (BuiltinDataType) domainModel.getDataType();
+			builtin = domainModel.getDataType();
 		} else if (dataType instanceof BuiltinDataType) {
 			builtin = (BuiltinDataType) dataType;
 		} else {

Modified: artemis/trunk/jiemamy-core/src/main/java/org/jiemamy/xml/JiemamyNamespaceContext.java
===================================================================
--- artemis/trunk/jiemamy-core/src/main/java/org/jiemamy/xml/JiemamyNamespaceContext.java	2009-04-21 01:54:15 UTC (rev 3331)
+++ artemis/trunk/jiemamy-core/src/main/java/org/jiemamy/xml/JiemamyNamespaceContext.java	2009-04-21 12:13:44 UTC (rev 3332)
@@ -23,6 +23,8 @@
 
 import javax.xml.namespace.NamespaceContext;
 
+import org.apache.commons.lang.Validate;
+
 /**
  * Jiemamy用の{@link NamespaceContext}実装クラス。
  * 
@@ -30,18 +32,32 @@
  */
 public class JiemamyNamespaceContext implements NamespaceContext {
 	
+	private JiemamyNamespace[] namespaces;
+	
+
+	/**
+	 * インスタンスを生成する。
+	 * 
+	 * @param namespaces
+	 * @throws IllegalArgumentException 引数namespaceが{@code null}または空の場合
+	 */
+	public JiemamyNamespaceContext(JiemamyNamespace[] namespaces) {
+		Validate.notEmpty(namespaces);
+		this.namespaces = namespaces.clone();
+	}
+	
 	public String getNamespaceURI(String prefix) {
-		for (JiemamyNamespace ns : CoreNamespace.values()) {
+		for (JiemamyNamespace ns : namespaces) {
 			if (prefix.equals(ns.getPrefix())) {
-				return ns.getNamespaceURI();
+				return ns.getNamespaceURI().toString();
 			}
 		}
 		return null;
 	}
 	
 	public String getPrefix(String namespaceURI) {
-		for (JiemamyNamespace ns : CoreNamespace.values()) {
-			if (namespaceURI.equals(ns.getNamespaceURI())) {
+		for (JiemamyNamespace ns : namespaces) {
+			if (namespaceURI.equals(ns.getNamespaceURI().toString())) {
 				return ns.getPrefix();
 			}
 		}

Copied: artemis/trunk/jiemamy-core/src/test/java/org/jiemamy/utils/SmartXpathTest.java (from rev 3326, artemis/trunk/jiemamy-core/src/test/java/org/jiemamy/utils/XpathUtilTest.java)
===================================================================
--- artemis/trunk/jiemamy-core/src/test/java/org/jiemamy/utils/SmartXpathTest.java	                        (rev 0)
+++ artemis/trunk/jiemamy-core/src/test/java/org/jiemamy/utils/SmartXpathTest.java	2009-04-21 12:13:44 UTC (rev 3332)
@@ -0,0 +1,124 @@
+/*
+ * Copyright 2007-2009 Jiemamy Project and the Others.
+ * Created on 2009/02/03
+ *
+ * This file is part of Jiemamy.
+ *
+ * Licensed 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.
+ */
+package org.jiemamy.utils;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.CoreMatchers.notNullValue;
+import static org.hamcrest.CoreMatchers.nullValue;
+import static org.junit.Assert.assertThat;
+
+import java.io.ByteArrayInputStream;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.w3c.dom.Document;
+
+import org.jiemamy.Jiemamy;
+
+/**
+ * {@link SmartXpath}のテストクラス。
+ * 
+ * @author daisuke
+ */
+public class SmartXpathTest {
+	
+	private static final String XML = //
+			"<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n" //
+					+ "<root xmlns=\"http://jiemamy.org/xml/ns/core\" xmlns:view=\"http://jiemamy.org/xml/ns/view\">\n" //
+					+ "  <foobar id=\"1\">foo</foobar>\n" //
+					+ "  <foobar id=\"2\">bar</foobar>\n" //
+					+ "  <view:hogefuga id=\"3\">hoge</view:hogefuga>\n" //
+					+ "  <view:hogefuga id=\"4\">fuga</view:hogefuga>\n" //
+					+ "  <content id=\"5\">unba</content>\n" //
+					+ "  <empty1 id=\"5\"></empty1>\n" //
+					+ "  <empty2 id=\"6\"/>\n" //
+					+ "  <nil id=\"5\"><nullValue/></nil>\n" //
+					+ "</root>\n";
+	
+	private Document document;
+	
+	private SmartXpath smartXpath;
+	
+
+	/**
+	 * テストを初期化する。
+	 * 
+	 * @throws Exception 例外が発生した場合
+	 */
+	@Before
+	public void setUp() throws Exception {
+		DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
+		documentBuilderFactory.setNamespaceAware(true);
+		DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
+		document = documentBuilder.parse(new ByteArrayInputStream(XML.getBytes("UTF-8")));
+		smartXpath = new SmartXpath(Jiemamy.newInstance());
+	}
+	
+	/**
+	 * テストの情報を破棄する。
+	 * 
+	 * @throws Exception 例外が発生した場合
+	 */
+	@After
+	public void tearDown() throws Exception {
+		document = null;
+		smartXpath = null;
+	}
+	
+	/**
+	 * デフォルトNamespaceのノードが取得できる。
+	 * 
+	 * @throws Exception 例外が発生した場合
+	 */
+	@Test
+	public void test01_デフォルトNamespaceの要素が取得できる() throws Exception {
+		assertThat(smartXpath.getNode(document, "/core:root"), is(notNullValue()));
+		assertThat(smartXpath.getNodes(document, "//core:foobar").getLength(), is(2));
+		assertThat(smartXpath.getNode(document, "/core:root/core:foobar[1]"), is(notNullValue()));
+		assertThat(smartXpath.getNode(document, "/core:root/core:foobar[2]"), is(notNullValue()));
+		assertThat(smartXpath.getNode(document, "/core:root/core:foobar[3]"), is(nullValue()));
+	}
+	
+	/**
+	 * 属性値が取得できる。
+	 * 
+	 * @throws Exception 例外が発生した場合
+	 */
+	@Test
+	public void test03_属性値が取得できる() throws Exception {
+		assertThat(smartXpath.getNode(document, "/core:root/core:foobar[1]/@id").getTextContent(), is("1"));
+		assertThat(smartXpath.getNode(document, "/core:root/core:foobar[2]/@id").getTextContent(), is("2"));
+	}
+	
+	/**
+	 * 要素の値が取得できる。
+	 * 
+	 * @throws Exception 例外が発生した場合
+	 */
+	@Test
+	public void test04_要素の値が取得できる() throws Exception {
+		assertThat(smartXpath.getTextContent(document, "/core:root/core:content"), is("unba"));
+		assertThat(smartXpath.getTextContent(document, "/core:root/core:empty1"), is(""));
+		assertThat(smartXpath.getTextContent(document, "/core:root/core:empty2"), is(""));
+	}
+}


Property changes on: artemis/trunk/jiemamy-core/src/test/java/org/jiemamy/utils/SmartXpathTest.java
___________________________________________________________________
Added: svn:mime-type
   + text/plain

Deleted: artemis/trunk/jiemamy-core/src/test/java/org/jiemamy/utils/XpathUtilTest.java
===================================================================
--- artemis/trunk/jiemamy-core/src/test/java/org/jiemamy/utils/XpathUtilTest.java	2009-04-21 01:54:15 UTC (rev 3331)
+++ artemis/trunk/jiemamy-core/src/test/java/org/jiemamy/utils/XpathUtilTest.java	2009-04-21 12:13:44 UTC (rev 3332)
@@ -1,132 +0,0 @@
-/*
- * Copyright 2007-2009 Jiemamy Project and the Others.
- * Created on 2009/02/03
- *
- * This file is part of Jiemamy.
- *
- * Licensed 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.
- */
-package org.jiemamy.utils;
-
-import static org.hamcrest.CoreMatchers.is;
-import static org.hamcrest.CoreMatchers.notNullValue;
-import static org.hamcrest.CoreMatchers.nullValue;
-import static org.junit.Assert.assertThat;
-
-import java.io.ByteArrayInputStream;
-
-import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.DocumentBuilderFactory;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.w3c.dom.Document;
-
-/**
- * {@link XpathUtil}のテストクラス。
- * 
- * @author daisuke
- */
-public class XpathUtilTest {
-	
-	private static final String XML = //
-			"<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n" //
-					+ "<root xmlns=\"http://jiemamy.org/xml/ns/core\" xmlns:view=\"http://jiemamy.org/xml/ns/view\">\n" //
-					+ "  <foobar id=\"1\">foo</foobar>\n" //
-					+ "  <foobar id=\"2\">bar</foobar>\n" //
-					+ "  <view:hogefuga id=\"3\">hoge</view:hogefuga>\n" //
-					+ "  <view:hogefuga id=\"4\">fuga</view:hogefuga>\n" //
-					+ "  <content id=\"5\">unba</content>\n" //
-					+ "  <empty1 id=\"5\"></empty1>\n" //
-					+ "  <empty2 id=\"6\"/>\n" //
-					+ "  <nil id=\"5\"><nullValue/></nil>\n" //
-					+ "</root>\n";
-	
-	private Document document;
-	
-
-	/**
-	 * テストを初期化する。
-	 * 
-	 * @throws Exception 例外が発生した場合
-	 */
-	@Before
-	public void setUp() throws Exception {
-		DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
-		documentBuilderFactory.setNamespaceAware(true);
-		DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
-		document = documentBuilder.parse(new ByteArrayInputStream(XML.getBytes("UTF-8")));
-	}
-	
-	/**
-	 * テストの情報を破棄する。
-	 * 
-	 * @throws Exception 例外が発生した場合
-	 */
-	@After
-	public void tearDown() throws Exception {
-		document = null;
-	}
-	
-	/**
-	 * デフォルトNamespaceのノードが取得できる。
-	 * 
-	 * @throws Exception 例外が発生した場合
-	 */
-	@Test
-	public void test01_デフォルトNamespaceの要素が取得できる() throws Exception {
-		assertThat(XpathUtil.getNode(document, "/core:root"), is(notNullValue()));
-		assertThat(XpathUtil.getNodes(document, "//core:foobar").getLength(), is(2));
-		assertThat(XpathUtil.getNode(document, "/core:root/core:foobar[1]"), is(notNullValue()));
-		assertThat(XpathUtil.getNode(document, "/core:root/core:foobar[2]"), is(notNullValue()));
-		assertThat(XpathUtil.getNode(document, "/core:root/core:foobar[3]"), is(nullValue()));
-	}
-	
-	/**
-	 * 特定Namespaceのノードが取得できる。
-	 * 
-	 * @throws Exception 例外が発生した場合
-	 */
-	@Test
-	public void test02_特定Namespaceのノードが要素できる() throws Exception {
-		assertThat(XpathUtil.getNodes(document, "//view:hogefuga").getLength(), is(2));
-		assertThat(XpathUtil.getNode(document, "/core:root/view:hogefuga[1]"), is(notNullValue()));
-		assertThat(XpathUtil.getNode(document, "/core:root/view:hogefuga[2]"), is(notNullValue()));
-		assertThat(XpathUtil.getNode(document, "/core:root/view:hogefuga[3]"), is(nullValue()));
-	}
-	
-	/**
-	 * 属性値が取得できる。
-	 * 
-	 * @throws Exception 例外が発生した場合
-	 */
-	@Test
-	public void test03_属性値が取得できる() throws Exception {
-		assertThat(XpathUtil.getNode(document, "/core:root/core:foobar[1]/@id").getTextContent(), is("1"));
-		assertThat(XpathUtil.getNode(document, "/core:root/core:foobar[2]/@id").getTextContent(), is("2"));
-		assertThat(XpathUtil.getNode(document, "/core:root/view:hogefuga[1]/@id").getTextContent(), is("3"));
-	}
-	
-	/**
-	 * 要素の値が取得できる。
-	 * 
-	 * @throws Exception 例外が発生した場合
-	 */
-	@Test
-	public void test04_要素の値が取得できる() throws Exception {
-		assertThat(XpathUtil.getTextContent(document, "/core:root/core:content"), is("unba"));
-		assertThat(XpathUtil.getTextContent(document, "/core:root/core:empty1"), is(""));
-		assertThat(XpathUtil.getTextContent(document, "/core:root/core:empty2"), is(""));
-	}
-}

Modified: artemis/trunk/jiemamy-core/src/test/java/org/jiemamy/xml/JiemamyNamespaceContextTest.java
===================================================================
--- artemis/trunk/jiemamy-core/src/test/java/org/jiemamy/xml/JiemamyNamespaceContextTest.java	2009-04-21 01:54:15 UTC (rev 3331)
+++ artemis/trunk/jiemamy-core/src/test/java/org/jiemamy/xml/JiemamyNamespaceContextTest.java	2009-04-21 12:13:44 UTC (rev 3332)
@@ -21,10 +21,12 @@
 import static org.hamcrest.CoreMatchers.is;
 import static org.junit.Assert.assertThat;
 
-import org.junit.After;
-import org.junit.Before;
+import javax.xml.namespace.NamespaceContext;
+
 import org.junit.Test;
 
+import org.jiemamy.Jiemamy;
+
 /**
  * {@link JiemamyNamespaceContext}のテストクラス。
  * 
@@ -32,42 +34,19 @@
  */
 public class JiemamyNamespaceContextTest {
 	
-	private JiemamyNamespaceContext ctx;
-	
-
 	/**
-	 * テストを初期化する。
-	 * 
-	 * @throws Exception 例外が発生した場合
-	 */
-	@Before
-	public void setUp() throws Exception {
-		ctx = new JiemamyNamespaceContext();
-	}
-	
-	/**
-	 * テストの情報を破棄する。
-	 * 
-	 * @throws Exception 例外が発生した場合
-	 */
-	@After
-	public void tearDown() throws Exception {
-		ctx = null;
-	}
-	
-	/**
 	 * prefixからURIが、URIからprefixが相互変換できる。
 	 * 
 	 * @throws Exception 例外が発生した場合
 	 */
 	@Test
 	public void test01_prefixからURIが_URIからprefixが相互変換できる() throws Exception {
+		NamespaceContext ctx = new JiemamyNamespaceContext(Jiemamy.newInstance().getNamespaces());
 		assertThat(ctx.getNamespaceURI(""), is("http://jiemamy.org/xml/ns/core"));
 		assertThat(ctx.getNamespaceURI("core"), is("http://jiemamy.org/xml/ns/core"));
 		assertThat(ctx.getPrefix("http://jiemamy.org/xml/ns/core"), is(""));
 		
-		assertThat(ctx.getNamespaceURI("view"), is("http://jiemamy.org/xml/ns/view"));
-		assertThat(ctx.getPrefix("http://jiemamy.org/xml/ns/view"), is("view"));
-		
+//		assertThat(ctx.getNamespaceURI("view"), is("http://jiemamy.org/xml/ns/view"));
+//		assertThat(ctx.getPrefix("http://jiemamy.org/xml/ns/view"), is("view"));
 	}
 }

Modified: artemis/trunk/jiemamy-view/src/main/java/org/jiemamy/ArtemisView.java
===================================================================
--- artemis/trunk/jiemamy-view/src/main/java/org/jiemamy/ArtemisView.java	2009-04-21 01:54:15 UTC (rev 3331)
+++ artemis/trunk/jiemamy-view/src/main/java/org/jiemamy/ArtemisView.java	2009-04-21 12:13:44 UTC (rev 3332)
@@ -30,6 +30,8 @@
 import org.jiemamy.internal.enhance.ViewFactoryExtensionEnhancer;
 import org.jiemamy.utils.CollectionsUtil;
 import org.jiemamy.utils.enhancer.Enhance;
+import org.jiemamy.xml.JiemamyNamespace;
+import org.jiemamy.xml.ViewNamespace;
 
 /**
  * Jiemamy {@link Artemis} Implementationに対する、Jiemamy View Specification拡張クラス。
@@ -49,6 +51,10 @@
 		return enhances;
 	}
 	
+	public JiemamyNamespace[] getNamespaces() {
+		return ViewNamespace.values();
+	}
+	
 	public Set<? extends OptionalSpec> getSpecs() {
 		return EnumSet.of(OfficialSpecs.VIEW);
 	}

Modified: artemis/trunk/jiemamy-view/src/main/java/org/jiemamy/internal/enhance/ViewDomSerializerEnhancer.java
===================================================================
--- artemis/trunk/jiemamy-view/src/main/java/org/jiemamy/internal/enhance/ViewDomSerializerEnhancer.java	2009-04-21 01:54:15 UTC (rev 3331)
+++ artemis/trunk/jiemamy-view/src/main/java/org/jiemamy/internal/enhance/ViewDomSerializerEnhancer.java	2009-04-21 12:13:44 UTC (rev 3332)
@@ -21,6 +21,7 @@
 import javax.xml.parsers.ParserConfigurationException;
 
 import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang.Validate;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.w3c.dom.Attr;
@@ -50,11 +51,14 @@
 import org.jiemamy.utils.DomUtil;
 import org.jiemamy.utils.IterableNodeList;
 import org.jiemamy.utils.LogMarker;
-import org.jiemamy.utils.XpathUtil;
+import org.jiemamy.utils.SmartXpath;
+import org.jiemamy.utils.UUIDUtil;
 import org.jiemamy.utils.enhancer.Invocation;
 import org.jiemamy.utils.enhancer.InvocationHandler;
 import org.jiemamy.utils.model.RootModelUtil;
 import org.jiemamy.xml.CoreQName;
+import org.jiemamy.xml.JiemamyQName;
+import org.jiemamy.xml.ViewNamespace;
 import org.jiemamy.xml.ViewQName;
 
 /**
@@ -82,6 +86,8 @@
 		
 		private Jiemamy jiemamy;
 		
+		private SmartXpath smartXpath;
+		
 
 		/**
 		 * インスタンスを生成する。
@@ -92,6 +98,7 @@
 		public JiemamyViewDomSerializer(Jiemamy jiemamy) {
 			super(jiemamy);
 			this.jiemamy = jiemamy;
+			smartXpath = new SmartXpath(jiemamy);
 			logger.info(LogMarker.LIFECYCLE, "JiemamyDomSerializer extended by Jiemamy VIEW Specification");
 		}
 		
@@ -105,9 +112,13 @@
 			}
 			
 			Element rootElement = document.getDocumentElement();
-			// FIXME locationを正式なURLに
-			rootElement.setAttribute("xsi:schemaLocation", rootElement.getAttribute("xsi:schemaLocation")
-					+ " http://jiemamy.org/xml/ns/view ../../main/resources/jiemamy-view.xsd");
+			StringBuilder sb = new StringBuilder();
+			sb.append(rootElement.getAttribute("xsi:schemaLocation"));
+			sb.append(" ");
+			sb.append(ViewNamespace.NS_VIEW.getNamespaceURI().toString());
+			sb.append(" ");
+			sb.append(ViewNamespace.NS_VIEW.getXmlSchemaLocation());
+			rootElement.setAttribute("xsi:schemaLocation", sb.toString());
 			
 			Element diagramPresentationsElement =
 					DomUtil.newChild(document.getDocumentElement(), ViewQName.DIAGRAM_PRESENTATIONS);
@@ -196,7 +207,7 @@
 		protected RootModel toRootModel(Document document) throws SerializationException {
 			RootModel rootModel = super.toRootModel(document);
 			NodeList dpNodeList =
-					XpathUtil.getNodes(document, "/core:jiemamy/view:diagramPresentations/view:diagramPresentation");
+					smartXpath.getNodes(document, "/core:jiemamy/view:diagramPresentations/view:diagramPresentation");
 			Iterable<Node> dpNodeListIterable = new IterableNodeList(dpNodeList);
 			logger.debug("presentation count = " + dpNodeList.getLength());
 			
@@ -208,15 +219,15 @@
 				}
 				Element dpElement = (Element) dpNode;
 				DiagramPresentationModel presentation =
-						factory.newModel(DiagramPresentationModel.class, DomUtil.getUUID(dpElement, CoreQName.ID));
-				presentation.setName(XpathUtil.getTextContent(dpElement, "core:name"));
+						factory.newModel(DiagramPresentationModel.class, getUUID(dpElement, CoreQName.ID));
+				presentation.setName(smartXpath.getTextContent(dpElement, "core:name"));
 				
-				String modeString = XpathUtil.getTextContent(dpElement, "view:mode");
+				String modeString = smartXpath.getTextContent(dpElement, "view:mode");
 				if (StringUtils.isEmpty(modeString) == false) {
 					presentation.setMode(Mode.valueOf(modeString));
 				}
 				
-				String levelString = XpathUtil.getTextContent(dpElement, "view:level");
+				String levelString = smartXpath.getTextContent(dpElement, "view:level");
 				if (StringUtils.isEmpty(levelString) == false) {
 					presentation.setLevel(Level.valueOf(levelString));
 				}
@@ -229,17 +240,32 @@
 			return rootModel;
 		}
 		
+		/**
+		 * 要素の属性に設定された値を{@link UUID}として取得する。
+		 * 
+		 * @param domNode ノード
+		 * @param node 属性指定
+		 * @return {@link UUID}
+		 * @throws IllegalArgumentException 引数に{@code null}を与えた場合
+		 */
+		private UUID getUUID(Node domNode, JiemamyQName node) {
+			Validate.notNull(node);
+			
+			String uuidStr = smartXpath.getAttr(domNode, "@" + node.getQNameString()).getValue();
+			return UUIDUtil.valueOfOrRandom(uuidStr);
+		}
+		
 		private void processConnectionProfile(JiemamyFactory factory, DiagramPresentationModel presentation,
 				Element dpElement) {
 			RootModel rootModel = factory.getRootModel();
 			NodeList connectionProfileNodeList =
-					XpathUtil.getNodes(dpElement, "view:connectionProfiles/view:connectionProfile");
+					smartXpath.getNodes(dpElement, "view:connectionProfiles/view:connectionProfile");
 			Iterable<Node> connectionProfileNodeListIterable = new IterableNodeList(connectionProfileNodeList);
 			for (Node connectionProfileNode : connectionProfileNodeListIterable) {
 				ConnectionAdapter connectionAdapter;
-				Node objectRefNode = XpathUtil.getNode(connectionProfileNode, "view:connectionObjectRef");
+				Node objectRefNode = smartXpath.getNode(connectionProfileNode, "view:connectionObjectRef");
 				if (objectRefNode != null) {
-					UUID refId = DomUtil.getUUID(objectRefNode, CoreQName.REF);
+					UUID refId = getUUID(objectRefNode, CoreQName.REF);
 					JiemamyElement jElement = RootModelUtil.findJiemamyElement(rootModel, refId);
 					if (jElement == null) {
 						logger.error("null element: " + refId.toString());
@@ -254,14 +280,14 @@
 					continue;
 				}
 				ConnectionProfile connectionProfile =
-						factory.newModel(ConnectionProfile.class, DomUtil.getUUID(connectionProfileNode, CoreQName.ID));
+						factory.newModel(ConnectionProfile.class, getUUID(connectionProfileNode, CoreQName.ID));
 				
 				NodeList bendpointNodeList =
-						XpathUtil.getNodes(connectionProfileNode, "view:bendpoints/view:bendpoint");
+						smartXpath.getNodes(connectionProfileNode, "view:bendpoints/view:bendpoint");
 				Iterable<Node> bendpointNodeListIterable = new IterableNodeList(bendpointNodeList);
 				for (Node bendpointNode : bendpointNodeListIterable) {
-					int x = Integer.valueOf(XpathUtil.getAttr(bendpointNode, "@x").getValue());
-					int y = Integer.valueOf(XpathUtil.getAttr(bendpointNode, "@y").getValue());
+					int x = Integer.valueOf(smartXpath.getAttr(bendpointNode, "@x").getValue());
+					int y = Integer.valueOf(smartXpath.getAttr(bendpointNode, "@y").getValue());
 					connectionProfile.getBendpoints().add(new JmPoint(x, y));
 				}
 				presentation.getConnectionProfiles().put(connectionAdapter, connectionProfile);
@@ -270,13 +296,13 @@
 		
 		private void processNodeProfile(JiemamyFactory factory, DiagramPresentationModel presentation, Element dpElement) {
 			RootModel rootModel = factory.getRootModel();
-			NodeList nodeProfileNodeList = XpathUtil.getNodes(dpElement, "view:nodeProfiles/view:nodeProfile");
+			NodeList nodeProfileNodeList = smartXpath.getNodes(dpElement, "view:nodeProfiles/view:nodeProfile");
 			Iterable<Node> nodeProfileNodeListIterable = new IterableNodeList(nodeProfileNodeList);
 			for (Node nodeProfileNode : nodeProfileNodeListIterable) {
 				NodeAdapter nodeAdapter;
-				Node objectRefNode = XpathUtil.getNode(nodeProfileNode, "view:nodeObjectRef");
+				Node objectRefNode = smartXpath.getNode(nodeProfileNode, "view:nodeObjectRef");
 				if (objectRefNode != null) {
-					UUID refId = DomUtil.getUUID(objectRefNode, CoreQName.REF);
+					UUID refId = getUUID(objectRefNode, CoreQName.REF);
 					JiemamyElement jElement = RootModelUtil.findJiemamyElement(rootModel, refId);
 					if (jElement == null) {
 						logger.error("null element: " + refId.toString());
@@ -288,27 +314,25 @@
 						continue;
 					}
 				} else {
-					Node stickytNode = XpathUtil.getNode(nodeProfileNode, "view:sticky");
-					StickyModel stickyModel =
-							factory.newModel(StickyModel.class, DomUtil.getUUID(stickytNode, CoreQName.ID));
-					stickyModel.setContents(XpathUtil.getTextContent(stickytNode, "view:contents"));
+					Node stickytNode = smartXpath.getNode(nodeProfileNode, "view:sticky");
+					StickyModel stickyModel = factory.newModel(StickyModel.class, getUUID(stickytNode, CoreQName.ID));
+					stickyModel.setContents(smartXpath.getTextContent(stickytNode, "view:contents"));
 					nodeAdapter = stickyModel;
 				}
-				int x = Integer.valueOf(XpathUtil.getAttr(nodeProfileNode, "view:boundary/@x").getValue());
-				int y = Integer.valueOf(XpathUtil.getAttr(nodeProfileNode, "view:boundary/@y").getValue());
-				int width = Integer.valueOf(XpathUtil.getAttr(nodeProfileNode, "view:boundary/@width").getValue());
-				int height = Integer.valueOf(XpathUtil.getAttr(nodeProfileNode, "view:boundary/@height").getValue());
+				int x = Integer.valueOf(smartXpath.getAttr(nodeProfileNode, "view:boundary/@x").getValue());
+				int y = Integer.valueOf(smartXpath.getAttr(nodeProfileNode, "view:boundary/@y").getValue());
+				int width = Integer.valueOf(smartXpath.getAttr(nodeProfileNode, "view:boundary/@width").getValue());
+				int height = Integer.valueOf(smartXpath.getAttr(nodeProfileNode, "view:boundary/@height").getValue());
 				
-				Attr colorAttr = XpathUtil.getAttr(nodeProfileNode, "view:boundary/@color");
+				Attr colorAttr = smartXpath.getAttr(nodeProfileNode, "view:boundary/@color");
 				JmColor color = colorAttr == null ? null : JmColor.parse(colorAttr.getValue());
 				
-				NodeProfile nodeProfile =
-						factory.newModel(NodeProfile.class, DomUtil.getUUID(nodeProfileNode, CoreQName.ID));
+				NodeProfile nodeProfile = factory.newModel(NodeProfile.class, getUUID(nodeProfileNode, CoreQName.ID));
 				nodeProfile.setBoundary(new JmRectangle(x, y, width, height));
 				nodeProfile.setColor(color);
 				presentation.getNodeProfiles().put(nodeAdapter, nodeProfile);
 			}
-			presentation.setName(XpathUtil.getTextContent(dpElement, "core:name"));
+			presentation.setName(smartXpath.getTextContent(dpElement, "core:name"));
 		}
 	}
 }

Modified: zeus/trunk/jiemamy-spec-core/src/main/java/org/jiemamy/Jiemamy.java
===================================================================
--- zeus/trunk/jiemamy-spec-core/src/main/java/org/jiemamy/Jiemamy.java	2009-04-21 01:54:15 UTC (rev 3331)
+++ zeus/trunk/jiemamy-spec-core/src/main/java/org/jiemamy/Jiemamy.java	2009-04-21 12:13:44 UTC (rev 3332)
@@ -31,6 +31,7 @@
 import org.jiemamy.model.RootModel;
 import org.jiemamy.model.sql.SqlStatement;
 import org.jiemamy.serializer.JiemamySerializer;
+import org.jiemamy.xml.JiemamyNamespace;
 
 /**
  * Jiemamyのコントロール中枢クラス。
@@ -258,6 +259,16 @@
 	}
 	
 	/**
+	 * TODO for daisuke
+	 * 
+	 * @return
+	 * @since 0.2
+	 */
+	public JiemamyNamespace[] getNamespaces() {
+		return defaultImplementation.getNamespaces();
+	}
+	
+	/**
 	 * 参照リゾルバを取得する。
 	 * 
 	 * @return 参照リゾルバ

Modified: zeus/trunk/jiemamy-spec-core/src/main/java/org/jiemamy/JiemamyImplementation.java
===================================================================
--- zeus/trunk/jiemamy-spec-core/src/main/java/org/jiemamy/JiemamyImplementation.java	2009-04-21 01:54:15 UTC (rev 3331)
+++ zeus/trunk/jiemamy-spec-core/src/main/java/org/jiemamy/JiemamyImplementation.java	2009-04-21 12:13:44 UTC (rev 3332)
@@ -22,6 +22,7 @@
 
 import org.jiemamy.facade.JiemamyFacade;
 import org.jiemamy.serializer.JiemamySerializer;
+import org.jiemamy.xml.JiemamyNamespace;
 
 /**
  * Jiemamy実装(及び仕様範囲)を表すインターフェイス。
@@ -59,6 +60,14 @@
 	JiemamyFactory getFactory(Jiemamy jiemamy);
 	
 	/**
+	 * TODO for daisuke
+	 * 
+	 * @return
+	 * @since 0.2
+	 */
+	JiemamyNamespace[] getNamespaces();
+	
+	/**
 	 * 参照リゾルバを取得する。
 	 * 
 	 * <p>{@code null}を返してはならない。</p>

Modified: zeus/trunk/jiemamy-spec-core/src/main/java/org/jiemamy/xml/CoreNamespace.java
===================================================================
--- zeus/trunk/jiemamy-spec-core/src/main/java/org/jiemamy/xml/CoreNamespace.java	2009-04-21 01:54:15 UTC (rev 3331)
+++ zeus/trunk/jiemamy-spec-core/src/main/java/org/jiemamy/xml/CoreNamespace.java	2009-04-21 12:13:44 UTC (rev 3332)
@@ -18,11 +18,14 @@
  */
 package org.jiemamy.xml;
 
+import java.net.URI;
+import java.net.URISyntaxException;
+
+import org.jiemamy.exception.UnexpectedConditionError;
+
 /**
  * XML名前空間定数クラス。
  * 
- * TODO VIEWとかDIFFがCOREにいるので排除
- * 
  * @since 0.2
  * @author daisuke
  */
@@ -38,14 +41,10 @@
 	NS_XSI("xsi", "http://www.w3.org/2001/XMLSchema-instance"),
 
 	/** Jiemamy core specifications */
-	NS_CORE("", "http://jiemamy.org/xml/ns/core"),
+	NS_CORE("", "http://jiemamy.org/xml/ns/core", "http://jiemamy.org/xml/0.2.0/jiemamy-core.xsd"),
 
-	/** Jiemamy view specifications */
-	@Deprecated
-	NS_VIEW("view", "http://jiemamy.org/xml/ns/view"),
-
 	/** Jiemamy core specifications */
-	NS_DEFAULT("core", "http://jiemamy.org/xml/ns/core"),
+	NS_DEFAULT("core", "http://jiemamy.org/xml/ns/core", "http://jiemamy.org/xml/0.2.0/jiemamy-core.xsd"),
 
 	/**  */
 	NONE("", "");
@@ -54,19 +53,34 @@
 	private final String prefix;
 	
 	/** 名前空間URL */
-	private final String namespaceURI;
+	private final URI namespaceURI;
 	
+	private final String xmlSchemaLocation;
+	
 
 	CoreNamespace(String prefix, String namespaceURI) {
+		this(prefix, namespaceURI, null);
+	}
+	
+	CoreNamespace(String prefix, String namespaceURI, String xmlSchemaLocation) {
 		this.prefix = prefix;
-		this.namespaceURI = namespaceURI;
+		try {
+			this.namespaceURI = new URI(namespaceURI);
+			this.xmlSchemaLocation = xmlSchemaLocation;
+		} catch (URISyntaxException e) {
+			throw new UnexpectedConditionError("URI記述ミス?", e);
+		}
 	}
 	
-	public String getNamespaceURI() {
+	public URI getNamespaceURI() {
 		return namespaceURI;
 	}
 	
 	public String getPrefix() {
 		return prefix;
 	}
+	
+	public String getXmlSchemaLocation() {
+		return xmlSchemaLocation;
+	}
 }

Modified: zeus/trunk/jiemamy-spec-core/src/main/java/org/jiemamy/xml/CoreQName.java
===================================================================
--- zeus/trunk/jiemamy-spec-core/src/main/java/org/jiemamy/xml/CoreQName.java	2009-04-21 01:54:15 UTC (rev 3331)
+++ zeus/trunk/jiemamy-spec-core/src/main/java/org/jiemamy/xml/CoreQName.java	2009-04-21 12:13:44 UTC (rev 3332)
@@ -213,7 +213,7 @@
 	
 
 	CoreQName(JiemamyNamespace namespace, String localPart) {
-		qName = new QName(namespace.getNamespaceURI(), localPart, namespace.getPrefix());
+		qName = new QName(namespace.getNamespaceURI().toString(), localPart, namespace.getPrefix());
 	}
 	
 	public QName getQName() {

Modified: zeus/trunk/jiemamy-spec-core/src/main/java/org/jiemamy/xml/JiemamyNamespace.java
===================================================================
--- zeus/trunk/jiemamy-spec-core/src/main/java/org/jiemamy/xml/JiemamyNamespace.java	2009-04-21 01:54:15 UTC (rev 3331)
+++ zeus/trunk/jiemamy-spec-core/src/main/java/org/jiemamy/xml/JiemamyNamespace.java	2009-04-21 12:13:44 UTC (rev 3332)
@@ -18,6 +18,8 @@
  */
 package org.jiemamy.xml;
 
+import java.net.URI;
+
 /**
  * Jiemamyで使用するXML名前空間を表すインターフェイス。
  * 
@@ -31,7 +33,7 @@
 	 * @return 名前空間URI
 	 * @since 0.2
 	 */
-	String getNamespaceURI();
+	URI getNamespaceURI();
 	
 	/**
 	 * 名前空間prefixを取得する。
@@ -41,4 +43,11 @@
 	 */
 	String getPrefix();
 	
+	/**
+	 * TODO for daisuke
+	 * 
+	 * @return XMLスキーマのURL. may be null.
+	 * @since 0.2
+	 */
+	String getXmlSchemaLocation();
 }

Modified: zeus/trunk/jiemamy-spec-core/src/main/resources/sample.xml
===================================================================
--- zeus/trunk/jiemamy-spec-core/src/main/resources/sample.xml	2009-04-21 01:54:15 UTC (rev 3331)
+++ zeus/trunk/jiemamy-spec-core/src/main/resources/sample.xml	2009-04-21 12:13:44 UTC (rev 3332)
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<jiemamy xmlns="http://jiemamy.org/xml/ns/core" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" id="d5a96af3-b1e9-4285-a8ef-c491ce5ae308" xsi:schemaLocation="http://jiemamy.org/xml/ns/core ../../main/resources/jiemamy-core.xsd http://jiemamy.org/xml/ns/view ../../main/resources/jiemamy-view.xsd" version="0.2-SNAPSHOT">
+<jiemamy xmlns="http://jiemamy.org/xml/ns/core" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" id="d5a96af3-b1e9-4285-a8ef-c491ce5ae308" xsi:schemaLocation="http://jiemamy.org/xml/ns/core http://jiemamy.org/xml/0.2.0/jiemamy-core.xsd http://jiemamy.org/xml/ns/view http://jiemamy.org/xml/0.2.0/jiemamy-view.xsd" version="0.2-SNAPSHOT">
   <dialect>org.jiemamy.dialect.mysql.MySqlDialect</dialect>
   <schemaName>FOO</schemaName>
   <description>Jiemamyテストモデル1</description>

Modified: zeus/trunk/jiemamy-spec-view/src/main/java/org/jiemamy/xml/ViewNamespace.java
===================================================================
--- zeus/trunk/jiemamy-spec-view/src/main/java/org/jiemamy/xml/ViewNamespace.java	2009-04-21 01:54:15 UTC (rev 3331)
+++ zeus/trunk/jiemamy-spec-view/src/main/java/org/jiemamy/xml/ViewNamespace.java	2009-04-21 12:13:44 UTC (rev 3332)
@@ -18,6 +18,11 @@
  */
 package org.jiemamy.xml;
 
+import java.net.URI;
+import java.net.URISyntaxException;
+
+import org.jiemamy.exception.UnexpectedConditionError;
+
 /**
  * XML名前空間定数クラス。
  * 
@@ -35,20 +40,35 @@
 	/** 名前空間prefix */
 	private final String prefix;
 	
-	/** 名前空間URL */
-	private final String namespaceURI;
+	/** 名前空間URI */
+	private final URI namespaceURI;
 	
+	private final String xmlSchemaLocation;
+	
 
 	ViewNamespace(String prefix, String namespaceURI) {
+		this(prefix, namespaceURI, null);
+	}
+	
+	ViewNamespace(String prefix, String namespaceURI, String xmlSchemaLocation) {
 		this.prefix = prefix;
-		this.namespaceURI = namespaceURI;
+		try {
+			this.namespaceURI = new URI(namespaceURI);
+			this.xmlSchemaLocation = xmlSchemaLocation;
+		} catch (URISyntaxException e) {
+			throw new UnexpectedConditionError("URI記述ミス?", e);
+		}
 	}
 	
-	public String getNamespaceURI() {
+	public URI getNamespaceURI() {
 		return namespaceURI;
 	}
 	
 	public String getPrefix() {
 		return prefix;
 	}
+	
+	public String getXmlSchemaLocation() {
+		return xmlSchemaLocation;
+	}
 }

Modified: zeus/trunk/jiemamy-spec-view/src/main/java/org/jiemamy/xml/ViewQName.java
===================================================================
--- zeus/trunk/jiemamy-spec-view/src/main/java/org/jiemamy/xml/ViewQName.java	2009-04-21 01:54:15 UTC (rev 3331)
+++ zeus/trunk/jiemamy-spec-view/src/main/java/org/jiemamy/xml/ViewQName.java	2009-04-21 12:13:44 UTC (rev 3332)
@@ -78,7 +78,7 @@
 	
 
 	ViewQName(JiemamyNamespace namespace, String localPart) {
-		qName = new QName(namespace.getNamespaceURI(), localPart, namespace.getPrefix());
+		qName = new QName(namespace.getNamespaceURI().toString(), localPart, namespace.getPrefix());
 	}
 	
 	public QName getQName() {



Jiemamy-notify メーリングリストの案内
Back to archive index