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)); - } -}