Hatena::Groupseasarproject

S2できるかな?

2013-03-04

Java SE 6/7で、Collections#sortの挙動に悩む

例えば、こんなテストケースを書きます。

	@Test
	public void testSort() {
		List<Long> list = Arrays.asList(0L, 1L, 2L, 3L, 4L, 5L);
		Comparator<Long> comparator = new Comparator<Long>() {
			@Override
			public int compare(Long o1, Long o2) {
				return -1;
			}
		};
		Collections.sort(list, comparator);
		System.out.println(list.toString());
		assertThat(list.get(0), is(0L));
	}

Eclipseの「実行」→「実行構成」→「JRE」を選択し、実行JREをjdk1.6.0_xxにして、これを動かすと、テストが通り、コンソールには、以下のように表示されます。

[0, 1, 2, 3, 4, 5]

でも、実行JREをjdk1.7.0_xxにして実行すると、テストが通らず、コンソールには以下のように出ます。

[5, 4, 3, 2, 1, 0]

謎挙動…。

Area: API: Utilities

Synopsis: Updated sort behavior for Arrays and Collections may throw an IllegalArgumentException

Description: The sorting algorithm used by java.util.Arrays.sort and (indirectly) by java.util.Collections.sort has been replaced. The new sort implementation may throw an IllegalArgumentException if it detects a Comparable that violates the Comparable contract. The previous implementation silently ignored such a situation.

If the previous behavior is desired, you can use the new system property, java.util.Arrays.useLegacyMergeSort, to restore previous mergesort behavior.

Nature of Incompatibility: behavioral

RFE: 6804124

Java SE 7 and JDK 7 Compatibility

どうやらこれっぽい?

トラックバック - http://seasarproject.g.hatena.ne.jp/halflite/20130304

2012-09-26

MessageResourceのDIをS2JUnit4で。

ServiceとかLogicクラスのテストをする時、中でMessageResourcesUtilを使っていると、NullPointerExceptionが…。 MessageResourceの設定はstruts-config.xmlで行われているので、JUnitのテストだと、MessageResourceの設定が行われないんですね。

SAStrutsのMessageResourceUtilを割とよく使っているのですが、

MessageResourceの設定をstruts-config.xmlでおこなっていたため、

S2Unitのとき設定が反映されず、エラーが出ていました。

SAStrutsのMessageResourceUtilを使っているソースでS2Unitを実行するには - 草木のにをいに誘われた

まぁ、皆、同じ所でつまづいてるんですね…。

上記記事を、S2JUnit4に合せて、まず以下の記述をs2junit4.diconに記述

	<component name="s2propertyMessageResourcesFactory" 
		class="org.seasar.struts.util.S2PropertyMessageResourcesFactory"/>
	<component name ="s2propertyMessageResources" 
		class="org.seasar.struts.util.S2PropertyMessageResources">
		<arg>s2propertyMessageResourcesFactory</arg>
		<arg>"application"</arg>
	</component>

で、テストケースは以下のように。

@RunWith(Seasar2.class)
public class HogeLogicTest {

    private ServletContext application;

    private MessageResources s2propertyMessageResources;

    public void postBindFields() throws Exception {
        application.setAttribute(Globals.MESSAGES_KEY, s2propertyMessageResources);
    }

    @Test
    public void testHogeMethod() {
        // ....
    }
}
トラックバック - http://seasarproject.g.hatena.ne.jp/halflite/20120926

2012-07-31

例えば、.propertiesファイルの内容を、連想配列にしてDIして持ちたいとか。

S2ベースのプロジェクト + Google Guavaで簡単にできますよ。

diconファイルの中に、以下のような記述を書きます。

	<component name="appMessagesProperties" class="java.util.Properties">
		@org.seasar.framework.util.ResourceUtil@getProperties("messages.properties") 
	</component>

	<component name="appMessages" class="java.util.Map">
		@com.google.common.collect.Maps@fromProperties(appMessagesProperties) 
	</component>

で、適当な所にappMessagesをDIする、と。

public class UserService {

	@Resource
	protected Map<String, String> appMessages;

	public String getHoge() {
		return appMessages.get("label.hoge");
	}

	// 中略
}

ちなみに、appMessagesは、ImmutableMapなので、putもremoveも出来ませんので、ご用心。

詳しくは、S2のResourceUtilと、GuavaのMapsのJavaDocをどうぞ。

トラックバック - http://seasarproject.g.hatena.ne.jp/halflite/20120731

2012-06-26

Java SE 6と7では、S2JDBC-Genで作られるDDLのスキーマが違う。

とりあえず、ハマったのでメモ。Windows7(x86)版JavaVMだけの挙動なんだろうか…。

トラックバック - http://seasarproject.g.hatena.ne.jp/halflite/20120626

2012-05-20

S2Maiとozacc-mailの依存関係修正

さて、AVE さんは仕事が速いので、早速 Maven Central リポジトリに 1.2.2 が登録されています。スバラシイ。

http://repo1.maven.org/maven2/jp/sourceforge/spring-ext/ozacc-mail/1.2.2/

これに伴い、groupId がこれまでの「ozacc-mail」から「jp.sourceforge.spring-ext」に変わっています。

ozacc-mail library is not dead - OZACC.blog

なので、自分で作ったプロジェクトのpom.xmlの、S2Mai/ozacc-mailに関するdependencyの記述を以下のように変更しました。*1

<dependency>
	<groupId>org.seasar.mai</groupId>
	<artifactId>s2mai-tiger</artifactId>
	<version>0.9.7</version>
	<exclusions>
		<exclusion>
			<groupId>ozacc-mail</groupId>
			<artifactId>ozacc-mail</artifactId>
		</exclusion>
		<exclusion>
			<groupId>log4j</groupId>
			<artifactId>log4j</artifactId>
		</exclusion>
	</exclusions>
</dependency>
<dependency>
	<groupId>jp.sourceforge.spring-ext</groupId>
	<artifactId>ozacc-mail</artifactId>
	<version>1.2.2</version>
	<exclusions>
		<exclusion>
			<groupId>commons-logging</groupId>
			<artifactId>commons-logging</artifactId>
		</exclusion>
		<exclusion>
			<groupId>log4j</groupId>
			<artifactId>log4j</artifactId>
		</exclusion>
		<exclusion>
			<groupId>org.springframework</groupId>
			<artifactId>spring</artifactId>
		</exclusion>
	</exclusions>
</dependency>

*1Maven Centralの方使えば、Maven3とかも多分大丈夫…??

トラックバック - http://seasarproject.g.hatena.ne.jp/halflite/20120520