From 9b78e16c0c49979f1152f5d8a2d5c9200617f4fa Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Tue, 14 Feb 2023 14:02:14 +0800 Subject: [PATCH 1/5] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E4=B8=80=E4=B8=AAunion?= =?UTF-8?q?=E6=9F=A5=E8=AF=A2=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dorive-coating/pom.xml | 2 +- dorive-core/pom.xml | 2 +- .../dorive/core/entity/executor/UnionExample.java | 11 ++++++++++- dorive-event/pom.xml | 2 +- dorive-generator/pom.xml | 2 +- dorive-injection/pom.xml | 2 +- dorive-proxy/pom.xml | 2 +- dorive-service/pom.xml | 2 +- dorive-spring-boot-starter/pom.xml | 2 +- pom.xml | 2 +- 10 files changed, 19 insertions(+), 10 deletions(-) diff --git a/dorive-coating/pom.xml b/dorive-coating/pom.xml index 17d88f09..a2627b80 100644 --- a/dorive-coating/pom.xml +++ b/dorive-coating/pom.xml @@ -6,7 +6,7 @@ com.gitee.digital-engine dorive - 3.1.3 + 3.1.4 dorive-coating diff --git a/dorive-core/pom.xml b/dorive-core/pom.xml index 2da45135..2104d442 100644 --- a/dorive-core/pom.xml +++ b/dorive-core/pom.xml @@ -6,7 +6,7 @@ com.gitee.digital-engine dorive - 3.1.3 + 3.1.4 dorive-core diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/entity/executor/UnionExample.java b/dorive-core/src/main/java/com/gitee/dorive/core/entity/executor/UnionExample.java index 5ba102e7..f69d4c32 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/entity/executor/UnionExample.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/entity/executor/UnionExample.java @@ -34,7 +34,16 @@ public class UnionExample extends Example { public boolean isDirtyQuery() { return !examples.isEmpty(); } - + + @Override + public void selectColumns(List selectColumns) { + if (examples != null && !examples.isEmpty()) { + for (Example example : examples) { + example.selectColumns(selectColumns); + } + } + } + public void addExample(Example example) { examples.add(example); } diff --git a/dorive-event/pom.xml b/dorive-event/pom.xml index 146ce2fb..5b950db9 100644 --- a/dorive-event/pom.xml +++ b/dorive-event/pom.xml @@ -6,7 +6,7 @@ com.gitee.digital-engine dorive - 3.1.3 + 3.1.4 dorive-event diff --git a/dorive-generator/pom.xml b/dorive-generator/pom.xml index 8d94a19c..46e486af 100644 --- a/dorive-generator/pom.xml +++ b/dorive-generator/pom.xml @@ -6,7 +6,7 @@ com.gitee.digital-engine dorive - 3.1.3 + 3.1.4 dorive-generator diff --git a/dorive-injection/pom.xml b/dorive-injection/pom.xml index ea934edb..b5350d6d 100644 --- a/dorive-injection/pom.xml +++ b/dorive-injection/pom.xml @@ -6,7 +6,7 @@ com.gitee.digital-engine dorive - 3.1.3 + 3.1.4 dorive-injection diff --git a/dorive-proxy/pom.xml b/dorive-proxy/pom.xml index 12bf76ef..5be2d881 100644 --- a/dorive-proxy/pom.xml +++ b/dorive-proxy/pom.xml @@ -6,7 +6,7 @@ com.gitee.digital-engine dorive - 3.1.3 + 3.1.4 dorive-proxy diff --git a/dorive-service/pom.xml b/dorive-service/pom.xml index 1e4d80df..9a4cf0ac 100644 --- a/dorive-service/pom.xml +++ b/dorive-service/pom.xml @@ -6,7 +6,7 @@ com.gitee.digital-engine dorive - 3.1.3 + 3.1.4 dorive-service diff --git a/dorive-spring-boot-starter/pom.xml b/dorive-spring-boot-starter/pom.xml index b75730d4..86c02757 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.1.3 + 3.1.4 dorive-spring-boot-starter diff --git a/pom.xml b/pom.xml index ffb49a35..c2fe2d3c 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ 4.0.0 com.gitee.digital-engine dorive - 3.1.3 + 3.1.4 pom -- Gitee From 5ac32c94f51be7fe2b48a6ee84bad71b7287987b Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Tue, 14 Feb 2023 14:56:20 +0800 Subject: [PATCH 2/5] =?UTF-8?q?=E5=8D=87=E7=BA=A7=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index c2fe2d3c..9282bde0 100644 --- a/pom.xml +++ b/pom.xml @@ -46,7 +46,7 @@ org.springframework.boot spring-boot-starter-web - 2.2.2.RELEASE + 2.7.8 org.projectlombok @@ -62,7 +62,7 @@ cn.hutool hutool-all - 5.5.1 + 5.8.12 org.javassist -- Gitee From 9cce33634ac8fbac72936a7a98babdc5038f64f9 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Tue, 14 Feb 2023 15:20:09 +0800 Subject: [PATCH 3/5] =?UTF-8?q?=E5=8D=87=E7=BA=A7=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dorive/core/repository/AbstractContextRepository.java | 4 ++-- .../starter/dorive/repository/MybatisPlusExecutor.java | 8 ++++---- .../starter/dorive/repository/MybatisPlusRepository.java | 4 ++-- 3 files changed, 8 insertions(+), 8 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 5df64d8d..044631d9 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 @@ -138,7 +138,7 @@ public abstract class AbstractContextRepository extends AbstractRepositor defaultRepository.setEntityDefinition(entityDefinition); defaultRepository.setEntityElement(entityElement); defaultRepository.setOperationFactory(operationFactory); - defaultRepository.setExecutor(newExecutor(entityElement, entityDefinition)); + defaultRepository.setExecutor(newExecutor(entityDefinition, entityElement)); } boolean isRoot = "/".equals(accessPath); @@ -176,7 +176,7 @@ public abstract class AbstractContextRepository extends AbstractRepositor return configuredRepository; } - protected abstract Executor newExecutor(EntityElement entityElement, EntityDefinition entityDefinition); + protected abstract Executor newExecutor(EntityDefinition entityDefinition, EntityElement entityElement); protected abstract AbstractRepository postProcessRepository(AbstractRepository repository); diff --git a/dorive-spring-boot-starter/src/main/java/com/gitee/spring/boot/starter/dorive/repository/MybatisPlusExecutor.java b/dorive-spring-boot-starter/src/main/java/com/gitee/spring/boot/starter/dorive/repository/MybatisPlusExecutor.java index 3a789436..6f10c23e 100644 --- a/dorive-spring-boot-starter/src/main/java/com/gitee/spring/boot/starter/dorive/repository/MybatisPlusExecutor.java +++ b/dorive-spring-boot-starter/src/main/java/com/gitee/spring/boot/starter/dorive/repository/MybatisPlusExecutor.java @@ -67,19 +67,19 @@ import static com.gitee.spring.boot.starter.dorive.impl.AppenderContext.OPERATOR @ToString public class MybatisPlusExecutor extends AbstractExecutor implements MetadataHolder { - private EntityElement entityElement; private EntityDefinition entityDefinition; + private EntityElement entityElement; private BaseMapper baseMapper; private Class pojoClass; private EntityFactory entityFactory; - public MybatisPlusExecutor(EntityElement entityElement, - EntityDefinition entityDefinition, + public MybatisPlusExecutor(EntityDefinition entityDefinition, + EntityElement entityElement, BaseMapper baseMapper, Class pojoClass, EntityFactory entityFactory) { - this.entityElement = entityElement; this.entityDefinition = entityDefinition; + this.entityElement = entityElement; this.baseMapper = baseMapper; this.pojoClass = pojoClass; this.entityFactory = entityFactory; diff --git a/dorive-spring-boot-starter/src/main/java/com/gitee/spring/boot/starter/dorive/repository/MybatisPlusRepository.java b/dorive-spring-boot-starter/src/main/java/com/gitee/spring/boot/starter/dorive/repository/MybatisPlusRepository.java index f725e5a3..0a433acb 100644 --- a/dorive-spring-boot-starter/src/main/java/com/gitee/spring/boot/starter/dorive/repository/MybatisPlusRepository.java +++ b/dorive-spring-boot-starter/src/main/java/com/gitee/spring/boot/starter/dorive/repository/MybatisPlusRepository.java @@ -38,7 +38,7 @@ public class MybatisPlusRepository extends AbstractCoatingRepository mapperClass = entityDefinition.getMapper(); Object mapper = null; Class pojoClass = null; @@ -68,7 +68,7 @@ public class MybatisPlusRepository extends AbstractCoatingRepository) mapper, (Class) pojoClass, entityFactory); + return new MybatisPlusExecutor(entityDefinition, entityElement, (BaseMapper) mapper, (Class) pojoClass, entityFactory); } } -- Gitee From d46a806b4a999ecfabce0d519ae11fbbdbb51ece Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Tue, 14 Feb 2023 16:08:43 +0800 Subject: [PATCH 4/5] =?UTF-8?q?=E4=B8=8D=E5=86=8D=E4=BD=BF=E7=94=A8id?= =?UTF-8?q?=E4=BD=9C=E4=B8=BA=E7=B4=A2=E5=BC=95=E4=BE=9D=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gitee/dorive/core/api/EntityIndex.java | 2 +- .../dorive/core/entity/executor/Result.java | 6 +-- .../core/impl/handler/BatchEntityHandler.java | 16 +++---- .../dorive/impl/EntityIndexResult.java | 42 ++++++++----------- .../repository/MybatisPlusExecutor.java | 22 +++------- .../boot/starter/dorive/util/NumberUtils.java | 7 ++++ 6 files changed, 40 insertions(+), 55 deletions(-) diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/api/EntityIndex.java b/dorive-core/src/main/java/com/gitee/dorive/core/api/EntityIndex.java index bb0ad328..0591c68d 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/api/EntityIndex.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/api/EntityIndex.java @@ -20,6 +20,6 @@ import java.util.List; public interface EntityIndex { - List selectList(Object rootEntity, Object primaryKey); + List selectList(Object rootEntity, Object key); } diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/entity/executor/Result.java b/dorive-core/src/main/java/com/gitee/dorive/core/entity/executor/Result.java index 6618c507..7821889b 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/entity/executor/Result.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/entity/executor/Result.java @@ -26,9 +26,9 @@ import java.util.List; @NoArgsConstructor public class Result { - private E record; - private List records = Collections.emptyList(); - private Page page; + protected E record; + protected List records = Collections.emptyList(); + protected Page page; public Result(E record) { this.record = record; diff --git a/dorive-core/src/main/java/com/gitee/dorive/core/impl/handler/BatchEntityHandler.java b/dorive-core/src/main/java/com/gitee/dorive/core/impl/handler/BatchEntityHandler.java index ac917649..33abe56a 100644 --- a/dorive-core/src/main/java/com/gitee/dorive/core/impl/handler/BatchEntityHandler.java +++ b/dorive-core/src/main/java/com/gitee/dorive/core/impl/handler/BatchEntityHandler.java @@ -62,8 +62,6 @@ public class BatchEntityHandler implements EntityHandler { } private UnionExample newUnionExample(ConfiguredRepository repository, BoundedContext boundedContext, List rootEntities) { - ConfiguredRepository rootRepository = this.repository.getRootRepository(); - PropertyChain anchorPoint = repository.getAnchorPoint(); PropertyChain lastPropertyChain = anchorPoint.getLastPropertyChain(); @@ -71,7 +69,8 @@ public class BatchEntityHandler implements EntityHandler { ExampleBuilder exampleBuilder = StringUtils.isNotBlank(builderKey) ? (ExampleBuilder) boundedContext.get(builderKey) : null; UnionExample unionExample = new UnionExample(); - for (Object rootEntity : rootEntities) { + for (int index = 0; index < rootEntities.size(); index++) { + Object rootEntity = rootEntities.get(index); Object lastEntity = lastPropertyChain == null ? rootEntity : lastPropertyChain.getValue(rootEntity); if (lastEntity != null) { Example example = repository.newExampleByContext(boundedContext, rootEntity); @@ -79,8 +78,7 @@ public class BatchEntityHandler implements EntityHandler { example = exampleBuilder.buildExample(boundedContext, rootEntity, example); } if (example.isDirtyQuery()) { - Object primaryKey = rootRepository.getPrimaryKey(rootEntity); - example.extraColumns(primaryKey + " as $id"); + example.extraColumns((index + 1) + " as $row"); unionExample.addExample(example); } } @@ -89,17 +87,15 @@ public class BatchEntityHandler implements EntityHandler { } private void setValueForRootEntities(ConfiguredRepository repository, List rootEntities, EntityIndex entityIndex) { - ConfiguredRepository rootRepository = this.repository.getRootRepository(); - PropertyChain anchorPoint = repository.getAnchorPoint(); PropertyChain lastPropertyChain = anchorPoint.getLastPropertyChain(); PropertyProxy propertyProxy = anchorPoint.getPropertyProxy(); - for (Object rootEntity : rootEntities) { + for (int index = 0; index < rootEntities.size(); index++) { + Object rootEntity = rootEntities.get(index); Object lastEntity = lastPropertyChain == null ? rootEntity : lastPropertyChain.getValue(rootEntity); if (lastEntity != null) { - Object primaryKey = rootRepository.getPrimaryKey(rootEntity); - List entities = entityIndex.selectList(rootEntity, primaryKey); + List entities = entityIndex.selectList(rootEntity, index + 1); Object entity = repository.convertManyToOne(entities); if (entity != null) { propertyProxy.setValue(lastEntity, entity); diff --git a/dorive-spring-boot-starter/src/main/java/com/gitee/spring/boot/starter/dorive/impl/EntityIndexResult.java b/dorive-spring-boot-starter/src/main/java/com/gitee/spring/boot/starter/dorive/impl/EntityIndexResult.java index 88ac1a7a..7af267ce 100644 --- a/dorive-spring-boot-starter/src/main/java/com/gitee/spring/boot/starter/dorive/impl/EntityIndexResult.java +++ b/dorive-spring-boot-starter/src/main/java/com/gitee/spring/boot/starter/dorive/impl/EntityIndexResult.java @@ -16,11 +16,10 @@ */ package com.gitee.spring.boot.starter.dorive.impl; -import com.gitee.spring.boot.starter.dorive.util.NumberUtils; import com.gitee.dorive.core.api.EntityIndex; -import com.gitee.dorive.core.api.PropertyProxy; import com.gitee.dorive.core.entity.executor.Result; import com.gitee.dorive.core.entity.executor.UnionExample; +import com.gitee.spring.boot.starter.dorive.util.NumberUtils; import java.util.ArrayList; import java.util.Collections; @@ -30,39 +29,32 @@ import java.util.Map; public class EntityIndexResult extends Result implements EntityIndex { - private final Map> primaryKeyMapping; - private final Map primaryKeyEntityMap; + private final Map> romNumMapping; - public EntityIndexResult(UnionExample unionExample, List> resultMaps, List entities, PropertyProxy primaryKeyProxy) { + public EntityIndexResult(UnionExample unionExample, List> resultMaps, List entities) { super(entities); int rootSize = unionExample.getExamples().size(); - int entitySize = entities.size(); - primaryKeyMapping = new HashMap<>(rootSize * 4 / 3 + 1); - primaryKeyEntityMap = new HashMap<>(entitySize * 4 / 3 + 1); - int averageSize = resultMaps.size() / rootSize + 1; - for (Map resultMap : resultMaps) { - Long rootPrimaryKey = NumberUtils.longValue(resultMap.get("$id")); - List existPrimaryKeys = primaryKeyMapping.computeIfAbsent(rootPrimaryKey, key -> new ArrayList<>(averageSize)); - Long primaryKey = NumberUtils.longValue(resultMap.get("id")); - existPrimaryKeys.add(primaryKey); - } - for (Object entity : entities) { - Long primaryKey = NumberUtils.longValue(primaryKeyProxy.getValue(entity)); - primaryKeyEntityMap.put(primaryKey, entity); + romNumMapping = new HashMap<>(rootSize * 4 / 3 + 1); + + for (int index = 0; index < resultMaps.size(); index++) { + Map resultMap = resultMaps.get(index); + Integer rowNum = NumberUtils.intValue(resultMap.get("$row")); + List existRowNums = romNumMapping.computeIfAbsent(rowNum, key -> new ArrayList<>(averageSize)); + existRowNums.add(index + 1); } } @Override - public List selectList(Object rootEntity, Object primaryKey) { - Long rootPrimaryKey = NumberUtils.longValue(primaryKey); - List existPrimaryKeys = primaryKeyMapping.get(rootPrimaryKey); - if (existPrimaryKeys != null && !existPrimaryKeys.isEmpty()) { - List entities = new ArrayList<>(existPrimaryKeys.size()); - for (Long existPrimaryKey : existPrimaryKeys) { - Object entity = primaryKeyEntityMap.get(existPrimaryKey); + public List selectList(Object rootEntity, Object key) { + Integer rowNum = NumberUtils.intValue(key); + List existRowNums = romNumMapping.get(rowNum); + if (existRowNums != null && !existRowNums.isEmpty()) { + List entities = new ArrayList<>(existRowNums.size()); + for (Integer existRowNum : existRowNums) { + Object entity = records.get(existRowNum - 1); entities.add(entity); } return entities; diff --git a/dorive-spring-boot-starter/src/main/java/com/gitee/spring/boot/starter/dorive/repository/MybatisPlusExecutor.java b/dorive-spring-boot-starter/src/main/java/com/gitee/spring/boot/starter/dorive/repository/MybatisPlusExecutor.java index 6f10c23e..0852c093 100644 --- a/dorive-spring-boot-starter/src/main/java/com/gitee/spring/boot/starter/dorive/repository/MybatisPlusExecutor.java +++ b/dorive-spring-boot-starter/src/main/java/com/gitee/spring/boot/starter/dorive/repository/MybatisPlusExecutor.java @@ -26,17 +26,14 @@ import com.baomidou.mybatisplus.core.metadata.TableFieldInfo; import com.baomidou.mybatisplus.core.metadata.TableInfoHelper; import com.baomidou.mybatisplus.core.toolkit.StringPool; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.gitee.spring.boot.starter.dorive.api.CriterionAppender; -import com.gitee.spring.boot.starter.dorive.entity.Metadata; -import com.gitee.spring.boot.starter.dorive.impl.EntityIndexResult; import com.gitee.dorive.core.api.EntityFactory; import com.gitee.dorive.core.api.MetadataHolder; import com.gitee.dorive.core.api.PropertyProxy; import com.gitee.dorive.core.api.constant.Order; import com.gitee.dorive.core.entity.BoundedContext; import com.gitee.dorive.core.entity.Command; -import com.gitee.dorive.core.entity.element.EntityElement; import com.gitee.dorive.core.entity.definition.EntityDefinition; +import com.gitee.dorive.core.entity.element.EntityElement; import com.gitee.dorive.core.entity.executor.Criterion; import com.gitee.dorive.core.entity.executor.Example; import com.gitee.dorive.core.entity.executor.OrderBy; @@ -48,6 +45,9 @@ import com.gitee.dorive.core.entity.operation.Operation; import com.gitee.dorive.core.entity.operation.Query; import com.gitee.dorive.core.entity.operation.Update; import com.gitee.dorive.core.impl.executor.AbstractExecutor; +import com.gitee.spring.boot.starter.dorive.api.CriterionAppender; +import com.gitee.spring.boot.starter.dorive.entity.Metadata; +import com.gitee.spring.boot.starter.dorive.impl.EntityIndexResult; import lombok.Getter; import lombok.Setter; import lombok.ToString; @@ -55,7 +55,6 @@ import org.apache.commons.lang3.StringUtils; import java.io.Serializable; import java.util.ArrayList; -import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; @@ -106,17 +105,8 @@ public class MybatisPlusExecutor extends AbstractExecutor implements MetadataHol UnionExample unionExample = (UnionExample) example; QueryWrapper queryWrapper = buildQueryWrapper(unionExample); List> resultMaps = baseMapper.selectMaps(queryWrapper); - int resultSize = resultMaps.size(); - Set existIds = new HashSet<>(resultSize * 4 / 3 + 1); - List entities = new ArrayList<>(resultSize); - for (Map resultMap : resultMaps) { - Object id = resultMap.get("id"); - if (existIds.add(id)) { - Object entity = entityFactory.reconstitute(boundedContext, resultMap); - entities.add(entity); - } - } - return new EntityIndexResult(unionExample, resultMaps, entities, entityElement.getPrimaryKeyProxy()); + List entities = reconstitute(boundedContext, resultMaps); + return new EntityIndexResult(unionExample, resultMaps, entities); } else { QueryWrapper queryWrapper = buildQueryWrapper(example); diff --git a/dorive-spring-boot-starter/src/main/java/com/gitee/spring/boot/starter/dorive/util/NumberUtils.java b/dorive-spring-boot-starter/src/main/java/com/gitee/spring/boot/starter/dorive/util/NumberUtils.java index 6166b42b..e2121c48 100644 --- a/dorive-spring-boot-starter/src/main/java/com/gitee/spring/boot/starter/dorive/util/NumberUtils.java +++ b/dorive-spring-boot-starter/src/main/java/com/gitee/spring/boot/starter/dorive/util/NumberUtils.java @@ -18,6 +18,13 @@ package com.gitee.spring.boot.starter.dorive.util; public class NumberUtils { + public static Integer intValue(Object object) { + if (object instanceof Number) { + return ((Number) object).intValue(); + } + return null; + } + public static Long longValue(Object object) { if (object instanceof Number) { return ((Number) object).longValue(); -- Gitee From 56d8ae592b72df7527702503b0ecaeb36987e476 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Tue, 14 Feb 2023 16:24:51 +0800 Subject: [PATCH 5/5] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/pom.xml b/pom.xml index 9282bde0..5dc580ec 100644 --- a/pom.xml +++ b/pom.xml @@ -8,6 +8,26 @@ 3.1.4 pom + + + Apache License, Version 2.0 + https://www.apache.org/licenses/LICENSE-2.0 + + + + + + chenT + digital_engine@163.com + + + + + scm:git:git://gitee.com/digital-engine/dorive.git + scm:git:ssh://git@gitee.com/digital-engine/dorive.git + https://gitee.com/digital-engine/dorive.git + + central -- Gitee