├── .gitignore ├── .gitmodules ├── .travis.yml ├── LICENSE.txt ├── README.md ├── build.gradle ├── docs ├── .gitignore ├── Makefile ├── _static │ └── .gitkeep ├── conf.py ├── gen.rst ├── index.rst ├── make.bat └── release-notes.rst ├── eclipse.gradle ├── encrypted-maven.gpg ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── licenses └── NOTICE.txt ├── publish.sh ├── settings.gradle └── src ├── main ├── java │ └── org │ │ └── seasar │ │ └── doma │ │ └── extension │ │ └── gen │ │ ├── ClassConstants.java │ │ ├── ClassDesc.java │ │ ├── ClassDescSupport.java │ │ ├── ColumnMeta.java │ │ ├── Constants.java │ │ ├── DaoDesc.java │ │ ├── DaoDescFactory.java │ │ ├── EntityDesc.java │ │ ├── EntityDescFactory.java │ │ ├── EntityListenerDesc.java │ │ ├── EntityListenerDescFactory.java │ │ ├── EntityPropertyClassNameResolver.java │ │ ├── EntityPropertyDesc.java │ │ ├── EntityPropertyDescFactory.java │ │ ├── EnumConstants.java │ │ ├── GenException.java │ │ ├── GenNullPointerException.java │ │ ├── GenerationContext.java │ │ ├── GenerationType.java │ │ ├── Generator.java │ │ ├── GlobalFactory.java │ │ ├── Logger.java │ │ ├── LoggerDelegate.java │ │ ├── MessageResource.java │ │ ├── NamingType.java │ │ ├── NullLoggerDelegate.java │ │ ├── OnDemandDateModel.java │ │ ├── ResourceTemplateLoader.java │ │ ├── ResultSetMetaReader.java │ │ ├── SimpleDataSource.java │ │ ├── SqlDesc.java │ │ ├── SqlDescFactory.java │ │ ├── SqlTestCaseDesc.java │ │ ├── SqlTestCaseDescFactory.java │ │ ├── SqlTestMethodDesc.java │ │ ├── SqlTestSuiteDesc.java │ │ ├── SqlTestSuiteDescFactory.java │ │ ├── TableMeta.java │ │ ├── TableMetaReader.java │ │ ├── dialect │ │ ├── Db2GenDialect.java │ │ ├── GenDialect.java │ │ ├── GenDialectRegistry.java │ │ ├── H2GenDialect.java │ │ ├── HsqldbGenDialect.java │ │ ├── Mssql2008GenDialect.java │ │ ├── MssqlGenDialect.java │ │ ├── MysqlGenDialect.java │ │ ├── Oracle11GenDialect.java │ │ ├── OracleGenDialect.java │ │ ├── PostgresGenDialect.java │ │ ├── StandardGenDialect.java │ │ └── package-info.java │ │ ├── internal │ │ ├── Artifact.java │ │ ├── message │ │ │ ├── AbstractMessageResourceBundle.java │ │ │ ├── GenMessageResourceBundle.java │ │ │ ├── Message.java │ │ │ └── MessageFormatter.java │ │ └── util │ │ │ ├── AssertionUtil.java │ │ │ ├── ClassUtil.java │ │ │ ├── FileUtil.java │ │ │ ├── IOUtil.java │ │ │ ├── JdbcUtil.java │ │ │ ├── Pair.java │ │ │ ├── ResourceUtil.java │ │ │ ├── StringUtil.java │ │ │ └── TableUtil.java │ │ ├── package-info.java │ │ └── task │ │ ├── AbstractTask.java │ │ ├── DaoConfig.java │ │ ├── DialectNameAttribute.java │ │ ├── EntityConfig.java │ │ ├── Gen.java │ │ ├── GenerationTypeAttribute.java │ │ ├── NamingTypeAttribute.java │ │ ├── SqlConfig.java │ │ ├── SqlTestCaseConfig.java │ │ ├── TaskLoggerDelegate.java │ │ └── package-info.java └── resources │ ├── domagentask.properties │ └── org │ └── seasar │ └── doma │ └── extension │ └── gen │ └── template │ ├── dao.ftl │ ├── entity.ftl │ ├── entityListener.ftl │ ├── lib.ftl │ ├── selectById.sql.ftl │ ├── selectByIdAndVersion.sql.ftl │ └── sqlTestCase.ftl └── test ├── java ├── example │ └── hoge │ │ ├── AbstractBean.java │ │ ├── CommonEntity.java │ │ └── ParentEntity.java └── org │ └── seasar │ └── doma │ └── extension │ └── gen │ ├── EntityPropertyClassNameResolverTest.java │ ├── GeneratorStub.java │ ├── GeneratorTest.java │ ├── dialect │ ├── MysqlGenDialectTest.java │ ├── OracleGenDialectTest.java │ └── StandardGenDialectTest.java │ ├── internal │ └── util │ │ ├── FileUtilTest.java │ │ ├── JdbcUtilTest.java │ │ ├── StringUtilTest.java │ │ └── TableUtilTest.java │ └── task │ └── GenTest.java └── resources ├── META-INF └── org │ └── seasar │ └── doma │ └── extension │ └── gen │ └── GeneratorTest │ ├── insert.txt │ ├── select-oracle.sql │ ├── select.sql │ └── update.sql └── org └── seasar └── doma └── extension └── gen ├── EntityPropertyClassNameResolverTest.properties ├── GeneratorTest_CompositeId.txt ├── GeneratorTest_DefaultConfigDao.txt ├── GeneratorTest_EntityPropertyClassNameResolver.txt ├── GeneratorTest_EntitySuperclass.txt ├── GeneratorTest_ExtendingEntityListener.txt ├── GeneratorTest_GenerationType_IDENTITY.txt ├── GeneratorTest_GenerationType_SEQUENCE.txt ├── GeneratorTest_GenerationType_TABLE.txt ├── GeneratorTest_NamingType.txt ├── GeneratorTest_OriginalStates.txt ├── GeneratorTest_SelectById.txt ├── GeneratorTest_SelectByIdAndVersion.txt ├── GeneratorTest_SelectById_date.txt ├── GeneratorTest_SelectById_entitySuperclass.txt ├── GeneratorTest_SelectById_number.txt ├── GeneratorTest_SelectById_time.txt ├── GeneratorTest_SelectById_timestamp.txt ├── GeneratorTest_SelectById_varchar.txt ├── GeneratorTest_ShowColumnName_false.txt ├── GeneratorTest_ShowTableName_false.txt ├── GeneratorTest_SimpleDao.txt ├── GeneratorTest_SimpleDao_with_prefix.txt ├── GeneratorTest_SimpleDao_with_prefix_and_suffix.txt ├── GeneratorTest_SimpleDao_with_suffix.txt ├── GeneratorTest_SimpleEntity.txt ├── GeneratorTest_SimpleEntityListener.txt ├── GeneratorTest_SimpleEntityListener_with_prefix.txt ├── GeneratorTest_SimpleEntityListener_with_prefix_and_suffix.txt ├── GeneratorTest_SimpleEntityListener_with_suffix.txt ├── GeneratorTest_SimpleEntity_with_prefix.txt ├── GeneratorTest_SimpleEntity_with_prefix_and_suffix.txt ├── GeneratorTest_SimpleEntity_with_suffix.txt ├── GeneratorTest_SimpleSqlTest.txt ├── GeneratorTest_UseEntityListener.txt └── entityPropertyClassNames.properties /.gitignore: -------------------------------------------------------------------------------- 1 | /.classpath 2 | /.gradle/ 3 | /.project 4 | /.settings/ 5 | /bin/ 6 | /build/ 7 | /target/ 8 | /.metadata 9 | /.idea/ 10 | -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/domaframework/doma-gen/054d8db0ed0d6ac6386040cbcef6ace1386aeb61/.gitmodules -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | sudo: false 2 | dist: trusty 3 | language: java 4 | jdk: oraclejdk8 5 | branches: 6 | only: 7 | - master 8 | env: 9 | global: 10 | - secure: DDh7vbCi2rdJslDMipgyz6j5Dud/vk5UAULXyf9g1XdivKNFPJOH9JO9/WRcILYVBuCtEYHs5Af2om8pMZ0A5a0CADaPOEb3JlY8XJ2IqrLsFu84pTomFQW/5674oQYGn/A59dbpuzlQ4SQWUJQehJhYbEtDkeKq68xHfiQZZC8= 11 | - secure: P/w/aOrwQNPZ0J5lzYP+u5s/WFEUJe7aA/CIy2v+s/qHd3UDFWTFmasb5tv2pRej5yJ34JKpU+cJIidNC41WDymDcYDGCGJAkOCPGKuShN4WLm4bRl3EFVKlei6d+zvxGfw0weN0SsLZyBu0CkX1toy970Y50GS13m5CWwJ9ei4= 12 | - secure: crjEogEOBsGQcypA5qkb54Lr+BCg5ch7qClWjevgsL3nUMPAKHyoYaV/LlhAtXl3FyE5c0fDWhzy7jCRp4O3g6OMpZ/FFbCzSsQ0Z5ux7/ALwVoxWYZDkTb5IiEzKDEMJwdTlz/LZAUH6c3mz4LWpCkXXKdVoSkAK4fFABcc/os= 13 | - secure: QApMz+3jiYXVr0ljxTxtS0xNponUh0ga11gs/6k2Uazo4Kbk3tPwzOThx/p1zzkZ/3RC/Q2PbKlwWrW2hf2FW6JyZdMdjZzrGjvNjjY3lMKcXChYQ5Dqu+cP2ixYx6GeYgJlMEXglaUoo0k/rJOAtwwIdc4WYPaBTbYZd+16w7g= 14 | - secure: PxrRWt1UpF9zsbzWhISvuYNnJpiaNS2yBrVd8BL5WsDT6c+JFx6tHikOr7O/3pEU6yHupfpY4O5xPbKunDpr5kuqauCiIDlIBfVDbts4ARJGHwL17QYfmZoLO4/Hr43ikjJGJuEhoToLIjknh6dk8egSILxttVnG0XWY05flnYY= 15 | - secure: BBaMHBw526ir/Q0zMSdL0UXK/lkic8bORH03dq0zzFxL1q77FNqWBewOOyM2PZ5Wcq5PQO60f9N7Lfy+TrtwsldTOYt/npGuvjGpV2DPsA+T8IlYu15VhCGRywFqrrP+vq3hJmwuoph3ywDQwzzzKJGBlDUk/tpvj/JsRTI6+3Q= 16 | after_success: 17 | - chmod +x publish.sh 18 | - "./publish.sh" 19 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | Doma-Gen [![Build Status](https://travis-ci.org/domaframework/doma-gen.svg?branch=master)](https://travis-ci.org/domaframework/doma-gen) [![Maven Central](https://maven-badges.herokuapp.com/maven-central/org.seasar.doma/doma-gen/badge.svg)](https://maven-badges.herokuapp.com/maven-central/org.seasar.doma/doma-gen) 2 | ======================================== 3 | 4 | Attension 5 | --------- 6 | 7 | **This repository has been archived.** 8 | Instead of this project, use [doma-codegen-plugin](https://github.com/domaframework/doma-codegen-plugin). 9 | 10 | About this project 11 | ------------------ 12 | Doma-Gen is a code generation tool for [Doma][doma]. 13 | 14 | Documentation 15 | ------------- 16 | 17 | http://doma-gen.readthedocs.org/ 18 | 19 | License 20 | ------- 21 | 22 | ``` 23 | Copyright 2019 domaframework.org 24 | 25 | Licensed under the Apache License, Version 2.0 (the "License"); 26 | you may not use this file except in compliance with the License. 27 | You may obtain a copy of the License at 28 | 29 | http://www.apache.org/licenses/LICENSE-2.0 30 | 31 | Unless required by applicable law or agreed to in writing, software 32 | distributed under the License is distributed on an "AS IS" BASIS, 33 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 34 | See the License for the specific language governing permissions and 35 | limitations under the License. 36 | ``` 37 | 38 | [doma]: https://github.com/domaframework/doma 39 | -------------------------------------------------------------------------------- /build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id 'com.diffplug.gradle.spotless' version '3.27.2' 3 | id 'java-library' 4 | id 'signing' 5 | id 'maven-publish' 6 | } 7 | 8 | group = 'org.seasar.doma' 9 | version = '2.28.1-SNAPSHOT' 10 | ext.dependentVersion = '2.28.0' 11 | ext.isReleaseVersion = !version.endsWith("SNAPSHOT") 12 | ext.encoding = 'UTF-8' 13 | sourceCompatibility = jdkVersion 14 | targetCompatibility = jdkVersion 15 | 16 | spotless { 17 | java { 18 | googleJavaFormat('1.7') 19 | } 20 | } 21 | 22 | compileJava { 23 | doFirst { 24 | ant.replaceregexp( 25 | match: /(private static final String VERSION = ")[^"]*(")/, 26 | replace: "\\1${version}\\2", 27 | encoding: encoding, 28 | flags: 'g') { 29 | fileset(dir: '.') { 30 | include(name: '**/Artifact.java') 31 | } 32 | } 33 | ant.replaceregexp( 34 | match: /('org.seasar.doma:doma-gen:)[^']*(')/, 35 | replace: "\\1${version}\\2", 36 | encoding: encoding, 37 | flags: 'g') { 38 | fileset(dir: 'docs') { 39 | include(name: '**/*.rst') 40 | } 41 | } 42 | } 43 | options.encoding = encoding 44 | } 45 | 46 | compileTestJava { 47 | options.encoding = encoding 48 | options.compilerArgs = ['-proc:none'] 49 | } 50 | 51 | javadoc { 52 | options.encoding = encoding 53 | options.charSet = encoding 54 | options.docEncoding = encoding 55 | exclude '**/internal/**' 56 | } 57 | 58 | jar { 59 | manifest { 60 | attributes 'Implementation-Title': 'Doma-Gen', 'Implementation-Version': archiveVersion 61 | } 62 | } 63 | 64 | repositories { 65 | mavenCentral() 66 | mavenLocal() 67 | maven {url 'https://oss.sonatype.org/content/repositories/snapshots/'} 68 | } 69 | 70 | dependencies { 71 | annotationProcessor "org.seasar.doma:doma:${dependentVersion}" 72 | implementation "org.seasar.doma:doma:${dependentVersion}" 73 | implementation 'org.freemarker:freemarker:2.3.20' 74 | implementation 'org.apache.ant:ant:1.9.3' 75 | testImplementation 'junit:junit:4.11' 76 | } 77 | 78 | publishing { 79 | publications { 80 | mavenJava(MavenPublication) { 81 | groupId = group 82 | artifactId = project.name 83 | version = version 84 | from components.java 85 | 86 | pom { 87 | name = project.name 88 | description = 'Code generator for Doma' 89 | url = projectUrl 90 | licenses { 91 | license { 92 | name = 'The Apache Software License, Version 2.0' 93 | url = 'https://www.apache.org/licenses/LICENSE-2.0.txt' 94 | } 95 | } 96 | developers { 97 | developer { 98 | id = 'nakamura-to' 99 | name = 'Toshihiro Nakamura' 100 | email = 'toshihiro.nakamura@gmail.com' 101 | } 102 | } 103 | scm { 104 | connection = "scm:git:${githubUrl}" 105 | developerConnection = "scm:git:${githubUrl}" 106 | url = projectUrl 107 | } 108 | } 109 | repositories { 110 | maven { 111 | url = isReleaseVersion ? sonatypeUrl : sonatypeSnapshotUrl 112 | credentials { 113 | username = sonatypeUsername 114 | password = sonatypePassword 115 | } 116 | } 117 | } 118 | } 119 | } 120 | } 121 | 122 | signing { 123 | sign publishing.publications.mavenJava 124 | } 125 | 126 | build.dependsOn publishToMavenLocal 127 | 128 | apply from:'eclipse.gradle' -------------------------------------------------------------------------------- /docs/.gitignore: -------------------------------------------------------------------------------- 1 | _build/ 2 | -------------------------------------------------------------------------------- /docs/Makefile: -------------------------------------------------------------------------------- 1 | # Minimal makefile for Sphinx documentation 2 | # 3 | 4 | # You can set these variables from the command line. 5 | SPHINXOPTS = 6 | SPHINXBUILD = sphinx-build 7 | SOURCEDIR = . 8 | BUILDDIR = _build 9 | 10 | # Put it first so that "make" without argument is like "make help". 11 | help: 12 | @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) 13 | 14 | .PHONY: help Makefile 15 | 16 | # Catch-all target: route all unknown targets to Sphinx using the new 17 | # "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). 18 | %: Makefile 19 | @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) -------------------------------------------------------------------------------- /docs/_static/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/domaframework/doma-gen/054d8db0ed0d6ac6386040cbcef6ace1386aeb61/docs/_static/.gitkeep -------------------------------------------------------------------------------- /docs/index.rst: -------------------------------------------------------------------------------- 1 | .. Doma-Gen documentation master file, created by 2 | sphinx-quickstart on Thu Feb 13 12:43:15 2014. 3 | You can adapt this file completely to your liking, but it should at least 4 | contain the root `toctree` directive. 5 | 6 | Welcome to Doma-Gen 2 7 | ===================== 8 | 9 | .. attention:: 10 | 11 | This project has been archived. 12 | Instead of this project, use the `Doma CodeGen Plugin `_. 13 | 14 | Doma-Gen 2 is a code generation tool for `Doma 2`_. 15 | 16 | Doma-Gen will generate: 17 | 18 | * Java source code and SQL files from database metadata 19 | * Java source code from the results of SQL executions 20 | * test cases for SQL statements from SQL files 21 | 22 | Doma-Gen is an Ant_ task, which can be used by many build tools such as Ant_ and Gradle_. 23 | 24 | Doma-Gen generates various files using FreeMarker_. 25 | You can customize all generation code by changing FreeMarker_ template files. 26 | 27 | This document consists of following sections: 28 | 29 | * `User Documentation`_ 30 | * `About Doma-Gen`_ 31 | * `Links`_ 32 | 33 | 34 | User Documentation 35 | ================== 36 | 37 | .. toctree:: 38 | :maxdepth: 2 39 | 40 | gen 41 | 42 | About Doma-Gen 43 | ============== 44 | 45 | .. toctree:: 46 | :maxdepth: 1 47 | 48 | release-notes 49 | 50 | Links 51 | ===== 52 | 53 | * `GitHub repository `_ 54 | * `JavaDoc `_ 55 | 56 | .. _Doma 2: http://doma.readthedocs.org/ 57 | .. _Ant: http://ant.apache.org/ 58 | .. _Gradle: http://www.gradle.org/ 59 | .. _FreeMarker: http://freemarker.org/ 60 | -------------------------------------------------------------------------------- /docs/make.bat: -------------------------------------------------------------------------------- 1 | @ECHO OFF 2 | 3 | pushd %~dp0 4 | 5 | REM Command file for Sphinx documentation 6 | 7 | if "%SPHINXBUILD%" == "" ( 8 | set SPHINXBUILD=sphinx-build 9 | ) 10 | set SOURCEDIR=. 11 | set BUILDDIR=_build 12 | 13 | if "%1" == "" goto help 14 | 15 | %SPHINXBUILD% >NUL 2>NUL 16 | if errorlevel 9009 ( 17 | echo. 18 | echo.The 'sphinx-build' command was not found. Make sure you have Sphinx 19 | echo.installed, then set the SPHINXBUILD environment variable to point 20 | echo.to the full path of the 'sphinx-build' executable. Alternatively you 21 | echo.may add the Sphinx directory to PATH. 22 | echo. 23 | echo.If you don't have Sphinx installed, grab it from 24 | echo.http://sphinx-doc.org/ 25 | exit /b 1 26 | ) 27 | 28 | %SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% 29 | goto end 30 | 31 | :help 32 | %SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% 33 | 34 | :end 35 | popd 36 | -------------------------------------------------------------------------------- /eclipse.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'eclipse' 2 | 3 | eclipse { 4 | classpath { 5 | file { 6 | whenMerged { classpath -> 7 | classpath.entries.removeAll { it.kind == "con" } 8 | } 9 | withXml { provider -> 10 | def node = provider.asNode() 11 | node.appendNode( 'classpathentry', [ kind: 'con', path: 'org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8']) 12 | } 13 | } 14 | } 15 | } -------------------------------------------------------------------------------- /encrypted-maven.gpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/domaframework/doma-gen/054d8db0ed0d6ac6386040cbcef6ace1386aeb61/encrypted-maven.gpg -------------------------------------------------------------------------------- /gradle.properties: -------------------------------------------------------------------------------- 1 | jdkVersion=1.8 2 | projectUrl=https://github.com/domaframework/doma-gen 3 | githubUrl=git@github.com:domaframework/doma-gen.git 4 | sonatypeUrl=https://oss.sonatype.org/service/local/staging/deploy/maven2/ 5 | sonatypeSnapshotUrl=https://oss.sonatype.org/content/repositories/snapshots/ 6 | sonatypeUsername= 7 | sonatypePassword= 8 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/domaframework/doma-gen/054d8db0ed0d6ac6386040cbcef6ace1386aeb61/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-6.2.2-bin.zip 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | -------------------------------------------------------------------------------- /gradlew.bat: -------------------------------------------------------------------------------- 1 | @if "%DEBUG%" == "" @echo off 2 | @rem ########################################################################## 3 | @rem 4 | @rem Gradle startup script for Windows 5 | @rem 6 | @rem ########################################################################## 7 | 8 | @rem Set local scope for the variables with windows NT shell 9 | if "%OS%"=="Windows_NT" setlocal 10 | 11 | set DIRNAME=%~dp0 12 | if "%DIRNAME%" == "" set DIRNAME=. 13 | set APP_BASE_NAME=%~n0 14 | set APP_HOME=%DIRNAME% 15 | 16 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 17 | set DEFAULT_JVM_OPTS="-Xmx64m" 18 | 19 | @rem Find java.exe 20 | if defined JAVA_HOME goto findJavaFromJavaHome 21 | 22 | set JAVA_EXE=java.exe 23 | %JAVA_EXE% -version >NUL 2>&1 24 | if "%ERRORLEVEL%" == "0" goto init 25 | 26 | echo. 27 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 28 | echo. 29 | echo Please set the JAVA_HOME variable in your environment to match the 30 | echo location of your Java installation. 31 | 32 | goto fail 33 | 34 | :findJavaFromJavaHome 35 | set JAVA_HOME=%JAVA_HOME:"=% 36 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe 37 | 38 | if exist "%JAVA_EXE%" goto init 39 | 40 | echo. 41 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 42 | echo. 43 | echo Please set the JAVA_HOME variable in your environment to match the 44 | echo location of your Java installation. 45 | 46 | goto fail 47 | 48 | :init 49 | @rem Get command-line arguments, handling Windows variants 50 | 51 | if not "%OS%" == "Windows_NT" goto win9xME_args 52 | 53 | :win9xME_args 54 | @rem Slurp the command line arguments. 55 | set CMD_LINE_ARGS= 56 | set _SKIP=2 57 | 58 | :win9xME_args_slurp 59 | if "x%~1" == "x" goto execute 60 | 61 | set CMD_LINE_ARGS=%* 62 | 63 | :execute 64 | @rem Setup the command line 65 | 66 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar 67 | 68 | @rem Execute Gradle 69 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% 70 | 71 | :end 72 | @rem End local scope for the variables with windows NT shell 73 | if "%ERRORLEVEL%"=="0" goto mainEnd 74 | 75 | :fail 76 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of 77 | rem the _cmd.exe /c_ return code! 78 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 79 | exit /b 1 80 | 81 | :mainEnd 82 | if "%OS%"=="Windows_NT" endlocal 83 | 84 | :omega 85 | -------------------------------------------------------------------------------- /licenses/NOTICE.txt: -------------------------------------------------------------------------------- 1 | This product includes software developed by 2 | The Apache Software Foundation (http://www.apache.org/). -------------------------------------------------------------------------------- /publish.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | if [[ $TRAVIS_PULL_REQUEST == "false" ]] && [[ $TRAVIS_BRANCH == "master" ]]; then 4 | echo $PASSPHRASE | gpg --output $SIGNING_SECRETKEYRINGFILE --batch --passphrase-fd 0 --decrypt encrypted-maven.gpg 5 | ./gradlew publish -s \ 6 | -PsonatypeUsername=$SONATYPE_USERNAME \ 7 | -PsonatypePassword=$SONATYPE_PASSWORD \ 8 | -Psigning.keyId=$SIGNING_KEYID \ 9 | -Psigning.password=$SIGNING_PASSWORD \ 10 | -Psigning.secretKeyRingFile=$SIGNING_SECRETKEYRINGFILE 11 | fi 12 | -------------------------------------------------------------------------------- /settings.gradle: -------------------------------------------------------------------------------- 1 | rootProject.name = 'doma-gen' 2 | -------------------------------------------------------------------------------- /src/main/java/org/seasar/doma/extension/gen/ClassConstants.java: -------------------------------------------------------------------------------- 1 | package org.seasar.doma.extension.gen; 2 | 3 | /** 4 | * クラスの定数です。 5 | * 6 | * @author taedium 7 | */ 8 | public enum ClassConstants { 9 | 10 | /** */ 11 | Dao("org.seasar.doma", "Dao"), 12 | /** */ 13 | Insert("org.seasar.doma", "Insert"), 14 | /** */ 15 | Update("org.seasar.doma", "Update"), 16 | /** */ 17 | Delete("org.seasar.doma", "Delete"), 18 | /** */ 19 | Select("org.seasar.doma", "Select"), 20 | /** */ 21 | Entity("org.seasar.doma", "Entity"), 22 | /** */ 23 | Table("org.seasar.doma", "Table"), 24 | /** */ 25 | Id("org.seasar.doma", "Id"), 26 | /** */ 27 | GeneratedValue("org.seasar.doma", "GeneratedValue"), 28 | /** */ 29 | GenerationType("org.seasar.doma", "GenerationType"), 30 | /** */ 31 | SequenceGenerator("org.seasar.doma", "SequenceGenerator"), 32 | /** */ 33 | TableGenerator("org.seasar.doma", "TableGenerator"), 34 | /** */ 35 | Column("org.seasar.doma", "Column"), 36 | /** */ 37 | Version("org.seasar.doma", "Version"), 38 | /** */ 39 | OriginalStates("org.seasar.doma", "OriginalStates"), 40 | /** */ 41 | NamingType("org.seasar.doma.jdbc.entity", "NamingType"), 42 | /** */ 43 | EntityListener("org.seasar.doma.jdbc.entity", "EntityListener"), 44 | /** */ 45 | PreInsertContext("org.seasar.doma.jdbc.entity", "PreInsertContext"), 46 | /** */ 47 | PreUpdateContext("org.seasar.doma.jdbc.entity", "PreUpdateContext"), 48 | /** */ 49 | PreDeleteContext("org.seasar.doma.jdbc.entity", "PreDeleteContext"), 50 | /** */ 51 | PostInsertContext("org.seasar.doma.jdbc.entity", "PostInsertContext"), 52 | /** */ 53 | PostUpdateContext("org.seasar.doma.jdbc.entity", "PostUpdateContext"), 54 | /** */ 55 | PostDeleteContext("org.seasar.doma.jdbc.entity", "PostDeleteContext"), 56 | /** */ 57 | StandardDialect("org.seasar.doma.jdbc.dialect", "StandardDialect"), 58 | /** */ 59 | HsqldbDialect("org.seasar.doma.jdbc.dialect", "HsqldbDialect"), 60 | /** */ 61 | H2Dialect("org.seasar.doma.jdbc.dialect", "H2Dialect"), 62 | /** */ 63 | MysqlDialect("org.seasar.doma.jdbc.dialect", "MysqlDialect"), 64 | /** */ 65 | PostgresDialect("org.seasar.doma.jdbc.dialect", "PostgresDialect"), 66 | /** */ 67 | Db2Dialect("org.seasar.doma.jdbc.dialect", "Db2Dialect"), 68 | /** */ 69 | Mssql2008("org.seasar.doma.jdbc.dialect", "Mssql2008Dialect"), 70 | /** */ 71 | Mssql("org.seasar.doma.jdbc.dialect", "MssqlDialect"), 72 | /** */ 73 | Oracle11Dialect("org.seasar.doma.jdbc.dialect", "Oracle11Dialect"), 74 | /** */ 75 | OracleDialect("org.seasar.doma.jdbc.dialect", "OracleDialect"), 76 | /** @since 1.7.0 */ 77 | Config("org.seasar.doma.jdbc", "Config"), 78 | /** */ 79 | bytes("", "byte[]"), 80 | ; 81 | 82 | private final String packageName; 83 | 84 | private final String simpleName; 85 | 86 | private ClassConstants(String packageName, String simpleName) { 87 | this.packageName = packageName; 88 | this.simpleName = simpleName; 89 | } 90 | 91 | /** 92 | * 完全修飾名を返します。 93 | * 94 | * @return 完全修飾名 95 | */ 96 | public String getQualifiedName() { 97 | return packageName + "." + simpleName; 98 | } 99 | 100 | /** 101 | * パッケージ名を返します。 102 | * 103 | * @return パッケージ名 104 | */ 105 | public String getPackageName() { 106 | return packageName; 107 | } 108 | 109 | /** 110 | * 単純名を返します。 111 | * 112 | * @return 単純名 113 | */ 114 | public String getSimpleName() { 115 | return simpleName; 116 | } 117 | } 118 | -------------------------------------------------------------------------------- /src/main/java/org/seasar/doma/extension/gen/ClassDesc.java: -------------------------------------------------------------------------------- 1 | package org.seasar.doma.extension.gen; 2 | 3 | import java.util.SortedSet; 4 | import java.util.TreeSet; 5 | 6 | /** 7 | * クラスの記述です。 8 | * 9 | * @author taedium 10 | */ 11 | public abstract class ClassDesc { 12 | 13 | /** インポート名のソートされたセット */ 14 | protected final SortedSet importNames = new TreeSet(); 15 | 16 | /** パッケージ名 */ 17 | protected String packageName; 18 | 19 | /** クラスの単純名 */ 20 | protected String simpleName; 21 | 22 | /** コメント */ 23 | protected String comment; 24 | 25 | /** インスタンスを構築します。 */ 26 | protected ClassDesc() {} 27 | 28 | /** 29 | * インポート名を追加します。 30 | * 31 | * @param name インポート名 32 | */ 33 | public void addImportName(String name) { 34 | importNames.add(name); 35 | } 36 | 37 | /** 38 | * インポート名のソートされたセットを返します。 39 | * 40 | * @return インポート名のソートされたセット 41 | */ 42 | public SortedSet getImportNames() { 43 | return importNames; 44 | } 45 | 46 | /** 47 | * パッケージ名を設定します。 48 | * 49 | * @param packageName パッケージ名 50 | */ 51 | public void setPackageName(String packageName) { 52 | this.packageName = packageName; 53 | } 54 | 55 | /** 56 | * パッケージ名を返します。 57 | * 58 | * @return パッケージ名 59 | */ 60 | public String getPackageName() { 61 | return packageName; 62 | } 63 | 64 | /** 65 | * クラスの単純名を設定します。 66 | * 67 | * @param simpleName クラスの単純名 68 | */ 69 | public void setSimpleName(String simpleName) { 70 | this.simpleName = simpleName; 71 | } 72 | 73 | /** 74 | * クラスの単純名を返します。 75 | * 76 | * @return クラスの単純名 77 | */ 78 | public String getSimpleName() { 79 | return simpleName; 80 | } 81 | 82 | /** 83 | * コメントを設定します。 84 | * 85 | * @param comment コメント 86 | */ 87 | public void setComment(String comment) { 88 | this.comment = comment; 89 | } 90 | 91 | /** 92 | * コメントを返します。 93 | * 94 | * @return コメント 95 | */ 96 | public String getComment() { 97 | return comment; 98 | } 99 | 100 | /** 101 | * 完全修飾名を返します。 102 | * 103 | * @return 完全修飾名 104 | */ 105 | public String getQualifiedName() { 106 | if (packageName == null || packageName.isEmpty()) { 107 | return simpleName; 108 | } 109 | return packageName + "." + simpleName; 110 | } 111 | } 112 | -------------------------------------------------------------------------------- /src/main/java/org/seasar/doma/extension/gen/ClassDescSupport.java: -------------------------------------------------------------------------------- 1 | package org.seasar.doma.extension.gen; 2 | 3 | import org.seasar.doma.extension.gen.internal.util.ClassUtil; 4 | 5 | /** 6 | * {@link ClassDesc} のサポートクラスです。 7 | * 8 | * @author taedium 9 | */ 10 | public class ClassDescSupport { 11 | 12 | /** 13 | * インポート名を追加します。 14 | * 15 | * @param classDesc クラス記述 16 | * @param importedClass インポートされるクラス 17 | */ 18 | public void addImportName(ClassDesc classDesc, Class importedClass) { 19 | String canonicalName = importedClass.getCanonicalName(); 20 | String packageName = ClassUtil.getPackageName(canonicalName); 21 | if (isImportTargetPackage(classDesc, packageName)) { 22 | classDesc.addImportName(canonicalName); 23 | } 24 | } 25 | 26 | /** 27 | * インポート名を追加します。 28 | * 29 | * @param classDesc クラス記述 30 | * @param importedClassName インポートされるクラスの名前 31 | */ 32 | public void addImportName(ClassDesc classDesc, String importedClassName) { 33 | String packageName = ClassUtil.getPackageName(importedClassName); 34 | if (isImportTargetPackage(classDesc, packageName)) { 35 | classDesc.addImportName(importedClassName); 36 | } 37 | } 38 | 39 | /** 40 | * インポート名を追加します。 41 | * 42 | * @param classDesc クラス記述 43 | * @param importedClass インポートされるクラス 44 | */ 45 | public void addImportName(ClassDesc classDesc, ClassConstants importedClass) { 46 | String packageName = importedClass.getPackageName(); 47 | if (isImportTargetPackage(classDesc, packageName)) { 48 | classDesc.addImportName(importedClass.getQualifiedName()); 49 | } 50 | } 51 | 52 | /** 53 | * インポート名を追加します。 54 | * 55 | * @param classDesc クラス記述 56 | * @param importedClass インポートされるクラス 57 | */ 58 | public void addImportName(ClassDesc classDesc, EnumConstants importedClass) { 59 | ClassConstants classConstant = importedClass.getClassConstant(); 60 | String packageName = classConstant.getPackageName(); 61 | if (isImportTargetPackage(classDesc, packageName)) { 62 | classDesc.addImportName(importedClass.getImportName()); 63 | } 64 | } 65 | 66 | /** 67 | * インポート対象のパッケージの場合 {@code true} を返します。 68 | * 69 | * @param classDesc クラス記述 70 | * @param importPackageName インポートするパッケージ名 71 | * @return インポート対象のパッケージの場合 {@code true} 72 | */ 73 | protected boolean isImportTargetPackage(ClassDesc classDesc, String importPackageName) { 74 | if (importPackageName == null) { 75 | return false; 76 | } 77 | if (importPackageName.isEmpty()) { 78 | return false; 79 | } 80 | if (importPackageName.equals(classDesc.getPackageName())) { 81 | return false; 82 | } 83 | if (importPackageName.equals("java.lang")) { 84 | return false; 85 | } 86 | return true; 87 | } 88 | } 89 | -------------------------------------------------------------------------------- /src/main/java/org/seasar/doma/extension/gen/Constants.java: -------------------------------------------------------------------------------- 1 | package org.seasar.doma.extension.gen; 2 | 3 | /** 4 | * 定数です。 5 | * 6 | * @author taedium 7 | */ 8 | public class Constants { 9 | 10 | /** */ 11 | public static final String ENTITY_LISTENER_SUFFIX = "Listener"; 12 | 13 | /** */ 14 | public static final String ENTITY_TEMPLATE = "entity.ftl"; 15 | 16 | /** */ 17 | public static final String ENTITY_LISTENER_TEMPLATE = "entityListener.ftl"; 18 | 19 | /** */ 20 | public static final String DAO_TEMPLATE = "dao.ftl"; 21 | 22 | /** */ 23 | public static final String SQL_TEST_CASE_TEMPLATE = "sqlTestCase.ftl"; 24 | 25 | /** */ 26 | public static final String TEMPLATE_EXTENSION = ".ftl"; 27 | 28 | /** @since 1.7.0 */ 29 | public static final String SQL_TEMPLATE_EXTENSION = ".sql.ftl"; 30 | 31 | /** */ 32 | public static final String SELECT_BY_ID_SQL_TEMPLATE = "selectById.sql.ftl"; 33 | 34 | /** */ 35 | public static final String SELECT_BY_ID_AND_VERSION_SQL_TEMPLATE = "selectByIdAndVersion.sql.ftl"; 36 | } 37 | -------------------------------------------------------------------------------- /src/main/java/org/seasar/doma/extension/gen/DaoDesc.java: -------------------------------------------------------------------------------- 1 | package org.seasar.doma.extension.gen; 2 | 3 | /** 4 | * Dao記述です。 5 | * 6 | * @author taedium 7 | */ 8 | public class DaoDesc extends ClassDesc { 9 | 10 | /** 設定クラスの単純名 */ 11 | protected String configClassSimpleName; 12 | 13 | /** エンティティ記述 */ 14 | protected EntityDesc entityDesc; 15 | 16 | /** テンプレート名 */ 17 | protected String templateName; 18 | 19 | /** 20 | * 設定クラスの単純名を返します。 21 | * 22 | * @return 設定クラスの単純名 23 | */ 24 | public String getConfigClassSimpleName() { 25 | return configClassSimpleName; 26 | } 27 | 28 | /** 29 | * 設定クラスの単純名を設定します。 30 | * 31 | * @param configClassSimpleName 設定クラスの単純名 32 | */ 33 | public void setConfigClassSimpleName(String configClassSimpleName) { 34 | this.configClassSimpleName = configClassSimpleName; 35 | } 36 | 37 | /** 38 | * エンティティ記述を返します。 39 | * 40 | * @return エンティティ記述 41 | */ 42 | public EntityDesc getEntityDesc() { 43 | return entityDesc; 44 | } 45 | 46 | /** 47 | * エンティティ記述を設定します。 48 | * 49 | * @param entityDesc エンティティ記述 50 | */ 51 | public void setEntityDesc(EntityDesc entityDesc) { 52 | this.entityDesc = entityDesc; 53 | } 54 | 55 | /** 56 | * テンプレート名を設定します。 57 | * 58 | * @param templateName テンプレート名 59 | */ 60 | public void setTemplateName(String templateName) { 61 | this.templateName = templateName; 62 | } 63 | 64 | /** 65 | * テンプレート名を返します。 66 | * 67 | * @return テンプレート名 68 | */ 69 | public String getTemplateName() { 70 | return templateName; 71 | } 72 | } 73 | -------------------------------------------------------------------------------- /src/main/java/org/seasar/doma/extension/gen/DaoDescFactory.java: -------------------------------------------------------------------------------- 1 | package org.seasar.doma.extension.gen; 2 | 3 | import org.seasar.doma.extension.gen.internal.util.ClassUtil; 4 | import org.seasar.doma.extension.gen.internal.util.StringUtil; 5 | 6 | /** 7 | * {@link DaoDesc} のファクトリです。 8 | * 9 | * @author taedium 10 | */ 11 | public class DaoDescFactory { 12 | 13 | /** パッケージ名 */ 14 | protected final String packageName; 15 | 16 | /** サフィックス */ 17 | protected final String suffix; 18 | 19 | /** 設定クラス名 */ 20 | protected final String configClassName; 21 | 22 | /** クラス記述のサポートクラス */ 23 | protected final ClassDescSupport classDescSupport = new ClassDescSupport(); 24 | 25 | /** 26 | * インスタンスを構築します。 27 | * 28 | * @param packageName パッケージ名 29 | * @param suffix サフィックス 30 | * @param configClassName 設定クラス名、指定しない場合 {@code null} 31 | */ 32 | public DaoDescFactory(String packageName, String suffix, String configClassName) { 33 | if (suffix == null) { 34 | throw new GenNullPointerException("suffix"); 35 | } 36 | this.packageName = packageName; 37 | this.suffix = suffix; 38 | this.configClassName = configClassName; 39 | } 40 | 41 | /** 42 | * Dao記述を作成します。 43 | * 44 | * @param entityDesc エンティティ記述 45 | * @return Dao記述 46 | */ 47 | public DaoDesc createDaoDesc(EntityDesc entityDesc) { 48 | DaoDesc daoDesc = new DaoDesc(); 49 | daoDesc.setPackageName(packageName); 50 | String entityPrefix = StringUtil.defaultString(entityDesc.getEntityPrefix(), ""); 51 | String entitySuffix = StringUtil.defaultString(entityDesc.getEntitySuffix(), ""); 52 | String simpleName = entityPrefix + entityDesc.getSimpleName() + entitySuffix + suffix; 53 | daoDesc.setSimpleName(simpleName); 54 | if (configClassName != null) { 55 | daoDesc.setConfigClassSimpleName(ClassUtil.getSimpleName(configClassName)); 56 | } 57 | daoDesc.setEntityDesc(entityDesc); 58 | daoDesc.setTemplateName(Constants.DAO_TEMPLATE); 59 | handleImportName(daoDesc, entityDesc); 60 | return daoDesc; 61 | } 62 | 63 | /** 64 | * インポート名を処理します。 65 | * 66 | * @param daoDesc Dao記述 67 | * @param entityDesc エンティティ記述 68 | */ 69 | protected void handleImportName(DaoDesc daoDesc, EntityDesc entityDesc) { 70 | classDescSupport.addImportName(daoDesc, ClassConstants.Dao); 71 | classDescSupport.addImportName(daoDesc, ClassConstants.Insert); 72 | classDescSupport.addImportName(daoDesc, ClassConstants.Update); 73 | classDescSupport.addImportName(daoDesc, ClassConstants.Delete); 74 | if (configClassName != null) { 75 | classDescSupport.addImportName(daoDesc, configClassName); 76 | } 77 | classDescSupport.addImportName(daoDesc, entityDesc.getQualifiedName()); 78 | for (EntityPropertyDesc propertyDesc : entityDesc.getIdEntityPropertyDescs()) { 79 | classDescSupport.addImportName(daoDesc, propertyDesc.getPropertyClassName()); 80 | classDescSupport.addImportName(daoDesc, ClassConstants.Select); 81 | } 82 | if (entityDesc.getIdEntityPropertyDescs().size() > 0) { 83 | classDescSupport.addImportName(daoDesc, ClassConstants.Select); 84 | for (EntityPropertyDesc propertyDesc : entityDesc.getIdEntityPropertyDescs()) { 85 | classDescSupport.addImportName(daoDesc, propertyDesc.getPropertyClassName()); 86 | } 87 | if (entityDesc.getVersionEntityPropertyDesc() != null) { 88 | classDescSupport.addImportName( 89 | daoDesc, entityDesc.getVersionEntityPropertyDesc().getPropertyClassName()); 90 | } 91 | } 92 | } 93 | } 94 | -------------------------------------------------------------------------------- /src/main/java/org/seasar/doma/extension/gen/EntityListenerDesc.java: -------------------------------------------------------------------------------- 1 | package org.seasar.doma.extension.gen; 2 | 3 | /** 4 | * エンティティリスナー記述です。 5 | * 6 | * @author taedium 7 | */ 8 | public class EntityListenerDesc extends ClassDesc { 9 | 10 | /** エンティティクラスの単純名 */ 11 | protected String entityClassSimpleName; 12 | 13 | /** スーパークラスの単純名 */ 14 | protected String superclassSimpleName; 15 | 16 | /** リスナークラスの単純名 */ 17 | protected String listenerClassSimpleName; 18 | 19 | /** エンティティ記述 */ 20 | protected EntityDesc entityDesc; 21 | 22 | /** テンプレート名 */ 23 | protected String templateName; 24 | 25 | /** 26 | * テンプレート名を設定します。 27 | * 28 | * @param templateName テンプレート名 29 | */ 30 | public void setTemplateName(String templateName) { 31 | this.templateName = templateName; 32 | } 33 | 34 | /** 35 | * テンプレート名を返します。 36 | * 37 | * @return テンプレート名 38 | */ 39 | public String getTemplateName() { 40 | return templateName; 41 | } 42 | 43 | /** 44 | * エンティティクラスの単純名を返します。 45 | * 46 | * @return エンティティクラスの単純名 47 | */ 48 | public String getEntityClassSimpleName() { 49 | return entityClassSimpleName; 50 | } 51 | 52 | /** 53 | * エンティティクラスの単純名を設定します。 54 | * 55 | * @param entityClassSimpleName エンティティクラスの単純名 56 | */ 57 | public void setEntityClassSimpleName(String entityClassSimpleName) { 58 | this.entityClassSimpleName = entityClassSimpleName; 59 | } 60 | 61 | /** 62 | * スーパークラスの単純名を返します。 63 | * 64 | * @return スーパークラスの単純名 65 | */ 66 | public String getSuperclassSimpleName() { 67 | return superclassSimpleName; 68 | } 69 | 70 | /** 71 | * スーパークラスの単純名を設定します。 72 | * 73 | * @param superclassSimpleName スーパークラスの単純名 74 | */ 75 | public void setSuperclassSimpleName(String superclassSimpleName) { 76 | this.superclassSimpleName = superclassSimpleName; 77 | } 78 | 79 | /** 80 | * リスナークラスの単純名を返します。 81 | * 82 | * @return リスナークラスの単純名 83 | */ 84 | public String getListenerClassSimpleName() { 85 | return listenerClassSimpleName; 86 | } 87 | 88 | /** 89 | * リスナークラスの単純名を設定します。 90 | * 91 | * @param listenerClassSimpleName リスナークラスの単純名 92 | */ 93 | public void setListenerClassSimpleName(String listenerClassSimpleName) { 94 | this.listenerClassSimpleName = listenerClassSimpleName; 95 | } 96 | 97 | /** 98 | * エンティティ記述を返します。 99 | * 100 | * @return エンティティ記述 101 | */ 102 | public EntityDesc getEntityDesc() { 103 | return entityDesc; 104 | } 105 | 106 | /** 107 | * エンティティ記述を設定します。 108 | * 109 | * @param entityDesc エンティティ記述 110 | */ 111 | public void setEntityDesc(EntityDesc entityDesc) { 112 | this.entityDesc = entityDesc; 113 | } 114 | } 115 | -------------------------------------------------------------------------------- /src/main/java/org/seasar/doma/extension/gen/EntityListenerDescFactory.java: -------------------------------------------------------------------------------- 1 | package org.seasar.doma.extension.gen; 2 | 3 | import org.seasar.doma.extension.gen.internal.util.ClassUtil; 4 | import org.seasar.doma.extension.gen.internal.util.StringUtil; 5 | 6 | /** 7 | * エンティティ記述のファクトリです。 8 | * 9 | * @author taedium 10 | */ 11 | public class EntityListenerDescFactory { 12 | 13 | /** パッケージ名 */ 14 | protected final String packageName; 15 | 16 | /** スーパークラス名 */ 17 | protected final String superclassName; 18 | 19 | /** クラス記述のサポートクラス */ 20 | protected final ClassDescSupport classDescSupport = new ClassDescSupport(); 21 | 22 | /** 23 | * インスタンスを構築します。 24 | * 25 | * @param packageName パッケージ名 26 | * @param superclassName スーパークラス名 27 | */ 28 | public EntityListenerDescFactory(String packageName, String superclassName) { 29 | this.packageName = packageName; 30 | this.superclassName = superclassName; 31 | } 32 | 33 | /** 34 | * エンティティ記述を作成します。 35 | * 36 | * @param entityDesc エンティティ記述 37 | * @return エンティティリスナー記述 38 | */ 39 | public EntityListenerDesc createEntityListenerDesc(EntityDesc entityDesc) { 40 | EntityListenerDesc entityListenerDesc = new EntityListenerDesc(); 41 | entityListenerDesc.setEntityDesc(entityDesc); 42 | entityListenerDesc.setPackageName(entityDesc.getPackageName()); 43 | String entityPrefix = StringUtil.defaultString(entityDesc.getEntityPrefix(), ""); 44 | String entitySuffix = StringUtil.defaultString(entityDesc.getEntitySuffix(), ""); 45 | String entityName = entityPrefix + entityDesc.getSimpleName() + entitySuffix; 46 | entityListenerDesc.setSimpleName(entityName + Constants.ENTITY_LISTENER_SUFFIX); 47 | entityListenerDesc.setEntityClassSimpleName(entityDesc.getSimpleName()); 48 | if (superclassName != null) { 49 | entityListenerDesc.setSuperclassSimpleName(ClassUtil.getSimpleName(superclassName)); 50 | } 51 | entityListenerDesc.setTemplateName(Constants.ENTITY_LISTENER_TEMPLATE); 52 | handleImportName(entityListenerDesc, entityDesc); 53 | return entityListenerDesc; 54 | } 55 | 56 | /** 57 | * /** インポート名を処理します。 58 | * 59 | * @param entityListenerDesc エンティティリスナー記述 60 | * @param entityDesc エンティティ記述 61 | */ 62 | protected void handleImportName(EntityListenerDesc entityListenerDesc, EntityDesc entityDesc) { 63 | classDescSupport.addImportName(entityListenerDesc, entityDesc.getQualifiedName()); 64 | if (superclassName == null) { 65 | classDescSupport.addImportName(entityListenerDesc, ClassConstants.EntityListener); 66 | classDescSupport.addImportName(entityListenerDesc, ClassConstants.PreInsertContext); 67 | classDescSupport.addImportName(entityListenerDesc, ClassConstants.PreUpdateContext); 68 | classDescSupport.addImportName(entityListenerDesc, ClassConstants.PreDeleteContext); 69 | classDescSupport.addImportName(entityListenerDesc, ClassConstants.PostInsertContext); 70 | classDescSupport.addImportName(entityListenerDesc, ClassConstants.PostUpdateContext); 71 | classDescSupport.addImportName(entityListenerDesc, ClassConstants.PostDeleteContext); 72 | } else { 73 | classDescSupport.addImportName(entityListenerDesc, superclassName); 74 | } 75 | } 76 | } 77 | -------------------------------------------------------------------------------- /src/main/java/org/seasar/doma/extension/gen/EntityPropertyClassNameResolver.java: -------------------------------------------------------------------------------- 1 | package org.seasar.doma.extension.gen; 2 | 3 | import java.io.BufferedReader; 4 | import java.io.File; 5 | import java.io.FileInputStream; 6 | import java.io.IOException; 7 | import java.io.InputStreamReader; 8 | import java.util.LinkedHashMap; 9 | import java.util.Map; 10 | import java.util.regex.Matcher; 11 | import java.util.regex.Pattern; 12 | import org.seasar.doma.extension.gen.internal.message.Message; 13 | import org.seasar.doma.extension.gen.internal.util.IOUtil; 14 | 15 | /** 16 | * エンティティプロパティのクラス名リゾルバです。 17 | * 18 | * @author taedium 19 | */ 20 | public class EntityPropertyClassNameResolver { 21 | 22 | /** エンティティプロパティ名の正規表現を表すパターンをキー、クラス名を値とするマップ */ 23 | protected final LinkedHashMap patternMap; 24 | 25 | /** 26 | * インスタンスを構築します。 27 | * 28 | * @param propertyFile プロパティファイル 29 | */ 30 | public EntityPropertyClassNameResolver(File propertyFile) { 31 | if (propertyFile == null) { 32 | patternMap = new LinkedHashMap(); 33 | } else { 34 | patternMap = load(propertyFile); 35 | } 36 | } 37 | 38 | /** 39 | * プロパティファイルをロードします。 40 | * 41 | * @param propertyFile プロパティファイル 42 | * @return エンティティプロパティ名の正規表現を表すパターンをキー、クラス名を値とするマップ 43 | */ 44 | protected LinkedHashMap load(File propertyFile) { 45 | LinkedHashMap result = new LinkedHashMap(); 46 | BufferedReader reader = null; 47 | try { 48 | reader = 49 | new BufferedReader(new InputStreamReader(new FileInputStream(propertyFile), "UTF-8")); 50 | String line; 51 | while ((line = reader.readLine()) != null) { 52 | if (line.length() == 0) { 53 | continue; 54 | } 55 | char firstChar = line.charAt(0); 56 | if (firstChar == '#' || firstChar == '!') { 57 | continue; 58 | } 59 | int pos = line.indexOf('='); 60 | if (pos < 0) { 61 | continue; 62 | } 63 | String key = line.substring(0, pos); 64 | String value = line.substring(pos + 1, line.length()); 65 | int pos2 = line.indexOf('@'); 66 | if (pos2 == 0) { 67 | key = key.substring(1); 68 | } else if (pos2 > 0) { 69 | key = Pattern.quote(key.substring(0, pos2)) + key.substring(pos2); 70 | } 71 | result.put(Pattern.compile(key), value); 72 | } 73 | } catch (IOException e) { 74 | throw new GenException(Message.DOMAGEN9001, e, e); 75 | } finally { 76 | IOUtil.close(reader); 77 | } 78 | return result; 79 | } 80 | 81 | /** 82 | * エンティティプロパティのクラス名を解決します。 83 | * 84 | * @param entityDesc エンティティ記述 85 | * @param propertyName エンティティプロパティ名 86 | * @param defaultPropertyClassName エンティティプロパティのデフォルトのクラス名 87 | * @return エンティティプロパティのクラス名 88 | */ 89 | public String resolve( 90 | EntityDesc entityDesc, String propertyName, String defaultPropertyClassName) { 91 | String qualifiedPropertyName = entityDesc.getQualifiedName() + "@" + propertyName; 92 | for (Map.Entry entry : patternMap.entrySet()) { 93 | Pattern pattern = entry.getKey(); 94 | String input = pattern.pattern().contains("@") ? qualifiedPropertyName : propertyName; 95 | Matcher matcher = pattern.matcher(input); 96 | if (!matcher.matches()) { 97 | continue; 98 | } 99 | matcher.reset(); 100 | StringBuffer buf = new StringBuffer(); 101 | String replacement = entry.getValue(); 102 | for (; matcher.find(); ) { 103 | matcher.appendReplacement(buf, replacement); 104 | if (matcher.hitEnd()) { 105 | break; 106 | } 107 | } 108 | matcher.appendTail(buf); 109 | return buf.toString(); 110 | } 111 | return defaultPropertyClassName; 112 | } 113 | } 114 | -------------------------------------------------------------------------------- /src/main/java/org/seasar/doma/extension/gen/EnumConstants.java: -------------------------------------------------------------------------------- 1 | package org.seasar.doma.extension.gen; 2 | 3 | /** 4 | * 列挙定数です。 5 | * 6 | * @author taedium 7 | */ 8 | public enum EnumConstants { 9 | 10 | /** */ 11 | NamingType_NONE(ClassConstants.NamingType, "NONE"), 12 | /** */ 13 | NamingType_UPPER_CASE(ClassConstants.NamingType, "UPPER_CASE"), 14 | /** */ 15 | NamingType_LOWER_CASE(ClassConstants.NamingType, "LOWER_CASE"), 16 | /** */ 17 | NamingType_SNAKE_UPPER_CASE(ClassConstants.NamingType, "SNAKE_UPPER_CASE"), 18 | /** */ 19 | NamingType_SNAKE_LOWER_CASE(ClassConstants.NamingType, "SNAKE_LOWER_CASE"), 20 | /** */ 21 | GenerationType_SEQUENCE(ClassConstants.GenerationType, "SEQUENCE"), 22 | /** */ 23 | GenerationType_TABLE(ClassConstants.GenerationType, "TABLE"), 24 | /** */ 25 | GenerationType_IDENTITY(ClassConstants.GenerationType, "IDENTITY"), 26 | ; 27 | 28 | private final ClassConstants classConstant; 29 | 30 | private final String name; 31 | 32 | private EnumConstants(ClassConstants classConstant, String name) { 33 | this.classConstant = classConstant; 34 | this.name = name; 35 | } 36 | 37 | /** 38 | * クラス定数を返します。 39 | * 40 | * @return クラス定数 41 | */ 42 | public ClassConstants getClassConstant() { 43 | return classConstant; 44 | } 45 | 46 | /** 47 | * インポート名を返します。 48 | * 49 | * @return インポート名 50 | */ 51 | public String getImportName() { 52 | return classConstant.getQualifiedName(); 53 | } 54 | 55 | /** 56 | * 参照名を返します。 57 | * 58 | * @return 参照名 59 | */ 60 | public String getReferenceName() { 61 | return classConstant.getSimpleName() + "." + name; 62 | } 63 | 64 | /** 65 | * 名前を返します。 66 | * 67 | * @return 名前 68 | */ 69 | public String getName() { 70 | return name; 71 | } 72 | } 73 | -------------------------------------------------------------------------------- /src/main/java/org/seasar/doma/extension/gen/GenException.java: -------------------------------------------------------------------------------- 1 | package org.seasar.doma.extension.gen; 2 | 3 | /** 4 | * このフレームワークでルートとなる実行時例外です。 5 | * 6 | *

このフレームワークで定義される実行時例外はすべてこのクラスのサブタイプとなります。 7 | * 8 | * @author taedium 9 | */ 10 | public class GenException extends RuntimeException { 11 | 12 | private static final long serialVersionUID = 1L; 13 | 14 | /** メッセージリソース */ 15 | protected final MessageResource messageResource; 16 | 17 | /** メッセージへの引数 */ 18 | protected final Object args; 19 | 20 | /** 21 | * インスタンスを構築します。 22 | * 23 | * @param messageResource メッセージリソース 24 | * @param args メッセージへの引数 25 | */ 26 | public GenException(MessageResource messageResource, Object... args) { 27 | this(messageResource, null, args); 28 | } 29 | 30 | /** 31 | * この例外の原因となった {@link Throwable} を指定してインスタンスを構築します。 32 | * 33 | * @param messageResource メッセージリソース 34 | * @param cause 原因 35 | * @param args メッセージへの引数 36 | */ 37 | public GenException(MessageResource messageResource, Throwable cause, Object... args) { 38 | super(messageResource.getMessage(args), cause); 39 | this.messageResource = messageResource; 40 | this.args = args; 41 | } 42 | 43 | /** 44 | * メッセージコードを返します。 45 | * 46 | * @return メッセージコード 47 | */ 48 | public MessageResource getMessageResource() { 49 | return messageResource; 50 | } 51 | 52 | /** 53 | * メッセージへの引数を返します。 54 | * 55 | * @return メッセージへの引数 56 | */ 57 | public Object getArgs() { 58 | return args; 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /src/main/java/org/seasar/doma/extension/gen/GenNullPointerException.java: -------------------------------------------------------------------------------- 1 | package org.seasar.doma.extension.gen; 2 | 3 | import org.seasar.doma.extension.gen.internal.message.Message; 4 | 5 | /** 6 | * {@code null} でないことを期待されたパラメータへの引数が {@code null} の場合にスローされる例外です。 7 | * 8 | *

{@link NullPointerException} とは別にこの例外を定義しているのは、 {@literal Doma}のバグによる例外なのか、 {@literal 9 | * Doma}のAPIの事前条件を満たしていないことによる例外なのかを判別しやすくするためです。 10 | * 11 | * @author taedium 12 | */ 13 | public class GenNullPointerException extends GenException { 14 | 15 | private static final long serialVersionUID = 1L; 16 | 17 | /** {@code null} であるパラメータの名前 */ 18 | protected final String parameterName; 19 | 20 | /** 21 | * インスタンスを構築します。 22 | * 23 | * @param parameterName {@code null} であるパラメータの名前 24 | */ 25 | public GenNullPointerException(String parameterName) { 26 | super(Message.DOMAGEN0001, parameterName); 27 | this.parameterName = parameterName; 28 | } 29 | 30 | /** 31 | * {@code null} であるパラメータの名前を返します。 32 | * 33 | * @return {@code null} であるパラメータの名前 34 | */ 35 | public String getParameterName() { 36 | return parameterName; 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/main/java/org/seasar/doma/extension/gen/GenerationContext.java: -------------------------------------------------------------------------------- 1 | package org.seasar.doma.extension.gen; 2 | 3 | import java.io.File; 4 | 5 | /** 6 | * 生成に関するコンテキストです。 7 | * 8 | * @author taedium 9 | */ 10 | public class GenerationContext { 11 | 12 | /** データモデル */ 13 | protected final Object model; 14 | 15 | /** 生成するファイル */ 16 | protected final File file; 17 | 18 | /** テンプレート名 */ 19 | protected final String templateName; 20 | 21 | /** エンコーディング */ 22 | protected final String encoding; 23 | 24 | /** 上書きする場合{@code true} */ 25 | protected final boolean overwrite; 26 | 27 | /** 28 | * インスタンスを構築します。 29 | * 30 | * @param model データモデル 31 | * @param file 生成するファイル 32 | * @param templateName テンプレート名 33 | * @param encoding 生成するファイルのエンコーディング 34 | * @param overwrite 上書きする場合{@code true}、しない場合{@code false} 35 | */ 36 | public GenerationContext( 37 | Object model, File file, String templateName, String encoding, boolean overwrite) { 38 | if (model == null) { 39 | throw new GenNullPointerException("model"); 40 | } 41 | if (file == null) { 42 | throw new GenNullPointerException("file"); 43 | } 44 | if (templateName == null) { 45 | throw new GenNullPointerException("templateName"); 46 | } 47 | if (encoding == null) { 48 | throw new GenNullPointerException("fileEncoding"); 49 | } 50 | this.model = model; 51 | this.file = file; 52 | this.templateName = templateName; 53 | this.encoding = encoding; 54 | this.overwrite = overwrite; 55 | } 56 | 57 | /** 58 | * データモデルを返します。 59 | * 60 | * @return データモデル 61 | */ 62 | public Object getModel() { 63 | return model; 64 | } 65 | 66 | /** 67 | * 生成するファイルを返します。 68 | * 69 | * @return 生成するファイル 70 | */ 71 | public File getFile() { 72 | return file; 73 | } 74 | 75 | /** 76 | * テンプレート名を返します。 77 | * 78 | * @return テンプレート名 79 | */ 80 | public String getTemplateName() { 81 | return templateName; 82 | } 83 | 84 | /** 85 | * エンコーディングを返します。 86 | * 87 | * @return エンコーディング 88 | */ 89 | public String getEncoding() { 90 | return encoding; 91 | } 92 | 93 | /** 94 | * 上書きする場合{@code true} を返します。 95 | * 96 | * @return 上書きする場合{@code true} 97 | */ 98 | public boolean isOverwrite() { 99 | return overwrite; 100 | } 101 | } 102 | -------------------------------------------------------------------------------- /src/main/java/org/seasar/doma/extension/gen/GenerationType.java: -------------------------------------------------------------------------------- 1 | package org.seasar.doma.extension.gen; 2 | 3 | /** 4 | * 識別子を生成する方法です。 5 | * 6 | * @author taedium 7 | */ 8 | public enum GenerationType { 9 | /** */ 10 | IDENTITY(EnumConstants.GenerationType_IDENTITY), 11 | /** */ 12 | SEQUENCE(EnumConstants.GenerationType_SEQUENCE), 13 | /** */ 14 | TABLE(EnumConstants.GenerationType_TABLE); 15 | 16 | private final EnumConstants enumConstant; 17 | 18 | private GenerationType(EnumConstants enumConstant) { 19 | this.enumConstant = enumConstant; 20 | } 21 | 22 | /** 23 | * 列挙定数を返します。 24 | * 25 | * @return 列挙定数 26 | */ 27 | public EnumConstants getEnumConstant() { 28 | return enumConstant; 29 | } 30 | 31 | /** 32 | * 参照名を返します。 33 | * 34 | * @return 参照名 35 | */ 36 | public String getReferenceName() { 37 | return enumConstant.getReferenceName(); 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /src/main/java/org/seasar/doma/extension/gen/Logger.java: -------------------------------------------------------------------------------- 1 | package org.seasar.doma.extension.gen; 2 | 3 | /** 4 | * ロガーです。 5 | * 6 | * @author taedium 7 | */ 8 | public final class Logger { 9 | 10 | /** デリゲート */ 11 | private static volatile LoggerDelegate delegate = new NullLoggerDelegate(); 12 | 13 | private Logger() {} 14 | 15 | /** 16 | * デリゲートを設定します。 17 | * 18 | * @param delegate デリゲート 19 | */ 20 | public static void setDelegate(LoggerDelegate delegate) { 21 | Logger.delegate = delegate; 22 | } 23 | 24 | /** 25 | * DEBUGレベルの情報を記録します。 26 | * 27 | * @param message メッセージ 28 | */ 29 | public static void debug(String message) { 30 | delegate.debug(message); 31 | } 32 | 33 | /** 34 | * DEBUGレベルの情報を記録します。 35 | * 36 | * @param throwable ログに関する {@link Throwable} 37 | */ 38 | public static void debug(Throwable throwable) { 39 | delegate.debug(throwable); 40 | } 41 | 42 | /** 43 | * DEBUGレベルの情報を記録します。 44 | * 45 | * @param message メッセージ 46 | * @param throwable ログに関する {@link Throwable} 47 | */ 48 | public static void debug(String message, Throwable throwable) { 49 | delegate.debug(message, throwable); 50 | } 51 | 52 | /** 53 | * INFOレベルの情報を記録します。 54 | * 55 | * @param message メッセージ 56 | */ 57 | public static void info(String message) { 58 | delegate.info(message); 59 | } 60 | 61 | /** 62 | * INFOレベルの情報を記録します。 63 | * 64 | * @param throwable ログに関する {@link Throwable} 65 | */ 66 | public static void info(Throwable throwable) { 67 | delegate.info(throwable); 68 | } 69 | 70 | /** 71 | * INFOレベルの情報を記録します。 72 | * 73 | * @param message メッセージ 74 | * @param throwable ログに関する {@link Throwable} 75 | */ 76 | public static void info(String message, Throwable throwable) { 77 | delegate.info(message, throwable); 78 | } 79 | 80 | /** 81 | * ERRORレベルの情報を記録します。 82 | * 83 | * @param message メッセージ 84 | */ 85 | public static void error(String message) { 86 | delegate.error(message); 87 | } 88 | 89 | /** 90 | * ERRORレベルの情報を記録します。 91 | * 92 | * @param throwable ログに関する {@link Throwable} 93 | */ 94 | public static void error(Throwable throwable) { 95 | delegate.error(throwable); 96 | } 97 | 98 | /** 99 | * ERRORレベルの情報を記録します。 100 | * 101 | * @param message メッセージ 102 | * @param throwable ログに関する {@link Throwable} 103 | */ 104 | public static void error(String message, Throwable throwable) { 105 | delegate.error(message, throwable); 106 | } 107 | } 108 | -------------------------------------------------------------------------------- /src/main/java/org/seasar/doma/extension/gen/LoggerDelegate.java: -------------------------------------------------------------------------------- 1 | package org.seasar.doma.extension.gen; 2 | 3 | /** 4 | * {@link Logger} から処理を委譲されるクラスです。 5 | * 6 | * @author taedium 7 | */ 8 | public interface LoggerDelegate { 9 | 10 | /** 11 | * DEBUGレベルの情報を記録します。 12 | * 13 | * @param message メッセージ 14 | */ 15 | void debug(String message); 16 | 17 | /** 18 | * DEBUGレベルの情報を記録します。 19 | * 20 | * @param throwable ログに関連した {@link Throwable} 21 | */ 22 | void debug(Throwable throwable); 23 | 24 | /** 25 | * DEBUGレベルの情報を記録します。 26 | * 27 | * @param message メッセージ 28 | * @param throwable ログに関連した {@link Throwable} 29 | */ 30 | void debug(String message, Throwable throwable); 31 | 32 | /** 33 | * INFOレベルの情報を記録します。 34 | * 35 | * @param message メッセージ 36 | */ 37 | void info(String message); 38 | 39 | /** 40 | * INFOレベルの情報を記録します。 41 | * 42 | * @param throwable ログに関連した {@link Throwable} 43 | */ 44 | void info(Throwable throwable); 45 | 46 | /** 47 | * INFOレベルの情報を記録します。 48 | * 49 | * @param message メッセージ 50 | * @param throwable ログに関連した {@link Throwable} 51 | */ 52 | void info(String message, Throwable throwable); 53 | 54 | /** 55 | * ERRORレベルの情報を記録します。 56 | * 57 | * @param message メッセージ 58 | */ 59 | void error(String message); 60 | 61 | /** 62 | * ERRORレベルの情報を記録します。 63 | * 64 | * @param throwable ログに関連した {@link Throwable} 65 | */ 66 | void error(Throwable throwable); 67 | 68 | /** 69 | * ERRORレベルの情報を記録します。 70 | * 71 | * @param message メッセージ 72 | * @param throwable ログに関連した {@link Throwable} 73 | */ 74 | void error(String message, Throwable throwable); 75 | } 76 | -------------------------------------------------------------------------------- /src/main/java/org/seasar/doma/extension/gen/MessageResource.java: -------------------------------------------------------------------------------- 1 | package org.seasar.doma.extension.gen; 2 | 3 | /** 4 | * メッセージリソースを表します。 5 | * 6 | *

このインタフェースの実装はスレッドセーフでなければいけません。 7 | * 8 | *

9 | * 10 | * @author taedium 11 | */ 12 | public interface MessageResource { 13 | 14 | /** 15 | * 一意のコードを返します。 16 | * 17 | * @return コード 18 | */ 19 | String getCode(); 20 | 21 | /** 22 | * メッセージパターンの文字列を返します。 23 | * 24 | *

この文字列は{0}や{1}といった置換パラメータを含みます。 25 | * 26 | * @return メッセージパターンの文字列 27 | */ 28 | String getMessagePattern(); 29 | 30 | /** 31 | * メッセージを返します。 32 | * 33 | *

メッセージパターンに含まれる置換パラメータは引数により解決されます。 34 | * 35 | * @param args 置換パラメータに対応する引数 36 | * @return メッセージ 37 | */ 38 | String getMessage(Object... args); 39 | } 40 | -------------------------------------------------------------------------------- /src/main/java/org/seasar/doma/extension/gen/NamingType.java: -------------------------------------------------------------------------------- 1 | package org.seasar.doma.extension.gen; 2 | 3 | import org.seasar.doma.extension.gen.internal.util.StringUtil; 4 | 5 | /** 6 | * ネーミング規約を表します。 7 | * 8 | * @author taedium 9 | */ 10 | public enum NamingType { 11 | 12 | /** */ 13 | NONE(EnumConstants.NamingType_NONE) { 14 | 15 | @Override 16 | public String apply(String text) { 17 | return text; 18 | } 19 | }, 20 | /** */ 21 | LOWER_CASE(EnumConstants.NamingType_LOWER_CASE) { 22 | 23 | @Override 24 | public String apply(String text) { 25 | if (text == null) { 26 | throw new GenNullPointerException("text"); 27 | } 28 | return text.toLowerCase(); 29 | } 30 | }, 31 | /** */ 32 | UPPER_CASE(EnumConstants.NamingType_UPPER_CASE) { 33 | 34 | @Override 35 | public String apply(String text) { 36 | if (text == null) { 37 | throw new GenNullPointerException("text"); 38 | } 39 | return text.toUpperCase(); 40 | } 41 | }, 42 | /** */ 43 | SNAKE_UPPER_CASE(EnumConstants.NamingType_SNAKE_UPPER_CASE) { 44 | 45 | @Override 46 | public String apply(String text) { 47 | if (text == null) { 48 | throw new GenNullPointerException("text"); 49 | } 50 | String s = StringUtil.fromCamelCaseToSnakeCase(text); 51 | return s.toUpperCase(); 52 | } 53 | }, 54 | /** */ 55 | SNAKE_LOWER_CASE(EnumConstants.NamingType_SNAKE_LOWER_CASE) { 56 | 57 | @Override 58 | public String apply(String text) { 59 | if (text == null) { 60 | throw new GenNullPointerException("text"); 61 | } 62 | String s = StringUtil.fromCamelCaseToSnakeCase(text); 63 | return s.toLowerCase(); 64 | } 65 | }; 66 | 67 | private final EnumConstants enumConstant; 68 | 69 | private NamingType(EnumConstants enumConstant) { 70 | this.enumConstant = enumConstant; 71 | } 72 | 73 | /** 74 | * 列挙定数を返します。 75 | * 76 | * @return 列挙定数 77 | */ 78 | public EnumConstants getEnumConstant() { 79 | return enumConstant; 80 | } 81 | 82 | /** 83 | * 参照名を返します。 84 | * 85 | * @return 参照名 86 | */ 87 | public String getReferenceName() { 88 | return enumConstant.getReferenceName(); 89 | } 90 | 91 | /** 92 | * ネーミング規約を適用します。 93 | * 94 | * @param text 規約が適用される文字列 95 | * @return 規約が適用された文字列 96 | */ 97 | public abstract String apply(String text); 98 | } 99 | -------------------------------------------------------------------------------- /src/main/java/org/seasar/doma/extension/gen/NullLoggerDelegate.java: -------------------------------------------------------------------------------- 1 | package org.seasar.doma.extension.gen; 2 | 3 | /** 4 | * {@link LoggerDelegate} の何もしない実装です。 5 | * 6 | * @author taedium 7 | */ 8 | public class NullLoggerDelegate implements LoggerDelegate { 9 | 10 | @Override 11 | public void debug(String message) {} 12 | 13 | @Override 14 | public void debug(Throwable throwable) {} 15 | 16 | @Override 17 | public void debug(String message, Throwable throwable) {} 18 | 19 | @Override 20 | public void info(String message) {} 21 | 22 | @Override 23 | public void info(Throwable throwable) {} 24 | 25 | @Override 26 | public void info(String message, Throwable throwable) {} 27 | 28 | @Override 29 | public void error(String message) {} 30 | 31 | @Override 32 | public void error(Throwable throwable) {} 33 | 34 | @Override 35 | public void error(String message, Throwable throwable) {} 36 | } 37 | -------------------------------------------------------------------------------- /src/main/java/org/seasar/doma/extension/gen/OnDemandDateModel.java: -------------------------------------------------------------------------------- 1 | package org.seasar.doma.extension.gen; 2 | 3 | import freemarker.template.TemplateDateModel; 4 | import freemarker.template.TemplateModelException; 5 | import java.util.Date; 6 | 7 | /** 8 | * 必要とされるたびに{@link Date}を生成する{@link TemplateDateModel}の実装です。 9 | * 10 | * @author taedium 11 | */ 12 | public class OnDemandDateModel implements TemplateDateModel { 13 | 14 | @Override 15 | public Date getAsDate() throws TemplateModelException { 16 | return new Date(); 17 | } 18 | 19 | @Override 20 | public int getDateType() { 21 | return UNKNOWN; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/main/java/org/seasar/doma/extension/gen/ResourceTemplateLoader.java: -------------------------------------------------------------------------------- 1 | package org.seasar.doma.extension.gen; 2 | 3 | import freemarker.cache.TemplateLoader; 4 | import freemarker.cache.URLTemplateLoader; 5 | import java.net.URL; 6 | import org.seasar.doma.extension.gen.internal.util.ResourceUtil; 7 | 8 | /** 9 | * リソースを扱う{@link TemplateLoader}の実装クラスです。 10 | * 11 | *

JARファイルに含まれたリソースを扱えます。 12 | * 13 | * @author taedium 14 | */ 15 | public class ResourceTemplateLoader extends URLTemplateLoader { 16 | 17 | /** ベースとなるパス */ 18 | protected String basePath; 19 | 20 | /** 21 | * インスタンスを構築します。 22 | * 23 | * @param basePath ベースとなるパス 24 | */ 25 | public ResourceTemplateLoader(String basePath) { 26 | if (basePath == null) { 27 | throw new NullPointerException("basePath"); 28 | } 29 | this.basePath = basePath; 30 | } 31 | 32 | @Override 33 | protected URL getURL(String name) { 34 | String path = basePath + "/" + name; 35 | return ResourceUtil.getResource(path); 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /src/main/java/org/seasar/doma/extension/gen/ResultSetMetaReader.java: -------------------------------------------------------------------------------- 1 | package org.seasar.doma.extension.gen; 2 | 3 | import java.sql.Connection; 4 | import java.sql.PreparedStatement; 5 | import java.sql.ResultSet; 6 | import java.sql.ResultSetMetaData; 7 | import java.sql.SQLException; 8 | import javax.sql.DataSource; 9 | import org.seasar.doma.extension.gen.dialect.GenDialect; 10 | import org.seasar.doma.extension.gen.internal.message.Message; 11 | import org.seasar.doma.extension.gen.internal.util.JdbcUtil; 12 | 13 | /** @author nakamura-to */ 14 | public class ResultSetMetaReader { 15 | 16 | /** 方言 */ 17 | protected final GenDialect dialect; 18 | 19 | /** データソース */ 20 | protected final DataSource dataSource; 21 | 22 | public ResultSetMetaReader(GenDialect dialect, DataSource dataSource) { 23 | if (dialect == null) { 24 | throw new GenNullPointerException("dialect"); 25 | } 26 | if (dataSource == null) { 27 | throw new GenNullPointerException("dataSource"); 28 | } 29 | this.dialect = dialect; 30 | this.dataSource = dataSource; 31 | } 32 | 33 | public TableMeta read(String sql) { 34 | if (sql == null) { 35 | throw new GenNullPointerException("sql"); 36 | } 37 | Connection connection = JdbcUtil.getConnection(dataSource); 38 | try { 39 | PreparedStatement preparedStatement = JdbcUtil.prepareStatement(connection, sql); 40 | try { 41 | ResultSet resultSet = preparedStatement.executeQuery(); 42 | try { 43 | return createTableMeta(resultSet.getMetaData()); 44 | } finally { 45 | JdbcUtil.close(resultSet); 46 | } 47 | } finally { 48 | JdbcUtil.close(preparedStatement); 49 | } 50 | } catch (SQLException e) { 51 | throw new GenException(Message.DOMAGEN9001, e, e); 52 | } finally { 53 | JdbcUtil.close(connection); 54 | } 55 | } 56 | 57 | protected TableMeta createTableMeta(ResultSetMetaData rsmd) throws SQLException { 58 | TableMeta tableMeta = new TableMeta(); 59 | for (int i = 1, max = rsmd.getColumnCount() + 1; i < max; i++) { 60 | ColumnMeta columnMeta = new ColumnMeta(); 61 | columnMeta.setName(rsmd.getColumnLabel(i)); 62 | columnMeta.setSqlType(rsmd.getColumnType(i)); 63 | columnMeta.setTypeName(rsmd.getTableName(i).toLowerCase()); 64 | columnMeta.setLength(rsmd.getPrecision(i)); 65 | columnMeta.setScale(rsmd.getScale(i)); 66 | tableMeta.addColumnMeta(columnMeta); 67 | } 68 | return tableMeta; 69 | } 70 | } 71 | -------------------------------------------------------------------------------- /src/main/java/org/seasar/doma/extension/gen/SqlDesc.java: -------------------------------------------------------------------------------- 1 | package org.seasar.doma.extension.gen; 2 | 3 | import org.seasar.doma.extension.gen.dialect.GenDialect; 4 | 5 | /** 6 | * SQL記述です。 7 | * 8 | * @author taedium 9 | */ 10 | public class SqlDesc { 11 | 12 | /** ファイル名 */ 13 | protected String fileName; 14 | 15 | /** テンプレート名 */ 16 | protected String templateName; 17 | 18 | /** エンティティ記述 */ 19 | protected EntityDesc entityDesc; 20 | 21 | /** 22 | * 方言 23 | * 24 | * @since 1.11.0 25 | */ 26 | protected GenDialect dialect; 27 | 28 | /** 29 | * ファイル名 を返します。 30 | * 31 | * @return ファイル名 32 | */ 33 | public String getFileName() { 34 | return fileName; 35 | } 36 | 37 | /** 38 | * ファイル名を設定します。 39 | * 40 | * @param fileName ファイル名 41 | */ 42 | public void setFileName(String fileName) { 43 | this.fileName = fileName; 44 | } 45 | 46 | /** 47 | * テンプレート名を返します。 48 | * 49 | * @return テンプレート名 50 | */ 51 | public String getTemplateName() { 52 | return templateName; 53 | } 54 | 55 | /** 56 | * テンプレート名を設定します。 57 | * 58 | * @param templateName テンプレート名 59 | */ 60 | public void setTemplateName(String templateName) { 61 | this.templateName = templateName; 62 | } 63 | 64 | /** 65 | * エンティティ記述を返します。 66 | * 67 | * @return エンティティ記述 68 | */ 69 | public EntityDesc getEntityDesc() { 70 | return entityDesc; 71 | } 72 | 73 | /** 74 | * エンティティ記述を設定します。 75 | * 76 | * @param entityDesc エンティティ記述 77 | */ 78 | public void setEntityDesc(EntityDesc entityDesc) { 79 | this.entityDesc = entityDesc; 80 | } 81 | 82 | /** 83 | * 方言を設定します。 84 | * 85 | * @param dialect 方言 86 | * @since 1.11.0 87 | */ 88 | public void setDialect(GenDialect dialect) { 89 | this.dialect = dialect; 90 | } 91 | 92 | /** 93 | * 時刻のリテラルに変換します。 94 | * 95 | * @param value 値 96 | * @return 時刻のリテラル 97 | * @since 1.11.0 98 | */ 99 | public String toTime(String value) { 100 | return dialect.convertToTimeLiteral(value); 101 | } 102 | 103 | /** 104 | * 日付のリテラルに変換します。 105 | * 106 | * @param value 値 107 | * @return 日付のリテラル 108 | * @since 1.11.0 109 | */ 110 | public String toDate(String value) { 111 | return dialect.convertToDateLiteral(value); 112 | } 113 | 114 | /** 115 | * タイムスタンプのリテラルに変換します。 116 | * 117 | * @param value 値 118 | * @return タイムスタンプのリテラル 119 | * @since 1.11.0 120 | */ 121 | public String toTimestamp(String value) { 122 | return dialect.convertToTimestampLiteral(value); 123 | } 124 | } 125 | -------------------------------------------------------------------------------- /src/main/java/org/seasar/doma/extension/gen/SqlDescFactory.java: -------------------------------------------------------------------------------- 1 | package org.seasar.doma.extension.gen; 2 | 3 | import java.io.File; 4 | import java.io.FileFilter; 5 | import java.util.ArrayList; 6 | import java.util.HashSet; 7 | import java.util.List; 8 | import java.util.Set; 9 | import org.seasar.doma.extension.gen.dialect.GenDialect; 10 | 11 | /** 12 | * SQL記述のファクトリです。 13 | * 14 | * @author taedium 15 | */ 16 | public class SqlDescFactory { 17 | 18 | /** 識別子による検索メソッドの名前 */ 19 | private final String selectByIdFileName; 20 | 21 | /** 識別子とバージョンによる検索メソッドの名前 */ 22 | private final String selectByIdAndVersionFileName; 23 | 24 | /** テンプレートを格納するプライマリディレクトリ、使用しない場合 {@code null} */ 25 | private File templatePrimaryDir; 26 | 27 | /** 方言 */ 28 | private GenDialect dialect; 29 | 30 | /** 31 | * インスタンスを構築します。 32 | * 33 | * @param templatePrimaryDir テンプレートを格納するプライマリディレクトリ、使用しない場合 {@code null} 34 | * @param dialect 方言 35 | * @since 1.11.0 36 | */ 37 | public SqlDescFactory(File templatePrimaryDir, GenDialect dialect) { 38 | this("selectById.sql", "selectByIdAndVersion.sql", templatePrimaryDir, dialect); 39 | } 40 | 41 | /** 42 | * インスタンスを構築します。 43 | * 44 | * @param selectByIdFileName 識別子による検索メソッドの名前 45 | * @param selectByIdAndVersionFileName 識別子とバージョンによる検索メソッドの名前 46 | * @param templatePrimaryDir テンプレートを格納するプライマリディレクトリ、使用しない場合 {@code null} 47 | * @param dialect 方言 48 | * @since 1.11.0 49 | */ 50 | public SqlDescFactory( 51 | String selectByIdFileName, 52 | String selectByIdAndVersionFileName, 53 | File templatePrimaryDir, 54 | GenDialect dialect) { 55 | if (selectByIdFileName == null) { 56 | throw new GenNullPointerException("selectByIdFileName"); 57 | } 58 | if (selectByIdAndVersionFileName == null) { 59 | throw new GenNullPointerException("selectByIdAndVersionFileName"); 60 | } 61 | if (dialect == null) { 62 | throw new GenNullPointerException("dialect"); 63 | } 64 | this.selectByIdFileName = selectByIdFileName; 65 | this.selectByIdAndVersionFileName = selectByIdAndVersionFileName; 66 | this.templatePrimaryDir = templatePrimaryDir; 67 | this.dialect = dialect; 68 | } 69 | 70 | /** 71 | * SQL記述のリストを返します。 72 | * 73 | * @param entityDesc エンティティ記述 74 | * @return SQL記述のリスト 75 | */ 76 | public List createSqlDescs(EntityDesc entityDesc) { 77 | List results = new ArrayList(); 78 | if (entityDesc.getIdEntityPropertyDescs().size() > 0) { 79 | results.add( 80 | createSqlDesc(entityDesc, selectByIdFileName, Constants.SELECT_BY_ID_SQL_TEMPLATE)); 81 | if (entityDesc.getVersionEntityPropertyDesc() != null) { 82 | results.add( 83 | createSqlDesc( 84 | entityDesc, 85 | selectByIdAndVersionFileName, 86 | Constants.SELECT_BY_ID_AND_VERSION_SQL_TEMPLATE)); 87 | } 88 | } 89 | for (String templateName : findTemplateNames()) { 90 | String fileName = removeTemplateExtension(templateName); 91 | results.add(createSqlDesc(entityDesc, fileName, templateName)); 92 | } 93 | return results; 94 | } 95 | 96 | /** 97 | * SQL記述を返します。 98 | * 99 | * @param entityDesc エンティティ記述 100 | * @param fileName ファイル名 101 | * @param templateName テンプレート名 102 | * @return SQL記述 103 | */ 104 | protected SqlDesc createSqlDesc(EntityDesc entityDesc, String fileName, String templateName) { 105 | SqlDesc sqlFileDesc = new SqlDesc(); 106 | sqlFileDesc.setFileName(fileName); 107 | sqlFileDesc.setTemplateName(templateName); 108 | sqlFileDesc.setEntityDesc(entityDesc); 109 | sqlFileDesc.setDialect(dialect); 110 | return sqlFileDesc; 111 | } 112 | 113 | /** 114 | * テンプレートのファイル名を探します。 115 | * 116 | * @return テンプレートのファイル名のセット 117 | * @since 1.7.0 118 | */ 119 | protected Set findTemplateNames() { 120 | final Set results = new HashSet(); 121 | if (templatePrimaryDir == null) { 122 | return results; 123 | } 124 | templatePrimaryDir.listFiles( 125 | new FileFilter() { 126 | 127 | @Override 128 | public boolean accept(File file) { 129 | if (file.isFile()) { 130 | String name = file.getName(); 131 | if (!name.equals(Constants.SELECT_BY_ID_SQL_TEMPLATE) 132 | && !name.equals(Constants.SELECT_BY_ID_AND_VERSION_SQL_TEMPLATE)) { 133 | if (name.endsWith(Constants.SQL_TEMPLATE_EXTENSION)) { 134 | results.add(name); 135 | } 136 | } 137 | } 138 | return false; 139 | } 140 | }); 141 | return results; 142 | } 143 | 144 | /** 145 | * テンプレートファイルの拡張子を削除します。 146 | * 147 | * @param templateName テンプレートファイル名 148 | * @return テンプレートファイルの拡張子を削除した文字列 149 | * @since 1.7.0 150 | */ 151 | protected String removeTemplateExtension(String templateName) { 152 | return templateName.substring(0, templateName.length() - Constants.TEMPLATE_EXTENSION.length()); 153 | } 154 | } 155 | -------------------------------------------------------------------------------- /src/main/java/org/seasar/doma/extension/gen/SqlTestCaseDesc.java: -------------------------------------------------------------------------------- 1 | package org.seasar.doma.extension.gen; 2 | 3 | import java.sql.Driver; 4 | import java.util.List; 5 | 6 | /** 7 | * SQLテストケース記述です。 8 | * 9 | * @author taedium 10 | */ 11 | public class SqlTestCaseDesc extends ClassDesc { 12 | 13 | /** テンプレート名 */ 14 | protected String templateName; 15 | 16 | /** {@code org.seasar.doma.jdbc.dialect.Dialect} のサブタイプのクラス名 */ 17 | protected String dialectClassName = null; 18 | 19 | /** {@link Driver} のサブタイプのクラス名 */ 20 | protected String driverClassName = null; 21 | 22 | /** JDBC接続ユーザー */ 23 | protected String user = null; 24 | 25 | /** JDBC接続パスワード */ 26 | protected String password = null; 27 | 28 | /** JDBC接続URL */ 29 | protected String url = null; 30 | 31 | /** 抽象クラスの場合 {@code true} */ 32 | protected boolean abstrct; 33 | 34 | /** メソッド記述のリスト */ 35 | protected List methodDescs; 36 | 37 | /** @return the templateName */ 38 | public String getTemplateName() { 39 | return templateName; 40 | } 41 | 42 | /** @param templateName the templateName to set */ 43 | public void setTemplateName(String templateName) { 44 | this.templateName = templateName; 45 | } 46 | 47 | /** @return the driverClassName */ 48 | public String getDriverClassName() { 49 | return driverClassName; 50 | } 51 | 52 | /** @param driverClassName the driverClassName to set */ 53 | public void setDriverClassName(String driverClassName) { 54 | this.driverClassName = driverClassName; 55 | } 56 | 57 | /** @return the user */ 58 | public String getUser() { 59 | return user; 60 | } 61 | 62 | /** @param user the user to set */ 63 | public void setUser(String user) { 64 | this.user = user; 65 | } 66 | 67 | /** @return the password */ 68 | public String getPassword() { 69 | return password; 70 | } 71 | 72 | /** @param password the password to set */ 73 | public void setPassword(String password) { 74 | this.password = password; 75 | } 76 | 77 | /** @return the url */ 78 | public String getUrl() { 79 | return url; 80 | } 81 | 82 | /** @param url the url to set */ 83 | public void setUrl(String url) { 84 | this.url = url; 85 | } 86 | 87 | /** @return the abstrct */ 88 | public boolean isAbstrct() { 89 | return abstrct; 90 | } 91 | 92 | /** @param abstrct the abstrct to set */ 93 | public void setAbstrct(boolean abstrct) { 94 | this.abstrct = abstrct; 95 | } 96 | 97 | /** @return the dialectClassName */ 98 | public String getDialectClassName() { 99 | return dialectClassName; 100 | } 101 | 102 | /** @param dialectClassName the dialectClassName to set */ 103 | public void setDialectClassName(String dialectClassName) { 104 | this.dialectClassName = dialectClassName; 105 | } 106 | 107 | /** @return the methodDescs */ 108 | public List getMethodDescs() { 109 | return methodDescs; 110 | } 111 | 112 | /** @param methodDescs the methodDescs to set */ 113 | public void setMethodDescs(List methodDescs) { 114 | this.methodDescs = methodDescs; 115 | } 116 | } 117 | -------------------------------------------------------------------------------- /src/main/java/org/seasar/doma/extension/gen/SqlTestCaseDescFactory.java: -------------------------------------------------------------------------------- 1 | package org.seasar.doma.extension.gen; 2 | 3 | import java.io.File; 4 | import java.sql.Driver; 5 | import java.util.List; 6 | import java.util.Set; 7 | import java.util.TreeSet; 8 | import org.seasar.doma.extension.gen.internal.util.ClassUtil; 9 | 10 | /** 11 | * SQLテストケース記述のファクトリです。 12 | * 13 | * @author taedium 14 | */ 15 | public class SqlTestCaseDescFactory { 16 | 17 | /** {@code org.seasar.doma.jdbc.dialect.Dialect}のサブクラスの名前 */ 18 | protected final String dialectClassName; 19 | 20 | /** {@link Driver} のサブクラスの名前 */ 21 | protected final String driverClassName; 22 | 23 | /** JDBC接続URL */ 24 | protected final String url; 25 | 26 | /** JDBC接続ユーザ */ 27 | protected final String user; 28 | 29 | /** JDBC接続パスワード */ 30 | protected final String password; 31 | 32 | /** テスト対象SQLファイルのセット */ 33 | protected final Set sqlFiles = new TreeSet(); 34 | 35 | /** クラス記述のサポートクラス */ 36 | protected final ClassDescSupport classDescSupport = new ClassDescSupport(); 37 | 38 | /** 39 | * インスタンスを構築します。 40 | * 41 | * @param dialectClassName {@code org.seasar.doma.jdbc.dialect.Dialect}のサブクラスの名前 42 | * @param driverClassName {@link Driver} のサブクラスの名前 43 | * @param url JDBC接続URL 44 | * @param user JDBC接続ユーザ 45 | * @param password JDBC接続パスワード 46 | */ 47 | public SqlTestCaseDescFactory( 48 | String dialectClassName, String driverClassName, String url, String user, String password) { 49 | if (dialectClassName == null) { 50 | throw new GenNullPointerException("dialectClassName"); 51 | } 52 | if (driverClassName == null) { 53 | throw new GenNullPointerException("driverClassName"); 54 | } 55 | if (url == null) { 56 | throw new GenNullPointerException("url"); 57 | } 58 | if (user == null) { 59 | throw new GenNullPointerException("user"); 60 | } 61 | if (password == null) { 62 | throw new GenNullPointerException("password"); 63 | } 64 | if (sqlFiles == null) { 65 | throw new GenNullPointerException("sqlFiles"); 66 | } 67 | this.dialectClassName = dialectClassName; 68 | this.driverClassName = driverClassName; 69 | this.url = url; 70 | this.user = user; 71 | this.password = password; 72 | this.sqlFiles.addAll(sqlFiles); 73 | } 74 | 75 | /** 76 | * SQLテスト記述を作成します。 77 | * 78 | * @param className クラス名 79 | * @param methodDescs メソッド記述のリスト 80 | * @return SQLテスト記述 81 | */ 82 | public SqlTestCaseDesc createSqlFileTestDesc( 83 | String className, List methodDescs) { 84 | SqlTestCaseDesc sqlTestCaseDesc = new SqlTestCaseDesc(); 85 | sqlTestCaseDesc.setPackageName(ClassUtil.getPackageName(className)); 86 | sqlTestCaseDesc.setSimpleName(ClassUtil.getSimpleName(className)); 87 | sqlTestCaseDesc.setAbstrct(false); 88 | sqlTestCaseDesc.setDialectClassName(dialectClassName); 89 | sqlTestCaseDesc.setDriverClassName(driverClassName); 90 | sqlTestCaseDesc.setUrl(url); 91 | sqlTestCaseDesc.setUser(user); 92 | sqlTestCaseDesc.setPassword(password); 93 | sqlTestCaseDesc.setTemplateName(Constants.SQL_TEST_CASE_TEMPLATE); 94 | sqlTestCaseDesc.setMethodDescs(methodDescs); 95 | return sqlTestCaseDesc; 96 | } 97 | } 98 | -------------------------------------------------------------------------------- /src/main/java/org/seasar/doma/extension/gen/SqlTestMethodDesc.java: -------------------------------------------------------------------------------- 1 | package org.seasar.doma.extension.gen; 2 | 3 | /** @author nakamura-to */ 4 | public class SqlTestMethodDesc { 5 | 6 | protected String methodName; 7 | 8 | protected String path; 9 | 10 | /** 11 | * @param methodName the methodName 12 | * @param path the path 13 | */ 14 | public SqlTestMethodDesc(String methodName, String path) { 15 | this.methodName = methodName; 16 | this.path = path; 17 | } 18 | 19 | public String getMethodName() { 20 | return methodName; 21 | } 22 | 23 | public void setMethodName(String methodName) { 24 | this.methodName = methodName; 25 | } 26 | 27 | public String getPath() { 28 | return path; 29 | } 30 | 31 | public void setPath(String path) { 32 | this.path = path; 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /src/main/java/org/seasar/doma/extension/gen/SqlTestSuiteDesc.java: -------------------------------------------------------------------------------- 1 | package org.seasar.doma.extension.gen; 2 | 3 | import java.util.ArrayList; 4 | import java.util.List; 5 | 6 | /** @author nakamura-to */ 7 | public class SqlTestSuiteDesc { 8 | 9 | protected List testCaseDescs = new ArrayList<>(); 10 | 11 | public List getTestCaseDescs() { 12 | return testCaseDescs; 13 | } 14 | 15 | public void addTestCaseDesc(SqlTestCaseDesc testCaseDesc) { 16 | testCaseDescs.add(testCaseDesc); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/org/seasar/doma/extension/gen/SqlTestSuiteDescFactory.java: -------------------------------------------------------------------------------- 1 | package org.seasar.doma.extension.gen; 2 | 3 | import static java.util.stream.Collectors.groupingBy; 4 | import static java.util.stream.Collectors.mapping; 5 | import static java.util.stream.Collectors.toList; 6 | 7 | import java.io.File; 8 | import java.util.Objects; 9 | import java.util.Set; 10 | import org.seasar.doma.extension.gen.internal.util.FileUtil; 11 | import org.seasar.doma.extension.gen.internal.util.Pair; 12 | import org.seasar.doma.extension.gen.internal.util.StringUtil; 13 | 14 | /** @author nakamura-to */ 15 | public class SqlTestSuiteDescFactory { 16 | 17 | protected SqlTestCaseDescFactory sqlTestCaseDescFactory; 18 | 19 | public SqlTestSuiteDescFactory(SqlTestCaseDescFactory sqlTestCaseDescFactory) { 20 | if (sqlTestCaseDescFactory == null) { 21 | throw new GenNullPointerException("sqlTestCaseDescFactory"); 22 | } 23 | this.sqlTestCaseDescFactory = sqlTestCaseDescFactory; 24 | } 25 | 26 | public SqlTestSuiteDesc createSqlTestSuiteDesc(Set sqlFileSet) { 27 | if (sqlFileSet == null) { 28 | throw new GenNullPointerException("sqlFileSet"); 29 | } 30 | SqlTestSuiteDesc suiteDesc = new SqlTestSuiteDesc(); 31 | sqlFileSet.stream() 32 | .filter(Objects::nonNull) 33 | .filter(f -> f.isFile()) 34 | .filter(f -> f.getName().endsWith(".sql")) 35 | .filter(f -> !f.getName().contains("-")) 36 | .map(FileUtil::getCanonicalPath) 37 | .map(path -> path.replace(File.separator, "/")) 38 | .map(this::fromPathToPair) 39 | .filter(Objects::nonNull) 40 | .collect(groupingBy(Pair::getFirst, mapping(Pair::getSecond, toList()))) 41 | .forEach( 42 | (className, methodDescs) -> { 43 | SqlTestCaseDesc testCaseDesc = 44 | sqlTestCaseDescFactory.createSqlFileTestDesc(className, methodDescs); 45 | suiteDesc.addTestCaseDesc(testCaseDesc); 46 | }); 47 | return suiteDesc; 48 | } 49 | 50 | protected Pair fromPathToPair(String path) { 51 | int pos = path.indexOf("/META-INF/"); 52 | int pos2 = path.lastIndexOf('/'); 53 | if (pos == -1 || pos2 == -1 || pos + "/META-INF/".length() == pos2) { 54 | return null; 55 | } 56 | String sqlPath = path.substring(pos + 1); 57 | String dirName = path.substring(pos + "/META-INF/".length(), pos2); 58 | String baseName = path.substring(pos2 + 1); 59 | String className = dirName.replace('/', '.') + "Test"; 60 | String methodName = 61 | "test" + StringUtil.capitalize(baseName.substring(0, baseName.length() - ".sql".length())); 62 | return new Pair<>(className, new SqlTestMethodDesc(methodName, sqlPath)); 63 | } 64 | } 65 | -------------------------------------------------------------------------------- /src/main/java/org/seasar/doma/extension/gen/TableMeta.java: -------------------------------------------------------------------------------- 1 | package org.seasar.doma.extension.gen; 2 | 3 | import java.util.ArrayList; 4 | import java.util.Collections; 5 | import java.util.List; 6 | import org.seasar.doma.extension.gen.internal.util.TableUtil; 7 | 8 | /** 9 | * データベースのテーブルメタデータです。 10 | * 11 | * @author taedium 12 | */ 13 | public class TableMeta { 14 | 15 | /** カタログ名 */ 16 | protected String catalogName; 17 | 18 | /** スキーマ名 */ 19 | protected String schemaName; 20 | 21 | /** 名前 */ 22 | protected String name; 23 | 24 | /** コメント */ 25 | protected String comment; 26 | 27 | /** カラムメタデータのリスト */ 28 | protected final List columnMetas = new ArrayList(); 29 | 30 | /** 主キーのカラムメタデータのリスト */ 31 | protected final List primaryKeyColumnMetas = new ArrayList(); 32 | 33 | /** 34 | * カタログ名を返します。 35 | * 36 | * @return カタログ名 37 | */ 38 | public String getCatalogName() { 39 | return catalogName; 40 | } 41 | 42 | /** 43 | * カタログ名を設定します。 44 | * 45 | * @param catalogName カタログ名 46 | */ 47 | public void setCatalogName(String catalogName) { 48 | this.catalogName = catalogName; 49 | } 50 | 51 | /** 52 | * スキーマ名を返します 53 | * 54 | * @return スキーマ名 55 | */ 56 | public String getSchemaName() { 57 | return schemaName; 58 | } 59 | 60 | /** 61 | * スキーマ名を設定します。 62 | * 63 | * @param schemaName スキーマ名 64 | */ 65 | public void setSchemaName(String schemaName) { 66 | this.schemaName = schemaName; 67 | } 68 | 69 | /** 70 | * 名前を返します。 71 | * 72 | * @return 名前 73 | */ 74 | public String getName() { 75 | return name; 76 | } 77 | 78 | /** 79 | * 名前を設定します。 80 | * 81 | * @param name 名前 82 | */ 83 | public void setName(String name) { 84 | this.name = name; 85 | } 86 | 87 | /** 88 | * コメントを返します。 89 | * 90 | * @return コメント 91 | */ 92 | public String getComment() { 93 | return comment; 94 | } 95 | 96 | /** 97 | * コメントを設定します。 98 | * 99 | * @param comment コメント 100 | */ 101 | public void setComment(String comment) { 102 | this.comment = comment; 103 | } 104 | 105 | /** 106 | * カラムのメタデータのリストを返します。 107 | * 108 | * @return カラムのメタデータのリスト 109 | */ 110 | public List getColumnMetas() { 111 | return Collections.unmodifiableList(columnMetas); 112 | } 113 | 114 | /** 115 | * カラムのメタデータを追加します。 116 | * 117 | * @param columnMeta カラム記述 118 | */ 119 | public void addColumnMeta(ColumnMeta columnMeta) { 120 | columnMetas.add(columnMeta); 121 | columnMeta.setTableMeta(this); 122 | if (columnMeta.isPrimaryKey()) { 123 | primaryKeyColumnMetas.add(columnMeta); 124 | } 125 | } 126 | 127 | /** 128 | * 主キーのカラムメタデータのリストを返します。 129 | * 130 | * @return 主キーのカラムメタデータのリスト 131 | */ 132 | public List getPrimaryKeyColumnMetas() { 133 | return Collections.unmodifiableList(primaryKeyColumnMetas); 134 | } 135 | 136 | /** 137 | * 完全なテーブル名を返します。 138 | * 139 | * @return 完全なテーブル名 140 | */ 141 | public String getQualifiedTableName() { 142 | return TableUtil.getQualifiedTableName(catalogName, schemaName, name); 143 | } 144 | 145 | /** 146 | * 複合主キーを持つ場合{@code true}を返します。 147 | * 148 | * @return 複合主キーを持つ場合{@code true}、そうでない場合{@code false} 149 | */ 150 | public boolean hasCompositePrimaryKey() { 151 | return primaryKeyColumnMetas.size() > 1; 152 | } 153 | } 154 | -------------------------------------------------------------------------------- /src/main/java/org/seasar/doma/extension/gen/dialect/Db2GenDialect.java: -------------------------------------------------------------------------------- 1 | package org.seasar.doma.extension.gen.dialect; 2 | 3 | import java.math.BigDecimal; 4 | import java.sql.Connection; 5 | import java.sql.PreparedStatement; 6 | import java.sql.ResultSet; 7 | import java.sql.SQLException; 8 | import org.seasar.doma.extension.gen.ClassConstants; 9 | import org.seasar.doma.extension.gen.GenNullPointerException; 10 | import org.seasar.doma.extension.gen.internal.util.JdbcUtil; 11 | 12 | /** 13 | * DB2用の方言です。 14 | * 15 | * @author taedium 16 | */ 17 | public class Db2GenDialect extends StandardGenDialect { 18 | 19 | /** インスタンスを構築します。 */ 20 | public Db2GenDialect() { 21 | classNameMap.put("char () for bit data", ClassConstants.bytes.getQualifiedName()); 22 | classNameMap.put("decimal", BigDecimal.class.getName()); 23 | classNameMap.put("long varchar for bit data", ClassConstants.bytes.getQualifiedName()); 24 | classNameMap.put("long varchar", String.class.getName()); 25 | classNameMap.put("varchar () for bit data", ClassConstants.bytes.getQualifiedName()); 26 | } 27 | 28 | @Override 29 | public String getName() { 30 | return "db2"; 31 | } 32 | 33 | @Override 34 | public String getDialectClassName() { 35 | return ClassConstants.Db2Dialect.getQualifiedName(); 36 | } 37 | 38 | @Override 39 | public String getDefaultSchemaName(String userName) { 40 | return userName != null ? userName.toUpperCase() : null; 41 | } 42 | 43 | @Override 44 | public boolean supportsIdentity() { 45 | return true; 46 | } 47 | 48 | @Override 49 | public boolean supportsSequence() { 50 | return true; 51 | } 52 | 53 | @Override 54 | public boolean isAutoIncrement( 55 | Connection connection, 56 | String catalogName, 57 | String schemaName, 58 | String tableName, 59 | String columnName) 60 | throws SQLException { 61 | if (connection == null) { 62 | throw new GenNullPointerException("connection"); 63 | } 64 | if (tableName == null) { 65 | throw new GenNullPointerException("tableName"); 66 | } 67 | if (columnName == null) { 68 | throw new GenNullPointerException("columnName"); 69 | } 70 | String sql = 71 | "select generated from syscat.columns where tabschema = ? and tabname = ? and colname = ?"; 72 | PreparedStatement ps = JdbcUtil.prepareStatement(connection, sql); 73 | ps.setString(1, schemaName); 74 | ps.setString(2, tableName); 75 | ps.setString(3, columnName); 76 | try { 77 | ResultSet rs = ps.executeQuery(); 78 | try { 79 | if (rs.next()) { 80 | String generated = rs.getString(1); 81 | return "A".equals(generated) || "D".equals(generated); 82 | } 83 | return false; 84 | } finally { 85 | JdbcUtil.close(rs); 86 | } 87 | } finally { 88 | JdbcUtil.close(ps); 89 | } 90 | } 91 | } 92 | -------------------------------------------------------------------------------- /src/main/java/org/seasar/doma/extension/gen/dialect/GenDialect.java: -------------------------------------------------------------------------------- 1 | package org.seasar.doma.extension.gen.dialect; 2 | 3 | import java.sql.Connection; 4 | import java.sql.SQLException; 5 | import java.util.Map; 6 | import org.seasar.doma.extension.gen.ColumnMeta; 7 | 8 | /** 9 | * 方言です。 10 | * 11 | * @author taedium 12 | */ 13 | public interface GenDialect { 14 | 15 | /** 16 | * 名前を返します。 17 | * 18 | * @return 名前 19 | */ 20 | String getName(); 21 | 22 | /** 23 | * 方言クラス名を返します。 24 | * 25 | * @return 方言クラス名 26 | */ 27 | String getDialectClassName(); 28 | 29 | /** 30 | * デフォルトのスキーマ名を返します。 31 | * 32 | * @param userName ユーザ名 33 | * @return デフォルトのスキーマ名 34 | */ 35 | String getDefaultSchemaName(String userName); 36 | 37 | /** 38 | * カラムにマップされたプロパティのクラス名を返します。 39 | * 40 | * @param columnMeta カラムメタデータ 41 | * @return カラムにマップされたクラス名 42 | */ 43 | String getMappedPropertyClassName(ColumnMeta columnMeta); 44 | 45 | /** 46 | * プロパティのクラス名を置き換えます。 47 | * 48 | * @param oldClassName 古いクラス名 49 | * @param newClassName 新しいクラス名 50 | * @since 1.9.0 51 | */ 52 | void replacePropertyClassName(String oldClassName, String newClassName); 53 | 54 | /** 55 | * アイデンティティをサポートする場合 {@code true} を返します。 56 | * 57 | * @return アイデンティティをサポートする場合 {@code true} 58 | */ 59 | boolean supportsIdentity(); 60 | 61 | /** 62 | * シーケンスをサポートする場合 {@code true} を返します。 63 | * 64 | * @return シーケンスをサポートする場合 {@code true} 65 | */ 66 | boolean supportsSequence(); 67 | 68 | /** 69 | * カラムが自動インクリメントに設定されている場合 {@code true} を返します。 70 | * 71 | * @param connection コネクション 72 | * @param catalogName カタログ名 73 | * @param schemaName スキーマ名 74 | * @param tableName テーブル名 75 | * @param columnName カラム名 76 | * @return カラムが自動インクリメントに設定されている場合 {@code true} 77 | * @throws SQLException SQLに関する例外が発生した場合 78 | */ 79 | boolean isAutoIncrement( 80 | Connection connection, 81 | String catalogName, 82 | String schemaName, 83 | String tableName, 84 | String columnName) 85 | throws SQLException; 86 | 87 | /** 88 | * JDBCによりコメントの取得が不可能な場合 {@code true} を返します。 89 | * 90 | * @return JDBCによりコメントの取得が不可能な場合 {@code true} 91 | */ 92 | boolean isJdbcCommentUnavailable(); 93 | 94 | /** 95 | * テーブルのコメントを取得します。 96 | * 97 | * @param connection コネクション 98 | * @param catalogName カタログ名 99 | * @param schemaName スキーマ名 100 | * @param tableName テーブル名 101 | * @return テーブルのコメント 102 | * @throws SQLException SQLに関する例外が発生した場合 103 | */ 104 | String getTableComment( 105 | Connection connection, String catalogName, String schemaName, String tableName) 106 | throws SQLException; 107 | 108 | /** 109 | * カラムのコメントのマップを取得します。 110 | * 111 | * @param connection コネクション 112 | * @param catalogName カタログ名 113 | * @param schemaName スキーマ名 114 | * @param tableName テーブル名 115 | * @return カラム名をキー、コメントを値とするマップ 116 | * @throws SQLException SQLに関する例外が発生した場合 117 | */ 118 | Map getColumnCommentMap( 119 | Connection connection, String catalogName, String schemaName, String tableName) 120 | throws SQLException; 121 | 122 | /** 123 | * 時刻を表すリテラルを返します。 124 | * 125 | * @param value 値 126 | * @return リテラル 127 | * @since 1.11.0 128 | */ 129 | String convertToTimeLiteral(String value); 130 | 131 | /** 132 | * 日付を表すリテラルを返します。 133 | * 134 | * @param value 値 135 | * @return リテラル 136 | * @since 1.11.0 137 | */ 138 | String convertToDateLiteral(String value); 139 | 140 | /** 141 | * タイムスタンプを表すリテラルを返します。 142 | * 143 | * @param value 値 144 | * @return リテラル 145 | * @since 1.11.0 146 | */ 147 | String convertToTimestampLiteral(String value); 148 | } 149 | -------------------------------------------------------------------------------- /src/main/java/org/seasar/doma/extension/gen/dialect/GenDialectRegistry.java: -------------------------------------------------------------------------------- 1 | package org.seasar.doma.extension.gen.dialect; 2 | 3 | import java.util.ArrayList; 4 | import java.util.Collections; 5 | import java.util.HashMap; 6 | import java.util.List; 7 | import java.util.Map; 8 | import org.seasar.doma.extension.gen.internal.util.AssertionUtil; 9 | 10 | /** 11 | * 方言のレジストリです。 12 | * 13 | * @author taedium 14 | */ 15 | public class GenDialectRegistry { 16 | 17 | /** 方言名をキー、方言を値とするマップ */ 18 | protected static final Map genDialectMap = 19 | Collections.synchronizedMap(new HashMap()); 20 | 21 | static { 22 | register(new StandardGenDialect()); 23 | register(new HsqldbGenDialect()); 24 | register(new H2GenDialect()); 25 | register(new MysqlGenDialect()); 26 | register(new PostgresGenDialect()); 27 | register(new Oracle11GenDialect()); 28 | register(new OracleGenDialect()); 29 | register(new Db2GenDialect()); 30 | register(new Mssql2008GenDialect()); 31 | register(new MssqlGenDialect()); 32 | } 33 | 34 | /** 35 | * 登録します。 36 | * 37 | * @param dialect 方言 38 | */ 39 | public static void register(GenDialect dialect) { 40 | AssertionUtil.assertNotNull(dialect); 41 | genDialectMap.put(dialect.getName(), dialect); 42 | } 43 | 44 | /** 45 | * 検索します。 46 | * 47 | * @param dialectName 方言名 48 | * @return 方言、登録されていなければ {@code null} 49 | */ 50 | public static GenDialect lookup(String dialectName) { 51 | return genDialectMap.get(dialectName); 52 | } 53 | 54 | /** 55 | * 登録されている方言名のリストを返します。 56 | * 57 | * @return 登録されている方言名のリスト 58 | */ 59 | public static List getDialectNames() { 60 | return new ArrayList(genDialectMap.keySet()); 61 | } 62 | } 63 | -------------------------------------------------------------------------------- /src/main/java/org/seasar/doma/extension/gen/dialect/H2GenDialect.java: -------------------------------------------------------------------------------- 1 | package org.seasar.doma.extension.gen.dialect; 2 | 3 | import org.seasar.doma.extension.gen.ClassConstants; 4 | 5 | /** 6 | * H2 Database Engine用の方言です。 7 | * 8 | * @author taedium 9 | */ 10 | public class H2GenDialect extends StandardGenDialect { 11 | 12 | /** インスタンスを構築します。 */ 13 | public H2GenDialect() {} 14 | 15 | @Override 16 | public String getName() { 17 | return "h2"; 18 | } 19 | 20 | @Override 21 | public String getDialectClassName() { 22 | return ClassConstants.H2Dialect.getQualifiedName(); 23 | } 24 | 25 | @Override 26 | public String getDefaultSchemaName(String userName) { 27 | return null; 28 | } 29 | 30 | @Override 31 | public boolean isJdbcCommentUnavailable() { 32 | return true; 33 | } 34 | 35 | @Override 36 | public boolean supportsIdentity() { 37 | return true; 38 | } 39 | 40 | @Override 41 | public boolean supportsSequence() { 42 | return true; 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /src/main/java/org/seasar/doma/extension/gen/dialect/HsqldbGenDialect.java: -------------------------------------------------------------------------------- 1 | package org.seasar.doma.extension.gen.dialect; 2 | 3 | import org.seasar.doma.extension.gen.ClassConstants; 4 | 5 | /** 6 | * HSQLDB用の方言です。 7 | * 8 | * @author taedium 9 | */ 10 | public class HsqldbGenDialect extends StandardGenDialect { 11 | 12 | /** インスタンスを構築します。 */ 13 | public HsqldbGenDialect() { 14 | classNameMap.put("int", Integer.class.getName()); 15 | classNameMap.put("varchar_ignorecase", String.class.getName()); 16 | } 17 | 18 | @Override 19 | public String getName() { 20 | return "hsqldb"; 21 | } 22 | 23 | @Override 24 | public String getDialectClassName() { 25 | return ClassConstants.HsqldbDialect.getQualifiedName(); 26 | } 27 | 28 | @Override 29 | public String getDefaultSchemaName(String userName) { 30 | return null; 31 | } 32 | 33 | @Override 34 | public boolean isJdbcCommentUnavailable() { 35 | return true; 36 | } 37 | 38 | @Override 39 | public boolean supportsIdentity() { 40 | return true; 41 | } 42 | 43 | @Override 44 | public boolean supportsSequence() { 45 | return true; 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /src/main/java/org/seasar/doma/extension/gen/dialect/Mssql2008GenDialect.java: -------------------------------------------------------------------------------- 1 | package org.seasar.doma.extension.gen.dialect; 2 | 3 | import java.math.BigDecimal; 4 | import java.sql.Blob; 5 | import java.sql.Clob; 6 | import java.sql.NClob; 7 | import java.time.LocalDateTime; 8 | import org.seasar.doma.extension.gen.ClassConstants; 9 | import org.seasar.doma.extension.gen.ColumnMeta; 10 | 11 | /** 12 | * SQL Server 2008用の方言です。 13 | * 14 | * @author taedium 15 | */ 16 | public class Mssql2008GenDialect extends StandardGenDialect { 17 | 18 | /** インスタンスを構築します。 */ 19 | public Mssql2008GenDialect() { 20 | classNameMap.put("datetime", LocalDateTime.class.getName()); 21 | classNameMap.put("datetime2", LocalDateTime.class.getName()); 22 | classNameMap.put("datetimeoffset", LocalDateTime.class.getName()); 23 | classNameMap.put("image", Blob.class.getName()); 24 | classNameMap.put("int", Integer.class.getName()); 25 | classNameMap.put("money", BigDecimal.class.getName()); 26 | classNameMap.put("ntext", NClob.class.getName()); 27 | classNameMap.put("smalldatetime", LocalDateTime.class.getName()); 28 | classNameMap.put("smallmoney", BigDecimal.class.getName()); 29 | classNameMap.put("text", Clob.class.getName()); 30 | classNameMap.put("timestamp", ClassConstants.bytes.getQualifiedName()); 31 | classNameMap.put("uniqueidentifier", String.class.getName()); 32 | classNameMap.put("xml", String.class.getName()); 33 | } 34 | 35 | @Override 36 | public String getName() { 37 | return "mssql2008"; 38 | } 39 | 40 | @Override 41 | public String getDialectClassName() { 42 | return ClassConstants.Mssql2008.getQualifiedName(); 43 | } 44 | 45 | @Override 46 | public String getDefaultSchemaName(String userName) { 47 | return "dbo"; 48 | } 49 | 50 | @Override 51 | public boolean supportsIdentity() { 52 | return true; 53 | } 54 | 55 | @Override 56 | public String getMappedPropertyClassName(ColumnMeta columnMeta) { 57 | String typeName = columnMeta.getTypeName(); 58 | if (typeName.startsWith("int")) { 59 | typeName = "int"; 60 | } else if (typeName.startsWith("bigint")) { 61 | typeName = "bigint"; 62 | } else if (typeName.startsWith("smallint")) { 63 | typeName = "smallint"; 64 | } else if (typeName.startsWith("tinyint")) { 65 | typeName = "tinyint"; 66 | } else if (typeName.startsWith("decimal")) { 67 | typeName = "decimal"; 68 | } else if (typeName.startsWith("numeric")) { 69 | typeName = "numeric"; 70 | } 71 | return super.getMappedPropertyClassName(columnMeta); 72 | } 73 | } 74 | -------------------------------------------------------------------------------- /src/main/java/org/seasar/doma/extension/gen/dialect/MssqlGenDialect.java: -------------------------------------------------------------------------------- 1 | package org.seasar.doma.extension.gen.dialect; 2 | 3 | import org.seasar.doma.extension.gen.ClassConstants; 4 | 5 | /** 6 | * SQL Server用の方言です。 7 | * 8 | * @author taedium 9 | * @since 1.30.0 10 | */ 11 | public class MssqlGenDialect extends Mssql2008GenDialect { 12 | 13 | /** インスタンスを構築します。 */ 14 | public MssqlGenDialect() {} 15 | 16 | @Override 17 | public String getName() { 18 | return "mssql"; 19 | } 20 | 21 | @Override 22 | public String getDialectClassName() { 23 | return ClassConstants.Mssql.getQualifiedName(); 24 | } 25 | 26 | @Override 27 | public boolean supportsSequence() { 28 | return true; 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/main/java/org/seasar/doma/extension/gen/dialect/MysqlGenDialect.java: -------------------------------------------------------------------------------- 1 | package org.seasar.doma.extension.gen.dialect; 2 | 3 | import java.math.BigDecimal; 4 | import java.math.BigInteger; 5 | import java.sql.Blob; 6 | import java.time.LocalDate; 7 | import java.time.LocalDateTime; 8 | import java.time.LocalTime; 9 | import org.seasar.doma.extension.gen.ClassConstants; 10 | import org.seasar.doma.extension.gen.ColumnMeta; 11 | 12 | /** 13 | * MySQL用の方言です。 14 | * 15 | * @author taedium 16 | */ 17 | public class MysqlGenDialect extends StandardGenDialect { 18 | 19 | /** 20 | * インスタンスを構築します。 21 | * 22 | * @see MySQL 5.6 リファレンスマニュアル / 23 | * データ型 24 | * @see MySQL 26 | * Connector/J Developer Guide / Java, JDBC and MySQL Types 27 | */ 28 | public MysqlGenDialect() { 29 | // 数値型 30 | classNameMap.put("bool", Boolean.class.getName()); 31 | classNameMap.put("boolean", Boolean.class.getName()); 32 | classNameMap.put("smallint", Short.class.getName()); 33 | classNameMap.put("smallint unsigned", Integer.class.getName()); 34 | classNameMap.put("mediumint", Integer.class.getName()); 35 | classNameMap.put("mediumint unsigned", Integer.class.getName()); 36 | classNameMap.put("int", Integer.class.getName()); 37 | classNameMap.put("int unsigned", Long.class.getName()); 38 | classNameMap.put("integer", Integer.class.getName()); 39 | classNameMap.put("integer unsigned", Long.class.getName()); 40 | classNameMap.put("bigint", Long.class.getName()); 41 | classNameMap.put("bigint unsigned", BigInteger.class.getName()); 42 | classNameMap.put("serial", BigInteger.class.getName()); 43 | classNameMap.put("decimal", BigDecimal.class.getName()); 44 | classNameMap.put("decimal unsigned", BigDecimal.class.getName()); 45 | classNameMap.put("dec", BigDecimal.class.getName()); 46 | classNameMap.put("dec unsigned", BigDecimal.class.getName()); 47 | classNameMap.put("float", Float.class.getName()); 48 | classNameMap.put("float unsigned", Float.class.getName()); 49 | classNameMap.put("double", Double.class.getName()); 50 | classNameMap.put("double unsigned", Double.class.getName()); 51 | classNameMap.put("double precision", Double.class.getName()); 52 | classNameMap.put("double precision unsigned", Double.class.getName()); 53 | 54 | // 日付と時間型 55 | classNameMap.put("date", LocalDate.class.getName()); 56 | classNameMap.put("datetime", LocalDateTime.class.getName()); 57 | classNameMap.put("timestamp", LocalDateTime.class.getName()); 58 | classNameMap.put("time", LocalTime.class.getName()); 59 | classNameMap.put("year", Short.class.getName()); 60 | 61 | // BLOB型 62 | classNameMap.put("tinyblob", Blob.class.getName()); 63 | classNameMap.put("blob", Blob.class.getName()); 64 | classNameMap.put("mediumblob", Blob.class.getName()); 65 | classNameMap.put("longblob", Blob.class.getName()); 66 | 67 | // BINARYおよびVARBINARY型 68 | classNameMap.put("binary", ClassConstants.bytes.getQualifiedName()); 69 | classNameMap.put("varbinary", ClassConstants.bytes.getQualifiedName()); 70 | } 71 | 72 | @Override 73 | public String getName() { 74 | return "mysql"; 75 | } 76 | 77 | @Override 78 | public String getDialectClassName() { 79 | return ClassConstants.MysqlDialect.getQualifiedName(); 80 | } 81 | 82 | @Override 83 | public String getMappedPropertyClassName(ColumnMeta columnMeta) { 84 | if ("bit".equals(columnMeta.getTypeName()) || "tinyint".equals(columnMeta.getTypeName())) { 85 | return columnMeta.getLength() <= 1 ? Boolean.class.getName() : Byte.class.getName(); 86 | } 87 | if ("tinyint unsigned".equals(columnMeta.getTypeName())) { 88 | return columnMeta.getLength() <= 1 ? Boolean.class.getName() : Short.class.getName(); 89 | } 90 | return super.getMappedPropertyClassName(columnMeta); 91 | } 92 | 93 | @Override 94 | public boolean supportsIdentity() { 95 | return true; 96 | } 97 | 98 | @Override 99 | public boolean supportsSequence() { 100 | return true; 101 | } 102 | } 103 | -------------------------------------------------------------------------------- /src/main/java/org/seasar/doma/extension/gen/dialect/OracleGenDialect.java: -------------------------------------------------------------------------------- 1 | package org.seasar.doma.extension.gen.dialect; 2 | 3 | import org.seasar.doma.extension.gen.ClassConstants; 4 | 5 | /** Oracle Database用の方言です。 */ 6 | public class OracleGenDialect extends Oracle11GenDialect { 7 | 8 | @Override 9 | public String getName() { 10 | return "oracle"; 11 | } 12 | 13 | @Override 14 | public String getDialectClassName() { 15 | return ClassConstants.OracleDialect.getQualifiedName(); 16 | } 17 | 18 | @Override 19 | public boolean supportsIdentity() { 20 | return true; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/org/seasar/doma/extension/gen/dialect/PostgresGenDialect.java: -------------------------------------------------------------------------------- 1 | package org.seasar.doma.extension.gen.dialect; 2 | 3 | import java.sql.Blob; 4 | import java.time.LocalDateTime; 5 | import java.time.LocalTime; 6 | import org.seasar.doma.extension.gen.ClassConstants; 7 | 8 | /** 9 | * PostgreSQL用の方言です。 10 | * 11 | * @author taedium 12 | */ 13 | public class PostgresGenDialect extends StandardGenDialect { 14 | 15 | /** インスタンスを構築します。 */ 16 | public PostgresGenDialect() { 17 | classNameMap.put("bigserial", Long.class.getName()); 18 | classNameMap.put("bit", ClassConstants.bytes.getQualifiedName()); 19 | classNameMap.put("bool", Boolean.class.getName()); 20 | classNameMap.put("bpchar", String.class.getName()); 21 | classNameMap.put("bytea", ClassConstants.bytes.getQualifiedName()); 22 | classNameMap.put("float4", Float.class.getName()); 23 | classNameMap.put("float8", Double.class.getName()); 24 | classNameMap.put("int2", Short.class.getName()); 25 | classNameMap.put("int4", Integer.class.getName()); 26 | classNameMap.put("int8", Long.class.getName()); 27 | classNameMap.put("money", Float.class.getName()); 28 | classNameMap.put("oid", Blob.class.getName()); 29 | classNameMap.put("serial", Integer.class.getName()); 30 | classNameMap.put("text", String.class.getName()); 31 | classNameMap.put("timestamptz", LocalDateTime.class.getName()); 32 | classNameMap.put("timetz", LocalTime.class.getName()); 33 | classNameMap.put("varbit", ClassConstants.bytes.getQualifiedName()); 34 | classNameMap.put("varchar", String.class.getName()); 35 | } 36 | 37 | @Override 38 | public String getName() { 39 | return "postgres"; 40 | } 41 | 42 | @Override 43 | public String getDialectClassName() { 44 | return ClassConstants.PostgresDialect.getQualifiedName(); 45 | } 46 | 47 | @Override 48 | public String getDefaultSchemaName(String userName) { 49 | return null; 50 | } 51 | 52 | @Override 53 | public boolean supportsIdentity() { 54 | return true; 55 | } 56 | 57 | @Override 58 | public boolean supportsSequence() { 59 | return true; 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /src/main/java/org/seasar/doma/extension/gen/dialect/package-info.java: -------------------------------------------------------------------------------- 1 | /** RDBMS の Doma-Gen用の方言を提供します。 */ 2 | package org.seasar.doma.extension.gen.dialect; 3 | -------------------------------------------------------------------------------- /src/main/java/org/seasar/doma/extension/gen/internal/Artifact.java: -------------------------------------------------------------------------------- 1 | package org.seasar.doma.extension.gen.internal; 2 | 3 | /** @author taedium */ 4 | public class Artifact { 5 | 6 | private static final String NAME = "Doma-Gen"; 7 | 8 | private static final String VERSION = "2.28.1-SNAPSHOT"; 9 | 10 | public static String getName() { 11 | return NAME; 12 | } 13 | 14 | public static String getVersion() { 15 | return VERSION; 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/org/seasar/doma/extension/gen/internal/message/AbstractMessageResourceBundle.java: -------------------------------------------------------------------------------- 1 | package org.seasar.doma.extension.gen.internal.message; 2 | 3 | import java.util.Collections; 4 | import java.util.EnumSet; 5 | import java.util.Enumeration; 6 | import java.util.LinkedList; 7 | import java.util.List; 8 | import java.util.ResourceBundle; 9 | import org.seasar.doma.extension.gen.GenNullPointerException; 10 | import org.seasar.doma.extension.gen.MessageResource; 11 | 12 | /** 13 | * {@link Enum} で表現されたメッセージコードを扱うリソースバンドルです。 14 | * 15 | * @author taedium 16 | */ 17 | public abstract class AbstractMessageResourceBundle & MessageResource> 18 | extends ResourceBundle { 19 | 20 | protected final Class messageCodeClass; 21 | 22 | public AbstractMessageResourceBundle(Class messageCodeClass) { 23 | if (messageCodeClass == null) { 24 | throw new GenNullPointerException("messageCodeClass"); 25 | } 26 | this.messageCodeClass = messageCodeClass; 27 | } 28 | 29 | @Override 30 | public Enumeration getKeys() { 31 | List keys = new LinkedList(); 32 | for (M messageCode : EnumSet.allOf(messageCodeClass)) { 33 | keys.add(messageCode.getCode()); 34 | } 35 | return Collections.enumeration(keys); 36 | } 37 | 38 | @Override 39 | protected Object handleGetObject(String key) { 40 | if (key == null) { 41 | throw new GenNullPointerException("key"); 42 | } 43 | M messageCode = Enum.valueOf(messageCodeClass, key); 44 | return messageCode.getMessagePattern(); 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /src/main/java/org/seasar/doma/extension/gen/internal/message/GenMessageResourceBundle.java: -------------------------------------------------------------------------------- 1 | package org.seasar.doma.extension.gen.internal.message; 2 | 3 | /** 4 | * {@link DomaMessageCode} を扱うリソースバンドルです。 5 | * 6 | * @author taedium 7 | */ 8 | public class GenMessageResourceBundle extends AbstractMessageResourceBundle { 9 | 10 | /** インスタンスを構築します。 */ 11 | public GenMessageResourceBundle() { 12 | super(Message.class); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/main/java/org/seasar/doma/extension/gen/internal/message/Message.java: -------------------------------------------------------------------------------- 1 | package org.seasar.doma.extension.gen.internal.message; 2 | 3 | import org.seasar.doma.extension.gen.MessageResource; 4 | 5 | /** @author taedium */ 6 | public enum Message implements MessageResource { 7 | DOMAGEN0001("The parameter \"{0}\" is null."), 8 | DOMAGEN0003("GenerationType.IDENTITY is not supported for the RDBMS \"{0}\"."), 9 | DOMAGEN0004("GenerationType.SEQUENCE is not supported for the RDBMS \"{0}\"."), 10 | DOMAGEN0005( 11 | "Cannot get any tables. Check parameters such as url, dialectName, tableNamePattern and so on."), 12 | DOMAGEN0007("The mandatory parameter \"{0}\" is not specified."), 13 | DOMAGEN0013("The class \"{1}\" to which the parameter \"{0}\" refers is not found. {2}"), 14 | DOMAGEN0014( 15 | "The class \"{1}\" to which the parameter \"{0}\" refers must be a subtype of the class \"{2}\"."), 16 | DOMAGEN0015( 17 | "The class \"{1}\" to which the parameter \"{0}\" refers cannot be instantiated. The class \"{1}\" must have a public default constructor. {2}"), 18 | DOMAGEN0017("The class \"{0}\" is used as a dialect class."), 19 | DOMAGEN0018( 20 | "The column \"{1}\" of the table \"{0}\" is not mapped to any Java classes. So it will be mapped to java.lang.String. (The column data type is {2} and the JDBC SQL type is {3})"), 21 | DOMAGEN0019("The file is created. {0}"), 22 | DOMAGEN0020("The file is overwritten. {0}"), 23 | DOMAGEN0021( 24 | "The column \"{2}\" which corresponds to the property \"{1}\" of the entity class \"{0}\" is not defined in the table \"{3}\"."), 25 | DOMAGEN0022( 26 | "Cannot infer the property \"{1}\" from the property \"{0}\". Specify the property \"{1}\" explicitly."), 27 | 28 | DOMAGEN5001( 29 | "The JDBC driver may not be loaded. Check that the JDBC driver is in the classpath. If the JDBC driver is not loaded automatically, load it explicitly using Class.forName. ex) Class.forName(\"oracle.jdbc.driver.OracleDriver\")"), 30 | DOMAGEN5002("The url parameter is not specified."), 31 | 32 | DOMAGEN9001("The exception was thrown. {0}"), 33 | ; 34 | 35 | private final String messagePattern; 36 | 37 | private Message(String messagePattern) { 38 | this.messagePattern = messagePattern; 39 | } 40 | 41 | @Override 42 | public String getCode() { 43 | return name(); 44 | } 45 | 46 | @Override 47 | public String getMessagePattern() { 48 | return messagePattern; 49 | } 50 | 51 | @Override 52 | public String getMessage(Object... args) { 53 | return MessageFormatter.getMessage(this, args); 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /src/main/java/org/seasar/doma/extension/gen/internal/message/MessageFormatter.java: -------------------------------------------------------------------------------- 1 | package org.seasar.doma.extension.gen.internal.message; 2 | 3 | import java.text.MessageFormat; 4 | import java.util.ResourceBundle; 5 | import org.seasar.doma.extension.gen.MessageResource; 6 | 7 | /** @author taedium */ 8 | final class MessageFormatter { 9 | 10 | public static String getMessage(MessageResource messageResource, Object... args) { 11 | ResourceBundle bundle = ResourceBundle.getBundle(GenMessageResourceBundle.class.getName()); 12 | String pattern = bundle.getString(messageResource.getCode()); 13 | return MessageFormat.format("[" + messageResource.getCode() + "] " + pattern, args); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/org/seasar/doma/extension/gen/internal/util/AssertionUtil.java: -------------------------------------------------------------------------------- 1 | package org.seasar.doma.extension.gen.internal.util; 2 | 3 | public final class AssertionUtil { 4 | 5 | public static void assertNull(Object o) { 6 | if (o != null) { 7 | throw new AssertionError("Not null."); 8 | } 9 | } 10 | 11 | public static void assertNotNull(Object o) { 12 | if (o == null) { 13 | throw new AssertionError("Null."); 14 | } 15 | } 16 | 17 | public static void assertNotNull(Object o, Object o1) { 18 | if (o == null) { 19 | throw new AssertionError("Null. index = 0"); 20 | } 21 | if (o1 == null) { 22 | throw new AssertionError("Null. index = 1"); 23 | } 24 | } 25 | 26 | public static void assertNotNull(Object o, Object o1, Object o2) { 27 | if (o == null) { 28 | throw new AssertionError("Null. index = 0"); 29 | } 30 | if (o1 == null) { 31 | throw new AssertionError("Null. index = 1"); 32 | } 33 | if (o2 == null) { 34 | throw new AssertionError("Null. index = 2"); 35 | } 36 | } 37 | 38 | public static void assertNotNull(Object o, Object o1, Object o2, Object o3) { 39 | if (o == null) { 40 | throw new AssertionError("Null. index = 0"); 41 | } 42 | if (o1 == null) { 43 | throw new AssertionError("Null. index = 1"); 44 | } 45 | if (o2 == null) { 46 | throw new AssertionError("Null. index = 2"); 47 | } 48 | if (o3 == null) { 49 | throw new AssertionError("Null. index = 3"); 50 | } 51 | } 52 | 53 | public static void assertNotNull(Object o, Object o1, Object o2, Object o3, Object o4) { 54 | if (o == null) { 55 | throw new AssertionError("Null. index = 0"); 56 | } 57 | if (o1 == null) { 58 | throw new AssertionError("Null. index = 1"); 59 | } 60 | if (o2 == null) { 61 | throw new AssertionError("Null. index = 2"); 62 | } 63 | if (o3 == null) { 64 | throw new AssertionError("Null. index = 3"); 65 | } 66 | if (o4 == null) { 67 | throw new AssertionError("Null. index = 4"); 68 | } 69 | } 70 | 71 | public static void assertNotNull(Object o, Object... objects) { 72 | if (o == null) { 73 | throw new AssertionError("Null. index = 0"); 74 | } 75 | for (int i = 0; i < objects.length; i++) { 76 | Object object = objects[i]; 77 | if (object == null) { 78 | throw new AssertionError("Null. index = " + (i + 1)); 79 | } 80 | } 81 | } 82 | 83 | public static void assertTrue(boolean evalResult, Object... messages) { 84 | if (!evalResult) { 85 | StringBuilder buf = new StringBuilder(); 86 | for (Object message : messages) { 87 | buf.append(message.toString()); 88 | buf.append(", "); 89 | } 90 | if (buf.length() > 0) { 91 | buf.setLength(buf.length() - 2); 92 | } 93 | throw new AssertionError("Unfulfilled. " + buf.toString()); 94 | } 95 | } 96 | 97 | public static void assertEquals(T expected, T actual) { 98 | if (expected == null) { 99 | if (actual != null) { 100 | throw new AssertionError("Not equals. expected is null, but actual is [" + actual + "]"); 101 | } 102 | } 103 | if (!expected.equals(actual)) { 104 | throw new AssertionError( 105 | "Not equals. expected is [" + expected + "], but actual is [" + actual + "]"); 106 | } 107 | } 108 | 109 | public static T assertUnreachable() { 110 | throw new AssertionError("Unreachable."); 111 | } 112 | 113 | public static void notYetImplemented() { 114 | throw new AssertionError("Not yet implemented."); 115 | } 116 | } 117 | -------------------------------------------------------------------------------- /src/main/java/org/seasar/doma/extension/gen/internal/util/ClassUtil.java: -------------------------------------------------------------------------------- 1 | package org.seasar.doma.extension.gen.internal.util; 2 | 3 | /** @author taedium */ 4 | public final class ClassUtil { 5 | 6 | public static String getPackageName(String qualifiedName) { 7 | AssertionUtil.assertNotNull(qualifiedName); 8 | int pos = qualifiedName.lastIndexOf('.'); 9 | if (pos < 0) { 10 | return ""; 11 | } 12 | return qualifiedName.substring(0, pos); 13 | } 14 | 15 | public static String getSimpleName(String qualifiedName) { 16 | AssertionUtil.assertNotNull(qualifiedName); 17 | int pos = qualifiedName.lastIndexOf('.'); 18 | if (pos < 0) { 19 | return qualifiedName; 20 | } 21 | return qualifiedName.substring(pos + 1); 22 | } 23 | 24 | public static Class toBoxedPrimitiveTypeIfPossible(Class clazz) { 25 | AssertionUtil.assertNotNull(clazz); 26 | if (clazz == void.class) { 27 | return Void.class; 28 | } 29 | if (clazz == char.class) { 30 | return Character.class; 31 | } 32 | if (clazz == boolean.class) { 33 | return Boolean.class; 34 | } 35 | if (clazz == byte.class) { 36 | return Byte.class; 37 | } 38 | if (clazz == short.class) { 39 | return Short.class; 40 | } 41 | if (clazz == int.class) { 42 | return Integer.class; 43 | } 44 | if (clazz == long.class) { 45 | return Long.class; 46 | } 47 | if (clazz == float.class) { 48 | return Float.class; 49 | } 50 | if (clazz == double.class) { 51 | return Double.class; 52 | } 53 | return clazz; 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /src/main/java/org/seasar/doma/extension/gen/internal/util/FileUtil.java: -------------------------------------------------------------------------------- 1 | package org.seasar.doma.extension.gen.internal.util; 2 | 3 | import java.io.File; 4 | import java.io.IOException; 5 | import org.seasar.doma.extension.gen.GenException; 6 | import org.seasar.doma.extension.gen.internal.message.Message; 7 | 8 | /** @author taedium */ 9 | public final class FileUtil { 10 | 11 | public static String getCanonicalPath(File file) { 12 | try { 13 | return file.getCanonicalPath(); 14 | } catch (IOException e) { 15 | throw new GenException(Message.DOMAGEN9001, e, e); 16 | } 17 | } 18 | 19 | public static File createJavaFile(File baseDir, String className) { 20 | AssertionUtil.assertNotNull(baseDir, className); 21 | String javaFilePath = className.replace('.', File.separatorChar) + ".java"; 22 | return new File(baseDir, javaFilePath); 23 | } 24 | 25 | public static File createSqlDir(File baseDir, String className, String fileName) { 26 | AssertionUtil.assertNotNull(baseDir, className); 27 | File metaInfDir = new File(baseDir, "META-INF"); 28 | File dir = new File(metaInfDir, className.replace('.', File.separatorChar)); 29 | return new File(dir, fileName); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /src/main/java/org/seasar/doma/extension/gen/internal/util/IOUtil.java: -------------------------------------------------------------------------------- 1 | package org.seasar.doma.extension.gen.internal.util; 2 | 3 | import java.io.BufferedReader; 4 | import java.io.Closeable; 5 | import java.io.File; 6 | import java.io.FileInputStream; 7 | import java.io.FileNotFoundException; 8 | import java.io.IOException; 9 | import java.io.InputStream; 10 | import java.io.InputStreamReader; 11 | import java.nio.CharBuffer; 12 | import java.nio.charset.Charset; 13 | import org.seasar.doma.extension.gen.GenException; 14 | import org.seasar.doma.extension.gen.internal.message.Message; 15 | 16 | /** @author taedium */ 17 | public final class IOUtil { 18 | 19 | protected static final int BUF_SIZE = 8192; 20 | 21 | public static String readAsString(InputStream inputStream) { 22 | AssertionUtil.assertNotNull(inputStream); 23 | BufferedReader reader = 24 | new BufferedReader(new InputStreamReader(inputStream, Charset.forName("UTF-8"))); 25 | StringBuilder buf = new StringBuilder(200); 26 | try { 27 | CharBuffer c = CharBuffer.allocate(BUF_SIZE); 28 | while (reader.read(c) > -1) { 29 | c.flip(); 30 | buf.append(c); 31 | c.clear(); 32 | } 33 | } catch (IOException e) { 34 | throw new GenException(Message.DOMAGEN9001, e, e); 35 | } finally { 36 | IOUtil.close(reader); 37 | } 38 | return buf.toString(); 39 | } 40 | 41 | public static String readAsString(File file) { 42 | AssertionUtil.assertNotNull(file); 43 | InputStream inputStream = null; 44 | try { 45 | inputStream = new FileInputStream(file); 46 | return readAsString(inputStream); 47 | } catch (FileNotFoundException e) { 48 | throw new GenException(Message.DOMAGEN9001, e, e); 49 | } finally { 50 | IOUtil.close(inputStream); 51 | } 52 | } 53 | 54 | public static void close(Closeable closeable) { 55 | if (closeable != null) { 56 | try { 57 | closeable.close(); 58 | } catch (IOException ignored) { 59 | } 60 | } 61 | } 62 | } 63 | -------------------------------------------------------------------------------- /src/main/java/org/seasar/doma/extension/gen/internal/util/JdbcUtil.java: -------------------------------------------------------------------------------- 1 | package org.seasar.doma.extension.gen.internal.util; 2 | 3 | import java.sql.Connection; 4 | import java.sql.PreparedStatement; 5 | import java.sql.ResultSet; 6 | import java.sql.SQLException; 7 | import java.sql.Statement; 8 | import java.util.function.Function; 9 | import java.util.regex.Matcher; 10 | import java.util.regex.Pattern; 11 | import javax.sql.DataSource; 12 | import org.seasar.doma.extension.gen.GenException; 13 | import org.seasar.doma.extension.gen.GenNullPointerException; 14 | import org.seasar.doma.extension.gen.Logger; 15 | import org.seasar.doma.extension.gen.internal.message.Message; 16 | 17 | /** @author taedium */ 18 | public final class JdbcUtil { 19 | 20 | protected static final Pattern jdbcUrlPattern = Pattern.compile("jdbc:([^:]+):"); 21 | 22 | public static Connection getConnection(DataSource dataSource) { 23 | try { 24 | return dataSource.getConnection(); 25 | } catch (SQLException e) { 26 | throw new GenException(Message.DOMAGEN9001, e, e); 27 | } 28 | } 29 | 30 | public static Statement createStatement(Connection connection) { 31 | try { 32 | return connection.createStatement(); 33 | } catch (SQLException e) { 34 | throw new GenException(Message.DOMAGEN9001, e, e); 35 | } 36 | } 37 | 38 | public static PreparedStatement prepareStatement(Connection connection, String sql) { 39 | try { 40 | return connection.prepareStatement(sql); 41 | } catch (SQLException e) { 42 | throw new GenException(Message.DOMAGEN9001, e, e); 43 | } 44 | } 45 | 46 | public static void close(Connection connection) { 47 | if (connection != null) { 48 | try { 49 | connection.close(); 50 | } catch (SQLException e) { 51 | Logger.debug(e); 52 | } 53 | } 54 | } 55 | 56 | public static void close(Statement statement) { 57 | if (statement != null) { 58 | try { 59 | statement.close(); 60 | } catch (SQLException e) { 61 | Logger.debug(e); 62 | } 63 | } 64 | } 65 | 66 | public static void close(ResultSet resultSet) { 67 | if (resultSet != null) { 68 | try { 69 | resultSet.close(); 70 | } catch (SQLException e) { 71 | Logger.debug(e); 72 | } 73 | } 74 | } 75 | 76 | public static String inferDialectName(String url) { 77 | return match( 78 | url, 79 | name -> { 80 | switch (name) { 81 | case "h2": 82 | return "h2"; 83 | case "hsqldb": 84 | return "hsqldb"; 85 | case "sqlite": 86 | return "sqlite"; 87 | case "mysql": 88 | return "mysql"; 89 | case "postgresql": 90 | return "postgres"; 91 | case "sqlserver": 92 | return "mssql"; 93 | case "oracle": 94 | return "oracle"; 95 | case "db2": 96 | return "db2"; 97 | default: 98 | return null; 99 | } 100 | }); 101 | } 102 | 103 | public static String inferDriverClassName(String url) { 104 | return match( 105 | url, 106 | name -> { 107 | switch (name) { 108 | case "h2": 109 | return "org.h2.Driver"; 110 | case "hsqldb": 111 | return "org.hsqldb.jdbc.JDBCDriver"; 112 | case "sqlite": 113 | return "org.sqlite.JDBC"; 114 | case "mysql": 115 | return "com.mysql.jdbc.Driver"; 116 | case "postgresql": 117 | return "org.postgresql.Driver"; 118 | case "sqlserver": 119 | return "com.microsoft.sqlserver.jdbc.SQLServerDriver"; 120 | case "oracle": 121 | return "oracle.jdbc.driver.OracleDriver"; 122 | case "db2": 123 | return "com.ibm.db2.jcc.DB2Driver"; 124 | default: 125 | return null; 126 | } 127 | }); 128 | } 129 | 130 | protected static R match(String url, Function mapper) { 131 | if (url == null) { 132 | throw new GenNullPointerException("url"); 133 | } 134 | Matcher matcher = jdbcUrlPattern.matcher(url); 135 | if (matcher.lookingAt()) { 136 | String name = matcher.group(1); 137 | return mapper.apply(name); 138 | } 139 | return null; 140 | } 141 | } 142 | -------------------------------------------------------------------------------- /src/main/java/org/seasar/doma/extension/gen/internal/util/Pair.java: -------------------------------------------------------------------------------- 1 | package org.seasar.doma.extension.gen.internal.util; 2 | 3 | /** @author nakamura-to */ 4 | public class Pair { 5 | 6 | private final FIRST first; 7 | 8 | private final SECOND second; 9 | 10 | /** 11 | * @param first 12 | * @param second 13 | */ 14 | public Pair(FIRST first, SECOND second) { 15 | super(); 16 | this.first = first; 17 | this.second = second; 18 | } 19 | 20 | public FIRST getFirst() { 21 | return first; 22 | } 23 | 24 | public SECOND getSecond() { 25 | return second; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/main/java/org/seasar/doma/extension/gen/internal/util/ResourceUtil.java: -------------------------------------------------------------------------------- 1 | package org.seasar.doma.extension.gen.internal.util; 2 | 3 | import java.io.File; 4 | import java.io.IOException; 5 | import java.io.InputStream; 6 | import java.io.UnsupportedEncodingException; 7 | import java.net.URL; 8 | import java.net.URLDecoder; 9 | import org.seasar.doma.extension.gen.GenException; 10 | import org.seasar.doma.extension.gen.internal.message.Message; 11 | 12 | /** @author taedium */ 13 | public final class ResourceUtil { 14 | 15 | public static URL getResource(String path) { 16 | AssertionUtil.assertNotNull(path); 17 | URL result = ResourceUtil.class.getResource("/" + path); 18 | if (result != null) { 19 | return result; 20 | } 21 | ClassLoader loader = Thread.currentThread().getContextClassLoader(); 22 | if (loader == null) { 23 | return null; 24 | } 25 | return loader.getResource(path); 26 | } 27 | 28 | public static InputStream getResourceAsStream(String path) { 29 | AssertionUtil.assertNotNull(path); 30 | URL url = getResource(path); 31 | try { 32 | return url != null ? url.openStream() : null; 33 | } catch (IOException e) { 34 | return null; 35 | } 36 | } 37 | 38 | public static String getResourceAsString(String path) { 39 | AssertionUtil.assertNotNull(path); 40 | AssertionUtil.assertTrue(path.length() > 0); 41 | InputStream inputStream = getResourceAsStream(path); 42 | if (inputStream == null) { 43 | return null; 44 | } 45 | return IOUtil.readAsString(inputStream); 46 | } 47 | 48 | public static File getResourceAsFile(String path) { 49 | AssertionUtil.assertNotNull(path); 50 | URL url = getResource(path); 51 | if (url == null) { 52 | return null; 53 | } 54 | return getFile(url); 55 | } 56 | 57 | protected static File getFile(URL url) { 58 | AssertionUtil.assertNotNull(url); 59 | File file = new File(getFileName(url)); 60 | if (file.exists()) { 61 | return file; 62 | } 63 | return null; 64 | } 65 | 66 | protected static String getFileName(URL url) { 67 | AssertionUtil.assertNotNull(url); 68 | String s = url.getFile(); 69 | try { 70 | return URLDecoder.decode(s, "UTF-8"); 71 | } catch (final UnsupportedEncodingException e) { 72 | throw new GenException(Message.DOMAGEN9001, e, e); 73 | } 74 | } 75 | } 76 | -------------------------------------------------------------------------------- /src/main/java/org/seasar/doma/extension/gen/internal/util/StringUtil.java: -------------------------------------------------------------------------------- 1 | package org.seasar.doma.extension.gen.internal.util; 2 | 3 | import java.nio.CharBuffer; 4 | 5 | /** 6 | * {@link String} のユーティリティクラスです。 7 | * 8 | * @author taedium 9 | */ 10 | public final class StringUtil { 11 | 12 | /** 13 | * 先頭の文字を大文字に変換します。 14 | * 15 | * @param text 文字列 16 | * @return 変換された文字列。 ただし、{@code text} が {@code null} の場合は {@code null}、 {@code text} 17 | * が空文字の場合は空文字を返します。 18 | */ 19 | public static String capitalize(String text) { 20 | if (isNullOrEmpty(text)) { 21 | return text; 22 | } 23 | char chars[] = text.toCharArray(); 24 | chars[0] = Character.toUpperCase(chars[0]); 25 | return new String(chars); 26 | } 27 | 28 | /** 29 | * 先頭の文字を小文字に変換します。 30 | * 31 | * @param text 文字列 32 | * @return 変換された文字列。 ただし、{@code text} が {@code null} の場合は {@code null}、 {@code text} 33 | * が空文字の場合は空文字を返します。 34 | */ 35 | public static String decapitalize(String text) { 36 | if (isNullOrEmpty(text)) { 37 | return text; 38 | } 39 | char chars[] = text.toCharArray(); 40 | chars[0] = Character.toLowerCase(chars[0]); 41 | return new String(chars); 42 | } 43 | 44 | /** 45 | * アンダースコア区切りの文字列をキャメルケースの文字列に変換します。 46 | * 47 | * @param text 文字列 48 | * @return 変換された文字列。 ただし、{@code text} が {@code null} の場合は {@code null}、 {@code text} 49 | * が空文字の場合は空文字を返します。 50 | */ 51 | public static String fromSnakeCaseToCamelCase(String text) { 52 | if (isNullOrEmpty(text)) { 53 | return text; 54 | } 55 | String[] array = text.split("_"); 56 | if (array.length == 0) { 57 | return ""; 58 | } 59 | StringBuilder result = new StringBuilder(); 60 | result.append(array[0].toLowerCase()); 61 | for (int i = 1; i < array.length; i++) { 62 | String s = capitalize(array[i].toLowerCase()); 63 | result.append(s); 64 | } 65 | return result.toString(); 66 | } 67 | 68 | /** 69 | * キャメルケースをアンダースコア区切りの大文字に変換します。 70 | * 71 | * @param text 文字列 72 | * @return 変換された文字列。 ただし、{@code text} が {@code null} の場合は {@code null}、 {@code text} 73 | * が空文字の場合は空文字を返します。 74 | */ 75 | public static String fromCamelCaseToSnakeCase(String text) { 76 | if (isNullOrEmpty(text)) { 77 | return text; 78 | } 79 | StringBuilder result = new StringBuilder(); 80 | CharBuffer buf = CharBuffer.wrap(text); 81 | while (buf.hasRemaining()) { 82 | char c = buf.get(); 83 | result.append(Character.toLowerCase(c)); 84 | buf.mark(); 85 | if (buf.hasRemaining()) { 86 | char c2 = buf.get(); 87 | if (Character.isLowerCase(c) && Character.isUpperCase(c2)) { 88 | result.append("_"); 89 | } 90 | buf.reset(); 91 | } 92 | } 93 | return result.toString(); 94 | } 95 | 96 | /** 97 | * {@code null} もしくは空文字の場合 {@code true} を返します。 98 | * 99 | * @param text 文字列 100 | * @return {@code text} が {@code null} もしくは空文字の場合 {@code true} 101 | */ 102 | public static boolean isNullOrEmpty(String text) { 103 | return text == null || text.isEmpty(); 104 | } 105 | 106 | /** 107 | * {@code str} が {@code null} の場合 {@code defaultStr} を返します。 108 | * 109 | * @param str 文字列 110 | * @param defaultStr nullの場合のデフォルト文字列 111 | * @return 文字列 112 | */ 113 | public static String defaultString(final String str, final String defaultStr) { 114 | return str == null ? defaultStr : str; 115 | } 116 | } 117 | -------------------------------------------------------------------------------- /src/main/java/org/seasar/doma/extension/gen/internal/util/TableUtil.java: -------------------------------------------------------------------------------- 1 | package org.seasar.doma.extension.gen.internal.util; 2 | 3 | /** @author taedium */ 4 | public final class TableUtil { 5 | 6 | public static String getQualifiedTableName( 7 | String catalogName, String schemaName, String tableName) { 8 | StringBuilder buf = new StringBuilder(); 9 | if (catalogName != null && !catalogName.isEmpty()) { 10 | buf.append(catalogName).append("."); 11 | } 12 | if (schemaName != null && !schemaName.isEmpty()) { 13 | buf.append(schemaName).append("."); 14 | } 15 | return buf.append(tableName).toString(); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/org/seasar/doma/extension/gen/package-info.java: -------------------------------------------------------------------------------- 1 | /** データモデルやデータモデルのファクトリクラスを提供します。 */ 2 | package org.seasar.doma.extension.gen; 3 | -------------------------------------------------------------------------------- /src/main/java/org/seasar/doma/extension/gen/task/AbstractTask.java: -------------------------------------------------------------------------------- 1 | package org.seasar.doma.extension.gen.task; 2 | 3 | import java.io.PrintWriter; 4 | import java.io.StringWriter; 5 | import org.apache.tools.ant.BuildException; 6 | import org.apache.tools.ant.Task; 7 | import org.seasar.doma.extension.gen.GenException; 8 | import org.seasar.doma.extension.gen.GlobalFactory; 9 | import org.seasar.doma.extension.gen.Logger; 10 | import org.seasar.doma.extension.gen.internal.message.Message; 11 | import org.seasar.doma.extension.gen.internal.util.AssertionUtil; 12 | 13 | /** 14 | * {@link Task} の抽象クラスです。 15 | * 16 | * @author taedium 17 | */ 18 | public abstract class AbstractTask extends Task { 19 | 20 | /** グローバルファクトリのクラス名 */ 21 | protected String globalFactoryClassName = GlobalFactory.class.getName(); 22 | 23 | /** グローバルファクトリ */ 24 | protected GlobalFactory globalFactory; 25 | 26 | /** 27 | * グローバルファクトリのクラス名を設定します。 28 | * 29 | * @param globalFactoryClassName グローバルファクトリのクラス名 30 | */ 31 | public void setGlobalFactoryClassName(String globalFactoryClassName) { 32 | this.globalFactoryClassName = globalFactoryClassName; 33 | } 34 | 35 | /** インスタンスを構築します。 */ 36 | protected AbstractTask() {} 37 | 38 | @Override 39 | public void execute() throws BuildException { 40 | Logger.setDelegate(new TaskLoggerDelegate(this)); 41 | Logger.debug("start task"); 42 | try { 43 | validate(); 44 | prepare(); 45 | run(); 46 | } catch (Throwable t) { 47 | StringWriter writer = new StringWriter(); 48 | t.printStackTrace(new PrintWriter(writer)); 49 | throw new BuildException(t.getMessage() + writer); 50 | } 51 | } 52 | 53 | /** 検証します。 */ 54 | protected final void validate() { 55 | doValidate(); 56 | } 57 | 58 | /** サブクラスで検証します。 */ 59 | protected abstract void doValidate(); 60 | 61 | /** 準備します。 */ 62 | protected final void prepare() { 63 | globalFactory = 64 | newInstance(GlobalFactory.class, globalFactoryClassName, "globalFactoryClassName"); 65 | doPrepare(); 66 | } 67 | 68 | protected T newInstance(Class supertype, String className, String propertyName) { 69 | AssertionUtil.assertNotNull(supertype, className, propertyName); 70 | Class clazz = forName(className, propertyName); 71 | if (!supertype.isAssignableFrom(clazz)) { 72 | throw new GenException(Message.DOMAGEN0014, propertyName, className, supertype.getName()); 73 | } 74 | try { 75 | return supertype.cast(clazz.newInstance()); 76 | } catch (InstantiationException e) { 77 | throw new GenException(Message.DOMAGEN0015, propertyName, className, e); 78 | } catch (IllegalAccessException e) { 79 | throw new GenException(Message.DOMAGEN0015, propertyName, className, e); 80 | } 81 | } 82 | 83 | protected Class forName(String className, String propertyName) { 84 | AssertionUtil.assertNotNull(className, propertyName); 85 | try { 86 | return Class.forName(className); 87 | } catch (ClassNotFoundException e) { 88 | throw new GenException(Message.DOMAGEN0013, propertyName, className, e); 89 | } 90 | } 91 | 92 | /** サブクラスで準備します。 */ 93 | protected abstract void doPrepare(); 94 | 95 | /** 実行します。 */ 96 | protected final void run() { 97 | doRun(); 98 | } 99 | 100 | /** サブクラスで実行します。 */ 101 | protected abstract void doRun(); 102 | } 103 | -------------------------------------------------------------------------------- /src/main/java/org/seasar/doma/extension/gen/task/DaoConfig.java: -------------------------------------------------------------------------------- 1 | package org.seasar.doma.extension.gen.task; 2 | 3 | import java.io.File; 4 | import org.apache.tools.ant.types.DataType; 5 | 6 | /** 7 | * Daoの設定です。 8 | * 9 | * @author taedium 10 | */ 11 | public class DaoConfig extends DataType { 12 | 13 | /** DaoのJavaコードを生成する場合 {@code true} */ 14 | protected boolean generate = true; 15 | 16 | /** 同名のDaoインタフェースのJavaファイルを上書きする場合{@code true}、しない場合{@code false} */ 17 | protected boolean overwrite = false; 18 | 19 | /** 生成されるJavaファイルの出力先ディレクトリ */ 20 | protected File destDir = null; 21 | 22 | /** Javaファイルのエンコーディング */ 23 | protected String encoding = "UTF-8"; 24 | 25 | /** Daoインタフェースのパッケージ名 */ 26 | protected String packageName = "example.dao"; 27 | 28 | /** Daoインタフェースのサフィックス */ 29 | protected String suffix = "Dao"; 30 | 31 | /** 設定クラス名 */ 32 | protected String configClassName = null; 33 | 34 | /** ベースディレクトリ */ 35 | protected File baseDir = null; 36 | 37 | public boolean isGenerate() { 38 | return generate; 39 | } 40 | 41 | public void setGenerate(boolean generate) { 42 | this.generate = generate; 43 | } 44 | 45 | public boolean isOverwrite() { 46 | return overwrite; 47 | } 48 | 49 | public void setOverwrite(boolean overwrite) { 50 | this.overwrite = overwrite; 51 | } 52 | 53 | public String getPackageName() { 54 | return packageName; 55 | } 56 | 57 | public void setPackageName(String packageName) { 58 | this.packageName = packageName; 59 | } 60 | 61 | public String getSuffix() { 62 | return suffix; 63 | } 64 | 65 | public void setSuffix(String suffix) { 66 | this.suffix = suffix; 67 | } 68 | 69 | public String getConfigClassName() { 70 | return configClassName; 71 | } 72 | 73 | public void setConfigClassName(String configClassName) { 74 | this.configClassName = configClassName; 75 | } 76 | 77 | public File getDestDir() { 78 | if (destDir == null) { 79 | destDir = new File(baseDir != null ? baseDir : getProject().getBaseDir(), "src/main/java"); 80 | } 81 | return destDir; 82 | } 83 | 84 | public void setDestDir(File destDir) { 85 | this.destDir = destDir; 86 | } 87 | 88 | public String getEncoding() { 89 | return encoding; 90 | } 91 | 92 | public void setEncoding(String encoding) { 93 | this.encoding = encoding; 94 | } 95 | 96 | /** @param baseDir the baseDir to set */ 97 | protected void setBaseDir(File baseDir) { 98 | this.baseDir = baseDir; 99 | } 100 | } 101 | -------------------------------------------------------------------------------- /src/main/java/org/seasar/doma/extension/gen/task/DialectNameAttribute.java: -------------------------------------------------------------------------------- 1 | package org.seasar.doma.extension.gen.task; 2 | 3 | import java.util.List; 4 | import org.apache.tools.ant.types.EnumeratedAttribute; 5 | import org.seasar.doma.extension.gen.dialect.GenDialectRegistry; 6 | 7 | /** 8 | * 方言名を表します。 9 | * 10 | *

方言に対応するAntの列挙型です。 11 | * 12 | * @author taedium 13 | */ 14 | public class DialectNameAttribute extends EnumeratedAttribute { 15 | 16 | @Override 17 | public String[] getValues() { 18 | List dialectNames = GenDialectRegistry.getDialectNames(); 19 | String[] results = new String[dialectNames.size()]; 20 | int index = 0; 21 | for (String dialectName : dialectNames) { 22 | results[index] = dialectName; 23 | index++; 24 | } 25 | return results; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/main/java/org/seasar/doma/extension/gen/task/GenerationTypeAttribute.java: -------------------------------------------------------------------------------- 1 | package org.seasar.doma.extension.gen.task; 2 | 3 | import java.util.EnumSet; 4 | import org.apache.tools.ant.types.EnumeratedAttribute; 5 | import org.seasar.doma.extension.gen.GenerationType; 6 | 7 | /** 8 | * 識別子の生成方法を表します。 9 | * 10 | *

{@link GenerationType} に対応するAntの列挙型です。 11 | * 12 | * @author taedium 13 | */ 14 | public class GenerationTypeAttribute extends EnumeratedAttribute { 15 | 16 | @Override 17 | public String[] getValues() { 18 | EnumSet set = EnumSet.allOf(GenerationType.class); 19 | String[] results = new String[set.size()]; 20 | int index = 0; 21 | for (GenerationType generationType : set) { 22 | results[index] = generationType.name().toLowerCase(); 23 | index++; 24 | } 25 | return results; 26 | } 27 | 28 | /** 29 | * {@link GenerationType} に変換します。 30 | * 31 | * @return 対応する {@link GenerationType} 32 | */ 33 | public GenerationType convertToEnum() { 34 | if (GenerationType.IDENTITY.name().equalsIgnoreCase(value)) { 35 | return GenerationType.IDENTITY; 36 | } 37 | if (GenerationType.SEQUENCE.name().equalsIgnoreCase(value)) { 38 | return GenerationType.SEQUENCE; 39 | } 40 | if (GenerationType.TABLE.name().equalsIgnoreCase(value)) { 41 | return GenerationType.TABLE; 42 | } 43 | return null; 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /src/main/java/org/seasar/doma/extension/gen/task/NamingTypeAttribute.java: -------------------------------------------------------------------------------- 1 | package org.seasar.doma.extension.gen.task; 2 | 3 | import java.util.EnumSet; 4 | import org.apache.tools.ant.types.EnumeratedAttribute; 5 | import org.seasar.doma.extension.gen.NamingType; 6 | 7 | /** 8 | * ネーミング規約を表します。 9 | * 10 | *

{@link NamingType} に対応するAntの列挙型です。 11 | * 12 | * @author taedium 13 | */ 14 | public class NamingTypeAttribute extends EnumeratedAttribute { 15 | 16 | @Override 17 | public String[] getValues() { 18 | EnumSet set = EnumSet.allOf(NamingType.class); 19 | String[] results = new String[set.size()]; 20 | int index = 0; 21 | for (NamingType namingType : set) { 22 | results[index] = namingType.name().toLowerCase(); 23 | index++; 24 | } 25 | return results; 26 | } 27 | 28 | /** 29 | * {@link NamingType} に変換します。 30 | * 31 | * @return 対応する {@link NamingType} 32 | */ 33 | public NamingType convertToEnum() { 34 | if (NamingType.LOWER_CASE.name().equalsIgnoreCase(value)) { 35 | return NamingType.LOWER_CASE; 36 | } 37 | if (NamingType.UPPER_CASE.name().equalsIgnoreCase(value)) { 38 | return NamingType.UPPER_CASE; 39 | } 40 | if (NamingType.SNAKE_LOWER_CASE.name().equalsIgnoreCase(value)) { 41 | return NamingType.SNAKE_LOWER_CASE; 42 | } 43 | if (NamingType.SNAKE_UPPER_CASE.name().equalsIgnoreCase(value)) { 44 | return NamingType.SNAKE_UPPER_CASE; 45 | } 46 | if (NamingType.NONE.name().equalsIgnoreCase(value)) { 47 | return NamingType.NONE; 48 | } 49 | throw new AssertionError("unreachable."); 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /src/main/java/org/seasar/doma/extension/gen/task/SqlConfig.java: -------------------------------------------------------------------------------- 1 | package org.seasar.doma.extension.gen.task; 2 | 3 | import java.io.File; 4 | import org.apache.tools.ant.types.DataType; 5 | 6 | /** 7 | * SQLの設定です。 8 | * 9 | * @author taedium 10 | */ 11 | public class SqlConfig extends DataType { 12 | 13 | /** SQLを生成する場合 {@code true} */ 14 | protected boolean generate = true; 15 | 16 | /** 同名のSQLファイルを上書きする場合 */ 17 | protected boolean overwrite = true; 18 | 19 | /** 生成されるSQLファイルの出力先ディレクトリ */ 20 | protected File destDir = null; 21 | 22 | /** ベースディレクトリ */ 23 | protected File baseDir = null; 24 | 25 | public boolean isGenerate() { 26 | return generate; 27 | } 28 | 29 | public void setGenerate(boolean generate) { 30 | this.generate = generate; 31 | } 32 | 33 | public boolean isOverwrite() { 34 | return overwrite; 35 | } 36 | 37 | public void setOverwrite(boolean overwrite) { 38 | this.overwrite = overwrite; 39 | } 40 | 41 | public File getDestDir() { 42 | if (destDir == null) { 43 | destDir = 44 | new File(baseDir != null ? baseDir : getProject().getBaseDir(), "src/main/resources"); 45 | } 46 | return destDir; 47 | } 48 | 49 | public void setDestDir(File destDir) { 50 | this.destDir = destDir; 51 | } 52 | 53 | /** @param baseDir the baseDir to set */ 54 | protected void setBaseDir(File baseDir) { 55 | this.baseDir = baseDir; 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /src/main/java/org/seasar/doma/extension/gen/task/SqlTestCaseConfig.java: -------------------------------------------------------------------------------- 1 | package org.seasar.doma.extension.gen.task; 2 | 3 | import java.io.File; 4 | import java.util.HashSet; 5 | import java.util.Set; 6 | import org.apache.tools.ant.DirectoryScanner; 7 | import org.apache.tools.ant.types.DataType; 8 | import org.apache.tools.ant.types.FileSet; 9 | 10 | /** 11 | * SQLテストケースの設定です。 12 | * 13 | * @author taedium 14 | */ 15 | public class SqlTestCaseConfig extends DataType { 16 | 17 | /** 生成する場合{@code true} */ 18 | protected boolean generate = true; 19 | 20 | /** ベースディレクトリ */ 21 | protected File baseDir = null; 22 | 23 | /** Javaコードの出力ディレクトリ */ 24 | protected File destDir = null; 25 | 26 | /** Javaファイルのエンコーディング */ 27 | protected String encoding = "UTF-8"; 28 | 29 | /** テストの対象のSQLファイル */ 30 | protected final Set sqlFiles = new HashSet(); 31 | 32 | /** @return the destDir */ 33 | public File getDestDir() { 34 | if (destDir == null) { 35 | destDir = new File(baseDir != null ? baseDir : getProject().getBaseDir(), "src/test/java"); 36 | } 37 | return destDir; 38 | } 39 | 40 | /** @param destDir the destDir to set */ 41 | public void setDestDir(File destDir) { 42 | this.destDir = destDir; 43 | } 44 | 45 | /** @return the encoding */ 46 | public String getEncoding() { 47 | return encoding; 48 | } 49 | 50 | /** @param encoding the encoding to set */ 51 | public void setEncoding(String encoding) { 52 | this.encoding = encoding; 53 | } 54 | 55 | /** @return the generate */ 56 | public boolean isGenerate() { 57 | return generate; 58 | } 59 | 60 | /** @param generate the generate to set */ 61 | public void setGenerate(boolean generate) { 62 | this.generate = generate; 63 | } 64 | 65 | /** @param fileSet SQLファイルの集合 */ 66 | public void addConfiguredFileSet(FileSet fileSet) { 67 | DirectoryScanner scanner = fileSet.getDirectoryScanner(getProject()); 68 | File baseDir = fileSet.getDir(); 69 | for (String fileName : scanner.getIncludedFiles()) { 70 | sqlFiles.add(new File(baseDir, fileName)); 71 | } 72 | } 73 | 74 | /** @return the sqlFiles */ 75 | public Set getSqlFiles() { 76 | return sqlFiles; 77 | } 78 | 79 | /** @param baseDir the baseDir to set */ 80 | protected void setBaseDir(File baseDir) { 81 | this.baseDir = baseDir; 82 | } 83 | } 84 | -------------------------------------------------------------------------------- /src/main/java/org/seasar/doma/extension/gen/task/TaskLoggerDelegate.java: -------------------------------------------------------------------------------- 1 | package org.seasar.doma.extension.gen.task; 2 | 3 | import org.apache.tools.ant.Project; 4 | import org.apache.tools.ant.Task; 5 | import org.seasar.doma.extension.gen.LoggerDelegate; 6 | 7 | /** 8 | * {@link Task} のログ機能を使用する {@link LoggerDelegate} の実装です。 9 | * 10 | * @author taedium 11 | */ 12 | public class TaskLoggerDelegate implements LoggerDelegate { 13 | 14 | protected final Task task; 15 | 16 | /** 17 | * インスタンスを生成します。 18 | * 19 | * @param task Antタスク 20 | */ 21 | public TaskLoggerDelegate(Task task) { 22 | if (task == null) { 23 | throw new NullPointerException("task"); 24 | } 25 | this.task = task; 26 | } 27 | 28 | @Override 29 | public void debug(String message) { 30 | task.log(message, Project.MSG_DEBUG); 31 | } 32 | 33 | @Override 34 | public void debug(Throwable throwable) { 35 | task.log(throwable, Project.MSG_DEBUG); 36 | } 37 | 38 | @Override 39 | public void debug(String message, Throwable throwable) { 40 | task.log(message, throwable, Project.MSG_DEBUG); 41 | } 42 | 43 | @Override 44 | public void info(String message) { 45 | task.log(message, Project.MSG_INFO); 46 | } 47 | 48 | @Override 49 | public void info(Throwable throwable) { 50 | task.log(throwable, Project.MSG_INFO); 51 | } 52 | 53 | @Override 54 | public void info(String message, Throwable throwable) { 55 | task.log(message, throwable, Project.MSG_INFO); 56 | } 57 | 58 | @Override 59 | public void error(String message) { 60 | task.log(message, Project.MSG_ERR); 61 | } 62 | 63 | @Override 64 | public void error(Throwable throwable) { 65 | task.log(throwable, Project.MSG_ERR); 66 | } 67 | 68 | @Override 69 | public void error(String message, Throwable throwable) { 70 | task.log(message, throwable, Project.MSG_ERR); 71 | } 72 | } 73 | -------------------------------------------------------------------------------- /src/main/java/org/seasar/doma/extension/gen/task/package-info.java: -------------------------------------------------------------------------------- 1 | /** Antのタスク、データ型、列挙型を提供します。 */ 2 | package org.seasar.doma.extension.gen.task; 3 | -------------------------------------------------------------------------------- /src/main/resources/domagentask.properties: -------------------------------------------------------------------------------- 1 | gen=org.seasar.doma.extension.gen.task.Gen 2 | -------------------------------------------------------------------------------- /src/main/resources/org/seasar/doma/extension/gen/template/dao.ftl: -------------------------------------------------------------------------------- 1 | <#-- このテンプレートに対応するデータモデルのクラスは org.seasar.doma.extension.gen.DaoDesc です --> 2 | <#import "/lib.ftl" as lib> 3 | <#if lib.copyright??> 4 | ${lib.copyright} 5 | 6 | <#if packageName??> 7 | package ${packageName}; 8 | 9 | 10 | <#list importNames as importName> 11 | import ${importName}; 12 | 13 | 14 | /** 15 | <#if lib.author??> 16 | * @author ${lib.author} 17 | 18 | */ 19 | @Dao<#if configClassSimpleName??>(config = ${configClassSimpleName}.class) 20 | public interface ${simpleName} { 21 | 22 | <#if entityDesc.idEntityPropertyDescs?size gt 0> 23 | /** 24 | <#list entityDesc.idEntityPropertyDescs as property> 25 | * @param ${property.name} 26 | 27 | * @return the <#if entityDesc.entityPrefix??>${entityDesc.entityPrefix}${entityDesc.simpleName}<#if entityDesc.entitySuffix??>${entityDesc.entitySuffix} entity 28 | */ 29 | @Select 30 | <#if entityDesc.entityPrefix??>${entityDesc.entityPrefix}${entityDesc.simpleName}<#if entityDesc.entitySuffix??>${entityDesc.entitySuffix} selectById(<#list entityDesc.idEntityPropertyDescs as property>${property.propertyClassSimpleName} ${property.name}<#if property_has_next>, ); 31 | 32 | 33 | <#if entityDesc.idEntityPropertyDescs?size gt 0 && entityDesc.versionEntityPropertyDesc??> 34 | /** 35 | <#list entityDesc.idEntityPropertyDescs as property> 36 | * @param ${property.name} 37 | 38 | * @param ${entityDesc.versionEntityPropertyDesc.name} 39 | * @return the <#if entityDesc.entityPrefix??>${entityDesc.entityPrefix}${entityDesc.simpleName}<#if entityDesc.entitySuffix??>${entityDesc.entitySuffix} entity 40 | */ 41 | @Select(ensureResult = true) 42 | <#if entityDesc.entityPrefix??>${entityDesc.entityPrefix}${entityDesc.simpleName}<#if entityDesc.entitySuffix??>${entityDesc.entitySuffix} selectByIdAndVersion(<#list entityDesc.idEntityPropertyDescs as property>${property.propertyClassSimpleName} ${property.name}, ${entityDesc.versionEntityPropertyDesc.propertyClassSimpleName} ${entityDesc.versionEntityPropertyDesc.name}); 43 | 44 | 45 | /** 46 | * @param entity 47 | * @return affected rows 48 | */ 49 | @Insert 50 | int insert(<#if entityDesc.entityPrefix??>${entityDesc.entityPrefix}${entityDesc.simpleName}<#if entityDesc.entitySuffix??>${entityDesc.entitySuffix} entity); 51 | 52 | /** 53 | * @param entity 54 | * @return affected rows 55 | */ 56 | @Update 57 | int update(<#if entityDesc.entityPrefix??>${entityDesc.entityPrefix}${entityDesc.simpleName}<#if entityDesc.entitySuffix??>${entityDesc.entitySuffix} entity); 58 | 59 | /** 60 | * @param entity 61 | * @return affected rows 62 | */ 63 | @Delete 64 | int delete(<#if entityDesc.entityPrefix??>${entityDesc.entityPrefix}${entityDesc.simpleName}<#if entityDesc.entitySuffix??>${entityDesc.entitySuffix} entity); 65 | } -------------------------------------------------------------------------------- /src/main/resources/org/seasar/doma/extension/gen/template/entity.ftl: -------------------------------------------------------------------------------- 1 | <#-- このテンプレートに対応するデータモデルのクラスは org.seasar.doma.extension.gen.EntityDesc です --> 2 | <#import "/lib.ftl" as lib> 3 | <#if lib.copyright??> 4 | ${lib.copyright} 5 | 6 | <#if packageName??> 7 | package ${packageName}; 8 | 9 | 10 | <#list importNames as importName> 11 | import ${importName}; 12 | 13 | 14 | /** 15 | <#if showDbComment && comment??> 16 | * ${comment} 17 | 18 | <#if lib.author??> 19 | * @author ${lib.author} 20 | 21 | */ 22 | @Entity<#if useListener || namingType != "NONE">(<#if useListener>listener = ${listenerClassSimpleName}.class<#if namingType != "NONE"><#if useListener>, naming = ${namingType.referenceName}<#if useListener || namingType != "NONE">) 23 | <#if showCatalogName && catalogName?? || showSchemaName && schemaName?? || showTableName && tableName??> 24 | @Table(<#if showCatalogName && catalogName??>catalog = "${catalogName}"<#if showSchemaName && schemaName??><#if showCatalogName && catalogName??>, schema = "${schemaName}"<#if showTableName><#if showCatalogName && catalogName?? || showSchemaName && schemaName??>, name = "${tableName}") 25 | 26 | public class <#if entityPrefix??>${entityPrefix}${simpleName}<#if entitySuffix??>${entitySuffix}<#if superclassSimpleName??> extends ${superclassSimpleName} { 27 | <#list ownEntityPropertyDescs as property> 28 | 29 | <#if showDbComment && property.comment??> 30 | /** ${property.comment} */ 31 | <#else> 32 | /** */ 33 | 34 | <#if property.id> 35 | @Id 36 | <#if property.generationType??> 37 | @GeneratedValue(strategy = ${property.generationType.referenceName}) 38 | <#if property.generationType == "SEQUENCE"> 39 | @SequenceGenerator(sequence = "${tableName}_${property.columnName}"<#if property.initialValue??>, initialValue = ${property.initialValue}<#if property.allocationSize??>, allocationSize = ${property.allocationSize}) 40 | <#elseif property.generationType == "TABLE"> 41 | @TableGenerator(pkColumnValue = "${tableName}_${property.columnName}"<#if property.initialValue??>, initialValue = ${property.initialValue}<#if property.allocationSize??>, allocationSize = ${property.allocationSize}) 42 | 43 | 44 | 45 | <#if property.version> 46 | @Version 47 | 48 | <#if property.showColumnName && property.columnName??> 49 | @Column(name = "${property.columnName}") 50 | 51 | <#if !useAccessor>public ${property.propertyClassSimpleName} ${property.name}; 52 | 53 | <#if originalStatesPropertyName??> 54 | 55 | /** */ 56 | @OriginalStates 57 | <#if entityPrefix??>${entityPrefix}${simpleName}<#if entitySuffix??>${entitySuffix} ${originalStatesPropertyName}; 58 | 59 | <#if useAccessor> 60 | <#list ownEntityPropertyDescs as property> 61 | 62 | /** 63 | * Returns the ${property.name}. 64 | * 65 | * @return the ${property.name} 66 | */ 67 | public ${property.propertyClassSimpleName} get${property.name?cap_first}() { 68 | return ${property.name}; 69 | } 70 | 71 | /** 72 | * Sets the ${property.name}. 73 | * 74 | * @param ${property.name} the ${property.name} 75 | */ 76 | public void set${property.name?cap_first}(${property.propertyClassSimpleName} ${property.name}) { 77 | this.${property.name} = ${property.name}; 78 | } 79 | 80 | 81 | } -------------------------------------------------------------------------------- /src/main/resources/org/seasar/doma/extension/gen/template/entityListener.ftl: -------------------------------------------------------------------------------- 1 | <#-- このテンプレートに対応するデータモデルのクラスは org.seasar.doma.extension.gen.EntityListenerDesc です --> 2 | <#import "/lib.ftl" as lib> 3 | <#if lib.copyright??> 4 | ${lib.copyright} 5 | 6 | <#if packageName??> 7 | package ${packageName}; 8 | 9 | 10 | <#list importNames as importName> 11 | import ${importName}; 12 | 13 | 14 | /** 15 | * 16 | <#if lib.author??> 17 | * @author ${lib.author} 18 | 19 | */ 20 | public class ${simpleName}<#if superclassSimpleName??> extends ${superclassSimpleName}<<#if entityDesc.entityPrefix??>${entityDesc.entityPrefix}${entityClassSimpleName}<#if entityDesc.entitySuffix??>${entityDesc.entitySuffix}><#else> implements EntityListener<<#if entityDesc.entityPrefix??>${entityDesc.entityPrefix}${entityClassSimpleName}<#if entityDesc.entitySuffix??>${entityDesc.entitySuffix}> { 21 | <#if !superclassSimpleName??> 22 | 23 | @Override 24 | public void preInsert(<#if entityDesc.entityPrefix??>${entityDesc.entityPrefix}${entityClassSimpleName}<#if entityDesc.entitySuffix??>${entityDesc.entitySuffix} entity, PreInsertContext<<#if entityDesc.entityPrefix??>${entityDesc.entityPrefix}${entityClassSimpleName}<#if entityDesc.entitySuffix??>${entityDesc.entitySuffix}> context) { 25 | } 26 | 27 | @Override 28 | public void preUpdate(<#if entityDesc.entityPrefix??>${entityDesc.entityPrefix}${entityClassSimpleName}<#if entityDesc.entitySuffix??>${entityDesc.entitySuffix} entity, PreUpdateContext<<#if entityDesc.entityPrefix??>${entityDesc.entityPrefix}${entityClassSimpleName}<#if entityDesc.entitySuffix??>${entityDesc.entitySuffix}> context) { 29 | } 30 | 31 | @Override 32 | public void preDelete(<#if entityDesc.entityPrefix??>${entityDesc.entityPrefix}${entityClassSimpleName}<#if entityDesc.entitySuffix??>${entityDesc.entitySuffix} entity, PreDeleteContext<<#if entityDesc.entityPrefix??>${entityDesc.entityPrefix}${entityClassSimpleName}<#if entityDesc.entitySuffix??>${entityDesc.entitySuffix}> context) { 33 | } 34 | 35 | @Override 36 | public void postInsert(<#if entityDesc.entityPrefix??>${entityDesc.entityPrefix}${entityClassSimpleName}<#if entityDesc.entitySuffix??>${entityDesc.entitySuffix} entity, PostInsertContext<<#if entityDesc.entityPrefix??>${entityDesc.entityPrefix}${entityClassSimpleName}<#if entityDesc.entitySuffix??>${entityDesc.entitySuffix}> context) { 37 | } 38 | 39 | @Override 40 | public void postUpdate(<#if entityDesc.entityPrefix??>${entityDesc.entityPrefix}${entityClassSimpleName}<#if entityDesc.entitySuffix??>${entityDesc.entitySuffix} entity, PostUpdateContext<<#if entityDesc.entityPrefix??>${entityDesc.entityPrefix}${entityClassSimpleName}<#if entityDesc.entitySuffix??>${entityDesc.entitySuffix}> context) { 41 | } 42 | 43 | @Override 44 | public void postDelete(<#if entityDesc.entityPrefix??>${entityDesc.entityPrefix}${entityClassSimpleName}<#if entityDesc.entitySuffix??>${entityDesc.entitySuffix} entity, PostDeleteContext<<#if entityDesc.entityPrefix??>${entityDesc.entityPrefix}${entityClassSimpleName}<#if entityDesc.entitySuffix??>${entityDesc.entitySuffix}> context) { 45 | } 46 | 47 | } -------------------------------------------------------------------------------- /src/main/resources/org/seasar/doma/extension/gen/template/lib.ftl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/domaframework/doma-gen/054d8db0ed0d6ac6386040cbcef6ace1386aeb61/src/main/resources/org/seasar/doma/extension/gen/template/lib.ftl -------------------------------------------------------------------------------- /src/main/resources/org/seasar/doma/extension/gen/template/selectById.sql.ftl: -------------------------------------------------------------------------------- 1 | <#-- このテンプレートに対応するデータモデルのクラスは org.seasar.doma.extension.gen.SqlDesc です --> 2 | select 3 | /*%expand*/* 4 | from 5 | ${entityDesc.tableName} 6 | where 7 | <#list entityDesc.idEntityPropertyDescs as property> 8 | ${property.columnName} = /* ${property.name} */<#if property.number>1<#elseif property.time>${toTime("12:34:56")}<#elseif property.date>${toDate("2010-01-23")}<#elseif property.timestamp>${toTimestamp("2010-01-23 12:34:56")}<#else>'a'<#if property_has_next> 9 | and 10 | 11 | -------------------------------------------------------------------------------- /src/main/resources/org/seasar/doma/extension/gen/template/selectByIdAndVersion.sql.ftl: -------------------------------------------------------------------------------- 1 | <#-- このテンプレートに対応するデータモデルのクラスは org.seasar.doma.extension.gen.SqlDesc です --> 2 | select 3 | /*%expand*/* 4 | from 5 | ${entityDesc.tableName} 6 | where 7 | <#list entityDesc.idEntityPropertyDescs as property> 8 | ${property.columnName} = /* ${property.name} */<#if property.number>1<#elseif property.time>${toTime("12:34:56")}<#elseif property.date>${toDate("2010-01-23")}<#elseif property.timestamp>${toTimestamp("2010-01-23 12:34:56")}<#else>'a' 9 | and 10 | 11 | <#if entityDesc.idEntityPropertyDescs?size gt 0 && entityDesc.versionEntityPropertyDesc??> 12 | ${entityDesc.versionEntityPropertyDesc.columnName} = /* ${entityDesc.versionEntityPropertyDesc.name} */1 13 | 14 | -------------------------------------------------------------------------------- /src/main/resources/org/seasar/doma/extension/gen/template/sqlTestCase.ftl: -------------------------------------------------------------------------------- 1 | <#-- このテンプレートに対応するデータモデルのクラスは org.seasar.doma.extension.gen.SqlTestCaseDesc です --> 2 | <#import "/lib.ftl" as lib> 3 | <#if lib.copyright??> 4 | ${lib.copyright} 5 | 6 | <#if packageName??> 7 | package ${packageName}; 8 | 9 | 10 | import java.lang.reflect.Method; 11 | import java.sql.Connection; 12 | import java.sql.Driver; 13 | import java.sql.DriverManager; 14 | import java.sql.Statement; 15 | 16 | import junit.framework.TestCase; 17 | 18 | import org.seasar.doma.jdbc.NoCacheSqlFileRepository; 19 | import org.seasar.doma.jdbc.SqlFile; 20 | import org.seasar.doma.jdbc.SqlFileRepository; 21 | import org.seasar.doma.jdbc.dialect.Dialect; 22 | 23 | /** 24 | * 25 | <#if lib.author??> 26 | * @author ${lib.author} 27 | 28 | */ 29 | public class <#if entityPrefix??>${entityPrefix}${simpleName}<#if entitySuffix??>${entitySuffix} extends TestCase { 30 | 31 | /** */ 32 | protected SqlFileRepository repository; 33 | 34 | /** */ 35 | protected Dialect dialect; 36 | 37 | /** */ 38 | protected Driver driver; 39 | 40 | /** */ 41 | protected String url; 42 | 43 | /** */ 44 | protected String user; 45 | 46 | /** */ 47 | protected String password; 48 | 49 | @Override 50 | protected void setUp() throws Exception { 51 | super.setUp(); 52 | repository = new NoCacheSqlFileRepository(); 53 | dialect = new ${dialectClassName}(); 54 | @SuppressWarnings("unchecked") 55 | Class driverClass = (Class) Class.forName("${driverClassName}"); 56 | driver = driverClass.newInstance(); 57 | DriverManager.registerDriver(driver); 58 | url = "${url}"; 59 | user = "${user}"; 60 | password = "${password}"; 61 | } 62 | 63 | @Override 64 | protected void tearDown() throws Exception { 65 | DriverManager.deregisterDriver(driver); 66 | super.tearDown(); 67 | } 68 | 69 | /** 70 | * 71 | * @param sqlFile 72 | * @throws Exception 73 | */ 74 | protected void execute(SqlFile sqlFile) throws Exception { 75 | Connection connection = getConnection(); 76 | try { 77 | connection.setAutoCommit(false); 78 | Statement statement = connection.createStatement(); 79 | try { 80 | statement.execute(sqlFile.getSql()); 81 | } finally { 82 | statement.close(); 83 | } 84 | } finally { 85 | try { 86 | connection.rollback(); 87 | } finally { 88 | connection.close(); 89 | } 90 | } 91 | } 92 | 93 | /** 94 | * 95 | * @return 96 | * @throws Exception 97 | */ 98 | protected Connection getConnection() throws Exception { 99 | return DriverManager.getConnection(url, user, password); 100 | } 101 | 102 | /** 103 | * 104 | * @return method 105 | * @throws Exception 106 | */ 107 | protected Method getMethod() throws Exception { 108 | return getClass().getMethod(getName(), new Class[] {}); 109 | } 110 | <#list methodDescs as methodDesc> 111 | 112 | /** 113 | * 114 | * @throws Exception 115 | */ 116 | public void ${methodDesc.methodName}() throws Exception { 117 | SqlFile sqlFile = repository.getSqlFile(getMethod(), "${methodDesc.path}", dialect); 118 | execute(sqlFile); 119 | } 120 | 121 | 122 | } -------------------------------------------------------------------------------- /src/test/java/example/hoge/AbstractBean.java: -------------------------------------------------------------------------------- 1 | package example.hoge; 2 | 3 | public abstract class AbstractBean {} 4 | -------------------------------------------------------------------------------- /src/test/java/example/hoge/CommonEntity.java: -------------------------------------------------------------------------------- 1 | package example.hoge; 2 | 3 | import org.seasar.doma.Entity; 4 | import org.seasar.doma.Transient; 5 | 6 | /** @author taedium */ 7 | @Entity 8 | public class CommonEntity extends AbstractBean { 9 | 10 | String name; 11 | 12 | @Transient String transientString; 13 | 14 | static String staticString; 15 | 16 | @SuppressWarnings("unused") 17 | private String privateString; 18 | } 19 | -------------------------------------------------------------------------------- /src/test/java/example/hoge/ParentEntity.java: -------------------------------------------------------------------------------- 1 | package example.hoge; 2 | 3 | import org.seasar.doma.Column; 4 | import org.seasar.doma.Entity; 5 | 6 | /** @author taedium */ 7 | @Entity 8 | public class ParentEntity { 9 | 10 | @Column(name = "EMP_NAME") 11 | String hoge; 12 | } 13 | -------------------------------------------------------------------------------- /src/test/java/org/seasar/doma/extension/gen/EntityPropertyClassNameResolverTest.java: -------------------------------------------------------------------------------- 1 | package org.seasar.doma.extension.gen; 2 | 3 | import java.io.File; 4 | import java.util.regex.Pattern; 5 | import junit.framework.TestCase; 6 | import org.seasar.doma.extension.gen.internal.util.ResourceUtil; 7 | 8 | /** @author taedium */ 9 | public class EntityPropertyClassNameResolverTest extends TestCase { 10 | 11 | public void testResolve2() throws Exception { 12 | EntityDesc entityDesc = new EntityDesc(); 13 | entityDesc.setPackageName("aaa"); 14 | entityDesc.setSimpleName("Bbb"); 15 | 16 | EntityPropertyClassNameResolver resolver = new EntityPropertyClassNameResolver(null); 17 | resolver.patternMap.put(Pattern.compile("aaa\\.Bbb@ccc"), "String"); 18 | assertEquals("String", resolver.resolve(entityDesc, "ccc", "Integer")); 19 | assertEquals("Integer", resolver.resolve(entityDesc, "ddd", "Integer")); 20 | } 21 | 22 | public void testResolve() throws Exception { 23 | String path = getClass().getName().replace('.', '/') + ".properties"; 24 | File file = ResourceUtil.getResourceAsFile(path); 25 | EntityPropertyClassNameResolver resolver = new EntityPropertyClassNameResolver(file); 26 | 27 | EntityDesc entityDesc = new EntityDesc(); 28 | entityDesc.setPackageName("aaa"); 29 | entityDesc.setSimpleName("Bbb"); 30 | assertEquals("java.lang.String", resolver.resolve(entityDesc, "ccc", "java.lang.Integer")); 31 | assertEquals("java.lang.Long", resolver.resolve(entityDesc, "ddd", "java.lang.Integer")); 32 | 33 | entityDesc = new EntityDesc(); 34 | entityDesc.setPackageName("xxx"); 35 | entityDesc.setSimpleName("Yyy"); 36 | assertEquals("java.lang.Double", resolver.resolve(entityDesc, "ccc", "java.lang.Integer")); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/test/java/org/seasar/doma/extension/gen/GeneratorStub.java: -------------------------------------------------------------------------------- 1 | package org.seasar.doma.extension.gen; 2 | 3 | import java.io.File; 4 | import java.io.StringWriter; 5 | import java.io.Writer; 6 | 7 | /** @author taedium */ 8 | public class GeneratorStub extends Generator { 9 | 10 | private StringWriter writer = new StringWriter(300); 11 | 12 | @Override 13 | protected boolean exists(File file) { 14 | return false; 15 | } 16 | 17 | @Override 18 | protected void mkdirs(File dir) {} 19 | 20 | @Override 21 | protected Writer openWriter(GenerationContext context) { 22 | return writer; 23 | } 24 | 25 | protected String getResult() { 26 | return writer.toString(); 27 | } 28 | 29 | protected void clear() { 30 | writer = new StringWriter(300); 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/test/java/org/seasar/doma/extension/gen/dialect/MysqlGenDialectTest.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2004-2016 the Seasar Foundation and the Others. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, 13 | * either express or implied. See the License for the specific language 14 | * governing permissions and limitations under the License. 15 | */ 16 | package org.seasar.doma.extension.gen.dialect; 17 | 18 | import static org.hamcrest.CoreMatchers.*; 19 | import static org.hamcrest.MatcherAssert.assertThat; 20 | 21 | import org.junit.experimental.theories.DataPoints; 22 | import org.junit.experimental.theories.Theories; 23 | import org.junit.experimental.theories.Theory; 24 | import org.junit.runner.RunWith; 25 | import org.seasar.doma.extension.gen.ColumnMeta; 26 | 27 | /** @author matsumana */ 28 | @RunWith(Theories.class) 29 | public class MysqlGenDialectTest { 30 | 31 | @DataPoints 32 | public static Fixture[] params = { 33 | // 数値型 34 | new Fixture("bit", 1, "java.lang.Boolean"), 35 | new Fixture("bit", 2, "java.lang.Byte"), 36 | new Fixture("tinyint", 1, "java.lang.Boolean"), 37 | new Fixture("tinyint", 2, "java.lang.Byte"), 38 | new Fixture("bool", "java.lang.Boolean"), 39 | new Fixture("boolean", "java.lang.Boolean"), 40 | new Fixture("smallint", "java.lang.Short"), 41 | new Fixture("mediumint", "java.lang.Integer"), 42 | new Fixture("int", "java.lang.Integer"), 43 | new Fixture("integer", "java.lang.Integer"), 44 | new Fixture("bigint", "java.lang.Long"), 45 | new Fixture("serial", "java.math.BigInteger"), 46 | new Fixture("decimal", "java.math.BigDecimal"), 47 | new Fixture("dec", "java.math.BigDecimal"), 48 | new Fixture("float", "java.lang.Float"), 49 | new Fixture("double", "java.lang.Double"), 50 | new Fixture("double precision", "java.lang.Double"), 51 | new Fixture("tinyint unsigned", 1, "java.lang.Boolean"), 52 | new Fixture("tinyint unsigned", 2, "java.lang.Short"), 53 | new Fixture("smallint unsigned", "java.lang.Integer"), 54 | new Fixture("mediumint unsigned", "java.lang.Integer"), 55 | new Fixture("int unsigned", "java.lang.Long"), 56 | new Fixture("integer unsigned", "java.lang.Long"), 57 | new Fixture("bigint unsigned", "java.math.BigInteger"), 58 | new Fixture("decimal unsigned", "java.math.BigDecimal"), 59 | new Fixture("dec unsigned", "java.math.BigDecimal"), 60 | new Fixture("float unsigned", "java.lang.Float"), 61 | new Fixture("double unsigned", "java.lang.Double"), 62 | new Fixture("double precision unsigned", "java.lang.Double"), 63 | 64 | // 日付と時間型 65 | new Fixture("date", "java.time.LocalDate"), 66 | new Fixture("datetime", "java.time.LocalDateTime"), 67 | new Fixture("timestamp", "java.time.LocalDateTime"), 68 | new Fixture("time", "java.time.LocalTime"), 69 | new Fixture("year", "java.lang.Short"), 70 | 71 | // BLOB型とTEXT型 72 | new Fixture("tinyblob", "java.sql.Blob"), 73 | new Fixture("blob", "java.sql.Blob"), 74 | new Fixture("mediumblob", "java.sql.Blob"), 75 | new Fixture("longblob", "java.sql.Blob"), 76 | 77 | // BINARYおよびVARBINARY型 78 | new Fixture("binary", ".byte[]"), 79 | new Fixture("varbinary", ".byte[]"), 80 | }; 81 | 82 | @Theory 83 | public void theory(Fixture param) { 84 | MysqlGenDialect sut = new MysqlGenDialect(); 85 | ColumnMeta columnMeta = new ColumnMeta(); 86 | columnMeta.setTypeName(param.value); 87 | columnMeta.setLength(param.length); 88 | String actual = sut.getMappedPropertyClassName(columnMeta); 89 | 90 | assertThat(actual, is(param.expected)); 91 | } 92 | 93 | static class Fixture { 94 | String value; 95 | int length; 96 | String expected; 97 | 98 | Fixture(String value, String expected) { 99 | this.value = value; 100 | this.expected = expected; 101 | } 102 | 103 | Fixture(String value, int length, String expected) { 104 | this.value = value; 105 | this.length = length; 106 | this.expected = expected; 107 | } 108 | } 109 | } 110 | -------------------------------------------------------------------------------- /src/test/java/org/seasar/doma/extension/gen/dialect/OracleGenDialectTest.java: -------------------------------------------------------------------------------- 1 | package org.seasar.doma.extension.gen.dialect; 2 | 3 | import junit.framework.TestCase; 4 | 5 | /** @author taedium */ 6 | public class OracleGenDialectTest extends TestCase { 7 | 8 | /** @throws Exception */ 9 | public void testConvertToTimeLiteral() throws Exception { 10 | OracleGenDialect dialect = new OracleGenDialect(); 11 | assertEquals("time'a'", dialect.convertToTimeLiteral("a")); 12 | } 13 | 14 | /** @throws Exception */ 15 | public void testConvertToDateLiteral() throws Exception { 16 | OracleGenDialect dialect = new OracleGenDialect(); 17 | assertEquals("date'a'", dialect.convertToDateLiteral("a")); 18 | } 19 | 20 | /** @throws Exception */ 21 | public void testConvertToTimestampLiteral() throws Exception { 22 | OracleGenDialect dialect = new OracleGenDialect(); 23 | assertEquals("timestamp'a'", dialect.convertToTimestampLiteral("a")); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /src/test/java/org/seasar/doma/extension/gen/dialect/StandardGenDialectTest.java: -------------------------------------------------------------------------------- 1 | package org.seasar.doma.extension.gen.dialect; 2 | 3 | import java.sql.Types; 4 | import java.time.LocalDate; 5 | import junit.framework.TestCase; 6 | 7 | /** @author taedium */ 8 | public class StandardGenDialectTest extends TestCase { 9 | 10 | /** @throws Exception */ 11 | public void testReplacePropertyClassName() throws Exception { 12 | StandardGenDialect dialect = new StandardGenDialect(); 13 | String localDateClassName = LocalDate.class.getName(); 14 | String utilDateClassName = java.util.Date.class.getName(); 15 | dialect.replacePropertyClassName(localDateClassName, utilDateClassName); 16 | assertEquals(utilDateClassName, dialect.classNameMap.get("date")); 17 | assertEquals(utilDateClassName, dialect.fallbackClassNameMap.get(Types.DATE)); 18 | } 19 | 20 | /** @throws Exception */ 21 | public void testConvertToTimeLiteral() throws Exception { 22 | StandardGenDialect dialect = new StandardGenDialect(); 23 | assertEquals("'a'", dialect.convertToTimeLiteral("a")); 24 | } 25 | 26 | /** @throws Exception */ 27 | public void testConvertToDateLiteral() throws Exception { 28 | StandardGenDialect dialect = new StandardGenDialect(); 29 | assertEquals("'a'", dialect.convertToDateLiteral("a")); 30 | } 31 | 32 | /** @throws Exception */ 33 | public void testConvertToTimestampLiteral() throws Exception { 34 | StandardGenDialect dialect = new StandardGenDialect(); 35 | assertEquals("'a'", dialect.convertToTimestampLiteral("a")); 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /src/test/java/org/seasar/doma/extension/gen/internal/util/FileUtilTest.java: -------------------------------------------------------------------------------- 1 | package org.seasar.doma.extension.gen.internal.util; 2 | 3 | import java.io.File; 4 | import junit.framework.TestCase; 5 | 6 | /** @author taedium */ 7 | public class FileUtilTest extends TestCase { 8 | 9 | public void testCreateJavaFile() throws Exception { 10 | File file = FileUtil.createJavaFile(new File("."), "aaa.bbb.Ccc"); 11 | assertEquals("Ccc.java", file.getName()); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/test/java/org/seasar/doma/extension/gen/internal/util/JdbcUtilTest.java: -------------------------------------------------------------------------------- 1 | package org.seasar.doma.extension.gen.internal.util; 2 | 3 | import junit.framework.TestCase; 4 | 5 | /** @author nakamura-to */ 6 | public class JdbcUtilTest extends TestCase { 7 | 8 | public void testInferDialectName() throws Exception { 9 | String dialectName = JdbcUtil.inferDialectName("jdbc:postgresql://localhost/hoge"); 10 | assertEquals("postgres", dialectName); 11 | } 12 | 13 | public void testInferDialectName_mysql() throws Exception { 14 | String dialectName = JdbcUtil.inferDialectName("jdbc:mysql://localhost:3306/hoge"); 15 | assertEquals("mysql", dialectName); 16 | } 17 | 18 | public void testInferDialectName_unknown() throws Exception { 19 | String dialectName = JdbcUtil.inferDialectName("jdbc:unknown://localhost/hoge"); 20 | assertNull(dialectName); 21 | } 22 | 23 | public void testInferDialectName_invalidUrl() throws Exception { 24 | String dialectName = JdbcUtil.inferDialectName("localhost/hoge"); 25 | assertNull(dialectName); 26 | } 27 | 28 | public void testInferDriverClassName() throws Exception { 29 | String driverClassName = JdbcUtil.inferDriverClassName("jdbc:postgresql://localhost/hoge"); 30 | assertEquals("org.postgresql.Driver", driverClassName); 31 | } 32 | 33 | public void testInferDriverClassName_mysql() throws Exception { 34 | String driverClassName = JdbcUtil.inferDriverClassName("jdbc:mysql://localhost:3306/hoge"); 35 | assertEquals("com.mysql.jdbc.Driver", driverClassName); 36 | } 37 | 38 | public void testInferDriverClassName_unknown() throws Exception { 39 | String driverClassName = JdbcUtil.inferDriverClassName("jdbc:unknown://localhost/hoge"); 40 | assertNull(driverClassName); 41 | } 42 | 43 | public void testInferDriverClassName_invalidUrl() throws Exception { 44 | String driverClassName = JdbcUtil.inferDriverClassName("localhost/hoge"); 45 | assertNull(driverClassName); 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /src/test/java/org/seasar/doma/extension/gen/internal/util/StringUtilTest.java: -------------------------------------------------------------------------------- 1 | package org.seasar.doma.extension.gen.internal.util; 2 | 3 | import junit.framework.TestCase; 4 | 5 | /** @author taedium */ 6 | public class StringUtilTest extends TestCase { 7 | 8 | public void testCapitalize() throws Exception { 9 | assertEquals("Aaa", StringUtil.capitalize("aaa")); 10 | } 11 | 12 | public void testDecapitalize() throws Exception { 13 | assertEquals("aAA", StringUtil.decapitalize("AAA")); 14 | } 15 | 16 | public void testFromSnakeCaseToCamelCase() throws Exception { 17 | assertEquals("aaaBbb", StringUtil.fromSnakeCaseToCamelCase("AAA_BBB")); 18 | } 19 | 20 | public void testFromCamelCaseToSnakeCase() throws Exception { 21 | assertEquals("aaa_bbb", StringUtil.fromCamelCaseToSnakeCase("aaaBbb")); 22 | } 23 | 24 | public void testIsNullOrEmpty() throws Exception { 25 | assertTrue(StringUtil.isNullOrEmpty(null)); 26 | assertTrue(StringUtil.isNullOrEmpty("")); 27 | assertFalse(StringUtil.isNullOrEmpty(" ")); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /src/test/java/org/seasar/doma/extension/gen/internal/util/TableUtilTest.java: -------------------------------------------------------------------------------- 1 | package org.seasar.doma.extension.gen.internal.util; 2 | 3 | import junit.framework.TestCase; 4 | 5 | /** @author taedium */ 6 | public class TableUtilTest extends TestCase { 7 | 8 | public void test() throws Exception { 9 | assertEquals("aaa.bbb.ccc", TableUtil.getQualifiedTableName("aaa", "bbb", "ccc")); 10 | assertEquals("bbb.ccc", TableUtil.getQualifiedTableName(null, "bbb", "ccc")); 11 | assertEquals("aaa.ccc", TableUtil.getQualifiedTableName("aaa", null, "ccc")); 12 | assertEquals("ccc", TableUtil.getQualifiedTableName(null, null, "ccc")); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/test/java/org/seasar/doma/extension/gen/task/GenTest.java: -------------------------------------------------------------------------------- 1 | package org.seasar.doma.extension.gen.task; 2 | 3 | import junit.framework.TestCase; 4 | 5 | /** @author nakamura-to */ 6 | public class GenTest extends TestCase { 7 | 8 | public void testSetTableTypes() throws Exception { 9 | Gen gen = new Gen(); 10 | gen.setTableTypes("MATERIALIZED VIEW, TABLE"); 11 | assertEquals(2, gen.tableTypes.size()); 12 | assertEquals("MATERIALIZED VIEW", gen.tableTypes.get(0)); 13 | assertEquals("TABLE", gen.tableTypes.get(1)); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/test/resources/META-INF/org/seasar/doma/extension/gen/GeneratorTest/insert.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/domaframework/doma-gen/054d8db0ed0d6ac6386040cbcef6ace1386aeb61/src/test/resources/META-INF/org/seasar/doma/extension/gen/GeneratorTest/insert.txt -------------------------------------------------------------------------------- /src/test/resources/META-INF/org/seasar/doma/extension/gen/GeneratorTest/select-oracle.sql: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/domaframework/doma-gen/054d8db0ed0d6ac6386040cbcef6ace1386aeb61/src/test/resources/META-INF/org/seasar/doma/extension/gen/GeneratorTest/select-oracle.sql -------------------------------------------------------------------------------- /src/test/resources/META-INF/org/seasar/doma/extension/gen/GeneratorTest/select.sql: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/domaframework/doma-gen/054d8db0ed0d6ac6386040cbcef6ace1386aeb61/src/test/resources/META-INF/org/seasar/doma/extension/gen/GeneratorTest/select.sql -------------------------------------------------------------------------------- /src/test/resources/META-INF/org/seasar/doma/extension/gen/GeneratorTest/update.sql: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/domaframework/doma-gen/054d8db0ed0d6ac6386040cbcef6ace1386aeb61/src/test/resources/META-INF/org/seasar/doma/extension/gen/GeneratorTest/update.sql -------------------------------------------------------------------------------- /src/test/resources/org/seasar/doma/extension/gen/EntityPropertyClassNameResolverTest.properties: -------------------------------------------------------------------------------- 1 | aaa.Bbb@ccc=java.lang.String 2 | ccc=java.lang.Double 3 | .*=java.lang.Long -------------------------------------------------------------------------------- /src/test/resources/org/seasar/doma/extension/gen/GeneratorTest_CompositeId.txt: -------------------------------------------------------------------------------- 1 | package example.entity; 2 | 3 | import org.seasar.doma.Column; 4 | import org.seasar.doma.Entity; 5 | import org.seasar.doma.Id; 6 | import org.seasar.doma.Table; 7 | 8 | /** 9 | * COMMENT for HOGE 10 | */ 11 | @Entity 12 | @Table(name = "HOGE") 13 | public class Hoge { 14 | 15 | /** COMMENT for ID */ 16 | @Id 17 | @Column(name = "ID1") 18 | Integer id1; 19 | 20 | /** COMMENT for ID */ 21 | @Id 22 | @Column(name = "ID2") 23 | Integer id2; 24 | 25 | /** 26 | * Returns the id1. 27 | * 28 | * @return the id1 29 | */ 30 | public Integer getId1() { 31 | return id1; 32 | } 33 | 34 | /** 35 | * Sets the id1. 36 | * 37 | * @param id1 the id1 38 | */ 39 | public void setId1(Integer id1) { 40 | this.id1 = id1; 41 | } 42 | 43 | /** 44 | * Returns the id2. 45 | * 46 | * @return the id2 47 | */ 48 | public Integer getId2() { 49 | return id2; 50 | } 51 | 52 | /** 53 | * Sets the id2. 54 | * 55 | * @param id2 the id2 56 | */ 57 | public void setId2(Integer id2) { 58 | this.id2 = id2; 59 | } 60 | } -------------------------------------------------------------------------------- /src/test/resources/org/seasar/doma/extension/gen/GeneratorTest_DefaultConfigDao.txt: -------------------------------------------------------------------------------- 1 | package example.dao; 2 | 3 | import example.entity.Hoge; 4 | import org.seasar.doma.Dao; 5 | import org.seasar.doma.Delete; 6 | import org.seasar.doma.Insert; 7 | import org.seasar.doma.Select; 8 | import org.seasar.doma.Update; 9 | 10 | /** 11 | */ 12 | @Dao 13 | public interface HogeDao { 14 | 15 | /** 16 | * @param id 17 | * @return the Hoge entity 18 | */ 19 | @Select 20 | Hoge selectById(Integer id); 21 | 22 | /** 23 | * @param id 24 | * @param version 25 | * @return the Hoge entity 26 | */ 27 | @Select(ensureResult = true) 28 | Hoge selectByIdAndVersion(Integer id, Integer version); 29 | 30 | /** 31 | * @param entity 32 | * @return affected rows 33 | */ 34 | @Insert 35 | int insert(Hoge entity); 36 | 37 | /** 38 | * @param entity 39 | * @return affected rows 40 | */ 41 | @Update 42 | int update(Hoge entity); 43 | 44 | /** 45 | * @param entity 46 | * @return affected rows 47 | */ 48 | @Delete 49 | int delete(Hoge entity); 50 | } -------------------------------------------------------------------------------- /src/test/resources/org/seasar/doma/extension/gen/GeneratorTest_EntityPropertyClassNameResolver.txt: -------------------------------------------------------------------------------- 1 | package example.entity; 2 | 3 | import example.domain.Name; 4 | import example.domain.XValue; 5 | import org.seasar.doma.Column; 6 | import org.seasar.doma.Entity; 7 | import org.seasar.doma.Id; 8 | import org.seasar.doma.Table; 9 | 10 | /** 11 | * COMMENT for HOGE 12 | */ 13 | @Entity 14 | @Table(name = "HOGE") 15 | public class Hoge { 16 | 17 | /** COMMENT for ID */ 18 | @Id 19 | @Column(name = "ID") 20 | Integer id; 21 | 22 | /** COMMENT for NAME */ 23 | @Column(name = "EMP_NAME") 24 | Name empName; 25 | 26 | /** COMMENT for XVAL */ 27 | @Column(name = "XVAL") 28 | XValue xval; 29 | 30 | /** 31 | * Returns the id. 32 | * 33 | * @return the id 34 | */ 35 | public Integer getId() { 36 | return id; 37 | } 38 | 39 | /** 40 | * Sets the id. 41 | * 42 | * @param id the id 43 | */ 44 | public void setId(Integer id) { 45 | this.id = id; 46 | } 47 | 48 | /** 49 | * Returns the empName. 50 | * 51 | * @return the empName 52 | */ 53 | public Name getEmpName() { 54 | return empName; 55 | } 56 | 57 | /** 58 | * Sets the empName. 59 | * 60 | * @param empName the empName 61 | */ 62 | public void setEmpName(Name empName) { 63 | this.empName = empName; 64 | } 65 | 66 | /** 67 | * Returns the xval. 68 | * 69 | * @return the xval 70 | */ 71 | public XValue getXval() { 72 | return xval; 73 | } 74 | 75 | /** 76 | * Sets the xval. 77 | * 78 | * @param xval the xval 79 | */ 80 | public void setXval(XValue xval) { 81 | this.xval = xval; 82 | } 83 | } -------------------------------------------------------------------------------- /src/test/resources/org/seasar/doma/extension/gen/GeneratorTest_EntitySuperclass.txt: -------------------------------------------------------------------------------- 1 | package example.entity; 2 | 3 | import example.hoge.CommonEntity; 4 | import org.seasar.doma.Column; 5 | import org.seasar.doma.Entity; 6 | import org.seasar.doma.Id; 7 | import org.seasar.doma.Table; 8 | 9 | /** 10 | * COMMENT for HOGE 11 | */ 12 | @Entity 13 | @Table(name = "HOGE") 14 | public class Hoge extends CommonEntity { 15 | 16 | /** COMMENT for ID */ 17 | @Id 18 | @Column(name = "ID") 19 | Integer id; 20 | 21 | /** 22 | * Returns the id. 23 | * 24 | * @return the id 25 | */ 26 | public Integer getId() { 27 | return id; 28 | } 29 | 30 | /** 31 | * Sets the id. 32 | * 33 | * @param id the id 34 | */ 35 | public void setId(Integer id) { 36 | this.id = id; 37 | } 38 | } -------------------------------------------------------------------------------- /src/test/resources/org/seasar/doma/extension/gen/GeneratorTest_ExtendingEntityListener.txt: -------------------------------------------------------------------------------- 1 | package example.entity; 2 | 3 | import aaa.FooListener; 4 | 5 | /** 6 | * 7 | */ 8 | public class HogeListener extends FooListener { 9 | } -------------------------------------------------------------------------------- /src/test/resources/org/seasar/doma/extension/gen/GeneratorTest_GenerationType_IDENTITY.txt: -------------------------------------------------------------------------------- 1 | package example.entity; 2 | 3 | import org.seasar.doma.Column; 4 | import org.seasar.doma.Entity; 5 | import org.seasar.doma.GeneratedValue; 6 | import org.seasar.doma.GenerationType; 7 | import org.seasar.doma.Id; 8 | import org.seasar.doma.Table; 9 | 10 | /** 11 | * COMMENT for HOGE 12 | */ 13 | @Entity 14 | @Table(name = "HOGE") 15 | public class Hoge { 16 | 17 | /** COMMENT for ID */ 18 | @Id 19 | @GeneratedValue(strategy = GenerationType.IDENTITY) 20 | @Column(name = "ID") 21 | Integer id; 22 | 23 | /** 24 | * Returns the id. 25 | * 26 | * @return the id 27 | */ 28 | public Integer getId() { 29 | return id; 30 | } 31 | 32 | /** 33 | * Sets the id. 34 | * 35 | * @param id the id 36 | */ 37 | public void setId(Integer id) { 38 | this.id = id; 39 | } 40 | } -------------------------------------------------------------------------------- /src/test/resources/org/seasar/doma/extension/gen/GeneratorTest_GenerationType_SEQUENCE.txt: -------------------------------------------------------------------------------- 1 | package example.entity; 2 | 3 | import org.seasar.doma.Column; 4 | import org.seasar.doma.Entity; 5 | import org.seasar.doma.GeneratedValue; 6 | import org.seasar.doma.GenerationType; 7 | import org.seasar.doma.Id; 8 | import org.seasar.doma.SequenceGenerator; 9 | import org.seasar.doma.Table; 10 | 11 | /** 12 | * COMMENT for HOGE 13 | */ 14 | @Entity 15 | @Table(name = "HOGE") 16 | public class Hoge { 17 | 18 | /** COMMENT for ID */ 19 | @Id 20 | @GeneratedValue(strategy = GenerationType.SEQUENCE) 21 | @SequenceGenerator(sequence = "HOGE_ID", initialValue = 100, allocationSize = 50) 22 | @Column(name = "ID") 23 | Integer id; 24 | 25 | /** 26 | * Returns the id. 27 | * 28 | * @return the id 29 | */ 30 | public Integer getId() { 31 | return id; 32 | } 33 | 34 | /** 35 | * Sets the id. 36 | * 37 | * @param id the id 38 | */ 39 | public void setId(Integer id) { 40 | this.id = id; 41 | } 42 | } -------------------------------------------------------------------------------- /src/test/resources/org/seasar/doma/extension/gen/GeneratorTest_GenerationType_TABLE.txt: -------------------------------------------------------------------------------- 1 | package example.entity; 2 | 3 | import org.seasar.doma.Column; 4 | import org.seasar.doma.Entity; 5 | import org.seasar.doma.GeneratedValue; 6 | import org.seasar.doma.GenerationType; 7 | import org.seasar.doma.Id; 8 | import org.seasar.doma.Table; 9 | import org.seasar.doma.TableGenerator; 10 | 11 | /** 12 | * COMMENT for HOGE 13 | */ 14 | @Entity 15 | @Table(name = "HOGE") 16 | public class Hoge { 17 | 18 | /** COMMENT for ID */ 19 | @Id 20 | @GeneratedValue(strategy = GenerationType.TABLE) 21 | @TableGenerator(pkColumnValue = "HOGE_ID", initialValue = 100, allocationSize = 50) 22 | @Column(name = "ID") 23 | Integer id; 24 | 25 | /** 26 | * Returns the id. 27 | * 28 | * @return the id 29 | */ 30 | public Integer getId() { 31 | return id; 32 | } 33 | 34 | /** 35 | * Sets the id. 36 | * 37 | * @param id the id 38 | */ 39 | public void setId(Integer id) { 40 | this.id = id; 41 | } 42 | } -------------------------------------------------------------------------------- /src/test/resources/org/seasar/doma/extension/gen/GeneratorTest_NamingType.txt: -------------------------------------------------------------------------------- 1 | package example.entity; 2 | 3 | import org.seasar.doma.Column; 4 | import org.seasar.doma.Entity; 5 | import org.seasar.doma.Id; 6 | import org.seasar.doma.Table; 7 | import org.seasar.doma.jdbc.entity.NamingType; 8 | 9 | /** 10 | * COMMENT for HOGE 11 | */ 12 | @Entity(naming = NamingType.SNAKE_UPPER_CASE) 13 | @Table(name = "HOGE") 14 | public class Hoge { 15 | 16 | /** COMMENT for ID */ 17 | @Id 18 | @Column(name = "ID") 19 | Integer id; 20 | 21 | /** 22 | * Returns the id. 23 | * 24 | * @return the id 25 | */ 26 | public Integer getId() { 27 | return id; 28 | } 29 | 30 | /** 31 | * Sets the id. 32 | * 33 | * @param id the id 34 | */ 35 | public void setId(Integer id) { 36 | this.id = id; 37 | } 38 | } -------------------------------------------------------------------------------- /src/test/resources/org/seasar/doma/extension/gen/GeneratorTest_OriginalStates.txt: -------------------------------------------------------------------------------- 1 | package example.entity; 2 | 3 | import org.seasar.doma.Column; 4 | import org.seasar.doma.Entity; 5 | import org.seasar.doma.Id; 6 | import org.seasar.doma.OriginalStates; 7 | import org.seasar.doma.Table; 8 | import org.seasar.doma.Version; 9 | 10 | /** 11 | * COMMENT for HOGE 12 | */ 13 | @Entity 14 | @Table(name = "HOGE") 15 | public class Hoge { 16 | 17 | /** COMMENT for ID */ 18 | @Id 19 | @Column(name = "ID") 20 | Integer id; 21 | 22 | /** COMMENT for NAME */ 23 | @Column(name = "EMP_NAME") 24 | String empName; 25 | 26 | /** COMMENT for VERSION */ 27 | @Version 28 | @Column(name = "VERSION") 29 | Integer version; 30 | 31 | /** */ 32 | @OriginalStates 33 | Hoge original; 34 | 35 | /** 36 | * Returns the id. 37 | * 38 | * @return the id 39 | */ 40 | public Integer getId() { 41 | return id; 42 | } 43 | 44 | /** 45 | * Sets the id. 46 | * 47 | * @param id the id 48 | */ 49 | public void setId(Integer id) { 50 | this.id = id; 51 | } 52 | 53 | /** 54 | * Returns the empName. 55 | * 56 | * @return the empName 57 | */ 58 | public String getEmpName() { 59 | return empName; 60 | } 61 | 62 | /** 63 | * Sets the empName. 64 | * 65 | * @param empName the empName 66 | */ 67 | public void setEmpName(String empName) { 68 | this.empName = empName; 69 | } 70 | 71 | /** 72 | * Returns the version. 73 | * 74 | * @return the version 75 | */ 76 | public Integer getVersion() { 77 | return version; 78 | } 79 | 80 | /** 81 | * Sets the version. 82 | * 83 | * @param version the version 84 | */ 85 | public void setVersion(Integer version) { 86 | this.version = version; 87 | } 88 | } -------------------------------------------------------------------------------- /src/test/resources/org/seasar/doma/extension/gen/GeneratorTest_SelectById.txt: -------------------------------------------------------------------------------- 1 | select 2 | /*%expand*/* 3 | from 4 | HOGE 5 | where 6 | ID = /* id */1 7 | -------------------------------------------------------------------------------- /src/test/resources/org/seasar/doma/extension/gen/GeneratorTest_SelectByIdAndVersion.txt: -------------------------------------------------------------------------------- 1 | select 2 | /*%expand*/* 3 | from 4 | HOGE 5 | where 6 | ID = /* id */1 7 | and 8 | VERSION = /* version */1 9 | -------------------------------------------------------------------------------- /src/test/resources/org/seasar/doma/extension/gen/GeneratorTest_SelectById_date.txt: -------------------------------------------------------------------------------- 1 | select 2 | /*%expand*/* 3 | from 4 | HOGE 5 | where 6 | ID = /* id */'2010-01-23' 7 | -------------------------------------------------------------------------------- /src/test/resources/org/seasar/doma/extension/gen/GeneratorTest_SelectById_entitySuperclass.txt: -------------------------------------------------------------------------------- 1 | select 2 | /*%expand*/* 3 | from 4 | HOGE 5 | where 6 | ID = /* id */1 7 | -------------------------------------------------------------------------------- /src/test/resources/org/seasar/doma/extension/gen/GeneratorTest_SelectById_number.txt: -------------------------------------------------------------------------------- 1 | select 2 | /*%expand*/* 3 | from 4 | HOGE 5 | where 6 | ID = /* id */1 7 | -------------------------------------------------------------------------------- /src/test/resources/org/seasar/doma/extension/gen/GeneratorTest_SelectById_time.txt: -------------------------------------------------------------------------------- 1 | select 2 | /*%expand*/* 3 | from 4 | HOGE 5 | where 6 | ID = /* id */'12:34:56' 7 | -------------------------------------------------------------------------------- /src/test/resources/org/seasar/doma/extension/gen/GeneratorTest_SelectById_timestamp.txt: -------------------------------------------------------------------------------- 1 | select 2 | /*%expand*/* 3 | from 4 | HOGE 5 | where 6 | ID = /* id */'2010-01-23 12:34:56' 7 | -------------------------------------------------------------------------------- /src/test/resources/org/seasar/doma/extension/gen/GeneratorTest_SelectById_varchar.txt: -------------------------------------------------------------------------------- 1 | select 2 | /*%expand*/* 3 | from 4 | HOGE 5 | where 6 | ID = /* id */'a' 7 | -------------------------------------------------------------------------------- /src/test/resources/org/seasar/doma/extension/gen/GeneratorTest_ShowColumnName_false.txt: -------------------------------------------------------------------------------- 1 | package example.entity; 2 | 3 | import org.seasar.doma.Column; 4 | import org.seasar.doma.Entity; 5 | import org.seasar.doma.Id; 6 | import org.seasar.doma.Table; 7 | 8 | /** 9 | * COMMENT for HOGE 10 | */ 11 | @Entity 12 | @Table(name = "HOGE") 13 | public class Hoge { 14 | 15 | /** COMMENT for ID */ 16 | @Id 17 | Integer id; 18 | 19 | /** COMMENT for EMP_NAME */ 20 | @Column(name = "EMP_NAME") 21 | String empName; 22 | 23 | /** 24 | * Returns the id. 25 | * 26 | * @return the id 27 | */ 28 | public Integer getId() { 29 | return id; 30 | } 31 | 32 | /** 33 | * Sets the id. 34 | * 35 | * @param id the id 36 | */ 37 | public void setId(Integer id) { 38 | this.id = id; 39 | } 40 | 41 | /** 42 | * Returns the empName. 43 | * 44 | * @return the empName 45 | */ 46 | public String getEmpName() { 47 | return empName; 48 | } 49 | 50 | /** 51 | * Sets the empName. 52 | * 53 | * @param empName the empName 54 | */ 55 | public void setEmpName(String empName) { 56 | this.empName = empName; 57 | } 58 | } -------------------------------------------------------------------------------- /src/test/resources/org/seasar/doma/extension/gen/GeneratorTest_ShowTableName_false.txt: -------------------------------------------------------------------------------- 1 | package example.entity; 2 | 3 | import org.seasar.doma.Column; 4 | import org.seasar.doma.Entity; 5 | import org.seasar.doma.Id; 6 | import org.seasar.doma.Table; 7 | 8 | /** 9 | * COMMENT for HOGE 10 | */ 11 | @Entity 12 | public class Hoge { 13 | 14 | /** COMMENT for ID */ 15 | @Id 16 | @Column(name = "ID") 17 | Integer id; 18 | 19 | /** COMMENT for EMP_NAME */ 20 | @Column(name = "EMP_NAME") 21 | String empName; 22 | 23 | /** 24 | * Returns the id. 25 | * 26 | * @return the id 27 | */ 28 | public Integer getId() { 29 | return id; 30 | } 31 | 32 | /** 33 | * Sets the id. 34 | * 35 | * @param id the id 36 | */ 37 | public void setId(Integer id) { 38 | this.id = id; 39 | } 40 | 41 | /** 42 | * Returns the empName. 43 | * 44 | * @return the empName 45 | */ 46 | public String getEmpName() { 47 | return empName; 48 | } 49 | 50 | /** 51 | * Sets the empName. 52 | * 53 | * @param empName the empName 54 | */ 55 | public void setEmpName(String empName) { 56 | this.empName = empName; 57 | } 58 | } -------------------------------------------------------------------------------- /src/test/resources/org/seasar/doma/extension/gen/GeneratorTest_SimpleDao.txt: -------------------------------------------------------------------------------- 1 | package example.dao; 2 | 3 | import dao.config.MyConfig; 4 | import example.entity.Hoge; 5 | import org.seasar.doma.Dao; 6 | import org.seasar.doma.Delete; 7 | import org.seasar.doma.Insert; 8 | import org.seasar.doma.Select; 9 | import org.seasar.doma.Update; 10 | 11 | /** 12 | */ 13 | @Dao(config = MyConfig.class) 14 | public interface HogeDao { 15 | 16 | /** 17 | * @param id 18 | * @return the Hoge entity 19 | */ 20 | @Select 21 | Hoge selectById(Integer id); 22 | 23 | /** 24 | * @param id 25 | * @param version 26 | * @return the Hoge entity 27 | */ 28 | @Select(ensureResult = true) 29 | Hoge selectByIdAndVersion(Integer id, Integer version); 30 | 31 | /** 32 | * @param entity 33 | * @return affected rows 34 | */ 35 | @Insert 36 | int insert(Hoge entity); 37 | 38 | /** 39 | * @param entity 40 | * @return affected rows 41 | */ 42 | @Update 43 | int update(Hoge entity); 44 | 45 | /** 46 | * @param entity 47 | * @return affected rows 48 | */ 49 | @Delete 50 | int delete(Hoge entity); 51 | } -------------------------------------------------------------------------------- /src/test/resources/org/seasar/doma/extension/gen/GeneratorTest_SimpleDao_with_prefix.txt: -------------------------------------------------------------------------------- 1 | package example.dao; 2 | 3 | import dao.config.MyConfig; 4 | import example.entity.THoge; 5 | import org.seasar.doma.Dao; 6 | import org.seasar.doma.Delete; 7 | import org.seasar.doma.Insert; 8 | import org.seasar.doma.Select; 9 | import org.seasar.doma.Update; 10 | 11 | /** 12 | */ 13 | @Dao(config = MyConfig.class) 14 | public interface THogeDao { 15 | 16 | /** 17 | * @param id 18 | * @return the THoge entity 19 | */ 20 | @Select 21 | THoge selectById(Integer id); 22 | 23 | /** 24 | * @param id 25 | * @param version 26 | * @return the THoge entity 27 | */ 28 | @Select(ensureResult = true) 29 | THoge selectByIdAndVersion(Integer id, Integer version); 30 | 31 | /** 32 | * @param entity 33 | * @return affected rows 34 | */ 35 | @Insert 36 | int insert(THoge entity); 37 | 38 | /** 39 | * @param entity 40 | * @return affected rows 41 | */ 42 | @Update 43 | int update(THoge entity); 44 | 45 | /** 46 | * @param entity 47 | * @return affected rows 48 | */ 49 | @Delete 50 | int delete(THoge entity); 51 | } -------------------------------------------------------------------------------- /src/test/resources/org/seasar/doma/extension/gen/GeneratorTest_SimpleDao_with_prefix_and_suffix.txt: -------------------------------------------------------------------------------- 1 | package example.dao; 2 | 3 | import dao.config.MyConfig; 4 | import example.entity.THogeEntity; 5 | import org.seasar.doma.Dao; 6 | import org.seasar.doma.Delete; 7 | import org.seasar.doma.Insert; 8 | import org.seasar.doma.Select; 9 | import org.seasar.doma.Update; 10 | 11 | /** 12 | */ 13 | @Dao(config = MyConfig.class) 14 | public interface THogeEntityDao { 15 | 16 | /** 17 | * @param id 18 | * @return the THogeEntity entity 19 | */ 20 | @Select 21 | THogeEntity selectById(Integer id); 22 | 23 | /** 24 | * @param id 25 | * @param version 26 | * @return the THogeEntity entity 27 | */ 28 | @Select(ensureResult = true) 29 | THogeEntity selectByIdAndVersion(Integer id, Integer version); 30 | 31 | /** 32 | * @param entity 33 | * @return affected rows 34 | */ 35 | @Insert 36 | int insert(THogeEntity entity); 37 | 38 | /** 39 | * @param entity 40 | * @return affected rows 41 | */ 42 | @Update 43 | int update(THogeEntity entity); 44 | 45 | /** 46 | * @param entity 47 | * @return affected rows 48 | */ 49 | @Delete 50 | int delete(THogeEntity entity); 51 | } -------------------------------------------------------------------------------- /src/test/resources/org/seasar/doma/extension/gen/GeneratorTest_SimpleDao_with_suffix.txt: -------------------------------------------------------------------------------- 1 | package example.dao; 2 | 3 | import dao.config.MyConfig; 4 | import example.entity.HogeEntity; 5 | import org.seasar.doma.Dao; 6 | import org.seasar.doma.Delete; 7 | import org.seasar.doma.Insert; 8 | import org.seasar.doma.Select; 9 | import org.seasar.doma.Update; 10 | 11 | /** 12 | */ 13 | @Dao(config = MyConfig.class) 14 | public interface HogeEntityDao { 15 | 16 | /** 17 | * @param id 18 | * @return the HogeEntity entity 19 | */ 20 | @Select 21 | HogeEntity selectById(Integer id); 22 | 23 | /** 24 | * @param id 25 | * @param version 26 | * @return the HogeEntity entity 27 | */ 28 | @Select(ensureResult = true) 29 | HogeEntity selectByIdAndVersion(Integer id, Integer version); 30 | 31 | /** 32 | * @param entity 33 | * @return affected rows 34 | */ 35 | @Insert 36 | int insert(HogeEntity entity); 37 | 38 | /** 39 | * @param entity 40 | * @return affected rows 41 | */ 42 | @Update 43 | int update(HogeEntity entity); 44 | 45 | /** 46 | * @param entity 47 | * @return affected rows 48 | */ 49 | @Delete 50 | int delete(HogeEntity entity); 51 | } -------------------------------------------------------------------------------- /src/test/resources/org/seasar/doma/extension/gen/GeneratorTest_SimpleEntity.txt: -------------------------------------------------------------------------------- 1 | package example.entity; 2 | 3 | import org.seasar.doma.Column; 4 | import org.seasar.doma.Entity; 5 | import org.seasar.doma.Id; 6 | import org.seasar.doma.Table; 7 | import org.seasar.doma.Version; 8 | 9 | /** 10 | * COMMENT for HOGE 11 | */ 12 | @Entity 13 | @Table(name = "HOGE") 14 | public class Hoge { 15 | 16 | /** COMMENT for ID */ 17 | @Id 18 | @Column(name = "ID") 19 | Integer id; 20 | 21 | /** COMMENT for NAME */ 22 | @Column(name = "EMP_NAME") 23 | String empName; 24 | 25 | /** COMMENT for VERSION */ 26 | @Version 27 | @Column(name = "VERSION") 28 | Integer version; 29 | 30 | /** 31 | * Returns the id. 32 | * 33 | * @return the id 34 | */ 35 | public Integer getId() { 36 | return id; 37 | } 38 | 39 | /** 40 | * Sets the id. 41 | * 42 | * @param id the id 43 | */ 44 | public void setId(Integer id) { 45 | this.id = id; 46 | } 47 | 48 | /** 49 | * Returns the empName. 50 | * 51 | * @return the empName 52 | */ 53 | public String getEmpName() { 54 | return empName; 55 | } 56 | 57 | /** 58 | * Sets the empName. 59 | * 60 | * @param empName the empName 61 | */ 62 | public void setEmpName(String empName) { 63 | this.empName = empName; 64 | } 65 | 66 | /** 67 | * Returns the version. 68 | * 69 | * @return the version 70 | */ 71 | public Integer getVersion() { 72 | return version; 73 | } 74 | 75 | /** 76 | * Sets the version. 77 | * 78 | * @param version the version 79 | */ 80 | public void setVersion(Integer version) { 81 | this.version = version; 82 | } 83 | } -------------------------------------------------------------------------------- /src/test/resources/org/seasar/doma/extension/gen/GeneratorTest_SimpleEntityListener.txt: -------------------------------------------------------------------------------- 1 | package example.entity; 2 | 3 | import org.seasar.doma.jdbc.entity.EntityListener; 4 | import org.seasar.doma.jdbc.entity.PostDeleteContext; 5 | import org.seasar.doma.jdbc.entity.PostInsertContext; 6 | import org.seasar.doma.jdbc.entity.PostUpdateContext; 7 | import org.seasar.doma.jdbc.entity.PreDeleteContext; 8 | import org.seasar.doma.jdbc.entity.PreInsertContext; 9 | import org.seasar.doma.jdbc.entity.PreUpdateContext; 10 | 11 | /** 12 | * 13 | */ 14 | public class HogeListener implements EntityListener { 15 | 16 | @Override 17 | public void preInsert(Hoge entity, PreInsertContext context) { 18 | } 19 | 20 | @Override 21 | public void preUpdate(Hoge entity, PreUpdateContext context) { 22 | } 23 | 24 | @Override 25 | public void preDelete(Hoge entity, PreDeleteContext context) { 26 | } 27 | 28 | @Override 29 | public void postInsert(Hoge entity, PostInsertContext context) { 30 | } 31 | 32 | @Override 33 | public void postUpdate(Hoge entity, PostUpdateContext context) { 34 | } 35 | 36 | @Override 37 | public void postDelete(Hoge entity, PostDeleteContext context) { 38 | } 39 | } -------------------------------------------------------------------------------- /src/test/resources/org/seasar/doma/extension/gen/GeneratorTest_SimpleEntityListener_with_prefix.txt: -------------------------------------------------------------------------------- 1 | package example.entity; 2 | 3 | import org.seasar.doma.jdbc.entity.EntityListener; 4 | import org.seasar.doma.jdbc.entity.PostDeleteContext; 5 | import org.seasar.doma.jdbc.entity.PostInsertContext; 6 | import org.seasar.doma.jdbc.entity.PostUpdateContext; 7 | import org.seasar.doma.jdbc.entity.PreDeleteContext; 8 | import org.seasar.doma.jdbc.entity.PreInsertContext; 9 | import org.seasar.doma.jdbc.entity.PreUpdateContext; 10 | 11 | /** 12 | * 13 | */ 14 | public class THogeListener implements EntityListener { 15 | 16 | @Override 17 | public void preInsert(THoge entity, PreInsertContext context) { 18 | } 19 | 20 | @Override 21 | public void preUpdate(THoge entity, PreUpdateContext context) { 22 | } 23 | 24 | @Override 25 | public void preDelete(THoge entity, PreDeleteContext context) { 26 | } 27 | 28 | @Override 29 | public void postInsert(THoge entity, PostInsertContext context) { 30 | } 31 | 32 | @Override 33 | public void postUpdate(THoge entity, PostUpdateContext context) { 34 | } 35 | 36 | @Override 37 | public void postDelete(THoge entity, PostDeleteContext context) { 38 | } 39 | } -------------------------------------------------------------------------------- /src/test/resources/org/seasar/doma/extension/gen/GeneratorTest_SimpleEntityListener_with_prefix_and_suffix.txt: -------------------------------------------------------------------------------- 1 | package example.entity; 2 | 3 | import org.seasar.doma.jdbc.entity.EntityListener; 4 | import org.seasar.doma.jdbc.entity.PostDeleteContext; 5 | import org.seasar.doma.jdbc.entity.PostInsertContext; 6 | import org.seasar.doma.jdbc.entity.PostUpdateContext; 7 | import org.seasar.doma.jdbc.entity.PreDeleteContext; 8 | import org.seasar.doma.jdbc.entity.PreInsertContext; 9 | import org.seasar.doma.jdbc.entity.PreUpdateContext; 10 | 11 | /** 12 | * 13 | */ 14 | public class THogeEntityListener implements EntityListener { 15 | 16 | @Override 17 | public void preInsert(THogeEntity entity, PreInsertContext context) { 18 | } 19 | 20 | @Override 21 | public void preUpdate(THogeEntity entity, PreUpdateContext context) { 22 | } 23 | 24 | @Override 25 | public void preDelete(THogeEntity entity, PreDeleteContext context) { 26 | } 27 | 28 | @Override 29 | public void postInsert(THogeEntity entity, PostInsertContext context) { 30 | } 31 | 32 | @Override 33 | public void postUpdate(THogeEntity entity, PostUpdateContext context) { 34 | } 35 | 36 | @Override 37 | public void postDelete(THogeEntity entity, PostDeleteContext context) { 38 | } 39 | } -------------------------------------------------------------------------------- /src/test/resources/org/seasar/doma/extension/gen/GeneratorTest_SimpleEntityListener_with_suffix.txt: -------------------------------------------------------------------------------- 1 | package example.entity; 2 | 3 | import org.seasar.doma.jdbc.entity.EntityListener; 4 | import org.seasar.doma.jdbc.entity.PostDeleteContext; 5 | import org.seasar.doma.jdbc.entity.PostInsertContext; 6 | import org.seasar.doma.jdbc.entity.PostUpdateContext; 7 | import org.seasar.doma.jdbc.entity.PreDeleteContext; 8 | import org.seasar.doma.jdbc.entity.PreInsertContext; 9 | import org.seasar.doma.jdbc.entity.PreUpdateContext; 10 | 11 | /** 12 | * 13 | */ 14 | public class HogeEntityListener implements EntityListener { 15 | 16 | @Override 17 | public void preInsert(HogeEntity entity, PreInsertContext context) { 18 | } 19 | 20 | @Override 21 | public void preUpdate(HogeEntity entity, PreUpdateContext context) { 22 | } 23 | 24 | @Override 25 | public void preDelete(HogeEntity entity, PreDeleteContext context) { 26 | } 27 | 28 | @Override 29 | public void postInsert(HogeEntity entity, PostInsertContext context) { 30 | } 31 | 32 | @Override 33 | public void postUpdate(HogeEntity entity, PostUpdateContext context) { 34 | } 35 | 36 | @Override 37 | public void postDelete(HogeEntity entity, PostDeleteContext context) { 38 | } 39 | } -------------------------------------------------------------------------------- /src/test/resources/org/seasar/doma/extension/gen/GeneratorTest_SimpleEntity_with_prefix.txt: -------------------------------------------------------------------------------- 1 | package example.entity; 2 | 3 | import org.seasar.doma.Column; 4 | import org.seasar.doma.Entity; 5 | import org.seasar.doma.Id; 6 | import org.seasar.doma.Table; 7 | import org.seasar.doma.Version; 8 | 9 | /** 10 | * COMMENT for HOGE 11 | */ 12 | @Entity 13 | @Table(name = "HOGE") 14 | public class THoge { 15 | 16 | /** COMMENT for ID */ 17 | @Id 18 | @Column(name = "ID") 19 | Integer id; 20 | 21 | /** COMMENT for NAME */ 22 | @Column(name = "EMP_NAME") 23 | String empName; 24 | 25 | /** COMMENT for VERSION */ 26 | @Version 27 | @Column(name = "VERSION") 28 | Integer version; 29 | 30 | /** 31 | * Returns the id. 32 | * 33 | * @return the id 34 | */ 35 | public Integer getId() { 36 | return id; 37 | } 38 | 39 | /** 40 | * Sets the id. 41 | * 42 | * @param id the id 43 | */ 44 | public void setId(Integer id) { 45 | this.id = id; 46 | } 47 | 48 | /** 49 | * Returns the empName. 50 | * 51 | * @return the empName 52 | */ 53 | public String getEmpName() { 54 | return empName; 55 | } 56 | 57 | /** 58 | * Sets the empName. 59 | * 60 | * @param empName the empName 61 | */ 62 | public void setEmpName(String empName) { 63 | this.empName = empName; 64 | } 65 | 66 | /** 67 | * Returns the version. 68 | * 69 | * @return the version 70 | */ 71 | public Integer getVersion() { 72 | return version; 73 | } 74 | 75 | /** 76 | * Sets the version. 77 | * 78 | * @param version the version 79 | */ 80 | public void setVersion(Integer version) { 81 | this.version = version; 82 | } 83 | } -------------------------------------------------------------------------------- /src/test/resources/org/seasar/doma/extension/gen/GeneratorTest_SimpleEntity_with_prefix_and_suffix.txt: -------------------------------------------------------------------------------- 1 | package example.entity; 2 | 3 | import org.seasar.doma.Column; 4 | import org.seasar.doma.Entity; 5 | import org.seasar.doma.Id; 6 | import org.seasar.doma.Table; 7 | import org.seasar.doma.Version; 8 | 9 | /** 10 | * COMMENT for HOGE 11 | */ 12 | @Entity 13 | @Table(name = "HOGE") 14 | public class THogeEntity { 15 | 16 | /** COMMENT for ID */ 17 | @Id 18 | @Column(name = "ID") 19 | Integer id; 20 | 21 | /** COMMENT for NAME */ 22 | @Column(name = "EMP_NAME") 23 | String empName; 24 | 25 | /** COMMENT for VERSION */ 26 | @Version 27 | @Column(name = "VERSION") 28 | Integer version; 29 | 30 | /** 31 | * Returns the id. 32 | * 33 | * @return the id 34 | */ 35 | public Integer getId() { 36 | return id; 37 | } 38 | 39 | /** 40 | * Sets the id. 41 | * 42 | * @param id the id 43 | */ 44 | public void setId(Integer id) { 45 | this.id = id; 46 | } 47 | 48 | /** 49 | * Returns the empName. 50 | * 51 | * @return the empName 52 | */ 53 | public String getEmpName() { 54 | return empName; 55 | } 56 | 57 | /** 58 | * Sets the empName. 59 | * 60 | * @param empName the empName 61 | */ 62 | public void setEmpName(String empName) { 63 | this.empName = empName; 64 | } 65 | 66 | /** 67 | * Returns the version. 68 | * 69 | * @return the version 70 | */ 71 | public Integer getVersion() { 72 | return version; 73 | } 74 | 75 | /** 76 | * Sets the version. 77 | * 78 | * @param version the version 79 | */ 80 | public void setVersion(Integer version) { 81 | this.version = version; 82 | } 83 | } -------------------------------------------------------------------------------- /src/test/resources/org/seasar/doma/extension/gen/GeneratorTest_SimpleEntity_with_suffix.txt: -------------------------------------------------------------------------------- 1 | package example.entity; 2 | 3 | import org.seasar.doma.Column; 4 | import org.seasar.doma.Entity; 5 | import org.seasar.doma.Id; 6 | import org.seasar.doma.Table; 7 | import org.seasar.doma.Version; 8 | 9 | /** 10 | * COMMENT for HOGE 11 | */ 12 | @Entity 13 | @Table(name = "HOGE") 14 | public class HogeEntity { 15 | 16 | /** COMMENT for ID */ 17 | @Id 18 | @Column(name = "ID") 19 | Integer id; 20 | 21 | /** COMMENT for NAME */ 22 | @Column(name = "EMP_NAME") 23 | String empName; 24 | 25 | /** COMMENT for VERSION */ 26 | @Version 27 | @Column(name = "VERSION") 28 | Integer version; 29 | 30 | /** 31 | * Returns the id. 32 | * 33 | * @return the id 34 | */ 35 | public Integer getId() { 36 | return id; 37 | } 38 | 39 | /** 40 | * Sets the id. 41 | * 42 | * @param id the id 43 | */ 44 | public void setId(Integer id) { 45 | this.id = id; 46 | } 47 | 48 | /** 49 | * Returns the empName. 50 | * 51 | * @return the empName 52 | */ 53 | public String getEmpName() { 54 | return empName; 55 | } 56 | 57 | /** 58 | * Sets the empName. 59 | * 60 | * @param empName the empName 61 | */ 62 | public void setEmpName(String empName) { 63 | this.empName = empName; 64 | } 65 | 66 | /** 67 | * Returns the version. 68 | * 69 | * @return the version 70 | */ 71 | public Integer getVersion() { 72 | return version; 73 | } 74 | 75 | /** 76 | * Sets the version. 77 | * 78 | * @param version the version 79 | */ 80 | public void setVersion(Integer version) { 81 | this.version = version; 82 | } 83 | } -------------------------------------------------------------------------------- /src/test/resources/org/seasar/doma/extension/gen/GeneratorTest_SimpleSqlTest.txt: -------------------------------------------------------------------------------- 1 | package example.dao; 2 | 3 | import java.lang.reflect.Method; 4 | import java.sql.Connection; 5 | import java.sql.Driver; 6 | import java.sql.DriverManager; 7 | import java.sql.Statement; 8 | 9 | import junit.framework.TestCase; 10 | 11 | import org.seasar.doma.jdbc.NoCacheSqlFileRepository; 12 | import org.seasar.doma.jdbc.SqlFile; 13 | import org.seasar.doma.jdbc.SqlFileRepository; 14 | import org.seasar.doma.jdbc.dialect.Dialect; 15 | 16 | /** 17 | * 18 | */ 19 | public class SqlTest extends TestCase { 20 | 21 | /** */ 22 | protected SqlFileRepository repository; 23 | 24 | /** */ 25 | protected Dialect dialect; 26 | 27 | /** */ 28 | protected Driver driver; 29 | 30 | /** */ 31 | protected String url; 32 | 33 | /** */ 34 | protected String user; 35 | 36 | /** */ 37 | protected String password; 38 | 39 | @Override 40 | protected void setUp() throws Exception { 41 | super.setUp(); 42 | repository = new NoCacheSqlFileRepository(); 43 | dialect = new org.seasar.doma.jdbc.dialect.StandardDialect(); 44 | @SuppressWarnings("unchecked") 45 | Class driverClass = (Class) Class.forName("org.hsqldb.jdbcDriver"); 46 | driver = driverClass.newInstance(); 47 | DriverManager.registerDriver(driver); 48 | url = "jdbc:hsqldb:mem:example"; 49 | user = "sa"; 50 | password = ""; 51 | } 52 | 53 | @Override 54 | protected void tearDown() throws Exception { 55 | DriverManager.deregisterDriver(driver); 56 | super.tearDown(); 57 | } 58 | 59 | /** 60 | * 61 | * @param sqlFile 62 | * @throws Exception 63 | */ 64 | protected void execute(SqlFile sqlFile) throws Exception { 65 | Connection connection = getConnection(); 66 | try { 67 | connection.setAutoCommit(false); 68 | Statement statement = connection.createStatement(); 69 | try { 70 | statement.execute(sqlFile.getSql()); 71 | } finally { 72 | statement.close(); 73 | } 74 | } finally { 75 | try { 76 | connection.rollback(); 77 | } finally { 78 | connection.close(); 79 | } 80 | } 81 | } 82 | 83 | /** 84 | * 85 | * @return 86 | * @throws Exception 87 | */ 88 | protected Connection getConnection() throws Exception { 89 | return DriverManager.getConnection(url, user, password); 90 | } 91 | 92 | /** 93 | * 94 | * @return method 95 | * @throws Exception 96 | */ 97 | protected Method getMethod() throws Exception { 98 | return getClass().getMethod(getName(), new Class[] {}); 99 | } 100 | 101 | /** 102 | * 103 | * @throws Exception 104 | */ 105 | public void testSelect() throws Exception { 106 | SqlFile sqlFile = repository.getSqlFile(getMethod(), "META-INF/org/seasar/doma/extension/gen/GeneratorTest/select.sql", dialect); 107 | execute(sqlFile); 108 | } 109 | 110 | /** 111 | * 112 | * @throws Exception 113 | */ 114 | public void testInsert() throws Exception { 115 | SqlFile sqlFile = repository.getSqlFile(getMethod(), "META-INF/org/seasar/doma/extension/gen/GeneratorTest/insert.sql", dialect); 116 | execute(sqlFile); 117 | } 118 | 119 | /** 120 | * 121 | * @throws Exception 122 | */ 123 | public void testUpdate() throws Exception { 124 | SqlFile sqlFile = repository.getSqlFile(getMethod(), "META-INF/org/seasar/doma/extension/gen/GeneratorTest/update.sql", dialect); 125 | execute(sqlFile); 126 | } 127 | 128 | } -------------------------------------------------------------------------------- /src/test/resources/org/seasar/doma/extension/gen/GeneratorTest_UseEntityListener.txt: -------------------------------------------------------------------------------- 1 | package example.entity; 2 | 3 | import org.seasar.doma.Column; 4 | import org.seasar.doma.Entity; 5 | import org.seasar.doma.Id; 6 | import org.seasar.doma.Table; 7 | 8 | /** 9 | * COMMENT for HOGE 10 | */ 11 | @Entity(listener = HogeListener.class) 12 | @Table(name = "HOGE") 13 | public class Hoge { 14 | 15 | /** COMMENT for ID */ 16 | @Id 17 | @Column(name = "ID") 18 | Integer id; 19 | 20 | /** 21 | * Returns the id. 22 | * 23 | * @return the id 24 | */ 25 | public Integer getId() { 26 | return id; 27 | } 28 | 29 | /** 30 | * Sets the id. 31 | * 32 | * @param id the id 33 | */ 34 | public void setId(Integer id) { 35 | this.id = id; 36 | } 37 | } -------------------------------------------------------------------------------- /src/test/resources/org/seasar/doma/extension/gen/entityPropertyClassNames.properties: -------------------------------------------------------------------------------- 1 | .*Name$=example.domain.Name 2 | .*x.*=example.domain.XValue --------------------------------------------------------------------------------