From 78fec48fa23294d7b5e5dbfe78c1fcc3c0a6d57a Mon Sep 17 00:00:00 2001 From: chentaoah <609580885@qq.com> Date: Thu, 14 Nov 2024 23:01:37 +0800 Subject: [PATCH 01/15] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=B8=BA=E6=B3=9B?= =?UTF-8?q?=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/gitee/dorive/event/entity/BaseEvent.java | 9 ++++++++- .../com/gitee/dorive/event/entity/ExecutorEvent.java | 2 +- .../com/gitee/dorive/event/entity/RepositoryEvent.java | 2 +- .../gitee/dorive/event/impl/executor/EventExecutor.java | 2 +- .../gitee/dorive/event/impl/factory/EventFactory.java | 8 ++++---- 5 files changed, 15 insertions(+), 8 deletions(-) diff --git a/dorive-event/src/main/java/com/gitee/dorive/event/entity/BaseEvent.java b/dorive-event/src/main/java/com/gitee/dorive/event/entity/BaseEvent.java index 0680a855..df4d9993 100644 --- a/dorive-event/src/main/java/com/gitee/dorive/event/entity/BaseEvent.java +++ b/dorive-event/src/main/java/com/gitee/dorive/event/entity/BaseEvent.java @@ -25,9 +25,11 @@ import org.springframework.context.ApplicationEvent; import org.springframework.core.ResolvableType; import org.springframework.core.ResolvableTypeProvider; +import java.util.List; + @Getter @Setter -public abstract class BaseEvent extends ApplicationEvent implements ResolvableTypeProvider { +public abstract class BaseEvent extends ApplicationEvent implements ResolvableTypeProvider { private boolean root; private Class entityClass; private Context context; @@ -41,4 +43,9 @@ public abstract class BaseEvent extends ApplicationEvent implements ResolvableTy public ResolvableType getResolvableType() { return ResolvableType.forClassWithGenerics(getClass(), ResolvableType.forClass(entityClass)); } + + @SuppressWarnings("unchecked") + public List getEntities() { + return (List) entityOp.getEntities(); + } } diff --git a/dorive-event/src/main/java/com/gitee/dorive/event/entity/ExecutorEvent.java b/dorive-event/src/main/java/com/gitee/dorive/event/entity/ExecutorEvent.java index 8444ff03..f4f20de4 100644 --- a/dorive-event/src/main/java/com/gitee/dorive/event/entity/ExecutorEvent.java +++ b/dorive-event/src/main/java/com/gitee/dorive/event/entity/ExecutorEvent.java @@ -22,7 +22,7 @@ import lombok.Setter; @Getter @Setter -public class ExecutorEvent extends BaseEvent { +public class ExecutorEvent extends BaseEvent { public ExecutorEvent(Object source) { super(source); } diff --git a/dorive-event/src/main/java/com/gitee/dorive/event/entity/RepositoryEvent.java b/dorive-event/src/main/java/com/gitee/dorive/event/entity/RepositoryEvent.java index fb2944f9..e157064b 100644 --- a/dorive-event/src/main/java/com/gitee/dorive/event/entity/RepositoryEvent.java +++ b/dorive-event/src/main/java/com/gitee/dorive/event/entity/RepositoryEvent.java @@ -22,7 +22,7 @@ import lombok.Setter; @Getter @Setter -public class RepositoryEvent extends BaseEvent { +public class RepositoryEvent extends BaseEvent { public RepositoryEvent(Object source) { super(source); } diff --git a/dorive-event/src/main/java/com/gitee/dorive/event/impl/executor/EventExecutor.java b/dorive-event/src/main/java/com/gitee/dorive/event/impl/executor/EventExecutor.java index 7c16253a..156c1ae5 100644 --- a/dorive-event/src/main/java/com/gitee/dorive/event/impl/executor/EventExecutor.java +++ b/dorive-event/src/main/java/com/gitee/dorive/event/impl/executor/EventExecutor.java @@ -49,7 +49,7 @@ public class EventExecutor extends AbstractProxyExecutor { if (operation instanceof EntityOp) { Class entityClass = getEntityElement().getGenericType(); EntityOp entityOp = (EntityOp) operation; - BaseEvent baseEvent = EventFactory.newExecutorEvent(this, entityOp.isUncontrolled(), entityClass, context, entityOp); + BaseEvent baseEvent = EventFactory.newExecutorEvent(this, entityOp.isUncontrolled(), entityClass, context, entityOp); getApplicationContext().publishEvent(baseEvent); } } diff --git a/dorive-event/src/main/java/com/gitee/dorive/event/impl/factory/EventFactory.java b/dorive-event/src/main/java/com/gitee/dorive/event/impl/factory/EventFactory.java index ac37780c..ae256182 100644 --- a/dorive-event/src/main/java/com/gitee/dorive/event/impl/factory/EventFactory.java +++ b/dorive-event/src/main/java/com/gitee/dorive/event/impl/factory/EventFactory.java @@ -27,8 +27,8 @@ import com.gitee.dorive.event.entity.ext.*; public class EventFactory { - public static BaseEvent newExecutorEvent(Object source, boolean root, Class entityClass, Context context, EntityOp entityOp) { - BaseEvent baseEvent = null; + public static BaseEvent newExecutorEvent(Object source, boolean root, Class entityClass, Context context, EntityOp entityOp) { + BaseEvent baseEvent = null; if (entityOp instanceof Insert) { baseEvent = new ExecutorInsertEvent<>(source); @@ -47,8 +47,8 @@ public class EventFactory { return baseEvent; } - public static BaseEvent newRepositoryEvent(Object source, boolean root, Class entityClass, Context context, EntityOp entityOp) { - BaseEvent baseEvent = null; + public static BaseEvent newRepositoryEvent(Object source, boolean root, Class entityClass, Context context, EntityOp entityOp) { + BaseEvent baseEvent = null; if (entityOp instanceof Insert) { baseEvent = new RepositoryInsertEvent<>(source); -- Gitee From 91c759bd6a3025657f524cc2dd8d1a53aaf118f3 Mon Sep 17 00:00:00 2001 From: chentaoah <609580885@qq.com> Date: Fri, 15 Nov 2024 21:11:44 +0800 Subject: [PATCH 02/15] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=B8=BA=E6=B3=9B?= =?UTF-8?q?=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gitee/dorive/event/repository/AbstractEventRepository.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dorive-event/src/main/java/com/gitee/dorive/event/repository/AbstractEventRepository.java b/dorive-event/src/main/java/com/gitee/dorive/event/repository/AbstractEventRepository.java index 3784389d..2b8d2b05 100644 --- a/dorive-event/src/main/java/com/gitee/dorive/event/repository/AbstractEventRepository.java +++ b/dorive-event/src/main/java/com/gitee/dorive/event/repository/AbstractEventRepository.java @@ -93,7 +93,7 @@ public abstract class AbstractEventRepository extends AbstractGenericRepo if (operation instanceof EntityOp) { Class entityClass = getEntityElement().getGenericType(); EntityOp entityOp = (EntityOp) operation; - BaseEvent baseEvent = EventFactory.newRepositoryEvent(this, entityOp.isUncontrolled(), entityClass, context, entityOp); + BaseEvent baseEvent = EventFactory.newRepositoryEvent(this, entityOp.isUncontrolled(), entityClass, context, entityOp); getApplicationContext().publishEvent(baseEvent); } } -- Gitee From 50fc5b4ea8fa3045920a9547b0227dd10a168739 Mon Sep 17 00:00:00 2001 From: chentaoah <609580885@qq.com> Date: Sat, 16 Nov 2024 15:18:46 +0800 Subject: [PATCH 03/15] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=BC=82=E5=B8=B8?= =?UTF-8?q?=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/gitee/dorive/web/impl/DomainService.java | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/dorive-web/src/main/java/com/gitee/dorive/web/impl/DomainService.java b/dorive-web/src/main/java/com/gitee/dorive/web/impl/DomainService.java index b4e7f99e..64fa417b 100644 --- a/dorive-web/src/main/java/com/gitee/dorive/web/impl/DomainService.java +++ b/dorive-web/src/main/java/com/gitee/dorive/web/impl/DomainService.java @@ -80,9 +80,17 @@ public class DomainService { String repositoryType = loadConfigReq.getRepositoryType(); String queryType = loadConfigReq.getQueryType(); - Class entityClass = ClassLoaderUtil.loadClass(entityType); - Class repositoryClass = ClassLoaderUtil.loadClass(repositoryType); - Class queryClass = ClassLoaderUtil.loadClass(queryType); + Class entityClass; + Class repositoryClass; + Class queryClass; + try { + entityClass = ClassLoaderUtil.loadClass(entityType); + repositoryClass = ClassLoaderUtil.loadClass(repositoryType); + queryClass = ClassLoaderUtil.loadClass(queryType); + + } catch (Exception e) { + return ResObject.failMsg("类型加载失败!"); + } AbstractQueryRepository repository = (AbstractQueryRepository) applicationContext.getBean(repositoryClass); MergedRepositoryResolver mergedRepositoryResolver = repository.getMergedRepositoryResolver(); -- Gitee From cec3dfb79fd9b5ce4a245f2e24ecd33a53726846 Mon Sep 17 00:00:00 2001 From: chentaoah <609580885@qq.com> Date: Sat, 16 Nov 2024 15:22:04 +0800 Subject: [PATCH 04/15] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=BC=82=E5=B8=B8?= =?UTF-8?q?=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/gitee/dorive/web/impl/DomainService.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/dorive-web/src/main/java/com/gitee/dorive/web/impl/DomainService.java b/dorive-web/src/main/java/com/gitee/dorive/web/impl/DomainService.java index 64fa417b..55375284 100644 --- a/dorive-web/src/main/java/com/gitee/dorive/web/impl/DomainService.java +++ b/dorive-web/src/main/java/com/gitee/dorive/web/impl/DomainService.java @@ -97,6 +97,9 @@ public class DomainService { Map nameMergedRepositoryMap = mergedRepositoryResolver.getNameMergedRepositoryMap(); Field staticField = ReflectUtil.getField(entityClass, selectorName); + if (staticField == null) { + return ResObject.failMsg("选取器不存在!selectorName: " + selectorName); + } Object value = ReflectUtil.getStaticFieldValue(staticField); Selector selector = (Selector) value; -- Gitee From a573e9cffff5bec4699b2f4a97ddc813421447e9 Mon Sep 17 00:00:00 2001 From: chentaoah <609580885@qq.com> Date: Thu, 21 Nov 2024 22:56:01 +0800 Subject: [PATCH 05/15] =?UTF-8?q?=E4=BF=AE=E6=94=B9bean=E5=90=8D=E7=A7=B0?= =?UTF-8?q?=EF=BC=8C=E5=B0=BD=E9=87=8F=E9=81=BF=E5=85=8D=E5=86=B2=E7=AA=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/gitee/dorive/web/config/DoriveWebConfiguration.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dorive-web/src/main/java/com/gitee/dorive/web/config/DoriveWebConfiguration.java b/dorive-web/src/main/java/com/gitee/dorive/web/config/DoriveWebConfiguration.java index 0421e0fe..173a3aac 100644 --- a/dorive-web/src/main/java/com/gitee/dorive/web/config/DoriveWebConfiguration.java +++ b/dorive-web/src/main/java/com/gitee/dorive/web/config/DoriveWebConfiguration.java @@ -35,13 +35,13 @@ public class DoriveWebConfiguration { return new ParameterControllerAdvice(); } - @Bean("domainService") + @Bean("dorive$domainService") @ConditionalOnProperty(name = "dorive.web.enable", havingValue = "true", matchIfMissing = true) public static DomainService domainService(ApplicationContext applicationContext) { return new DomainService(applicationContext); } - @Bean("domainController") + @Bean("dorive$domainController") @ConditionalOnProperty(name = "dorive.web.enable", havingValue = "true", matchIfMissing = true) public static DomainController domainController(DomainService domainService) { return new DomainController(domainService); -- Gitee From b68090824cff1f1a1bb44adcf65288a713d37d64 Mon Sep 17 00:00:00 2001 From: chentaoah <609580885@qq.com> Date: Sat, 14 Dec 2024 15:17:52 +0800 Subject: [PATCH 06/15] =?UTF-8?q?=E5=B0=86web=E9=80=BB=E8=BE=91=E7=A7=BB?= =?UTF-8?q?=E4=BA=A4=E5=88=B0dolet?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../web/config/DoriveWebConfiguration.java | 16 -- .../dorive/web/entity/ExporterConfig.java | 35 --- .../dorive/web/entity/req/ListOrPageReq.java | 34 --- .../dorive/web/entity/req/LoadConfigReq.java | 29 --- .../dorive/web/impl/DomainController.java | 71 ------ .../gitee/dorive/web/impl/DomainService.java | 238 ------------------ 6 files changed, 423 deletions(-) delete mode 100644 dorive-web/src/main/java/com/gitee/dorive/web/entity/ExporterConfig.java delete mode 100644 dorive-web/src/main/java/com/gitee/dorive/web/entity/req/ListOrPageReq.java delete mode 100644 dorive-web/src/main/java/com/gitee/dorive/web/entity/req/LoadConfigReq.java delete mode 100644 dorive-web/src/main/java/com/gitee/dorive/web/impl/DomainController.java delete mode 100644 dorive-web/src/main/java/com/gitee/dorive/web/impl/DomainService.java diff --git a/dorive-web/src/main/java/com/gitee/dorive/web/config/DoriveWebConfiguration.java b/dorive-web/src/main/java/com/gitee/dorive/web/config/DoriveWebConfiguration.java index 173a3aac..66be649c 100644 --- a/dorive-web/src/main/java/com/gitee/dorive/web/config/DoriveWebConfiguration.java +++ b/dorive-web/src/main/java/com/gitee/dorive/web/config/DoriveWebConfiguration.java @@ -17,11 +17,7 @@ package com.gitee.dorive.web.config; -import com.gitee.dorive.web.impl.DomainController; -import com.gitee.dorive.web.impl.DomainService; import com.gitee.dorive.web.impl.advice.ParameterControllerAdvice; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.annotation.Order; @@ -35,16 +31,4 @@ public class DoriveWebConfiguration { return new ParameterControllerAdvice(); } - @Bean("dorive$domainService") - @ConditionalOnProperty(name = "dorive.web.enable", havingValue = "true", matchIfMissing = true) - public static DomainService domainService(ApplicationContext applicationContext) { - return new DomainService(applicationContext); - } - - @Bean("dorive$domainController") - @ConditionalOnProperty(name = "dorive.web.enable", havingValue = "true", matchIfMissing = true) - public static DomainController domainController(DomainService domainService) { - return new DomainController(domainService); - } - } diff --git a/dorive-web/src/main/java/com/gitee/dorive/web/entity/ExporterConfig.java b/dorive-web/src/main/java/com/gitee/dorive/web/entity/ExporterConfig.java deleted file mode 100644 index 6a3d3e61..00000000 --- a/dorive-web/src/main/java/com/gitee/dorive/web/entity/ExporterConfig.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.gitee.dorive.web.entity; - -import com.gitee.dorive.core.api.context.Selector; -import com.gitee.dorive.query.repository.AbstractQueryRepository; -import lombok.Data; - -import java.util.List; -import java.util.Map; - -@Data -public class ExporterConfig { - private String url; - private Class entityClass; - private Selector selector; - private AbstractQueryRepository repository; - private Class queryClass; - private Map> filterIdPropertiesMap; -} diff --git a/dorive-web/src/main/java/com/gitee/dorive/web/entity/req/ListOrPageReq.java b/dorive-web/src/main/java/com/gitee/dorive/web/entity/req/ListOrPageReq.java deleted file mode 100644 index 219c8674..00000000 --- a/dorive-web/src/main/java/com/gitee/dorive/web/entity/req/ListOrPageReq.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.gitee.dorive.web.entity.req; - -import lombok.Data; - -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import java.util.Map; - -@Data -public class ListOrPageReq { - private HttpServletRequest request; - private HttpServletResponse response; - private String methodName; - private String entity; - private String config; - private Map params; -} diff --git a/dorive-web/src/main/java/com/gitee/dorive/web/entity/req/LoadConfigReq.java b/dorive-web/src/main/java/com/gitee/dorive/web/entity/req/LoadConfigReq.java deleted file mode 100644 index b068b4e3..00000000 --- a/dorive-web/src/main/java/com/gitee/dorive/web/entity/req/LoadConfigReq.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.gitee.dorive.web.entity.req; - -import lombok.Data; - -@Data -public class LoadConfigReq { - private String url; - private String entityType; - private String selectorName; - private String repositoryType; - private String queryType; -} diff --git a/dorive-web/src/main/java/com/gitee/dorive/web/impl/DomainController.java b/dorive-web/src/main/java/com/gitee/dorive/web/impl/DomainController.java deleted file mode 100644 index aad0b3c3..00000000 --- a/dorive-web/src/main/java/com/gitee/dorive/web/impl/DomainController.java +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.gitee.dorive.web.impl; - -import com.gitee.dorive.web.entity.ResObject; -import com.gitee.dorive.web.entity.req.ListOrPageReq; -import com.gitee.dorive.web.entity.req.LoadConfigReq; -import lombok.AllArgsConstructor; -import org.springframework.web.bind.annotation.*; - -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import java.io.IOException; -import java.util.List; -import java.util.Map; - -@RestController -@AllArgsConstructor -@RequestMapping("/domain") -public class DomainController { - - private final DomainService domainService; - - @PostMapping("/loadConfigs") - public ResObject loadConfigs(@RequestBody List loadConfigReqs) { - return domainService.loadConfigs(loadConfigReqs); - } - - @GetMapping("/list/{entity}/{config}") - public void list(HttpServletRequest request, HttpServletResponse response, - @PathVariable String entity, @PathVariable String config, - @RequestParam Map params) throws Exception { - executeQuery(request, response, "list", entity, config, params); - } - - @GetMapping("/page/{entity}/{config}") - public void page(HttpServletRequest request, HttpServletResponse response, - @PathVariable String entity, @PathVariable String config, - @RequestParam Map params) throws Exception { - executeQuery(request, response, "page", entity, config, params); - } - - private void executeQuery(HttpServletRequest request, HttpServletResponse response, - String methodName, String entity, String config, - Map params) throws IOException { - ListOrPageReq listOrPageReq = new ListOrPageReq(); - listOrPageReq.setRequest(request); - listOrPageReq.setResponse(response); - listOrPageReq.setMethodName(methodName); - listOrPageReq.setEntity(entity); - listOrPageReq.setConfig(config); - listOrPageReq.setParams(params); - domainService.executeQuery(listOrPageReq); - } - -} diff --git a/dorive-web/src/main/java/com/gitee/dorive/web/impl/DomainService.java b/dorive-web/src/main/java/com/gitee/dorive/web/impl/DomainService.java deleted file mode 100644 index 55375284..00000000 --- a/dorive-web/src/main/java/com/gitee/dorive/web/impl/DomainService.java +++ /dev/null @@ -1,238 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.gitee.dorive.web.impl; - -import cn.hutool.core.bean.BeanUtil; -import cn.hutool.core.util.ClassLoaderUtil; -import cn.hutool.core.util.ReflectUtil; -import cn.hutool.http.ContentType; -import cn.hutool.json.JSONUtil; -import com.fasterxml.jackson.databind.BeanDescription; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.SerializationConfig; -import com.fasterxml.jackson.databind.ser.BeanSerializerFactory; -import com.fasterxml.jackson.databind.ser.PropertyFilter; -import com.fasterxml.jackson.databind.ser.impl.SimpleBeanPropertyFilter; -import com.fasterxml.jackson.databind.ser.impl.SimpleFilterProvider; -import com.gitee.dorive.api.annotation.core.Entity; -import com.gitee.dorive.api.entity.core.EntityElement; -import com.gitee.dorive.core.api.context.Selector; -import com.gitee.dorive.core.entity.executor.Page; -import com.gitee.dorive.core.repository.CommonRepository; -import com.gitee.dorive.query.entity.MergedRepository; -import com.gitee.dorive.query.impl.resolver.MergedRepositoryResolver; -import com.gitee.dorive.query.repository.AbstractQueryRepository; -import com.gitee.dorive.web.entity.ExporterConfig; -import com.gitee.dorive.web.entity.ResObject; -import com.gitee.dorive.web.entity.req.ListOrPageReq; -import com.gitee.dorive.web.entity.req.LoadConfigReq; -import org.springframework.context.ApplicationContext; -import org.springframework.http.HttpHeaders; -import org.springframework.stereotype.Service; - -import javax.servlet.http.HttpServletResponse; -import java.io.IOException; -import java.lang.reflect.Field; -import java.lang.reflect.Modifier; -import java.util.*; -import java.util.concurrent.ConcurrentHashMap; - -@Service -public class DomainService { - - private final ApplicationContext applicationContext; - private final Map urlExporterConfigMap; - - public DomainService(ApplicationContext applicationContext) { - this.applicationContext = applicationContext; - this.urlExporterConfigMap = new ConcurrentHashMap<>(); - } - - public ResObject loadConfigs(List loadConfigReqs) { - for (LoadConfigReq loadConfigReq : loadConfigReqs) { - ResObject resObject = loadConfig(loadConfigReq); - if (resObject.isFail()) { - return resObject; - } - } - return ResObject.successMsg("加载成功!"); - } - - private ResObject loadConfig(LoadConfigReq loadConfigReq) { - String url = loadConfigReq.getUrl(); - String entityType = loadConfigReq.getEntityType(); - String selectorName = loadConfigReq.getSelectorName(); - String repositoryType = loadConfigReq.getRepositoryType(); - String queryType = loadConfigReq.getQueryType(); - - Class entityClass; - Class repositoryClass; - Class queryClass; - try { - entityClass = ClassLoaderUtil.loadClass(entityType); - repositoryClass = ClassLoaderUtil.loadClass(repositoryType); - queryClass = ClassLoaderUtil.loadClass(queryType); - - } catch (Exception e) { - return ResObject.failMsg("类型加载失败!"); - } - - AbstractQueryRepository repository = (AbstractQueryRepository) applicationContext.getBean(repositoryClass); - MergedRepositoryResolver mergedRepositoryResolver = repository.getMergedRepositoryResolver(); - Map nameMergedRepositoryMap = mergedRepositoryResolver.getNameMergedRepositoryMap(); - - Field staticField = ReflectUtil.getField(entityClass, selectorName); - if (staticField == null) { - return ResObject.failMsg("选取器不存在!selectorName: " + selectorName); - } - Object value = ReflectUtil.getStaticFieldValue(staticField); - Selector selector = (Selector) value; - - Map> filterIdPropertiesMap = new LinkedHashMap<>(8); - Set names = selector.getNames(); - for (String entityName : names) { - MergedRepository mergedRepository = nameMergedRepositoryMap.get(entityName); - CommonRepository definedRepository = mergedRepository.getDefinedRepository(); - EntityElement entityElement = definedRepository.getEntityElement(); - Class genericType = entityElement.getGenericType(); - String filterId = genericType.getName(); - List properties = filterIdPropertiesMap.computeIfAbsent(filterId, key -> new ArrayList<>(4)); - List select = selector.select(entityName); - if (select == null || select.isEmpty()) { - Field[] fields = ReflectUtil.getFieldsDirectly(genericType, true); - for (Field field : fields) { - if (!Modifier.isStatic(field.getModifiers())) { - properties.add(field.getName()); - } - } - } else { - properties.addAll(select); - } - - // 补充内部实体的字段 - Field field = entityElement.getJavaField(); - if (field != null) { - Class declaringClass = field.getDeclaringClass(); - String declaringFilterId = declaringClass.getName(); - List declaringProperties = filterIdPropertiesMap.computeIfAbsent(declaringFilterId, key -> new ArrayList<>(4)); - declaringProperties.add(field.getName()); - } - } - - ExporterConfig exporterConfig = new ExporterConfig(); - exporterConfig.setUrl(url); - exporterConfig.setEntityClass(entityClass); - exporterConfig.setSelector(selector); - exporterConfig.setRepository(repository); - exporterConfig.setQueryClass(queryClass); - exporterConfig.setFilterIdPropertiesMap(filterIdPropertiesMap); - urlExporterConfigMap.put(url, exporterConfig); - - return ResObject.successMsg("加载成功!"); - } - - public void executeQuery(ListOrPageReq listOrPageReq) throws IOException { - HttpServletResponse response = listOrPageReq.getResponse(); - String methodName = listOrPageReq.getMethodName(); - String entity = listOrPageReq.getEntity(); - String config = listOrPageReq.getConfig(); - Map params = listOrPageReq.getParams(); - - response.setHeader(HttpHeaders.CONTENT_TYPE, ContentType.JSON.getValue()); - - ExporterConfig exporterConfig = urlExporterConfigMap.get(entity + "/" + config); - if (exporterConfig == null) { - failMsg(response, "没有找到配置信息!"); - return; - } - - AbstractQueryRepository repository = exporterConfig.getRepository(); - Selector selector = exporterConfig.getSelector(); - Object query = BeanUtil.toBean(params, exporterConfig.getQueryClass()); - Object data = null; - try { - if ("list".equals(methodName)) { - List entities = repository.selectByQuery(selector, query); - data = ResObject.successData(entities); - - } else if ("page".equals(methodName)) { - Page page = repository.selectPageByQuery(selector, query); - data = ResObject.successData(page); - } - - } catch (Exception e) { - failMsg(response, e.getMessage()); - return; - } - - ObjectMapper objectMapper = new ObjectMapper(); - addFilters(objectMapper, exporterConfig.getFilterIdPropertiesMap()); - objectMapper.writeValue(response.getOutputStream(), data); - } - - private void failMsg(HttpServletResponse response, String message) throws IOException { - ResObject resObject = ResObject.failMsg(message); - response.getWriter().write(JSONUtil.toJsonStr(resObject)); - } - - private void addFilters(ObjectMapper objectMapper, Map> filterIdPropertiesMap) { - objectMapper.setSerializerFactory(FilterBeanSerializerFactory.instance); - SimpleFilterProvider simpleFilterProvider = new SuperclassFilterProvider(); - filterIdPropertiesMap.forEach((filterId, properties) -> - simpleFilterProvider.addFilter(filterId, SimpleBeanPropertyFilter.filterOutAllExcept(properties.toArray(new String[0])))); - objectMapper.setFilterProvider(simpleFilterProvider); - } - - public static class FilterBeanSerializerFactory extends BeanSerializerFactory { - public static FilterBeanSerializerFactory instance = new FilterBeanSerializerFactory(); - - protected FilterBeanSerializerFactory() { - super(null); - } - - @Override - protected Object findFilterId(SerializationConfig config, BeanDescription beanDesc) { - Class beanClass = beanDesc.getBeanClass(); - if (beanClass.isAnnotationPresent(Entity.class)) { - return beanClass.getName(); - } - return super.findFilterId(config, beanDesc); - } - } - - public static class SuperclassFilterProvider extends SimpleFilterProvider { - @Override - public PropertyFilter findPropertyFilter(Object filterId, Object valueToFilter) { - String key = (String) filterId; - PropertyFilter propertyFilter; - while (true) { - propertyFilter = _filtersById.get(key); - if (propertyFilter != null) { - break; - } - Class superclass = valueToFilter.getClass().getSuperclass(); - if (superclass == null || superclass == Object.class) { - break; - } - key = superclass.getName(); - } - return propertyFilter != null ? propertyFilter : super.findPropertyFilter(filterId, valueToFilter); - } - } - -} -- Gitee From 7c82bbaba0234aa274a39041a783a83d12c0c8c2 Mon Sep 17 00:00:00 2001 From: chentaoah <609580885@qq.com> Date: Sat, 14 Dec 2024 21:25:46 +0800 Subject: [PATCH 07/15] =?UTF-8?q?=E5=B0=86dataSource=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=EF=BC=8C=E7=A7=BB=E8=87=B3repository?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dorive/api/annotation/core/Aggregate.java | 23 +---- .../dorive/api/annotation/core/Entity.java | 14 +-- .../api/annotation/core/Repository.java | 19 ++++ .../dorive/api/entity/core/EntityElement.java | 4 + .../dorive/api/entity/core/def/EntityDef.java | 4 +- .../api/entity/core/def/RepositoryDef.java | 4 + .../impl/core/EntityDefinitionResolver.java | 15 +-- .../repository/AbstractContextRepository.java | 95 +++++++++++-------- .../repository/MybatisPlusRepository.java | 7 +- 9 files changed, 97 insertions(+), 88 deletions(-) diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/annotation/core/Aggregate.java b/dorive-api/src/main/java/com/gitee/dorive/api/annotation/core/Aggregate.java index 6e67f6f3..90eba925 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/annotation/core/Aggregate.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/annotation/core/Aggregate.java @@ -19,12 +19,7 @@ package com.gitee.dorive.api.annotation.core; import org.springframework.core.annotation.AliasFor; -import java.lang.annotation.Documented; -import java.lang.annotation.ElementType; -import java.lang.annotation.Inherited; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; +import java.lang.annotation.*; /** * 聚合 @@ -32,8 +27,8 @@ import java.lang.annotation.Target; @Entity @Inherited @Documented -@Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) +@Target({ElementType.TYPE, ElementType.FIELD}) public @interface Aggregate { /** @@ -46,13 +41,7 @@ public @interface Aggregate { * @see Entity */ @AliasFor(annotation = Entity.class) - Class dataSource() default Object.class; - - /** - * @see Entity - */ - @AliasFor(annotation = Entity.class) - Class factory() default Object.class; + boolean aggregate() default true; /** * @see Entity @@ -66,10 +55,4 @@ public @interface Aggregate { @AliasFor(annotation = Entity.class) int priority() default 0; - /** - * @see Entity - */ - @AliasFor(annotation = Entity.class) - boolean aggregate() default true; - } diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/annotation/core/Entity.java b/dorive-api/src/main/java/com/gitee/dorive/api/annotation/core/Entity.java index 07fde6fb..4d7688da 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/annotation/core/Entity.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/annotation/core/Entity.java @@ -34,14 +34,9 @@ public @interface Entity { String name() default ""; /** - * 数据源 - */ - Class dataSource() default Object.class; - - /** - * 实体工厂 + * 是否聚合 */ - Class factory() default Object.class; + boolean aggregate() default false; /** * 指定仓储 @@ -53,10 +48,5 @@ public @interface Entity { */ int priority() default 0; - /** - * 是否聚合 - */ - boolean aggregate() default false; - } diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/annotation/core/Repository.java b/dorive-api/src/main/java/com/gitee/dorive/api/annotation/core/Repository.java index 2e747edb..1cb56138 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/annotation/core/Repository.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/annotation/core/Repository.java @@ -35,10 +35,29 @@ public @interface Repository { @AliasFor(annotation = Component.class) String value() default ""; + /** + * 数据源 + */ + Class dataSource(); + + /** + * 实体工厂 + */ + Class factory() default Object.class; + + /** + * 派生 + */ Class[] derived() default {}; + /** + * 事件 + */ Class[] events() default {}; + /** + * 查询对象 + */ Class[] queries() default {}; } diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/entity/core/EntityElement.java b/dorive-api/src/main/java/com/gitee/dorive/api/entity/core/EntityElement.java index 84a245b9..42ad60d3 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/entity/core/EntityElement.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/entity/core/EntityElement.java @@ -31,6 +31,10 @@ public class EntityElement extends FieldEntityDefinition { private Map fieldAliasMapping; private Map attributes; + public boolean isRoot() { + return "/".equals(accessPath); + } + public Object getValue(Object entity) { return ReflectUtil.getFieldValue(entity, getFieldName()); } diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/entity/core/def/EntityDef.java b/dorive-api/src/main/java/com/gitee/dorive/api/entity/core/def/EntityDef.java index bc3e6523..33776321 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/entity/core/def/EntityDef.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/entity/core/def/EntityDef.java @@ -32,11 +32,9 @@ import java.util.Map; @AllArgsConstructor public class EntityDef { private String name; - private Class dataSource; - private Class factory; + private boolean aggregate; private Class repository; private int priority; - private boolean aggregate; public static EntityDef fromElement(AnnotatedElement element) { Map attributes = AnnotatedElementUtils.getMergedAnnotationAttributes(element, Entity.class); diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/entity/core/def/RepositoryDef.java b/dorive-api/src/main/java/com/gitee/dorive/api/entity/core/def/RepositoryDef.java index 45acb406..7fc73ac7 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/entity/core/def/RepositoryDef.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/entity/core/def/RepositoryDef.java @@ -30,6 +30,8 @@ import java.lang.reflect.AnnotatedElement; @AllArgsConstructor public class RepositoryDef { private String value; + private Class dataSource; + private Class factory; private Class[] derived; private Class[] events; private Class[] queries; @@ -39,6 +41,8 @@ public class RepositoryDef { if (repository != null) { RepositoryDef repositoryDef = new RepositoryDef(); repositoryDef.setValue(repository.value()); + repositoryDef.setDataSource(repository.dataSource()); + repositoryDef.setFactory(repository.factory()); repositoryDef.setDerived(repository.derived()); repositoryDef.setEvents(repository.events()); repositoryDef.setQueries(repository.queries()); diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/impl/core/EntityDefinitionResolver.java b/dorive-api/src/main/java/com/gitee/dorive/api/impl/core/EntityDefinitionResolver.java index d705c6ea..79df6597 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/impl/core/EntityDefinitionResolver.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/impl/core/EntityDefinitionResolver.java @@ -156,18 +156,9 @@ public class EntityDefinitionResolver { if (StringUtils.isNotBlank(name)) { newEntityDef.setName(name); } - Class dataSource = entityAnnotation.dataSource(); - if (dataSource != Object.class) { - newEntityDef.setDataSource(dataSource); - } - Class factory = entityAnnotation.factory(); - if (factory != Object.class) { - newEntityDef.setFactory(factory); - } - boolean aggregate = entityAnnotation.aggregate(); - if (aggregate) { - newEntityDef.setAggregate(true); - } + newEntityDef.setAggregate(entityAnnotation.aggregate()); + newEntityDef.setRepository(entityAnnotation.repository()); + newEntityDef.setPriority(entityAnnotation.priority()); fieldEntityDefinition.setEntityDef(newEntityDef); return fieldEntityDefinition; diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractContextRepository.java b/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractContextRepository.java index 9b3467c2..e06fc172 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractContextRepository.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractContextRepository.java @@ -124,17 +124,25 @@ public abstract class AbstractContextRepository extends AbstractRepositor private CommonRepository newRepository(EntityElement entityElement) { resetEntityDef(entityElement); - String accessPath = entityElement.getAccessPath(); EntityDef entityDef = entityElement.getEntityDef(); OrderDef orderDef = entityElement.getOrderDef(); + String accessPath = entityElement.getAccessPath(); OperationFactory operationFactory = new OperationFactory(entityElement); - AbstractRepository actualRepository = doNewRepository(entityElement, operationFactory); - AbstractRepository proxyRepository = processRepository(actualRepository); + Class repositoryClass = entityDef.getRepository(); + AbstractRepository actualRepository; + AbstractRepository proxyRepository; + if (repositoryClass == DefaultRepository.class) { + actualRepository = doNewRepository(entityElement, operationFactory); + proxyRepository = processRepository(actualRepository); + } else { + actualRepository = doGetRepository(entityElement); + proxyRepository = actualRepository; + } boolean isRoot = "/".equals(accessPath); - boolean isAggregated = entityDef.getRepository() != Object.class; + boolean isAggregated = actualRepository instanceof AbstractContextRepository; BinderResolver binderResolver = new BinderResolver(this); binderResolver.resolve(entityElement); OrderBy defaultOrderBy = newDefaultOrderBy(orderDef); @@ -155,50 +163,63 @@ public abstract class AbstractContextRepository extends AbstractRepositor private void resetEntityDef(EntityElement entityElement) { EntityDef entityDef = entityElement.getEntityDef(); - if (entityDef.isAggregate()) { - Class entityClass = entityElement.getGenericType(); - Class repositoryClass = RepositoryContext.findRepositoryClass(entityClass); - Assert.notNull(repositoryClass, "No type of repository found! type: {}", entityClass.getName()); - entityDef.setRepository(repositoryClass); - } - } + Class genericType = entityElement.getGenericType(); - @SuppressWarnings("unchecked") - private AbstractRepository doNewRepository(EntityElement entityElement, OperationFactory operationFactory) { - EntityDef entityDef = entityElement.getEntityDef(); Class repositoryClass = entityDef.getRepository(); - Object repository; - if (repositoryClass == Object.class) { - repository = new DefaultRepository(); + Class newRepositoryClass; + // 自定义 + if (repositoryClass != Object.class) { + return; + } + if (entityElement.isRoot()) { + newRepositoryClass = DefaultRepository.class; } else { - repository = applicationContext.getBean(repositoryClass); + newRepositoryClass = RepositoryContext.findRepositoryClass(genericType); } - if (repository instanceof DefaultRepository) { - DefaultRepository defaultRepository = (DefaultRepository) repository; - defaultRepository.setEntityElement(entityElement); - defaultRepository.setOperationFactory(operationFactory); + Assert.notNull(newRepositoryClass, "No type of repository found! type: {}", genericType.getName()); + entityDef.setRepository(newRepositoryClass); + } + + private AbstractRepository doNewRepository(EntityElement entityElement, OperationFactory operationFactory) { + DefaultRepository defaultRepository = new DefaultRepository(); + defaultRepository.setEntityElement(entityElement); + defaultRepository.setOperationFactory(operationFactory); - Map attributes = entityElement.getAttributes(); + Map attributes = entityElement.getAttributes(); - EntityStoreInfo entityStoreInfo = resolveEntityStoreInfo(entityElement); - attributes.put(EntityStoreInfo.class.getName(), entityStoreInfo); + EntityStoreInfo entityStoreInfo = resolveEntityStoreInfo(repositoryDef); + attributes.put(EntityStoreInfo.class.getName(), entityStoreInfo); - EntityMapperResolver entityMapperResolver = new EntityMapperResolver(entityElement, entityStoreInfo); - EntityMapper entityMapper = entityMapperResolver.newEntityMapper(); - EntityFactory entityFactory = newEntityFactory(entityElement, entityStoreInfo, entityMapper); + EntityMapperResolver entityMapperResolver = new EntityMapperResolver(entityElement, entityStoreInfo); + EntityMapper entityMapper = entityMapperResolver.newEntityMapper(); + EntityFactory entityFactory = newEntityFactory(entityElement, entityStoreInfo, entityMapper); + + Executor executor = newExecutor(entityElement, entityStoreInfo); + executor = new FactoryExecutor(executor, entityElement, entityStoreInfo, entityFactory); + executor = new ExampleExecutor(executor, entityElement, entityMapper); + attributes.put(ExampleExecutor.class.getName(), executor); + defaultRepository.setExecutor(executor); + return defaultRepository; + } - Executor executor = newExecutor(entityElement, entityStoreInfo); - executor = new FactoryExecutor(executor, entityElement, entityStoreInfo, entityFactory); - executor = new ExampleExecutor(executor, entityElement, entityMapper); - attributes.put(ExampleExecutor.class.getName(), executor); - defaultRepository.setExecutor(executor); + @SuppressWarnings("unchecked") + private AbstractRepository doGetRepository(EntityElement entityElement) { + EntityDef entityDef = entityElement.getEntityDef(); + Class repositoryClass = entityDef.getRepository(); + AbstractRepository repository = (AbstractRepository) applicationContext.getBean(repositoryClass); + if (!entityDef.isAggregate()) { + AbstractContextRepository abstractContextRepository = (AbstractContextRepository) repository; + CommonRepository rootRepository = abstractContextRepository.getRootRepository(); + // 拷贝 + EntityElement rootEntityElement = rootRepository.getEntityElement(); + entityElement.getAttributes().putAll(rootEntityElement.getAttributes()); + return rootRepository.getProxyRepository(); } - return (AbstractRepository) repository; + return repository; } private EntityFactory newEntityFactory(EntityElement entityElement, EntityStoreInfo entityStoreInfo, EntityMapper entityMapper) { - EntityDef entityDef = entityElement.getEntityDef(); - Class factoryClass = entityDef.getFactory(); + Class factoryClass = repositoryDef.getFactory(); EntityFactory entityFactory; if (factoryClass == Object.class) { List valueObjFields = entityMapper.getValueObjFields(); @@ -232,7 +253,7 @@ public abstract class AbstractContextRepository extends AbstractRepositor protected abstract void processRepositoryDef(Class repositoryClass, Class entityClass); - protected abstract EntityStoreInfo resolveEntityStoreInfo(EntityElement entityElement); + protected abstract EntityStoreInfo resolveEntityStoreInfo(RepositoryDef repositoryDef); protected abstract Executor newExecutor(EntityElement entityElement, EntityStoreInfo entityStoreInfo); diff --git a/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/repository/MybatisPlusRepository.java b/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/repository/MybatisPlusRepository.java index b73bbc28..7c06e743 100644 --- a/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/repository/MybatisPlusRepository.java +++ b/dorive-mybatis-plus/src/main/java/com/gitee/dorive/mybatis/plus/repository/MybatisPlusRepository.java @@ -24,7 +24,7 @@ import com.baomidou.mybatisplus.core.metadata.TableFieldInfo; import com.baomidou.mybatisplus.core.metadata.TableInfo; import com.baomidou.mybatisplus.core.metadata.TableInfoHelper; import com.gitee.dorive.api.entity.core.EntityElement; -import com.gitee.dorive.api.entity.core.def.EntityDef; +import com.gitee.dorive.api.entity.core.def.RepositoryDef; import com.gitee.dorive.core.api.common.ImplFactory; import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.api.executor.Executor; @@ -67,9 +67,8 @@ public class MybatisPlusRepository extends AbstractRefRepository i } @Override - protected EntityStoreInfo resolveEntityStoreInfo(EntityElement entityElement) { - EntityDef entityDef = entityElement.getEntityDef(); - Class mapperClass = entityDef.getDataSource(); + protected EntityStoreInfo resolveEntityStoreInfo(RepositoryDef repositoryDef) { + Class mapperClass = repositoryDef.getDataSource(); Object mapper = null; Class pojoClass = null; if (mapperClass != Object.class) { -- Gitee From 4637caee2326efed61a6a87f96181490512f6400 Mon Sep 17 00:00:00 2001 From: chentaoah <609580885@qq.com> Date: Sat, 14 Dec 2024 22:42:13 +0800 Subject: [PATCH 08/15] =?UTF-8?q?=E5=B0=86Attributes=E5=B1=9E=E6=80=A7?= =?UTF-8?q?=E7=A7=BB=E8=87=B3DefaultRepository?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gitee/dorive/api/entity/core/EntityElement.java | 1 - .../dorive/api/impl/core/EntityElementResolver.java | 1 - .../core/repository/AbstractContextRepository.java | 11 +++++------ .../dorive/core/repository/DefaultRepository.java | 3 +++ .../gitee/dorive/query/entity/MergedRepository.java | 7 +++++++ .../java/com/gitee/dorive/query/entity/QueryUnit.java | 3 +-- .../query/impl/resolver/MergedRepositoryResolver.java | 4 ++++ .../dorive/sql/impl/segment/SegmentUnitResolver.java | 5 +---- 8 files changed, 21 insertions(+), 14 deletions(-) diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/entity/core/EntityElement.java b/dorive-api/src/main/java/com/gitee/dorive/api/entity/core/EntityElement.java index 42ad60d3..4fdddd7c 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/entity/core/EntityElement.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/entity/core/EntityElement.java @@ -29,7 +29,6 @@ import java.util.*; public class EntityElement extends FieldEntityDefinition { private String accessPath; private Map fieldAliasMapping; - private Map attributes; public boolean isRoot() { return "/".equals(accessPath); diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/impl/core/EntityElementResolver.java b/dorive-api/src/main/java/com/gitee/dorive/api/impl/core/EntityElementResolver.java index 429010ca..a8e24876 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/impl/core/EntityElementResolver.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/impl/core/EntityElementResolver.java @@ -69,7 +69,6 @@ public class EntityElementResolver { entityElement.setAccessPath(accessPath); entityElement.setFieldAliasMapping(fieldAliasMapping); - entityElement.setAttributes(new HashMap<>(4)); return entityElement; } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractContextRepository.java b/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractContextRepository.java index e06fc172..20f10bfc 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractContextRepository.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractContextRepository.java @@ -60,6 +60,7 @@ import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import java.util.*; +import java.util.concurrent.ConcurrentHashMap; @Getter @Setter @@ -185,7 +186,7 @@ public abstract class AbstractContextRepository extends AbstractRepositor defaultRepository.setEntityElement(entityElement); defaultRepository.setOperationFactory(operationFactory); - Map attributes = entityElement.getAttributes(); + Map attributes = new ConcurrentHashMap<>(4); EntityStoreInfo entityStoreInfo = resolveEntityStoreInfo(repositoryDef); attributes.put(EntityStoreInfo.class.getName(), entityStoreInfo); @@ -199,6 +200,8 @@ public abstract class AbstractContextRepository extends AbstractRepositor executor = new ExampleExecutor(executor, entityElement, entityMapper); attributes.put(ExampleExecutor.class.getName(), executor); defaultRepository.setExecutor(executor); + defaultRepository.setAttributes(attributes); + return defaultRepository; } @@ -209,11 +212,7 @@ public abstract class AbstractContextRepository extends AbstractRepositor AbstractRepository repository = (AbstractRepository) applicationContext.getBean(repositoryClass); if (!entityDef.isAggregate()) { AbstractContextRepository abstractContextRepository = (AbstractContextRepository) repository; - CommonRepository rootRepository = abstractContextRepository.getRootRepository(); - // 拷贝 - EntityElement rootEntityElement = rootRepository.getEntityElement(); - entityElement.getAttributes().putAll(rootEntityElement.getAttributes()); - return rootRepository.getProxyRepository(); + return abstractContextRepository.getRootRepository().getProxyRepository(); } return repository; } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/repository/DefaultRepository.java b/dorive-core/src/main/java/com/gitee/dorive/core/repository/DefaultRepository.java index 0309eae3..4c3554bd 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/repository/DefaultRepository.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/repository/DefaultRepository.java @@ -21,8 +21,11 @@ import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; +import java.util.Map; + @Getter @Setter @NoArgsConstructor public class DefaultRepository extends AbstractRepository { + private Map attributes; } diff --git a/dorive-query/src/main/java/com/gitee/dorive/query/entity/MergedRepository.java b/dorive-query/src/main/java/com/gitee/dorive/query/entity/MergedRepository.java index fbbb0e8c..02dabfc6 100644 --- a/dorive-query/src/main/java/com/gitee/dorive/query/entity/MergedRepository.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/entity/MergedRepository.java @@ -20,6 +20,7 @@ package com.gitee.dorive.query.entity; import com.gitee.dorive.core.impl.binder.StrongBinder; import com.gitee.dorive.core.impl.binder.ValueRouteBinder; import com.gitee.dorive.core.repository.CommonRepository; +import com.gitee.dorive.core.repository.DefaultRepository; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @@ -46,6 +47,8 @@ public class MergedRepository { private Set boundAccessPaths; // 执行仓储 private CommonRepository executedRepository; + // 真正执行仓储 + private DefaultRepository defaultRepository; // 序列号 private Integer sequence; // 别名 @@ -54,4 +57,8 @@ public class MergedRepository { public String getName() { return definedRepository.getEntityElement().getEntityDef().getName(); } + + public Map getAttributes() { + return defaultRepository.getAttributes(); + } } diff --git a/dorive-query/src/main/java/com/gitee/dorive/query/entity/QueryUnit.java b/dorive-query/src/main/java/com/gitee/dorive/query/entity/QueryUnit.java index 1e59bcbb..f1aa8f41 100644 --- a/dorive-query/src/main/java/com/gitee/dorive/query/entity/QueryUnit.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/entity/QueryUnit.java @@ -48,8 +48,7 @@ public class QueryUnit { } public String getPrimaryKeyAlias() { - EntityElement entityElement = getEntityElement(); - Map attributes = entityElement.getAttributes(); + Map attributes = mergedRepository.getAttributes(); EntityStoreInfo entityStoreInfo = (EntityStoreInfo) attributes.get(EntityStoreInfo.class.getName()); return entityStoreInfo.getIdColumn(); } diff --git a/dorive-query/src/main/java/com/gitee/dorive/query/impl/resolver/MergedRepositoryResolver.java b/dorive-query/src/main/java/com/gitee/dorive/query/impl/resolver/MergedRepositoryResolver.java index 1cbce93d..09cd01bb 100644 --- a/dorive-query/src/main/java/com/gitee/dorive/query/impl/resolver/MergedRepositoryResolver.java +++ b/dorive-query/src/main/java/com/gitee/dorive/query/impl/resolver/MergedRepositoryResolver.java @@ -23,6 +23,7 @@ import com.gitee.dorive.core.impl.resolver.BinderResolver; import com.gitee.dorive.core.repository.AbstractContextRepository; import com.gitee.dorive.core.repository.AbstractRepository; import com.gitee.dorive.core.repository.CommonRepository; +import com.gitee.dorive.core.repository.DefaultRepository; import com.gitee.dorive.query.entity.MergedRepository; import com.gitee.dorive.query.repository.AbstractQueryRepository; import lombok.Data; @@ -71,6 +72,7 @@ public class MergedRepositoryResolver { mergedRepository.setExecutedRepository(executedRepository); addMergedRepository(mergedRepository); + // 合并内部仓储 if (abstractQueryRepository != null) { mergeRepository(accessPath, abstractQueryRepository); } @@ -78,6 +80,8 @@ public class MergedRepositoryResolver { } private void addMergedRepository(MergedRepository mergedRepository) { + CommonRepository executedRepository = mergedRepository.getExecutedRepository(); + mergedRepository.setDefaultRepository((DefaultRepository) executedRepository.getProxyRepository()); mergedRepository.setSequence(mergedRepositoryMap.size() + 1); mergedRepository.setAlias("t" + mergedRepository.getSequence()); diff --git a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/segment/SegmentUnitResolver.java b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/segment/SegmentUnitResolver.java index 836bd19c..4791da7a 100644 --- a/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/segment/SegmentUnitResolver.java +++ b/dorive-sql/src/main/java/com/gitee/dorive/sql/impl/segment/SegmentUnitResolver.java @@ -18,7 +18,6 @@ package com.gitee.dorive.sql.impl.segment; import com.gitee.dorive.api.constant.core.Operator; -import com.gitee.dorive.api.entity.core.EntityElement; import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.entity.common.EntityStoreInfo; import com.gitee.dorive.core.entity.executor.Criterion; @@ -59,9 +58,7 @@ public class SegmentUnitResolver { public SegmentUnit resolve() { Context context = queryContext.getContext(); - CommonRepository executedRepository = mergedRepository.getExecutedRepository(); - EntityElement entityElement = executedRepository.getEntityElement(); - Map attributes = entityElement.getAttributes(); + Map attributes = mergedRepository.getAttributes(); EntityStoreInfo entityStoreInfo = (EntityStoreInfo) attributes.get(EntityStoreInfo.class.getName()); ExampleExecutor exampleExecutor = (ExampleExecutor) attributes.get(ExampleExecutor.class.getName()); -- Gitee From cbea9e95cb3d201cc8082d49675daf2b486918c9 Mon Sep 17 00:00:00 2001 From: chentaoah <609580885@qq.com> Date: Sat, 14 Dec 2024 22:53:36 +0800 Subject: [PATCH 09/15] =?UTF-8?q?=E5=B0=86Attributes=E5=B1=9E=E6=80=A7?= =?UTF-8?q?=E7=A7=BB=E8=87=B3DefaultRepository?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gitee/dorive/core/repository/AbstractContextRepository.java | 1 + 1 file changed, 1 insertion(+) diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractContextRepository.java b/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractContextRepository.java index 20f10bfc..cfea64e9 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractContextRepository.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractContextRepository.java @@ -199,6 +199,7 @@ public abstract class AbstractContextRepository extends AbstractRepositor executor = new FactoryExecutor(executor, entityElement, entityStoreInfo, entityFactory); executor = new ExampleExecutor(executor, entityElement, entityMapper); attributes.put(ExampleExecutor.class.getName(), executor); + defaultRepository.setExecutor(executor); defaultRepository.setAttributes(attributes); -- Gitee From 2eb10e5f2eabc21024e41ef102169a419d29ba51 Mon Sep 17 00:00:00 2001 From: chentaoah <609580885@qq.com> Date: Sat, 14 Dec 2024 22:54:18 +0800 Subject: [PATCH 10/15] =?UTF-8?q?=E5=B0=86Attributes=E5=B1=9E=E6=80=A7?= =?UTF-8?q?=E7=A7=BB=E8=87=B3DefaultRepository?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dorive/core/repository/AbstractContextRepository.java | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractContextRepository.java b/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractContextRepository.java index cfea64e9..a827f48a 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractContextRepository.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractContextRepository.java @@ -182,10 +182,6 @@ public abstract class AbstractContextRepository extends AbstractRepositor } private AbstractRepository doNewRepository(EntityElement entityElement, OperationFactory operationFactory) { - DefaultRepository defaultRepository = new DefaultRepository(); - defaultRepository.setEntityElement(entityElement); - defaultRepository.setOperationFactory(operationFactory); - Map attributes = new ConcurrentHashMap<>(4); EntityStoreInfo entityStoreInfo = resolveEntityStoreInfo(repositoryDef); @@ -200,9 +196,11 @@ public abstract class AbstractContextRepository extends AbstractRepositor executor = new ExampleExecutor(executor, entityElement, entityMapper); attributes.put(ExampleExecutor.class.getName(), executor); + DefaultRepository defaultRepository = new DefaultRepository(); + defaultRepository.setEntityElement(entityElement); + defaultRepository.setOperationFactory(operationFactory); defaultRepository.setExecutor(executor); defaultRepository.setAttributes(attributes); - return defaultRepository; } -- Gitee From 837fc4d19c94aca7dab15de6067b32b128932e4c Mon Sep 17 00:00:00 2001 From: chentaoah <609580885@qq.com> Date: Sat, 14 Dec 2024 22:55:01 +0800 Subject: [PATCH 11/15] =?UTF-8?q?=E5=B0=86Attributes=E5=B1=9E=E6=80=A7?= =?UTF-8?q?=E7=A7=BB=E8=87=B3DefaultRepository?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/repository/AbstractContextRepository.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractContextRepository.java b/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractContextRepository.java index a827f48a..4eb8e38d 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractContextRepository.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractContextRepository.java @@ -196,12 +196,12 @@ public abstract class AbstractContextRepository extends AbstractRepositor executor = new ExampleExecutor(executor, entityElement, entityMapper); attributes.put(ExampleExecutor.class.getName(), executor); - DefaultRepository defaultRepository = new DefaultRepository(); - defaultRepository.setEntityElement(entityElement); - defaultRepository.setOperationFactory(operationFactory); - defaultRepository.setExecutor(executor); - defaultRepository.setAttributes(attributes); - return defaultRepository; + DefaultRepository repository = new DefaultRepository(); + repository.setEntityElement(entityElement); + repository.setOperationFactory(operationFactory); + repository.setExecutor(executor); + repository.setAttributes(attributes); + return repository; } @SuppressWarnings("unchecked") -- Gitee From 0d34aa5d2f4c2531a165e50da7fc2531c78c192a Mon Sep 17 00:00:00 2001 From: chentaoah <609580885@qq.com> Date: Sat, 21 Dec 2024 22:49:38 +0800 Subject: [PATCH 12/15] =?UTF-8?q?EntityFactory=E6=8E=A5=E5=8F=A3=E5=85=A5?= =?UTF-8?q?=E5=8F=82=E4=BC=98=E5=8C=96=E4=B8=BA=E9=9B=86=E5=90=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/api/factory/EntityFactory.java | 6 ++-- .../core/impl/executor/FactoryExecutor.java | 34 +++---------------- .../impl/factory/DefaultEntityFactory.java | 21 ++++++++++++ .../handler/joiner/UnionEntityHandler.java | 12 ++++--- 4 files changed, 38 insertions(+), 35 deletions(-) diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/api/factory/EntityFactory.java b/dorive-core/src/main/java/com/gitee/dorive/core/api/factory/EntityFactory.java index 3b93dc9b..23b8ee34 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/api/factory/EntityFactory.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/api/factory/EntityFactory.java @@ -19,10 +19,12 @@ package com.gitee.dorive.core.api.factory; import com.gitee.dorive.core.api.context.Context; +import java.util.List; + public interface EntityFactory { - Object reconstitute(Context context, Object persistent); + List reconstitute(Context context, List persistentObjs); - Object deconstruct(Context context, Object entity); + List deconstruct(Context context, List entities); } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/FactoryExecutor.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/FactoryExecutor.java index bfcd68f2..21fd660a 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/FactoryExecutor.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/executor/FactoryExecutor.java @@ -20,13 +20,11 @@ package com.gitee.dorive.core.impl.executor; import cn.hutool.core.bean.BeanUtil; import com.gitee.dorive.api.entity.core.EntityElement; import com.gitee.dorive.core.api.context.Context; -import com.gitee.dorive.core.api.factory.EntityFactory; import com.gitee.dorive.core.api.executor.Executor; +import com.gitee.dorive.core.api.factory.EntityFactory; import com.gitee.dorive.core.entity.common.EntityStoreInfo; -import com.gitee.dorive.core.entity.executor.Example; import com.gitee.dorive.core.entity.executor.Page; import com.gitee.dorive.core.entity.executor.Result; -import com.gitee.dorive.core.entity.executor.UnionExample; import com.gitee.dorive.core.entity.operation.EntityOp; import com.gitee.dorive.core.entity.operation.Operation; import com.gitee.dorive.core.entity.operation.cop.ConditionUpdate; @@ -35,7 +33,6 @@ import com.gitee.dorive.core.entity.operation.eop.Insert; import lombok.Getter; import lombok.Setter; -import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Map; @@ -63,7 +60,7 @@ public class FactoryExecutor extends AbstractProxyExecutor { List entities = Collections.emptyList(); if (recordMaps != null && !recordMaps.isEmpty()) { - entities = reconstitute(context, query, recordMaps); + entities = entityFactory.reconstitute(context, recordMaps); } if (page != null) { @@ -75,33 +72,12 @@ public class FactoryExecutor extends AbstractProxyExecutor { return result; } - private List reconstitute(Context context, Query query, List> resultMaps) { - Example example = query.getExample(); - boolean isUnion = example instanceof UnionExample; - List entities = new ArrayList<>(resultMaps.size()); - for (Map resultMap : resultMaps) { - Object entity = entityFactory.reconstitute(context, resultMap); - if (entity != null) { - if (isUnion) { - resultMap.put("$entity", entity); - } - entities.add(entity); - } - } - return entities; - } - @Override public int execute(Context context, Operation operation) { if (operation instanceof EntityOp) { EntityOp entityOp = (EntityOp) operation; List entities = entityOp.getEntities(); - List persistentObjs = new ArrayList<>(entities.size()); - for (Object entity : entities) { - Object persistent = entityFactory.deconstruct(context, entity); - persistentObjs.add(persistent); - } - + List persistentObjs = entityFactory.deconstruct(context, entities); entityOp.setEntities(persistentObjs); int totalCount = super.execute(context, operation); entityOp.setEntities(entities); @@ -122,8 +98,8 @@ public class FactoryExecutor extends AbstractProxyExecutor { ConditionUpdate conditionUpdate = (ConditionUpdate) operation; Object entity = conditionUpdate.getEntity(); if (entity != null) { - Object persistent = entityFactory.deconstruct(context, entity); - conditionUpdate.setEntity(persistent); + List persistentObjs = entityFactory.deconstruct(context, Collections.singletonList(entity)); + conditionUpdate.setEntity(persistentObjs.get(0)); int totalCount = super.execute(context, operation); conditionUpdate.setEntity(entity); return totalCount; diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/factory/DefaultEntityFactory.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/factory/DefaultEntityFactory.java index e84a9198..0ec06b1b 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/factory/DefaultEntityFactory.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/factory/DefaultEntityFactory.java @@ -31,6 +31,9 @@ import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; +import java.util.ArrayList; +import java.util.List; + @Getter @Setter @NoArgsConstructor @@ -72,11 +75,29 @@ public class DefaultEntityFactory implements EntityFactory { } @Override + public List reconstitute(Context context, List persistentObjs) { + List entities = new ArrayList<>(persistentObjs.size()); + for (Object persistent : persistentObjs) { + Object entity = reconstitute(context, persistent); + entities.add(entity); + } + return entities; + } + public Object reconstitute(Context context, Object persistent) { return BeanUtil.toBean(persistent, entityElement.getGenericType(), reCopyOptions); } @Override + public List deconstruct(Context context, List entities) { + List persistentObjs = new ArrayList<>(entities.size()); + for (Object entity : entities) { + Object persistent = deconstruct(context, entity); + persistentObjs.add(persistent); + } + return persistentObjs; + } + public Object deconstruct(Context context, Object entity) { return BeanUtil.toBean(entity, entityStoreInfo.getPojoClass(), deCopyOptions); } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/handler/joiner/UnionEntityHandler.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/handler/joiner/UnionEntityHandler.java index 2cfbade3..3f3167e0 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/handler/joiner/UnionEntityHandler.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/handler/joiner/UnionEntityHandler.java @@ -17,6 +17,7 @@ package com.gitee.dorive.core.impl.handler.joiner; +import cn.hutool.core.lang.Assert; import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.entity.executor.Example; import com.gitee.dorive.core.entity.executor.InnerExample; @@ -83,11 +84,14 @@ public class UnionEntityHandler extends AbstractEntityJoiner { @SuppressWarnings("unchecked") protected void handleResult(Context context, Result result) { List> recordMaps = result.getRecordMaps(); - for (Map resultMap : recordMaps) { - Object row = resultMap.get("$row"); - List rows = (List) resultMap.get("$rows"); - Object entity = resultMap.get("$entity"); + List entities = result.getRecords(); + Assert.isTrue(recordMaps.size() == entities.size(), "Inconsistent data!"); + for (int index = 0; index < recordMaps.size(); index++) { + Map resultMap = recordMaps.get(index); + Object entity = entities.get(index); if (entity != null) { + Object row = resultMap.get("$row"); + List rows = (List) resultMap.get("$rows"); if (rows != null) { for (String eachRow : rows) { addRight(eachRow, entity); -- Gitee From 945a610d8076fee6f574f24756845c1d4a6e8b44 Mon Sep 17 00:00:00 2001 From: chentaoah <609580885@qq.com> Date: Sun, 22 Dec 2024 15:08:37 +0800 Subject: [PATCH 13/15] =?UTF-8?q?=E9=87=8D=E6=96=B0=E5=AE=9A=E4=B9=89Bound?= =?UTF-8?q?edContext=E7=9A=84=E4=BD=BF=E7=94=A8=E5=9C=BA=E6=99=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../{context => common}/BoundedContext.java | 17 ++------ ...{InnerContext.java => DefaultContext.java} | 6 +-- .../gitee/dorive/core/util/ContextUtils.java | 29 -------------- .../gitee/dorive/core/util/NumberUtils.java | 29 -------------- .../com/gitee/dorive/ref/impl/RefObjImpl.java | 8 ++-- .../repository/AbstractInnerRepository.java | 40 +++++++++---------- 6 files changed, 31 insertions(+), 98 deletions(-) rename dorive-core/src/main/java/com/gitee/dorive/core/entity/{context => common}/BoundedContext.java (70%) rename dorive-core/src/main/java/com/gitee/dorive/core/entity/context/{InnerContext.java => DefaultContext.java} (88%) delete mode 100644 dorive-core/src/main/java/com/gitee/dorive/core/util/ContextUtils.java delete mode 100644 dorive-core/src/main/java/com/gitee/dorive/core/util/NumberUtils.java diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/entity/context/BoundedContext.java b/dorive-core/src/main/java/com/gitee/dorive/core/entity/common/BoundedContext.java similarity index 70% rename from dorive-core/src/main/java/com/gitee/dorive/core/entity/context/BoundedContext.java rename to dorive-core/src/main/java/com/gitee/dorive/core/entity/common/BoundedContext.java index d2466535..0f677031 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/entity/context/BoundedContext.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/entity/common/BoundedContext.java @@ -15,21 +15,12 @@ * limitations under the License. */ -package com.gitee.dorive.core.entity.context; +package com.gitee.dorive.core.entity.common; -import com.gitee.dorive.core.api.context.Context; -import com.gitee.dorive.core.api.context.Options; import lombok.NoArgsConstructor; -@NoArgsConstructor -public class BoundedContext extends AbstractContext { - - public BoundedContext(Options options) { - super(options); - } - - public BoundedContext(Context context) { - super(context); - } +import java.util.Properties; +@NoArgsConstructor +public class BoundedContext extends Properties { } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/entity/context/InnerContext.java b/dorive-core/src/main/java/com/gitee/dorive/core/entity/context/DefaultContext.java similarity index 88% rename from dorive-core/src/main/java/com/gitee/dorive/core/entity/context/InnerContext.java rename to dorive-core/src/main/java/com/gitee/dorive/core/entity/context/DefaultContext.java index d7982a48..eeb6be1a 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/entity/context/InnerContext.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/entity/context/DefaultContext.java @@ -22,13 +22,13 @@ import com.gitee.dorive.core.api.context.Options; import lombok.NoArgsConstructor; @NoArgsConstructor -public class InnerContext extends AbstractContext { +public class DefaultContext extends AbstractContext { - public InnerContext(Options options) { + public DefaultContext(Options options) { super(options); } - public InnerContext(Context context) { + public DefaultContext(Context context) { super(context); } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/util/ContextUtils.java b/dorive-core/src/main/java/com/gitee/dorive/core/util/ContextUtils.java deleted file mode 100644 index 8df9b305..00000000 --- a/dorive-core/src/main/java/com/gitee/dorive/core/util/ContextUtils.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.gitee.dorive.core.util; - -import com.gitee.dorive.core.api.context.Context; -import com.gitee.dorive.core.entity.context.InnerContext; - -public class ContextUtils { - - public static Context clone(Context context) { - return new InnerContext(context); - } - -} diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/util/NumberUtils.java b/dorive-core/src/main/java/com/gitee/dorive/core/util/NumberUtils.java deleted file mode 100644 index d9cb41fd..00000000 --- a/dorive-core/src/main/java/com/gitee/dorive/core/util/NumberUtils.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.gitee.dorive.core.util; - -public class NumberUtils { - - public static Integer intValue(Object object) { - if (object instanceof Number) { - return ((Number) object).intValue(); - } - return null; - } - -} diff --git a/dorive-ref/src/main/java/com/gitee/dorive/ref/impl/RefObjImpl.java b/dorive-ref/src/main/java/com/gitee/dorive/ref/impl/RefObjImpl.java index 4299fd72..1d7a4c73 100644 --- a/dorive-ref/src/main/java/com/gitee/dorive/ref/impl/RefObjImpl.java +++ b/dorive-ref/src/main/java/com/gitee/dorive/ref/impl/RefObjImpl.java @@ -20,7 +20,7 @@ package com.gitee.dorive.ref.impl; import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.api.context.Options; import com.gitee.dorive.core.api.executor.EntityHandler; -import com.gitee.dorive.core.entity.context.InnerContext; +import com.gitee.dorive.core.entity.context.DefaultContext; import com.gitee.dorive.core.repository.AbstractRepository; import com.gitee.dorive.ref.api.RefObj; import lombok.AllArgsConstructor; @@ -38,7 +38,7 @@ public class RefObjImpl implements RefObj { @Override public long select(Options options) { if (!(options instanceof Context)) { - options = new InnerContext(options); + options = new DefaultContext(options); } EntityHandler entityHandler = ref.getEntityHandler(); return entityHandler.handle((Context) options, Collections.singletonList(object)); @@ -47,7 +47,7 @@ public class RefObjImpl implements RefObj { @Override public int insertOrUpdate(Options options) { if (!(options instanceof Context)) { - options = new InnerContext(options); + options = new DefaultContext(options); } AbstractRepository repository = ref.getProxyRepository(); return repository.insertOrUpdate(options, object); @@ -56,7 +56,7 @@ public class RefObjImpl implements RefObj { @Override public int delete(Options options) { if (!(options instanceof Context)) { - options = new InnerContext(options); + options = new DefaultContext(options); } AbstractRepository repository = ref.getProxyRepository(); return repository.delete(options, object); diff --git a/dorive-ref/src/main/java/com/gitee/dorive/ref/repository/AbstractInnerRepository.java b/dorive-ref/src/main/java/com/gitee/dorive/ref/repository/AbstractInnerRepository.java index e038cbd2..48babf71 100644 --- a/dorive-ref/src/main/java/com/gitee/dorive/ref/repository/AbstractInnerRepository.java +++ b/dorive-ref/src/main/java/com/gitee/dorive/ref/repository/AbstractInnerRepository.java @@ -19,7 +19,7 @@ package com.gitee.dorive.ref.repository; import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.api.context.Options; -import com.gitee.dorive.core.entity.context.InnerContext; +import com.gitee.dorive.core.entity.context.DefaultContext; import com.gitee.dorive.core.entity.executor.Example; import com.gitee.dorive.core.entity.executor.InnerExample; import com.gitee.dorive.core.entity.executor.Page; @@ -33,7 +33,7 @@ public abstract class AbstractInnerRepository extends AbstractQueryReposi @Override public E selectByPrimaryKey(Options options, PK primaryKey) { if (!(options instanceof Context)) { - options = new InnerContext(options); + options = new DefaultContext(options); } return super.selectByPrimaryKey(options, primaryKey); } @@ -41,7 +41,7 @@ public abstract class AbstractInnerRepository extends AbstractQueryReposi @Override public List selectByExample(Options options, Example example) { if (!(options instanceof Context)) { - options = new InnerContext(options); + options = new DefaultContext(options); } if (!(example instanceof InnerExample)) { example = ExampleUtils.clone(example); @@ -52,7 +52,7 @@ public abstract class AbstractInnerRepository extends AbstractQueryReposi @Override public E selectOneByExample(Options options, Example example) { if (!(options instanceof Context)) { - options = new InnerContext(options); + options = new DefaultContext(options); } if (!(example instanceof InnerExample)) { example = ExampleUtils.clone(example); @@ -63,7 +63,7 @@ public abstract class AbstractInnerRepository extends AbstractQueryReposi @Override public Page selectPageByExample(Options options, Example example) { if (!(options instanceof Context)) { - options = new InnerContext(options); + options = new DefaultContext(options); } if (!(example instanceof InnerExample)) { example = ExampleUtils.clone(example); @@ -74,7 +74,7 @@ public abstract class AbstractInnerRepository extends AbstractQueryReposi @Override public long selectCountByExample(Options options, Example example) { if (!(options instanceof Context)) { - options = new InnerContext(options); + options = new DefaultContext(options); } if (!(example instanceof InnerExample)) { example = ExampleUtils.clone(example); @@ -85,7 +85,7 @@ public abstract class AbstractInnerRepository extends AbstractQueryReposi @Override public int insert(Options options, E entity) { if (!(options instanceof Context)) { - options = new InnerContext(options); + options = new DefaultContext(options); } return super.insert(options, entity); } @@ -93,7 +93,7 @@ public abstract class AbstractInnerRepository extends AbstractQueryReposi @Override public int update(Options options, E entity) { if (!(options instanceof Context)) { - options = new InnerContext(options); + options = new DefaultContext(options); } return super.update(options, entity); } @@ -101,7 +101,7 @@ public abstract class AbstractInnerRepository extends AbstractQueryReposi @Override public int updateByExample(Options options, Object entity, Example example) { if (!(options instanceof Context)) { - options = new InnerContext(options); + options = new DefaultContext(options); } if (!(example instanceof InnerExample)) { example = ExampleUtils.clone(example); @@ -112,7 +112,7 @@ public abstract class AbstractInnerRepository extends AbstractQueryReposi @Override public int insertOrUpdate(Options options, E entity) { if (!(options instanceof Context)) { - options = new InnerContext(options); + options = new DefaultContext(options); } return super.insertOrUpdate(options, entity); } @@ -120,7 +120,7 @@ public abstract class AbstractInnerRepository extends AbstractQueryReposi @Override public int delete(Options options, E entity) { if (!(options instanceof Context)) { - options = new InnerContext(options); + options = new DefaultContext(options); } return super.delete(options, entity); } @@ -128,7 +128,7 @@ public abstract class AbstractInnerRepository extends AbstractQueryReposi @Override public int deleteByPrimaryKey(Options options, PK primaryKey) { if (!(options instanceof Context)) { - options = new InnerContext(options); + options = new DefaultContext(options); } return super.deleteByPrimaryKey(options, primaryKey); } @@ -136,7 +136,7 @@ public abstract class AbstractInnerRepository extends AbstractQueryReposi @Override public int deleteByExample(Options options, Example example) { if (!(options instanceof Context)) { - options = new InnerContext(options); + options = new DefaultContext(options); } if (!(example instanceof InnerExample)) { example = ExampleUtils.clone(example); @@ -147,7 +147,7 @@ public abstract class AbstractInnerRepository extends AbstractQueryReposi @Override public int insertList(Options options, List entities) { if (!(options instanceof Context)) { - options = new InnerContext(options); + options = new DefaultContext(options); } return super.insertList(options, entities); } @@ -155,7 +155,7 @@ public abstract class AbstractInnerRepository extends AbstractQueryReposi @Override public int updateList(Options options, List entities) { if (!(options instanceof Context)) { - options = new InnerContext(options); + options = new DefaultContext(options); } return super.updateList(options, entities); } @@ -163,7 +163,7 @@ public abstract class AbstractInnerRepository extends AbstractQueryReposi @Override public int insertOrUpdateList(Options options, List entities) { if (!(options instanceof Context)) { - options = new InnerContext(options); + options = new DefaultContext(options); } return super.insertOrUpdateList(options, entities); } @@ -171,7 +171,7 @@ public abstract class AbstractInnerRepository extends AbstractQueryReposi @Override public int deleteList(Options options, List entities) { if (!(options instanceof Context)) { - options = new InnerContext(options); + options = new DefaultContext(options); } return super.deleteList(options, entities); } @@ -179,7 +179,7 @@ public abstract class AbstractInnerRepository extends AbstractQueryReposi @Override public List selectByQuery(Options options, Object query) { if (!(options instanceof Context)) { - options = new InnerContext(options); + options = new DefaultContext(options); } return super.selectByQuery(options, query); } @@ -187,7 +187,7 @@ public abstract class AbstractInnerRepository extends AbstractQueryReposi @Override public Page selectPageByQuery(Options options, Object query) { if (!(options instanceof Context)) { - options = new InnerContext(options); + options = new DefaultContext(options); } return super.selectPageByQuery(options, query); } @@ -195,7 +195,7 @@ public abstract class AbstractInnerRepository extends AbstractQueryReposi @Override public long selectCountByQuery(Options options, Object query) { if (!(options instanceof Context)) { - options = new InnerContext(options); + options = new DefaultContext(options); } return super.selectCountByQuery(options, query); } -- Gitee From 20d5c8205bab1b8895584791428ac2a423659583 Mon Sep 17 00:00:00 2001 From: chentaoah <609580885@qq.com> Date: Sun, 22 Dec 2024 22:27:52 +0800 Subject: [PATCH 14/15] =?UTF-8?q?=E5=AE=9E=E7=8E=B0BoundedContext=E5=B1=9E?= =?UTF-8?q?=E6=80=A7=E5=92=8C=E5=AE=9E=E4=BD=93=E5=AD=97=E6=AE=B5=E6=98=A0?= =?UTF-8?q?=E5=B0=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dorive/api/annotation/core/Property.java | 36 +++++++++++++ .../api/annotation/core/Repository.java | 5 ++ .../api/entity/core/EntityDefinition.java | 1 + .../api/entity/core/PropertyDefinition.java | 34 +++++++++++++ .../api/entity/core/def/PropertyDef.java | 40 +++++++++++++++ .../api/entity/core/def/RepositoryDef.java | 2 + .../impl/core/EntityDefinitionResolver.java | 24 +++++++-- .../impl/factory/DefaultEntityFactory.java | 51 +++++++++++++++++-- .../impl/resolver/EntityMapperResolver.java | 2 - .../repository/AbstractContextRepository.java | 14 ++++- 10 files changed, 198 insertions(+), 11 deletions(-) create mode 100644 dorive-api/src/main/java/com/gitee/dorive/api/annotation/core/Property.java create mode 100644 dorive-api/src/main/java/com/gitee/dorive/api/entity/core/PropertyDefinition.java create mode 100644 dorive-api/src/main/java/com/gitee/dorive/api/entity/core/def/PropertyDef.java diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/annotation/core/Property.java b/dorive-api/src/main/java/com/gitee/dorive/api/annotation/core/Property.java new file mode 100644 index 00000000..a00eda28 --- /dev/null +++ b/dorive-api/src/main/java/com/gitee/dorive/api/annotation/core/Property.java @@ -0,0 +1,36 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.gitee.dorive.api.annotation.core; + +import java.lang.annotation.*; + +/** + * 上下文属性 + */ +@Inherited +@Documented +@Target(ElementType.FIELD) +@Retention(RetentionPolicy.RUNTIME) +public @interface Property { + + /** + * 键 + */ + String value(); + +} diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/annotation/core/Repository.java b/dorive-api/src/main/java/com/gitee/dorive/api/annotation/core/Repository.java index 1cb56138..1af14a21 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/annotation/core/Repository.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/annotation/core/Repository.java @@ -45,6 +45,11 @@ public @interface Repository { */ Class factory() default Object.class; + /** + * 边界上下文 + */ + String boundedContext() default ""; + /** * 派生 */ diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/entity/core/EntityDefinition.java b/dorive-api/src/main/java/com/gitee/dorive/api/entity/core/EntityDefinition.java index 12aa9a4a..d2fa5795 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/entity/core/EntityDefinition.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/entity/core/EntityDefinition.java @@ -29,6 +29,7 @@ public class EntityDefinition { private EntityDef entityDef; private Class genericType; private String primaryKey; + private List propertyDefinitions; private List fieldDefinitions; private List fieldEntityDefinitions; diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/entity/core/PropertyDefinition.java b/dorive-api/src/main/java/com/gitee/dorive/api/entity/core/PropertyDefinition.java new file mode 100644 index 00000000..80a17411 --- /dev/null +++ b/dorive-api/src/main/java/com/gitee/dorive/api/entity/core/PropertyDefinition.java @@ -0,0 +1,34 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.gitee.dorive.api.entity.core; + +import com.gitee.dorive.api.entity.core.def.PropertyDef; +import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +@EqualsAndHashCode(callSuper = true) +public class PropertyDefinition extends Field { + private PropertyDef propertyDef; + + public PropertyDefinition(java.lang.reflect.Field field) { + super(field); + } +} diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/entity/core/def/PropertyDef.java b/dorive-api/src/main/java/com/gitee/dorive/api/entity/core/def/PropertyDef.java new file mode 100644 index 00000000..e4c76a24 --- /dev/null +++ b/dorive-api/src/main/java/com/gitee/dorive/api/entity/core/def/PropertyDef.java @@ -0,0 +1,40 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.gitee.dorive.api.entity.core.def; + +import cn.hutool.core.bean.BeanUtil; +import com.gitee.dorive.api.annotation.core.Property; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.springframework.core.annotation.AnnotatedElementUtils; + +import java.lang.reflect.AnnotatedElement; +import java.util.Map; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class PropertyDef { + private String value; + + public static PropertyDef fromElement(AnnotatedElement element) { + Map attributes = AnnotatedElementUtils.getMergedAnnotationAttributes(element, Property.class); + return attributes != null ? BeanUtil.copyProperties(attributes, PropertyDef.class) : null; + } +} diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/entity/core/def/RepositoryDef.java b/dorive-api/src/main/java/com/gitee/dorive/api/entity/core/def/RepositoryDef.java index 7fc73ac7..f2b30901 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/entity/core/def/RepositoryDef.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/entity/core/def/RepositoryDef.java @@ -32,6 +32,7 @@ public class RepositoryDef { private String value; private Class dataSource; private Class factory; + private String boundedContext; private Class[] derived; private Class[] events; private Class[] queries; @@ -43,6 +44,7 @@ public class RepositoryDef { repositoryDef.setValue(repository.value()); repositoryDef.setDataSource(repository.dataSource()); repositoryDef.setFactory(repository.factory()); + repositoryDef.setBoundedContext(repository.boundedContext()); repositoryDef.setDerived(repository.derived()); repositoryDef.setEvents(repository.events()); repositoryDef.setQueries(repository.queries()); diff --git a/dorive-api/src/main/java/com/gitee/dorive/api/impl/core/EntityDefinitionResolver.java b/dorive-api/src/main/java/com/gitee/dorive/api/impl/core/EntityDefinitionResolver.java index 79df6597..9c7379d6 100644 --- a/dorive-api/src/main/java/com/gitee/dorive/api/impl/core/EntityDefinitionResolver.java +++ b/dorive-api/src/main/java/com/gitee/dorive/api/impl/core/EntityDefinitionResolver.java @@ -22,13 +22,12 @@ import cn.hutool.core.collection.ConcurrentHashSet; import cn.hutool.core.lang.Assert; import cn.hutool.core.util.StrUtil; import com.gitee.dorive.api.annotation.core.Entity; +import com.gitee.dorive.api.annotation.core.Property; import com.gitee.dorive.api.entity.core.EntityDefinition; import com.gitee.dorive.api.entity.core.FieldDefinition; import com.gitee.dorive.api.entity.core.FieldEntityDefinition; -import com.gitee.dorive.api.entity.core.def.BindingDef; -import com.gitee.dorive.api.entity.core.def.EntityDef; -import com.gitee.dorive.api.entity.core.def.FieldDef; -import com.gitee.dorive.api.entity.core.def.OrderDef; +import com.gitee.dorive.api.entity.core.PropertyDefinition; +import com.gitee.dorive.api.entity.core.def.*; import com.gitee.dorive.api.util.ReflectUtils; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; @@ -84,8 +83,10 @@ public class EntityDefinitionResolver { } private void readFields(Class type, EntityDefinition entityDefinition) { + List propertyDefinitions = new ArrayList<>(); List fieldDefinitions = new ArrayList<>(); List fieldEntityDefinitions = new ArrayList<>(); + List fields = ReflectUtils.getAllFields(type); // 去重 Map fieldMap = new LinkedHashMap<>(); @@ -94,6 +95,13 @@ public class EntityDefinitionResolver { } for (Field field : fieldMap.values()) { if (!Modifier.isStatic(field.getModifiers())) { + // 上下文属性 + Property propertyAnnotation = AnnotatedElementUtils.getMergedAnnotation(field, Property.class); + if (propertyAnnotation != null) { + PropertyDefinition propertyDefinition = readProperty(field); + propertyDefinitions.add(propertyDefinition); + continue; + } // 所有字段 FieldDefinition fieldDefinition = readField(field); if (fieldDefinition.isPrimary()) { @@ -110,10 +118,18 @@ public class EntityDefinitionResolver { } } } + + entityDefinition.setPropertyDefinitions(propertyDefinitions); entityDefinition.setFieldDefinitions(fieldDefinitions); entityDefinition.setFieldEntityDefinitions(fieldEntityDefinitions); } + private PropertyDefinition readProperty(Field field) { + PropertyDefinition propertyDefinition = new PropertyDefinition(field); + propertyDefinition.setPropertyDef(PropertyDef.fromElement(field)); + return propertyDefinition; + } + private FieldDefinition readField(Field field) { FieldDefinition fieldDefinition = new FieldDefinition(field); String fieldName = fieldDefinition.getFieldName(); diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/factory/DefaultEntityFactory.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/factory/DefaultEntityFactory.java index 0ec06b1b..28a6fd4a 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/factory/DefaultEntityFactory.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/factory/DefaultEntityFactory.java @@ -20,9 +20,12 @@ package com.gitee.dorive.core.impl.factory; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.bean.copier.CopyOptions; import com.gitee.dorive.api.entity.core.EntityElement; +import com.gitee.dorive.api.entity.core.PropertyDefinition; +import com.gitee.dorive.api.entity.core.def.PropertyDef; import com.gitee.dorive.core.api.context.Context; import com.gitee.dorive.core.api.factory.EntityFactory; import com.gitee.dorive.core.api.factory.EntityMapper; +import com.gitee.dorive.core.entity.common.BoundedContext; import com.gitee.dorive.core.entity.common.EntityStoreInfo; import com.gitee.dorive.core.entity.enums.Domain; import com.gitee.dorive.core.entity.factory.FieldConverter; @@ -33,6 +36,8 @@ import lombok.Setter; import java.util.ArrayList; import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; @Getter @Setter @@ -45,6 +50,28 @@ public class DefaultEntityFactory implements EntityFactory { private EntityMapper entityMapper; private CopyOptions reCopyOptions; private CopyOptions deCopyOptions; + private String boundedContextName; + private BoundedContext boundedContext; + private CopyOptions ctxCopyOptions; + + public void setEntityElement(EntityElement entityElement) { + this.entityElement = entityElement; + initCtxCopyOptions(); + } + + private void initCtxCopyOptions() { + List propertyDefinitions = entityElement.getPropertyDefinitions(); + if (!propertyDefinitions.isEmpty()) { + Map keyFieldNameMapping = new ConcurrentHashMap<>(propertyDefinitions.size() * 4 / 3 + 1); + for (PropertyDefinition propertyDefinition : propertyDefinitions) { + PropertyDef propertyDef = propertyDefinition.getPropertyDef(); + String key = propertyDef.getValue(); + String fieldName = propertyDefinition.getFieldName(); + keyFieldNameMapping.put(key, fieldName); + } + this.ctxCopyOptions = CopyOptions.create().ignoreNullValue().setFieldMapping(keyFieldNameMapping); + } + } public void setEntityMapper(EntityMapper entityMapper) { this.entityMapper = entityMapper; @@ -76,10 +103,28 @@ public class DefaultEntityFactory implements EntityFactory { @Override public List reconstitute(Context context, List persistentObjs) { + BoundedContext boundedContext = null; + if (ctxCopyOptions != null) { + Object attachment = context.getAttachment(boundedContextName); + if (attachment instanceof BoundedContext) { + boundedContext = (BoundedContext) attachment; + } + if (boundedContext == null) { + boundedContext = this.boundedContext; + } + } List entities = new ArrayList<>(persistentObjs.size()); - for (Object persistent : persistentObjs) { - Object entity = reconstitute(context, persistent); - entities.add(entity); + if (boundedContext == null) { + for (Object persistent : persistentObjs) { + Object entity = reconstitute(context, persistent); + entities.add(entity); + } + } else { + for (Object persistent : persistentObjs) { + Object entity = reconstitute(context, persistent); + BeanUtil.copyProperties(boundedContext, entity, ctxCopyOptions); + entities.add(entity); + } } return entities; } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/resolver/EntityMapperResolver.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/resolver/EntityMapperResolver.java index 0ec96607..0d50c98d 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/resolver/EntityMapperResolver.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/resolver/EntityMapperResolver.java @@ -126,7 +126,6 @@ public class EntityMapperResolver { @Getter @AllArgsConstructor private class DefaultEntityMapper implements EntityMapper { - private final Map fieldConverterMap; private final List valueObjFields; private final List matchedValueObjFields; @@ -142,7 +141,6 @@ public class EntityMapperResolver { public boolean isValueObjType(Type type) { return valueObjTypes.contains(type); } - } } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractContextRepository.java b/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractContextRepository.java index 4eb8e38d..39246cd5 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractContextRepository.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/repository/AbstractContextRepository.java @@ -21,9 +21,9 @@ import cn.hutool.core.lang.Assert; import cn.hutool.core.util.StrUtil; import com.gitee.dorive.api.constant.core.Order; import com.gitee.dorive.api.entity.core.EntityDefinition; +import com.gitee.dorive.api.entity.core.EntityElement; import com.gitee.dorive.api.entity.core.def.EntityDef; import com.gitee.dorive.api.entity.core.def.OrderDef; -import com.gitee.dorive.api.entity.core.EntityElement; import com.gitee.dorive.api.entity.core.def.RepositoryDef; import com.gitee.dorive.api.impl.core.EntityDefinitionResolver; import com.gitee.dorive.api.impl.core.EntityElementResolver; @@ -34,6 +34,7 @@ import com.gitee.dorive.core.api.executor.Executor; import com.gitee.dorive.core.api.factory.EntityFactory; import com.gitee.dorive.core.api.factory.EntityMapper; import com.gitee.dorive.core.config.RepositoryContext; +import com.gitee.dorive.core.entity.common.BoundedContext; import com.gitee.dorive.core.entity.common.EntityStoreInfo; import com.gitee.dorive.core.entity.executor.OrderBy; import com.gitee.dorive.core.entity.factory.FieldConverter; @@ -45,8 +46,8 @@ import com.gitee.dorive.core.impl.factory.DefaultEntityFactory; import com.gitee.dorive.core.impl.factory.OperationFactory; import com.gitee.dorive.core.impl.factory.ValueObjEntityFactory; import com.gitee.dorive.core.impl.handler.BatchEntityHandler; -import com.gitee.dorive.core.impl.handler.eo.BatchEntityOpHandler; import com.gitee.dorive.core.impl.handler.DelegatedEntityHandler; +import com.gitee.dorive.core.impl.handler.eo.BatchEntityOpHandler; import com.gitee.dorive.core.impl.handler.eo.DelegatedEntityOpHandler; import com.gitee.dorive.core.impl.resolver.BinderResolver; import com.gitee.dorive.core.impl.resolver.DerivedRepositoryResolver; @@ -230,6 +231,15 @@ public abstract class AbstractContextRepository extends AbstractRepositor defaultEntityFactory.setEntityElement(entityElement); defaultEntityFactory.setEntityStoreInfo(entityStoreInfo); defaultEntityFactory.setEntityMapper(entityMapper); + // 边界上下文 + String boundedContextName = repositoryDef.getBoundedContext(); + if (StringUtils.isNotBlank(boundedContextName)) { + defaultEntityFactory.setBoundedContextName(boundedContextName); + if (applicationContext.containsBean(boundedContextName)) { + BoundedContext boundedContext = (BoundedContext) applicationContext.getBean(boundedContextName); + defaultEntityFactory.setBoundedContext(boundedContext); + } + } } return entityFactory; } -- Gitee From a3e7f64a50e7a85a5fe15e5b843b1ee5815d294b Mon Sep 17 00:00:00 2001 From: chenT <609580885@qq.com> Date: Mon, 23 Dec 2024 12:50:08 +0800 Subject: [PATCH 15/15] =?UTF-8?q?=E5=8D=87=E7=BA=A7=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E4=B8=BA3.5.0.5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dorive-api/pom.xml | 2 +- dorive-core/pom.xml | 2 +- dorive-env/pom.xml | 2 +- dorive-event/pom.xml | 2 +- dorive-inject/pom.xml | 2 +- dorive-mybatis-plus/pom.xml | 2 +- dorive-query/pom.xml | 2 +- dorive-ref/pom.xml | 2 +- dorive-spring-boot-starter/pom.xml | 2 +- dorive-sql/pom.xml | 2 +- dorive-web/pom.xml | 2 +- pom.xml | 2 +- 12 files changed, 12 insertions(+), 12 deletions(-) diff --git a/dorive-api/pom.xml b/dorive-api/pom.xml index 4e2324b0..690528bb 100644 --- a/dorive-api/pom.xml +++ b/dorive-api/pom.xml @@ -6,7 +6,7 @@ com.gitee.digital-engine dorive - 3.5.0.4 + 3.5.0.5 dorive-api diff --git a/dorive-core/pom.xml b/dorive-core/pom.xml index c79b5973..0d72afd7 100644 --- a/dorive-core/pom.xml +++ b/dorive-core/pom.xml @@ -6,7 +6,7 @@ com.gitee.digital-engine dorive - 3.5.0.4 + 3.5.0.5 dorive-core diff --git a/dorive-env/pom.xml b/dorive-env/pom.xml index 10c60b4b..d31d3c83 100644 --- a/dorive-env/pom.xml +++ b/dorive-env/pom.xml @@ -6,7 +6,7 @@ com.gitee.digital-engine dorive - 3.5.0.4 + 3.5.0.5 dorive-env diff --git a/dorive-event/pom.xml b/dorive-event/pom.xml index f7cbb7d1..db06c50c 100644 --- a/dorive-event/pom.xml +++ b/dorive-event/pom.xml @@ -6,7 +6,7 @@ com.gitee.digital-engine dorive - 3.5.0.4 + 3.5.0.5 dorive-event diff --git a/dorive-inject/pom.xml b/dorive-inject/pom.xml index d13f899f..1366595f 100644 --- a/dorive-inject/pom.xml +++ b/dorive-inject/pom.xml @@ -6,7 +6,7 @@ com.gitee.digital-engine dorive - 3.5.0.4 + 3.5.0.5 dorive-inject diff --git a/dorive-mybatis-plus/pom.xml b/dorive-mybatis-plus/pom.xml index c0806292..b9e886ec 100644 --- a/dorive-mybatis-plus/pom.xml +++ b/dorive-mybatis-plus/pom.xml @@ -6,7 +6,7 @@ com.gitee.digital-engine dorive - 3.5.0.4 + 3.5.0.5 dorive-mybatis-plus diff --git a/dorive-query/pom.xml b/dorive-query/pom.xml index 6dfed7fc..b9d05910 100644 --- a/dorive-query/pom.xml +++ b/dorive-query/pom.xml @@ -6,7 +6,7 @@ com.gitee.digital-engine dorive - 3.5.0.4 + 3.5.0.5 dorive-query diff --git a/dorive-ref/pom.xml b/dorive-ref/pom.xml index f0777915..4e8cc32d 100644 --- a/dorive-ref/pom.xml +++ b/dorive-ref/pom.xml @@ -6,7 +6,7 @@ com.gitee.digital-engine dorive - 3.5.0.4 + 3.5.0.5 dorive-ref diff --git a/dorive-spring-boot-starter/pom.xml b/dorive-spring-boot-starter/pom.xml index 13a06129..d2b4521d 100644 --- a/dorive-spring-boot-starter/pom.xml +++ b/dorive-spring-boot-starter/pom.xml @@ -6,7 +6,7 @@ com.gitee.digital-engine dorive - 3.5.0.4 + 3.5.0.5 dorive-spring-boot-starter diff --git a/dorive-sql/pom.xml b/dorive-sql/pom.xml index fed9ee87..43bffe79 100644 --- a/dorive-sql/pom.xml +++ b/dorive-sql/pom.xml @@ -6,7 +6,7 @@ com.gitee.digital-engine dorive - 3.5.0.4 + 3.5.0.5 dorive-sql diff --git a/dorive-web/pom.xml b/dorive-web/pom.xml index 54d1281b..13b4cd7f 100644 --- a/dorive-web/pom.xml +++ b/dorive-web/pom.xml @@ -6,7 +6,7 @@ com.gitee.digital-engine dorive - 3.5.0.4 + 3.5.0.5 dorive-web diff --git a/pom.xml b/pom.xml index 6f45b872..53e6cccc 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ 4.0.0 com.gitee.digital-engine dorive - 3.5.0.4 + 3.5.0.5 pom -- Gitee