适配magic-script 1.8.0

This commit is contained in:
mxd
2022-01-25 23:17:55 +08:00
parent 8c02dcd008
commit 167179a261
28 changed files with 183 additions and 183 deletions

View File

@@ -1,10 +1,11 @@
package org.ssssssss.magicapi.elasticsearch;
import org.elasticsearch.client.RestClient;
import org.ssssssss.magicapi.core.config.MagicModule;
import org.ssssssss.magicapi.core.annotation.MagicModule;
import org.ssssssss.script.annotation.Comment;
public class ElasticSearchModule implements MagicModule {
@MagicModule("elasticsearch")
public class ElasticSearchModule {
private static final String DOC = "_doc";
@@ -22,9 +23,4 @@ public class ElasticSearchModule implements MagicModule {
public ElasticSearchIndex index(String indexName){
return new ElasticSearchIndex(this.restClient, indexName, DOC);
}
@Override
public String getModuleName() {
return "elasticsearch";
}
}

View File

@@ -9,14 +9,15 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.ssssssss.magicapi.core.config.Constants;
import org.ssssssss.magicapi.core.config.MagicModule;
import org.ssssssss.magicapi.core.annotation.MagicModule;
import org.ssssssss.script.convert.ClassImplicitConvert;
import org.ssssssss.script.functions.DynamicAttribute;
import org.ssssssss.script.reflection.JavaInvoker;
import org.ssssssss.script.reflection.JavaReflection;
import org.ssssssss.script.runtime.Variables;
import java.beans.Transient;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;
/**
@@ -24,7 +25,8 @@ import java.util.Map;
*
* @author mxd
*/
public class MongoModule extends HashMap<String, MongoModule.MongoDataBaseGetter> implements MagicModule, ClassImplicitConvert {
@MagicModule("mongo")
public class MongoModule implements ClassImplicitConvert, DynamicAttribute<MongoModule.MongoDataBaseGetter, MongoModule.MongoDataBaseGetter> {
private static final Logger logger = LoggerFactory.getLogger(MongoModule.class);
@@ -54,23 +56,19 @@ public class MongoModule extends HashMap<String, MongoModule.MongoDataBaseGetter
}
@Override
public MongoDataBaseGetter get(Object databaseName) {
@Transient
public MongoDataBaseGetter getDynamicAttribute(String databaseName) {
try {
if (databaseName == null) {
return null;
}
MongoDatabase database = (MongoDatabase) invoker.invoke0(factory, null, new Object[]{databaseName.toString()});
MongoDatabase database = (MongoDatabase) invoker.invoke0(factory, null, new Object[]{databaseName});
return new MongoDataBaseGetter(database);
} catch (Throwable e) {
throw new RuntimeException(e);
}
}
@Override
public String getModuleName() {
return "mongo";
}
@Override
public boolean support(Class<?> from, Class<?> to) {
return Map.class.isAssignableFrom(from) && (Bson.class.isAssignableFrom(to));
@@ -81,7 +79,7 @@ public class MongoModule extends HashMap<String, MongoModule.MongoDataBaseGetter
return new Document((Map<String, Object>) source);
}
public static class MongoDataBaseGetter extends HashMap<String, MongoCollection<Document>> {
public static class MongoDataBaseGetter implements DynamicAttribute<MongoCollection<Document>, MongoCollection<Document>> {
MongoDatabase database;
@@ -90,8 +88,9 @@ public class MongoModule extends HashMap<String, MongoModule.MongoDataBaseGetter
}
@Override
public MongoCollection<Document> get(Object key) {
return database.getCollection(key.toString());
@Transient
public MongoCollection<Document> getDynamicAttribute(String key) {
return database.getCollection(key);
}
}
}

View File

@@ -3,7 +3,7 @@ package org.ssssssss.magicapi.redis;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisCallback;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.ssssssss.magicapi.core.config.MagicModule;
import org.ssssssss.magicapi.core.annotation.MagicModule;
import org.ssssssss.script.functions.DynamicMethod;
import java.util.*;
@@ -13,7 +13,8 @@ import java.util.*;
*
* @author mxd
*/
public class RedisModule implements MagicModule, DynamicMethod {
@MagicModule("redis")
public class RedisModule implements DynamicMethod {
private final StringRedisTemplate redisTemplate;
@@ -21,11 +22,6 @@ public class RedisModule implements MagicModule, DynamicMethod {
this.redisTemplate = new StringRedisTemplate(connectionFactory);
}
@Override
public String getModuleName() {
return "redis";
}
/**
* 序列化
*/

View File

@@ -17,7 +17,6 @@ import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.context.annotation.Lazy;
import org.springframework.core.Ordered;
import org.springframework.core.env.Environment;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.web.bind.annotation.RequestMethod;
@@ -34,6 +33,7 @@ import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry
import org.ssssssss.magicapi.backup.service.MagicBackupService;
import org.ssssssss.magicapi.backup.service.MagicDatabaseBackupService;
import org.ssssssss.magicapi.backup.web.MagicBackupController;
import org.ssssssss.magicapi.core.annotation.MagicModule;
import org.ssssssss.magicapi.core.config.*;
import org.ssssssss.magicapi.core.exception.MagicAPIException;
import org.ssssssss.magicapi.core.handler.MagicCoordinationHandler;
@@ -128,8 +128,6 @@ public class MagicAPIAutoConfiguration implements WebMvcConfigurer, WebSocketCon
private final ObjectProvider<DataSourceEncryptProvider> dataSourceEncryptProvider;
private final Environment environment;
private final MagicCorsFilter magicCorsFilter = new MagicCorsFilter();
private final MagicAPIProperties properties;
@@ -146,9 +144,6 @@ public class MagicAPIAutoConfiguration implements WebMvcConfigurer, WebSocketCon
@Lazy
private RequestMappingHandlerMapping requestMappingHandlerMapping;
@Autowired(required = false)
private MultipartResolver multipartResolver;
private DefaultAuthorizationInterceptor defaultAuthorizationInterceptor;
public MagicAPIAutoConfiguration(MagicAPIProperties properties,
@@ -162,7 +157,6 @@ public class MagicAPIAutoConfiguration implements WebMvcConfigurer, WebSocketCon
ObjectProvider<DataSourceEncryptProvider> dataSourceEncryptProvider,
ObjectProvider<List<MagicDynamicRegistry<? extends MagicEntity>>> magicDynamicRegistriesProvider,
ObjectProvider<List<MagicResourceStorage<? extends MagicEntity>>> magicResourceStoragesProvider,
Environment environment,
ApplicationContext applicationContext
) {
this.properties = properties;
@@ -176,7 +170,6 @@ public class MagicAPIAutoConfiguration implements WebMvcConfigurer, WebSocketCon
this.dataSourceEncryptProvider = dataSourceEncryptProvider;
this.magicDynamicRegistriesProvider = magicDynamicRegistriesProvider;
this.magicResourceStoragesProvider = magicResourceStoragesProvider;
this.environment = environment;
this.applicationContext = applicationContext;
}
@@ -267,10 +260,7 @@ public class MagicAPIAutoConfiguration implements WebMvcConfigurer, WebSocketCon
/**
* 注册模块、类型扩展
*/
private void setupMagicModules(ResultProvider resultProvider,
List<MagicModule> magicModules,
List<ExtensionMethod> extensionMethods,
List<LanguageProvider> languageProviders) {
private void setupMagicModules(List<ExtensionMethod> extensionMethods, List<LanguageProvider> languageProviders) {
// 设置脚本import时 class加载策略
MagicResourceLoader.setClassLoader((className) -> {
try {
@@ -301,15 +291,10 @@ public class MagicAPIAutoConfiguration implements WebMvcConfigurer, WebSocketCon
logger.info("注册模块:{} -> {}", "log", Logger.class);
MagicResourceLoader.addModule("log", new DynamicModuleImport(Logger.class, context -> LoggerFactory.getLogger(Objects.toString(context.getScriptName(), "Unknown"))));
List<String> importModules = properties.getAutoImportModuleList();
logger.info("注册模块:{} -> {}", "env", EnvModule.class);
MagicResourceLoader.addModule("env", new EnvModule(environment));
logger.info("注册模块:{} -> {}", "request", RequestModule.class);
MagicResourceLoader.addModule("request", new RequestModule(multipartResolver));
logger.info("注册模块:{} -> {}", "response", ResponseModule.class);
MagicResourceLoader.addModule("response", new ResponseModule(resultProvider));
magicModules.forEach(module -> {
logger.info("注册模块:{} -> {}", module.getModuleName(), module.getClass());
MagicResourceLoader.addModule(module.getModuleName(), module);
applicationContext.getBeansWithAnnotation(MagicModule.class).values().forEach(module -> {
String moduleName = module.getClass().getAnnotation(MagicModule.class).value();
logger.info("注册模块:{} -> {}", moduleName, module.getClass());
MagicResourceLoader.addModule(moduleName, module);
});
MagicResourceLoader.getModuleNames().stream().filter(importModules::contains).forEach(moduleName -> {
logger.info("自动导入模块:{}", moduleName);
@@ -326,8 +311,7 @@ public class MagicAPIAutoConfiguration implements WebMvcConfigurer, WebSocketCon
}
@Bean
public MagicConfiguration magicConfiguration(List<MagicModule> magicModules,
List<LanguageProvider> languageProviders,
public MagicConfiguration magicConfiguration(List<LanguageProvider> languageProviders,
org.ssssssss.magicapi.core.resource.Resource magicResource,
ResultProvider resultProvider,
MagicResourceService magicResourceService,
@@ -345,7 +329,7 @@ public class MagicAPIAutoConfiguration implements WebMvcConfigurer, WebSocketCon
Constants.RESPONSE_CODE_INVALID = responseCodeConfig.getInvalid();
Constants.RESPONSE_CODE_EXCEPTION = responseCodeConfig.getException();
// 设置模块和扩展方法
setupMagicModules(resultProvider, magicModules, extensionMethodsProvider.getIfAvailable(Collections::emptyList), languageProviders);
setupMagicModules(extensionMethodsProvider.getIfAvailable(Collections::emptyList), languageProviders);
MagicConfiguration configuration = new MagicConfiguration();
configuration.setMagicAPIService(magicAPIService);
configuration.setMagicNotifyService(magicNotifyService);

View File

@@ -71,12 +71,4 @@ public class MagicDynamicRegistryConfiguration {
return new DataSourceMagicDynamicRegistry(dataSourceInfoMagicResourceStorage, magicDynamicDataSource);
}
/**
* 注入结果构建方法
*/
@Bean
@ConditionalOnMissingBean(ResultProvider.class)
public ResultProvider resultProvider() {
return new DefaultResultProvider(properties.getResponse());
}
}

View File

@@ -8,12 +8,15 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.core.env.Environment;
import org.springframework.http.MediaType;
import org.springframework.http.converter.StringHttpMessageConverter;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.multipart.MultipartResolver;
import org.ssssssss.magicapi.core.config.Cache;
import org.ssssssss.magicapi.core.config.MagicAPIProperties;
import org.ssssssss.magicapi.core.config.Page;
import org.ssssssss.magicapi.core.interceptor.DefaultResultProvider;
import org.ssssssss.magicapi.core.interceptor.ResultProvider;
import org.ssssssss.magicapi.core.model.Options;
import org.ssssssss.magicapi.datasource.model.MagicDynamicDataSource;
@@ -31,6 +34,9 @@ import org.ssssssss.magicapi.modules.db.provider.ColumnMapperProvider;
import org.ssssssss.magicapi.modules.db.provider.DefaultPageProvider;
import org.ssssssss.magicapi.modules.db.provider.PageProvider;
import org.ssssssss.magicapi.modules.http.HttpModule;
import org.ssssssss.magicapi.modules.servlet.RequestModule;
import org.ssssssss.magicapi.modules.servlet.ResponseModule;
import org.ssssssss.magicapi.modules.spring.EnvModule;
import org.ssssssss.script.MagicResourceLoader;
import org.ssssssss.script.functions.DynamicModuleImport;
@@ -67,15 +73,23 @@ public class MagicModuleConfiguration {
*/
private final ObjectProvider<List<ColumnMapperProvider>> columnMapperProvidersProvider;
private final Environment environment;
@Autowired(required = false)
private MultipartResolver multipartResolver;
public MagicModuleConfiguration(MagicAPIProperties properties,
ObjectProvider<List<SQLInterceptor>> sqlInterceptorsProvider,
ObjectProvider<List<NamedTableInterceptor>> namedTableInterceptorsProvider,
ObjectProvider<List<Dialect>> dialectsProvider, ObjectProvider<List<ColumnMapperProvider>> columnMapperProvidersProvider) {
ObjectProvider<List<Dialect>> dialectsProvider,
ObjectProvider<List<ColumnMapperProvider>> columnMapperProvidersProvider,
Environment environment) {
this.properties = properties;
this.sqlInterceptorsProvider = sqlInterceptorsProvider;
this.namedTableInterceptorsProvider = namedTableInterceptorsProvider;
this.dialectsProvider = dialectsProvider;
this.columnMapperProvidersProvider = columnMapperProvidersProvider;
this.environment = environment;
}
/**
@@ -145,7 +159,7 @@ public class MagicModuleConfiguration {
sqlModule.setDialectAdapter(dialectAdapter);
sqlModule.setLogicDeleteColumn(properties.getCrud().getLogicDeleteColumn());
sqlModule.setLogicDeleteValue(properties.getCrud().getLogicDeleteValue());
MagicResourceLoader.addModule(sqlModule.getModuleName(), new DynamicModuleImport(SQLModule.class, context -> {
MagicResourceLoader.addModule("db", new DynamicModuleImport(SQLModule.class, context -> {
String dataSourceKey = context.getString(Options.DEFAULT_DATA_SOURCE.getValue());
if (StringUtils.isEmpty(dataSourceKey)) return sqlModule;
SQLModule newSqlModule = sqlModule.cloneSQLModule();
@@ -166,6 +180,34 @@ public class MagicModuleConfiguration {
return new HttpModule(createRestTemplate());
}
@Bean
@ConditionalOnMissingBean
public EnvModule magicEnvModule(){
return new EnvModule(environment);
}
@Bean
@ConditionalOnMissingBean
public RequestModule magicRequestModule(){
return new RequestModule(multipartResolver);
}
/**
* 注入结果构建方法
*/
@Bean
@ConditionalOnMissingBean(ResultProvider.class)
public ResultProvider resultProvider() {
return new DefaultResultProvider(properties.getResponse());
}
@Bean
@ConditionalOnMissingBean
public ResponseModule magicResponseModule(ResultProvider resultProvider){
return new ResponseModule(resultProvider);
}
private RestTemplate createRestTemplate() {
RestTemplate restTemplate = new RestTemplate();
restTemplate.getMessageConverters().add(new StringHttpMessageConverter(StandardCharsets.UTF_8) {
@@ -180,4 +222,5 @@ public class MagicModuleConfiguration {
});
return restTemplate;
}
}

View File

@@ -0,0 +1,19 @@
package org.ssssssss.magicapi.core.annotation;
import java.lang.annotation.*;
/**
* 模块主要用于import指令import时根据模块名获取当前类如<code>import assert</code>;
*
* @author mxd
*/
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface MagicModule {
/**
* 模块名
*/
String value();
}

View File

@@ -1,4 +1,6 @@
package org.ssssssss.magicapi.core.config;
package org.ssssssss.magicapi.core.annotation;
import org.ssssssss.magicapi.core.config.MessageType;
import java.lang.annotation.*;

View File

@@ -1,4 +1,4 @@
package org.ssssssss.magicapi.core.config;
package org.ssssssss.magicapi.core.annotation;
import org.ssssssss.magicapi.core.interceptor.Authorization;

View File

@@ -1,19 +0,0 @@
package org.ssssssss.magicapi.core.config;
import org.ssssssss.script.annotation.UnableCall;
/**
* 模块主要用于import指令import时根据模块名获取当前类如<code>import assert</code>;
*
* @author mxd
*/
public interface MagicModule {
/**
* 获取模块名
*
* @return 返回模块名称
*/
@UnableCall
String getModuleName();
}

View File

@@ -1,6 +1,6 @@
package org.ssssssss.magicapi.core.handler;
import org.ssssssss.magicapi.core.config.Message;
import org.ssssssss.magicapi.core.annotation.Message;
import org.ssssssss.magicapi.core.config.MessageType;
import org.ssssssss.magicapi.core.config.WebSocketSessionManager;
import org.ssssssss.magicapi.core.config.Constants;

View File

@@ -1,7 +1,7 @@
package org.ssssssss.magicapi.core.handler;
import org.apache.commons.lang3.StringUtils;
import org.ssssssss.magicapi.core.config.Message;
import org.ssssssss.magicapi.core.annotation.Message;
import org.ssssssss.magicapi.core.config.MessageType;
import org.ssssssss.magicapi.core.config.WebSocketSessionManager;
import org.ssssssss.magicapi.core.context.MagicConsoleSession;

View File

@@ -6,7 +6,7 @@ import org.springframework.web.socket.CloseStatus;
import org.springframework.web.socket.TextMessage;
import org.springframework.web.socket.WebSocketSession;
import org.springframework.web.socket.handler.TextWebSocketHandler;
import org.ssssssss.magicapi.core.config.Message;
import org.ssssssss.magicapi.core.annotation.Message;
import org.ssssssss.magicapi.core.config.MessageType;
import org.ssssssss.magicapi.core.config.WebSocketSessionManager;
import org.ssssssss.magicapi.core.event.EventAction;

View File

@@ -1,6 +1,6 @@
package org.ssssssss.magicapi.core.handler;
import org.ssssssss.magicapi.core.config.Message;
import org.ssssssss.magicapi.core.annotation.Message;
import org.ssssssss.magicapi.core.config.MessageType;
import org.ssssssss.magicapi.core.config.WebSocketSessionManager;
import org.ssssssss.magicapi.core.exception.MagicLoginException;

View File

@@ -4,10 +4,9 @@ import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;
import org.ssssssss.magicapi.core.config.Constants;
import org.ssssssss.magicapi.core.config.MagicCorsFilter;
import org.ssssssss.magicapi.core.config.Valid;
import org.ssssssss.magicapi.core.annotation.Valid;
import org.ssssssss.magicapi.core.web.MagicController;
import org.ssssssss.magicapi.core.exception.MagicLoginException;
import org.ssssssss.magicapi.core.interceptor.AuthorizationInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

View File

@@ -1,7 +1,6 @@
package org.ssssssss.magicapi.core.model;
import org.ssssssss.script.annotation.UnableCall;
import java.beans.Transient;
import java.util.HashMap;
import java.util.Map;
@@ -21,7 +20,7 @@ public class Attributes<T> {
* @param key key
* @param value value
*/
@UnableCall
@Transient
public void setAttribute(String key, T value) {
properties.put(key, value);
}
@@ -31,17 +30,17 @@ public class Attributes<T> {
*
* @param key key
*/
@UnableCall
@Transient
public Object getAttribute(String key) {
return properties.get(key);
}
@UnableCall
@Transient
public Map<String, T> getProperties() {
return properties;
}
@UnableCall
@Transient
public void setProperties(Map<String, T> properties) {
this.properties = properties;
}

View File

@@ -1,6 +1,6 @@
package org.ssssssss.magicapi.core.service;
import org.ssssssss.magicapi.core.config.MagicModule;
import org.ssssssss.magicapi.core.annotation.MagicModule;
import org.ssssssss.magicapi.core.model.*;
import java.io.IOException;
@@ -12,7 +12,7 @@ import java.util.Map;
/**
* API调用接口
*/
public interface MagicAPIService extends MagicModule {
public interface MagicAPIService {
/**
* 执行MagicAPI中的接口,原始内容不包含code以及message信息

View File

@@ -10,6 +10,7 @@ import org.springframework.http.MediaType;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.web.client.RestTemplate;
import org.ssssssss.magicapi.core.annotation.MagicModule;
import org.ssssssss.magicapi.core.config.Constants;
import org.ssssssss.magicapi.core.config.JsonCodeConstants;
import org.ssssssss.magicapi.core.config.WebSocketSessionManager;
@@ -35,6 +36,7 @@ import java.util.List;
import java.util.Map;
import java.util.Objects;
@MagicModule("magic")
public class DefaultMagicAPIService implements MagicAPIService, JsonCodeConstants {
private final static Logger logger = LoggerFactory.getLogger(DefaultMagicAPIService.class);
@@ -204,11 +206,6 @@ public class DefaultMagicAPIService implements MagicAPIService, JsonCodeConstant
return null;
}
@Override
public String getModuleName() {
return "magic";
}
private boolean processWebSocketSendMessage(String clientId, String content) {
WebSocketSessionManager.sendByClientId(clientId, content);
return true;

View File

@@ -5,7 +5,7 @@ import org.springframework.web.bind.annotation.ResponseBody;
import org.ssssssss.magicapi.core.config.Constants;
import org.ssssssss.magicapi.core.config.JsonCodeConstants;
import org.ssssssss.magicapi.core.config.MagicConfiguration;
import org.ssssssss.magicapi.core.config.Valid;
import org.ssssssss.magicapi.core.annotation.Valid;
import org.ssssssss.magicapi.core.model.*;
import org.ssssssss.magicapi.core.exception.InvalidArgumentException;
import org.ssssssss.magicapi.core.exception.MagicLoginException;

View File

@@ -13,7 +13,7 @@ import org.springframework.web.multipart.MultipartFile;
import org.ssssssss.magicapi.core.config.Constants;
import org.ssssssss.magicapi.core.config.MagicAPIProperties;
import org.ssssssss.magicapi.core.config.MagicConfiguration;
import org.ssssssss.magicapi.core.config.Valid;
import org.ssssssss.magicapi.core.annotation.Valid;
import org.ssssssss.magicapi.core.model.*;
import org.ssssssss.magicapi.core.exception.MagicLoginException;
import org.ssssssss.magicapi.core.interceptor.Authorization;

View File

@@ -16,7 +16,7 @@ import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.ssssssss.magicapi.core.config.Constants;
import org.ssssssss.magicapi.core.config.MagicConfiguration;
import org.ssssssss.magicapi.core.config.Valid;
import org.ssssssss.magicapi.core.annotation.Valid;
import org.ssssssss.magicapi.core.config.WebSocketSessionManager;
import org.ssssssss.magicapi.core.context.CookieContext;
import org.ssssssss.magicapi.core.context.RequestContext;

View File

@@ -6,7 +6,7 @@ import org.springframework.jdbc.support.GeneratedKeyHolder;
import org.ssssssss.magicapi.modules.db.dialect.DialectAdapter;
import org.ssssssss.magicapi.datasource.model.MagicDynamicDataSource;
import org.ssssssss.magicapi.datasource.model.MagicDynamicDataSource.DataSourceNode;
import org.ssssssss.magicapi.core.config.MagicModule;
import org.ssssssss.magicapi.core.annotation.MagicModule;
import org.ssssssss.magicapi.core.context.RequestContext;
import org.ssssssss.magicapi.core.context.RequestEntity;
import org.ssssssss.magicapi.modules.db.cache.SqlCache;
@@ -19,11 +19,12 @@ import org.ssssssss.magicapi.modules.db.table.NamedTable;
import org.ssssssss.magicapi.core.interceptor.ResultProvider;
import org.ssssssss.magicapi.utils.ScriptManager;
import org.ssssssss.script.annotation.Comment;
import org.ssssssss.script.annotation.UnableCall;
import org.ssssssss.script.functions.DynamicAttribute;
import org.ssssssss.script.parsing.ast.statement.ClassConverter;
import org.ssssssss.script.reflection.JavaReflection;
import org.ssssssss.script.runtime.RuntimeContext;
import java.beans.Transient;
import java.lang.reflect.Field;
import java.sql.*;
import java.util.*;
@@ -36,8 +37,8 @@ import java.util.stream.Stream;
*
* @author mxd
*/
public class SQLModule extends HashMap<String, SQLModule> implements MagicModule {
@MagicModule("db")
public class SQLModule implements DynamicAttribute<SQLModule, SQLModule> {
static {
try {
Field[] fields = Types.class.getFields();
@@ -86,32 +87,32 @@ public class SQLModule extends HashMap<String, SQLModule> implements MagicModule
this.dynamicDataSource = dynamicDataSource;
}
@UnableCall
@Transient
public void setPageProvider(PageProvider pageProvider) {
this.pageProvider = pageProvider;
}
@UnableCall
@Transient
public void setResultProvider(ResultProvider resultProvider) {
this.resultProvider = resultProvider;
}
@UnableCall
@Transient
public void setColumnMapperProvider(ColumnMapperAdapter columnMapperAdapter) {
this.columnMapperAdapter = columnMapperAdapter;
}
@UnableCall
@Transient
public void setDialectAdapter(DialectAdapter dialectAdapter) {
this.dialectAdapter = dialectAdapter;
}
@UnableCall
@Transient
public void setColumnMapRowMapper(RowMapper<Map<String, Object>> columnMapRowMapper) {
this.columnMapRowMapper = columnMapRowMapper;
}
@UnableCall
@Transient
public void setRowMapColumnMapper(Function<String, String> rowMapColumnMapper) {
this.rowMapColumnMapper = rowMapColumnMapper;
}
@@ -120,17 +121,17 @@ public class SQLModule extends HashMap<String, SQLModule> implements MagicModule
this.dynamicDataSource = dynamicDataSource;
}
@UnableCall
@Transient
public void setSqlInterceptors(List<SQLInterceptor> sqlInterceptors) {
this.sqlInterceptors = sqlInterceptors;
}
@UnableCall
@Transient
public void setNamedTableInterceptors(List<NamedTableInterceptor> namedTableInterceptors) {
this.namedTableInterceptors = namedTableInterceptors;
}
@UnableCall
@Transient
public void setDataSourceNode(DataSourceNode dataSourceNode) {
this.dataSourceNode = dataSourceNode;
}
@@ -151,22 +152,22 @@ public class SQLModule extends HashMap<String, SQLModule> implements MagicModule
this.ttl = ttl;
}
@UnableCall
@Transient
public String getLogicDeleteColumn() {
return logicDeleteColumn;
}
@UnableCall
@Transient
public void setLogicDeleteColumn(String logicDeleteColumn) {
this.logicDeleteColumn = logicDeleteColumn;
}
@UnableCall
@Transient
public String getLogicDeleteValue() {
return logicDeleteValue;
}
@UnableCall
@Transient
public void setLogicDeleteValue(String logicDeleteValue) {
this.logicDeleteValue = logicDeleteValue;
}
@@ -175,12 +176,12 @@ public class SQLModule extends HashMap<String, SQLModule> implements MagicModule
return sqlCache;
}
@UnableCall
@Transient
public void setSqlCache(SqlCache sqlCache) {
this.sqlCache = sqlCache;
}
@UnableCall
@Transient
public SQLModule cloneSQLModule() {
SQLModule sqlModule = new SQLModule();
sqlModule.setDynamicDataSource(this.dynamicDataSource);
@@ -289,21 +290,23 @@ public class SQLModule extends HashMap<String, SQLModule> implements MagicModule
return sqlModule;
}
/**
* 数据源切换
*/
@Override
public SQLModule get(Object key) {
@Transient
public SQLModule getDynamicAttribute(String key) {
SQLModule sqlModule = cloneSQLModule();
if (key == null) {
sqlModule.setDataSourceNode(dynamicDataSource.getDataSource());
} else {
sqlModule.setDataSourceNode(dynamicDataSource.getDataSource(key.toString()));
sqlModule.setDataSourceNode(dynamicDataSource.getDataSource(key));
}
return sqlModule;
}
/**
* 查询List
*/
@@ -323,7 +326,7 @@ public class SQLModule extends HashMap<String, SQLModule> implements MagicModule
return select(new BoundSql(runtimeContext, sqlOrXml, params, this));
}
@UnableCall
@Transient
public List<Map<String, Object>> select(BoundSql boundSql) {
assertDatasourceNotNull();
return boundSql.execute(this.sqlInterceptors, () -> queryForList(boundSql));
@@ -362,7 +365,7 @@ public class SQLModule extends HashMap<String, SQLModule> implements MagicModule
return update(new BoundSql(runtimeContext, sqlOrXml, params, this));
}
@UnableCall
@Transient
public int update(BoundSql boundSql) {
assertDatasourceNotNull();
RequestEntity requestEntity = RequestContext.getRequestEntity();
@@ -482,7 +485,7 @@ public class SQLModule extends HashMap<String, SQLModule> implements MagicModule
return Arrays.stream(values).sum();
}
@UnableCall
@Transient
public Object insert(BoundSql boundSql, String primary) {
MagicKeyHolder keyHolder = new MagicKeyHolder(primary);
RequestEntity requestEntity = RequestContext.getRequestEntity();
@@ -538,13 +541,13 @@ public class SQLModule extends HashMap<String, SQLModule> implements MagicModule
return page(boundSql, new Page(limit, offset));
}
@UnableCall
@Transient
public Object page(BoundSql boundSql) {
Page page = pageProvider.getPage(boundSql.getRuntimeContext());
return page(boundSql, page);
}
@UnableCall
@Transient
public String getDataSourceName() {
return this.dataSourceNode == null ? "unknown" : dataSourceNode.getName();
}
@@ -586,7 +589,7 @@ public class SQLModule extends HashMap<String, SQLModule> implements MagicModule
return resultProvider.buildPageResult(requestEntity, page, count, list);
}
@UnableCall
@Transient
public Object page(BoundSql boundSql, Page page) {
assertDatasourceNotNull();
Dialect dialect = dataSourceNode.getDialect(dialectAdapter);
@@ -614,7 +617,7 @@ public class SQLModule extends HashMap<String, SQLModule> implements MagicModule
return selectInt(new BoundSql(runtimeContext, sqlOrXml, params, this));
}
@UnableCall
@Transient
public Integer selectInt(BoundSql boundSql) {
assertDatasourceNotNull();
return boundSql.execute(this.sqlInterceptors, () -> dataSourceNode.getJdbcTemplate().query(boundSql.getSql(), new SingleRowResultSetExtractor<>(Integer.class), boundSql.getParameters()));
@@ -639,7 +642,7 @@ public class SQLModule extends HashMap<String, SQLModule> implements MagicModule
return selectOne(new BoundSql(runtimeContext, sqlOrXml, params, this));
}
@UnableCall
@Transient
public Map<String, Object> selectOne(BoundSql boundSql) {
assertDatasourceNotNull();
return boundSql.execute(this.sqlInterceptors, () -> {
@@ -682,12 +685,6 @@ public class SQLModule extends HashMap<String, SQLModule> implements MagicModule
return boundSql.copy(pageSql);
}
@UnableCall
@Override
public String getModuleName() {
return "db";
}
static class MagicKeyHolder extends GeneratedKeyHolder {
private final boolean useGeneratedKeys;

View File

@@ -11,9 +11,9 @@ import org.ssssssss.magicapi.modules.db.SQLModule;
import org.ssssssss.magicapi.modules.db.model.Page;
import org.ssssssss.magicapi.modules.db.model.SqlMode;
import org.ssssssss.script.annotation.Comment;
import org.ssssssss.script.annotation.UnableCall;
import org.ssssssss.script.runtime.RuntimeContext;
import java.beans.Transient;
import java.io.Serializable;
import java.util.*;
import java.util.function.Function;
@@ -515,7 +515,7 @@ public class NamedTable extends Attributes<Object> {
*
* @return 表名
*/
@UnableCall
@Transient
public String getTableName() {
return tableName;
}
@@ -525,7 +525,7 @@ public class NamedTable extends Attributes<Object> {
*
* @param tableName 表名
*/
@UnableCall
@Transient
public void setTableName(String tableName) {
this.tableName = tableName;
}
@@ -533,7 +533,7 @@ public class NamedTable extends Attributes<Object> {
/**
* 获取SQL模块
*/
@UnableCall
@Transient
public SQLModule getSqlModule() {
return sqlModule;
}
@@ -541,7 +541,7 @@ public class NamedTable extends Attributes<Object> {
/**
* 获取主键列
*/
@UnableCall
@Transient
public String getPrimary() {
return primary;
}
@@ -549,7 +549,7 @@ public class NamedTable extends Attributes<Object> {
/**
* 获取逻辑删除列
*/
@UnableCall
@Transient
public String getLogicDeleteColumn() {
return logicDeleteColumn;
}
@@ -557,7 +557,7 @@ public class NamedTable extends Attributes<Object> {
/**
* 获取逻辑删除值
*/
@UnableCall
@Transient
public Object getLogicDeleteValue() {
return logicDeleteValue;
}
@@ -565,7 +565,7 @@ public class NamedTable extends Attributes<Object> {
/**
* 获取设置的columns
*/
@UnableCall
@Transient
public Map<String, Object> getColumns() {
return columns;
}
@@ -573,7 +573,7 @@ public class NamedTable extends Attributes<Object> {
/**
* 设置columns
*/
@UnableCall
@Transient
public void setColumns(Map<String, Object> columns) {
this.columns = columns;
}
@@ -581,7 +581,7 @@ public class NamedTable extends Attributes<Object> {
/**
* 获取设置的fields
*/
@UnableCall
@Transient
public List<String> getFields() {
return fields;
}
@@ -589,7 +589,7 @@ public class NamedTable extends Attributes<Object> {
/**
* 设置 fields
*/
@UnableCall
@Transient
public void setFields(List<String> fields) {
this.fields = fields;
}
@@ -597,7 +597,7 @@ public class NamedTable extends Attributes<Object> {
/**
* 获取设置的group
*/
@UnableCall
@Transient
public List<String> getGroups() {
return groups;
}
@@ -605,7 +605,7 @@ public class NamedTable extends Attributes<Object> {
/**
* 设置 group
*/
@UnableCall
@Transient
public void setGroups(List<String> groups) {
this.groups = groups;
}
@@ -613,7 +613,7 @@ public class NamedTable extends Attributes<Object> {
/**
* 获取设置的order
*/
@UnableCall
@Transient
public List<String> getOrders() {
return orders;
}
@@ -621,7 +621,7 @@ public class NamedTable extends Attributes<Object> {
/**
* 设置 order
*/
@UnableCall
@Transient
public void setOrders(List<String> orders) {
this.orders = orders;
}
@@ -629,7 +629,7 @@ public class NamedTable extends Attributes<Object> {
/**
* 获取设置的排除的列
*/
@UnableCall
@Transient
public Set<String> getExcludeColumns() {
return excludeColumns;
}
@@ -637,7 +637,7 @@ public class NamedTable extends Attributes<Object> {
/**
* 设置排除的列
*/
@UnableCall
@Transient
public void setExcludeColumns(Set<String> excludeColumns) {
this.excludeColumns = excludeColumns;
}
@@ -647,7 +647,7 @@ public class NamedTable extends Attributes<Object> {
*
* @return
*/
@UnableCall
@Transient
public Object getDefaultPrimaryValue() {
return defaultPrimaryValue;
}
@@ -655,7 +655,7 @@ public class NamedTable extends Attributes<Object> {
/**
* 是否设逻辑了逻辑删除
*/
@UnableCall
@Transient
public boolean isUseLogic() {
return useLogic;
}
@@ -663,7 +663,7 @@ public class NamedTable extends Attributes<Object> {
/**
* 设置是否使用逻辑删除
*/
@UnableCall
@Transient
public void setUseLogic(boolean useLogic) {
this.useLogic = useLogic;
}
@@ -671,7 +671,7 @@ public class NamedTable extends Attributes<Object> {
/**
* 获取是否不过滤空参数
*/
@UnableCall
@Transient
public boolean isWithBlank() {
return withBlank;
}
@@ -679,7 +679,7 @@ public class NamedTable extends Attributes<Object> {
/**
* 设置是否不过滤空参数
*/
@UnableCall
@Transient
public void setWithBlank(boolean withBlank) {
this.withBlank = withBlank;
}
@@ -687,7 +687,7 @@ public class NamedTable extends Attributes<Object> {
/**
* 获取where
*/
@UnableCall
@Transient
public Where getWhere() {
return where;
}
@@ -695,7 +695,7 @@ public class NamedTable extends Attributes<Object> {
/**
* 获取RequestEntity
*/
@UnableCall
@Transient
public RequestEntity getRequestEntity() {
return RequestContext.getRequestEntity();
}

View File

@@ -5,7 +5,7 @@ import org.springframework.http.*;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.web.client.RestTemplate;
import org.ssssssss.magicapi.core.config.MagicModule;
import org.ssssssss.magicapi.core.annotation.MagicModule;
import org.ssssssss.script.annotation.Comment;
import java.util.HashMap;
@@ -19,7 +19,8 @@ import java.util.stream.Collectors;
* @author mxd
* @since 1.1.0
*/
public class HttpModule implements MagicModule {
@MagicModule("http")
public class HttpModule {
private final RestTemplate template;
private final HttpHeaders httpHeaders = new HttpHeaders();
@@ -41,11 +42,6 @@ public class HttpModule implements MagicModule {
this.url = url;
}
@Override
public String getModuleName() {
return "http";
}
@Comment("创建连接")
public HttpModule connect(@Comment(name = "url", value = "目标URL") String url) {
return new HttpModule(template, url);

View File

@@ -3,6 +3,7 @@ package org.ssssssss.magicapi.modules.servlet;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartRequest;
import org.springframework.web.multipart.MultipartResolver;
import org.ssssssss.magicapi.core.annotation.MagicModule;
import org.ssssssss.script.annotation.Comment;
import javax.servlet.http.HttpServletRequest;
@@ -17,6 +18,7 @@ import java.util.stream.Collectors;
*
* @author mxd
*/
@MagicModule("request")
public class RequestModule {
private static MultipartResolver resolver;

View File

@@ -7,6 +7,7 @@ import org.springframework.http.ResponseEntity;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import org.ssssssss.magicapi.core.annotation.MagicModule;
import org.ssssssss.magicapi.core.context.RequestContext;
import org.ssssssss.magicapi.core.interceptor.ResultProvider;
import org.ssssssss.script.annotation.Comment;
@@ -26,6 +27,7 @@ import java.util.Map;
*
* @author mxd
*/
@MagicModule("response")
public class ResponseModule {
private final ResultProvider resultProvider;

View File

@@ -1,7 +1,7 @@
package org.ssssssss.magicapi.modules.spring;
import org.springframework.core.env.Environment;
import org.ssssssss.magicapi.core.config.MagicModule;
import org.ssssssss.magicapi.core.annotation.MagicModule;
import org.ssssssss.script.annotation.Comment;
/**
@@ -9,24 +9,20 @@ import org.ssssssss.script.annotation.Comment;
*
* @author mxd
*/
public class EnvModule implements MagicModule {
@MagicModule("env")
public class EnvModule {
private final Environment environment;
public EnvModule(Environment environment) {
this.environment = environment;
}
@Override
public String getModuleName() {
return "env";
}
@Comment("获取配置")
public String get(@Comment(name = "key", value = "配置项") String key) {
return environment.getProperty(key);
}
public EnvModule(Environment environment) {
this.environment = environment;
}
@Comment("获取配置")
public String get(@Comment(name = "key", value = "配置项") String key,
@Comment(name = "defaultValue", value = "未配置时的默认值") String defaultValue) {

View File

@@ -30,7 +30,7 @@
</scm>
<properties>
<spring-boot.version>2.4.5</spring-boot.version>
<magic-script.version>1.6.4</magic-script.version>
<magic-script.version>1.8.0</magic-script.version>
<commons-compress.version>1.21</commons-compress.version>
<commons-io.version>2.7</commons-io.version>
<commons-text.version>1.6</commons-text.version>