diff --git a/src/gaea.app/build.gradle b/src/gaea.app/build.gradle index 245325f..33766b2 100644 --- a/src/gaea.app/build.gradle +++ b/src/gaea.app/build.gradle @@ -6,7 +6,7 @@ dependencies { publishing { publications { - mavenJava(MavenPublication) { + publish(MavenPublication) { group 'com.synebula' artifactId 'gaea.app' version "$version" diff --git a/src/gaea.app/src/main/kotlin/com/synebula/gaea/app/UnionApp.kt b/src/gaea.app/src/main/kotlin/com/synebula/gaea/app/UnionApp.kt index 2cd5c2d..e646e67 100644 --- a/src/gaea.app/src/main/kotlin/com/synebula/gaea/app/UnionApp.kt +++ b/src/gaea.app/src/main/kotlin/com/synebula/gaea/app/UnionApp.kt @@ -1,5 +1,7 @@ package com.synebula.gaea.app +import com.synebula.gaea.app.cmd.ICommandApp +import com.synebula.gaea.app.query.IQueryApp import com.synebula.gaea.data.serialization.json.IJsonSerializer import com.synebula.gaea.domain.service.ICommand import com.synebula.gaea.domain.service.IService diff --git a/src/gaea.app/src/main/kotlin/com/synebula/gaea/app/UnionTypedApp.kt b/src/gaea.app/src/main/kotlin/com/synebula/gaea/app/UnionTypedApp.kt index 984b0fc..fcbae29 100644 --- a/src/gaea.app/src/main/kotlin/com/synebula/gaea/app/UnionTypedApp.kt +++ b/src/gaea.app/src/main/kotlin/com/synebula/gaea/app/UnionTypedApp.kt @@ -1,10 +1,11 @@ package com.synebula.gaea.app +import com.synebula.gaea.app.cmd.ICommandApp +import com.synebula.gaea.app.query.IQueryTypedApp import com.synebula.gaea.data.serialization.json.IJsonSerializer import com.synebula.gaea.domain.service.ICommand import com.synebula.gaea.domain.service.IService import com.synebula.gaea.log.ILogger -import com.synebula.gaea.query.IQuery import com.synebula.gaea.query.IQueryTyped import javax.annotation.Resource diff --git a/src/gaea.app/src/main/kotlin/com/synebula/gaea/app/CommandApp.kt b/src/gaea.app/src/main/kotlin/com/synebula/gaea/app/cmd/CommandApp.kt similarity index 95% rename from src/gaea.app/src/main/kotlin/com/synebula/gaea/app/CommandApp.kt rename to src/gaea.app/src/main/kotlin/com/synebula/gaea/app/cmd/CommandApp.kt index faf9d6b..217202f 100644 --- a/src/gaea.app/src/main/kotlin/com/synebula/gaea/app/CommandApp.kt +++ b/src/gaea.app/src/main/kotlin/com/synebula/gaea/app/cmd/CommandApp.kt @@ -1,4 +1,4 @@ -package com.synebula.gaea.app +package com.synebula.gaea.app.cmd import com.synebula.gaea.data.serialization.json.IJsonSerializer import com.synebula.gaea.domain.service.ICommand diff --git a/src/gaea.app/src/main/kotlin/com/synebula/gaea/app/ICommandApp.kt b/src/gaea.app/src/main/kotlin/com/synebula/gaea/app/cmd/ICommandApp.kt similarity index 96% rename from src/gaea.app/src/main/kotlin/com/synebula/gaea/app/ICommandApp.kt rename to src/gaea.app/src/main/kotlin/com/synebula/gaea/app/cmd/ICommandApp.kt index 69eedfc..d202bf5 100644 --- a/src/gaea.app/src/main/kotlin/com/synebula/gaea/app/ICommandApp.kt +++ b/src/gaea.app/src/main/kotlin/com/synebula/gaea/app/cmd/ICommandApp.kt @@ -1,12 +1,12 @@ -package com.synebula.gaea.app +package com.synebula.gaea.app.cmd +import com.synebula.gaea.app.IApplication import com.synebula.gaea.app.component.HttpMessage import com.synebula.gaea.data.message.Status import com.synebula.gaea.data.serialization.json.IJsonSerializer import com.synebula.gaea.domain.service.ICommand import com.synebula.gaea.domain.service.IService import org.springframework.web.bind.annotation.* -import javax.annotation.Resource /** * 应用类接口,提供向Command服务的接口 diff --git a/src/gaea.app/src/main/kotlin/com/synebula/gaea/app/IQueryApp.kt b/src/gaea.app/src/main/kotlin/com/synebula/gaea/app/query/IQueryApp.kt similarity index 96% rename from src/gaea.app/src/main/kotlin/com/synebula/gaea/app/IQueryApp.kt rename to src/gaea.app/src/main/kotlin/com/synebula/gaea/app/query/IQueryApp.kt index 58d5a14..aa8871a 100644 --- a/src/gaea.app/src/main/kotlin/com/synebula/gaea/app/IQueryApp.kt +++ b/src/gaea.app/src/main/kotlin/com/synebula/gaea/app/query/IQueryApp.kt @@ -1,5 +1,6 @@ -package com.synebula.gaea.app +package com.synebula.gaea.app.query +import com.synebula.gaea.app.IApplication import com.synebula.gaea.app.component.HttpMessage import com.synebula.gaea.data.message.Status import com.synebula.gaea.query.IQuery diff --git a/src/gaea.app/src/main/kotlin/com/synebula/gaea/app/IQueryTypedApp.kt b/src/gaea.app/src/main/kotlin/com/synebula/gaea/app/query/IQueryTypedApp.kt similarity index 90% rename from src/gaea.app/src/main/kotlin/com/synebula/gaea/app/IQueryTypedApp.kt rename to src/gaea.app/src/main/kotlin/com/synebula/gaea/app/query/IQueryTypedApp.kt index 1702abc..107ba24 100644 --- a/src/gaea.app/src/main/kotlin/com/synebula/gaea/app/IQueryTypedApp.kt +++ b/src/gaea.app/src/main/kotlin/com/synebula/gaea/app/query/IQueryTypedApp.kt @@ -1,8 +1,8 @@ -package com.synebula.gaea.app +package com.synebula.gaea.app.query +import com.synebula.gaea.app.IApplication import com.synebula.gaea.app.component.HttpMessage import com.synebula.gaea.data.message.Status -import com.synebula.gaea.query.IQuery import com.synebula.gaea.query.IQueryTyped import com.synebula.gaea.query.PagingParam import org.springframework.web.bind.annotation.GetMapping @@ -44,7 +44,7 @@ interface IQueryTypedApp : IApplication { fun list(@RequestParam parameters: MutableMap): HttpMessage { return this.safeExecute("获取${this.name}列表数据失败") { if (this.query != null) - it.data = this.query!!.list(parameters, viewClass) + it.data = this.query!!.list(parameters, viewClass) else { it.status = Status.Error it.message = "没有对应服务,无法执行该操作" @@ -58,7 +58,7 @@ interface IQueryTypedApp : IApplication { if (this.query != null) { val params = PagingParam(page, size) params.parameters = parameters - it.data = this.query!!.paging(params, viewClass) + it.data = this.query!!.paging(params, viewClass) } else { it.status = Status.Error it.message = "没有对应服务,无法执行该操作" diff --git a/src/gaea.app/src/main/kotlin/com/synebula/gaea/app/QueryApp.kt b/src/gaea.app/src/main/kotlin/com/synebula/gaea/app/query/QueryApp.kt similarity index 92% rename from src/gaea.app/src/main/kotlin/com/synebula/gaea/app/QueryApp.kt rename to src/gaea.app/src/main/kotlin/com/synebula/gaea/app/query/QueryApp.kt index 84dbe7c..59f47fc 100644 --- a/src/gaea.app/src/main/kotlin/com/synebula/gaea/app/QueryApp.kt +++ b/src/gaea.app/src/main/kotlin/com/synebula/gaea/app/query/QueryApp.kt @@ -1,4 +1,4 @@ -package com.synebula.gaea.app +package com.synebula.gaea.app.query import com.synebula.gaea.log.ILogger import com.synebula.gaea.query.IQuery diff --git a/src/gaea.app/src/main/kotlin/com/synebula/gaea/app/QueryTypedApp.kt b/src/gaea.app/src/main/kotlin/com/synebula/gaea/app/query/QueryTypedApp.kt similarity index 87% rename from src/gaea.app/src/main/kotlin/com/synebula/gaea/app/QueryTypedApp.kt rename to src/gaea.app/src/main/kotlin/com/synebula/gaea/app/query/QueryTypedApp.kt index e7c4cec..9462847 100644 --- a/src/gaea.app/src/main/kotlin/com/synebula/gaea/app/QueryTypedApp.kt +++ b/src/gaea.app/src/main/kotlin/com/synebula/gaea/app/query/QueryTypedApp.kt @@ -1,7 +1,6 @@ -package com.synebula.gaea.app +package com.synebula.gaea.app.query import com.synebula.gaea.log.ILogger -import com.synebula.gaea.query.IQuery import com.synebula.gaea.query.IQueryTyped /** diff --git a/src/gaea.mongo/build.gradle b/src/gaea.mongo/build.gradle index c196825..1ba6df0 100644 --- a/src/gaea.mongo/build.gradle +++ b/src/gaea.mongo/build.gradle @@ -5,7 +5,7 @@ dependencies { publishing { publications { - mavenJava(MavenPublication) { + publish(MavenPublication) { group 'com.synebula' artifactId 'gaea.mongo' version "$version" diff --git a/src/gaea.mongo/src/main/kotlin/com/synebula/gaea/mongo/MongoExt.kt b/src/gaea.mongo/src/main/kotlin/com/synebula/gaea/mongo/MongoExt.kt new file mode 100644 index 0000000..0333976 --- /dev/null +++ b/src/gaea.mongo/src/main/kotlin/com/synebula/gaea/mongo/MongoExt.kt @@ -0,0 +1,60 @@ +package com.synebula.gaea.mongo + +import com.synebula.gaea.query.OrderType +import org.springframework.data.domain.Sort +import org.springframework.data.mongodb.core.query.Criteria +import org.springframework.data.mongodb.core.query.Query +import org.springframework.data.mongodb.core.query.isEqualTo +import java.lang.reflect.Field + + +/** + * 获取查询条件 + * + * @param fields 字段列表 + */ +fun Query.select(fields: Array): Query { + fields.forEach { + this.fields().include(it) + } + return this +} + +/** + * 根据参数获取查询条件 + * + * @param params 参数列表 + */ +fun Query.where(params: Map?): Query { + val criteria = Criteria() + if (params != null) { + for (param in params) { + criteria.and(param.key).isEqualTo(param.value) + } + } + return this.addCriteria(criteria) +} + + +/** + * 获取ID查询条件 + * + * @param id 业务ID + */ +fun whereId(id: TKey): Query = Query(Criteria("_id").isEqualTo(id)) + +/** + * 获取排序对象 + * + * @param orders 排序条件字段 + */ +fun order(orders: Map?): Sort { + val orderList = mutableListOf() + orders?.forEach { + orderList.add(Sort.Order(Sort.Direction.valueOf(it.value.name), it.key)) + } + return if (orderList.size == 0) + Sort.by("_id") + else + Sort.by(orderList) +} diff --git a/src/gaea.mongo/src/main/kotlin/com/synebula/gaea/query/mongo/MongoQuery.kt b/src/gaea.mongo/src/main/kotlin/com/synebula/gaea/mongo/query/MongoQuery.kt similarity index 77% rename from src/gaea.mongo/src/main/kotlin/com/synebula/gaea/query/mongo/MongoQuery.kt rename to src/gaea.mongo/src/main/kotlin/com/synebula/gaea/mongo/query/MongoQuery.kt index 6003b6a..a8047a9 100644 --- a/src/gaea.mongo/src/main/kotlin/com/synebula/gaea/query/mongo/MongoQuery.kt +++ b/src/gaea.mongo/src/main/kotlin/com/synebula/gaea/mongo/query/MongoQuery.kt @@ -1,7 +1,12 @@ -package com.synebula.gaea.query.mongo +package com.synebula.gaea.mongo.query +import com.synebula.gaea.extension.fields import com.synebula.gaea.extension.firstCharLowerCase import com.synebula.gaea.log.ILogger +import com.synebula.gaea.mongo.order +import com.synebula.gaea.mongo.select +import com.synebula.gaea.mongo.where +import com.synebula.gaea.mongo.whereId import com.synebula.gaea.query.IQuery import com.synebula.gaea.query.PagingData import com.synebula.gaea.query.PagingParam @@ -12,8 +17,7 @@ import org.springframework.data.mongodb.core.query.Query * 实现IQuery的Mongo查询类 * @param repo MongoRepo对象 */ -open class MongoQuery(var repo: MongoTemplate, override var logger: ILogger? = null) : - IQuery, IMongoQuery { +open class MongoQuery(var repo: MongoTemplate, var logger: ILogger? = null) : IQuery { /** * 查询的对象类 */ @@ -74,10 +78,10 @@ open class MongoQuery(var repo: MongoTemplate, override var logger: ILogg override fun list(params: Map?): List { this.check() return if (this.clazz != null) { - val viewFields = this.fields(this.clazz!!) + val fields = this.clazz!!.fields() val query = Query() - this.where(query, params, this.clazz!!) - this.select(query, viewFields.toTypedArray()) + query.select(fields.toTypedArray()) + query.where(params) this.repo.find(query, this.clazz!!, this.collection) } else listOf() } @@ -86,21 +90,19 @@ open class MongoQuery(var repo: MongoTemplate, override var logger: ILogg this.check() return if (this.clazz != null) { val query = Query() - this.repo.count(where(query, params, this.clazz!!), this.collection).toInt() + this.repo.count(query.where(params), this.collection).toInt() } else 0 } override fun paging(params: PagingParam): PagingData { this.check() return if (this.clazz != null) { - val viewFields = this.fields(this.clazz!!) - val result = PagingData(1, 10) - result.size = params.size - result.page = params.page val query = Query() - this.where(query, params.parameters, this.clazz!!) - result.total = this.repo.count(query, this.collection).toInt() - this.select(query, viewFields.toTypedArray()) + val fields = this.clazz!!.fields() + val result = PagingData(params.page, params.size) + query.where(params.parameters) + result.total = this.count(params.parameters) + query.select(fields.toTypedArray()) query.with(order(params.orderBy)) query.skip(params.index).limit(params.size) result.data = this.repo.find(query, this.clazz!!, this.collection) @@ -111,7 +113,7 @@ open class MongoQuery(var repo: MongoTemplate, override var logger: ILogg override fun get(key: String): TView? { this.check() return if (this.clazz != null) { - val view = this.repo.findOne(idQuery(key), this.clazz!!, this.collection) + val view = this.repo.findOne(whereId(key), this.clazz!!, this.collection) view } else null } diff --git a/src/gaea.mongo/src/main/kotlin/com/synebula/gaea/query/mongo/MongoQueryTyped.kt b/src/gaea.mongo/src/main/kotlin/com/synebula/gaea/mongo/query/MongoQueryTyped.kt similarity index 64% rename from src/gaea.mongo/src/main/kotlin/com/synebula/gaea/query/mongo/MongoQueryTyped.kt rename to src/gaea.mongo/src/main/kotlin/com/synebula/gaea/mongo/query/MongoQueryTyped.kt index 3045ca3..22a32e2 100644 --- a/src/gaea.mongo/src/main/kotlin/com/synebula/gaea/query/mongo/MongoQueryTyped.kt +++ b/src/gaea.mongo/src/main/kotlin/com/synebula/gaea/mongo/query/MongoQueryTyped.kt @@ -1,7 +1,12 @@ -package com.synebula.gaea.query.mongo +package com.synebula.gaea.mongo.query +import com.synebula.gaea.extension.fields import com.synebula.gaea.extension.firstCharLowerCase import com.synebula.gaea.log.ILogger +import com.synebula.gaea.mongo.order +import com.synebula.gaea.mongo.select +import com.synebula.gaea.mongo.where +import com.synebula.gaea.mongo.whereId import com.synebula.gaea.query.IQueryTyped import com.synebula.gaea.query.PagingData import com.synebula.gaea.query.PagingParam @@ -14,7 +19,7 @@ import java.lang.RuntimeException * @param repo MongoRepo对象 */ -open class MongoQueryTyped(var repo: MongoTemplate, override var logger: ILogger? = null) : IQueryTyped, IMongoQuery { +open class MongoQueryTyped(var repo: MongoTemplate, var logger: ILogger? = null) : IQueryTyped { /** * 查询的集合名称 @@ -29,28 +34,28 @@ open class MongoQueryTyped(var repo: MongoTemplate, override var logger: ILogger */ var validViewCollection = false - override fun list(params: Map?, clazz: Class): List { - val viewFields = this.fields(clazz) + override fun list(params: Map?, clazz: Class): List { + val fields = clazz.fields() val query = Query() - this.where(query, params, clazz) - this.select(query, viewFields.toTypedArray()) + query.where(params) + query.select(fields.toTypedArray()) return this.repo.find(query, clazz, this.collection(clazz)) } - override fun count(params: Map?, clazz: Class): Int { + override fun count(params: Map?, clazz: Class): Int { val query = Query() - return this.repo.count(this.where(query, params, clazz), this.collection(clazz)).toInt() + return this.repo.count(query.where(params), this.collection(clazz)).toInt() } - override fun paging(params: PagingParam, clazz: Class): PagingData { - val viewFields = this.fields(clazz) + override fun paging(params: PagingParam, clazz: Class): PagingData { + val fields = clazz.fields() val result = PagingData(1, 10) result.size = params.size result.page = params.page val query = Query() - this.where(query, params.parameters, clazz) - result.total = this.count(params.parameters, clazz) - this.select(query, viewFields.toTypedArray()) + query.where(params.parameters) + result.total = this.count(params.parameters, clazz) + query.select(fields.toTypedArray()) query.with(order(params.orderBy)) query.skip(params.index).limit(params.size) result.data = this.repo.find(query, clazz, this.collection(clazz)) @@ -58,7 +63,7 @@ open class MongoQueryTyped(var repo: MongoTemplate, override var logger: ILogger } override fun get(key: TKey, clazz: Class): TView? { - return this.repo.findOne(idQuery(key), clazz, this.collection(clazz)) + return this.repo.findOne(whereId(key), clazz, this.collection(clazz)) } /** @@ -66,7 +71,7 @@ open class MongoQueryTyped(var repo: MongoTemplate, override var logger: ILogger */ protected fun collection(clazz: Class): String { return if (this.collection.isEmpty()) { - this.logger?.warn(this, "查询集合参数[collection]值为空, 尝试使用View<${clazz.name}>名称解析集合") + this.logger?.info(this, "查询集合参数[collection]值为空, 尝试使用View<${clazz.name}>名称解析集合") val collection = clazz.simpleName.removeSuffix("View").firstCharLowerCase() if (!validViewCollection || this.repo.collectionExists(collection)) collection diff --git a/src/gaea.mongo/src/main/kotlin/com/synebula/gaea/mongo/repository/MongoRepository.kt b/src/gaea.mongo/src/main/kotlin/com/synebula/gaea/mongo/repository/MongoRepository.kt new file mode 100644 index 0000000..22d14f4 --- /dev/null +++ b/src/gaea.mongo/src/main/kotlin/com/synebula/gaea/mongo/repository/MongoRepository.kt @@ -0,0 +1,48 @@ +package com.synebula.gaea.mongo.repository + +import com.synebula.gaea.domain.model.IAggregateRoot +import com.synebula.gaea.domain.repository.IRepository +import com.synebula.gaea.mongo.whereId +import org.springframework.data.mongodb.core.MongoTemplate + +/** + * 实现IAggregateRoot的mongo仓储类 + * @param repo MongoRepo对象 + */ +class MongoRepository>(private var repo: MongoTemplate) + : IRepository { + + /** + * 仓储的对象类 + */ + override var clazz: Class? = null + + /** + * 构造 + * @param clazz 仓储Domain对象 + * @param repo MongoRepo对象 + */ + constructor(clazz: Class, repo: MongoTemplate) : this(repo) { + this.clazz = clazz + } + + override fun add(obj: TAggregateRoot) { + this.repo.save(obj) + } + + override fun update(obj: TAggregateRoot) { + this.repo.save(obj) + } + + override fun remove(id: String) { + this.repo.remove(whereId(id), this.clazz!!) + } + + override fun get(id: String): TAggregateRoot { + return this.repo.findOne(whereId(id), clazz!!) as TAggregateRoot + } + + override fun , TKey> get(id: TKey, clazz: Class): TAggregateRoot { + return this.repo.findOne(whereId(id.toString()), clazz) as TAggregateRoot + } +} diff --git a/src/gaea.mongo/src/main/kotlin/com/synebula/gaea/mongo/repository/MongoRepositoryTyped.kt b/src/gaea.mongo/src/main/kotlin/com/synebula/gaea/mongo/repository/MongoRepositoryTyped.kt new file mode 100644 index 0000000..8e6e80b --- /dev/null +++ b/src/gaea.mongo/src/main/kotlin/com/synebula/gaea/mongo/repository/MongoRepositoryTyped.kt @@ -0,0 +1,30 @@ +package com.synebula.gaea.mongo.repository + +import com.synebula.gaea.domain.model.IAggregateRoot +import com.synebula.gaea.domain.repository.IRepositoryTyped +import com.synebula.gaea.mongo.whereId +import org.springframework.data.mongodb.core.MongoTemplate + +/** + * 实现ITypedRepository的mongo仓储类 + * @param repo MongoRepo对象 + */ +open class MongoRepositoryTyped(private var repo: MongoTemplate) + : IRepositoryTyped { + + override fun , TKey> remove(id: TKey, clazz: Class) { + this.repo.remove(whereId(id), clazz) + } + + override fun , TKey> get(id: TKey, clazz: Class): TAggregateRoot { + return this.repo.findOne(whereId(id), clazz) as TAggregateRoot + } + + override fun , TKey> update(obj: TAggregateRoot, clazz: Class) { + this.repo.save(obj) + } + + override fun , TKey> add(obj: TAggregateRoot, clazz: Class) { + this.repo.save(obj) + } +} diff --git a/src/gaea.mongo/src/main/kotlin/com/synebula/gaea/query/mongo/IMongoQuery.kt b/src/gaea.mongo/src/main/kotlin/com/synebula/gaea/query/mongo/IMongoQuery.kt deleted file mode 100644 index 68985ba..0000000 --- a/src/gaea.mongo/src/main/kotlin/com/synebula/gaea/query/mongo/IMongoQuery.kt +++ /dev/null @@ -1,153 +0,0 @@ -package com.synebula.gaea.query.mongo - -import com.synebula.gaea.log.ILogger -import com.synebula.gaea.query.OrderType -import org.springframework.data.domain.Sort -import org.springframework.data.mongodb.core.query.Criteria -import org.springframework.data.mongodb.core.query.Query -import org.springframework.data.mongodb.core.query.isEqualTo -import java.lang.reflect.Field - -/** - * 声明了Mongo查询的特有方法 - */ -interface IMongoQuery { - /** - * 日志组件 - */ - var logger: ILogger? - - /** - * 系统类型 - */ - private fun systemClass() = arrayOf( - "String", - "Date", - "Int", - "Double", - "Float", - "BigDecimal", - "Decimal") - - /** - * 获取ID查询条件 - * - * @param id 业务ID - */ - fun idQuery(id: TKey): Query = Query(Criteria("_id").isEqualTo(id)) - - /** - * 获取视图对象的字段列表 - * - * @param clazz 视图对象类型 - */ - fun fields(clazz: Class): List { - return analyseFields(clazz.declaredFields) - } - - /** - * 获取查询条件 - * - * @param query 查询条件 - * @param fields 字段列表 - */ - fun select(query: Query, fields: Array): Query { - fields.forEach { - query.fields().include(it) - } - return query - } - - /** - * 根据参数获取查询条件 - * - * @param query 查询条件 - * @param params 参数列表 - * @param clazz 视图类对象 - */ - fun where(query: Query, params: Map?, clazz: Class): Query { - val criteria = Criteria() - if (params != null) { - for (param in params) { - val value = this.changeFieldType(param.key, param.value, clazz) - criteria.and(param.key).isEqualTo(value) - } - } - return query.addCriteria(criteria) - } - - /** - * 获取排序对象 - * - * @param orders 排序条件字段 - */ - fun order(orders: Map?): Sort { - val orderList = mutableListOf() - orders?.forEach { - orderList.add(Sort.Order(Sort.Direction.valueOf(it.value.name), it.key)) - } - return if (orderList.size == 0) - Sort.by("_id") - else - Sort.by(orderList) - } - - /** - * 分析视图字段对象,获取深层字段列表 - * - * @param fields 需要分析的视图字段 - */ - fun analyseFields(fields: Array): List { - val names = mutableListOf() - fields.forEach { field -> - names.add(field.name) - if (!field.type.isPrimitive - && !field.type.isArray - && !this.systemClass().contains(field.type.simpleName)) - names.addAll(this.analyseFields(field.type.declaredFields).map { "${field.name}.$it" }) - } - return names - } - - /** - * 转换查询条件指定字段的类型 - * - * @param key 字段名称 - * @param value 字段值 - * @param clazz 视图类对象 - */ - fun changeFieldType(key: String, value: Any, clazz: Class): Any? { - val getter = clazz.getMethod("get${key.substring(0, 1).toUpperCase()}${key.substring(1)}") - return this.convertType(value.toString(), getter.returnType) - } - - - /** - * 转换String到指定类型 - * - * @param value 字段值 - * @param clazz 视图类对象 - */ - fun convertType(value: String, clazz: Class<*>): Any? { - if (!clazz.isPrimitive) { // 判断基本类型 - if (clazz == String::class.java) { // 如果是string则直接返回 - return value - } - // 如果不为null 则通过反射实例一个对象返回 - return if ("" == value) null else clazz.getConstructor(String::class.java).newInstance(value) - } - - // 下面处理基本类型,返回包装类 - return when (clazz.name) { - "int" -> Integer.parseInt(value) - "byte" -> java.lang.Byte.parseByte(value) - "boolean" -> java.lang.Boolean.parseBoolean(value) - "double" -> java.lang.Double.parseDouble(value) - "float" -> java.lang.Float.parseFloat(value) - "long" -> java.lang.Long.parseLong(value) - "short" -> java.lang.Short.parseShort(value) - else -> value - } - } - -} diff --git a/src/gaea.mongo/src/main/kotlin/com/synebula/gaea/repository/mongo/IMongoRepository.kt b/src/gaea.mongo/src/main/kotlin/com/synebula/gaea/repository/mongo/IMongoRepository.kt deleted file mode 100644 index 0d8f9d0..0000000 --- a/src/gaea.mongo/src/main/kotlin/com/synebula/gaea/repository/mongo/IMongoRepository.kt +++ /dev/null @@ -1,14 +0,0 @@ -package com.synebula.gaea.repository.mongo - -import org.springframework.data.mongodb.core.query.Criteria -import org.springframework.data.mongodb.core.query.Query -import org.springframework.data.mongodb.core.query.isEqualTo - -interface IMongoRepository { - /** - * 获取ID查询条件 - * - * @param id 业务ID - */ - fun idQuery(id: TKey): Query = Query(Criteria("_id").isEqualTo(id)) -} diff --git a/src/gaea.mongo/src/main/kotlin/com/synebula/gaea/repository/mongo/MongoRepository.kt b/src/gaea.mongo/src/main/kotlin/com/synebula/gaea/repository/mongo/MongoRepository.kt deleted file mode 100644 index 462b609..0000000 --- a/src/gaea.mongo/src/main/kotlin/com/synebula/gaea/repository/mongo/MongoRepository.kt +++ /dev/null @@ -1,50 +0,0 @@ -package com.synebula.gaea.repository.mongo - -import com.synebula.gaea.domain.model.IAggregateRoot -import com.synebula.gaea.domain.repository.IRepository -import org.springframework.data.mongodb.core.MongoTemplate -import org.springframework.data.mongodb.core.query.Criteria -import org.springframework.data.mongodb.core.query.Query -import org.springframework.data.mongodb.core.query.isEqualTo - -/** - * 实现IAggregateRoot的mongo仓储类 - * @param repo MongoRepo对象 - */ -class MongoRepository>(private var repo: MongoTemplate) - : IRepository, IMongoRepository { - - /** - * 仓储的对象类 - */ - override var clazz: Class? = null - - /** - * 构造 - * @param clazz 仓储Domain对象 - * @param repo MongoRepo对象 - */ - constructor(clazz: Class, repo: MongoTemplate) : this(repo) { - this.clazz = clazz - } - - override fun add(obj: TAggregateRoot) { - this.repo.save(obj) - } - - override fun update(obj: TAggregateRoot) { - this.repo.save(obj) - } - - override fun remove(id: String) { - this.repo.remove(idQuery(id), this.clazz!!) - } - - override fun get(id: String): TAggregateRoot { - return this.repo.findOne(idQuery(id), clazz!!) as TAggregateRoot - } - - override fun , TKey> get(id: TKey, clazz: Class): TAggregateRoot { - return this.repo.findOne(idQuery(id.toString()), clazz) as TAggregateRoot - } -} diff --git a/src/gaea.mongo/src/main/kotlin/com/synebula/gaea/repository/mongo/MongoRepositoryTyped.kt b/src/gaea.mongo/src/main/kotlin/com/synebula/gaea/repository/mongo/MongoRepositoryTyped.kt deleted file mode 100644 index 1aed41b..0000000 --- a/src/gaea.mongo/src/main/kotlin/com/synebula/gaea/repository/mongo/MongoRepositoryTyped.kt +++ /dev/null @@ -1,34 +0,0 @@ -package com.synebula.gaea.repository.mongo - -import com.synebula.gaea.domain.model.IAggregateRoot -import com.synebula.gaea.domain.repository.IRepositoryTyped -import org.springframework.data.mongodb.core.MongoTemplate -import org.springframework.data.mongodb.core.query.Criteria -import org.springframework.data.mongodb.core.query.Query -import org.springframework.data.mongodb.core.query.isEqualTo - -/** - * 实现ITypedRepository的mongo仓储类 - * @param repo MongoRepo对象 - */ -open class MongoRepositoryTyped(private var repo: MongoTemplate) - : IRepositoryTyped, IMongoRepository { - - override fun , TKey> remove(id: TKey, clazz: Class) { - this.repo.remove(idQuery(id), clazz) - } - - override fun , TKey> get(id: TKey, clazz: Class): TAggregateRoot { - return this.repo.findOne(idQuery(id), clazz) as TAggregateRoot - } - - override fun , TKey> update(obj: TAggregateRoot, clazz: Class) { - this.repo.save(obj) - } - - override fun , TKey> add(obj: TAggregateRoot, clazz: Class) { - this.repo.save(obj) - } - - -} diff --git a/src/gaea/build.gradle b/src/gaea/build.gradle index ea73262..f049c0d 100644 --- a/src/gaea/build.gradle +++ b/src/gaea/build.gradle @@ -1,6 +1,6 @@ publishing { publications { - mavenJava(MavenPublication) { + publish(MavenPublication) { group 'com.synebula' artifactId 'gaea' version "$version" diff --git a/src/gaea/src/main/kotlin/com/synebula/gaea/data/date/DateTime.kt b/src/gaea/src/main/kotlin/com/synebula/gaea/data/date/DateTime.kt index 6593fb9..8348d94 100644 --- a/src/gaea/src/main/kotlin/com/synebula/gaea/data/date/DateTime.kt +++ b/src/gaea/src/main/kotlin/com/synebula/gaea/data/date/DateTime.kt @@ -1,6 +1,5 @@ package com.synebula.gaea.data.date -import com.synebula.gaea.data.type.TimeUnit import java.text.ParseException import java.text.SimpleDateFormat import java.util.* @@ -73,8 +72,6 @@ class DateTime : Comparable { return DateTime(instance) } - constructor() - /** * 从Date格式转化 */ diff --git a/src/gaea/src/main/kotlin/com/synebula/gaea/data/date/TimeExchanger.kt b/src/gaea/src/main/kotlin/com/synebula/gaea/data/date/TimeExchanger.kt index 8cce68b..50f0f81 100644 --- a/src/gaea/src/main/kotlin/com/synebula/gaea/data/date/TimeExchanger.kt +++ b/src/gaea/src/main/kotlin/com/synebula/gaea/data/date/TimeExchanger.kt @@ -1,7 +1,5 @@ package com.synebula.gaea.data.date -import com.synebula.gaea.data.type.TimeUnit - object TimeExchanger { /** * 转换率。分别对应:毫秒、秒、分、时、日 diff --git a/src/gaea/src/main/kotlin/com/synebula/gaea/data/type/TimeUnit.kt b/src/gaea/src/main/kotlin/com/synebula/gaea/data/date/TimeUnit.kt similarity index 74% rename from src/gaea/src/main/kotlin/com/synebula/gaea/data/type/TimeUnit.kt rename to src/gaea/src/main/kotlin/com/synebula/gaea/data/date/TimeUnit.kt index a74b3b4..db4a21b 100644 --- a/src/gaea/src/main/kotlin/com/synebula/gaea/data/type/TimeUnit.kt +++ b/src/gaea/src/main/kotlin/com/synebula/gaea/data/date/TimeUnit.kt @@ -1,4 +1,4 @@ -package com.synebula.gaea.data.type +package com.synebula.gaea.data.date enum class TimeUnit { Millisecond, diff --git a/src/gaea/src/main/kotlin/com/synebula/gaea/data/type/DataOperateType.kt b/src/gaea/src/main/kotlin/com/synebula/gaea/data/type/DataOperateType.kt deleted file mode 100644 index 168362b..0000000 --- a/src/gaea/src/main/kotlin/com/synebula/gaea/data/type/DataOperateType.kt +++ /dev/null @@ -1,15 +0,0 @@ -package com.synebula.gaea.data.type - -/** - * 数据操作类型。包括创建、更新和删除。 - * @author alex - * @version 0.0.1 - * @since 2016年8月17日 下午2:48:29 - */ -enum class DataOperateType { - Create, - - Update, - - Remove -} diff --git a/src/gaea/src/main/kotlin/com/synebula/gaea/data/type/SortDirectionEnum.kt b/src/gaea/src/main/kotlin/com/synebula/gaea/data/type/SortDirectionEnum.kt deleted file mode 100644 index c102326..0000000 --- a/src/gaea/src/main/kotlin/com/synebula/gaea/data/type/SortDirectionEnum.kt +++ /dev/null @@ -1,16 +0,0 @@ -package com.synebula.gaea.data.type - -/* - * 排序枚举 - */ -enum class SortDirectionEnum { - /* - * 升序 - */ - ASC, - - /* - * 降序 - */ - DESC -} diff --git a/src/gaea/src/main/kotlin/com/synebula/gaea/data/type/Status.kt b/src/gaea/src/main/kotlin/com/synebula/gaea/data/type/Status.kt deleted file mode 100644 index e69de29..0000000 diff --git a/src/gaea/src/main/kotlin/com/synebula/gaea/domain/service/Command.kt b/src/gaea/src/main/kotlin/com/synebula/gaea/domain/service/Command.kt index 4d99397..b0f3e75 100644 --- a/src/gaea/src/main/kotlin/com/synebula/gaea/domain/service/Command.kt +++ b/src/gaea/src/main/kotlin/com/synebula/gaea/domain/service/Command.kt @@ -9,6 +9,6 @@ import java.util.* * @version 0.1 * @since 2020-05-15 */ -class Command : ICommand { +open class Command : ICommand { override var timestamp = 0L } diff --git a/src/gaea/src/main/kotlin/com/synebula/gaea/extension/ClassExt.kt b/src/gaea/src/main/kotlin/com/synebula/gaea/extension/ClassExt.kt new file mode 100644 index 0000000..c7afc3a --- /dev/null +++ b/src/gaea/src/main/kotlin/com/synebula/gaea/extension/ClassExt.kt @@ -0,0 +1,32 @@ +package com.synebula.gaea.extension + +import java.lang.reflect.Field +import java.util.* + +/** + * 系统类型 + */ +val SystemClasses = arrayOf( + "String", + "Date", + "Int", + "Double", + "Float", + "BigDecimal", + "Decimal") + +/** + * 深度获取所有字段信息字符串列表。 + * @param prefix 前缀字符串 + */ +fun Class<*>.fields(prefix: String = ""): List { + val names = mutableListOf() + this.declaredFields.forEach { field -> + val fullName = if (prefix.isNotEmpty()) "$prefix.${field.name}" else field.name + names.add(fullName) + if (!field.type.isPrimitive && !field.type.isArray && !SystemClasses.contains(field.type.simpleName)) { + names.addAll(field.type.fields(fullName)) + } + } + return names +} diff --git a/src/gaea/src/main/kotlin/com/synebula/gaea/data/date/DateExtend.kt b/src/gaea/src/main/kotlin/com/synebula/gaea/extension/DateExt.kt similarity index 63% rename from src/gaea/src/main/kotlin/com/synebula/gaea/data/date/DateExtend.kt rename to src/gaea/src/main/kotlin/com/synebula/gaea/extension/DateExt.kt index d7ab167..004e6c3 100644 --- a/src/gaea/src/main/kotlin/com/synebula/gaea/data/date/DateExtend.kt +++ b/src/gaea/src/main/kotlin/com/synebula/gaea/extension/DateExt.kt @@ -1,5 +1,6 @@ -package com.synebula.gaea.data.date +package com.synebula.gaea.extension +import com.synebula.gaea.data.date.TimeSpan import java.util.* diff --git a/src/gaea/src/main/kotlin/com/synebula/gaea/query/IQueryTyped.kt b/src/gaea/src/main/kotlin/com/synebula/gaea/query/IQueryTyped.kt index 38412d9..93221ac 100644 --- a/src/gaea/src/main/kotlin/com/synebula/gaea/query/IQueryTyped.kt +++ b/src/gaea/src/main/kotlin/com/synebula/gaea/query/IQueryTyped.kt @@ -20,7 +20,7 @@ interface IQueryTyped { * @param params 查询条件。 * @return list */ - fun list(params: Map?, clazz: Class): List + fun list(params: Map?, clazz: Class): List /** * 根据条件查询符合条件记录的数量 @@ -28,7 +28,7 @@ interface IQueryTyped { * @param params 查询条件。 * @return int */ - fun count(params: Map?, clazz: Class): Int + fun count(params: Map?, clazz: Class): Int /** * 根据实体类条件查询所有符合条件记录(分页查询) @@ -36,5 +36,5 @@ interface IQueryTyped { * @param params 分页条件 * @return 分页数据 */ - fun paging(params: PagingParam, clazz: Class): PagingData + fun paging(params: PagingParam, clazz: Class): PagingData }