svnno****@sourc*****
svnno****@sourc*****
2009年 4月 7日 (火) 14:52:48 JST
Revision: 3151 http://svn.sourceforge.jp/view?root=jiemamy&view=rev&rev=3151 Author: j5ik2o Date: 2009-04-07 14:52:48 +0900 (Tue, 07 Apr 2009) Log Message: ----------- ユーティリティクラスをcommonsに移動させました。 Modified Paths: -------------- artemis/trunk/jiemamy-core/src/main/java/org/jiemamy/utils/DriverUtil.java charon/jiemamy-jpa-importer/trunk/src/main/java/org/jiemamy/composer/importer/JpaImporter.java charon/jiemamy-jpa-importer/trunk/src/main/java/org/jiemamy/composer/importer/meta/ColumnMeta.java charon/jiemamy-jpa-importer/trunk/src/main/java/org/jiemamy/composer/importer/meta/EntityMeta.java charon/jiemamy-jpa-importer/trunk/src/main/java/org/jiemamy/composer/importer/meta/EntityMetaFactory.java charon/jiemamy-jpa-importer/trunk/src/main/java/org/jiemamy/composer/importer/meta/impl/EntityMetaFactoryImpl.java charon/jiemamy-jpa-importer/trunk/src/main/java/org/jiemamy/composer/importer/meta/impl/EntityMetaReaderImpl.java charon/jiemamy-jpa-importer/trunk/src/main/java/org/jiemamy/composer/importer/meta/impl/PropertyMetaFactoryImpl.java charon/jiemamy-jpa-importer/trunk/src/test/java/org/jiemamy/composer/importer/JpaImporterTest.java leto/jiemamy-commons/trunk/pom.xml leto/jiemamy-commons/trunk/src/main/java/org/jiemamy/utils/ReflectionUtil.java leto/jiemamy-commons/trunk/src/main/java/org/jiemamy/utils/ResourceTraversal.java zeus/trunk/jiemamy-spec-core/.project Added Paths: ----------- charon/jiemamy-jpa-importer/trunk/src/main/java/org/jiemamy/composer/importer/meta/BothMappedByAndJoinColumnException.java charon/jiemamy-jpa-importer/trunk/src/main/java/org/jiemamy/composer/importer/meta/IdentityIdGenerator.java charon/jiemamy-jpa-importer/trunk/src/main/java/org/jiemamy/composer/importer/meta/MappedByMandatoryException.java charon/jiemamy-jpa-importer/trunk/src/main/java/org/jiemamy/composer/importer/meta/OneToManyNotGenericsException.java charon/jiemamy-jpa-importer/trunk/src/main/java/org/jiemamy/composer/importer/meta/PropertyMeta.java charon/jiemamy-jpa-importer/trunk/src/main/java/org/jiemamy/composer/importer/meta/RelationshipNotEntityException.java charon/jiemamy-jpa-importer/trunk/src/main/java/org/jiemamy/composer/importer/meta/SequenceIdGenerator.java charon/jiemamy-jpa-importer/trunk/src/main/java/org/jiemamy/composer/importer/meta/TableIdGenerator.java charon/jiemamy-jpa-importer/trunk/src/main/java/org/jiemamy/composer/importer/meta/UnsupportedPropertyTypesException.java charon/jiemamy-jpa-importer/trunk/src/main/java/org/jiemamy/composer/importer/meta/impl/IdGeneratorNotFoundException.java charon/jiemamy-jpa-importer/trunk/src/main/java/org/jiemamy/composer/importer/meta/impl/JoinColumnNameAndReferencedColumnNameMandatoryException.java charon/jiemamy-jpa-importer/trunk/src/main/java/org/jiemamy/composer/importer/meta/impl/LazyFetchSpecifiedException.java charon/jiemamy-jpa-importer/trunk/src/main/java/org/jiemamy/composer/importer/meta/impl/OneToManyNotListException.java charon/jiemamy-jpa-importer/trunk/src/main/java/org/jiemamy/composer/importer/meta/impl/TemporalTypeNotSpecifiedException.java charon/jiemamy-jpa-importer/trunk/src/main/java/org/jiemamy/composer/importer/meta/impl/UnsupportedRelationshipException.java charon/jiemamy-jpa-importer/trunk/src/main/java/org/jiemamy/composer/importer/meta/impl/VersionPropertyNotNumberException.java leto/jiemamy-commons/trunk/src/main/java/org/jiemamy/utils/ClassLoaderUtil.java leto/jiemamy-commons/trunk/src/main/java/org/jiemamy/utils/ClassPoolUtil.java leto/jiemamy-commons/trunk/src/main/java/org/jiemamy/utils/ClassTraversal.java leto/jiemamy-commons/trunk/src/main/java/org/jiemamy/utils/ClassUtil.java leto/jiemamy-commons/trunk/src/main/java/org/jiemamy/utils/CollectionsUtil.java leto/jiemamy-commons/trunk/src/main/java/org/jiemamy/utils/ConstructorUtil.java leto/jiemamy-commons/trunk/src/main/java/org/jiemamy/utils/Disposable.java leto/jiemamy-commons/trunk/src/main/java/org/jiemamy/utils/EnumerationIterator.java leto/jiemamy-commons/trunk/src/main/java/org/jiemamy/utils/FieldUtil.java leto/jiemamy-commons/trunk/src/main/java/org/jiemamy/utils/FileInputStreamUtil.java leto/jiemamy-commons/trunk/src/main/java/org/jiemamy/utils/FileOutputStreamUtil.java leto/jiemamy-commons/trunk/src/main/java/org/jiemamy/utils/FileUtil.java leto/jiemamy-commons/trunk/src/main/java/org/jiemamy/utils/GenericUtil.java leto/jiemamy-commons/trunk/src/main/java/org/jiemamy/utils/InputStreamUtil.java leto/jiemamy-commons/trunk/src/main/java/org/jiemamy/utils/JarFileUtil.java leto/jiemamy-commons/trunk/src/main/java/org/jiemamy/utils/JarInputStreamUtil.java leto/jiemamy-commons/trunk/src/main/java/org/jiemamy/utils/JarURLConnectionUtil.java leto/jiemamy-commons/trunk/src/main/java/org/jiemamy/utils/MethodUtil.java leto/jiemamy-commons/trunk/src/main/java/org/jiemamy/utils/ModifierUtil.java leto/jiemamy-commons/trunk/src/main/java/org/jiemamy/utils/OutputStreamUtil.java leto/jiemamy-commons/trunk/src/main/java/org/jiemamy/utils/PropertyNotFoundException.java leto/jiemamy-commons/trunk/src/main/java/org/jiemamy/utils/ResourceBundleUtil.java leto/jiemamy-commons/trunk/src/main/java/org/jiemamy/utils/ResourceNotFoundException.java leto/jiemamy-commons/trunk/src/main/java/org/jiemamy/utils/ResourceUtil.java leto/jiemamy-commons/trunk/src/main/java/org/jiemamy/utils/ResourcesUtil.java leto/jiemamy-commons/trunk/src/main/java/org/jiemamy/utils/TraversalHandlerException.java leto/jiemamy-commons/trunk/src/main/java/org/jiemamy/utils/URLUtil.java leto/jiemamy-commons/trunk/src/main/java/org/jiemamy/utils/ZipFileUtil.java Removed Paths: ------------- charon/jiemamy-jpa-importer/trunk/src/main/java/org/jiemamy/composer/importer/meta/PropertyMeta.java charon/jiemamy-jpa-importer/trunk/src/main/java/org/jiemamy/composer/importer/utils/ leto/jiemamy-commons/trunk/src/main/java/org/jiemamy/utils/CollectionsUtil.java -------------- next part -------------- Modified: artemis/trunk/jiemamy-core/src/main/java/org/jiemamy/utils/DriverUtil.java =================================================================== --- artemis/trunk/jiemamy-core/src/main/java/org/jiemamy/utils/DriverUtil.java 2009-04-07 01:02:00 UTC (rev 3150) +++ artemis/trunk/jiemamy-core/src/main/java/org/jiemamy/utils/DriverUtil.java 2009-04-07 05:52:48 UTC (rev 3151) @@ -47,6 +47,65 @@ public final class DriverUtil { /** + * JARファイル内の、{@link Driver}を実装したクラスのリストを抽出する。 + * + * @author daisuke + */ + private static final class GetDriverClassesFromJarHandler implements ResourceHandler { + + private static Logger logger = LoggerFactory.getLogger(GetDriverClassesFromJarHandler.class); + + private static final String CLASS_EXTENSION = ".class"; + + private final List<Class<? extends Driver>> driverList; + + private final URLClassLoader classLoader; + + + /** + * インスタンスを生成する。 + * + * @param driverList 見つかったドライバクラスを保持するリスト + * @param classLoader ドライバを読み込むクラスローダ + */ + private GetDriverClassesFromJarHandler(List<Class<? extends Driver>> driverList, URLClassLoader classLoader) { + this.driverList = driverList; + this.classLoader = classLoader; + } + + public void processResource(String path, InputStream is) throws TraversalHandlerException { + if (path.endsWith(CLASS_EXTENSION) == false) { + return; + } + + String ccls = StringUtils.substring(path, 0, -1 * CLASS_EXTENSION.length()); + try { + Class<?> clazz = classLoader.loadClass(ccls.replaceAll("/", ClassUtils.PACKAGE_SEPARATOR)); + Class<?>[] interfaceClasses = clazz.getInterfaces(); + for (Class<?> interfaceClass : interfaceClasses) { + if (interfaceClass.equals(Driver.class)) { + // 直前でロジックによる型チェックを行っているため、キャスト安全である。 + @SuppressWarnings("unchecked") + Class<? extends Driver> driverClass = (Class<? extends Driver>) clazz; + driverList.add(driverClass); + } + } + } catch (NoClassDefFoundError e) { + // ignore + logger.warn("", e); + } catch (ClassNotFoundException ignore) { + throw new UnexpectedConditionError("クラスは必ず存在するはずである。"); + } catch (Throwable t) { + throw new TraversalHandlerException(t); + } + } + } + + + private static Logger logger = LoggerFactory.getLogger(DriverUtil.class); + + + /** * JARファイルに含まれるDriverクラスのリストを取得する。 * * @param paths JARファイルを示すURLの配列 @@ -73,6 +132,8 @@ ResourceTraversal.forEach(jarFile, new GetDriverClassesFromJarHandler(driverList, classLoader)); } catch (URISyntaxException e) { throw new IllegalArgumentException(path.toString(), e); + } catch (TraversalHandlerException e) { + logger.error(LogMarker.DETAIL, "", e); } } return driverList; @@ -105,60 +166,4 @@ private DriverUtil() { throw new UnexpectedConditionError("不到達ポイント"); } - - - /** - * JARファイル内の、{@link Driver}を実装したクラスのリストを抽出する。 - * - * @author daisuke - */ - private static final class GetDriverClassesFromJarHandler implements ResourceHandler { - - private static Logger logger = LoggerFactory.getLogger(GetDriverClassesFromJarHandler.class); - - private static final String CLASS_EXTENSION = ".class"; - - private final List<Class<? extends Driver>> driverList; - - private final URLClassLoader classLoader; - - - /** - * インスタンスを生成する。 - * - * @param driverList 見つかったドライバクラスを保持するリスト - * @param classLoader ドライバを読み込むクラスローダ - */ - private GetDriverClassesFromJarHandler(List<Class<? extends Driver>> driverList, URLClassLoader classLoader) { - this.driverList = driverList; - this.classLoader = classLoader; - } - - public void processResource(String path, InputStream is) { - if (path.endsWith(CLASS_EXTENSION) == false) { - return; - } - - String ccls = StringUtils.substring(path, 0, -1 * CLASS_EXTENSION.length()); - try { - Class<?> clazz = classLoader.loadClass(ccls.replaceAll("/", ClassUtils.PACKAGE_SEPARATOR)); - Class<?>[] interfaceClasses = clazz.getInterfaces(); - for (Class<?> interfaceClass : interfaceClasses) { - if (interfaceClass.equals(Driver.class)) { - // 直前でロジックによる型チェックを行っているため、キャスト安全である。 - @SuppressWarnings("unchecked") - Class<? extends Driver> driverClass = (Class<? extends Driver>) clazz; - driverList.add(driverClass); - } - } - } catch (NoClassDefFoundError e) { - // ignore - logger.warn("", e); - } catch (ClassNotFoundException ignore) { - throw new UnexpectedConditionError("クラスは必ず存在するはずである。"); - } catch (Throwable t) { - logger.error(LogMarker.DETAIL, "", t); - } - } - } } Modified: charon/jiemamy-jpa-importer/trunk/src/main/java/org/jiemamy/composer/importer/JpaImporter.java =================================================================== --- charon/jiemamy-jpa-importer/trunk/src/main/java/org/jiemamy/composer/importer/JpaImporter.java 2009-04-07 01:02:00 UTC (rev 3150) +++ charon/jiemamy-jpa-importer/trunk/src/main/java/org/jiemamy/composer/importer/JpaImporter.java 2009-04-07 05:52:48 UTC (rev 3151) @@ -35,10 +35,10 @@ import org.jiemamy.composer.importer.meta.impl.EntityMetaReaderImpl; import org.jiemamy.composer.importer.meta.impl.PropertyMetaFactoryImpl; import org.jiemamy.composer.importer.meta.impl.TableMetaFactoryImpl; -import org.jiemamy.composer.importer.utils.ClassUtil; -import org.jiemamy.composer.importer.utils.CollectionsUtil; import org.jiemamy.model.RootModel; import org.jiemamy.model.entity.TableModel; +import org.jiemamy.utils.ClassUtil; +import org.jiemamy.utils.CollectionsUtil; import org.jiemamy.utils.LogMarker; /** Added: charon/jiemamy-jpa-importer/trunk/src/main/java/org/jiemamy/composer/importer/meta/BothMappedByAndJoinColumnException.java =================================================================== --- charon/jiemamy-jpa-importer/trunk/src/main/java/org/jiemamy/composer/importer/meta/BothMappedByAndJoinColumnException.java (rev 0) +++ charon/jiemamy-jpa-importer/trunk/src/main/java/org/jiemamy/composer/importer/meta/BothMappedByAndJoinColumnException.java 2009-04-07 05:52:48 UTC (rev 3151) @@ -0,0 +1,38 @@ +/* + * Copyright 2007-2009 Jiemamy Project and the Others. + * Created on Apr 6, 2009 + * + * 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.composer.importer.meta; + +/** + * TODO for junichi + * + * @author junichi + */ +public class BothMappedByAndJoinColumnException extends Exception { + + /** + * インスタンスを生成する。 + * + * @param name + * @param name2 + */ + public BothMappedByAndJoinColumnException(String name, String name2) { + // TODO Auto-generated constructor stub + } + +} Property changes on: charon/jiemamy-jpa-importer/trunk/src/main/java/org/jiemamy/composer/importer/meta/BothMappedByAndJoinColumnException.java ___________________________________________________________________ Added: svn:mime-type + text/plain Modified: charon/jiemamy-jpa-importer/trunk/src/main/java/org/jiemamy/composer/importer/meta/ColumnMeta.java =================================================================== --- charon/jiemamy-jpa-importer/trunk/src/main/java/org/jiemamy/composer/importer/meta/ColumnMeta.java 2009-04-07 01:02:00 UTC (rev 3150) +++ charon/jiemamy-jpa-importer/trunk/src/main/java/org/jiemamy/composer/importer/meta/ColumnMeta.java 2009-04-07 05:52:48 UTC (rev 3151) @@ -24,7 +24,6 @@ * カラム用のメタデータです。 * * @author j5ik2o - * */ public class ColumnMeta { Modified: charon/jiemamy-jpa-importer/trunk/src/main/java/org/jiemamy/composer/importer/meta/EntityMeta.java =================================================================== --- charon/jiemamy-jpa-importer/trunk/src/main/java/org/jiemamy/composer/importer/meta/EntityMeta.java 2009-04-07 01:02:00 UTC (rev 3150) +++ charon/jiemamy-jpa-importer/trunk/src/main/java/org/jiemamy/composer/importer/meta/EntityMeta.java 2009-04-07 05:52:48 UTC (rev 3151) @@ -23,8 +23,8 @@ import org.apache.commons.lang.builder.ToStringBuilder; -import org.jiemamy.composer.importer.utils.PropertyNotFoundException; import org.jiemamy.utils.CollectionsUtil; +import org.jiemamy.utils.PropertyNotFoundException; /** * JPA用のエンティティメタデータクラス。 Modified: charon/jiemamy-jpa-importer/trunk/src/main/java/org/jiemamy/composer/importer/meta/EntityMetaFactory.java =================================================================== --- charon/jiemamy-jpa-importer/trunk/src/main/java/org/jiemamy/composer/importer/meta/EntityMetaFactory.java 2009-04-07 01:02:00 UTC (rev 3150) +++ charon/jiemamy-jpa-importer/trunk/src/main/java/org/jiemamy/composer/importer/meta/EntityMetaFactory.java 2009-04-07 05:52:48 UTC (rev 3151) @@ -19,7 +19,7 @@ package org.jiemamy.composer.importer.meta; import org.jiemamy.composer.importer.meta.impl.NonEntityException; -import org.jiemamy.composer.importer.utils.Disposable; +import org.jiemamy.utils.Disposable; /** * {@link EntityMeta}のファクトリインターフェイス Added: charon/jiemamy-jpa-importer/trunk/src/main/java/org/jiemamy/composer/importer/meta/IdentityIdGenerator.java =================================================================== --- charon/jiemamy-jpa-importer/trunk/src/main/java/org/jiemamy/composer/importer/meta/IdentityIdGenerator.java (rev 0) +++ charon/jiemamy-jpa-importer/trunk/src/main/java/org/jiemamy/composer/importer/meta/IdentityIdGenerator.java 2009-04-07 05:52:48 UTC (rev 3151) @@ -0,0 +1,39 @@ +/* + * Copyright 2007-2009 Jiemamy Project and the Others. + * Created on Apr 6, 2009 + * + * 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.composer.importer.meta; + + +/** + * TODO for junichi + * + * @author junichi + */ +public class IdentityIdGenerator { + + /** + * インスタンスを生成する。 + * + * @param entityMeta + * @param propertyMeta + */ + public IdentityIdGenerator(EntityMeta entityMeta, PropertyMeta propertyMeta) { + // TODO Auto-generated constructor stub + } + +} Property changes on: charon/jiemamy-jpa-importer/trunk/src/main/java/org/jiemamy/composer/importer/meta/IdentityIdGenerator.java ___________________________________________________________________ Added: svn:mime-type + text/plain Added: charon/jiemamy-jpa-importer/trunk/src/main/java/org/jiemamy/composer/importer/meta/MappedByMandatoryException.java =================================================================== --- charon/jiemamy-jpa-importer/trunk/src/main/java/org/jiemamy/composer/importer/meta/MappedByMandatoryException.java (rev 0) +++ charon/jiemamy-jpa-importer/trunk/src/main/java/org/jiemamy/composer/importer/meta/MappedByMandatoryException.java 2009-04-07 05:52:48 UTC (rev 3151) @@ -0,0 +1,38 @@ +/* + * Copyright 2007-2009 Jiemamy Project and the Others. + * Created on Apr 6, 2009 + * + * 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.composer.importer.meta; + +/** + * TODO for junichi + * + * @author junichi + */ +public class MappedByMandatoryException extends Exception { + + /** + * インスタンスを生成する。 + * + * @param name + * @param name2 + */ + public MappedByMandatoryException(String name, String name2) { + // TODO Auto-generated constructor stub + } + +} Property changes on: charon/jiemamy-jpa-importer/trunk/src/main/java/org/jiemamy/composer/importer/meta/MappedByMandatoryException.java ___________________________________________________________________ Added: svn:mime-type + text/plain Added: charon/jiemamy-jpa-importer/trunk/src/main/java/org/jiemamy/composer/importer/meta/OneToManyNotGenericsException.java =================================================================== --- charon/jiemamy-jpa-importer/trunk/src/main/java/org/jiemamy/composer/importer/meta/OneToManyNotGenericsException.java (rev 0) +++ charon/jiemamy-jpa-importer/trunk/src/main/java/org/jiemamy/composer/importer/meta/OneToManyNotGenericsException.java 2009-04-07 05:52:48 UTC (rev 3151) @@ -0,0 +1,38 @@ +/* + * Copyright 2007-2009 Jiemamy Project and the Others. + * Created on Apr 6, 2009 + * + * 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.composer.importer.meta; + +/** + * TODO for junichi + * + * @author junichi + */ +public class OneToManyNotGenericsException extends Exception { + + /** + * インスタンスを生成する。 + * + * @param name + * @param name2 + */ + public OneToManyNotGenericsException(String name, String name2) { + // TODO Auto-generated constructor stub + } + +} Property changes on: charon/jiemamy-jpa-importer/trunk/src/main/java/org/jiemamy/composer/importer/meta/OneToManyNotGenericsException.java ___________________________________________________________________ Added: svn:mime-type + text/plain Deleted: charon/jiemamy-jpa-importer/trunk/src/main/java/org/jiemamy/composer/importer/meta/PropertyMeta.java =================================================================== --- charon/jiemamy-jpa-importer/trunk/src/main/java/org/jiemamy/composer/importer/meta/PropertyMeta.java 2009-04-07 01:02:00 UTC (rev 3150) +++ charon/jiemamy-jpa-importer/trunk/src/main/java/org/jiemamy/composer/importer/meta/PropertyMeta.java 2009-04-07 05:52:48 UTC (rev 3151) @@ -1,388 +0,0 @@ -/* - * Copyright 2007-2009 Jiemamy Project and the Others. - * Created on Apr 3, 2009 - * - * 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.composer.importer.meta; - -import java.lang.reflect.Field; -import java.util.ArrayList; -import java.util.List; - -import javax.persistence.EnumType; -import javax.persistence.FetchType; -import javax.persistence.GenerationType; -import javax.persistence.TemporalType; - -import org.apache.commons.lang.builder.ToStringBuilder; - -/** - * JPA用のプロパティメタデータクラス。 - * - * @author j5ik2o - */ -public class PropertyMeta { - - /** 名前 */ - private String name; - - /** プロパティクラス */ - private Class<?> propertyClass; - - /** フィールド */ - private Field field; - - /** IDフラグ */ - private boolean id; - - /** カラムメタデータ */ - private ColumnMeta columnMeta; - - /** - * IDを自動生成する方法です。 - */ - private GenerationType generationType; - - /** - * フェッチタイプです。 - */ - private FetchType fetchType; - - /** - * 時制の種別です。 - */ - private TemporalType temporalType; - - /** - * enumの種別です。 - */ - private EnumType enumType; - - /** - * バージョン用かどうかです。 - */ - private boolean version; - - /** - * 一時的かどうかです。 - */ - private boolean trnsient; - - /** - * <code>LOB</code>かどうかです。 - */ - private boolean lob; - - /** - * 結合カラムメタデータのリストです。 - */ - private List<JoinColumnMeta> joinColumnMetaList = new ArrayList<JoinColumnMeta>(); - - /** - * 関連タイプです。 - */ - private RelationshipType relationshipType; - - /** - * 関連の所有者側のプロパティ名です。 - */ - private String mappedBy; - - /** - * 関連クラスです。 - */ - private Class<?> relationshipClass; - - - /** - * カラムメタを取得する。 - * - * @return {@link ColumnMeta} - */ - public ColumnMeta getColumnMeta() { - return columnMeta; - } - - /** - * {@link EnumType}を取得する。 - * - * @return {@link EnumType} - */ - public EnumType getEnumType() { - return enumType; - } - - /** - * {@link FetchType}を取得する。 - * - * @return {@link FetchType} - */ - public FetchType getFetchType() { - return fetchType; - } - - /** - * フィールドを取得する。 - * - * @return {@link Field} - */ - public Field getField() { - return field; - } - - /** - * {@link GenerationType}を取得する。 - * - * @return {@link GenerationType} - */ - public GenerationType getGenerationType() { - return generationType; - } - - /** - * {@JoinColumnMeta}のリストを取得する。 - * - * @return {@JoinColumnMeta}のリスト - */ - public List<JoinColumnMeta> getJoinColumnMetaList() { - return joinColumnMetaList; - } - - /** - * TODO for junichi - * - * @return - */ - public String getMappedBy() { - return mappedBy; - } - - /** - * 名前を取得する。 - * - * @return 名前 - */ - public String getName() { - return name; - } - - /** - * プロパティクラスを取得する。 - * - * @return プロパティクラス - */ - public Class<?> getPropertyClass() { - return propertyClass; - } - - /** - * TODO for junichi - * - * @return - */ - public Class<?> getRelationshipClass() { - return relationshipClass; - } - - /** - * TODO for junichi - * - * @return - */ - public RelationshipType getRelationshipType() { - return relationshipType; - } - - /** - * TODO for junichi - * - * @return - */ - public TemporalType getTemporalType() { - return temporalType; - } - - /** - * IDフラグを取得する。 - * - * @return trueの場合はID - */ - public boolean isId() { - return id; - } - - /** - * TODO for junichi - * - * @return - */ - public boolean isLob() { - return lob; - } - - /** - * TODO for junichi - * - * @return - */ - public boolean isTransient() { - return trnsient; - } - - /** - * TODO for junichi - * - * @return - */ - public boolean isVersion() { - return version; - } - - /** - * カラムメタを設定する。 - * - * @param columnMeta {@link ColumnMeta} - */ - public void setColumnMeta(final ColumnMeta columnMeta) { - this.columnMeta = columnMeta; - } - - /** - * TODO for junichi - * - * @param enumType - */ - public void setEnumType(EnumType enumType) { - this.enumType = enumType; - } - - /** - * TODO for junichi - * - * @param fetchType - */ - public void setFetchType(FetchType fetchType) { - this.fetchType = fetchType; - } - - /** - * フィールドを設定する。 - * - * @param field {@link Field} - */ - public void setField(Field field) { - this.field = field; - } - - public void setGenerationType(GenerationType generationType) { - this.generationType = generationType; - } - - /** - * IDフラグを設定する。 - * - * @param id IDフラグ - */ - public void setId(boolean id) { - this.id = id; - } - - public void setJoinColumnMetaList(final List<JoinColumnMeta> joinColumnMetaList) { - this.joinColumnMetaList = joinColumnMetaList; - } - - /** - * TODO for junichi - * - * @param lob - */ - public void setLob(boolean lob) { - this.lob = lob; - } - - /** - * TODO for junichi - * - * @param mappedBy - */ - public void setMappedBy(String mappedBy) { - this.mappedBy = mappedBy; - } - - /** - * 名前を設定する。 - * - * @param name 名前 - */ - public void setName(String name) { - this.name = name; - } - - /** - * プロパティクラスを設定する。 - * - * @param propertyClass プロパティクラス - */ - public void setPropertyClass(Class<?> propertyClass) { - this.propertyClass = propertyClass; - } - - public void setRelationshipClass(Class<?> relationshipClass) { - this.relationshipClass = relationshipClass; - } - - /** - * TODO for junichi - * - * @param relationshipType - */ - public void setRelationshipType(RelationshipType relationshipType) { - this.relationshipType = relationshipType; - } - - /** - * TODO for junichi - * - * @param temporalType - */ - public void setTemporalType(TemporalType temporalType) { - this.temporalType = temporalType; - } - - /** - * TODO for junichi - * - * @param trnsient - */ - public void setTransient(boolean trnsient) { - this.trnsient = trnsient; - } - - /** - * TODO for junichi - * - * @param version - */ - public void setVersion(boolean version) { - this.version = version; - } - - @Override - public String toString() { - return ToStringBuilder.reflectionToString(this); - } - -} Added: charon/jiemamy-jpa-importer/trunk/src/main/java/org/jiemamy/composer/importer/meta/PropertyMeta.java =================================================================== --- charon/jiemamy-jpa-importer/trunk/src/main/java/org/jiemamy/composer/importer/meta/PropertyMeta.java (rev 0) +++ charon/jiemamy-jpa-importer/trunk/src/main/java/org/jiemamy/composer/importer/meta/PropertyMeta.java 2009-04-07 05:52:48 UTC (rev 3151) @@ -0,0 +1,428 @@ +/* + * Copyright 2007-2009 Jiemamy Project and the Others. + * Created on Apr 3, 2009 + * + * 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.composer.importer.meta; + +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.List; + +import javax.persistence.EnumType; +import javax.persistence.FetchType; +import javax.persistence.GenerationType; +import javax.persistence.TemporalType; + +import org.apache.commons.lang.builder.ToStringBuilder; + +/** + * JPA用のプロパティメタデータクラス。 + * + * @author j5ik2o + */ +public class PropertyMeta { + + /** 名前 */ + private String name; + + /** プロパティクラス */ + private Class<?> propertyClass; + + /** フィールド */ + private Field field; + + /** IDフラグ */ + private boolean id; + + /** カラムメタデータ */ + private ColumnMeta columnMeta; + + /** + * IDを自動生成する方法です。 + */ + private GenerationType generationType; + + /** + * フェッチタイプです。 + */ + private FetchType fetchType; + + /** + * 時制の種別です。 + */ + private TemporalType temporalType; + + /** + * enumの種別です。 + */ + private EnumType enumType; + + /** + * バージョン用かどうかです。 + */ + private boolean version; + + /** + * 一時的かどうかです。 + */ + private boolean trnsient; + + /** + * <code>LOB</code>かどうかです。 + */ + private boolean lob; + + /** + * 結合カラムメタデータのリストです。 + */ + private List<JoinColumnMeta> joinColumnMetaList = new ArrayList<JoinColumnMeta>(); + + /** + * 関連タイプです。 + */ + private RelationshipType relationshipType; + + /** + * 関連の所有者側のプロパティ名です。 + */ + private String mappedBy; + + /** 関連クラス */ + private Class<?> relationshipClass; + + private SequenceIdGenerator sequenceIdGenerator; + + private IdentityIdGenerator identityIdGenerator; + + private TableIdGenerator tableIdGenerator; + + + /** + * 結合カラムメタデータを追加する。 + * + * @param joinColumnMeta 結合カラムメタデータ + */ + public void addJoinColumnMeta(JoinColumnMeta joinColumnMeta) { + joinColumnMetaList.add(joinColumnMeta); + } + + /** + * カラムメタを取得する。 + * + * @return {@link ColumnMeta} + */ + public ColumnMeta getColumnMeta() { + return columnMeta; + } + + /** + * {@link EnumType}を取得する。 + * + * @return {@link EnumType} + */ + public EnumType getEnumType() { + return enumType; + } + + /** + * {@link FetchType}を取得する。 + * + * @return {@link FetchType} + */ + public FetchType getFetchType() { + return fetchType; + } + + /** + * フィールドを取得する。 + * + * @return {@link Field} + */ + public Field getField() { + return field; + } + + /** + * {@link GenerationType}を取得する。 + * + * @return {@link GenerationType} + */ + public GenerationType getGenerationType() { + return generationType; + } + + /** + * {@JoinColumnMeta}のリストを取得する。 + * + * @return {@JoinColumnMeta}のリスト + */ + public List<JoinColumnMeta> getJoinColumnMetaList() { + return joinColumnMetaList; + } + + /** + * TODO for junichi + * + * @return + */ + public String getMappedBy() { + return mappedBy; + } + + /** + * 名前を取得する。 + * + * @return 名前 + */ + public String getName() { + return name; + } + + /** + * プロパティクラスを取得する。 + * + * @return プロパティクラス + */ + public Class<?> getPropertyClass() { + return propertyClass; + } + + /** + * TODO for junichi + * + * @return + */ + public Class<?> getRelationshipClass() { + return relationshipClass; + } + + /** + * TODO for junichi + * + * @return + */ + public RelationshipType getRelationshipType() { + return relationshipType; + } + + /** + * TODO for junichi + * + * @return + */ + public TemporalType getTemporalType() { + return temporalType; + } + + /** + * IDフラグを取得する。 + * + * @return trueの場合はID + */ + public boolean isId() { + return id; + } + + /** + * TODO for junichi + * + * @return + */ + public boolean isLob() { + return lob; + } + + /** + * TODO for junichi + * + * @return + */ + public boolean isTransient() { + return trnsient; + } + + /** + * TODO for junichi + * + * @return + */ + public boolean isVersion() { + return version; + } + + /** + * カラムメタを設定する。 + * + * @param columnMeta {@link ColumnMeta} + */ + public void setColumnMeta(final ColumnMeta columnMeta) { + this.columnMeta = columnMeta; + } + + /** + * TODO for junichi + * + * @param enumType + */ + public void setEnumType(EnumType enumType) { + this.enumType = enumType; + } + + /** + * TODO for junichi + * + * @param fetchType + */ + public void setFetchType(FetchType fetchType) { + this.fetchType = fetchType; + } + + /** + * フィールドを設定する。 + * + * @param field {@link Field} + */ + public void setField(Field field) { + this.field = field; + } + + public void setGenerationType(GenerationType generationType) { + this.generationType = generationType; + } + + /** + * IDフラグを設定する。 + * + * @param id IDフラグ + */ + public void setId(boolean id) { + this.id = id; + } + + /** + * TODO for junichi + * + * @param identityIdGenerator + */ + public void setIdentityIdGenerator(IdentityIdGenerator identityIdGenerator) { + this.identityIdGenerator = identityIdGenerator; + } + + public void setJoinColumnMetaList(final List<JoinColumnMeta> joinColumnMetaList) { + this.joinColumnMetaList = joinColumnMetaList; + } + + /** + * TODO for junichi + * + * @param lob + */ + public void setLob(boolean lob) { + this.lob = lob; + } + + /** + * TODO for junichi + * + * @param mappedBy + */ + public void setMappedBy(String mappedBy) { + this.mappedBy = mappedBy; + } + + /** + * 名前を設定する。 + * + * @param name 名前 + */ + public void setName(String name) { + this.name = name; + } + + /** + * プロパティクラスを設定する。 + * + * @param propertyClass プロパティクラス + */ + public void setPropertyClass(Class<?> propertyClass) { + this.propertyClass = propertyClass; + } + + public void setRelationshipClass(Class<?> relationshipClass) { + this.relationshipClass = relationshipClass; + } + + /** + * TODO for junichi + * + * @param relationshipType + */ + public void setRelationshipType(RelationshipType relationshipType) { + this.relationshipType = relationshipType; + } + + /** + * TODO for junichi + * + * @param sequenceIdGenerator + */ + public void setSequenceIdGenerator(SequenceIdGenerator sequenceIdGenerator) { + this.sequenceIdGenerator = sequenceIdGenerator; + } + + /** + * TODO for junichi + * + * @param tableIdGenerator + */ + public void setTableIdGenerator(TableIdGenerator tableIdGenerator) { + this.tableIdGenerator = tableIdGenerator; + } + + /** + * TODO for junichi + * + * @param temporalType + */ + public void setTemporalType(TemporalType temporalType) { + this.temporalType = temporalType; + } + + /** + * TODO for junichi + * + * @param trnsient + */ + public void setTransient(boolean trnsient) { + this.trnsient = trnsient; + } + + /** + * TODO for junichi + * + * @param version + */ + public void setVersion(boolean version) { + this.version = version; + } + + @Override + public String toString() { + return ToStringBuilder.reflectionToString(this); + } + +} Added: charon/jiemamy-jpa-importer/trunk/src/main/java/org/jiemamy/composer/importer/meta/RelationshipNotEntityException.java =================================================================== --- charon/jiemamy-jpa-importer/trunk/src/main/java/org/jiemamy/composer/importer/meta/RelationshipNotEntityException.java (rev 0) +++ charon/jiemamy-jpa-importer/trunk/src/main/java/org/jiemamy/composer/importer/meta/RelationshipNotEntityException.java 2009-04-07 05:52:48 UTC (rev 3151) @@ -0,0 +1,39 @@ +/* + * Copyright 2007-2009 Jiemamy Project and the Others. + * Created on Apr 6, 2009 + * + * 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.composer.importer.meta; + +/** + * TODO for junichi + * + * @author junichi + */ +public class RelationshipNotEntityException extends Exception { + + /** + * インスタンスを生成する。 + * + * @param name + * @param name2 + * @param relationshipClass + */ + public RelationshipNotEntityException(String name, String name2, Class<?> relationshipClass) { + // TODO Auto-generated constructor stub + } + +} Property changes on: charon/jiemamy-jpa-importer/trunk/src/main/java/org/jiemamy/composer/importer/meta/RelationshipNotEntityException.java ___________________________________________________________________ Added: svn:mime-type + text/plain Added: charon/jiemamy-jpa-importer/trunk/src/main/java/org/jiemamy/composer/importer/meta/SequenceIdGenerator.java =================================================================== --- charon/jiemamy-jpa-importer/trunk/src/main/java/org/jiemamy/composer/importer/meta/SequenceIdGenerator.java (rev 0) +++ charon/jiemamy-jpa-importer/trunk/src/main/java/org/jiemamy/composer/importer/meta/SequenceIdGenerator.java 2009-04-07 05:52:48 UTC (rev 3151) @@ -0,0 +1,42 @@ +/* + * Copyright 2007-2009 Jiemamy Project and the Others. + * Created on Apr 6, 2009 + * + * 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.composer.importer.meta; + +import javax.persistence.SequenceGenerator; + + +/** + * TODO for junichi + * + * @author junichi + */ +public class SequenceIdGenerator { + + /** + * インスタンスを生成する。 + * + * @param entityMeta + * @param propertyMeta + * @param sequenceGenerator + */ + public SequenceIdGenerator(EntityMeta entityMeta, PropertyMeta propertyMeta, SequenceGenerator sequenceGenerator) { + // TODO Auto-generated constructor stub + } + +} Property changes on: charon/jiemamy-jpa-importer/trunk/src/main/java/org/jiemamy/composer/importer/meta/SequenceIdGenerator.java ___________________________________________________________________ Added: svn:mime-type + text/plain Added: charon/jiemamy-jpa-importer/trunk/src/main/java/org/jiemamy/composer/importer/meta/TableIdGenerator.java =================================================================== --- charon/jiemamy-jpa-importer/trunk/src/main/java/org/jiemamy/composer/importer/meta/TableIdGenerator.java (rev 0) +++ charon/jiemamy-jpa-importer/trunk/src/main/java/org/jiemamy/composer/importer/meta/TableIdGenerator.java 2009-04-07 05:52:48 UTC (rev 3151) @@ -0,0 +1,41 @@ +/* + * Copyright 2007-2009 Jiemamy Project and the Others. + * Created on Apr 6, 2009 + * + * 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.composer.importer.meta; + +import javax.persistence.TableGenerator; + +/** + * TODO for junichi + * + * @author junichi + */ +public class TableIdGenerator { + + /** + * インスタンスを生成する。 + * + * @param entityMeta + * @param propertyMeta + * @param tableGenerator + */ + public TableIdGenerator(EntityMeta entityMeta, PropertyMeta propertyMeta, TableGenerator tableGenerator) { + // TODO Auto-generated constructor stub + } + +} Property changes on: charon/jiemamy-jpa-importer/trunk/src/main/java/org/jiemamy/composer/importer/meta/TableIdGenerator.java ___________________________________________________________________ Added: svn:mime-type + text/plain Added: charon/jiemamy-jpa-importer/trunk/src/main/java/org/jiemamy/composer/importer/meta/UnsupportedPropertyTypesException.java =================================================================== --- charon/jiemamy-jpa-importer/trunk/src/main/java/org/jiemamy/composer/importer/meta/UnsupportedPropertyTypesException.java (rev 0) +++ charon/jiemamy-jpa-importer/trunk/src/main/java/org/jiemamy/composer/importer/meta/UnsupportedPropertyTypesException.java 2009-04-07 05:52:48 UTC (rev 3151) @@ -0,0 +1,39 @@ +/* + * Copyright 2007-2009 Jiemamy Project and the Others. + * Created on Apr 6, 2009 + * + * 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.composer.importer.meta; + +/** + * TODO for junichi + * + * @author junichi + */ +public class UnsupportedPropertyTypesException extends Exception { + + /** + * インスタンスを生成する。 + * + * @param name + * @param name2 + * @param propertyClass + */ + public UnsupportedPropertyTypesException(String name, String name2, Class<?> propertyClass) { + // TODO Auto-generated constructor stub + } + +} Property changes on: charon/jiemamy-jpa-importer/trunk/src/main/java/org/jiemamy/composer/importer/meta/UnsupportedPropertyTypesException.java ___________________________________________________________________ Added: svn:mime-type + text/plain Modified: charon/jiemamy-jpa-importer/trunk/src/main/java/org/jiemamy/composer/importer/meta/impl/EntityMetaFactoryImpl.java =================================================================== --- charon/jiemamy-jpa-importer/trunk/src/main/java/org/jiemamy/composer/importer/meta/impl/EntityMetaFactoryImpl.java 2009-04-07 01:02:00 UTC (rev 3150) +++ charon/jiemamy-jpa-importer/trunk/src/main/java/org/jiemamy/composer/importer/meta/impl/EntityMetaFactoryImpl.java 2009-04-07 05:52:48 UTC (rev 3151) @@ -38,9 +38,9 @@ import org.jiemamy.composer.importer.meta.PropertyMetaFactory; import org.jiemamy.composer.importer.meta.TableMeta; import org.jiemamy.composer.importer.meta.TableMetaFactory; -import org.jiemamy.composer.importer.utils.ClassUtil; -import org.jiemamy.composer.importer.utils.CollectionsUtil; -import org.jiemamy.composer.importer.utils.ModifierUtil; +import org.jiemamy.utils.ClassUtil; +import org.jiemamy.utils.CollectionsUtil; +import org.jiemamy.utils.ModifierUtil; /** * {@link EntityMetaFactory}の実装クラス。 Modified: charon/jiemamy-jpa-importer/trunk/src/main/java/org/jiemamy/composer/importer/meta/impl/EntityMetaReaderImpl.java =================================================================== --- charon/jiemamy-jpa-importer/trunk/src/main/java/org/jiemamy/composer/importer/meta/impl/EntityMetaReaderImpl.java 2009-04-07 01:02:00 UTC (rev 3150) +++ charon/jiemamy-jpa-importer/trunk/src/main/java/org/jiemamy/composer/importer/meta/impl/EntityMetaReaderImpl.java 2009-04-07 05:52:48 UTC (rev 3151) @@ -36,14 +36,14 @@ import org.jiemamy.composer.importer.meta.EntityMetaFactory; import org.jiemamy.composer.importer.meta.EntityMetaReader; import org.jiemamy.composer.importer.meta.EntityMetaReaderContext; -import org.jiemamy.composer.importer.utils.ClassLoaderUtil; -import org.jiemamy.composer.importer.utils.ClassTraversal; -import org.jiemamy.composer.importer.utils.ClassUtil; -import org.jiemamy.composer.importer.utils.CollectionsUtil; -import org.jiemamy.composer.importer.utils.FileUtil; -import org.jiemamy.composer.importer.utils.TraversalHandlerException; -import org.jiemamy.composer.importer.utils.ClassTraversal.ClassHandler; +import org.jiemamy.utils.ClassLoaderUtil; +import org.jiemamy.utils.ClassTraversal; +import org.jiemamy.utils.ClassUtil; +import org.jiemamy.utils.CollectionsUtil; +import org.jiemamy.utils.FileUtil; import org.jiemamy.utils.LogMarker; +import org.jiemamy.utils.TraversalHandlerException; +import org.jiemamy.utils.ClassTraversal.ClassHandler; /** * {@link EntityMetaReader}の実装クラス。 Added: charon/jiemamy-jpa-importer/trunk/src/main/java/org/jiemamy/composer/importer/meta/impl/IdGeneratorNotFoundException.java =================================================================== --- charon/jiemamy-jpa-importer/trunk/src/main/java/org/jiemamy/composer/importer/meta/impl/IdGeneratorNotFoundException.java (rev 0) +++ charon/jiemamy-jpa-importer/trunk/src/main/java/org/jiemamy/composer/importer/meta/impl/IdGeneratorNotFoundException.java 2009-04-07 05:52:48 UTC (rev 3151) @@ -0,0 +1,39 @@ +/* + * Copyright 2007-2009 Jiemamy Project and the Others. + * Created on Apr 6, 2009 + * + * 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.composer.importer.meta.impl; + +/** + * TODO for junichi + * + * @author junichi + */ +public class IdGeneratorNotFoundException extends Exception { + + /** + * インスタンスを生成する。 + * + * @param name + * @param name2 + * @param generator + */ + public IdGeneratorNotFoundException(String name, String name2, String generator) { + // TODO Auto-generated constructor stub + } + +} Property changes on: charon/jiemamy-jpa-importer/trunk/src/main/java/org/jiemamy/composer/importer/meta/impl/IdGeneratorNotFoundException.java ___________________________________________________________________ Added: svn:mime-type + text/plain Added: charon/jiemamy-jpa-importer/trunk/src/main/java/org/jiemamy/composer/importer/meta/impl/JoinColumnNameAndReferencedColumnNameMandatoryException.java =================================================================== --- charon/jiemamy-jpa-importer/trunk/src/main/java/org/jiemamy/composer/importer/meta/impl/JoinColumnNameAndReferencedColumnNameMandatoryException.java (rev 0) +++ charon/jiemamy-jpa-importer/trunk/src/main/java/org/jiemamy/composer/importer/meta/impl/JoinColumnNameAndReferencedColumnNameMandatoryException.java 2009-04-07 05:52:48 UTC (rev 3151) @@ -0,0 +1,39 @@ +/* + * Copyright 2007-2009 Jiemamy Project and the Others. + * Created on Apr 6, 2009 + * + * 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.composer.importer.meta.impl; + +/** + * TODO for junichi + * + * @author junichi + */ +public class JoinColumnNameAndReferencedColumnNameMandatoryException extends Exception { + + /** + * インスタンスを生成する。 + * + * @param name + * @param name2 + * @param i + */ + public JoinColumnNameAndReferencedColumnNameMandatoryException(String name, String name2, int i) { + // TODO Auto-generated constructor stub + } + +} Property changes on: charon/jiemamy-jpa-importer/trunk/src/main/java/org/jiemamy/composer/importer/meta/impl/JoinColumnNameAndReferencedColumnNameMandatoryException.java ___________________________________________________________________ Added: svn:mime-type + text/plain Added: charon/jiemamy-jpa-importer/trunk/src/main/java/org/jiemamy/composer/importer/meta/impl/LazyFetchSpecifiedException.java =================================================================== --- charon/jiemamy-jpa-importer/trunk/src/main/java/org/jiemamy/composer/importer/meta/impl/LazyFetchSpecifiedException.java (rev 0) +++ charon/jiemamy-jpa-importer/trunk/src/main/java/org/jiemamy/composer/importer/meta/impl/LazyFetchSpecifiedException.java 2009-04-07 05:52:48 UTC (rev 3151) @@ -0,0 +1,38 @@ +/* + * Copyright 2007-2009 Jiemamy Project and the Others. + * Created on Apr 6, 2009 + * + * 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.composer.importer.meta.impl; + +/** + * TODO for junichi + * + * @author junichi + */ +public class LazyFetchSpecifiedException extends Exception { + + /** + * インスタンスを生成する。 + * + * @param name + * @param name2 + */ + public LazyFetchSpecifiedException(String name, String name2) { + // TODO Auto-generated constructor stub + } + +} Property changes on: charon/jiemamy-jpa-importer/trunk/src/main/java/org/jiemamy/composer/importer/meta/impl/LazyFetchSpecifiedException.java ___________________________________________________________________ Added: svn:mime-type + text/plain Added: charon/jiemamy-jpa-importer/trunk/src/main/java/org/jiemamy/composer/importer/meta/impl/OneToManyNotListException.java =================================================================== --- charon/jiemamy-jpa-importer/trunk/src/main/java/org/jiemamy/composer/importer/meta/impl/OneToManyNotListException.java (rev 0) +++ charon/jiemamy-jpa-importer/trunk/src/main/java/org/jiemamy/composer/importer/meta/impl/OneToManyNotListException.java 2009-04-07 05:52:48 UTC (rev 3151) @@ -0,0 +1,38 @@ +/* + * Copyright 2007-2009 Jiemamy Project and the Others. + * Created on Apr 6, 2009 + * + * 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.composer.importer.meta.impl; + +/** + * TODO for junichi + * + * @author junichi + */ +public class OneToManyNotListException extends Exception { + + /** + * インスタンスを生成する。 + * + * @param name + * @param name2 + */ + public OneToManyNotListException(String name, String name2) { + // TODO Auto-generated constructor stub + } + +} Property changes on: charon/jiemamy-jpa-importer/trunk/src/main/java/org/jiemamy/composer/importer/meta/impl/OneToManyNotListException.java ___________________________________________________________________ Added: svn:mime-type + text/plain Modified: charon/jiemamy-jpa-importer/trunk/src/main/java/org/jiemamy/composer/importer/meta/impl/PropertyMetaFactoryImpl.java =================================================================== --- charon/jiemamy-jpa-importer/trunk/src/main/java/org/jiemamy/composer/importer/meta/impl/PropertyMetaFactoryImpl.java 2009-04-07 01:02:00 UTC (rev 3150) +++ charon/jiemamy-jpa-importer/trunk/src/main/java/org/jiemamy/composer/importer/meta/impl/PropertyMetaFactoryImpl.java 2009-04-07 05:52:48 UTC (rev 3151) @@ -19,13 +19,49 @@ package org.jiemamy.composer.importer.meta.impl; import java.lang.reflect.Field; +import java.util.Calendar; +import java.util.List; +import javax.persistence.Basic; +import javax.persistence.Entity; +import javax.persistence.Enumerated; +import javax.persistence.FetchType; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.JoinColumns; +import javax.persistence.Lob; +import javax.persistence.ManyToMany; +import javax.persistence.ManyToOne; +import javax.persistence.OneToMany; +import javax.persistence.OneToOne; +import javax.persistence.SequenceGenerator; +import javax.persistence.TableGenerator; +import javax.persistence.Temporal; +import javax.persistence.Transient; +import javax.persistence.Version; + +import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.Validate; +import org.jiemamy.composer.importer.meta.BothMappedByAndJoinColumnException; import org.jiemamy.composer.importer.meta.ColumnMetaFactory; import org.jiemamy.composer.importer.meta.EntityMeta; +import org.jiemamy.composer.importer.meta.IdentityIdGenerator; +import org.jiemamy.composer.importer.meta.JoinColumnMeta; +import org.jiemamy.composer.importer.meta.MappedByMandatoryException; +import org.jiemamy.composer.importer.meta.OneToManyNotGenericsException; import org.jiemamy.composer.importer.meta.PropertyMeta; import org.jiemamy.composer.importer.meta.PropertyMetaFactory; +import org.jiemamy.composer.importer.meta.RelationshipNotEntityException; +import org.jiemamy.composer.importer.meta.RelationshipType; +import org.jiemamy.composer.importer.meta.SequenceIdGenerator; +import org.jiemamy.composer.importer.meta.TableIdGenerator; +import org.jiemamy.composer.importer.meta.UnsupportedPropertyTypesException; +import org.jiemamy.utils.ClassUtil; +import org.jiemamy.utils.ModifierUtil; +import org.jiemamy.utils.ReflectionUtil; /** * {@link PropertyMetaFactory}の実装クラス。 @@ -36,6 +72,14 @@ private ColumnMetaFactory columnMetaFactory; + /** デフォルトの{@link SequenceGenerator} */ + protected static final SequenceGenerator DEFAULT_SEQUENCE_GENERATOR = + PropertyMetaFactoryImpl.class.getAnnotation(SequenceGenerator.class); + + /** デフォルトの{@link TableGenerator} */ + protected static final TableGenerator DEFAULT_TABLE_GENERATOR = + PropertyMetaFactoryImpl.class.getAnnotation(TableGenerator.class); + /** * インスタンスを生成する。 @@ -56,15 +100,52 @@ Object relationshipAnnotation = getRelationshipAnnotation(field); if (relationshipAnnotation == null) { doColumnMeta(propertyMeta, field, entityMeta); - doId(propertyMeta, field, entityMeta); - doFetchType(propertyMeta, field, entityMeta); - doTemporal(propertyMeta, field, entityMeta); - doEnum(propertyMeta, field, entityMeta); - doVersion(propertyMeta, field, entityMeta); - doLob(propertyMeta, field, entityMeta); - doValueType(propertyMeta, entityMeta); + try { + doId(propertyMeta, field, entityMeta); + doFetchType(propertyMeta, field, entityMeta); + doTemporal(propertyMeta, field, entityMeta); + doEnum(propertyMeta, field, entityMeta); + doVersion(propertyMeta, field, entityMeta); + doLob(propertyMeta, field, entityMeta); + } catch (IdGeneratorNotFoundException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (LazyFetchSpecifiedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (TemporalTypeNotSpecifiedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (VersionPropertyNotNumberException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } else { - doRelationship(propertyMeta, field, entityMeta, relationshipAnnotation); + try { + doRelationship(propertyMeta, field, entityMeta, relationshipAnnotation); + } catch (UnsupportedRelationshipException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (JoinColumnNameAndReferencedColumnNameMandatoryException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (RelationshipNotEntityException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (BothMappedByAndJoinColumnException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (OneToManyNotListException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (OneToManyNotGenericsException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (MappedByMandatoryException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } } } doCustomize(propertyMeta, field, entityMeta); @@ -81,56 +162,333 @@ } private void doEnum(PropertyMeta propertyMeta, Field field, EntityMeta entityMeta) { - // TODO Auto-generated method stub + if (propertyMeta.getPropertyClass().isEnum() == false) { + return; + } + Enumerated enumerated = field.getAnnotation(Enumerated.class); + if (enumerated == null) { + return; + } + propertyMeta.setEnumType(enumerated.value()); } - private void doFetchType(PropertyMeta propertyMeta, Field field, EntityMeta entityMeta) { - // TODO Auto-generated method stub + private void doFetchType(PropertyMeta propertyMeta, Field field, EntityMeta entityMeta) + throws LazyFetchSpecifiedException { + final Basic basic = field.getAnnotation(Basic.class); + if (basic == null) { + propertyMeta.setFetchType(FetchType.EAGER); + return; + } + if (propertyMeta.isId() && basic.fetch() == FetchType.LAZY) { + throw new LazyFetchSpecifiedException(entityMeta.getName(), propertyMeta.getName()); + } + propertyMeta.setFetchType(basic.fetch()); } private void doField(PropertyMeta propertyMeta, Field field, EntityMeta entityMeta) { propertyMeta.setField(field); } - private void doId(PropertyMeta propertyMeta, Field field, EntityMeta entityMeta) { - // TODO Auto-generated method stub + private void doId(PropertyMeta propertyMeta, Field field, EntityMeta entityMeta) + throws IdGeneratorNotFoundException { + propertyMeta.setId(field.getAnnotation(Id.class) != null); + GeneratedValue generatedValue = field.getAnnotation(GeneratedValue.class); + if (generatedValue == null) { + return; + } + GenerationType generationType = generatedValue.strategy(); + propertyMeta.setGenerationType(generationType); + switch (generationType) { + case AUTO: + doIdentityIdGenerator(propertyMeta, entityMeta); + doSequenceIdGenerator(propertyMeta, generatedValue, entityMeta); + doTableIdGenerator(propertyMeta, generatedValue, entityMeta); + break; + case IDENTITY: + doIdentityIdGenerator(propertyMeta, entityMeta); + break; + case SEQUENCE: + if (!doSequenceIdGenerator(propertyMeta, generatedValue, entityMeta)) { + throw new IdGeneratorNotFoundException(entityMeta.getName(), propertyMeta.getName(), generatedValue + .generator()); + } + break; + case TABLE: + if (!doTableIdGenerator(propertyMeta, generatedValue, entityMeta)) { + throw new IdGeneratorNotFoundException(entityMeta.getName(), propertyMeta.getName(), generatedValue + .generator()); + } + break; + default: + } } + /** + * TODO for junichi + * + * @param propertyMeta + * @param entityMeta + */ + private void doIdentityIdGenerator(PropertyMeta propertyMeta, EntityMeta entityMeta) { + propertyMeta.setIdentityIdGenerator(new IdentityIdGenerator(entityMeta, propertyMeta)); + } + + /** + * TODO for junichi + * + * @param propertyMeta + * @param field + * @param entityMeta + * @throws JoinColumnNameAndReferencedColumnNameMandatoryException + */ + private void doJoinColumn(PropertyMeta propertyMeta, Field field, EntityMeta entityMeta) + throws JoinColumnNameAndReferencedColumnNameMandatoryException { + JoinColumn joinColumn = field.getAnnotation(JoinColumn.class); + if (joinColumn != null) { + JoinColumnMeta meta = new JoinColumnMeta(joinColumn.name(), joinColumn.referencedColumnName()); + propertyMeta.addJoinColumnMeta(meta); + } else { + JoinColumns joinColumns = field.getAnnotation(JoinColumns.class); + if (joinColumns != null) { + JoinColumn[] array = joinColumns.value(); + for (int i = 0; i < array.length; i++) { + JoinColumn jc = array[i]; + JoinColumnMeta meta = new JoinColumnMeta(jc.name(), jc.referencedColumnName()); + if (i > 0 && (meta.getName() == null || meta.getReferencedColumnName() == null)) { + throw new JoinColumnNameAndReferencedColumnNameMandatoryException(entityMeta.getName(), + propertyMeta.getName(), i + 1); + } + propertyMeta.addJoinColumnMeta(meta); + } + } + } + } + private void doLob(PropertyMeta propertyMeta, Field field, EntityMeta entityMeta) { - // TODO Auto-generated method stub + propertyMeta.setLob(field.getAnnotation(Lob.class) != null); } + /** + * TODO for junichi + * + * @param propertyMeta + * @param field + * @param entityMeta + * @param manyToOne + * @throws RelationshipNotEntityException + */ + private void doManyToOne(PropertyMeta propertyMeta, Field field, EntityMeta entityMeta, ManyToOne manyToOne) + throws RelationshipNotEntityException { + propertyMeta.setRelationshipType(RelationshipType.MANY_TO_ONE); + Class<?> relationshipClass = field.getType(); + if (relationshipClass.getAnnotation(Entity.class) == null) { + throw new RelationshipNotEntityException(entityMeta.getName(), propertyMeta.getName(), relationshipClass); + } + propertyMeta.setRelationshipClass(relationshipClass); + } + private void doName(PropertyMeta propertyMeta, Field field, EntityMeta entityMeta) { propertyMeta.setName(fromFieldNameToPropertyName(field.getName())); } + /** + * TODO for junichi + * + * @param propertyMeta + * @param field + * @param entityMeta + * @param oneToMany + * @throws OneToManyNotListException + * @throws OneToManyNotGenericsException + * @throws RelationshipNotEntityException + * @throws BothMappedByAndJoinColumnException + * @throws MappedByMandatoryException + */ + private void doOneToMany(PropertyMeta propertyMeta, Field field, EntityMeta entityMeta, OneToMany oneToMany) + throws OneToManyNotListException, OneToManyNotGenericsException, RelationshipNotEntityException, + BothMappedByAndJoinColumnException, MappedByMandatoryException { + propertyMeta.setRelationshipType(RelationshipType.ONE_TO_MANY); + if (!List.class.isAssignableFrom(field.getType())) { + throw new OneToManyNotListException(entityMeta.getName(), propertyMeta.getName()); + } + Class<?> relationshipClass = ReflectionUtil.getElementTypeOfList(field.getGenericType()); + if (relationshipClass == null) { + throw new OneToManyNotGenericsException(entityMeta.getName(), propertyMeta.getName()); + } + if (relationshipClass.getAnnotation(Entity.class) == null) { + throw new RelationshipNotEntityException(entityMeta.getName(), propertyMeta.getName(), relationshipClass); + } + propertyMeta.setRelationshipClass(relationshipClass); + String mappedBy = oneToMany.mappedBy(); + if (!StringUtils.isEmpty(mappedBy)) { + if (propertyMeta.getJoinColumnMetaList().size() > 0) { + throw new BothMappedByAndJoinColumnException(entityMeta.getName(), propertyMeta.getName()); + } + propertyMeta.setMappedBy(mappedBy); + } else { + throw new MappedByMandatoryException(entityMeta.getName(), propertyMeta.getName()); + } + } + + /** + * TODO for junichi + * + * @param propertyMeta + * @param field + * @param entityMeta + * @param oneToOne + * @throws RelationshipNotEntityException + * @throws BothMappedByAndJoinColumnException + */ + private void doOneToOne(PropertyMeta propertyMeta, Field field, EntityMeta entityMeta, OneToOne oneToOne) + throws RelationshipNotEntityException, BothMappedByAndJoinColumnException { + propertyMeta.setRelationshipType(RelationshipType.ONE_TO_ONE); + Class<?> relationshipClass = field.getType(); + if (relationshipClass.getAnnotation(Entity.class) == null) { + throw new RelationshipNotEntityException(entityMeta.getName(), propertyMeta.getName(), relationshipClass); + } + propertyMeta.setRelationshipClass(relationshipClass); + String mappedBy = oneToOne.mappedBy(); + if (!StringUtils.isEmpty(mappedBy)) { + if (propertyMeta.getJoinColumnMetaList().size() > 0) { + throw new BothMappedByAndJoinColumnException(entityMeta.getName(), propertyMeta.getName()); + } + propertyMeta.setMappedBy(mappedBy); + } + } + private void doRelationship(PropertyMeta propertyMeta, Field field, EntityMeta entityMeta, - Object relationshipAnnotation) { - // TODO Auto-generated method stub + Object relationshipAnnotation) throws UnsupportedRelationshipException, + JoinColumnNameAndReferencedColumnNameMandatoryException, RelationshipNotEntityException, + BothMappedByAndJoinColumnException, OneToManyNotListException, OneToManyNotGenericsException, + MappedByMandatoryException { + doJoinColumn(propertyMeta, field, entityMeta); + if (OneToOne.class.isInstance(relationshipAnnotation)) { + doOneToOne(propertyMeta, field, entityMeta, OneToOne.class.cast(relationshipAnnotation)); + } else if (OneToMany.class.isInstance(relationshipAnnotation)) { + doOneToMany(propertyMeta, field, entityMeta, OneToMany.class.cast(relationshipAnnotation)); + } else if (ManyToOne.class.isInstance(relationshipAnnotation)) { + doManyToOne(propertyMeta, field, entityMeta, ManyToOne.class.cast(relationshipAnnotation)); + } else { + throw new UnsupportedRelationshipException(entityMeta.getName(), propertyMeta.getName()); + } } - private void doTemporal(PropertyMeta propertyMeta, Field field, EntityMeta entityMeta) { - // TODO Auto-generated method stub + /** + * TODO for junichi + * + * @param propertyMeta + * @param generatedValue + * @param entityMeta + */ + private boolean doSequenceIdGenerator(PropertyMeta propertyMeta, GeneratedValue generatedValue, + EntityMeta entityMeta) { + String name = generatedValue.generator(); + SequenceGenerator sequenceGenerator; + if (StringUtils.isEmpty(name)) { + sequenceGenerator = DEFAULT_SEQUENCE_GENERATOR; + } else { + sequenceGenerator = propertyMeta.getField().getAnnotation(SequenceGenerator.class); + if (sequenceGenerator == null || !name.equals(sequenceGenerator.name())) { + sequenceGenerator = entityMeta.getEntityClass().getAnnotation(SequenceGenerator.class); + if (sequenceGenerator == null || !name.equals(sequenceGenerator.name())) { + return false; + } + } + } + propertyMeta.setSequenceIdGenerator(new SequenceIdGenerator(entityMeta, propertyMeta, sequenceGenerator)); + return true; } + /** + * TODO for junichi + * + * @param propertyMeta + * @param generatedValue + * @param entityMeta + * @return + */ + private boolean doTableIdGenerator(PropertyMeta propertyMeta, GeneratedValue generatedValue, EntityMeta entityMeta) { + String name = generatedValue.generator(); + TableGenerator tableGenerator; + if (StringUtils.isEmpty(name)) { + tableGenerator = DEFAULT_TABLE_GENERATOR; + } else { + tableGenerator = propertyMeta.getField().getAnnotation(TableGenerator.class); + if (tableGenerator == null || !name.equals(tableGenerator.name())) { + tableGenerator = entityMeta.getEntityClass().getAnnotation(TableGenerator.class); + if (tableGenerator == null || !name.equals(tableGenerator.name())) { + return false; + } + } + } + propertyMeta.setTableIdGenerator(new TableIdGenerator(entityMeta, propertyMeta, tableGenerator)); + return true; + + } + + private void doTemporal(PropertyMeta propertyMeta, Field field, EntityMeta entityMeta) + throws TemporalTypeNotSpecifiedException { + if (propertyMeta.getPropertyClass() != java.util.Date.class + && propertyMeta.getPropertyClass() != Calendar.class) { + return; + } + Temporal temporal = field.getAnnotation(Temporal.class); + if (temporal == null) { + throw new TemporalTypeNotSpecifiedException(entityMeta.getName(), propertyMeta.getName()); + } + propertyMeta.setTemporalType(temporal.value()); + } + private void doTransient(PropertyMeta propertyMeta, Field field, EntityMeta entityMeta) { - // TODO Auto-generated method stub + propertyMeta.setTransient(field.getAnnotation(Transient.class) != null || ModifierUtil.isTransient(field)); } - private void doValueType(PropertyMeta propertyMeta, EntityMeta entityMeta) { - // TODO Auto-generated method stub + private void doValueType(PropertyMeta propertyMeta, EntityMeta entityMeta) throws UnsupportedPropertyTypesException { + + throw new UnsupportedPropertyTypesException(entityMeta.getName(), propertyMeta.getName(), propertyMeta + .getPropertyClass()); } - private void doVersion(PropertyMeta propertyMeta, Field field, EntityMeta entityMeta) { - // TODO Auto-generated method stub + private void doVersion(PropertyMeta propertyMeta, Field field, EntityMeta entityMeta) + throws VersionPropertyNotNumberException { + if (field.getAnnotation(Version.class) == null) { + return; + } + Class<?> clazz = ClassUtil.getWrapperClassIfPrimitive(field.getType()); + if (clazz != Integer.class && clazz != Long.class && clazz != int.class && clazz != long.class) { + throw new VersionPropertyNotNumberException(entityMeta.getName(), propertyMeta.getName()); + } + propertyMeta.setVersion(true); } private String fromFieldNameToPropertyName(String name) { return name; } - private Object getRelationshipAnnotation(Field field) { - // TODO Auto-generated method stub + /** + * フィールドに関連のアノテーションが指定されていればそれを取得する。 + * + * @param field フィールド + * @return 関連のアノテーションまたは<code>null</code> + */ + protected Object getRelationshipAnnotation(Field field) { + final OneToOne oneToOne = field.getAnnotation(OneToOne.class); + if (oneToOne != null) { + return oneToOne; + } + final OneToMany oneToMany = field.getAnnotation(OneToMany.class); + if (oneToMany != null) { + return oneToMany; + } + final ManyToOne manyToOne = field.getAnnotation(ManyToOne.class); + if (manyToOne != null) { + return manyToOne; + } + final ManyToMany manyToMany = field.getAnnotation(ManyToMany.class); + if (manyToMany != null) { + return manyToMany; + } return null; } Added: charon/jiemamy-jpa-importer/trunk/src/main/java/org/jiemamy/composer/importer/meta/impl/TemporalTypeNotSpecifiedException.java =================================================================== --- charon/jiemamy-jpa-importer/trunk/src/main/java/org/jiemamy/composer/importer/meta/impl/TemporalTypeNotSpecifiedException.java (rev 0) +++ charon/jiemamy-jpa-importer/trunk/src/main/java/org/jiemamy/composer/importer/meta/impl/TemporalTypeNotSpecifiedException.java 2009-04-07 05:52:48 UTC (rev 3151) @@ -0,0 +1,38 @@ +/* + * Copyright 2007-2009 Jiemamy Project and the Others. + * Created on Apr 6, 2009 + * + * 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.composer.importer.meta.impl; + +/** + * TODO for junichi + * + * @author junichi + */ +public class TemporalTypeNotSpecifiedException extends Exception { + + /** + * インスタンスを生成する。 + * + * @param name + * @param name2 + */ + public TemporalTypeNotSpecifiedException(String name, String name2) { + // TODO Auto-generated constructor stub + } + +} Property changes on: charon/jiemamy-jpa-importer/trunk/src/main/java/org/jiemamy/composer/importer/meta/impl/TemporalTypeNotSpecifiedException.java ___________________________________________________________________ Added: svn:mime-type + text/plain Added: charon/jiemamy-jpa-importer/trunk/src/main/java/org/jiemamy/composer/importer/meta/impl/UnsupportedRelationshipException.java =================================================================== --- charon/jiemamy-jpa-importer/trunk/src/main/java/org/jiemamy/composer/importer/meta/impl/UnsupportedRelationshipException.java (rev 0) +++ charon/jiemamy-jpa-importer/trunk/src/main/java/org/jiemamy/composer/importer/meta/impl/UnsupportedRelationshipException.java 2009-04-07 05:52:48 UTC (rev 3151) @@ -0,0 +1,38 @@ +/* + * Copyright 2007-2009 Jiemamy Project and the Others. + * Created on Apr 6, 2009 + * + * 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.composer.importer.meta.impl; + +/** + * TODO for junichi + * + * @author junichi + */ +public class UnsupportedRelationshipException extends Exception { + + /** + * インスタンスを生成する。 + * + * @param name + * @param name2 + */ + public UnsupportedRelationshipException(String name, String name2) { + // TODO Auto-generated constructor stub + } + +} Property changes on: charon/jiemamy-jpa-importer/trunk/src/main/java/org/jiemamy/composer/importer/meta/impl/UnsupportedRelationshipException.java ___________________________________________________________________ Added: svn:mime-type + text/plain Added: charon/jiemamy-jpa-importer/trunk/src/main/java/org/jiemamy/composer/importer/meta/impl/VersionPropertyNotNumberException.java =================================================================== --- charon/jiemamy-jpa-importer/trunk/src/main/java/org/jiemamy/composer/importer/meta/impl/VersionPropertyNotNumberException.java (rev 0) +++ charon/jiemamy-jpa-importer/trunk/src/main/java/org/jiemamy/composer/importer/meta/impl/VersionPropertyNotNumberException.java 2009-04-07 05:52:48 UTC (rev 3151) @@ -0,0 +1,38 @@ +/* + * Copyright 2007-2009 Jiemamy Project and the Others. + * Created on Apr 6, 2009 + * + * 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.composer.importer.meta.impl; + +/** + * TODO for junichi + * + * @author junichi + */ +public class VersionPropertyNotNumberException extends Exception { + + /** + * インスタンスを生成する。 + * + * @param name + * @param name2 + */ + public VersionPropertyNotNumberException(String name, String name2) { + // TODO Auto-generated constructor stub + } + +} Property changes on: charon/jiemamy-jpa-importer/trunk/src/main/java/org/jiemamy/composer/importer/meta/impl/VersionPropertyNotNumberException.java ___________________________________________________________________ Added: svn:mime-type + text/plain Modified: charon/jiemamy-jpa-importer/trunk/src/test/java/org/jiemamy/composer/importer/JpaImporterTest.java =================================================================== --- charon/jiemamy-jpa-importer/trunk/src/test/java/org/jiemamy/composer/importer/JpaImporterTest.java 2009-04-07 01:02:00 UTC (rev 3150) +++ charon/jiemamy-jpa-importer/trunk/src/test/java/org/jiemamy/composer/importer/JpaImporterTest.java 2009-04-07 05:52:48 UTC (rev 3151) @@ -30,10 +30,10 @@ import org.jiemamy.Artemis; import org.jiemamy.Jiemamy; import org.jiemamy.composer.ImportException; -import org.jiemamy.composer.importer.utils.ResourceNotFoundException; -import org.jiemamy.composer.importer.utils.ResourceUtil; import org.jiemamy.internal.test.ReflectionDialectProvider; import org.jiemamy.model.RootModel; +import org.jiemamy.utils.ResourceNotFoundException; +import org.jiemamy.utils.ResourceUtil; /** * {@link JpaImporter}のテスト。 Modified: leto/jiemamy-commons/trunk/pom.xml =================================================================== --- leto/jiemamy-commons/trunk/pom.xml 2009-04-07 01:02:00 UTC (rev 3150) +++ leto/jiemamy-commons/trunk/pom.xml 2009-04-07 05:52:48 UTC (rev 3151) @@ -160,6 +160,12 @@ <artifactId>commons-io</artifactId> <version>1.3.2</version> </dependency> + <dependency> + <groupId>javassist</groupId> + <artifactId>javassist</artifactId> + <version>3.8.0.GA</version> + <optional>false</optional> + </dependency> </dependencies> <reporting> <plugins> Added: leto/jiemamy-commons/trunk/src/main/java/org/jiemamy/utils/ClassLoaderUtil.java =================================================================== --- leto/jiemamy-commons/trunk/src/main/java/org/jiemamy/utils/ClassLoaderUtil.java (rev 0) +++ leto/jiemamy-commons/trunk/src/main/java/org/jiemamy/utils/ClassLoaderUtil.java 2009-04-07 05:52:48 UTC (rev 3151) @@ -0,0 +1,287 @@ +/* + * Copyright 2007-2009 Jiemamy Project and the Others. + * + * 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 java.io.IOException; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.net.URL; +import java.util.Enumeration; +import java.util.Iterator; + +import org.jiemamy.exception.JiemamyError; + +/** + * {@link ClassLoader}を扱うためのユーティリティクラス。 + * + * @author j5ik2o + */ +public class ClassLoaderUtil { + + private static final Method FIND_LOADED_CLASS_METHOD = getFindLoadedClassMethod(); + + private static final Method DEFINE_CLASS_METHOD = getDefineClassMethod(); + + private static final Method DEFINE_PACKAGE_METHOD = getDefinePackageMethod(); + + + /** + * バイトの配列を<code>Class</code>クラスのインスタンスに変換する。 + * + * @param classLoader バイナリデータから<code>Class</code>クラスのインスタンスに変換するクラスローダ + * @param className クラスのバイナリ名 + * @param bytes クラスデータを構成するバイト列 + * @param offset クラスデータ<code>bytes</code>の開始オフセット + * @param length クラスデータの長さ + * @return 指定されたクラスデータから作成された<code>Class</code>オブジェクト + * @throws InvocationTargetException 基本となるメソッドが例外をスローする場合 + * @throws IllegalAccessException 基本となるメソッドにアクセスできない場合 + * @throws IllegalArgumentException + */ + public static Class<?> defineClass(final ClassLoader classLoader, final String className, final byte[] bytes, + final int offset, final int length) throws IllegalArgumentException, IllegalAccessException, + InvocationTargetException { + return (Class<?>) MethodUtil.invoke(DEFINE_CLASS_METHOD, classLoader, new Object[] { + className, + bytes, + Integer.valueOf(offset), + Integer.valueOf(length) + }); + } + + /** + * 指定の<code>ClassLoader</code>で名前を使ってパッケージを定義する。 + * + * @param classLoader パッケージを定義するクラスローダ + * @param name パッケージ名 + * @param specTitle 仕様のタイトル + * @param specVersion 仕様のバージョン + * @param specVendor 仕様のベンダー + * @param implTitle 実装のタイトル + * @param implVersion 実装のバージョン + * @param implVendor 実装のベンダー + * @param sealBase <code>null</code>でない場合、このパッケージは指定されたコードソース<code>URL</code>オブジェクトを考慮してシールされる。そうでない場合、パッケージはシールされない + * @return 新しく定義された<code>Package</code>オブジェクト + * @throws InvocationTargetException メソッドが例外をスローする場合 + * @throws IllegalAccessException メソッドにアクセスできない場合 + * @throws IllegalArgumentException 引数が正しくない場合 + */ + public static Package definePackage(final ClassLoader classLoader, final String name, final String specTitle, + final String specVersion, final String specVendor, final String implTitle, final String implVersion, + final String implVendor, final URL sealBase) throws IllegalArgumentException, IllegalAccessException, + InvocationTargetException { + return (Package) MethodUtil.invoke(DEFINE_PACKAGE_METHOD, classLoader, new Object[] { + name, + specTitle, + specVersion, + specVendor, + implTitle, + implVersion, + implVendor, + sealBase + }); + } + + /** + * 指定のクラスローダまたはその祖先のクラスローダが、 このバイナリ名を持つクラスの起動ローダとしてJava仮想マシンにより記録されていた場合は、 + * 指定されたバイナリ名を持つクラスを取得する。 記録されていなかった場合は<code>null</code>を取得する。 + * + * @param classLoader クラスローダ + * @param className クラスのバイナリ名 + * @return <code>Class</code>オブジェクト。クラスがロードされていない場合は<code>null</code> + * @throws InvocationTargetException メソッドが例外をスローする場合 + * @throws IllegalAccessException メソッドにアクセスできない場合 + * @throws IllegalArgumentException 引数が正しくない場合 + */ + public static Class<?> findLoadedClass(final ClassLoader classLoader, final String className) + throws IllegalArgumentException, IllegalAccessException, InvocationTargetException { + for (ClassLoader loader = classLoader; loader != null; loader = loader.getParent()) { + final Class<?> clazz = (Class<?>) MethodUtil.invoke(FIND_LOADED_CLASS_METHOD, loader, new Object[] { + className + }); + if (clazz != null) { + return clazz; + } + } + return null; + } + + /** + * クラスローダを取得する。 + * + * @param targetClass ターゲット・クラス + * @return クラスローダ + */ + public static ClassLoader getClassLoader(final Class<?> targetClass) { + final ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader(); + if (contextClassLoader != null) { + return contextClassLoader; + } + + final ClassLoader targetClassLoader = targetClass.getClassLoader(); + final ClassLoader thisClassLoader = ClassLoaderUtil.class.getClassLoader(); + if (targetClassLoader != null && thisClassLoader != null) { + if (isAncestor(thisClassLoader, targetClassLoader)) { + return thisClassLoader; + } + return targetClassLoader; + } + if (targetClassLoader != null) { + return targetClassLoader; + } + if (thisClassLoader != null) { + return thisClassLoader; + } + + final ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader(); + if (systemClassLoader != null) { + return systemClassLoader; + } + + throw new IllegalStateException(); + } + + private static Method getDefineClassMethod() { + try { + Method method = ClassUtil.getDeclaredMethod(ClassLoader.class, "defineClass", new Class[] { + String.class, + byte[].class, + int.class, + int.class + }); + method.setAccessible(true); + return method; + } catch (SecurityException e) { + e.printStackTrace(); + } catch (NoSuchMethodException e) { + e.printStackTrace(); + } + return null; + } + + private static Method getDefinePackageMethod() { + try { + Method method = ClassUtil.getDeclaredMethod(ClassLoader.class, "definePackage", new Class[] { + String.class, + String.class, + String.class, + String.class, + String.class, + String.class, + String.class, + URL.class + }); + method.setAccessible(true); + return method; + } catch (SecurityException e) { + e.printStackTrace(); + } catch (NoSuchMethodException e) { + e.printStackTrace(); + } + return null; + } + + private static Method getFindLoadedClassMethod() { + try { + Method method = ClassUtil.getDeclaredMethod(ClassLoader.class, "findLoadedClass", new Class[] { + String.class + }); + method.setAccessible(true); + return method; + } catch (SecurityException e) { + e.printStackTrace(); + } catch (NoSuchMethodException e) { + e.printStackTrace(); + } + return null; + } + + /** + * {@link #getClassLoader(Class)}が返すクラスローダから指定された名前を持つすべてのリソースを検索する。 + * + * @param targetClass ターゲット・クラス + * @param name リソース名 + * @return リソースに対するURL。オブジェクトの列挙。リソースが見つからなかった場合、列挙は空になる。クラスローダがアクセスを持たないリソースは列挙に入らない + * @throws IOException IOException 入出力エラーが発生した場合 + * @see java.lang.ClassLoader#getResources(String) + */ + public static Iterator<?> getResources(final Class<?> targetClass, final String name) throws IOException { + return getResources(getClassLoader(targetClass), name); + } + + /** + * 指定のクラスローダから指定された名前を持つすべてのリソースを検索する。 + * + * @param loader クラスローダ + * @param name リソース名 + * @return リソースに対するURL。オブジェクトの列挙。リソースが見つからなかった場合、列挙は空になる。クラスローダがアクセスを持たないリソースは列挙に入らない + * @throws IOException 入出力エラーが発生した場合 + */ + public static Iterator<URL> getResources(final ClassLoader loader, final String name) throws IOException { + + final Enumeration<URL> e = loader.getResources(name); + return new EnumerationIterator<URL>(e); + + } + + /** + * コンテキストクラスローダから指定された名前を持つすべてのリソースを検索する。 + * + * @param name リソース名 + * @return リソースに対するURL。オブジェクトの列挙。リソースが見つからなかった場合、列挙は空になる。クラスローダがアクセスを持たないリソースは列挙に入らない + * @throws IOException 入出力エラーが発生した場合 + */ + public static Iterator<URL> getResources(final String name) throws IOException { + return getResources(Thread.currentThread().getContextClassLoader(), name); + } + + /** + * クラスローダ<code>other</code>がクラスローダ<code>cl</code>の祖先なら<code>true</code>を取得する。 + * + * @param cl クラスローダ + * @param other クラスローダ + * @return クラスローダ<code>other</code>がクラスローダ<code>cl</code>の祖先なら<code>true</code> + */ + protected static boolean isAncestor(ClassLoader cl, final ClassLoader other) { + ClassLoader current = cl; + while (current != null) { + if (current == other) { + return true; + } + current = current.getParent(); + } + return false; + } + + /** + * 指定されたバイナリ名を持つクラスをロードする。 + * + * @param loader クラスローダ + * @param className クラスのバイナリ名 + * @return 結果の<code>Class</code>オブジェクト + * @throws ClassNotFoundException クラスが見つからなかった場合 + */ + public static Class<?> loadClass(final ClassLoader loader, final String className) throws ClassNotFoundException { + return loader.loadClass(className); + } + + private ClassLoaderUtil() { + throw new JiemamyError("不到達ポイント"); + } + +} Added: leto/jiemamy-commons/trunk/src/main/java/org/jiemamy/utils/ClassPoolUtil.java =================================================================== --- leto/jiemamy-commons/trunk/src/main/java/org/jiemamy/utils/ClassPoolUtil.java (rev 0) +++ leto/jiemamy-commons/trunk/src/main/java/org/jiemamy/utils/ClassPoolUtil.java 2009-04-07 05:52:48 UTC (rev 3151) @@ -0,0 +1,199 @@ +/* + * Copyright 2007-2009 Jiemamy Project and the Others. + * + * 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 java.util.Collections; +import java.util.Map; +import java.util.WeakHashMap; + +import javassist.ClassPool; +import javassist.CtClass; +import javassist.LoaderClassPath; +import javassist.NotFoundException; + +import org.apache.commons.lang.Validate; + +import org.jiemamy.exception.JiemamyError; + +/** + * ClassPool用のユーティリティクラス。 + * + * @author j5ik2o + */ +public class ClassPoolUtil { + + /** + * ClassPoolのキャッシュ。 + */ + protected static final Map<ClassLoader, ClassPool> CLASS_POOL_MAP = + Collections.synchronizedMap(new WeakHashMap<ClassLoader, ClassPool>()); + + + /** + * {@link ClassPool}から{@link CtClass}を作成する。 + * + * @param classPool クラスプール + * @param name クラス名 + * @return CtClass + */ + public static CtClass createCtClass(final ClassPool classPool, final String name) { + try { + return createCtClass(classPool, name, Object.class); + } catch (NotFoundException e) { + throw new JiemamyError("不到達ポイント"); + } + } + + /** + * {@link ClassPool}から{@link CtClass}を作成する。 + * + * @param classPool クラスプール + * @param name クラス名 + * @param superClass スーパークラス + * @return {@link CtClass} + * @throws NotFoundException クラスプールにsuperClassが見つからなかった場合 + */ + public static CtClass createCtClass(final ClassPool classPool, final String name, final Class<?> superClass) + throws NotFoundException { + return createCtClass(classPool, name, toCtClass(classPool, superClass)); + } + + /** + * {@link ClassPool}に{@link CtClass}を作成します。 + * + * @param classPool クラスプール + * @param name クラス名 + * @param superClass スーパークラス + * @return {@link CtClass} + */ + public static CtClass createCtClass(final ClassPool classPool, final String name, final CtClass superClass) { + return classPool.makeClass(name, superClass); + } + + /** + * リソースを破棄します。 + */ + public static synchronized void dispose() { + synchronized (ClassPoolUtil.class) { + CLASS_POOL_MAP.clear(); + } + } + + /** + * ClassPoolを返します。 + * + * @param targetClass ターゲットクラス + * @return {@link ClassPool} + */ + public static ClassPool getClassPool(final Class<?> targetClass) { + return getClassPool(ClassLoaderUtil.getClassLoader(targetClass)); + } + + /** + * ClassPoolを返します。 + * + * @param classLoader クラスローダ + * @return {@link ClassPool} + */ + public static ClassPool getClassPool(final ClassLoader classLoader) { + Validate.notNull(classLoader); + ClassPool classPool = CLASS_POOL_MAP.get(classLoader); + if (classPool == null) { + if (classLoader == null) { + return ClassPool.getDefault(); + } + classPool = new ClassPool(); + classPool.appendClassPath(new LoaderClassPath(classLoader)); + CLASS_POOL_MAP.put(classLoader, classPool); + } + return classPool; + } + + /** + * CtClassに変換する。 + * + * @param classPool クラスプール + * @param clazz クラス + * @return {@link CtClass} + * @throws NotFoundException クラスプールにクラスが見つからなかった場合 + */ + public static CtClass toCtClass(final ClassPool classPool, final Class<?> clazz) throws NotFoundException { + Validate.notNull(classPool); + Validate.notNull(clazz); + return toCtClass(classPool, ClassUtil.getSimpleClassName(clazz)); + } + + /** + * CtClassに変換する。 + * + * @param classPool クラスプール + * @param className クラス名 + * @return {@link CtClass} + * @throws NotFoundException クラスプールにクラスが見つからなかった場合 + */ + public static CtClass toCtClass(final ClassPool classPool, final String className) throws NotFoundException { + Validate.notNull(classPool); + Validate.notNull(className); + return classPool.get(className); + } + + /** + * CtClassの配列に変換する。 + * + * @param classPool クラスプール + * @param classes クラス配列 + * @return CtClassの配列 + * @throws NotFoundException クラスプールにクラスが見つからなかった場合 + */ + public static CtClass[] toCtClassArray(final ClassPool classPool, final Class<?>[] classes) + throws NotFoundException { + if (classes == null) { + return new CtClass[0]; + } + final CtClass[] result = new CtClass[classes.length]; + for (int i = 0; i < result.length; ++i) { + result[i] = toCtClass(classPool, classes[i]); + } + return result; + } + + /** + * CtClassの配列に変換する。 + * + * @param classPool クラスプール + * @param classNames クラス名配列 + * @return CtClassの配列 + * @throws NotFoundException クラスプールにクラスが見つからなかった場合 + */ + public static CtClass[] toCtClassArray(final ClassPool classPool, final String[] classNames) + throws NotFoundException { + Validate.notNull(classNames); + if (classNames == null) { + return new CtClass[0]; + } + final CtClass[] result = new CtClass[classNames.length]; + for (int i = 0; i < result.length; ++i) { + result[i] = toCtClass(classPool, classNames[i]); + } + return result; + } + + private ClassPoolUtil() { + throw new JiemamyError("不到達ポイント"); + } +} Added: leto/jiemamy-commons/trunk/src/main/java/org/jiemamy/utils/ClassTraversal.java =================================================================== --- leto/jiemamy-commons/trunk/src/main/java/org/jiemamy/utils/ClassTraversal.java (rev 0) +++ leto/jiemamy-commons/trunk/src/main/java/org/jiemamy/utils/ClassTraversal.java 2009-04-07 05:52:48 UTC (rev 3151) @@ -0,0 +1,141 @@ +/* + * Copyright 2007-2009 Jiemamy Project and the Others. + * + * 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 java.io.File; +import java.util.Enumeration; +import java.util.jar.JarEntry; +import java.util.jar.JarFile; + +import org.jiemamy.exception.JiemamyError; + +/** + * クラスを横断して処理するためのハンドらクラス。 + * + * @author j5ik2o + */ +public class ClassTraversal { + + /** + * クラスを横断して処理するためのハンドラインターフェイス。 + * + */ + public interface ClassHandler { + + /** + * クラスを処理する。 + * + * @param packageName パッケージ名 + * @param shortClassName クラス名 + * @throws TraversalHandlerException ハンドラの処理が失敗した場合 + */ + void processClass(String packageName, String shortClassName) throws TraversalHandlerException; + } + + + private static final String CLASS_SUFFIX = ".class"; + + private static final String WAR_FILE_EXTENSION = ".war"; + + private static final String WEB_INF_CLASSES_PATH = "WEB-INF/classes/"; + + + /** + * rootディレクトリ配下を処理します。 + * + * @param rootDir ルートディレクトリ + * @param handler ハンドラ + * @throws TraversalHandlerException ハンドラの処理が失敗した場合 + */ + public static void forEach(final File rootDir, final ClassHandler handler) throws TraversalHandlerException { + forEach(rootDir, null, handler); + } + + /** + * rootディレクトリ配下でrootパッケージ名配下を処理します。 + * + * @param rootDir ルートディレクトリ + * @param rootPackage ルートパッケージ + * @param handler ハンドラ + * @throws TraversalHandlerException ハンドラの処理が失敗した場合 + */ + public static void forEach(final File rootDir, final String rootPackage, final ClassHandler handler) + throws TraversalHandlerException { + final File packageDir = getPackageDir(rootDir, rootPackage); + if (packageDir.exists()) { + traverseFileSystem(packageDir, rootPackage, handler); + } + } + + /** + * 指定されたjarファイルを処理します。 + * + * @param jarFile Jarファイル + * @param handler ハンドラ + * @throws TraversalHandlerException ハンドラの処理が失敗した場合 + */ + public static void forEach(final JarFile jarFile, final ClassHandler handler) throws TraversalHandlerException { + final boolean hasWarExtension = jarFile.getName().endsWith(WAR_FILE_EXTENSION); + final Enumeration<JarEntry> enumeration = jarFile.entries(); + while (enumeration.hasMoreElements()) { + final JarEntry entry = enumeration.nextElement(); + final String entryName = entry.getName().replace('\\', '/'); + if (entryName.endsWith(CLASS_SUFFIX)) { + final int startPos = + hasWarExtension && entryName.startsWith(WEB_INF_CLASSES_PATH) ? WEB_INF_CLASSES_PATH.length() + : 0; + final String className = + entryName.substring(startPos, entryName.length() - CLASS_SUFFIX.length()).replace('/', '.'); + final int pos = className.lastIndexOf('.'); + final String packageName = (pos == -1) ? null : className.substring(0, pos); + final String shortClassName = (pos == -1) ? className : className.substring(pos + 1); + handler.processClass(packageName, shortClassName); + } + } + } + + private static File getPackageDir(final File rootDir, final String rootPackage) { + File packageDir = rootDir; + if (rootPackage != null) { + final String[] names = rootPackage.split("\\."); + for (String name : names) { + packageDir = new File(packageDir, name); + } + } + return packageDir; + } + + private static void traverseFileSystem(final File dir, final String packageName, final ClassHandler handler) + throws TraversalHandlerException { + final File[] files = dir.listFiles(); + for (int i = 0; i < files.length; ++i) { + final File file = files[i]; + final String fileName = file.getName(); + if (file.isDirectory()) { + traverseFileSystem(file, ClassUtil.concatName(packageName, fileName), handler); + } else if (fileName.endsWith(".class")) { + final String shortClassName = fileName.substring(0, fileName.length() - CLASS_SUFFIX.length()); + handler.processClass(packageName, shortClassName); + } + } + } + + private ClassTraversal() { + throw new JiemamyError("不到達ポイント"); + } +} Added: leto/jiemamy-commons/trunk/src/main/java/org/jiemamy/utils/ClassUtil.java =================================================================== --- leto/jiemamy-commons/trunk/src/main/java/org/jiemamy/utils/ClassUtil.java (rev 0) +++ leto/jiemamy-commons/trunk/src/main/java/org/jiemamy/utils/ClassUtil.java 2009-04-07 05:52:48 UTC (rev 3151) @@ -0,0 +1,432 @@ +/* + * Copyright 2007-2009 Jiemamy Project and the Others. + * + * 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 java.lang.reflect.Constructor; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.util.HashMap; +import java.util.Map; + +import javassist.ClassPool; +import javassist.CtClass; +import javassist.CtField; +import javassist.NotFoundException; + +import org.apache.commons.lang.StringUtils; + +import org.jiemamy.exception.JiemamyError; + +/** + * {@link Class}用のユーティリティクラスです。 + * + * @author j5ik2o + * + */ +public class ClassUtil { + + private static Map<Class<?>, Class<?>> wrapperToPrimitiveMap = new HashMap<Class<?>, Class<?>>(); + + private static Map<Class<?>, Class<?>> primitiveToWrapperMap = new HashMap<Class<?>, Class<?>>(); + + private static Map<String, Class<?>> primitiveClsssNameMap = new HashMap<String, Class<?>>(); + + static { + wrapperToPrimitiveMap.put(Character.class, Character.TYPE); + wrapperToPrimitiveMap.put(Byte.class, Byte.TYPE); + wrapperToPrimitiveMap.put(Short.class, Short.TYPE); + wrapperToPrimitiveMap.put(Integer.class, Integer.TYPE); + wrapperToPrimitiveMap.put(Long.class, Long.TYPE); + wrapperToPrimitiveMap.put(Double.class, Double.TYPE); + wrapperToPrimitiveMap.put(Float.class, Float.TYPE); + wrapperToPrimitiveMap.put(Boolean.class, Boolean.TYPE); + + primitiveToWrapperMap.put(Character.TYPE, Character.class); + primitiveToWrapperMap.put(Byte.TYPE, Byte.class); + primitiveToWrapperMap.put(Short.TYPE, Short.class); + primitiveToWrapperMap.put(Integer.TYPE, Integer.class); + primitiveToWrapperMap.put(Long.TYPE, Long.class); + primitiveToWrapperMap.put(Double.TYPE, Double.class); + primitiveToWrapperMap.put(Float.TYPE, Float.class); + primitiveToWrapperMap.put(Boolean.TYPE, Boolean.class); + + primitiveClsssNameMap.put(Character.TYPE.getName(), Character.TYPE); + primitiveClsssNameMap.put(Byte.TYPE.getName(), Byte.TYPE); + primitiveClsssNameMap.put(Short.TYPE.getName(), Short.TYPE); + primitiveClsssNameMap.put(Integer.TYPE.getName(), Integer.TYPE); + primitiveClsssNameMap.put(Long.TYPE.getName(), Long.TYPE); + primitiveClsssNameMap.put(Double.TYPE.getName(), Double.TYPE); + primitiveClsssNameMap.put(Float.TYPE.getName(), Float.TYPE); + primitiveClsssNameMap.put(Boolean.TYPE.getName(), Boolean.TYPE); + } + + + /** + * クラス名の要素を結合する。 + * + * @param s1 パッケージ名 + * @param s2 パッケージ名もしくはクラス名 + * @return 結合された名前 + */ + public static String concatName(String s1, String s2) { + if (StringUtils.isEmpty(s1) && StringUtils.isEmpty(s2)) { + return null; + } + if (!StringUtils.isEmpty(s1) && StringUtils.isEmpty(s2)) { + return s1; + } + if (StringUtils.isEmpty(s1) && !StringUtils.isEmpty(s2)) { + return s2; + } + return s1 + '.' + s2; + } + + /** + * プリミティブクラスの場合は、ラッパークラスに変換する。 + * + * @param className クラス名 + * @return {@link Class} + * @throws ClassNotFoundException クラスが見つからなかった場合 + * @see #forName(String) + */ + public static Class<?> convertClass(String className) throws ClassNotFoundException { + Class<?> clazz = primitiveClsssNameMap.get(className); + if (clazz != null) { + return clazz; + } + return forName(className); + } + + /** + * {@link Class}を取得する。 + * + * @param className クラス名 + * @return {@link Class} + * @throws ClassNotFoundException クラスが見つからなかった場合 + * @see Class#forName(String) + */ + public static Class<?> forName(String className) throws ClassNotFoundException { + ClassLoader loader = Thread.currentThread().getContextClassLoader(); + return Class.forName(className, true, loader); + } + + /** + * {@link Constructor}を返します。 + * + * @param clazz クラス + * @param argTypes 引数 + * @return {@link Constructor} + * @throws NoSuchMethodException メソッドが存在しない場合 + * @throws SecurityException セキュリティ違反が発生した場合 + * @see Class#getConstructor(Class[]) + */ + public static Constructor<?> getConstructor(Class<?> clazz, Class<?>[] argTypes) throws SecurityException, + NoSuchMethodException { + return clazz.getConstructor(argTypes); + } + + /** + * そのクラスに宣言されている {@link Constructor}を取得する。 + * + * @param clazz クラス + * @param argTypes 引数 + * @return {@link Constructor} + * @throws NoSuchMethodException メソッドが存在しない場合 + * @throws SecurityException セキュリティ違反が発生した場合 + * @see Class#getDeclaredConstructor(Class[]) + */ + public static Constructor<?> getDeclaredConstructor(Class<?> clazz, Class<?>[] argTypes) throws SecurityException, + NoSuchMethodException { + return clazz.getDeclaredConstructor(argTypes); + } + + /** + * そのクラスに宣言されている {@link Field}を取得する。 + * + * @param clazz クラス + * @param fieldName フィールド名 + * @return {@link Field} + * @throws NoSuchFieldException フィールドが見つからなかった場合 + * @see Class#getDeclaredField(String) + */ + public static Field getDeclaredField(Class<?> clazz, String fieldName) throws NoSuchFieldException { + return clazz.getDeclaredField(fieldName); + } + + /** + * このクラスに定義された{@link Field フィールド}をクラスファイルに定義された順番で取得する。 + * + * @param clazz 対象のクラス + * @return このクラスに定義されたフィールドの配列 + * @throws NotFoundException {@link CtClass}が見つからなかった場合 + * @throws NoSuchFieldException フィールドが見つからなかった場合 + */ + public static Field[] getDeclaredFields(final Class<?> clazz) throws NotFoundException, NoSuchFieldException { + try { + final ClassPool pool = ClassPoolUtil.getClassPool(clazz); + final CtClass ctClass = ClassPoolUtil.toCtClass(pool, clazz); + final CtField[] ctFields = ctClass.getDeclaredFields(); + final int size = ctFields.length; + final Field[] fields = new Field[size]; + for (int i = 0; i < size; ++i) { + fields[i] = ClassUtil.getDeclaredField(clazz, ctFields[i].getName()); + } + return fields; + } finally { + ClassPoolUtil.dispose(); + } + } + + /** + * そのクラスに宣言されている {@link Method}を取得する。 + * + * @param clazz クラス + * @param methodName メソッド名 + * @param argTypes 引数 + * @return {@link Method} メソッド + * @throws NoSuchMethodException メソッドが存在しない場合 + * @throws SecurityException セキュリティ違反が発生した場合 + * @see Class#getDeclaredMethod(String, Class[]) + */ + public static Method getDeclaredMethod(Class<?> clazz, String methodName, Class<?>[] argTypes) + throws SecurityException, NoSuchMethodException { + return clazz.getDeclaredMethod(methodName, argTypes); + } + + /** + * {@link Field}を取得する。 + * + * @param clazz クラス + * @param fieldName フィールド名 + * @return {@link Field} + * @throws NoSuchFieldException フィールドが見つからなかった場合 + * @see Class#getField(String) + */ + public static Field getField(Class<?> clazz, String fieldName) throws NoSuchFieldException { + return clazz.getField(fieldName); + + } + + /** + * {@link Method}を取得する。 + * + * @param clazz クラス + * @param methodName メソッド名 + * @param argTypes 引数 + * @return {@link Method} + * @throws NoSuchMethodException メソッドがみつからなかった場合 + * @throws SecurityException セキュリティ違反が発生した場合 + * @see Class#getMethod(String, Class[]) + */ + public static Method getMethod(Class<?> clazz, String methodName, Class<?>[] argTypes) throws SecurityException, + NoSuchMethodException { + return clazz.getMethod(methodName, argTypes); + } + + /** + * パッケージ名を取得する。 + * + * @param clazz クラス + * @return パッケージ名 + */ + public static String getPackageName(Class<?> clazz) { + String fqcn = clazz.getName(); + int pos = fqcn.lastIndexOf('.'); + if (pos > 0) { + return fqcn.substring(0, pos); + } + return null; + } + + /** + * ラッパークラスをプリミティブクラスに変換する。 + * + * @param clazz クラス + * @return プリミティブクラス + */ + public static Class<?> getPrimitiveClass(Class<?> clazz) { + return wrapperToPrimitiveMap.get(clazz); + } + + /** + * ラッパークラスならプリミティブクラスに、 そうでなければそのままクラスを取得する。 + * + * @param clazz クラス + * @return {@link Class} + */ + public static Class<?> getPrimitiveClassIfWrapper(Class<?> clazz) { + Class<?> ret = getPrimitiveClass(clazz); + if (ret != null) { + return ret; + } + return clazz; + } + + /** + * クラス名をリソースパスに変換する。 + * + * @param clazz クラス + * @return リソースパス + * @see #getResourcePath(String) + */ + public static String getResourcePath(Class<?> clazz) { + return getResourcePath(clazz.getName()); + } + + /** + * クラス名をリソースパスに変換する。 + * + * @param className クラス名 + * @return リソースパス + */ + public static String getResourcePath(String className) { + return StringUtils.replace(className, ".", "/") + ".class"; + } + + /** + * FQCNからパッケージ名を除いた名前を取得する。 + * + * @param clazz クラス + * @return FQCNからパッケージ名を除いた名前 + * @see #getShortClassName(String) + */ + public static String getShortClassName(Class<?> clazz) { + return getShortClassName(clazz.getName()); + } + + /** + * FQCNからパッケージ名を除いた名前を取得する。 + * + * @param className クラス名 + * @return FQCNからパッケージ名を除いた名前 + */ + public static String getShortClassName(String className) { + int i = className.lastIndexOf('.'); + if (i > 0) { + return className.substring(i + 1); + } + return className; + } + + /** + * 配列の場合は要素のクラス名、それ以外はクラス名そのものを返します。 + * + * @param clazz クラス + * @return クラス名 + */ + public static String getSimpleClassName(final Class<?> clazz) { + if (clazz.isArray()) { + return getSimpleClassName(clazz.getComponentType()) + "[]"; + } + return clazz.getName(); + } + + /** + * プリミティブクラスをラッパークラスに変換する。 + * + * @param clazz クラス + * @return {@link Class} + */ + public static Class<?> getWrapperClass(Class<?> clazz) { + return primitiveToWrapperMap.get(clazz); + } + + /** + * プリミティブの場合はラッパークラス、そうでない場合はもとのクラスを取得する。 + * + * @param clazz クラス + * @return {@link Class} + */ + public static Class<?> getWrapperClassIfPrimitive(Class<?> clazz) { + Class<?> ret = getWrapperClass(clazz); + if (ret != null) { + return ret; + } + return clazz; + } + + /** + * 代入可能かどうかをチェックする。 + * + * @param toClass 代入先のクラス + * @param fromClass 代入元のクラス + * @return 代入可能かどうか + * @see Class#isAssignableFrom(Class) + */ + public static boolean isAssignableFrom(Class<?> toClass, Class<?> fromClass) { + if (toClass == Object.class && !fromClass.isPrimitive()) { + return true; + } + if (toClass.isPrimitive()) { + fromClass = getPrimitiveClassIfWrapper(fromClass); + } + return toClass.isAssignableFrom(fromClass); + } + + /** + * 新しいインスタンスを作成する。 + * + * @param clazz クラス + * @return 新しいインスタンス + * @throws InstantiationException この Class が abstract クラス、インタフェース、配列クラス、プリミティブ型、 + * または void を表す場合、クラスが null コンストラクタを保持しない場合、あるいはインスタンスの生成がほかの理由で失敗した場合 + * @throws IllegalAccessException コンストラクタにアクセスできない場合 + * @see Class#newInstance() + */ + public static Object newInstance(Class<?> clazz) throws InstantiationException, IllegalAccessException { + return clazz.newInstance(); + } + + /** + * 新しいインスタンスを作成する。 + * + * @param className クラス名 + * @return 新しいインスタンス + * @throws InstantiationException この Class が abstract クラス、インタフェース、配列クラス、プリミティブ型、 + * または void を表す場合、クラスが null コンストラクタを保持しない場合、あるいはインスタンスの生成がほかの理由で失敗した場合 + * @throws IllegalAccessException コンストラクタにアクセスできない場合 + * @throws ClassNotFoundException クラスが見つからなかった場合 + * @see #newInstance(Class) + */ + public static Object newInstance(String className) throws InstantiationException, IllegalAccessException, + ClassNotFoundException { + return newInstance(forName(className)); + } + + /** + * FQCNをパッケージ名とFQCNからパッケージ名を除いた名前に分割する。 + * + * @param className クラス名 + * @return パッケージ名とFQCNからパッケージ名を除いた名前 + */ + public static String[] splitPackageAndShortClassName(String className) { + String[] ret = new String[2]; + int i = className.lastIndexOf('.'); + if (i > 0) { + ret[0] = className.substring(0, i); + ret[1] = className.substring(i + 1); + } else { + ret[1] = className; + } + return ret; + } + + private ClassUtil() { + throw new JiemamyError("不到達ポイント"); + } +} Deleted: leto/jiemamy-commons/trunk/src/main/java/org/jiemamy/utils/CollectionsUtil.java =================================================================== --- leto/jiemamy-commons/trunk/src/main/java/org/jiemamy/utils/CollectionsUtil.java 2009-04-07 01:02:00 UTC (rev 3150) +++ leto/jiemamy-commons/trunk/src/main/java/org/jiemamy/utils/CollectionsUtil.java 2009-04-07 05:52:48 UTC (rev 3151) @@ -1,182 +0,0 @@ -/* - * Copyright 2007-2009 Jiemamy Project and the Others. - * Created on 2009/01/09 - * - * 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 java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; - -import org.apache.commons.lang.Validate; - -/** - * Java5のgenericsや可変長を活用する、コレクションのためのユーティリティ。 - * - * <p>org.seasar.framework.util.tiger.CollectionsUtil のサブセット</p> - * - * @author daisuke - */ -public class CollectionsUtil { - - /** - * {@link ArrayList}の新しいインスタンスを生成する。 - * - * @param <E> {@link ArrayList}の要素型 - * @return {@link ArrayList}の新しいインスタンス - * @see ArrayList#ArrayList() - */ - public static <E>ArrayList<E> newArrayList() { - return new ArrayList<E>(); - } - - /** - * {@link ArrayList}の新しいインスタンスを生成する。 - * - * @param <E> {@link ArrayList}の要素型 - * @param c 要素がリストに配置されるコレクション - * @return {@link ArrayList}の新しいインスタンス - * @see ArrayList#ArrayList(Collection) - * @throws IllegalArgumentException 引数に{@code null}を与えた場合 - */ - public static <E>ArrayList<E> newArrayList(final Collection<? extends E> c) { - Validate.notNull(c); - return new ArrayList<E>(c); - } - - /** - * {@link ArrayList}の新しいインスタンスを生成する。 - * - * @param <E> {@link ArrayList}の要素型 - * @param initialCapacity リストの初期容量 - * @return {@link ArrayList}の新しいインスタンス - * @see ArrayList#ArrayList(int) - */ - public static <E>ArrayList<E> newArrayList(final int initialCapacity) { - return new ArrayList<E>(initialCapacity); - } - - /** - * {@link HashMap}の新しいインスタンスを生成する。 - * - * @param <K> {@link HashMap}のキーの型 - * @param <V> {@link HashMap}の値の型 - * @return {@link HashMap}の新しいインスタンス - * @see HashMap#HashMap() - */ - public static <K, V>HashMap<K, V> newHashMap() { - return new HashMap<K, V>(); - } - - /** - * {@link HashMap}の新しいインスタンスを生成する。 - * - * @param <K> {@link HashMap}のキーの型 - * @param <V> {@link HashMap}の値の型 - * @param initialCapacity 初期容量 - * @return {@link HashMap}の新しいインスタンス - * @see HashMap#HashMap(int) - */ - public static <K, V>HashMap<K, V> newHashMap(final int initialCapacity) { - return new HashMap<K, V>(initialCapacity); - } - - /** - * {@link HashMap}の新しいインスタンスを生成する。 - * - * @param <K> {@link HashMap}のキーの型 - * @param <V> {@link HashMap}の値の型 - * @param initialCapacity 初期容量 - * @param loadFactor サイズ変更の制御に使用される負荷係数のしきい値 - * @return {@link HashMap}の新しいインスタンス - * @see HashMap#HashMap(int, float) - */ - public static <K, V>HashMap<K, V> newHashMap(final int initialCapacity, final float loadFactor) { - return new HashMap<K, V>(initialCapacity, loadFactor); - } - - /** - * {@link HashMap}の新しいインスタンスを生成する。 - * - * @param <K> {@link HashMap}のキーの型 - * @param <V> {@link HashMap}の値の型 - * @param m 作成されるマップに配置されるマップ - * @return {@link HashMap}の新しいインスタンス - * @see HashMap#HashMap(int, float) - * @throws IllegalArgumentException 引数に{@code null}を与えた場合 - */ - public static <K, V>HashMap<K, V> newHashMap(final Map<? extends K, ? extends V> m) { - Validate.notNull(m); - return new HashMap<K, V>(m); - } - - /** - * {@link HashSet}の新しいインスタンスを生成する。 - * - * @param <E> {@link HashSet}の要素型 - * @return {@link HashSet}の新しいインスタンス - * @see HashSet#HashSet() - */ - public static <E>HashSet<E> newHashSet() { - return new HashSet<E>(); - } - - /** - * {@link HashSet}の新しいインスタンスを生成する。 - * - * @param <E> {@link HashSet}の要素型 - * @param c 要素がセットに配置されるコレクション - * @return {@link HashSet}の新しいインスタンス - * @see HashSet#HashSet() - * @throws IllegalArgumentException 引数に{@code null}を与えた場合 - */ - public static <E>HashSet<E> newHashSet(final Collection<? extends E> c) { - Validate.notNull(c); - return new HashSet<E>(c); - } - - /** - * {@link HashSet}の新しいインスタンスを生成する。 - * - * @param <E> {@link HashSet}の要素型 - * @param initialCapacity 初期容量 - * @return {@link HashSet}の新しいインスタンス - * @see HashSet#HashSet() - */ - public static <E>HashSet<E> newHashSet(final int initialCapacity) { - return new HashSet<E>(initialCapacity); - } - - /** - * {@link HashSet}の新しいインスタンスを生成する。 - * - * @param <E> {@link HashSet}の要素型 - * @param initialCapacity 初期容量 - * @param loadFactor 負荷係数 - * @return {@link HashSet}の新しいインスタンス - * @see HashSet#HashSet() - */ - public static <E>HashSet<E> newHashSet(final int initialCapacity, final float loadFactor) { - return new HashSet<E>(initialCapacity, loadFactor); - } - - private CollectionsUtil() { - } - -} Added: leto/jiemamy-commons/trunk/src/main/java/org/jiemamy/utils/CollectionsUtil.java =================================================================== --- leto/jiemamy-commons/trunk/src/main/java/org/jiemamy/utils/CollectionsUtil.java (rev 0) +++ leto/jiemamy-commons/trunk/src/main/java/org/jiemamy/utils/CollectionsUtil.java 2009-04-07 05:52:48 UTC (rev 3151) @@ -0,0 +1,998 @@ +/* + * Copyright 2007-2009 Jiemamy Project and the Others. + * + * 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 java.util.ArrayList; +import java.util.Collection; +import java.util.Comparator; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Hashtable; +import java.util.IdentityHashMap; +import java.util.LinkedHashMap; +import java.util.LinkedHashSet; +import java.util.LinkedList; +import java.util.Map; +import java.util.PriorityQueue; +import java.util.SortedMap; +import java.util.SortedSet; +import java.util.Stack; +import java.util.TreeMap; +import java.util.TreeSet; +import java.util.Vector; +import java.util.WeakHashMap; +import java.util.concurrent.ArrayBlockingQueue; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentLinkedQueue; +import java.util.concurrent.ConcurrentMap; +import java.util.concurrent.CopyOnWriteArrayList; +import java.util.concurrent.CopyOnWriteArraySet; +import java.util.concurrent.DelayQueue; +import java.util.concurrent.Delayed; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.PriorityBlockingQueue; + +import org.jiemamy.exception.JiemamyError; + +/** + * Genericsや可変長を活用するコレクションのためのユーティリティ。 + * + * @author j5ik2o + */ +public class CollectionsUtil { + + /** + * {@link ArrayBlockingQueue}の新しいインスタンスを作成する。 + * + * @param <E> {@link ArrayBlockingQueue}の要素型 + * @param capacity キューの容量 + * @return {@link ArrayBlockingQueue}の新しいインスタンス + * @see ArrayBlockingQueue#ArrayBlockingQueue(int) + */ + public static <E>ArrayBlockingQueue<E> newArrayBlockingQueue(final int capacity) { + return new ArrayBlockingQueue<E>(capacity); + } + + /** + * {@link ArrayBlockingQueue}の新しいインスタンスを作成する。 + * + * @param <E> {@link ArrayBlockingQueue}の要素型 + * @param capacity キューの容量 + * @param fair {@code true}の場合、挿入または削除時にブロックされたスレッドに対するキューアクセス + * @return {@link ArrayBlockingQueue}の新しいインスタンス + * @see ArrayBlockingQueue#ArrayBlockingQueue(int, boolean) + */ + public static <E>ArrayBlockingQueue<E> newArrayBlockingQueue(final int capacity, final boolean fair) { + return new ArrayBlockingQueue<E>(capacity, fair); + } + + /** + * {@link ArrayBlockingQueue}の新しいインスタンスを作成する。 + * + * @param <E> {@link ArrayBlockingQueue}の要素型 + * @param capacity キューの容量 + * @param fair {@code true}の場合、挿入または削除時にブロックされたスレッドに対するキューアクセス + * @param c 最初に含む要素のコレクション + * @return {@link ArrayBlockingQueue}の新しいインスタンス + * @see ArrayBlockingQueue#ArrayBlockingQueue(int, boolean, Collection) + */ + public static <E>ArrayBlockingQueue<E> newArrayBlockingQueue(final int capacity, final boolean fair, + final Collection<? extends E> c) { + return new ArrayBlockingQueue<E>(capacity, fair, c); + } + + /** + * {@link ArrayList}の新しいインスタンスを作成する。 + * + * @param <E> {@link ArrayList}の要素型 + * @return {@link ArrayList}の新しいインスタンス + * @see ArrayList#ArrayList() + */ + public static <E>ArrayList<E> newArrayList() { + return new ArrayList<E>(); + } + + /** + * {@link ArrayList}の新しいインスタンスを作成する。 + * + * @param <E> {@link ArrayList}の要素型 + * @param c 要素がリストに配置されるコレクション + * @return {@link ArrayList}の新しいインスタンス + * @see ArrayList#ArrayList(Collection) + */ + public static <E>ArrayList<E> newArrayList(final Collection<? extends E> c) { + return new ArrayList<E>(c); + } + + /** + * {@link ArrayList}の新しいインスタンスを作成する。 + * + * @param <E> {@link ArrayList}の要素型 + * @param initialCapacity リストの初期容量 + * @return {@link ArrayList}の新しいインスタンス + * @see ArrayList#ArrayList(int) + */ + public static <E>ArrayList<E> newArrayList(final int initialCapacity) { + return new ArrayList<E>(initialCapacity); + } + + /** + * {@link ConcurrentHashMap}の新しいインスタンスを作成する。 + * + * @param <K> {@link ConcurrentHashMap}のキーの型 + * @param <V> {@link ConcurrentHashMap}の値の型 + * @return {@link ConcurrentHashMap}の新しいインスタンス + * @see ConcurrentHashMap#ConcurrentHashMap() + */ + public static <K, V>ConcurrentHashMap<K, V> newConcurrentHashMap() { + return new ConcurrentHashMap<K, V>(); + } + + /** + * {@link ConcurrentHashMap}の新しいインスタンスを作成する。 + * + * @param <K> {@link ConcurrentHashMap}のキーの型 + * @param <V> {@link ConcurrentHashMap}の値の型 + * @param initialCapacity 初期容量 + * @return {@link ConcurrentHashMap}の新しいインスタンス + * @see ConcurrentHashMap#ConcurrentHashMap(int) + */ + public static <K, V>ConcurrentHashMap<K, V> newConcurrentHashMap(final int initialCapacity) { + return new ConcurrentHashMap<K, V>(initialCapacity); + } + + /** + * {@link ConcurrentHashMap}の新しいインスタンスを作成する。 + * + * @param <K> {@link ConcurrentHashMap}のキーの型 + * @param <V> {@link ConcurrentHashMap}の値の型 + * @param initialCapacity 初期容量 + * @param loadFactor サイズ変更の制御に使用される負荷係数のしきい値 + * @param concurrencyLevel 同時更新を行うスレッドの推定数 + * @return {@link ConcurrentHashMap}の新しいインスタンス + * @see ConcurrentHashMap#ConcurrentHashMap(int, float, int) + */ + public static <K, V>ConcurrentHashMap<K, V> newConcurrentHashMap(final int initialCapacity, final float loadFactor, + final int concurrencyLevel) { + return new ConcurrentHashMap<K, V>(initialCapacity, loadFactor, concurrencyLevel); + } + + /** + * {@link ConcurrentHashMap}の新しいインスタンスを作成する。 + * + * @param <K> {@link ConcurrentHashMap}のキーの型 + * @param <V> {@link ConcurrentHashMap}の値の型 + * @param m 作成されるマップに配置されるマップ + * @return {@link ConcurrentHashMap}の新しいインスタンス + * @see ConcurrentHashMap#ConcurrentHashMap(Map) + */ + public static <K, V>ConcurrentHashMap<K, V> newConcurrentHashMap(final Map<? extends K, ? extends V> m) { + return new ConcurrentHashMap<K, V>(m); + } + + /** + * {@link ConcurrentLinkedQueue}の新しいインスタンスを作成する。 + * + * @param <E> {@link ConcurrentLinkedQueue}の要素型 + * @return {@link ConcurrentLinkedQueue}の新しいインスタンス + * @see ConcurrentLinkedQueue#ConcurrentLinkedQueue() + */ + public static <E>ConcurrentLinkedQueue<E> newConcurrentLinkedQueue() { + return new ConcurrentLinkedQueue<E>(); + } + + /** + * {@link ConcurrentLinkedQueue}の新しいインスタンスを作成する。 + * + * @param <E> {@link ConcurrentLinkedQueue}の要素型 + * @param c 最初に含む要素のコレクション + * @return {@link ConcurrentLinkedQueue}の新しいインスタンス + * @see ConcurrentLinkedQueue#ConcurrentLinkedQueue(Collection) + */ + public static <E>ConcurrentLinkedQueue<E> newConcurrentLinkedQueue(final Collection<? extends E> c) { + return new ConcurrentLinkedQueue<E>(c); + } + + /** + * {@link CopyOnWriteArrayList}の新しいインスタンスを作成する。 + * + * @param <E> {@link CopyOnWriteArrayList}の要素型 + * @return {@link CopyOnWriteArrayList}の新しいインスタンス + * @see CopyOnWriteArrayList#CopyOnWriteArrayList() + */ + public static <E>CopyOnWriteArrayList<E> newCopyOnWriteArrayList() { + return new CopyOnWriteArrayList<E>(); + } + + /** + * {@link CopyOnWriteArrayList}の新しいインスタンスを作成する。 + * + * @param <E> {@link CopyOnWriteArrayList}の要素型 + * @param c 最初に保持していた要素のコレクション + * @return {@link CopyOnWriteArrayList}の新しいインスタンス + * @see CopyOnWriteArrayList#CopyOnWriteArrayList(Collection) + */ + public static <E>CopyOnWriteArrayList<E> newCopyOnWriteArrayList(final Collection<? extends E> c) { + return new CopyOnWriteArrayList<E>(c); + } + + /** + * {@link CopyOnWriteArrayList}の新しいインスタンスを作成する。 + * + * @param <E> {@link CopyOnWriteArrayList}の要素型 + * @param toCopyIn 配列 (この配列のコピーは内部配列として使用される) + * @return {@link CopyOnWriteArrayList}の新しいインスタンス + * @see CopyOnWriteArrayList#CopyOnWriteArrayList(Object[]) + */ + public static <E>CopyOnWriteArrayList<E> newCopyOnWriteArrayList(final E[] toCopyIn) { + return new CopyOnWriteArrayList<E>(toCopyIn); + } + + /** + * {@link CopyOnWriteArraySet}の新しいインスタンスを作成する。 + * + * @param <E> {@link CopyOnWriteArraySet}の要素型 + * @return {@link CopyOnWriteArraySet}の新しいインスタンス + * @see CopyOnWriteArraySet#CopyOnWriteArraySet() + */ + public static <E>CopyOnWriteArraySet<E> newCopyOnWriteArraySet() { + return new CopyOnWriteArraySet<E>(); + } + + /** + * {@link CopyOnWriteArraySet}の新しいインスタンスを作成する。 + * + * @param <E> {@link CopyOnWriteArraySet}の要素型 + * @param c コレクション + * @return {@link CopyOnWriteArraySet}の新しいインスタンス + * @see CopyOnWriteArraySet#CopyOnWriteArraySet(Collection) + */ + public static <E>CopyOnWriteArraySet<E> newCopyOnWriteArraySet(final Collection<? extends E> c) { + return new CopyOnWriteArraySet<E>(c); + } + + /** + * {@link DelayQueue}の新しいインスタンスを作成する。 + * + * @param <E> {@link CopyOnWriteArraySet}の要素型 + * @return {@link DelayQueue}の新しいインスタンス + * @see DelayQueue#DelayQueue() + */ + public static <E extends Delayed>DelayQueue<E> newDelayQueue() { + return new DelayQueue<E>(); + } + + /** + * {@link DelayQueue}の新しいインスタンスを作成する。 + * + * @param <E> {@link CopyOnWriteArraySet}の要素型 + * @param c コレクション + * @return {@link DelayQueue}の新しいインスタンス + * @see DelayQueue#DelayQueue(Collection) + */ + public static <E extends Delayed>DelayQueue<E> newDelayQueue(final Collection<? extends E> c) { + return new DelayQueue<E>(c); + } + + /** + * {@link HashMap}の新しいインスタンスを作成する。 + * + * @param <K> {@link HashMap}のキーの型 + * @param <V> {@link HashMap}の値の型 + * @return {@link HashMap}の新しいインスタンス + * @see HashMap#HashMap() + */ + public static <K, V>HashMap<K, V> newHashMap() { + return new HashMap<K, V>(); + } + + /** + * {@link HashMap}の新しいインスタンスを作成する。 + * + * @param <K> {@link HashMap}のキーの型 + * @param <V> {@link HashMap}の値の型 + * @param initialCapacity 初期容量 + * @return {@link HashMap}の新しいインスタンス + * @see HashMap#HashMap(int) + */ + public static <K, V>HashMap<K, V> newHashMap(final int initialCapacity) { + return new HashMap<K, V>(initialCapacity); + } + + /** + * {@link HashMap}の新しいインスタンスを作成する。 + * + * @param <K> {@link HashMap}のキーの型 + * @param <V> {@link HashMap}の値の型 + * @param initialCapacity 初期容量 + * @param loadFactor サイズ変更の制御に使用される負荷係数のしきい値 + * @return {@link HashMap}の新しいインスタンス + * @see HashMap#HashMap(int, float) + */ + public static <K, V>HashMap<K, V> newHashMap(final int initialCapacity, final float loadFactor) { + return new HashMap<K, V>(initialCapacity, loadFactor); + } + + /** + * {@link HashMap}の新しいインスタンスを作成する。 + * + * @param <K> {@link HashMap}のキーの型 + * @param <V> {@link HashMap}の値の型 + * @param m 作成されるマップに配置されるマップ + * @return {@link HashMap}の新しいインスタンス + * @see HashMap#HashMap(int, float) + */ + public static <K, V>HashMap<K, V> newHashMap(final Map<? extends K, ? extends V> m) { + return new HashMap<K, V>(m); + } + + /** + * {@link HashSet}の新しいインスタンスを作成する。 + * + * @param <E> {@link HashSet}の要素型 + * @return {@link HashSet}の新しいインスタンス + * @see HashSet#HashSet() + */ + public static <E>HashSet<E> newHashSet() { + return new HashSet<E>(); + } + + /** + * {@link HashSet}の新しいインスタンスを作成する。 + * + * @param <E> {@link HashSet}の要素型 + * @param c 要素がセットに配置されるコレクション + * @return {@link HashSet}の新しいインスタンス + * @see HashSet#HashSet() + */ + public static <E>HashSet<E> newHashSet(final Collection<? extends E> c) { + return new HashSet<E>(c); + } + + /** + * {@link HashSet}の新しいインスタンスを作成する。 + * + * @param <E> {@link HashSet}の要素型 + * @param initialCapacity 初期容量 + * @return {@link HashSet}の新しいインスタンス + * @see HashSet#HashSet() + */ + public static <E>HashSet<E> newHashSet(final int initialCapacity) { + return new HashSet<E>(initialCapacity); + } + + /** + * {@link HashSet}の新しいインスタンスを作成する。 + * + * @param <E> {@link HashSet}の要素型 + * @param initialCapacity 初期容量 + * @param loadFactor 負荷係数 + * @return {@link HashSet}の新しいインスタンス + * @see HashSet#HashSet() + */ + public static <E>HashSet<E> newHashSet(final int initialCapacity, final float loadFactor) { + return new HashSet<E>(initialCapacity, loadFactor); + } + + /** + * {@link Hashtable}の新しいインスタンスを作成する。 + * + * @param <K> {@link Hashtable}のキーの型 + * @param <V> {@link Hashtable}の値の型 + * @return {@link Hashtable}の新しいインスタンス + * @see Hashtable#Hashtable() + */ + public static <K, V>Hashtable<K, V> newHashtable() { + return new Hashtable<K, V>(); + } + + /** + * {@link Hashtable}の新しいインスタンスを作成する。 + * + * @param <K> {@link Hashtable}のキーの型 + * @param <V> {@link Hashtable}の値の型 + * @param initialCapacity ハッシュテーブルの初期容量 + * @return {@link Hashtable}の新しいインスタンス + * @see Hashtable#Hashtable(int) + */ + public static <K, V>Hashtable<K, V> newHashtable(final int initialCapacity) { + return new Hashtable<K, V>(initialCapacity); + } + + /** + * {@link Hashtable}の新しいインスタンスを作成する。 + * + * @param <K> {@link Hashtable}のキーの型 + * @param <V> {@link Hashtable}の値の型 + * @param initialCapacity ハッシュテーブルの初期容量 + * @param loadFactor ハッシュテーブルの負荷係数 + * @return {@link Hashtable}の新しいインスタンス + * @see Hashtable#Hashtable(int, float) + */ + public static <K, V>Hashtable<K, V> newHashtable(final int initialCapacity, final float loadFactor) { + return new Hashtable<K, V>(initialCapacity, loadFactor); + } + + /** + * {@link Hashtable}の新しいインスタンスを作成する。 + * + * @param <K> {@link Hashtable}のキーの型 + * @param <V> {@link Hashtable}の値の型 + * @param m 作成されるマップに配置されるマップ + * @return {@link Hashtable}の新しいインスタンス + * @see Hashtable#Hashtable(Map) + */ + public static <K, V>Hashtable<K, V> newHashtable(final Map<? extends K, ? extends V> m) { + return new Hashtable<K, V>(m); + } + + /** + * {@link IdentityHashMap}の新しいインスタンスを作成する。 + * + * @param <K> {@link IdentityHashMap}のキーの型 + * @param <V> {@link IdentityHashMap}の値の型 + * @return {@link IdentityHashMap}の新しいインスタンス + * @see IdentityHashMap#IdentityHashMap() + */ + public static <K, V>IdentityHashMap<K, V> newIdentityHashMap() { + return new IdentityHashMap<K, V>(); + } + + /** + * {@link IdentityHashMap}の新しいインスタンスを作成する。 + * + * @param <K> {@link IdentityHashMap}のキーの型 + * @param <V> {@link IdentityHashMap}の値の型 + * @param expectedMaxSize マップの予想最大サイズ + * @return {@link IdentityHashMap}の新しいインスタンス + * @see IdentityHashMap#IdentityHashMap(int) + */ + public static <K, V>IdentityHashMap<K, V> newIdentityHashMap(final int expectedMaxSize) { + return new IdentityHashMap<K, V>(expectedMaxSize); + } + + /** + * {@link IdentityHashMap}の新しいインスタンスを作成する。 + * + * @param <K> {@link IdentityHashMap}のキーの型 + * @param <V> {@link IdentityHashMap}の値の型 + * @param m 作成されるマップに配置されるマップ + * @return {@link IdentityHashMap}の新しいインスタンス + * @see IdentityHashMap#IdentityHashMap(Map) + */ + public static <K, V>IdentityHashMap<K, V> newIdentityHashMap(final Map<? extends K, ? extends V> m) { + return new IdentityHashMap<K, V>(m); + } + + /** + * {@link LinkedBlockingQueue}の新しいインスタンスを作成する。 + * + * @param <E> {@link LinkedBlockingQueue}の要素型 + * @return {@link LinkedBlockingQueue}の新しいインスタンス + * @see LinkedBlockingQueue#LinkedBlockingQueue() + */ + public static <E>LinkedBlockingQueue<E> newLinkedBlockingQueue() { + return new LinkedBlockingQueue<E>(); + } + + /** + * {@link LinkedBlockingQueue}の新しいインスタンスを作成する。 + * + * @param <E> {@link LinkedBlockingQueue}の要素型 + * @param c 最初に含む要素のコレクション + * @return {@link LinkedBlockingQueue}の新しいインスタンス + * @see LinkedBlockingQueue#LinkedBlockingQueue(Collection) + */ + public static <E>LinkedBlockingQueue<E> newLinkedBlockingQueue(final Collection<? extends E> c) { + return new LinkedBlockingQueue<E>(c); + } + + /** + * {@link LinkedBlockingQueue}の新しいインスタンスを作成する。 + * + * @param <E> {@link LinkedBlockingQueue}の要素型 + * @param initialCapacity このキューの容量 + * @return {@link LinkedBlockingQueue}の新しいインスタンス + * @see LinkedBlockingQueue#LinkedBlockingQueue(int) + */ + public static <E>LinkedBlockingQueue<E> newLinkedBlockingQueue(final int initialCapacity) { + return new LinkedBlockingQueue<E>(initialCapacity); + } + + /** + * {@link LinkedHashMap}の新しいインスタンスを作成する。 + * + * @param <K> {@link LinkedHashMap}のキーの型 + * @param <V> {@link LinkedHashMap}の値の型 + * @return {@link LinkedHashMap}の新しいインスタンス + * @see LinkedHashMap#LinkedHashMap() + */ + public static <K, V>LinkedHashMap<K, V> newLinkedHashMap() { + return new LinkedHashMap<K, V>(); + } + + /** + * {@link LinkedHashMap}の新しいインスタンスを作成する。 + * + * @param <K> {@link LinkedHashMap}のキーの型 + * @param <V> {@link LinkedHashMap}の値の型 + * @param initialCapacity 初期容量 + * @return {@link LinkedHashMap}の新しいインスタンス + * @see LinkedHashMap#LinkedHashMap(int) + */ + public static <K, V>LinkedHashMap<K, V> newLinkedHashMap(final int initialCapacity) { + return new LinkedHashMap<K, V>(initialCapacity); + } + + /** + * {@link LinkedHashMap}の新しいインスタンスを作成する。 + * + * @param <K> {@link LinkedHashMap}のキーの型 + * @param <V> {@link LinkedHashMap}の値の型 + * @param initialCapacity 初期容量 + * @param loadFactor 負荷係数 + * @return {@link LinkedHashMap}の新しいインスタンス + * @see LinkedHashMap#LinkedHashMap(int, float) + */ + public static <K, V>LinkedHashMap<K, V> newLinkedHashMap(final int initialCapacity, final float loadFactor) { + return new LinkedHashMap<K, V>(initialCapacity, loadFactor); + } + + /** + * {@link LinkedHashMap}の新しいインスタンスを作成する。 + * + * @param <K> {@link LinkedHashMap}のキーの型 + * @param <V> {@link LinkedHashMap}の値の型 + * @param m 作成されるマップに配置されるマップ + * @return {@link LinkedHashMap}の新しいインスタンス + * @see LinkedHashMap#LinkedHashMap(Map) + */ + public static <K, V>LinkedHashMap<K, V> newLinkedHashMap(final Map<? extends K, ? extends V> m) { + return new LinkedHashMap<K, V>(m); + } + + /** + * {@link LinkedHashSet}の新しいインスタンスを作成する。 + * + * @param <E> {@link LinkedHashSet}の要素型 + * @return {@link LinkedHashSet}の新しいインスタンス + * @see LinkedHashSet#LinkedHashSet() + */ + public static <E>LinkedHashSet<E> newLinkedHashSet() { + return new LinkedHashSet<E>(); + } + + /** + * {@link LinkedHashSet}の新しいインスタンスを作成する。 + * + * @param <E> {@link LinkedHashSet}の要素型 + * @param c 要素がセットに配置されるコレクション + * @return {@link LinkedHashSet}の新しいインスタンス + * @see LinkedHashSet#LinkedHashSet(Collection) + */ + public static <E>LinkedHashSet<E> newLinkedHashSet(final Collection<? extends E> c) { + return new LinkedHashSet<E>(c); + } + + /** + * {@link LinkedHashSet}の新しいインスタンスを作成する。 + * + * @param <E> {@link LinkedHashSet}の要素型 + * @param initialCapacity 初期容量 + * @return {@link LinkedHashSet}の新しいインスタンス + * @see LinkedHashSet#LinkedHashSet(int) + */ + public static <E>LinkedHashSet<E> newLinkedHashSet(final int initialCapacity) { + return new LinkedHashSet<E>(initialCapacity); + } + + /** + * {@link LinkedHashSet}の新しいインスタンスを作成する。 + * + * @param <E> {@link LinkedHashSet}の要素型 + * @param initialCapacity 初期容量 + * @param loadFactor 負荷係数 + * @return {@link LinkedHashSet}の新しいインスタンス + * @see LinkedHashSet#LinkedHashSet(int, float) + */ + public static <E>LinkedHashSet<E> newLinkedHashSet(final int initialCapacity, final float loadFactor) { + return new LinkedHashSet<E>(initialCapacity, loadFactor); + } + + /** + * {@link LinkedList}の新しいインスタンスを作成する。 + * + * @param <E> {@link LinkedList}の要素型 + * @return {@link LinkedList}の新しいインスタンス + * @see LinkedList#LinkedList() + */ + public static <E>LinkedList<E> newLinkedList() { + return new LinkedList<E>(); + } + + /** + * {@link LinkedList}の新しいインスタンスを作成する。 + * + * @param <E> {@link LinkedList}の要素型 + * @param c 要素がリストに配置されるコレクション + * @return {@link LinkedList}の新しいインスタンス + * @see LinkedList#LinkedList(Collection) + */ + public static <E>LinkedList<E> newLinkedList(final Collection<? extends E> c) { + return new LinkedList<E>(c); + } + + /** + * {@link PriorityBlockingQueue}の新しいインスタンスを作成する。 + * + * @param <E> {@link PriorityBlockingQueue}の要素型 + * @return {@link PriorityBlockingQueue}の新しいインスタンス + * @see PriorityBlockingQueue#PriorityBlockingQueue() + */ + public static <E>PriorityBlockingQueue<E> newPriorityBlockingQueue() { + return new PriorityBlockingQueue<E>(); + } + + /** + * {@link PriorityBlockingQueue}の新しいインスタンスを作成する。 + * + * @param <E> {@link PriorityBlockingQueue}の要素型 + * @param c 最初に含む要素のコレクション + * @return {@link PriorityBlockingQueue}の新しいインスタンス + * @see PriorityBlockingQueue#PriorityBlockingQueue(Collection) + */ + public static <E>PriorityBlockingQueue<E> newPriorityBlockingQueue(final Collection<? extends E> c) { + return new PriorityBlockingQueue<E>(c); + } + + /** + * {@link PriorityBlockingQueue}の新しいインスタンスを作成する。 + * + * @param <E> {@link PriorityBlockingQueue}の要素型 + * @param initialCapacity この優先度キューの初期容量 + * @return {@link PriorityBlockingQueue}の新しいインスタンス + * @see PriorityBlockingQueue#PriorityBlockingQueue(int) + */ + public static <E>PriorityBlockingQueue<E> newPriorityBlockingQueue(final int initialCapacity) { + return new PriorityBlockingQueue<E>(initialCapacity); + } + + /** + * {@link PriorityBlockingQueue}の新しいインスタンスを作成する。 + * + * @param <E> {@link PriorityBlockingQueue}の要素型 + * @param initialCapacity この優先度キューの初期容量 + * @param comparator この優先度キューの順序付けに使用するコンパレータ + * @return {@link PriorityBlockingQueue}の新しいインスタンス + * @see PriorityBlockingQueue#PriorityBlockingQueue(int, Comparator) + */ + public static <E>PriorityBlockingQueue<E> newPriorityBlockingQueue(final int initialCapacity, + final Comparator<? super E> comparator) { + return new PriorityBlockingQueue<E>(initialCapacity, comparator); + } + + /** + * {@link PriorityQueue}の新しいインスタンスを作成する。 + * + * @param <E> {@link PriorityQueue}の要素型 + * @return {@link PriorityQueue}の新しいインスタンス + * @see PriorityQueue#PriorityQueue() + */ + public static <E>PriorityQueue<E> newPriorityQueue() { + return new PriorityQueue<E>(); + } + + /** + * {@link PriorityQueue}の新しいインスタンスを作成する。 + * + * @param <E> {@link PriorityQueue}の要素型 + * @param c 要素が優先度キューに配置されるコレクション + * @return {@link PriorityQueue}の新しいインスタンス + * @see PriorityQueue#PriorityQueue(Collection) + */ + public static <E>PriorityQueue<E> newPriorityQueue(final Collection<? extends E> c) { + return new PriorityQueue<E>(c); + } + + /** + * {@link PriorityQueue}の新しいインスタンスを作成する。 + * + * @param <E> {@link PriorityQueue}の要素型 + * @param initialCapacity この優先度キューの初期容量 + * @return {@link PriorityQueue}の新しいインスタンス + * @see PriorityQueue#PriorityQueue(int) + */ + public static <E>PriorityQueue<E> newPriorityQueue(final int initialCapacity) { + return new PriorityQueue<E>(initialCapacity); + } + + /** + * {@link PriorityQueue}の新しいインスタンスを作成する。 + * + * @param <E> {@link PriorityQueue}の要素型 + * @param initialCapacity この優先度キューの初期容量 + * @param comparator この優先度キューの順序付けに使用するコンパレータ + * @return {@link PriorityQueue}の新しいインスタンス + * @see PriorityQueue#PriorityQueue(int, Comparator) + */ + public static <E>PriorityQueue<E> newPriorityQueue(final int initialCapacity, final Comparator<? super E> comparator) { + return new PriorityQueue<E>(initialCapacity, comparator); + } + + /** + * {@link PriorityQueue}の新しいインスタンスを作成する。 + * + * @param <E> {@link PriorityQueue}の要素型 + * @param c 要素が優先度キューに配置されるコレクション + * @return {@link PriorityQueue}の新しいインスタンス + * @see PriorityQueue#PriorityQueue(PriorityQueue) + */ + public static <E>PriorityQueue<E> newPriorityQueue(final PriorityQueue<? extends E> c) { + return new PriorityQueue<E>(c); + } + + /** + * {@link PriorityQueue}の新しいインスタンスを作成する。 + * + * @param <E> {@link PriorityQueue}の要素型 + * @param c 要素が優先度キューに配置されるコレクション + * @return {@link PriorityQueue}の新しいインスタンス + * @see PriorityQueue#PriorityQueue(SortedSet) + */ + public static <E>PriorityQueue<E> newPriorityQueue(final SortedSet<? extends E> c) { + return new PriorityQueue<E>(c); + } + + /** + * {@link Stack}の新しいインスタンスを作成する。 + * + * @param <E> {@link Stack}の要素型 + * @return {@link Stack}の新しいインスタンス + * @see Stack#Stack() + */ + public static <E>Stack<E> newStack() { + return new Stack<E>(); + } + + /** + * {@link TreeMap}の新しいインスタンスを作成する。 + * + * @param <K> {@link TreeMap}のキーの型 + * @param <V> {@link TreeMap}の値の型 + * @return {@link TreeMap}の新しいインスタンス + * @see TreeMap#TreeMap() + */ + public static <K, V>TreeMap<K, V> newTreeMap() { + return new TreeMap<K, V>(); + } + + /** + * {@link TreeMap}の新しいインスタンスを作成する。 + * + * @param <K> {@link TreeMap}のキーの型 + * @param <V> {@link TreeMap}の値の型 + * @param c {@link Comparator} + * @return {@link TreeMap}の新しいインスタンス + * @see TreeMap#TreeMap() + */ + public static <K, V>TreeMap<K, V> newTreeMap(final Comparator<? super K> c) { + return new TreeMap<K, V>(c); + } + + /** + * {@link TreeMap}の新しいインスタンスを作成する。 + * + * @param <K> {@link TreeMap}のキーの型 + * @param <V> {@link TreeMap}の値の型 + * @param m 作成されるマップに配置されるマップ + * @return {@link TreeMap}の新しいインスタンス + * @see TreeMap#TreeMap(Map) + */ + public static <K, V>TreeMap<K, V> newTreeMap(final Map<? extends K, ? extends V> m) { + return new TreeMap<K, V>(m); + } + + /** + * {@link TreeMap}の新しいインスタンスを作成する。 + * + * @param <K> {@link TreeMap}のキーの型 + * @param <V> {@link TreeMap}の値の型 + * @param m 作成されるマップに配置されるマップ + * @return {@link TreeMap}の新しいインスタンス + * @see TreeMap#TreeMap(SortedMap) + */ + public static <K, V>TreeMap<K, V> newTreeMap(final SortedMap<K, ? extends V> m) { + return new TreeMap<K, V>(m); + } + + /** + * {@link TreeSet}の新しいインスタンスを作成する。 + * + * @param <E> {@link TreeSet}の要素型 + * @return {@link TreeSet}の新しいインスタンス + * @see TreeSet#TreeSet() + */ + public static <E>TreeSet<E> newTreeSet() { + return new TreeSet<E>(); + } + + /** + * {@link TreeSet}の新しいインスタンスを作成する。 + * + * @param <E> {@link TreeSet}の要素型 + * @param c 要素がセットに配置されるコレクション + * @return {@link TreeSet}の新しいインスタンス + * @see TreeSet#TreeSet(Collection) + */ + public static <E>TreeSet<E> newTreeSet(final Collection<? extends E> c) { + return new TreeSet<E>(c); + } + + /** + * {@link TreeSet}の新しいインスタンスを作成する。 + * + * @param <E> {@link TreeSet}の要素型 + * @param c このセットをソートするために使用されるコンパレータ + * @return {@link TreeSet}の新しいインスタンス + * @see TreeSet#TreeSet(Comparator) + */ + public static <E>TreeSet<E> newTreeSet(final Comparator<? super E> c) { + return new TreeSet<E>(c); + } + + /** + * {@link TreeSet}の新しいインスタンスを作成する。 + * + * @param <E> {@link TreeSet}の要素型 + * @param s 要素がセットに配置されるコレクション + * @return {@link TreeSet}の新しいインスタンス + * @see TreeSet#TreeSet(SortedSet) + */ + public static <E>TreeSet<E> newTreeSet(final SortedSet<? extends E> s) { + return new TreeSet<E>(s); + } + + /** + * {@link Vector}の新しいインスタンスを作成する。 + * + * @param <E> {@link Vector}の要素型 + * @return {@link Vector}の新しいインスタンス + * @see Vector#Vector() + */ + public static <E>Vector<E> newVector() { + return new Vector<E>(); + } + + /** + * {@link Vector}の新しいインスタンスを作成する。 + * + * @param <E> {@link Vector}の要素型 + * @param c 要素がセットに配置されるコレクション + * @return {@link Vector}の新しいインスタンス + * @see Vector#Vector(Collection) + */ + public static <E>Vector<E> newVector(final Collection<? extends E> c) { + return new Vector<E>(c); + } + + /** + * {@link Vector}の新しいインスタンスを作成する。 + * + * @param <E> {@link Vector}の要素型 + * @param initialCapacity {@link Vector}の初期容量 + * @return {@link Vector}の新しいインスタンス + * @see Vector#Vector(int) + */ + public static <E>Vector<E> newVector(final int initialCapacity) { + return new Vector<E>(initialCapacity); + } + + /** + * {@link Vector}の新しいインスタンスを作成する。 + * + * @param <E> {@link Vector}の要素型 + * @param initialCapacity {@link Vector}の初期容量 + * @param capacityIncrement {@link Vector}があふれたときに増加される容量 + * @return {@link Vector}の新しいインスタンス + * @see Vector#Vector(int, int) + */ + public static <E>Vector<E> newVector(final int initialCapacity, final int capacityIncrement) { + return new Vector<E>(initialCapacity, capacityIncrement); + } + + /** + * {@link WeakHashMap}の新しいインスタンスを作成する。 + * + * @param <K> {@link WeakHashMap}のキーの型 + * @param <V> {@link WeakHashMap}の値の型 + * @return {@link WeakHashMap}の新しいインスタンス + * @see WeakHashMap#WeakHashMap() + */ + public static <K, V>WeakHashMap<K, V> newWeakHashMap() { + return new WeakHashMap<K, V>(); + } + + /** + * {@link WeakHashMap}の新しいインスタンスを作成する。 + * + * @param <K> {@link WeakHashMap}のキーの型 + * @param <V> {@link WeakHashMap}の値の型 + * @param initialCapacity 初期容量 + * @return {@link WeakHashMap}の新しいインスタンス + * @see WeakHashMap#WeakHashMap(int) + */ + public static <K, V>WeakHashMap<K, V> newWeakHashMap(final int initialCapacity) { + return new WeakHashMap<K, V>(initialCapacity); + } + + /** + * {@link WeakHashMap}の新しいインスタンスを作成する。 + * + * @param <K> {@link WeakHashMap}のキーの型 + * @param <V> {@link WeakHashMap}の値の型 + * @param initialCapacity 初期容量 + * @param loadFactor サイズ変更の制御に使用される負荷係数のしきい値 + * @return {@link WeakHashMap}の新しいインスタンス + * @see WeakHashMap#WeakHashMap(int, float) + */ + public static <K, V>WeakHashMap<K, V> newWeakHashMap(final int initialCapacity, final float loadFactor) { + return new WeakHashMap<K, V>(initialCapacity, loadFactor); + } + + /** + * {@link WeakHashMap}の新しいインスタンスを作成する。 + * + * @param <K> {@link WeakHashMap}のキーの型 + * @param <V> {@link WeakHashMap}の値の型 + * @param m 作成されるマップに配置されるマップ + * @return {@link WeakHashMap}の新しいインスタンス + * @see WeakHashMap#WeakHashMap(Map) + */ + public static <K, V>WeakHashMap<K, V> newWeakHashMap(final Map<? extends K, ? extends V> m) { + return new WeakHashMap<K, V>(m); + } + + /** + * マップが指定されたキーを含んでいない場合は、キーを指定された値に関連付けます。 + * <p> + * マップがすでに指定されたキーを含んでいる場合は、 キーに関連づけられている値を返します。 マップは変更されず、 指定された値は使われません。 + * マップがまだ指定されたキーを含んでいない場合は、 指定された値を値を返します。 マップは変更され、指定されたキーと指定された値が関連づけられます。 + * いずれの場合も、返される値はマップがその時点でキーと関連づけている値です。 + * </p> + * + * @param <K> {@link HashMap}のキーの型 + * @param <V> {@link HashMap}の値の型 + * @param map マップ + * @param key 指定される値が関連付けられるキー + * @param value 指定されるキーに関連付けられる値 + * @return 指定されたキーと関連付けられていた以前の値または、キーに関連付けられる値 + * @see ConcurrentHashMap#putIfAbsent(Object, Object) + */ + public static <K, V>V putIfAbsent(final ConcurrentMap<K, V> map, final K key, final V value) { + V exists = map.putIfAbsent(key, value); + if (exists != null) { + return exists; + } + return value; + } + + private CollectionsUtil() { + throw new JiemamyError("不到達ポイント"); + } + +} Added: leto/jiemamy-commons/trunk/src/main/java/org/jiemamy/utils/ConstructorUtil.java =================================================================== --- leto/jiemamy-commons/trunk/src/main/java/org/jiemamy/utils/ConstructorUtil.java (rev 0) +++ leto/jiemamy-commons/trunk/src/main/java/org/jiemamy/utils/ConstructorUtil.java 2009-04-07 05:52:48 UTC (rev 3151) @@ -0,0 +1,52 @@ +/* + * Copyright 2007-2009 Jiemamy Project and the Others. + * Created on Apr 6, 2009 + * + * 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 java.lang.reflect.Constructor; +import java.lang.reflect.InvocationTargetException; + +import org.jiemamy.exception.JiemamyError; + +/** + * {@link Constructor}用のユーティリティクラス。 + * + * @author j5ik2o + */ +public class ConstructorUtil { + + /** + * 新しいインスタンスを作成します。 + * + * @param <T> コンストラクタのクラス + * @param constructor コンストラクタ + * @param args コンストラクタの引数 + * @return インスタンス + * @throws InstantiationException インスタンスの生成に失敗した場合 + * @throws IllegalAccessException コンストラクタにアクセスできない場合 + * @throws InvocationTargetException コンストラクタが例外をスローする場合 + */ + public static <T>T newInstance(Constructor<T> constructor, Object[] args) throws InstantiationException, + IllegalAccessException, InvocationTargetException { + return constructor.newInstance(args); + } + + private ConstructorUtil() { + throw new JiemamyError("不到達ポイント"); + } +} Property changes on: leto/jiemamy-commons/trunk/src/main/java/org/jiemamy/utils/ConstructorUtil.java ___________________________________________________________________ Added: svn:mime-type + text/plain Added: leto/jiemamy-commons/trunk/src/main/java/org/jiemamy/utils/Disposable.java =================================================================== --- leto/jiemamy-commons/trunk/src/main/java/org/jiemamy/utils/Disposable.java (rev 0) +++ leto/jiemamy-commons/trunk/src/main/java/org/jiemamy/utils/Disposable.java 2009-04-07 05:52:48 UTC (rev 3151) @@ -0,0 +1,32 @@ +/* + * Copyright 2007-2009 Jiemamy Project and the Others. + * Created on Apr 4, 2009 + * + * 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; + +/** + * リソースを破棄できるインターフェイス。 + * + * @author j5ik2o + */ +public interface Disposable { + + /** + * リソースを破棄する。 + */ + void dispose(); +} Added: leto/jiemamy-commons/trunk/src/main/java/org/jiemamy/utils/EnumerationIterator.java =================================================================== --- leto/jiemamy-commons/trunk/src/main/java/org/jiemamy/utils/EnumerationIterator.java (rev 0) +++ leto/jiemamy-commons/trunk/src/main/java/org/jiemamy/utils/EnumerationIterator.java 2009-04-07 05:52:48 UTC (rev 3151) @@ -0,0 +1,58 @@ +/* + * Copyright 2007-2009 Jiemamy Project and the Others. + * + * 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 java.util.Enumeration; +import java.util.Iterator; + +/** + * {@link Enumeration}を {@link Iterator}にするためのアダブタ。 + * + * @param <E> 要素 + * @author j5ik2o + */ +public class EnumerationIterator<E> implements Iterator<E> { + + private Enumeration<E> enumeration = null; + + + /** + * {@link EnumerationIterator}を作成します。 + * + * @param e {@link Enumeration} + */ + public EnumerationIterator(final Enumeration<E> e) { + if (e == null) { + throw new NullPointerException("Enumeration"); + } + this.enumeration = e; + } + + public boolean hasNext() { + return enumeration.hasMoreElements(); + } + + public E next() { + return enumeration.nextElement(); + } + + public void remove() { + throw new UnsupportedOperationException("remove"); + } + +} Added: leto/jiemamy-commons/trunk/src/main/java/org/jiemamy/utils/FieldUtil.java =================================================================== --- leto/jiemamy-commons/trunk/src/main/java/org/jiemamy/utils/FieldUtil.java (rev 0) +++ leto/jiemamy-commons/trunk/src/main/java/org/jiemamy/utils/FieldUtil.java 2009-04-07 05:52:48 UTC (rev 3151) @@ -0,0 +1,259 @@ +/* + * Copyright 2007-2009 Jiemamy Project and the Others. + * + * 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 java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.lang.reflect.Modifier; + +import org.apache.commons.lang.Validate; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import org.jiemamy.exception.JiemamyError; + +/** + * {@link Field}用のユーティリティクラスです。 + * + * @author j5ik2o + */ +public class FieldUtil { + + @SuppressWarnings("unused") + private static final Logger LOG = LoggerFactory.getLogger(FieldUtil.class); + + /** + * {@link #getElementTypeOfCollectionFromFieldType(Field)}への定数参照です + */ + protected static final Method GET_ELEMENT_TYPE_OF_COLLECTION_FROM_FIELD_TYPE_METHOD = + getElementTypeFromFieldTypeMethod("Collection"); + + /** + * {@link #getElementTypeOfListFromFieldType(Field)}への定数参照です + */ + protected static final Method GET_ELEMENT_TYPE_OF_LIST_FROM_FIELD_TYPE_METHOD = + getElementTypeFromFieldTypeMethod("List"); + + /** + * {@link #getElementTypeOfSetFromFieldType(Field)}への定数参照です + */ + protected static final Method GET_ELEMENT_TYPE_OF_SET_FROM_FIELD_TYPE_METHOD = + getElementTypeFromFieldTypeMethod("Set"); + + + /** + * {@link Field}の値をオブジェクトとして取得する。 + * + * @param field フィールド + * @param target ターゲット + * @return {@link Object} + * @throws IllegalAccessException コンストラクタにアクセスできない場合 + * @throws IllegalArgumentException 引数が正しくない場合 + * @see Field#get(Object) + */ + public static Object get(Field field, Object target) throws IllegalArgumentException, IllegalAccessException { + Validate.notNull(field); + Validate.notNull(target); + return field.get(target); + } + + /** + * <code>ReflectionUtil#getElementTypeOf<var>Xxx</var>FromFieldType()</code> + * の {@link Method}を取得する。 + * + * @param type 取得するメソッドが対象とする型名 + * @return + * <code>ReflectionUtil#getElementTypeOf<var>Xxx</var>FromFieldType()</code> + * の{@link Method} + */ + protected static Method getElementTypeFromFieldTypeMethod(final String type) { + Validate.notNull(type); + try { + final Class<?> reflectionUtilClass = ReflectionUtil.class; + return reflectionUtilClass.getMethod("getElementTypeOf" + type + "FromFieldType", new Class[] { + Field.class + }); + } catch (Throwable ignore) { + //ignore + } + return null; + } + + /** + * 指定されたフィールドのパラメタ化されたコレクションの要素型を取得する。 + * + * @param field フィールド + * @return フィールドのパラメタ化されたコレクションの要素型 + */ + public static Class<?> getElementTypeOfCollectionFromFieldType(final Field field) { + Validate.notNull(field); + try { + return (Class<?>) MethodUtil.invoke(GET_ELEMENT_TYPE_OF_COLLECTION_FROM_FIELD_TYPE_METHOD, null, + new Object[] { + field + }); + } catch (Throwable ignore) { + //ignore + } + return null; + } + + /** + * 指定されたフィールドのパラメタ化されたリストの要素型を取得する。 + * + * @param field フィールド + * @return フィールドのパラメタ化されたリストの要素型 + */ + public static Class<?> getElementTypeOfListFromFieldType(final Field field) { + Validate.notNull(field); + try { + return (Class<?>) MethodUtil.invoke(GET_ELEMENT_TYPE_OF_LIST_FROM_FIELD_TYPE_METHOD, null, new Object[] { + field + }); + } catch (Throwable ignore) { + //ignore + } + return null; + } + + /** + * 指定されたフィールドのパラメタ化されたセットの要素型を取得する。 + * + * @param field フィールド + * @return フィールドのパラメタ化されたセットの要素型 + */ + public static Class<?> getElementTypeOfSetFromFieldType(final Field field) { + Validate.notNull(field); + try { + return (Class<?>) MethodUtil.invoke(GET_ELEMENT_TYPE_OF_SET_FROM_FIELD_TYPE_METHOD, null, new Object[] { + field + }); + } catch (Throwable ignore) { + //ignore + } + return null; + } + + /** + * staticな {@link Field}の値をintとして取得する。 + * + * @param field フィールド + * @return intの値 + * @throws IllegalAccessException フィールドにアクセスできない場合 + * @throws IllegalArgumentException フィールドを宣言するクラスまたはインタフェースのインスタンスではない場合 + * @see #getInt(Field, Object) + */ + public static int getInt(Field field) throws IllegalArgumentException, IllegalAccessException { + Validate.notNull(field); + return getInt(field, null); + } + + /** + * {@link Field}の値をintとして取得する。 + * + * @param field フィールド + * @param target ターゲット + * @return intの値 + * @throws IllegalAccessException フィールドにアクセスできない場合 + * @throws IllegalArgumentException フィールドを宣言するクラスまたはインタフェースのインスタンスではない場合 + * @see Field#getInt(Object) + */ + public static int getInt(Field field, Object target) throws IllegalArgumentException, IllegalAccessException { + Validate.notNull(field); + Validate.notNull(target); + return field.getInt(target); + } + + /** + * staticな {@link Field}の値を {@link String}として取得する。 + * + * @param field フィールド + * @return {@link String}の値 + * @throws IllegalAccessException フィールドにアクセスできない場合 + * @throws IllegalArgumentException フィールドを宣言するクラスまたはインタフェースのインスタンスではない場合 + * @see #getString(Field, Object) + */ + public static String getString(Field field) throws IllegalArgumentException, IllegalAccessException { + Validate.notNull(field); + return getString(field, null); + } + + /** + * {@link Field}の値を {@link String}として取得する。 + * + * @param field フィールド + * @param target ターゲット + * @return {@link String}の値 + * @throws IllegalAccessException フィールドにアクセスできない場合 + * @throws IllegalArgumentException フィールドを宣言するクラスまたはインタフェースのインスタンスではない場合 + * @see Field#get(Object) + */ + public static String getString(Field field, Object target) throws IllegalArgumentException, IllegalAccessException { + Validate.notNull(field); + Validate.notNull(target); + return (String) field.get(target); + } + + /** + * インスタンスフィールドがどうかを取得する。 + * + * @param field フィールド + * @return インスタンスフィールドかどうか + */ + public static boolean isInstanceField(Field field) { + Validate.notNull(field); + int mod = field.getModifiers(); + return !Modifier.isStatic(mod) && !Modifier.isFinal(mod); + } + + /** + * パブリックフィールドかどうかを取得する。 + * + * @param field フィールド + * @return パブリックフィールドかどうか + */ + public static boolean isPublicField(Field field) { + Validate.notNull(field); + int mod = field.getModifiers(); + return Modifier.isPublic(mod); + } + + /** + * {@link Field}に値を設定する。 + * + * @param field フィールド + * @param target ターゲット + * @param value 値 + * @throws IllegalAccessException フィールドにアクセスできない場合 + * @throws IllegalArgumentException フィールドを宣言するクラスまたはインタフェースのインスタンスではない場合 + * あるいはラップ解除変換が失敗した場合 + * @see Field#set(Object, Object) + */ + public static void set(Field field, Object target, Object value) throws IllegalArgumentException, + IllegalAccessException { + Validate.notNull(field); + Validate.notNull(target); + Validate.notNull(value); + field.set(target, value); + } + + private FieldUtil() { + throw new JiemamyError("不到達ポイント"); + } + +} Added: leto/jiemamy-commons/trunk/src/main/java/org/jiemamy/utils/FileInputStreamUtil.java =================================================================== --- leto/jiemamy-commons/trunk/src/main/java/org/jiemamy/utils/FileInputStreamUtil.java (rev 0) +++ leto/jiemamy-commons/trunk/src/main/java/org/jiemamy/utils/FileInputStreamUtil.java 2009-04-07 05:52:48 UTC (rev 3151) @@ -0,0 +1,50 @@ +/* + * Copyright 2007-2009 Jiemamy Project and the Others. + * + * 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 java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; + +import org.jiemamy.exception.JiemamyError; + +/** + * {@link FileInputStream}用のユーティリティクラス。 + * + * @author j5ik2o + * + */ +public class FileInputStreamUtil { + + /** + * {@link FileInputStream}を作成する。 + * + * @param file ファイル + * @return {@link FileInputStream} + * @throws FileNotFoundException ファイルが存在しないか、 + * 普通のファイルではなくディレクトリであるか、またはなんらかの理由で開くことができない場合 + * @see FileInputStream#FileInputStream(File) + */ + public static FileInputStream create(File file) throws FileNotFoundException { + return new FileInputStream(file); + } + + private FileInputStreamUtil() { + throw new JiemamyError("不到達ポイント"); + } +} Added: leto/jiemamy-commons/trunk/src/main/java/org/jiemamy/utils/FileOutputStreamUtil.java =================================================================== --- leto/jiemamy-commons/trunk/src/main/java/org/jiemamy/utils/FileOutputStreamUtil.java (rev 0) +++ leto/jiemamy-commons/trunk/src/main/java/org/jiemamy/utils/FileOutputStreamUtil.java 2009-04-07 05:52:48 UTC (rev 3151) @@ -0,0 +1,50 @@ +/* + * Copyright 2007-2009 Jiemamy Project and the Others. + * + * 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 java.io.File; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; + +import org.jiemamy.exception.JiemamyError; + +/** + * {@link FileOutputStream}用のユーティリティクラス。 + * + * @author j5ik2o + * + */ +public class FileOutputStreamUtil { + + /** + * {@link FileOutputStream}を作成する。 + * + * @param file ファイル + * @return {@link FileOutputStream} + * @throws FileNotFoundException ファイルは存在するが、普通のファイルではなくディレクトリである場合、 + * ファイルは存在せず作成もできない場合、またはなんらかの理由で開くことができない場合 + * @see FileOutputStream#FileOutputStream(File) + */ + public static FileOutputStream create(File file) throws FileNotFoundException { + return new FileOutputStream(file); + } + + private FileOutputStreamUtil() { + throw new JiemamyError("不到達ポイント"); + } +} Added: leto/jiemamy-commons/trunk/src/main/java/org/jiemamy/utils/FileUtil.java =================================================================== --- leto/jiemamy-commons/trunk/src/main/java/org/jiemamy/utils/FileUtil.java (rev 0) +++ leto/jiemamy-commons/trunk/src/main/java/org/jiemamy/utils/FileUtil.java 2009-04-07 05:52:48 UTC (rev 3151) @@ -0,0 +1,147 @@ +/* + * Copyright 2007-2009 Jiemamy Project and the Others. + * + * 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 java.io.BufferedInputStream; +import java.io.BufferedOutputStream; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.OutputStream; +import java.net.MalformedURLException; +import java.net.URL; + +import org.apache.commons.lang.Validate; + +import org.jiemamy.exception.JiemamyError; + +/** + * {@link File}を扱うユーティリティ・クラス。 + * + * @author j5ik2o + */ +public class FileUtil { + + /** バッファサイズ */ + private static final int BUFF_SIZE = 1024; + + + /** + * <code>src</code>の内容を<code>dest</code>にコピーします。 + * + * @param src コピー元のファイル + * @param dest コピー先のファイル + * @throws IOException 入出力に失敗した場合 + */ + public static void copy(File src, File dest) throws IOException { + Validate.notNull(src); + Validate.notNull(dest); + if (dest.canWrite() == false || (dest.exists() && dest.canWrite() == false)) { + return; + } + BufferedInputStream in = null; + BufferedOutputStream out = null; + try { + in = new BufferedInputStream(FileInputStreamUtil.create(src)); + out = new BufferedOutputStream(FileOutputStreamUtil.create(dest)); + byte[] buf = new byte[BUFF_SIZE]; + int length; + while (-1 < (length = in.read(buf))) { + out.write(buf, 0, length); + out.flush(); + } + } finally { + InputStreamUtil.close(in); + OutputStreamUtil.close(out); + } + } + + /** + * ファイルの内容をバイト配列に読み込む。 + * + * @param file ファイル + * @return ファイルの内容を読み込んだバイト配列 + * @throws IOException 入出力が失敗した場合 + */ + public static byte[] getBytes(File file) throws IOException { + Validate.notNull(file); + return InputStreamUtil.getBytes(FileInputStreamUtil.create(file)); + } + + /** + * この抽象パス名の正規の形式を返します。 + * + * @param file ファイル + * @return この抽象パス名と同じファイルまたはディレクトリを示す正規パス名文字列 + * @throws IOException 入出力が失敗した場合 + */ + public static String getCanonicalPath(File file) throws IOException { + Validate.notNull(file); + return file.getCanonicalPath(); + } + + /** + * この抽象パス名を<code>file:</code> URLに変換します。 + * + * @param file ファイル + * @return ファイルURLを表すURLオブジェクト + * @throws MalformedURLException 無効な書式のURLが発生した場合 + */ + public static URL toURL(final File file) throws MalformedURLException { + Validate.notNull(file); + return file.toURL(); + } + + /** + * バイトの配列をファイルに書き出します。 + * + * @param path ファイルのパス + * @param data バイトの配列 + * @throws IOException 入出力が失敗した場合 + * @throws NullPointerException pathやdataがnullの場合。 + */ + public static void write(String path, byte[] data) throws IOException { + Validate.notNull(path); + Validate.notNull(data); + write(path, data, 0, data.length); + } + + /** + * バイトの配列をファイルに書き出します。 + * + * @param path ファイルのパス + * @param data バイトの配列 + * @param offset オフセット + * @param length 配列の長さ + * @throws IOException 入出力が失敗した場合 + */ + public static void write(String path, byte[] data, int offset, int length) throws IOException { + Validate.notNull(path); + Validate.notNull(data); + OutputStream out = new BufferedOutputStream(new FileOutputStream(path)); + try { + out.write(data, offset, length); + } finally { + out.close(); + } + } + + private FileUtil() { + throw new JiemamyError("不到達ポイント"); + } +} Added: leto/jiemamy-commons/trunk/src/main/java/org/jiemamy/utils/GenericUtil.java =================================================================== --- leto/jiemamy-commons/trunk/src/main/java/org/jiemamy/utils/GenericUtil.java (rev 0) +++ leto/jiemamy-commons/trunk/src/main/java/org/jiemamy/utils/GenericUtil.java 2009-04-07 05:52:48 UTC (rev 3151) @@ -0,0 +1,478 @@ +/* + * Copyright 2007-2009 Jiemamy Project and the Others. + * + * 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 java.lang.reflect.Array; +import java.lang.reflect.GenericArrayType; +import java.lang.reflect.GenericDeclaration; +import java.lang.reflect.ParameterizedType; +import java.lang.reflect.Type; +import java.lang.reflect.TypeVariable; +import java.lang.reflect.WildcardType; +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import org.jiemamy.exception.JiemamyError; + +/** + * Genericsを扱うためのユーティリティ・クラス。 + * + * @author j5ik2o + */ +public abstract class GenericUtil { + + /** + * パラメータ化された型(クラスまたはインタフェース)が持つ型変数および型引数を集めて<code>map</code>に追加する。 + * + * @param clazz クラス + * @param type 型 + * @param map パラメータ化された型が持つ型変数をキー、型引数を値とする{@link Map} + */ + protected static void gatherTypeVariables(final Class<?> clazz, final Type type, + final Map<TypeVariable<?>, Type> map) { + if (clazz == null) { + return; + } + gatherTypeVariables(type, map); + + final Class<?> superClass = clazz.getSuperclass(); + final Type superClassType = clazz.getGenericSuperclass(); + if (superClass != null) { + gatherTypeVariables(superClass, superClassType, map); + } + + final Class<?>[] interfaces = clazz.getInterfaces(); + final Type[] interfaceTypes = clazz.getGenericInterfaces(); + for (int i = 0; i < interfaces.length; ++i) { + gatherTypeVariables(interfaces[i], interfaceTypes[i], map); + } + } + + /** + * パラメータ化された型(クラスまたはインタフェース)が持つ型変数および型引数を集めて<code>map</code>に追加する。 + * + * @param type 型 + * @param map パラメータ化された型が持つ型変数をキー、型引数を値とする{@link Map} + */ + protected static void gatherTypeVariables(final Type type, final Map<TypeVariable<?>, Type> map) { + if (ParameterizedType.class.isInstance(type)) { + final ParameterizedType parameterizedType = ParameterizedType.class.cast(type); + final TypeVariable<?>[] typeVariables = + GenericDeclaration.class.cast(parameterizedType.getRawType()).getTypeParameters(); + final Type[] actualTypes = parameterizedType.getActualTypeArguments(); + for (int i = 0; i < actualTypes.length; ++i) { + map.put(typeVariables[i], actualTypes[i]); + } + } + } + + /** + * <code>type</code>の実際の型を取得する。 + * <ul> + * <li><code>type</code>が<code>Class</code>の場合はそのまま返す。</li> + * <li><code>type</code>がパラメータ化された型の場合はその原型を返す。</li> + * <li><code>type</code>がワイルドカード型の場合は(最初の)上限境界を返す。</li> + * <li><code>type</code>が型変数の場合はその変数の実際の型引数を返す。</li> + * <li><code>type</code>が配列の場合はその要素の実際の型の配列を返す。</li> + * <li>その他の場合は<code>null</code>を返す。</li> + * </ul> + * + * @param type タイプ + * @param map パラメータ化された型が持つ型変数をキー、型引数を値とする{@link Map} + * @return <code>type</code>の実際の型 + */ + public static Class<?> getActualClass(final Type type, final Map<TypeVariable<?>, Type> map) { + if (Class.class.isInstance(type)) { + return Class.class.cast(type); + } + if (ParameterizedType.class.isInstance(type)) { + return getActualClass(ParameterizedType.class.cast(type).getRawType(), map); + } + if (WildcardType.class.isInstance(type)) { + return getActualClass(WildcardType.class.cast(type).getUpperBounds()[0], map); + } + if (TypeVariable.class.isInstance(type)) { + return getActualClass(map.get(TypeVariable.class.cast(type)), map); + } + if (GenericArrayType.class.isInstance(type)) { + final GenericArrayType genericArrayType = GenericArrayType.class.cast(type); + final Class<?> componentClass = getActualClass(genericArrayType.getGenericComponentType(), map); + return Array.newInstance(componentClass, 0).getClass(); + } + return null; + } + + /** + * パラメータ化された型を要素とする配列の実際の要素型を取得する。 + * <ul> + * <li><code>type</code>がパラメータ化された型の配列でない場合は<code>null</code>を取得する。</li> + * <li><code>type</code>が<code>Class</code>の場合はそのまま返す。</li> + * <li><code>type</code>がパラメータ化された型の場合はその原型を返す。</li> + * <li><code>type</code>がワイルドカード型の場合は(最初の)上限境界を返す。</li> + * <li><code>type</code>が型変数の場合はその変数の実際の型引数を返す。</li> + * <li><code>type</code>が配列の場合はその要素の実際の型の配列を返す。</li> + * <li>その他の場合は<code>null</code>を返す。</li> + * </ul> + * + * @param type パラメータ化された型を要素とする配列 + * @param map パラメータ化された型が持つ型変数をキー、型引数を値とする{@link Map} + * @return パラメータ化された型を要素とする配列の実際の要素型 + */ + public static Class<?> getActualElementClassOfArray(final Type type, final Map<TypeVariable<?>, Type> map) { + if (!GenericArrayType.class.isInstance(type)) { + return null; + } + return getActualClass(GenericArrayType.class.cast(type).getGenericComponentType(), map); + } + + /** + * パラメータ化された{@link Collection}の実際の要素型を返す。 + * <ul> + * <li><code>type</code>がパラメータ化された{@link Collection}でない場合は<code>null</code> + * を返す。</li> + * <li><code>type</code>が<code>Class</code>の場合はそのまま返す。</li> + * <li><code>type</code>がパラメータ化された型の場合はその原型を返す。</li> + * <li><code>type</code>がワイルドカード型の場合は(最初の)上限境界を返す。</li> + * <li><code>type</code>が型変数の場合はその変数の実際の型引数を返す。</li> + * <li><code>type</code>が配列の場合はその要素の実際の型の配列を返す。</li> + * <li>その他の場合は<code>null</code>を返す。</li> + * </ul> + * + * @param type パラメータ化された{@link Collection} + * @param map パラメータ化された型が持つ型変数をキー、型引数を値とする{@link Map} + * @return パラメータ化された{@link Collection}の実際の要素型 + */ + public static Class<?> getActualElementClassOfCollection(final Type type, final Map<TypeVariable<?>, Type> map) { + if (!isTypeOf(type, Collection.class)) { + return null; + } + return getActualClass(getGenericParameter(type, 0), map); + } + + /** + * パラメータ化された{@link List}の実際の要素型を取得する。 + * <ul> + * <li><code>type</code>がパラメータ化された{@link List}でない場合は<code>null</code>を返す。</li> + * <li><code>type</code>が<code>Class</code>の場合はそのまま返す。</li> + * <li><code>type</code>がパラメータ化された型の場合はその原型を返す。</li> + * <li><code>type</code>がワイルドカード型の場合は(最初の)上限境界を返す。</li> + * <li><code>type</code>が型変数の場合はその変数の実際の型引数を返す。</li> + * <li><code>type</code>が配列の場合はその要素の実際の型の配列を返す。</li> + * <li>その他の場合は<code>null</code>を返す。</li> + * </ul> + * + * @param type パラメータ化された{@link List} + * @param map パラメータ化された型が持つ型変数をキー、型引数を値とする{@link Map} + * @return パラメータ化された{@link List}の実際の要素型 + */ + public static Class<?> getActualElementClassOfList(final Type type, final Map<TypeVariable<?>, Type> map) { + if (!isTypeOf(type, List.class)) { + return null; + } + return getActualClass(getGenericParameter(type, 0), map); + } + + /** + * パラメータ化された{@link Set}の実際の要素型を取得する。 + * <ul> + * <li><code>type</code>がパラメータ化された{@link Set}でない場合は<code>null</code>を返す。</li> + * <li><code>type</code>が<code>Class</code>の場合はそのまま返す。</li> + * <li><code>type</code>がパラメータ化された型の場合はその原型を返す。</li> + * <li><code>type</code>がワイルドカード型の場合は(最初の)上限境界を返す。</li> + * <li><code>type</code>が型変数の場合はその変数の実際の型引数を返す。</li> + * <li><code>type</code>が配列の場合はその要素の実際の型の配列を返す。</li> + * <li>その他の場合は<code>null</code>を返す。</li> + * </ul> + * + * @param type パラメータ化された{@link Set} + * @param map パラメータ化された型が持つ型変数をキー、型引数を値とする{@link Map} + * @return パラメータ化された{@link Set}の実際の要素型 + */ + public static Class<?> getActualElementClassOfSet(final Type type, final Map<TypeVariable<?>, Type> map) { + if (!isTypeOf(type, Set.class)) { + return null; + } + return getActualClass(getGenericParameter(type, 0), map); + } + + /** + * パラメータ化された{@link Map}のキーの実際の型を取得する。 + * <ul> + * <li>キー型がパラメータ化された{@link Map}でない場合は<code>null</code>を返す。</li> + * <li><code>type</code>が<code>Class</code>の場合はそのまま返す。</li> + * <li><code>type</code>がパラメータ化された型の場合はその原型を返す。</li> + * <li><code>type</code>がワイルドカード型の場合は(最初の)上限境界を返す。</li> + * <li><code>type</code>が型変数の場合はその変数の実際の型引数を返す。</li> + * <li><code>type</code>が配列の場合はその要素の実際の型の配列を返す。</li> + * <li>その他の場合は<code>null</code>を返す。</li> + * </ul> + * + * @param type パラメータ化された{@link Map} + * @param map パラメータ化された型が持つ型変数をキー、型引数を値とする{@link Map} + * @return パラメータ化された{@link Map}のキーの実際の型 + */ + public static Class<?> getActualKeyClassOfMap(final Type type, final Map<TypeVariable<?>, Type> map) { + if (!isTypeOf(type, Map.class)) { + return null; + } + return getActualClass(getGenericParameter(type, 0), map); + } + + /** + * パラメータ化された{@link Map}の値の実際の型を取得する。 + * <ul> + * <li><code>type</code>がパラメータ化された{@link Map}でない場合は<code>null</code>を返す。</li> + * <li><code>type</code>が<code>Class</code>の場合はそのまま返す。</li> + * <li><code>type</code>がパラメータ化された型の場合はその原型を返す。</li> + * <li><code>type</code>がワイルドカード型の場合は(最初の)上限境界を返す。</li> + * <li><code>type</code>が型変数の場合はその変数の実際の型引数を返す。</li> + * <li><code>type</code>が配列の場合はその要素の実際の型の配列を返す。</li> + * <li>その他の場合は<code>null</code>を返す。</li> + * </ul> + * + * @param type パラメータ化された{@link Map} + * @param map パラメータ化された型が持つ型変数をキー、型引数を値とする{@link Map} + * @return パラメータ化された{@link Map}の値の実際の型 + */ + public static Class<?> getActualValueClassOfMap(final Type type, final Map<TypeVariable<?>, Type> map) { + if (!isTypeOf(type, Map.class)) { + return null; + } + return getActualClass(getGenericParameter(type, 1), map); + } + + /** + * パラメータ化された型を要素とする配列の要素型を取得する。 + * <p> + * <code>type</code>がパラメータ化された型の配列でない場合は<code>null</code>を返す。 + * </p> + * + * @param type パラメータ化された型を要素とする配列 + * @return パラメータ化された型を要素とする配列の要素型 + */ + public static Type getElementTypeOfArray(final Type type) { + if (!GenericArrayType.class.isInstance(type)) { + return null; + } + return GenericArrayType.class.cast(type).getGenericComponentType(); + } + + /** + * パラメータ化された{@link Collection}の要素型を取得する。 + * <p> + * <code>type</code>がパラメータ化された{@link List}でない場合は<code>null</code>を返す。 + * </p> + * + * @param type パラメータ化された{@link List} + * @return パラメータ化された{@link List}の要素型 + */ + public static Type getElementTypeOfCollection(final Type type) { + if (!isTypeOf(type, Collection.class)) { + return null; + } + return getGenericParameter(type, 0); + } + + /** + * パラメータ化された{@link List}の要素型を取得する。 + * <p> + * <code>type</code>がパラメータ化された{@link List}でない場合は<code>null</code>を返す。 + * </p> + * + * @param type パラメータ化された{@link List} + * @return パラメータ化された{@link List}の要素型 + */ + public static Type getElementTypeOfList(final Type type) { + if (!isTypeOf(type, List.class)) { + return null; + } + return getGenericParameter(type, 0); + } + + /** + * パラメータ化された{@link Set}の要素型を取得する。 + * <p> + * <code>type</code>がパラメータ化された{@link Set}でない場合は<code>null</code>を返す。 + * </p> + * + * @param type パラメータ化された{@link Set} + * @return パラメータ化された{@link Set}の要素型 + */ + public static Type getElementTypeOfSet(final Type type) { + if (!isTypeOf(type, Set.class)) { + return null; + } + return getGenericParameter(type, 0); + } + + /** + * <code>type</code>の型引数の配列を取得する。 + * <p> + * <code>type</code>がパラメータ化された型でない場合は<code>null</code>を返す。 + * </p> + * + * @param type タイプ + * @return <code>type</code>の型引数の配列 + */ + public static Type[] getGenericParameter(final Type type) { + if (ParameterizedType.class.isInstance(type)) { + return ParameterizedType.class.cast(type).getActualTypeArguments(); + } + if (GenericArrayType.class.isInstance(type)) { + return getGenericParameter(GenericArrayType.class.cast(type).getGenericComponentType()); + } + return new Type[0]; + } + + /** + * 指定された位置の<code>type</code>の型引数を取得する。 + * <p> + * <code>type</code>がパラメータ化された型でない場合は<code>null</code>を返す。 + * </p> + * + * @param type タイプ + * @param index 位置 + * @return 指定された位置の<code>type</code>の型引数 + */ + public static Type getGenericParameter(final Type type, final int index) { + if (!ParameterizedType.class.isInstance(type)) { + return null; + } + final Type[] genericParameter = getGenericParameter(type); + if (genericParameter == null) { + return null; + } + return genericParameter[index]; + } + + /** + * パラメータ化された{@link Map}のキーの型を取得する。 + * <p> + * <code>type</code>がパラメータ化された{@link Map}でない場合は<code>null</code>を返す。 + * </p> + * + * @param type パラメータ化された{@link Map} + * @return パラメータ化された{@link Map}のキーの型 + */ + public static Type getKeyTypeOfMap(final Type type) { + if (!isTypeOf(type, Map.class)) { + return null; + } + return getGenericParameter(type, 0); + } + + /** + * <code>type</code>の原型を取得する。 + * <ul> + * <li><code>type</code>が<code>Class</code>の場合はそのまま返す。</li> + * <li><code>type</code>がパラメータ化された型の場合はその原型を返す。</li> + * <li><code>type</code>がワイルドカード型の場合は(最初の)上限境界を返す。</li> + * <li><code>type</code>が配列の場合はその要素の実際の型の配列を返す。</li> + * <li>その他の場合は<code>null</code>を返す。</li> + * </ul> + * + * @param type タイプ + * @return <code>type</code>の原型 + */ + public static Class<?> getRawClass(final Type type) { + if (Class.class.isInstance(type)) { + return Class.class.cast(type); + } + if (ParameterizedType.class.isInstance(type)) { + final ParameterizedType parameterizedType = ParameterizedType.class.cast(type); + return getRawClass(parameterizedType.getRawType()); + } + if (WildcardType.class.isInstance(type)) { + final WildcardType wildcardType = WildcardType.class.cast(type); + final Type[] types = wildcardType.getUpperBounds(); + return getRawClass(types[0]); + } + if (GenericArrayType.class.isInstance(type)) { + final GenericArrayType genericArrayType = GenericArrayType.class.cast(type); + final Class<?> rawClass = getRawClass(genericArrayType.getGenericComponentType()); + return Array.newInstance(rawClass, 0).getClass(); + } + return null; + } + + /** + * パラメータ化された型(クラスまたはインタフェース)が持つ型変数をキー、型引数を値とする{@link Map}を取得する。 + * + * @param clazz パラメータ化された型(クラスまたはインタフェース) + * @return パラメータ化された型が持つ型変数をキー、型引数を値とする{@link Map} + */ + public static Map<TypeVariable<?>, Type> getTypeVariableMap(final Class<?> clazz) { + final Map<TypeVariable<?>, Type> map = CollectionsUtil.newLinkedHashMap(); + + final Class<?> superClass = clazz.getSuperclass(); + final Type superClassType = clazz.getGenericSuperclass(); + if (superClass != null) { + gatherTypeVariables(superClass, superClassType, map); + } + + final Class<?>[] interfaces = clazz.getInterfaces(); + final Type[] interfaceTypes = clazz.getGenericInterfaces(); + for (int i = 0; i < interfaces.length; ++i) { + gatherTypeVariables(interfaces[i], interfaceTypes[i], map); + } + + return map; + } + + /** + * パラメータ化された{@link Map}の値の型を取得する。 + * <p> + * <code>type</code>がパラメータ化された{@link Map}でない場合は<code>null</code>を返す。 + * </p> + * + * @param type パラメータ化された{@link Map} + * @return パラメータ化された{@link Map}の値の型 + */ + public static Type getValueTypeOfMap(final Type type) { + if (!isTypeOf(type, Map.class)) { + return null; + } + return getGenericParameter(type, 1); + } + + /** + * <code>type</code>の原型が<code>clazz</code>に代入可能であれば<code>true</code>を、 + * それ以外の場合は<code>false</code>を取得する。 + * + * @param type タイプ + * @param clazz クラス + * @return <code>type</code>の原型が<code>clazz</code>に代入可能であれば<code>true</code> + */ + public static boolean isTypeOf(final Type type, final Class<?> clazz) { + if (Class.class.isInstance(type)) { + return clazz.isAssignableFrom(Class.class.cast(type)); + } + if (ParameterizedType.class.isInstance(type)) { + final ParameterizedType parameterizedType = ParameterizedType.class.cast(type); + return isTypeOf(parameterizedType.getRawType(), clazz); + } + return false; + } + + private GenericUtil() { + throw new JiemamyError("不到達ポイント"); + } + +} Added: leto/jiemamy-commons/trunk/src/main/java/org/jiemamy/utils/InputStreamUtil.java =================================================================== --- leto/jiemamy-commons/trunk/src/main/java/org/jiemamy/utils/InputStreamUtil.java (rev 0) +++ leto/jiemamy-commons/trunk/src/main/java/org/jiemamy/utils/InputStreamUtil.java 2009-04-07 05:52:48 UTC (rev 3151) @@ -0,0 +1,106 @@ +/* + * Copyright 2007-2009 Jiemamy Project and the Others. + * + * 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 java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; + +import org.jiemamy.exception.JiemamyError; + +/** + * {@link InputStream}用のユーティリティクラス。 + * + * @author j5ik2o + * + */ +public class InputStreamUtil { + + /** バッファサイズ */ + private static final int BUFF_SIZE = 8192; + + + /** + * {@link InputStream#available()}の例外処理をラップしたメソッド。 + * + * @param is {@link InputStream} + * @return 可能なサイズ + * @throws IOException 入出力が失敗した場合 + */ + public static int available(InputStream is) throws IOException { + return is.available(); + } + + /** + * {@link InputStream}を閉じる。 + * + * @param is {@link InputStream} + * @throws IOException 入出力が失敗した場合 + * @see InputStream#close() + */ + public static void close(InputStream is) throws IOException { + if (is == null) { + return; + } + is.close(); + } + + /** + * {@link InputStream}の内容を {@link OutputStream}にコピーします。 + * + * @param is {@link InputStream} + * @param os {@link OutputStream} + * @throws IOException 入出力が失敗した場合 + */ + public static final void copy(InputStream is, OutputStream os) throws IOException { + byte[] buf = new byte[BUFF_SIZE]; + int n = 0; + while ((n = is.read(buf, 0, buf.length)) != -1) { + os.write(buf, 0, n); + } + } + + /** + * {@link InputStream}からbyteの配列を取得する。 + * + * @param is {@link InputStream} + * @return byteの配列 + * @throws IOException 入出力が失敗した場合 + */ + public static final byte[] getBytes(InputStream is) throws IOException { + byte[] buf = new byte[BUFF_SIZE]; + try { + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + int n = 0; + while ((n = is.read(buf, 0, buf.length)) != -1) { + baos.write(buf, 0, n); + } + byte[] bytes = baos.toByteArray(); + return bytes; + } finally { + //if (is != null) { + close(is); + //} + } + } + + private InputStreamUtil() { + throw new JiemamyError("不到達ポイント"); + } +} Added: leto/jiemamy-commons/trunk/src/main/java/org/jiemamy/utils/JarFileUtil.java =================================================================== --- leto/jiemamy-commons/trunk/src/main/java/org/jiemamy/utils/JarFileUtil.java (rev 0) +++ leto/jiemamy-commons/trunk/src/main/java/org/jiemamy/utils/JarFileUtil.java 2009-04-07 05:52:48 UTC (rev 3151) @@ -0,0 +1,117 @@ +/* + * Copyright 2007-2009 Jiemamy Project and the Others. + * + * 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 java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.net.JarURLConnection; +import java.net.URL; +import java.net.URLConnection; +import java.util.jar.JarFile; +import java.util.zip.ZipEntry; + +import org.jiemamy.exception.JiemamyError; + +/** + * {@link JarFile}を扱うユーティリティクラス。 + * + * @author j5ik2o + */ +public class JarFileUtil { + + /** + * Jarファイルを閉じる。 + * + * @param jarFile Jarファイル + * @throws IOException 入出力が失敗した場合 + */ + public static void close(final JarFile jarFile) throws IOException { + jarFile.close(); + } + + /** + * 指定されたJarファイルを読み取るための<code>JarFile</code>を作成する。 + * + * @param file ファイル + * @return 指定されたJarファイルを読み取るための<code>JarFile</code> + * @throws IOException 入出力が失敗した場合 + */ + public static JarFile create(final File file) throws IOException { + return new JarFile(file); + } + + /** + * 指定されたJarファイルを読み取るための<code>JarFile</code>を作成する。 + * + * @param file ファイルパス + * @return 指定されたJarファイルを読み取るための<code>JarFile</code> + * @throws IOException 入出力が失敗した場合 + */ + public static JarFile create(final String file) throws IOException { + return new JarFile(file); + } + + /** + * 指定されたJarファイルエントリの内容を読み込むための入力ストリームを取得する。 + * + * @param file Jarファイル + * @param entry Jarファイルエントリ + * @return 指定されたJarファイルエントリの内容を読み込むための入力ストリーム + * @throws IOException 入出力が失敗した場合 + */ + public static InputStream getInputStream(final JarFile file, final ZipEntry entry) throws IOException { + return file.getInputStream(entry); + } + + /** + * URLで指定されたJarファイルを読み取るための<code>JarFile</code>を作成する。 + * + * @param jarUrl Jarファイルを示すURL + * @return 指定されたJarファイルを読み取るための<code>JarFile</code> + * @throws IOException 入出力エラーが発生した場合 + */ + public static JarFile toJarFile(final URL jarUrl) throws IOException { + final URLConnection con = URLUtil.openConnection(jarUrl); + if (con instanceof JarURLConnection) { + return JarURLConnectionUtil.getJarFile((JarURLConnection) con); + } + return create(new File(toJarFilePath(jarUrl))); + } + + /** + * URLで指定されたJarファイルのパスを返します。 + * + * @param jarUrl Jarファイルを示すURL + * @return URLで指定されたJarファイルのパス + * @throws IOException 入出力が失敗した場合 + */ + public static String toJarFilePath(final URL jarUrl) throws IOException { + final URL nestedUrl = URLUtil.create(jarUrl.getPath()); + final String nestedUrlPath = nestedUrl.getPath(); + final int pos = nestedUrlPath.lastIndexOf('!'); + final String jarFilePath = nestedUrlPath.substring(0, pos); + final File jarFile = new File(URLUtil.decode(jarFilePath, "UTF8")); + return FileUtil.getCanonicalPath(jarFile); + } + + private JarFileUtil() { + throw new JiemamyError("不到達ポイント"); + } + +} Added: leto/jiemamy-commons/trunk/src/main/java/org/jiemamy/utils/JarInputStreamUtil.java =================================================================== --- leto/jiemamy-commons/trunk/src/main/java/org/jiemamy/utils/JarInputStreamUtil.java (rev 0) +++ leto/jiemamy-commons/trunk/src/main/java/org/jiemamy/utils/JarInputStreamUtil.java 2009-04-07 05:52:48 UTC (rev 3151) @@ -0,0 +1,61 @@ +/* + * Copyright 2007-2009 Jiemamy Project and the Others. + * + * 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 java.io.IOException; +import java.io.InputStream; +import java.util.jar.JarEntry; +import java.util.jar.JarInputStream; + +import org.jiemamy.exception.JiemamyError; + +/** + * {@link JarInputStream}用のユーティリティクラス。 + * + * @author j5ik2o + */ +public class JarInputStreamUtil { + + /** + * {@link JarInputStream}を作成する。 + * + * @param is {@link InputStream} + * @return {@link JarInputStream} + * @throws IOException 入出力に失敗した場合 + * @see JarInputStream#JarInputStream(InputStream) + */ + public static JarInputStream create(final InputStream is) throws IOException { + return new JarInputStream(is); + } + + /** + * {@link JarInputStream#getNextJarEntry()}の例外処理をラップするメソッド。 + * + * @param is {@link JarInputStream} + * @return {@link JarEntry} + * @throws IOException 入出力に失敗した場合 + * @see JarInputStream#getNextJarEntry() + */ + public static JarEntry getNextJarEntry(final JarInputStream is) throws IOException { + return is.getNextJarEntry(); + } + + private JarInputStreamUtil() { + throw new JiemamyError("不到達ポイント"); + } +} Added: leto/jiemamy-commons/trunk/src/main/java/org/jiemamy/utils/JarURLConnectionUtil.java =================================================================== --- leto/jiemamy-commons/trunk/src/main/java/org/jiemamy/utils/JarURLConnectionUtil.java (rev 0) +++ leto/jiemamy-commons/trunk/src/main/java/org/jiemamy/utils/JarURLConnectionUtil.java 2009-04-07 05:52:48 UTC (rev 3151) @@ -0,0 +1,48 @@ +/* + * Copyright 2007-2009 Jiemamy Project and the Others. + * + * 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 java.io.IOException; +import java.net.JarURLConnection; +import java.util.jar.JarFile; + +import org.jiemamy.exception.JiemamyError; + +/** + * {@link JarURLConnection}用のユーティリティクラス。 + * + * @author j5ik2o + * + */ +public class JarURLConnectionUtil { + + /** + * {@link JarURLConnection#getJarFile()}の例外処理をラップするメソッドである。 + * + * @param conn {@link JarURLConnection} + * @return {@link JarFile} + * @throws IOException JarURLConnection#getJarFileが失敗した場合 + */ + public static JarFile getJarFile(JarURLConnection conn) throws IOException { + return conn.getJarFile(); + } + + private JarURLConnectionUtil() { + throw new JiemamyError("不到達ポイント"); + } +} Added: leto/jiemamy-commons/trunk/src/main/java/org/jiemamy/utils/MethodUtil.java =================================================================== --- leto/jiemamy-commons/trunk/src/main/java/org/jiemamy/utils/MethodUtil.java (rev 0) +++ leto/jiemamy-commons/trunk/src/main/java/org/jiemamy/utils/MethodUtil.java 2009-04-07 05:52:48 UTC (rev 3151) @@ -0,0 +1,387 @@ +/* + * Copyright 2007-2009 Jiemamy Project and the Others. + * + * 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 java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.lang.reflect.Modifier; + +import org.jiemamy.exception.JiemamyError; + +/** + * {@link Method}用のユーティリティクラス。 + * + * @author j5ik2o + * + */ +public class MethodUtil { + + /** バッファサイズ */ + private static final int BUFF_SIZE = 100; + + private static final Method IS_BRIDGE_METHOD = getIsBridgeMethod(); + + private static final Method IS_SYNTHETIC_METHOD = getIsSyntheticMethod(); + + /** {@link #getElementTypeOfCollectionFromParameterType(Method, int)}への定数参照。*/ + protected static final Method GET_ELEMENT_TYPE_OF_COLLECTION_FROM_PARAMETER_METHOD = + getElementTypeFromParameterMethod("Collection"); + + /** {@link #getElementTypeOfCollectionFromReturnType(Method)}への定数参照。*/ + protected static final Method GET_ELEMENT_TYPE_OF_COLLECTION_FROM_RETURN_METHOD = + getElementTypeFromReturnMethod("Collection"); + + /** {@link #getElementTypeOfListFromParameterType(Method, int)}への定数参照。*/ + protected static final Method GET_ELEMENT_TYPE_OF_LIST_FROM_PARAMETER_METHOD = + getElementTypeFromParameterMethod("List"); + + /** {@link #getElementTypeOfListFromReturnType(Method)}への定数参照。*/ + protected static final Method GET_ELEMENT_TYPE_OF_LIST_FROM_RETURN_METHOD = getElementTypeFromReturnMethod("List"); + + /** {@link #getElementTypeOfSetFromParameterType(Method, int)}への定数参照。*/ + protected static final Method GET_ELEMENT_TYPE_OF_SET_FROM_PARAMETER_METHOD = + getElementTypeFromParameterMethod("Set"); + + /** {@link #getElementTypeOfSetFromReturnType(Method)}への定数参照。*/ + protected static final Method GET_ELEMENT_TYPE_OF_SET_FROM_RETURN_METHOD = getElementTypeFromReturnMethod("Set"); + + + /** + * <code>ReflectionUtil#getElementTypeOf<var>Xxx</var>FromParameter</code>の{@link Method}を取得する。 + * + * @param type 取得するメソッドが対象とする型名 + * + * @return {@link Method} + */ + protected static Method getElementTypeFromParameterMethod(final String type) { + try { + final Class<?> reflectionUtilClass = ReflectionUtil.class; + return reflectionUtilClass.getMethod("getElementTypeOf" + type + "FromParameterType", new Class[] { + Method.class, + int.class + }); + } catch (final Throwable ignore) { + // ignore + } + return null; + } + + /** + * <code>ReflectionUtil#getElementTypeOf<var>Xxx</var>FromReturn</code>の{@link Method}を取得する。 + * + * @param type 取得するメソッドが対象とする型名 + * @return {@link Method} + */ + protected static Method getElementTypeFromReturnMethod(final String type) { + try { + final Class<?> reflectionUtilClass = ReflectionUtil.class; + return reflectionUtilClass.getMethod("getElementTypeOf" + type + "FromReturnType", new Class[] { + Method.class + }); + } catch (final Throwable ignore) { + // ignore + } + return null; + } + + /** + * メソッドの引数型 (パラメタ化されたコレクション)の要素型を取得する。 + * + * @param method メソッド + * @param position パラメタ化されたコレクションが宣言されているメソッド引数の位置 + * @return 指定されたメソッドの引数型として宣言されているパラメタ化されたコレクションの要素型 + * @throws InvocationTargetException メソッドが例外をスローする場合 + * @throws IllegalAccessException メソッドにアクセスできない場合 + * @throws IllegalArgumentException 引数が正しくない場合 + */ + public static Class<?> getElementTypeOfCollectionFromParameterType(final Method method, final int position) + throws IllegalArgumentException, IllegalAccessException, InvocationTargetException { + return (Class<?>) MethodUtil.invoke(GET_ELEMENT_TYPE_OF_COLLECTION_FROM_PARAMETER_METHOD, null, new Object[] { + method, + Integer.valueOf(position) + }); + } + + /** + * 指定されたメソッドの戻り値型として宣言されているパラメタ化されたコレクションの要素型を取得する。 + * + * @param method メソッド + * @return 指定されたメソッドの戻り値型として宣言されているパラメタ化されたコレクションの要素型 + * @throws InvocationTargetException メソッドが例外をスローする場合 + * @throws IllegalAccessException メソッドにアクセスできない場合 + * @throws IllegalArgumentException 引数が正しくない場合 + */ + public static Class<?> getElementTypeOfCollectionFromReturnType(final Method method) + throws IllegalArgumentException, IllegalAccessException, InvocationTargetException { + return (Class<?>) MethodUtil.invoke(GET_ELEMENT_TYPE_OF_COLLECTION_FROM_RETURN_METHOD, null, new Object[] { + method + }); + } + + /** + * メソッドの引数型 (パラメタ化されたリスト) の要素型を取得する。 + * + * @param method メソッド + * @param position パラメタ化されたリストが宣言されているメソッド引数の位置 + * @return 指定されたメソッドの引数型として宣言されているパラメタ化されたリストの要素型 + * @throws InvocationTargetException メソッドが例外をスローする場合 + * @throws IllegalAccessException メソッドにアクセスできない場合 + * @throws IllegalArgumentException 引数が正しくない場合 + */ + public static Class<?> getElementTypeOfListFromParameterType(final Method method, final int position) + throws IllegalArgumentException, IllegalAccessException, InvocationTargetException { + return (Class<?>) MethodUtil.invoke(GET_ELEMENT_TYPE_OF_LIST_FROM_PARAMETER_METHOD, null, new Object[] { + method, + Integer.valueOf(position) + }); + } + + /** + * 指定されたメソッドの戻り値型として宣言されているパラメタ化されたリストの要素型を取得する。 + * + * @param method メソッド + * @return 指定されたメソッドの戻り値型として宣言されているパラメタ化されたリストの要素型 + * @throws InvocationTargetException メソッドが例外をスローする場合 + * @throws IllegalAccessException メソッドにアクセスできない場合 + * @throws IllegalArgumentException 引数が正しくない場合 + */ + public static Class<?> getElementTypeOfListFromReturnType(final Method method) throws IllegalArgumentException, + IllegalAccessException, InvocationTargetException { + return (Class<?>) MethodUtil.invoke(GET_ELEMENT_TYPE_OF_LIST_FROM_RETURN_METHOD, null, new Object[] { + method + }); + } + + /** + * メソッドの引数型 (パラメタ化されたセット) の要素型を取得する。 + * + * @param method メソッド + * @param position パラメタ化されたコレクションが宣言されているメソッド引数の位置 + * @return 指定されたメソッドの引数型として宣言されているパラメタ化されたセットの要素型 + * @throws InvocationTargetException メソッドが例外をスローする場合 + * @throws IllegalAccessException メソッドにアクセスできない場合 + * @throws IllegalArgumentException 引数が正しくない場合 + */ + public static Class<?> getElementTypeOfSetFromParameterType(final Method method, final int position) + throws IllegalArgumentException, IllegalAccessException, InvocationTargetException { + return (Class<?>) MethodUtil.invoke(GET_ELEMENT_TYPE_OF_SET_FROM_PARAMETER_METHOD, null, new Object[] { + method, + Integer.valueOf(position) + }); + } + + /** + * 指定されたメソッドの戻り値型として宣言されているパラメタ化されたセットの要素型を取得する。 + * + * @param method メソッド + * @return 指定されたメソッドの戻り値型として宣言されているパラメタ化されたセットの要素型 + * @throws InvocationTargetException メソッドが例外をスローする場合 + * @throws IllegalAccessException メソッドにアクセスできない場合 + * @throws IllegalArgumentException 引数が正しくない場合 + */ + public static Class<?> getElementTypeOfSetFromReturnType(final Method method) throws IllegalArgumentException, + IllegalAccessException, InvocationTargetException { + if (GET_ELEMENT_TYPE_OF_SET_FROM_RETURN_METHOD == null) { + return null; + } + return (Class<?>) MethodUtil.invoke(GET_ELEMENT_TYPE_OF_SET_FROM_RETURN_METHOD, null, new Object[] { + method + }); + } + + private static Method getIsBridgeMethod() { + try { + return Method.class.getMethod("isBridge", new Class<?>[] { + null + }); + } catch (final NoSuchMethodException e) { + return null; + } + } + + private static Method getIsSyntheticMethod() { + try { + return Method.class.getMethod("isSynthetic", new Class<?>[] { + null + }); + } catch (final NoSuchMethodException e) { + return null; + } + } + + /** + * シグニチャを取得する。 + * + * @param methodName メソッド名 + * @param argTypes 引数 + * @return シグニチャ + */ + public static String getSignature(String methodName, Class<?>[] argTypes) { + StringBuffer buf = new StringBuffer(BUFF_SIZE); + buf.append(methodName); + buf.append("("); + if (argTypes != null) { + for (int i = 0; i < argTypes.length; ++i) { + if (i > 0) { + buf.append(", "); + } + buf.append(argTypes[i].getName()); + } + } + buf.append(")"); + return buf.toString(); + } + + /** + * シグニチャを取得する。 + * + * @param methodName メソッド名 + * @param methodArgs メソッドの引数 + * @return シグニチャ + */ + public static String getSignature(String methodName, Object[] methodArgs) { + StringBuffer buf = new StringBuffer(BUFF_SIZE); + buf.append(methodName); + buf.append("("); + if (methodArgs != null) { + for (int i = 0; i < methodArgs.length; ++i) { + if (i > 0) { + buf.append(", "); + } + if (methodArgs[i] != null) { + buf.append(methodArgs[i].getClass().getName()); + } else { + buf.append("null"); + } + } + } + buf.append(")"); + return buf.toString(); + } + + /** + * {@link Method#invoke(Object, Object[])}の例外処理をラップする。 + * + * @param method メソッド + * @param target ターゲット + * @param args 引数 + * @return 戻り値 + * @throws IllegalAccessException メソッドにアクセスできない場合 + * @throws IllegalArgumentException 引数が正しくない場合 + * @throws InvocationTargetException メソッドが例外をスローする場合 + * @see Method#invoke(Object, Object[]) + */ + public static Object invoke(Method method, Object target, Object[] args) throws IllegalArgumentException, + IllegalAccessException, InvocationTargetException { + try { + return method.invoke(target, args); + } catch (InvocationTargetException ex) { + Throwable t = ex.getCause(); + if (t instanceof RuntimeException) { + throw (RuntimeException) t; + } + if (t instanceof Error) { + throw (Error) t; + } + throw ex; + } + } + + /** + * <code>abstract</code>かどうかを取得する。 + * + * @param method メソッド + * @return <code>abstract</code>かどうか + */ + public static boolean isAbstract(Method method) { + int mod = method.getModifiers(); + return Modifier.isAbstract(mod); + } + + /** + * ブリッジメソッドかどうか取得する。 + * + * @param method {@link Method} + * @return ブリッジメソッドかどうか + * @throws InvocationTargetException メソッドが例外をスローする場合 + * @throws IllegalAccessException メソッドにアクセス場合 + * @throws IllegalArgumentException 引数が正しくない場合 + */ + public static boolean isBridgeMethod(final Method method) throws IllegalArgumentException, IllegalAccessException, + InvocationTargetException { + if (IS_BRIDGE_METHOD == null) { + return false; + } + return ((Boolean) MethodUtil.invoke(IS_BRIDGE_METHOD, method, null)).booleanValue(); + } + + /** + * equalsメソッドかどうかを取得する。 + * + * @param method {@link Method} + * @return equalsメソッドかどうか + */ + public static boolean isEqualsMethod(Method method) { + return method != null && method.getName().equals("equals") && method.getReturnType() == boolean.class + && method.getParameterTypes().length == 1 && method.getParameterTypes()[0] == Object.class; + } + + /** + * hashCodeメソッドかどうか取得する。 + * + * @param method {@link Method} + * @return hashCodeメソッドかどうか + */ + public static boolean isHashCodeMethod(Method method) { + return method != null && method.getName().equals("hashCode") && method.getReturnType() == int.class + && method.getParameterTypes().length == 0; + } + + /** + * 合成メソッドかどうかを取得する。 + * + * @param method {@link Method} + * @return 合成メソッドかどうか + * @throws InvocationTargetException メソッドが例外をスローする場合 + * @throws IllegalAccessException メソッドにアクセス場合 + * @throws IllegalArgumentException 引数が正しくない場合 + */ + public static boolean isSyntheticMethod(final Method method) throws IllegalArgumentException, + IllegalAccessException, InvocationTargetException { + if (IS_SYNTHETIC_METHOD == null) { + return false; + } + return ((Boolean) MethodUtil.invoke(IS_SYNTHETIC_METHOD, method, null)).booleanValue(); + } + + /** + * toStringメソッドかどうか取得する。 + * + * @param method {@link Method} + * @return toStringメソッドかどうか + */ + public static boolean isToStringMethod(Method method) { + return method != null && method.getName().equals("toString") && method.getReturnType() == String.class + && method.getParameterTypes().length == 0; + } + + private MethodUtil() { + throw new JiemamyError("不到達ポイント"); + } + +} Added: leto/jiemamy-commons/trunk/src/main/java/org/jiemamy/utils/ModifierUtil.java =================================================================== --- leto/jiemamy-commons/trunk/src/main/java/org/jiemamy/utils/ModifierUtil.java (rev 0) +++ leto/jiemamy-commons/trunk/src/main/java/org/jiemamy/utils/ModifierUtil.java 2009-04-07 05:52:48 UTC (rev 3151) @@ -0,0 +1,171 @@ +/* + * Copyright 2007-2009 Jiemamy Project and the Others. + * + * 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 java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.lang.reflect.Modifier; + +/** + * {@link Modifier}用のユーティリティクラスです。 + * + * @author j5ik2o + * + */ +public class ModifierUtil { + + static final int BRIDGE = 0x00000040; + + static final int SYNTHETIC = 0x00001000; + + + /** + * <code>abstract</code>かどうかを取得する。 + * + * @param clazz クラス + * @return <code>abstract</code>かどうか + */ + public static boolean isAbstract(Class<?> clazz) { + return isAbstract(clazz.getModifiers()); + } + + /** + * <code>abstract</code>かどうかを取得する。 + * + * @param modifier モディファイヤ + * @return <code>abstract</code>かどうか + */ + public static boolean isAbstract(int modifier) { + return Modifier.isAbstract(modifier); + } + + /** + * <code>final</code>かどうかを取得する。 + * + * @param modifier モディファイヤ + * @return <code>final</code>かどうか + */ + public static boolean isFinal(int modifier) { + return Modifier.isFinal(modifier); + } + + /** + * <code>final</code>かどうかを取得する。 + * + * @param method メソッド + * @return <code>final</code>かどうか + */ + public static boolean isFinal(Method method) { + return isFinal(method.getModifiers()); + } + + /** + * インスタンスフィールドかどうかを取得する。 + * + * @param field フィールド + * @return インスタンスフィールドかどうか + */ + public static boolean isInstanceField(Field field) { + int m = field.getModifiers(); + return !isStatic(m) && !isFinal(m); + } + + /** + * <code>public</code>かどうかを取得する。 + * + * @param f フィールド + * @return パブリックかどうか + */ + public static boolean isPublic(Field f) { + return isPublic(f.getModifiers()); + } + + /** + * <code>public</code>かどうかを取得する。 + * + * @param modifier モディファイヤ + * @return <code>public</code>かどうか + */ + public static boolean isPublic(int modifier) { + return Modifier.isPublic(modifier); + } + + /** + * <code>public</code>かどうかを取得する。 + * + * @param m メソッド + * @return パブリックかどうか + */ + public static boolean isPublic(Method m) { + return isPublic(m.getModifiers()); + } + + /** + * <code>public</code>,<code>static</code>,<code>final</code>かどうかを取得する。 + * + * @param modifier モディファイヤ + * @return <code>public</code>,<code>static</code>,<code>final</code>かどうか + */ + public static boolean isPublicStaticFinal(int modifier) { + return isPublic(modifier) && isStatic(modifier) && isFinal(modifier); + } + + /** + * <code>public</code>,<code>static</code>,<code>final</code>かどうかを取得する。 + * + * @param f フィールド + * @return <code>public</code>,<code>static</code>,<code>final</code>かどうか + */ + public static boolean isPublicStaticFinalField(Field f) { + return isPublicStaticFinal(f.getModifiers()); + } + + /** + * <code>static</code>かどうかを取得する。 + * + * @param modifier モディファイヤ + * @return <code>static</code>かどうか + */ + public static boolean isStatic(int modifier) { + return Modifier.isStatic(modifier); + } + + /** + * <code>transient</code>かどうかを取得する。 + * + * @param field フィールド + * @return <code>transient</code>かどうか + * @see #isTransient(int) + */ + public static boolean isTransient(Field field) { + return isTransient(field.getModifiers()); + } + + /** + * <code>transient</code>かどうかを取得する。 + * + * @param modifier モディファイヤ + * @return <code>transient</code>かどうか + */ + public static boolean isTransient(int modifier) { + return Modifier.isTransient(modifier); + } + + private ModifierUtil() { + } +} Added: leto/jiemamy-commons/trunk/src/main/java/org/jiemamy/utils/OutputStreamUtil.java =================================================================== --- leto/jiemamy-commons/trunk/src/main/java/org/jiemamy/utils/OutputStreamUtil.java (rev 0) +++ leto/jiemamy-commons/trunk/src/main/java/org/jiemamy/utils/OutputStreamUtil.java 2009-04-07 05:52:48 UTC (rev 3151) @@ -0,0 +1,61 @@ +/* + * Copyright 2007-2009 Jiemamy Project and the Others. + * + * 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 java.io.IOException; +import java.io.OutputStream; + +import org.jiemamy.exception.JiemamyError; + +/** + * {@link OutputStream}用のユーティリティクラス。 + * + * @author j5ik2o + */ +public final class OutputStreamUtil { + + /** + * {@link OutputStream}を閉じる。 + * + * @param out {@link OutputStream} + * @throws IOException closeが失敗した場合 + */ + public static void close(OutputStream out) throws IOException { + if (out == null) { + return; + } + out.close(); + } + + /** + * {@link OutputStream}をフラッシュする。 + * + * @param out {@link OutputStream} + * @throws IOException closeが失敗した場合 + */ + public static void flush(OutputStream out) throws IOException { + if (out == null) { + return; + } + out.flush(); + } + + private OutputStreamUtil() { + throw new JiemamyError("不到達ポイント"); + } +} Added: leto/jiemamy-commons/trunk/src/main/java/org/jiemamy/utils/PropertyNotFoundException.java =================================================================== --- leto/jiemamy-commons/trunk/src/main/java/org/jiemamy/utils/PropertyNotFoundException.java (rev 0) +++ leto/jiemamy-commons/trunk/src/main/java/org/jiemamy/utils/PropertyNotFoundException.java 2009-04-07 05:52:48 UTC (rev 3151) @@ -0,0 +1,74 @@ +/* + * Copyright 2007-2009 Jiemamy Project and the Others. + * + * 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; + +/** + * プロパティが見つからない場合の例外クラス。 + * + * @author j5ik2o + */ + @ SuppressWarnings("serial") +public class PropertyNotFoundException extends Exception { + + private String entityName; + + private String propertyName; + + + /** + * インスタンスを生成する。 + * + * @param entityName エンティティ名 + * @param propertyName プロパティ名 + */ + public PropertyNotFoundException(String entityName, String propertyName) { + this(entityName, propertyName, null); + } + + /** + * インスタンスを生成する。 + * + * @param entityName エンティティ名 + * @param propertyName プロパティ名 + * @param cause 原因となった例外 + */ + public PropertyNotFoundException(String entityName, String propertyName, Throwable cause) { + super(String.format("%s.%s is not found.", entityName, propertyName), cause); + this.entityName = entityName; + this.propertyName = propertyName; + } + + /** + * エンティティ名を取得する。 + * + * @return エンティティ名 + */ + public String getEntityName() { + return entityName; + } + + /** + * プロパティ名を取得する。 + * + * @return プロパティ名 + */ + public String getPropertyName() { + return propertyName; + } + +} Modified: leto/jiemamy-commons/trunk/src/main/java/org/jiemamy/utils/ReflectionUtil.java =================================================================== --- leto/jiemamy-commons/trunk/src/main/java/org/jiemamy/utils/ReflectionUtil.java 2009-04-07 01:02:00 UTC (rev 3150) +++ leto/jiemamy-commons/trunk/src/main/java/org/jiemamy/utils/ReflectionUtil.java 2009-04-07 05:52:48 UTC (rev 3151) @@ -18,8 +18,11 @@ */ package org.jiemamy.utils; +import java.lang.reflect.Constructor; import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; +import java.lang.reflect.Type; import org.apache.commons.lang.CharUtils; @@ -115,6 +118,368 @@ } /** + * 現在のスレッドのコンテキストクラスローダを使って指定された文字列名を持つクラスまたはインタフェースに + * 関連付けられた{@link Class}オブジェクトを取得する。 + * + * @param <T> {@link Class}オブジェクトが表すクラス + * @param className 要求するクラスの完全修飾名 + * @return 指定された名前を持つクラスの{@link Class}オブジェクト + * @throws ClassNotFoundException クラスが見つからなかった場合 + * @see Class#forName(String) + */ + public static <T>Class<T> forName(final String className) throws ClassNotFoundException { + return forName(className, Thread.currentThread().getContextClassLoader()); + } + + /** + * 指定されたクラスローダを使って指定された文字列名を持つクラスまたはインタフェースに + * 関連付けられた{@link Class}オブジェクトを取得する。 + * + * @param <T> {@link Class}オブジェクトが表すクラス + * @param className 要求するクラスの完全修飾名 + * @param loader クラスのロード元である必要があるクラスローダ + * @return 指定された名前を持つクラスの{@link Class}オブジェクト + * @throws ClassNotFoundException クラスが見つからなかった場合 + * @see Class#forName(String, boolean, ClassLoader) + */ + @SuppressWarnings("unchecked") + public static <T>Class<T> forName(final String className, final ClassLoader loader) throws ClassNotFoundException { + return (Class<T>) Class.forName(className, true, loader); + } + + /** + * 現在のスレッドのコンテキストクラスローダを使って、 指定された文字列名を持つクラスまたはインタフェースに + * 関連付けられた{@link Class}オブジェクトを取得する。 + * <p> + * クラスが見つからなかった場合は{@code null}を取得する。 + * </p> + * + * @param <T> {@link Class}オブジェクトが表すクラス + * @param className 要求するクラスの完全修飾名 + * @return 指定された名前を持つクラスの{@link Class}オブジェクト + * @see Class#forName(String) + */ + public static <T>Class<T> forNameNoException(final String className) { + return forNameNoException(className, Thread.currentThread().getContextClassLoader()); + } + + /** + * 指定されたクラスローダを使って、 指定された文字列名を持つクラスまたはインタフェースに + * 関連付けられた{@link Class}オブジェクトを取得する。 + * <p> + * クラスが見つからなかった場合は{@code null}を取得する。 + * </p> + * + * @param <T> {@link Class}オブジェクトが表すクラス + * @param className 要求するクラスの完全修飾名 + * @param loader クラスのロード元である必要があるクラスローダ + * @return 指定された名前を持つクラスの{@link Class}オブジェクト + * @see Class#forName(String) + */ + @SuppressWarnings("unchecked") + public static <T>Class<T> forNameNoException(final String className, final ClassLoader loader) { + try { + return (Class<T>) Class.forName(className, true, loader); + } catch (final Throwable ignore) { + return null; + } + } + + /** + * {@link Class}オブジェクトが表すクラスの指定された{@code public}コンストラクタを + * リフレクトする{@link Constructor}オブジェクトを取得する。 + * + * @param <T> {@link Class}オブジェクトが表すクラス + * @param clazz クラスの{@link Class}オブジェクト + * @param argTypes パラメータ配列 + * @return 指定された{@code argTypes}と一致する{@code public}コンストラクタの{@link Constructor}オブジェクト + * @throws NoSuchMethodException メソッドが見つからなかった場合 + * @throws SecurityException セキュリティ違反が発生した場合 + * @see Class#getConstructor(Class[]) + */ + public static <T>Constructor<T> getConstructor(final Class<T> clazz, final Class<?>... argTypes) + throws SecurityException, NoSuchMethodException { + return clazz.getConstructor(argTypes); + } + + /** + * {@link Class}オブジェクトが表すクラスまたはインタフェースの指定されたコンストラクタを + * リフレクトする{@link Constructor}オブジェクトを取得する。 + * + * @param <T> {@link Class}オブジェクトが表すクラス + * @param clazz クラスの{@link Class}オブジェクト + * @param argTypes パラメータ配列 + * @return 指定された{@code argTypes}と一致するコンストラクタの{@link Constructor}オブジェクト + * @throws NoSuchMethodException メソッドが見つからなかった場合 + * @throws SecurityException セキュリティ違反が発生した場合 + * @see Class#getDeclaredConstructor(Class[]) + */ + public static <T>Constructor<T> getDeclaredConstructor(final Class<T> clazz, final Class<?>... argTypes) + throws SecurityException, NoSuchMethodException { + return clazz.getDeclaredConstructor(argTypes); + } + + /** + * {@link Class}オブジェクトが表すクラスまたはインタフェースの指定された宣言フィールドをリフレクトする{@link Field}オブジェクトを取得する。 + * + * @param clazz クラスの{@link Class}オブジェクト + * @param name フィールド名 + * @return {@code name}で指定されたこのクラスの{@link Field}オブジェクト + * @throws NoSuchFieldException メソッドが見つからなかった場合 + * @throws SecurityException セキュリティ違反が発生した場合 + * @see Class#getDeclaredField(String) + */ + public static Field getDeclaredField(final Class<?> clazz, final String name) throws SecurityException, + NoSuchFieldException { + return clazz.getDeclaredField(name); + } + + /** + * {@link Class}オブジェクトが表すクラスまたはインタフェースの指定されたメンバメソッドを + * リフレクトする{@link Method}オブジェクトを取得する。 + * + * @param clazz クラスの{@link Class}オブジェクト + * @param name メソッドの名前 + * @param argTypes パラメータのリスト + * @return 指定された{@code name}および{@code argTypes}と一致する{@link Method}オブジェクト + * @throws NoSuchMethodException メソッドが見つからない場合 + * @throws SecurityException セキュリティ違反が発生した場合 + * @see Class#getDeclaredMethod(String, Class[]) + */ + public static Method getDeclaredMethod(final Class<?> clazz, final String name, final Class<?>... argTypes) + throws SecurityException, NoSuchMethodException { + return clazz.getDeclaredMethod(name, argTypes); + } + + /** + * パラメタ化されたコレクションの要素型を取得する。 + * + * @param parameterizedCollection パラメタ化されたコレクションの型 + * @return パラメタ化されたコレクションの要素型 + */ + public static Class<?> getElementTypeOfCollection(final Type parameterizedCollection) { + return GenericUtil.getRawClass(GenericUtil.getElementTypeOfCollection(parameterizedCollection)); + } + + /** + * 指定されたフィールドのパラメタ化されたコレクションの要素型を取得する。 + * + * @param field フィールド + * @return 指定されたフィールドのパラメタ化されたコレクションの要素型 since 2.4.18 + * since 2.4.18 + */ + public static Class<?> getElementTypeOfCollectionFromFieldType(final Field field) { + final Type type = field.getGenericType(); + return getElementTypeOfCollection(type); + } + + /** + * 指定されたメソッドの引数型として宣言されているパラメタ化されたコレクションの要素型を取得する。 + * + * @param method メソッド + * @param parameterPosition パラメタ化されたコレクションが宣言されているメソッド引数の位置 + * @return 指定されたメソッドの引数型として宣言されているパラメタ化されたコレクションの要素型 + */ + public static Class<?> getElementTypeOfCollectionFromParameterType(final Method method, final int parameterPosition) { + final Type[] parameterTypes = method.getGenericParameterTypes(); + return getElementTypeOfCollection(parameterTypes[parameterPosition]); + } + + /** + * 指定されたメソッドの戻り値型として宣言されているパラメタ化されたコレクションの要素型を取得する。 + * + * @param method メソッド + * @return 指定されたメソッドの戻り値型として宣言されているパラメタ化されたコレクションの要素型 + */ + public static Class<?> getElementTypeOfCollectionFromReturnType(final Method method) { + return getElementTypeOfCollection(method.getGenericReturnType()); + } + + /** + * パラメタ化されたリストの要素型を取得する。 + * + * @param parameterizedList パラメタ化されたリストの型 + * @return パラメタ化されたリストの要素型 + */ + public static Class<?> getElementTypeOfList(final Type parameterizedList) { + return GenericUtil.getRawClass(GenericUtil.getElementTypeOfList(parameterizedList)); + } + + /** + * 指定されたフィールドのパラメタ化されたリストの要素型を取得する。 + * + * @param field フィールド + * @return 指定されたフィールドのパラメタ化されたリストの要素型 + */ + public static Class<?> getElementTypeOfListFromFieldType(final Field field) { + final Type type = field.getGenericType(); + return getElementTypeOfList(type); + } + + /** + * 指定されたメソッドの引数型として宣言されているパラメタ化されたリストの要素型を取得する。 + * + * @param method メソッド + * @param parameterPosition パラメタ化されたリストが宣言されているメソッド引数の位置 + * @return 指定されたメソッドの引数型として宣言されているパラメタ化されたリストの要素型 + */ + public static Class<?> getElementTypeOfListFromParameterType(final Method method, final int parameterPosition) { + final Type[] parameterTypes = method.getGenericParameterTypes(); + return getElementTypeOfList(parameterTypes[parameterPosition]); + } + + /** + * 指定されたメソッドの戻り値型として宣言されているパラメタ化されたリストの要素型を取得する。 + * + * @param method メソッド + * @return 指定されたメソッドの戻り値型として宣言されているパラメタ化されたリストの要素型 + */ + public static Class<?> getElementTypeOfListFromReturnType(final Method method) { + return getElementTypeOfList(method.getGenericReturnType()); + } + + /** + * パラメタ化されたセットの要素型を取得する。 + * + * @param parameterizedSet パラメタ化されたセットの型 + * @return パラメタ化されたセットの要素型 + */ + public static Class<?> getElementTypeOfSet(final Type parameterizedSet) { + return GenericUtil.getRawClass(GenericUtil.getElementTypeOfSet(parameterizedSet)); + } + + /** + * 指定されたフィールドのパラメタ化されたセットの要素型を取得する。 + * + * @param field フィールド + * @return 指定されたフィールドのパラメタ化されたセットの要素型 since 2.4.18 + */ + public static Class<?> getElementTypeOfSetFromFieldType(final Field field) { + final Type type = field.getGenericType(); + return getElementTypeOfSet(type); + } + + /** + * 指定されたメソッドの引数型として宣言されているパラメタ化されたセットの要素型を取得する。 + * + * @param method メソッド + * @param parameterPosition パラメタ化されたセットが宣言されているメソッド引数の位置 + * @return 指定されたメソッドの引数型として宣言されているパラメタ化されたセットの要素型 + */ + public static Class<?> getElementTypeOfSetFromParameterType(final Method method, final int parameterPosition) { + final Type[] parameterTypes = method.getGenericParameterTypes(); + return getElementTypeOfSet(parameterTypes[parameterPosition]); + } + + /** + * 指定されたメソッドの戻り値型として宣言されているパラメタ化されたセットの要素型を取得する。 + * + * @param method メソッド + * @return 指定されたメソッドの戻り値型として宣言されているパラメタ化されたセットの要素型 + */ + public static Class<?> getElementTypeOfSetFromReturnType(final Method method) { + return getElementTypeOfSet(method.getGenericReturnType()); + } + + /** + * {@link Class}オブジェクトが表すクラスまたはインタフェースの指定された{@code public}メンバフィールドをリフレクトする{@link Field}オブジェクトを取得する。 + * + * @param clazz クラスの{@link Class}オブジェクト + * @param name フィールド名 + * @return {@code name}で指定されたこのクラスの{@link Field}オブジェクト + * @throws NoSuchFieldException フィールドが見つからなかった場合 + * @throws SecurityException セキュリティ違反が発生した場合 + * @see Class#getField(String) + */ + public static Field getField(final Class<?> clazz, final String name) throws SecurityException, + NoSuchFieldException { + return clazz.getField(name); + } + + /** + * {@link Class}オブジェクトが表すクラスまたはインタフェースの指定された{@code public}メンバメソッドを + * リフレクトする{@link Method}オブジェクトを取得する。 + * + * @param clazz クラスの{@link Class}オブジェクト + * @param name メソッドの名前 + * @param argTypes パラメータのリスト + * @return 指定された{@code name}および{@code argTypes}と一致する{@link Method}オブジェクト + * @throws NoSuchMethodException メソッドが見つからなかった場合 + * @throws SecurityException セキュリティ違反が発生した場合 + * @see Class#getMethod(String, Class[]) + */ + public static Method getMethod(final Class<?> clazz, final String name, final Class<?>... argTypes) + throws SecurityException, NoSuchMethodException { + return clazz.getMethod(name, argTypes); + } + + /** + * 指定されたオブジェクトについて、{@link Field}によって表される{@code static}フィールドの値を取得する。 + * + * @param <T> フィールドの型 + * @param field フィールド + * @return {@code static}フィールドで表現される値 + * @throws IllegalAccessException 基本となるフィールドにアクセスできない場合 + * @see Field#get(Object) + */ + @SuppressWarnings("unchecked") + public static <T>T getStaticValue(final Field field) throws IllegalAccessException { + return (T) getValue(field, null); + } + + /** + * 指定されたオブジェクトについて、{@link Field}によって表されるフィールドの値を取得する。 + * + * @param <T> フィールドの型 + * @param field フィールド + * @param target 表現されるフィールド値の抽出元オブジェクト + * @return オブジェクト{@code obj}内で表現される値 + * @throws IllegalAccessException 基本となるフィールドにアクセスできない場合 + * @see Field#get(Object) + */ + @SuppressWarnings("unchecked") + public static <T>T getValue(final Field field, final Object target) throws IllegalAccessException { + return (T) field.get(target); + } + + /** + * {@link Method}オブジェクトによって表される基本となるメソッドを、指定したオブジェクトに対して指定したパラメータで呼び出す。 + * + * @param <T> メソッドの戻り値の型 + * @param method メソッド + * @param target 基本となるメソッドの呼び出し元のオブジェクト + * @param args メソッド呼び出しに使用される引数 + * @return このオブジェクトが表すメソッドを、パラメータ{@code args}を使用して{@code obj}にディスパッチした結果 + * @throws InvocationTargetException 基本となるメソッドが例外をスローする場合 + * @throws IllegalAccessException この{@link Method}オブジェクトがJava言語アクセス制御を実施し基本となるメソッドにアクセスできない場合 + * @throws IllegalArgumentException 不正な引数、または不適切な引数をメソッドに渡した場合 + * @see Method#invoke(Object, Object[]) + */ + @SuppressWarnings("unchecked") + public static <T>T invoke(final Method method, final Object target, final Object... args) + throws IllegalArgumentException, IllegalAccessException, InvocationTargetException { + return (T) method.invoke(target, args); + } + + /** + * {@link Method}オブジェクトによって表される基本となる{@code static}メソッドを指定したパラメータで呼び出す。 + * + * @param <T> メソッドの戻り値の型 + * @param method メソッド + * @param args メソッド呼び出しに使用される引数 + * @return このオブジェクトが表す{@code static}メソッドを、パラメータ{@code args}を使用してディスパッチした結果 + * @throws InvocationTargetException 基本となるメソッドが例外をスローする場合 + * @throws IllegalAccessException この{@link Method}オブジェクトがJava言語アクセス制御を実施し基本となるメソッドにアクセスできない場合 + * @throws IllegalArgumentException 不正な引数、または不適切な引数をメソッドに渡した場合 + * @see Method#invoke(Object, Object[]) + */ + @SuppressWarnings("unchecked") + public static <T>T invokeStatic(final Method method, final Object... args) throws IllegalArgumentException, + IllegalAccessException, InvocationTargetException { + return (T) invoke(method, null, args); + } + + /** * メソッドがアクセサメソッドかどうかを調べる。 * * @param method メソッド @@ -160,6 +525,70 @@ return name.startsWith(SET) && name.length() > 3 && CharUtils.isAsciiAlphaUpper(name.toCharArray()[3]); } + /** + * 指定されたクラスのデフォルトコンストラクタで、クラスの新しいインスタンスを作成および初期化する。 + * + * @param <T> {@link Class}オブジェクトが表すクラス + * @param clazz クラスを表す{@link Class}オブジェクト + * @return このオブジェクトが表すコンストラクタを呼び出すことで作成される新規オブジェクト + * @throws InstantiationException 基本となるコンストラクタを宣言するクラスが{@code abstract}クラスを表す場合 + * @throws IllegalAccessException 実パラメータ数と仮パラメータ数が異なる場合、 + * プリミティブ引数のラップ解除変換が失敗した場合、 またはラップ解除後、 + * メソッド呼び出し変換によってパラメータ値を対応する仮パラメータ型に変換できない場合、 + * このコンストラクタが列挙型に関連している場合 + * @see Constructor#newInstance(Object[]) + */ + public static <T>T newInstance(final Class<T> clazz) throws InstantiationException, IllegalAccessException { + return clazz.newInstance(); + } + + /** + * 指定された初期化パラメータで、コンストラクタの宣言クラスの新しいインスタンスを作成および初期化する。 + * + * @param <T> コンストラクタの宣言クラス + * @param constructor コンストラクタ + * @param args コンストラクタ呼び出しに引数として渡すオブジェクトの配列 + * @return コンストラクタを呼び出すことで作成される新規オブジェクト + * @throws InstantiationException 基本となるコンストラクタを宣言するクラスが{@code abstract}クラスを表す場合 + * @throws IllegalAccessException 実パラメータ数と仮パラメータ数が異なる場合、 + * プリミティブ引数のラップ解除変換が失敗した場合、 またはラップ解除後、 + * メソッド呼び出し変換によってパラメータ値を対応する仮パラメータ型に変換できない場合、 + * このコンストラクタが列挙型に関連している場合 + * @throws InvocationTargetException 基本となるメソッドが例外をスローする場合 + * @throws IllegalArgumentException 不正な引数、または不適切な引数をメソッドに渡した場合 + * @see Constructor#newInstance(Object[]) + */ + public static <T>T newInstance(final Constructor<T> constructor, final Object... args) + throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException { + return constructor.newInstance(args); + } + + /** + * {@link Field}オブジェクトによって表される{@code static}フィールドを、指定された新しい値に設定する。 + * + * @param field フィールド + * @param value {@code static}フィールドの新しい値 + * @throws IllegalAccessException 基本となるフィールドにアクセスできない場合 + * @see Field#set(Object, Object) + */ + public static void setStaticValue(final Field field, final Object value) throws IllegalAccessException { + setValue(field, null, value); + } + + /** + * {@link Field}オブジェクトによって表される指定されたオブジェクト引数のフィールドを、指定された新しい値に設定する。 + * + * @param field フィールド + * @param target フィールドを変更するオブジェクト + * @param value 変更中の{@code target}の新しいフィールド値 + * @throws IllegalAccessException 基本となるフィールドにアクセスできない場合 + * @see Field#set(Object, Object) + */ + public static void setValue(final Field field, final Object target, final Object value) + throws IllegalAccessException { + field.set(target, value); + } + private ReflectionUtil() { } } Added: leto/jiemamy-commons/trunk/src/main/java/org/jiemamy/utils/ResourceBundleUtil.java =================================================================== --- leto/jiemamy-commons/trunk/src/main/java/org/jiemamy/utils/ResourceBundleUtil.java (rev 0) +++ leto/jiemamy-commons/trunk/src/main/java/org/jiemamy/utils/ResourceBundleUtil.java 2009-04-07 05:52:48 UTC (rev 3151) @@ -0,0 +1,110 @@ +/* + * Copyright 2007-2009 Jiemamy Project and the Others. + * + * 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 java.util.Enumeration; +import java.util.HashMap; +import java.util.Locale; +import java.util.Map; +import java.util.MissingResourceException; +import java.util.ResourceBundle; + +import org.jiemamy.exception.JiemamyError; + +/** + * {@link ResourceBundle}用のユーティリティクラス。 + * + * @author j5ik2o + * + */ +public class ResourceBundleUtil { + + /** + * {@link Map}に変換します。 + * + * @param bundle バンドル + * @return {@link Map} + */ + public static final Map<String, String> convertMap(ResourceBundle bundle) { + Map<String, String> ret = new HashMap<String, String>(); + for (Enumeration<String> e = bundle.getKeys(); e.hasMoreElements();) { + String key = e.nextElement(); + String value = bundle.getString(key); + ret.put(key, value); + } + return ret; + } + + /** + * {@link Map}に変換します。 + * + * @param name 名前 + * @param locale ロケール + * @return {@link Map} + */ + public static final Map<String, String> convertMap(String name, Locale locale) { + ResourceBundle bundle = getBundle(name, locale); + return convertMap(bundle); + } + + /** + * バンドルを返します。 見つからない場合は、<code>null</code>を返します。 + * + * @param name 名前 + * @param locale ロケール + * @return {@link ResourceBundle} + * @see ResourceBundle#getBundle(String, Locale) + */ + public static final ResourceBundle getBundle(String name, Locale locale) { + if (locale == null) { + locale = Locale.getDefault(); + } + try { + return ResourceBundle.getBundle(name, locale); + } catch (MissingResourceException ignore) { + return null; + } + } + + /** + * バンドルを返します。 見つからない場合は、<code>null</code>を返します。 + * + * @param name 名前 + * @param locale ロケール + * @param classLoader クラスローダ + * @return {@link ResourceBundle} + * @see ResourceBundle#getBundle(String, Locale, ClassLoader) + */ + public static final ResourceBundle getBundle(String name, Locale locale, ClassLoader classLoader) { + if (locale == null) { + locale = Locale.getDefault(); + } + try { + return ResourceBundle.getBundle(name, locale, classLoader); + } catch (MissingResourceException ignore) { + return null; + } + } + + /** + * インスタンスを構築します。 + */ + protected ResourceBundleUtil() { + throw new JiemamyError("不到達ポイント"); + } +} Added: leto/jiemamy-commons/trunk/src/main/java/org/jiemamy/utils/ResourceNotFoundException.java =================================================================== --- leto/jiemamy-commons/trunk/src/main/java/org/jiemamy/utils/ResourceNotFoundException.java (rev 0) +++ leto/jiemamy-commons/trunk/src/main/java/org/jiemamy/utils/ResourceNotFoundException.java 2009-04-07 05:52:48 UTC (rev 3151) @@ -0,0 +1,49 @@ +/* + * Copyright 2007-2009 Jiemamy Project and the Others. + * + * 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; + +/** + * リソースが見つからなかったときにスローされる例外クラス。 + * + * @author j5ik2o + */ + @ SuppressWarnings("serial") +public class ResourceNotFoundException extends Exception { + + private String path; + + + /** + * {@link ResourceNotFoundException}を作成する。 + * + * @param path パス + */ + public ResourceNotFoundException(String path) { + super(path); + this.path = path; + } + + /** + * パスを返します。 + * + * @return パス + */ + public String getPath() { + return path; + } +} Modified: leto/jiemamy-commons/trunk/src/main/java/org/jiemamy/utils/ResourceTraversal.java =================================================================== --- leto/jiemamy-commons/trunk/src/main/java/org/jiemamy/utils/ResourceTraversal.java 2009-04-07 01:02:00 UTC (rev 3150) +++ leto/jiemamy-commons/trunk/src/main/java/org/jiemamy/utils/ResourceTraversal.java 2009-04-07 05:52:48 UTC (rev 3151) @@ -1,6 +1,5 @@ /* * Copyright 2007-2009 Jiemamy Project and the Others. - * Created on 2009/01/12 * * This file is part of Jiemamy. * @@ -19,46 +18,61 @@ package org.jiemamy.utils; import java.io.File; -import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.util.Enumeration; import java.util.jar.JarEntry; import java.util.jar.JarFile; -import org.apache.commons.io.IOUtils; +import org.jiemamy.exception.JiemamyError; /** - * リソースをトラバースするためのクラス。 + * リソースを横断的に処理するためのクラス。 * - * <p>org.seasar.framework.util.ResourceTraversalよりコピー。</p> - * - * @author taedium - * + * @author j5ik2o */ -public final class ResourceTraversal { +public class ResourceTraversal { /** - * トラバースする。 + * リソースを処理するインターフェースです。 * - * @param rootDir - * @param handler - * @throws IOException */ - public static void forEach(final File rootDir, final ResourceHandler handler) throws IOException { + public interface ResourceHandler { + + /** + * リソースを処理します。 + * + * @param path パス + * @param is {@link InputStream} + */ + void processResource(String path, InputStream is) throws TraversalHandlerException; + } + + + /** + * リソースを横断的に処理する。 + * + * @param rootDir ルートディレクトリ + * @param handler ハンドラ + * @throws IOException 入出力が失敗した場合 + * @throws TraversalHandlerException ハンドラの処理が失敗した場合 + */ + public static void forEach(final File rootDir, final ResourceHandler handler) throws IOException, + TraversalHandlerException { forEach(rootDir, null, handler); } /** - * トラバースする。 + * リソースを横断的に処理する。 * - * @param rootDir - * @param baseDirectory - * @param handler - * @throws IOException + * @param rootDir ルートディレクトリ + * @param baseDirectory ベースディレクトリ + * @param handler ハンドラ + * @throws IOException 入出力が失敗した場合 + * @throws TraversalHandlerException ハンドラの処理が失敗した場合 */ public static void forEach(final File rootDir, final String baseDirectory, final ResourceHandler handler) - throws IOException { + throws IOException, TraversalHandlerException { final File baseDir = getBaseDir(rootDir, baseDirectory); if (baseDir.exists()) { traverseFileSystem(rootDir, baseDir, handler); @@ -66,23 +80,25 @@ } /** - * トラバースする。 + * リソースを横断的に処理する。 * - * @param jarFile - * @param handler - * @throws IOException + * @param jarFile JarFile + * @param handler ハンドラ + * @throws IOException 入出力が失敗した場合 + * @throws TraversalHandlerException ハンドラの処理が失敗した場合 */ - public static void forEach(final JarFile jarFile, final ResourceHandler handler) throws IOException { + public static void forEach(final JarFile jarFile, final ResourceHandler handler) throws IOException, + TraversalHandlerException { final Enumeration<JarEntry> enumeration = jarFile.entries(); while (enumeration.hasMoreElements()) { final JarEntry entry = enumeration.nextElement(); if (!entry.isDirectory()) { final String entryName = entry.getName().replace('\\', '/'); - final InputStream is = jarFile.getInputStream(entry); + final InputStream is = JarFileUtil.getInputStream(jarFile, entry); try { handler.processResource(entryName, is); } finally { - IOUtils.closeQuietly(is); + InputStreamUtil.close(is); } } } @@ -92,50 +108,38 @@ File baseDir = rootDir; if (baseDirectory != null) { final String[] names = baseDirectory.split("/"); - for (String element : names) { - baseDir = new File(baseDir, element); + for (String name : names) { + baseDir = new File(baseDir, name); } } return baseDir; } private static void traverseFileSystem(final File rootDir, final File baseDir, final ResourceHandler handler) - throws IOException { + throws IOException, TraversalHandlerException { final File[] files = baseDir.listFiles(); for (int i = 0; i < files.length; ++i) { final File file = files[i]; if (file.isDirectory()) { traverseFileSystem(rootDir, file, handler); } else { - - final int pos = rootDir.getCanonicalPath().length(); - final String filePath = file.getCanonicalPath(); + final int pos = FileUtil.getCanonicalPath(rootDir).length(); + final String filePath = FileUtil.getCanonicalPath(file); final String resourcePath = filePath.substring(pos + 1).replace('\\', '/'); - final InputStream is = new FileInputStream(file); + final InputStream is = FileInputStreamUtil.create(file); try { handler.processResource(resourcePath, is); } finally { - IOUtils.closeQuietly(is); + InputStreamUtil.close(is); } } } } - private ResourceTraversal() { - } - - /** - * リソースを処理するインターフェースです。 + * インスタンスを構築します。 */ - public interface ResourceHandler { - - /** - * リソースを処理します。 - * - * @param path - * @param is - */ - void processResource(String path, InputStream is); + protected ResourceTraversal() { + throw new JiemamyError("不到達ポイント"); } } Added: leto/jiemamy-commons/trunk/src/main/java/org/jiemamy/utils/ResourceUtil.java =================================================================== --- leto/jiemamy-commons/trunk/src/main/java/org/jiemamy/utils/ResourceUtil.java (rev 0) +++ leto/jiemamy-commons/trunk/src/main/java/org/jiemamy/utils/ResourceUtil.java 2009-04-07 05:52:48 UTC (rev 3151) @@ -0,0 +1,435 @@ +/* + * Copyright 2007-2009 Jiemamy Project and the Others. + * + * 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 java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.io.UnsupportedEncodingException; +import java.net.URL; +import java.util.Properties; + +import org.jiemamy.exception.JiemamyError; + +/** + * リソース用のユーティリティクラス。 + * + * @author j5ik2o + * + */ +public class ResourceUtil { + + /** + * パスを変換する。 + * + * @param path パス + * @param clazz クラス + * @return 変換された結果 + */ + public static String convertPath(String path, Class<?> clazz) { + if (isExist(path)) { + return path; + } + String prefix = clazz.getName().replace('.', '/').replaceFirst("/[^/]+$", ""); + String extendedPath = prefix + "/" + path; + if (ResourceUtil.getResourceNoException(extendedPath) != null) { + return extendedPath; + } + return path; + } + + /** + * クラスファイルが置かれているルートディレクトリを取得する。 + * + * @param clazz クラス + * @return ルートディレクトリ + * @throws ResourceNotFoundException リソースが見つからなかった場合 + * @throws IOException 入出力が失敗した場合 + * @see #getBuildDir(String) + */ + public static File getBuildDir(Class<?> clazz) throws ResourceNotFoundException, IOException { + return getBuildDir(getResourcePath(clazz)); + } + + /** + * クラスファイルが置かれているルートディレクトリを取得する。 + * + * @param path パス + * @return ルートディレクトリ + * @throws ResourceNotFoundException リソースが見つからなかった場合 + * @throws IOException 入出力が失敗した場合 + */ + public static File getBuildDir(String path) throws ResourceNotFoundException, IOException { + File dir = null; + URL url = getResource(path); + if ("file".equals(url.getProtocol())) { + int num = path.split("/").length; + dir = new File(getFileName(url)); + for (int i = 0; i < num; ++i, dir = dir.getParentFile()) { + // nop + } + } else { + dir = new File(JarFileUtil.toJarFilePath(url)); + } + return dir; + } + + /** + * クラスローダを取得する。 + * + * @return クラスローダ + */ + public static ClassLoader getClassLoader() { + return Thread.currentThread().getContextClassLoader(); + } + + /** + * 拡張子を取得する。 + * + * @param path パス + * @return 拡張子 + */ + public static String getExtension(String path) { + int extPos = path.lastIndexOf("."); + if (extPos >= 0) { + return path.substring(extPos + 1); + } + return null; + } + + /** + * ファイルを取得する。 + * + * @param url URL + * @return ファイル + * @throws UnsupportedEncodingException 文字のエンコーディングがサポートされていない場合 + */ + public static File getFile(URL url) throws UnsupportedEncodingException { + File file = new File(getFileName(url)); + if (file.exists()) { + return file; + } + return null; + } + + /** + * ファイル名を取得する。 + * + * @param url URL + * @return ファイル名 + * @throws UnsupportedEncodingException 文字のエンコーディングがサポートされていない場合 + */ + public static String getFileName(URL url) throws UnsupportedEncodingException { + String s = url.getFile(); + return URLUtil.decode(s, "UTF8"); + } + + /** + * プロパティファイルを取得する。 + * + * @param path パス + * @return プロパティファイル + * @throws IOException 入出力が失敗した場合 + * @throws ResourceNotFoundException リソースが見つからなかった場合 + */ + public static Properties getProperties(String path) throws ResourceNotFoundException, IOException { + Properties props = new Properties(); + InputStream is = getResourceAsStream(path); + + props.load(is); + return props; + + } + + /** + * リソースを取得する。 + * + * @param path パス + * @return リソース + * @throws ResourceNotFoundException リソースが見つからなかった場合 + * @see #getResource(String, String) + */ + public static URL getResource(String path) throws ResourceNotFoundException { + return getResource(path, null); + } + + /** + * リソースを取得する。 + * + * @param path パス + * @param extension 拡張子 + * @return リソース + * @throws ResourceNotFoundException リソースが見つからなかった場合 + */ + public static URL getResource(String path, String extension) throws ResourceNotFoundException { + URL url = getResourceNoException(path, extension); + if (url != null) { + return url; + } + throw new ResourceNotFoundException(getResourcePath(path, extension)); + } + + /** + * リソースをファイルで取得する。 + * + * @param path パス + * @return ファイル + * @throws ResourceNotFoundException リソースが見つからなかった場合 + * @throws UnsupportedEncodingException 文字のエンコーディングがサポートされていない場合 + * @see #getResourceAsFile(String, String) + */ + public static File getResourceAsFile(String path) throws ResourceNotFoundException, UnsupportedEncodingException { + return getResourceAsFile(path, null); + } + + /** + * リソースをファイルで取得する。 + * + * @param path パス + * @param extension 拡張子 + * @return ファイル + * @throws ResourceNotFoundException リソースが見つからなかった場合 + * @throws UnsupportedEncodingException 文字のエンコーディングがサポートされていない場合 + * @see #getFile(URL) + */ + public static File getResourceAsFile(String path, String extension) throws ResourceNotFoundException, + UnsupportedEncodingException { + return getFile(getResource(path, extension)); + } + + /** + * リソースをファイルで取得する。 + * <p> + * リソースが見つからない場合は<code>null</code>。 + * </p> + * + * @param clazz クラス + * @return ファイル + * @see #getResourceAsFileNoException(String) + */ + public static File getResourceAsFileNoException(Class<?> clazz) { + return getResourceAsFileNoException(getResourcePath(clazz)); + } + + /** + * リソースをファイルで取得する。 + * <p> + * リソースが見つからない場合は<code>null</code>。 + * </p> + * + * @param path パス + * @return ファイル + * @see #getResourceNoException(String) + */ + public static File getResourceAsFileNoException(String path) { + URL url = getResourceNoException(path); + if (url == null) { + return null; + } + try { + return getFile(url); + } catch (UnsupportedEncodingException e) { + return null; + } + } + + /** + * リソースをストリームで取得する。 + * + * @param path パス + * @return ストリーム + * @throws ResourceNotFoundException リソースが見つからなかった場合 + * @throws IOException 入出力が失敗した場合 + * @see #getResourceAsStream(String, String) + */ + public static InputStream getResourceAsStream(String path) throws ResourceNotFoundException, IOException { + return getResourceAsStream(path, null); + } + + /** + * リソースをストリームで取得する。 + * + * @param path パス + * @param extension 拡張子 + * @return ストリーム + * @throws ResourceNotFoundException リソースが見つからなかった場合 + * @throws IOException 入出力が失敗した場合 + * @see #getResource(String, String) + */ + public static InputStream getResourceAsStream(String path, String extension) throws ResourceNotFoundException, + IOException { + URL url = getResource(path, extension); + return URLUtil.openStream(url); + } + + /** + * リソースをストリームで取得する。 + * <p> + * リソースが見つからなかった場合は<code>null</code>。 + * </p> + * + * @param path パス + * @return ストリーム + * @see #getResourceAsStreamNoException(String, String) + */ + public static InputStream getResourceAsStreamNoException(String path) { + return getResourceAsStreamNoException(path, null); + } + + /** + * リソースをストリームとして取得する。 + * <p> + * リソースが見つからなかった場合は<code>null</code>。 + * </p> + * + * @param path パス + * @param extension 拡張子 + * @return ストリーム + * @see #getResourceNoException(String, String) + */ + public static InputStream getResourceAsStreamNoException(String path, String extension) { + URL url = getResourceNoException(path, extension); + if (url == null) { + return null; + } + try { + return url.openStream(); + } catch (final IOException e) { + return null; + } + } + + /** + * リソースを取得する。 + * <p> + * 見つからなかった場合は<code>null</code>を返します。 + * </p> + * + * @param path パス + * @return リソース + * @see #getResourceNoException(String, String) + */ + public static URL getResourceNoException(String path) { + return getResourceNoException(path, null); + } + + /** + * リソースを取得する。 + * <p> + * 見つからなかった場合は<code>null</code>。 + * </p> + * + * @param path パス + * @param extension 拡張子 + * @return リソース + * @see #getResourceNoException(String, String, ClassLoader) + */ + public static URL getResourceNoException(String path, String extension) { + return getResourceNoException(path, extension, Thread.currentThread().getContextClassLoader()); + } + + /** + * リソースを取得する。 + * <p> + * 見つからなかった場合は<code>null</code>。 + * </p> + * + * @param path パス + * @param extension 拡張子 + * @param loader クラスローダ + * @return リソース + * @see #getResourcePath(String, String) + */ + public static URL getResourceNoException(String path, String extension, ClassLoader loader) { + if (path == null || loader == null) { + return null; + } + path = getResourcePath(path, extension); + return loader.getResource(path); + } + + /** + * リソースパスを取得する。 + * + * @param clazz クラス + * @return リソースパス + */ + public static String getResourcePath(Class<?> clazz) { + return clazz.getName().replace('.', '/') + ".class"; + } + + /** + * リソースパスを取得する。 + * + * @param path パス + * @param extension 拡張子 + * @return リソースパス + */ + public static String getResourcePath(String path, String extension) { + if (extension == null) { + return path; + } + extension = "." + extension; + if (path.endsWith(extension)) { + return path; + } + return path.replace('.', '/') + extension; + } + + /** + * リソースの存在有無を取得する。 + * + * @param path パス + * @return リソースが存在するかどうか + * @see #getResourceNoException(String) + */ + public static boolean isExist(String path) { + return getResourceNoException(path) != null; + } + + /** + * 拡張子を除去する。 + * + * @param path パス + * @return 取り除いた後の結果 + */ + public static String removeExtension(String path) { + int extPos = path.lastIndexOf("."); + if (extPos >= 0) { + return path.substring(0, extPos); + } + return path; + } + + /** + * 外部形式に変換する。 + * + * @param url URL + * @return 外部形式 + * @throws UnsupportedEncodingException 文字のエンコーディングがサポートされていない場合 + */ + public static String toExternalForm(URL url) throws UnsupportedEncodingException { + String s = url.toExternalForm(); + return URLUtil.decode(s, "UTF8"); + } + + private ResourceUtil() { + throw new JiemamyError("不到達ポイント"); + } + +} Added: leto/jiemamy-commons/trunk/src/main/java/org/jiemamy/utils/ResourcesUtil.java =================================================================== --- leto/jiemamy-commons/trunk/src/main/java/org/jiemamy/utils/ResourcesUtil.java (rev 0) +++ leto/jiemamy-commons/trunk/src/main/java/org/jiemamy/utils/ResourcesUtil.java 2009-04-07 05:52:48 UTC (rev 3151) @@ -0,0 +1,436 @@ +/* + * Copyright 2007-2009 Jiemamy Project and the Others. + * + * 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 java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.io.UnsupportedEncodingException; +import java.net.URL; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.jar.JarFile; + +import org.apache.commons.lang.StringUtils; + +import org.jiemamy.exception.JiemamyError; +import org.jiemamy.utils.ClassTraversal.ClassHandler; +import org.jiemamy.utils.ResourceTraversal.ResourceHandler; + +/** + * ファイルシステム上やJarファイル中に展開されているリソースの集まりを扱うユーティリティクラス。 + * + * @author j5ik2o + */ +public final class ResourcesUtil { + + /** + * ファイルシステム上のリソースの集まりを扱うオブジェクト。 + * + * @author j5ik2o + */ + public static class FileSystemResources implements Resources { + + /** ベースディレクトリです。 */ + protected final File baseDir; + + /** ルートパッケージです。 */ + protected final String rootPackage; + + /** ルートディレクトリです。 */ + protected final String rootDir; + + + /** + * インスタンスを構築します。 + * + * @param baseDir ベースディレクトリ + * @param rootPackage ルートパッケージ + * @param rootDir ルートディレクトリ + */ + public FileSystemResources(final File baseDir, final String rootPackage, final String rootDir) { + this.baseDir = baseDir; + this.rootPackage = rootPackage; + this.rootDir = rootDir; + } + + /** + * インスタンスを生成する。 + * + * @param url ディレクトリを表すURL + * @param rootPackage ルートパッケージ + * @param rootDir ルートディレクトリ + * @throws UnsupportedEncodingException 文字のエンコーディングがサポートされてない場合 + */ + public FileSystemResources(final URL url, final String rootPackage, final String rootDir) + throws UnsupportedEncodingException { + this(URLUtil.toFile(url), rootPackage, rootDir); + } + + public void close() { + // nothing to do + } + + public void forEach(final ClassHandler handler) throws TraversalHandlerException { + ClassTraversal.forEach(baseDir, rootPackage, handler); + } + + public void forEach(final ResourceHandler handler) throws IOException, TraversalHandlerException { + ResourceTraversal.forEach(baseDir, rootDir, handler); + } + + public boolean isExistClass(final String className) { + final File file = new File(baseDir, toClassFile(ClassUtil.concatName(rootPackage, className))); + return file.exists(); + } + + } + + /** + * Jarファイル中のリソースの集まりを扱うオブジェクト。 + * + * @author j5ik2o + */ + public static class JarFileResources implements Resources { + + /** Jarファイルです。 */ + protected final JarFile jarFile; + + /** ルートパッケージです。 */ + protected final String rootPackage; + + /** ルートディレクトリです。 */ + protected final String rootDir; + + + /** + * インスタンスを生成する。 + * + * @param jarFile Jarファイル + * @param rootPackage ルートパッケージ + * @param rootDir ルートディレクトリ + */ + public JarFileResources(final JarFile jarFile, final String rootPackage, final String rootDir) { + this.jarFile = jarFile; + this.rootPackage = rootPackage; + this.rootDir = rootDir; + } + + /** + * インスタンスを生成する。 + * + * @param url Jarファイルを表すURL + * @param rootPackage ルートパッケージ + * @param rootDir ルートディレクトリ + * @throws IOException 入出力エラーが発生した場合 + */ + public JarFileResources(final URL url, final String rootPackage, final String rootDir) throws IOException { + this(JarFileUtil.toJarFile(url), rootPackage, rootDir); + } + + public void close() throws IOException { + JarFileUtil.close(jarFile); + } + + public void forEach(final ClassHandler handler) throws TraversalHandlerException { + ClassTraversal.forEach(jarFile, new ClassHandler() { + + public void processClass(String packageName, String shortClassName) throws TraversalHandlerException { + if (rootPackage == null || (packageName != null && packageName.startsWith(rootPackage))) { + handler.processClass(packageName, shortClassName); + } + } + }); + } + + public void forEach(final ResourceHandler handler) throws IOException, TraversalHandlerException { + ResourceTraversal.forEach(jarFile, new ResourceHandler() { + + public void processResource(String path, InputStream is) throws TraversalHandlerException { + if (rootDir == null || path.startsWith(rootDir)) { + handler.processResource(path, is); + } + } + }); + } + + public boolean isExistClass(final String className) { + return jarFile.getEntry(toClassFile(ClassUtil.concatName(rootPackage, className))) != null; + } + + } + + /** + * リソースの集まりを表すオブジェクト。 + * + * @author j5ik2o + */ + public interface Resources { + + /** + * リソースの後処理を行う。 + * @throws IOException 入出力が失敗した場合 + */ + void close() throws IOException; + + /** + * このインスタンスが扱うリソースの中に存在するクラスを探して + * {@link ClassHandler#processClass(String, String) ハンドラ}をコールバックする。 + * <p> + * インスタンス構築時にルートパッケージが指定されている場合は、 ルートパッケージ以下のクラスのみが対象となる。 + * </p> + * + * @param handler ハンドラ + * @throws TraversalHandlerException ハンドラの処理が失敗した場合 + */ + void forEach(ClassHandler handler) throws TraversalHandlerException; + + /** + * このインスタンスが扱うリソースを探して + * {@link ResourceHandler#processResource(String, java.io.InputStream) + * ハンドラ}をコールバックする。 + * <p> + * インスタンス構築時にルートディレクトリが指定されている場合は、 ルートディレクトリ以下のリソースのみが対象となる。 + * </p> + * + * @param handler ハンドラ + * @throws IOException 入出力が失敗した場合 + * @throws TraversalHandlerException ハンドラの処理が失敗した場合 + */ + void forEach(ResourceHandler handler) throws IOException, TraversalHandlerException; + + /** + * 指定されたクラス名に対応するクラスファイルがこのインスタンスが扱うリソースの中に存在すれば<code>true</code>を取得する。 + * <p> + * インスタンス構築時にルートパッケージが指定されている場合、 指定されたクラス名はルートパッケージからの相対名として解釈する。 + * </p> + * + * @param className クラス名 + * @return 指定されたクラス名に対応するクラスファイルがこのインスタンスが扱うリソースの中に存在すれば + * <code>true</code> + */ + boolean isExistClass(final String className); + + } + + /** + * {@link Resources}のインスタンスを作成するファクトリ。 + * + * @author j5ik2o + */ + public interface ResourcesFactory { + + /** + * {@link Resources}のインスタンスを作成して返します。 + * + * @param url リソースを表すURL + * @param rootPackage ルートパッケージ + * @param rootDir ルートディレクトリ + * @return URLで表されたリソースを扱う{@link Resources} + * @throws IOException 入出力エラーが発生した場合 + */ + Resources create(URL url, String rootPackage, String rootDir) throws IOException; + } + + + /** 空の{@link Resources}の配列。 */ + private static final Resources[] EMPTY_ARRAY = new Resources[0]; + + /** URLのプロトコルをキー、{@link ResourcesFactory}を値とするマッピング。 */ + private static final Map<String, ResourcesFactory> RESOUCES_TYPE_FACTORIES = + new HashMap<String, ResourcesFactory>(); + + //private static final Logger logger = Logger.getLogger(ResourcesUtil.class); + + static { + addResourcesFactory("file", new ResourcesFactory() { + + public Resources create(final URL url, final String rootPackage, final String rootDir) { + try { + return new FileSystemResources(getBaseDir(url, rootDir), rootPackage, rootDir); + } catch (UnsupportedEncodingException e) { + return null; + } + } + }); + addResourcesFactory("jar", new ResourcesFactory() { + + public Resources create(final URL url, final String rootPackage, final String rootDir) throws IOException { + return new JarFileResources(url, rootPackage, rootDir); + } + }); + addResourcesFactory("zip", new ResourcesFactory() { + + public Resources create(final URL url, final String rootPackage, final String rootDir) throws IOException { + return new JarFileResources(JarFileUtil.create(new File(ZipFileUtil.toZipFilePath(url))), rootPackage, + rootDir); + } + }); + addResourcesFactory("code-source", new ResourcesFactory() { + + public Resources create(final URL url, final String rootPackage, final String rootDir) throws IOException { + return new JarFileResources(URLUtil.create("jar:file:" + url.getPath()), rootPackage, rootDir); + } + }); + } + + + /** + * {@link ResourcesFactory}を追加する。 + * + * @param protocol URLのプロトコル + * @param factory プロトコルに対応する{@link Resources}のファクトリ + */ + public static void addResourcesFactory(final String protocol, ResourcesFactory factory) { + RESOUCES_TYPE_FACTORIES.put(protocol, factory); + } + + /** + * ファイルを表すURLからルートパッケージの上位となるベースディレクトリを取得する。 + * + * @param url ファイルを表すURL + * @param baseName ベース名 + * @return ルートパッケージの上位となるベースディレクトリ + * @throws UnsupportedEncodingException 文字のエンコーディングがサポートされてない場合 + */ + protected static File getBaseDir(final URL url, final String baseName) throws UnsupportedEncodingException { + File file = URLUtil.toFile(url); + final String[] paths = StringUtils.split(baseName, "/"); + for (int i = 0; i < paths.length; ++i) { + file = file.getParentFile(); + } + return file; + } + + /** + * 指定のクラスを基点とするリソースの集まりを扱う{@link Resources}を取得する。 + * <p> + * このメソッドが返す{@link Resources}は、指定されたクラスをFQNで参照可能なパスをルートとします。 例えば指定されたクラスが + * <code>foo.Bar</code>で、そのクラスファイルが<code>classes/foo/Bar.class</code>の場合、 + * このメソッドが返す{@link Resources}は<code>classes</code>ディレクトリ以下のリソースの集合を扱う。 + * </p> + * + * @param referenceClass 基点となるクラス + * @return 指定のクラスを基点とするリソースの集まりを扱う{@link Resources} + * @throws IOException 入出力エラーが発生した場合 + * @throws ResourceNotFoundException リソースが見つからなかった場合 + */ + public static Resources getResourcesType(final Class<?> referenceClass) throws IOException, + ResourceNotFoundException { + final URL url = ResourceUtil.getResource(toClassFile(referenceClass.getName())); + final String[] path = referenceClass.getName().split("\\."); + String baseUrl = url.toExternalForm(); + for (int i = 0; i < path.length; ++i) { + int pos = baseUrl.lastIndexOf('/'); + baseUrl = baseUrl.substring(0, pos); + } + return getResourcesType(URLUtil.create(baseUrl + '/'), null, null); + } + + /** + * 指定のディレクトリを基点とするリソースの集まりを扱う{@link Resources}を取得する。 + * + * @param rootDir ルートディレクトリ + * @return 指定のディレクトリを基点とするリソースの集まりを扱う{@link Resources} + * @throws IOException 入出力エラーが発生した場合 + * @throws ResourceNotFoundException リソースが見つからなかった場合 + */ + public static Resources getResourcesType(final String rootDir) throws IOException, ResourceNotFoundException { + final URL url = ResourceUtil.getResource(rootDir.endsWith("/") ? rootDir : rootDir + '/'); + return getResourcesType(url, null, rootDir); + } + + /** + * URLを扱う{@link Resources}を取得する。 + * <p> + * URLのプロトコルが未知の場合は<code>null</code>。 + * </p> + * + * @param url リソースのURL + * @param rootPackage ルートパッケージ + * @param rootDir ルートディレクトリ + * @return URLを扱う{@link Resources} + * @throws IOException 入出力エラーが発生した場合 + */ + protected static Resources getResourcesType(final URL url, final String rootPackage, final String rootDir) + throws IOException { + final ResourcesFactory factory = RESOUCES_TYPE_FACTORIES.get(URLUtil.toCanonicalProtocol(url.getProtocol())); + if (factory != null) { + return factory.create(url, rootPackage, rootDir); + } + return null; + } + + /** + * 指定のルートパッケージを基点とするリソースの集まりを扱う{@link Resources}の配列を取得する。 + * + * @param rootPackage ルートパッケージ + * @return 指定のルートパッケージを基点とするリソースの集まりを扱う{@link Resources}の配列 + * @throws IOException 入出力エラーが発生した場合 + */ + public static Resources[] getResourcesTypes(final String rootPackage) throws IOException { + if (StringUtils.isEmpty(rootPackage)) { + return EMPTY_ARRAY; + } + + final String baseName = toDirectoryName(rootPackage); + final List<Resources> list = new ArrayList<Resources>(); + for (final Iterator<URL> it = ClassLoaderUtil.getResources(baseName); it.hasNext();) { + final URL url = it.next(); + final Resources resourcesType = getResourcesType(url, rootPackage, baseName); + if (resourcesType != null) { + list.add(resourcesType); + } + } + if (list.isEmpty()) { + return EMPTY_ARRAY; + } + return list.toArray(new Resources[list.size()]); + } + + /** + * クラス名をクラスファイルのパス名に変換する。 + * + * @param className クラス名 + * @return クラスファイルのパス名 + */ + protected static String toClassFile(final String className) { + return className.replace('.', '/') + ".class"; + } + + /** + * パッケージ名をディレクトリ名に変換する。 + * + * @param packageName パッケージ名 + * @return ディレクトリ名 + */ + protected static String toDirectoryName(final String packageName) { + if (StringUtils.isEmpty(packageName)) { + return null; + } + return packageName.replace('.', '/') + '/'; + } + + private ResourcesUtil() { + throw new JiemamyError("不到達ポイント"); + } + +} Added: leto/jiemamy-commons/trunk/src/main/java/org/jiemamy/utils/TraversalHandlerException.java =================================================================== --- leto/jiemamy-commons/trunk/src/main/java/org/jiemamy/utils/TraversalHandlerException.java (rev 0) +++ leto/jiemamy-commons/trunk/src/main/java/org/jiemamy/utils/TraversalHandlerException.java 2009-04-07 05:52:48 UTC (rev 3151) @@ -0,0 +1,65 @@ +/* + * Copyright 2007-2009 Jiemamy Project and the Others. + * Created on Apr 4, 2009 + * + * 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; + +/** + * ハンドラの処理が失敗した場合の例外クラス。 + * + * @author j5ik2o + */ + @ SuppressWarnings("serial") +public class TraversalHandlerException extends Exception { + + /** + * インスタンスを生成する。 + * + */ + public TraversalHandlerException() { + super(); + } + + /** + * インスタンスを生成する。 + * + * @param message メッセージ + */ + public TraversalHandlerException(String message) { + super(message); + } + + /** + * インスタンスを生成する。 + * + * @param message メッセージ + * @param cause 原因 + */ + public TraversalHandlerException(String message, Throwable cause) { + super(message, cause); + } + + /** + * インスタンスを生成する。 + * + * @param cause 原因 + */ + public TraversalHandlerException(Throwable cause) { + super(cause); + } + +} Added: leto/jiemamy-commons/trunk/src/main/java/org/jiemamy/utils/URLUtil.java =================================================================== --- leto/jiemamy-commons/trunk/src/main/java/org/jiemamy/utils/URLUtil.java (rev 0) +++ leto/jiemamy-commons/trunk/src/main/java/org/jiemamy/utils/URLUtil.java 2009-04-07 05:52:48 UTC (rev 3151) @@ -0,0 +1,159 @@ +/* + * Copyright 2007-2009 Jiemamy Project and the Others. + * + * 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 java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.io.UnsupportedEncodingException; +import java.net.MalformedURLException; +import java.net.URL; +import java.net.URLConnection; +import java.net.URLDecoder; +import java.net.URLEncoder; +import java.util.HashMap; +import java.util.Map; + +import org.jiemamy.exception.JiemamyError; + +/** + * {@link URL}を扱うユーティリティ・クラス。 + * + * @author j5ik2o + */ +public class URLUtil { + + /** プロトコルを正規化するためのマップ */ + protected static final Map<String, String> CANONICAL_PROTOCOLS = new HashMap<String, String>(); + static { + CANONICAL_PROTOCOLS.put("wsjar", "jar"); // WebSphereがJarファイルのために使用する固有のプロトコル + } + + + /** + * <code>String</code>表現から<code>URL</code>オブジェクトを作成します。 + * + * @param spec <code>URL</code>として構文解析される<code>String</code> + * @return <code>URL</code> + * @throws MalformedURLException 無効なURLが発生した場合 + */ + public static URL create(String spec) throws MalformedURLException { + return new URL(spec); + } + + /** + * 指定されたコンテキスト内の指定された仕様で構文解析することによって、<code>URL</code>を生成する。 + * + * @param context 仕様を構文解析するコンテキスト + * @param spec <code>URL</code>として構文解析される<code>String</code> + * @return <code>URL</code> + * @throws MalformedURLException 文字列に指定されたプロトコルが未知である場合 + */ + public static URL create(URL context, String spec) throws MalformedURLException { + return new URL(context, spec); + } + + /** + * 特別な符号化方式を使用して<code>application/x-www-form-urlencoded</code>文字列をデコードする。 + * + * @param s デコード対象の<code>String</code> + * @param enc サポートされる文字エンコーディングの名前 + * @return 新しくデコードされた String + * @throws UnsupportedEncodingException 文字のエンコーディングがサポートされていない場合 + */ + public static String decode(final String s, final String enc) throws UnsupportedEncodingException { + return URLDecoder.decode(s, enc); + } + + /** + * <a href="http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4167874">このバグ</a>に対する対応です。 + * + */ +// public static void disableURLCaches() { +// BeanDesc bd = BeanDescFactory.getBeanDesc(URLConnection.class); +// FieldUtil.set(bd.getField("defaultUseCaches"), null, Boolean.FALSE); +// } + /** + * 特定の符号化方式を使用して文字列を<code>application/x-www-form-urlencoded</code>形式に変換する。 + * + * @param s 変換対象の String + * @param enc サポートされる文字エンコーディングの名前 + * @return 変換後の<code>String</code> + * @throws UnsupportedEncodingException 文字のエンコーディングがサポートされてない場合 + */ + public static String encode(final String s, final String enc) throws UnsupportedEncodingException { + return URLEncoder.encode(s, enc); + } + + /** + * URLが参照するリモートオブジェクトへの接続を表す{@link URLConnection}オブジェクトを取得する。 + * + * @param url URL + * @return URLへの{@link URLConnection}オブジェクト + * @throws IOException 入出力が失敗した場合 + */ + public static URLConnection openConnection(URL url) throws IOException { + URLConnection connection = url.openConnection(); + connection.setUseCaches(false); + return connection; + } + + /** + * URLをオープンして{@link InputStream}を取得する。 + * + * @param url URL + * @return URLが表すリソースを読み込むための{@link InputStream} + * @throws IOException 入出力が失敗した場合 + */ + public static InputStream openStream(URL url) throws IOException { + URLConnection connection = url.openConnection(); + connection.setUseCaches(false); + return connection.getInputStream(); + } + + /** + * 正規化されたプロトコルを取得する。 + * + * @param protocol プロトコル + * @return 正規化されたプロトコル + */ + public static String toCanonicalProtocol(final String protocol) { + final String canonicalProtocol = CANONICAL_PROTOCOLS.get(protocol); + if (canonicalProtocol != null) { + return canonicalProtocol; + } + return protocol; + } + + /** + * URLが示すJarファイルの{@link File}オブジェクトを取得する。 + * + * @param fileUrl JarファイルのURL + * @return Jarファイルの{@link File} + * @throws UnsupportedEncodingException 文字のエンコーディングがサポートされてない場合 + */ + public static File toFile(final URL fileUrl) throws UnsupportedEncodingException { + final String path = URLDecoder.decode(fileUrl.getPath(), "UTF-8"); + return new File(path).getAbsoluteFile(); + } + + private URLUtil() { + throw new JiemamyError("不到達ポイント"); + } + +} Added: leto/jiemamy-commons/trunk/src/main/java/org/jiemamy/utils/ZipFileUtil.java =================================================================== --- leto/jiemamy-commons/trunk/src/main/java/org/jiemamy/utils/ZipFileUtil.java (rev 0) +++ leto/jiemamy-commons/trunk/src/main/java/org/jiemamy/utils/ZipFileUtil.java 2009-04-07 05:52:48 UTC (rev 3151) @@ -0,0 +1,111 @@ +/* + * Copyright 2007-2009 Jiemamy Project and the Others. + * + * 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 java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.net.URL; +import java.util.zip.ZipEntry; +import java.util.zip.ZipFile; + +import org.jiemamy.exception.JiemamyError; + +/** + * {@link java.util.zip.ZipFile}を扱うユーティリティクラス。 + * + * @author j5ik2o + */ +public class ZipFileUtil { + + /** + * Zipファイルをクローズする。 + * + * @param zipFile Zipファイル + * @throws IOException 入出力が失敗した場合 + */ + public static void close(final ZipFile zipFile) throws IOException { + zipFile.close(); + + } + + /** + * 指定されたZipファイルを読み取るための<code>ZipFile</code>を取得する。 + * + * @param file ファイル + * @return 指定されたZipファイルを読み取るための<code>ZipFile</code> + * @throws IOException 入出力が失敗した場合 + */ + public static ZipFile create(final File file) throws IOException { + return new ZipFile(file); + } + + /** + * 指定されたZipファイルを読み取るための<code>ZipFile</code>を取得する。 + * + * @param file ファイルパス + * @return 指定されたZipファイルを読み取るための<code>ZipFile</code> + * @throws IOException 入出力が失敗した場合 + */ + public static ZipFile create(final String file) throws IOException { + return new ZipFile(file); + } + + /** + * 指定されたZipファイルエントリの内容を読み込むための入力ストリームを取得する。 + * + * @param file Zipファイル + * @param entry Zipファイルエントリ + * @return 指定されたZipファイルエントリの内容を読み込むための入力ストリーム + * @throws IOException 入出力が失敗した場合 + */ + public static InputStream getInputStream(final ZipFile file, final ZipEntry entry) throws IOException { + return file.getInputStream(entry); + } + + /** + * URLで指定されたZipファイルを読み取るための<code>ZipFile</code>を取得する。 + * + * @param zipUrl Zipファイルを示すURL + * @return 指定されたZipファイルを読み取るための<code>ZipFile</code> + * @throws IOException 入出力が失敗した場合 + */ + public static ZipFile toZipFile(final URL zipUrl) throws IOException { + return create(new File(toZipFilePath(zipUrl))); + } + + /** + * URLで指定されたZipファイルのパスを取得する。 + * + * @param zipUrl Zipファイルを示すURL + * @return URLで指定されたZipファイルのパス + * @throws IOException 入出力が失敗した場合 + */ + public static String toZipFilePath(final URL zipUrl) throws IOException { + final String urlString = zipUrl.getPath(); + final int pos = urlString.lastIndexOf('!'); + final String zipFilePath = urlString.substring(0, pos); + final File zipFile = new File(URLUtil.decode(zipFilePath, "UTF8")); + return FileUtil.getCanonicalPath(zipFile); + } + + private ZipFileUtil() { + throw new JiemamyError("不到達ポイント"); + } + +} Modified: zeus/trunk/jiemamy-spec-core/.project =================================================================== --- zeus/trunk/jiemamy-spec-core/.project 2009-04-07 01:02:00 UTC (rev 3150) +++ zeus/trunk/jiemamy-spec-core/.project 2009-04-07 05:52:48 UTC (rev 3151) @@ -1,52 +1,52 @@ -<?xml version="1.0" encoding="UTF-8"?> -<projectDescription> - <name>jiemamy-spec-core</name> - <comment>Jiemamyのコア機能を提供するパッケージ</comment> - <projects> - </projects> - <buildSpec> - <buildCommand> - <name>org.eclipse.jdt.core.javabuilder</name> - <arguments> - </arguments> - </buildCommand> - <buildCommand> - <name>org.devzuz.q.maven.jdt.core.mavenIncrementalBuilder</name> - <arguments> - </arguments> - </buildCommand> - <buildCommand> - <name>edu.umd.cs.findbugs.plugin.eclipse.findbugsBuilder</name> - <arguments> - </arguments> - </buildCommand> - <buildCommand> - <name>com.atlassw.tools.eclipse.checkstyle.CheckstyleBuilder</name> - <arguments> - </arguments> - </buildCommand> - </buildSpec> - <natures> - <nature>org.eclipse.jdt.core.javanature</nature> - <nature>edu.umd.cs.findbugs.plugin.eclipse.findbugsNature</nature> - <nature>com.atlassw.tools.eclipse.checkstyle.CheckstyleNature</nature> - <nature>org.devzuz.q.maven.jdt.core.mavenNature</nature> - </natures> - <linkedResources> - <link> - <name>.fbprefs</name> - <type>1</type> - <locationURI>DOCUMENTS/jiemamy-zeus/.fbprefs</locationURI> - </link> - <link> - <name>findbugs.xml</name> - <type>1</type> - <locationURI>DOCUMENTS/jiemamy-zeus/findbugs.xml</locationURI> - </link> - <link> - <name>.checkstyle</name> - <type>1</type> - <locationURI>DOCUMENTS/jiemamy-zeus/.checkstyle</locationURI> - </link> - </linkedResources> -</projectDescription> +<?xml version="1.0" encoding="UTF-8"?> +<projectDescription> + <name>jiemamy-spec-core</name> + <comment>Jiemamyのコア機能を提供するパッケージ</comment> + <projects> + </projects> + <buildSpec> + <buildCommand> + <name>org.eclipse.jdt.core.javabuilder</name> + <arguments> + </arguments> + </buildCommand> + <buildCommand> + <name>org.devzuz.q.maven.jdt.core.mavenIncrementalBuilder</name> + <arguments> + </arguments> + </buildCommand> + <buildCommand> + <name>edu.umd.cs.findbugs.plugin.eclipse.findbugsBuilder</name> + <arguments> + </arguments> + </buildCommand> + <buildCommand> + <name>com.atlassw.tools.eclipse.checkstyle.CheckstyleBuilder</name> + <arguments> + </arguments> + </buildCommand> + </buildSpec> + <natures> + <nature>org.eclipse.jdt.core.javanature</nature> + <nature>edu.umd.cs.findbugs.plugin.eclipse.findbugsNature</nature> + <nature>com.atlassw.tools.eclipse.checkstyle.CheckstyleNature</nature> + <nature>org.devzuz.q.maven.jdt.core.mavenNature</nature> + </natures> + <linkedResources> + <link> + <name>.checkstyle</name> + <type>1</type> + <locationURI>DOCUMENTS/jiemamy-zeus/.checkstyle</locationURI> + </link> + <link> + <name>.fbprefs</name> + <type>1</type> + <locationURI>DOCUMENTS/jiemamy-zeus/.fbprefs</locationURI> + </link> + <link> + <name>findbugs.xml</name> + <type>1</type> + <locationURI>DOCUMENTS/jiemamy-zeus/findbugs.xml</locationURI> + </link> + </linkedResources> +</projectDescription>