[Jiemamy-notify:2608] commit [3577] [CORE-134] バージョンチェックを実装。

アーカイブの一覧に戻る

svnno****@sourc***** svnno****@sourc*****
2009年 9月 15日 (火) 11:44:51 JST


Revision: 3577
          http://sourceforge.jp/projects/jiemamy/svn/view?view=rev&revision=3577
Author:   daisuke_m
Date:     2009-09-15 11:44:51 +0900 (Tue, 15 Sep 2009)

Log Message:
-----------
[CORE-134] バージョンチェックを実装。

Modified Paths:
--------------
    artemis/trunk/jiemamy-core/src/main/java/org/jiemamy/Artemis.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
    zeus/trunk/jiemamy-spec-core/src/main/java/org/jiemamy/Version.java

Added Paths:
-----------
    artemis/trunk/jiemamy-core/src/main/java/org/jiemamy/ArtemisVersion.java
    artemis/trunk/jiemamy-core/src/test/java/org/jiemamy/ArtemisVersionTest.java

Removed Paths:
-------------
    zeus/trunk/jiemamy-spec-core/src/test/java/org/jiemamy/VersionTest.java

Modified: artemis/trunk/jiemamy-core/src/main/java/org/jiemamy/Artemis.java
===================================================================
--- artemis/trunk/jiemamy-core/src/main/java/org/jiemamy/Artemis.java	2009-09-15 02:00:05 UTC (rev 3576)
+++ artemis/trunk/jiemamy-core/src/main/java/org/jiemamy/Artemis.java	2009-09-15 02:44:51 UTC (rev 3577)
@@ -165,44 +165,4 @@
 	public <T extends JiemamyFacade>T newFacade(Jiemamy jiemamy, Class<T> clazz) {
 		return getFactory(jiemamy).newFacade(clazz);
 	}
-	
-
-	private static class ArtemisVersion implements Version {
-		
-		static final ArtemisVersion INSTANCE = new ArtemisVersion();
-		
-		private final int release = 0;
-		
-
-		private ArtemisVersion() {
-		}
-		
-		public int getMajor() {
-			return MAJOR;
-		}
-		
-		public int getMinor() {
-			return MINOR;
-		}
-		
-		public int getRelease() {
-			return release;
-		}
-		
-		@Deprecated
-		public boolean isSnapshot() {
-			return false;
-		}
-		
-		@Override
-		public String toString() {
-			StringBuilder sb = new StringBuilder();
-			sb.append(MAJOR);
-			sb.append(".");
-			sb.append(MINOR);
-			sb.append(".");
-			sb.append(release);
-			return sb.toString();
-		}
-	}
 }

Added: artemis/trunk/jiemamy-core/src/main/java/org/jiemamy/ArtemisVersion.java
===================================================================
--- artemis/trunk/jiemamy-core/src/main/java/org/jiemamy/ArtemisVersion.java	                        (rev 0)
+++ artemis/trunk/jiemamy-core/src/main/java/org/jiemamy/ArtemisVersion.java	2009-09-15 02:44:51 UTC (rev 3577)
@@ -0,0 +1,176 @@
+/*
+ * Copyright 2007-2009 Jiemamy Project and the Others.
+ * Created on 2009/09/15
+ *
+ * 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;
+
+/**
+ * {@link Version}の実装クラス。
+ * 
+ * @since 0.3
+ * @author daisuke
+ */
+public class ArtemisVersion implements Version {
+	
+	static final ArtemisVersion INSTANCE = new ArtemisVersion(0, 3, 0, true);
+	
+
+	/**
+	 * 文字列をパースして、バージョンオブジェクトを生成する。
+	 * 
+	 * @param versionString バージョン文字列
+	 * @return バージョンオブジェクト
+	 * @throws IllegalArgumentException 引数がバージョン番号として無効な場合
+	 * @since 0.3
+	 */
+	public static Version parse(String versionString) {
+		int major = 0;
+		int minor = 0;
+		int release = 0;
+		boolean snapshot = false;
+		if (versionString.endsWith("-SNAPSHOT")) {
+			snapshot = true;
+			versionString = versionString.substring(0, versionString.length() - "-SNAPSHOT".length()); // CHECKSTYLE IGNORE THIS LINE
+		}
+		
+		String[] elements = versionString.split("[\\.]");
+		try {
+			switch (elements.length) {
+				case 3:
+					release = Integer.parseInt(elements[2]);
+					
+				case 2:
+					major = Integer.parseInt(elements[0]);
+					minor = Integer.parseInt(elements[1]);
+					break;
+				
+				default:
+					throw new IllegalArgumentException(versionString);
+			}
+		} catch (NumberFormatException e) {
+			throw new IllegalArgumentException(versionString, e);
+		}
+		
+		return new ArtemisVersion(major, minor, release, snapshot);
+	}
+	
+
+	private final int major;
+	
+	private final int minor;
+	
+	private final int release;
+	
+	private final boolean snapshot;
+	
+
+	private ArtemisVersion(int major, int minor, int release, boolean snapshot) {
+		this.major = major;
+		this.minor = minor;
+		this.release = release;
+		this.snapshot = snapshot;
+	}
+	
+	public boolean canDeserialize(Version target) {
+		if (target == null) {
+			return false;
+		}
+		if (major != target.getMajor()) {
+			return false;
+		}
+		if (minor < target.getMinor()) {
+			return false;
+		}
+		return true;
+	}
+	
+	@Override
+	public boolean equals(Object obj) {
+		if (this == obj) {
+			return true;
+		}
+		if (obj == null) {
+			return false;
+		}
+		if (Version.class.isAssignableFrom(obj.getClass()) == false) {
+			return false;
+		}
+		Version other = (Version) obj;
+		if (major != other.getMajor()) {
+			return false;
+		}
+		if (minor != other.getMinor()) {
+			return false;
+		}
+		if (release != other.getRelease()) {
+			return false;
+		}
+		if (snapshot != other.isSnapshot()) {
+			return false;
+		}
+		return true;
+	}
+	
+	public int getMajor() {
+		return major;
+	}
+	
+	public int getMinor() {
+		return minor;
+	}
+	
+	public int getRelease() {
+		return release;
+	}
+	
+	@Override
+	public int hashCode() {
+		final int prime = 31;
+		int result = 1;
+		result = prime * result + major;
+		result = prime * result + minor;
+		result = prime * result + release;
+		result = prime * result + (snapshot ? 1231 : 1237); // CHECKSTYLE IGNORE THIS LINE
+		return result;
+	}
+	
+	public boolean isSnapshot() {
+		return snapshot;
+	}
+	
+	@Override
+	public String toString() {
+		StringBuilder sb = new StringBuilder();
+		sb.append(major);
+		sb.append(".");
+		sb.append(minor);
+		sb.append(".");
+		sb.append(release);
+		if (snapshot) {
+			sb.append("-SNAPSHOT");
+		}
+		return sb.toString();
+	}
+	
+	public String toStringSpec() {
+		StringBuilder sb = new StringBuilder();
+		sb.append(major);
+		sb.append(".");
+		sb.append(minor);
+		return sb.toString();
+	}
+}


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

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-09-15 02:00:05 UTC (rev 3576)
+++ artemis/trunk/jiemamy-core/src/main/java/org/jiemamy/internal/serializer/JiemamyDomBuilder.java	2009-09-15 02:44:51 UTC (rev 3577)
@@ -257,9 +257,11 @@
 		DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
 		Document document = documentBuilder.newDocument();
 		
+		Version version = rootModel.getJiemamy().getDefaultImplementation().getVersion();
+		
 		Element rootElement = DomUtil.newElement(document, CoreQName.JIEMAMY);
 		rootElement.setAttribute(CoreQName.ID.getQNameString(), rootModel.getId().toString());
-		rootElement.setAttribute(CoreQName.VERSION.getQNameString(), Version.SPEC);
+		rootElement.setAttribute(CoreQName.VERSION.getQNameString(), version.toStringSpec());
 		rootElement.setAttribute("xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance");
 		
 		StringBuilder sb = new StringBuilder();

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-09-15 02:00:05 UTC (rev 3576)
+++ artemis/trunk/jiemamy-core/src/main/java/org/jiemamy/internal/serializer/JiemamyDomParser.java	2009-09-15 02:44:51 UTC (rev 3577)
@@ -41,8 +41,10 @@
 import org.w3c.dom.Node;
 import org.w3c.dom.NodeList;
 
+import org.jiemamy.ArtemisVersion;
 import org.jiemamy.Jiemamy;
 import org.jiemamy.JiemamyFactory;
+import org.jiemamy.Version;
 import org.jiemamy.dialect.BuiltinDataTypeMold;
 import org.jiemamy.dialect.Dialect;
 import org.jiemamy.dialect.internal.BuiltinDataTypeMoldImpl;
@@ -488,12 +490,15 @@
 	private RootModel parseRoot() throws SerializationException {
 		Element rootElement = document.getDocumentElement();
 		
+		// バージョン互換性をチェック
 		Attr verAttribute = smartXpath.getAttr(document, "/core:jiemamy/@version");
 		String version = verAttribute.getValue();
-		// FIXME バージョンチェックせよ。
-//		if (Version.SPEC.equals(version) == false) {
-//			throw new SerializationException("Version mismatch: serializer=" + Version.SPEC + ", xml=" + version);
-//		}
+		Version myVersion = jiemamy.getDefaultImplementation().getVersion();
+		if (myVersion.canDeserialize(ArtemisVersion.parse(version)) == false) {
+			throw new SerializationException("Version mismatch: serializer=" + myVersion.toStringSpec() + ", xml="
+					+ version);
+		}
+		
 		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"));

Added: artemis/trunk/jiemamy-core/src/test/java/org/jiemamy/ArtemisVersionTest.java
===================================================================
--- artemis/trunk/jiemamy-core/src/test/java/org/jiemamy/ArtemisVersionTest.java	                        (rev 0)
+++ artemis/trunk/jiemamy-core/src/test/java/org/jiemamy/ArtemisVersionTest.java	2009-09-15 02:44:51 UTC (rev 3577)
@@ -0,0 +1,97 @@
+/*
+ * Copyright 2007-2009 Jiemamy Project and the Others.
+ * Created on 2009/09/15
+ *
+ * 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;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertThat;
+import static org.junit.Assert.fail;
+
+import org.junit.Test;
+
+/**
+ * {@link ArtemisVersion}のテストクラス。
+ * 
+ * @since 0.3
+ * @author daisuke
+ */
+public class ArtemisVersionTest {
+	
+	/**
+	 * {@link ArtemisVersion#parse(String)}及びその他色々テスト。
+	 * 
+	 * @throws Exception 例外が発生した場合
+	 */
+	@Test
+	public void test03_version_test() throws Exception {
+		Version v1 = ArtemisVersion.parse("9.8.7");
+		assertThat(v1.getMajor(), is(9));
+		assertThat(v1.getMinor(), is(8));
+		assertThat(v1.getRelease(), is(7));
+		assertThat(v1.isSnapshot(), is(false));
+		assertThat(v1.toString(), is("9.8.7"));
+		assertThat(v1.toStringSpec(), is("9.8"));
+		assertThat(v1.canDeserialize(v1), is(true));
+		
+		Version v2 = ArtemisVersion.parse("10.11.12-SNAPSHOT");
+		assertThat(v2.getMajor(), is(10));
+		assertThat(v2.getMinor(), is(11));
+		assertThat(v2.getRelease(), is(12));
+		assertThat(v2.isSnapshot(), is(true));
+		assertThat(v2.toString(), is("10.11.12-SNAPSHOT"));
+		assertThat(v2.toStringSpec(), is("10.11-SNAPSHOT"));
+		assertThat(v2.canDeserialize(v2), is(true));
+		assertThat(v2.canDeserialize(v1), is(false));
+		assertThat(v1.canDeserialize(v2), is(false));
+		
+		Version v3 = ArtemisVersion.parse("9.8");
+		assertThat(v3.getMajor(), is(9));
+		assertThat(v3.getMinor(), is(8));
+		assertThat(v3.getRelease(), is(0));
+		assertThat(v3.isSnapshot(), is(false));
+		assertThat(v3.toString(), is("9.8.0"));
+		assertThat(v3.toStringSpec(), is("9.8"));
+		assertThat(v3.canDeserialize(v3), is(true));
+		assertThat(v3.canDeserialize(v2), is(false));
+		assertThat(v3.canDeserialize(v1), is(true));
+		assertThat(v2.canDeserialize(v3), is(false));
+		assertThat(v1.canDeserialize(v3), is(true));
+		
+		Version v4 = ArtemisVersion.parse("9.8-SNAPSHOT");
+		assertThat(v4.getMajor(), is(9));
+		assertThat(v4.getMinor(), is(8));
+		assertThat(v4.getRelease(), is(0));
+		assertThat(v4.isSnapshot(), is(true));
+		assertThat(v4.toString(), is("9.8.0-SNAPSHOT"));
+		assertThat(v4.toStringSpec(), is("9.8-SNAPSHOT"));
+		assertThat(v4.canDeserialize(v4), is(true));
+		assertThat(v4.canDeserialize(v3), is(true));
+		assertThat(v4.canDeserialize(v2), is(false));
+		assertThat(v4.canDeserialize(v1), is(true));
+		assertThat(v3.canDeserialize(v4), is(true));
+		assertThat(v2.canDeserialize(v4), is(false));
+		assertThat(v1.canDeserialize(v4), is(true));
+		
+		try {
+			ArtemisVersion.parse("10.11.12-HOGE");
+			fail();
+		} catch (IllegalArgumentException e) {
+			// success
+		}
+	}
+}


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

Modified: zeus/trunk/jiemamy-spec-core/src/main/java/org/jiemamy/Version.java
===================================================================
--- zeus/trunk/jiemamy-spec-core/src/main/java/org/jiemamy/Version.java	2009-09-15 02:00:05 UTC (rev 3576)
+++ zeus/trunk/jiemamy-spec-core/src/main/java/org/jiemamy/Version.java	2009-09-15 02:44:51 UTC (rev 3577)
@@ -26,16 +26,24 @@
  */
 public interface Version {
 	
-	/** 仕様のメジャーバージョン番号 */
-	int MAJOR = 0;
+	/**
+	 * このバージョンの実装が、指定したバージョンのXMLを読み込めるかどうかを調べる。
+	 * 
+	 * @param target 読み込むXMLのバージョン
+	 * @return 読み込み可能な場合は{@code true}、そうでない場合は{@code false}
+	 * @since 0.3
+	 */
+	boolean canDeserialize(Version target);
 	
-	/** 仕様のマイナーバージョン番号 */
-	int MINOR = 3;
+	/**
+	 * 引数{@code obj}がVersionであり、全てのプロパティが一致するかどうかを調べる。
+	 * 
+	 * @param obj 比較対象オブジェクト
+	 * @return 全てのプロパティが一致した場合は{@code true}、そうでない場合は{@code false}
+	 * @since 0.3
+	 */
+	boolean equals(Object obj);
 	
-	/** 仕様バージョンの文字列表記 */
-	String SPEC = MAJOR + "." + MINOR;
-	
-
 	/**
 	 * 仕様及び実装のメジャーバージョン番号を取得する。
 	 * 
@@ -61,14 +69,44 @@
 	int getRelease();
 	
 	/**
+	 * ハッシュコード値を取得する。
+	 * 
+	 * <p>ハッシュコード値は、以下の式で求める。</p>
+	 * 
+	 * <pre>
+	 * (((31 + major) * 31 + minor) * 31 + release) * 31 + (snapshot ? 1231 : 1237)
+	 * </pre>
+	 * 
+	 * @return ハッシュコード値
+	 * @since 0.2
+	 */
+	int hashCode();
+	
+	/**
 	 * スナップショット版であるかどうかを取得する。
 	 * 
 	 * <p>仕様または実装のいずれかがスナップショット版であれば、{@code true}を返す。両者とも正式版の時のみ、{@code false}を返す。</p>
 	 * 
 	 * @return スナップショット版であれば{@code true}
 	 * @since 0.2
-	 * @deprecated 常にfalseを返す。
 	 */
-	@Deprecated
 	boolean isSnapshot();
+	
+	/**
+	 * 実装バージョン表記文字列に変換する。
+	 * 
+	 * @return バージョン表記文字列
+	 * @since 0.3
+	 */
+	String toString();
+	
+	/**
+	 * 仕様バージョン表記文字列に変換する。
+	 * 
+	 * <p>SNAPSHOTであっても、末尾に"-SNAPSHOT"はつかない。</p>
+	 * 
+	 * @return バージョン表記文字列
+	 * @since 0.3
+	 */
+	String toStringSpec();
 }

Deleted: zeus/trunk/jiemamy-spec-core/src/test/java/org/jiemamy/VersionTest.java
===================================================================
--- zeus/trunk/jiemamy-spec-core/src/test/java/org/jiemamy/VersionTest.java	2009-09-15 02:00:05 UTC (rev 3576)
+++ zeus/trunk/jiemamy-spec-core/src/test/java/org/jiemamy/VersionTest.java	2009-09-15 02:44:51 UTC (rev 3577)
@@ -1,62 +0,0 @@
-/*
- * Copyright 2007-2009 Jiemamy Project and the Others.
- * Created on 2009/03/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;
-
-import static org.hamcrest.CoreMatchers.is;
-import static org.junit.Assert.assertThat;
-
-import java.io.File;
-
-import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.DocumentBuilderFactory;
-import javax.xml.xpath.XPath;
-import javax.xml.xpath.XPathFactory;
-
-import org.junit.Test;
-import org.w3c.dom.Document;
-
-/**
- * {@link Version}のテストクラス。
- * 
- * @author daisuke
- */
-public class VersionTest {
-	
-	/**
-	 * pomのバージョンとSPECが一致していること。
-	 * 
-	 * @throws Exception 例外が発生した場合
-	 */
-	@Test
-	public void test01_pomのバージョンとSPECが一致していること() throws Exception {
-		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
-		DocumentBuilder builder = factory.newDocumentBuilder();
-		Document document = builder.parse(new File("pom.xml"));
-		
-		XPathFactory xpathFactory = XPathFactory.newInstance();
-		XPath xpath = xpathFactory.newXPath();
-		String version = xpath.evaluate("/project/parent/version", document);
-		
-		if (version.endsWith("-SNAPSHOT")) {
-			version = version.substring(0, version.length() - "-SNAPSHOT".length());
-		}
-		
-		assertThat(Version.SPEC, is(version));
-	}
-}




Jiemamy-notify メーリングリストの案内
アーカイブの一覧に戻る