@ -26,6 +26,7 @@
|
||||
"dependencies": {
|
||||
"@ccms/api": "^0.7.0",
|
||||
"@ccms/common": "^0.7.0",
|
||||
"@ccms/container": "^0.7.0"
|
||||
"@ccms/container": "^0.7.0",
|
||||
"@ccms/database": "^0.7.0"
|
||||
}
|
||||
}
|
||||
|
@ -28,13 +28,16 @@ function mcColor2ANSI(str: string) {
|
||||
for (const regex in regexMap) {
|
||||
str = str.replace(regexMap[regex], `\u001b[${regex}m`)
|
||||
}
|
||||
return str;
|
||||
return str
|
||||
}
|
||||
|
||||
export class SpringConsole extends MiaoScriptConsole {
|
||||
error(...args: any[]) {
|
||||
this.logger.error(args.join(' '))
|
||||
}
|
||||
warn(...args: any[]) {
|
||||
this.logger.warn(args.join(' '))
|
||||
}
|
||||
sender(sender: any, ...args: any[]) {
|
||||
sender = sender || {
|
||||
sendMessage: (message: string) => console.console(message)
|
||||
@ -46,7 +49,7 @@ export class SpringConsole extends MiaoScriptConsole {
|
||||
if (Object.prototype.toString.call(args[0]) === '[object Array]') {
|
||||
args[0].forEach(line => sender.sendMessage(this.prefix + line))
|
||||
} else {
|
||||
sender.sendMessage(this.prefix + args.join(' '));
|
||||
sender.sendMessage(this.prefix + args.join(' '))
|
||||
}
|
||||
}
|
||||
console(...args: string[]): void {
|
||||
|
@ -1,13 +1,29 @@
|
||||
import { server } from '@ccms/api'
|
||||
import { Container } from '@ccms/container'
|
||||
import '@ccms/database'
|
||||
import { ioc, Container, reduceMetadata } from '@ccms/container'
|
||||
|
||||
import { SpringConsole } from './console';
|
||||
import './event';
|
||||
import './server';
|
||||
import './command';
|
||||
import './task';
|
||||
import { SpringConsole } from './console'
|
||||
import './event'
|
||||
import './server'
|
||||
import './command'
|
||||
import './task'
|
||||
|
||||
const toString = {}.toString
|
||||
|
||||
export default function SpringImpl(container: Container) {
|
||||
try {
|
||||
require('@ccms/web')
|
||||
require('@ccms/amqp')
|
||||
require('@ccms/database')
|
||||
require('./internal/scanner/mysql-scanner')
|
||||
} catch (error) {
|
||||
console.ex(error)
|
||||
}
|
||||
const beanFactory = base.getInstance().getAutowireCapableBeanFactory()
|
||||
container.bind(server.Console).toConstantValue(SpringConsole)
|
||||
container.bind(ioc.Autowired).toDynamicValue((ctx) => {
|
||||
var metadata: any = reduceMetadata(ctx)
|
||||
if (toString.call(metadata.named) === "[object Symbol]") { return container.get(metadata.named) }
|
||||
if (toString.call(metadata.named) === '[object jdk.internal.dynalink.beans.StaticClass]') { metadata.named = metadata.named.class }
|
||||
return beanFactory.getBean(metadata.named)
|
||||
})
|
||||
}
|
||||
|
@ -34,12 +34,32 @@ export class CommandMap {
|
||||
}
|
||||
let exists = this.commands[command]
|
||||
if (exists) {
|
||||
return exists.executor(sender, '', command, Java.to(args))
|
||||
try {
|
||||
return exists.executor(sender, '', command, Java.to(args))
|
||||
} catch (error) {
|
||||
console.ex(error)
|
||||
}
|
||||
return true
|
||||
} else {
|
||||
sender.sendMessage && sender.sendMessage(`Unknown command. Type "/help" for help.`)
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
tabComplate(sender: any, input: string, index?: number): string[] {
|
||||
if (index == 0) { return Object.keys(this.commands) }
|
||||
let [command, ...args] = input.split(' ')
|
||||
let exists = this.commands[command]
|
||||
if (exists && exists.tabCompleter) {
|
||||
try {
|
||||
if (args.length !== index) { args.push('') }
|
||||
return exists.tabCompleter(sender, '', command, Java.to(args))
|
||||
} catch (error) {
|
||||
console.ex(error)
|
||||
}
|
||||
}
|
||||
return []
|
||||
}
|
||||
}
|
||||
|
||||
export class SpringCommand {
|
||||
|
32
packages/spring/src/internal/scanner/mysql-scanner.ts
Normal file
32
packages/spring/src/internal/scanner/mysql-scanner.ts
Normal file
@ -0,0 +1,32 @@
|
||||
import { plugin, database } from '@ccms/api'
|
||||
import { DataBaseManager } from '@ccms/database'
|
||||
import { provideSingleton, inject } from '@ccms/container'
|
||||
|
||||
import * as fs from '@ccms/common/dist/fs'
|
||||
|
||||
@provideSingleton(plugin.PluginScanner)
|
||||
export class MySQLScanner implements plugin.PluginScanner {
|
||||
type: string = "mysql"
|
||||
|
||||
private target: string
|
||||
|
||||
@inject(database.DataBaseManager)
|
||||
private databaseManager: DataBaseManager
|
||||
|
||||
scan(target: any): string[] {
|
||||
this.target = target
|
||||
let plugins = this.databaseManager.getMainDatabase().query<{ name: string }>(`SELECT name FROM ${this.target} WHERE LENGTH(source) != 0 AND deleted = 0`)
|
||||
return plugins.map(p => `mysql:${p.name}`)
|
||||
}
|
||||
load(target: any) {
|
||||
if (typeof target !== "string" || !target.startsWith('mysql:')) { return }
|
||||
let name = target.split("mysql:")[1]
|
||||
if (!name) { console.warn(`[PluginScanner][mysql] plugin name can't be null!`); return }
|
||||
var plugin: any = this.databaseManager.getMainDatabase().query<{ source: string }>(`SELECT source FROM ${this.target} WHERE name = ? AND deleted = 0`, name)
|
||||
if (plugin.length == 0) { console.warn(`[PluginScanner][mysql] plugin ${target} not found at mysql database...`); return }
|
||||
let temp = fs.concat(root, 'mysql-plugin-cache', target, `${plugin[0]}.js`)
|
||||
base.save(temp, plugin[0].source)
|
||||
//@ts-ignore
|
||||
return require(temp, { cache: false })
|
||||
}
|
||||
}
|
@ -21,6 +21,7 @@ export class SpringServer implements server.Server {
|
||||
}
|
||||
getConsoleSender() {
|
||||
return {
|
||||
name: 'CONSOLE',
|
||||
sendMessage: (message: string) => console.console(message)
|
||||
}
|
||||
}
|
||||
@ -50,6 +51,6 @@ export class SpringServer implements server.Server {
|
||||
throw new Error("Method not implemented.")
|
||||
}
|
||||
tabComplete(sender: any, input: string, index?: number) {
|
||||
throw new Error("Method not implemented.")
|
||||
return this.commandMap.tabComplate(sender, input, index)
|
||||
}
|
||||
}
|
||||
|
@ -1,29 +1,30 @@
|
||||
import { task, plugin } from '@ccms/api'
|
||||
import { inject, provideSingleton } from '@ccms/container'
|
||||
import thread_pool from '@ccms/common/dist/thread-pool'
|
||||
|
||||
const AtomicInteger = Java.type("java.util.concurrent.atomic.AtomicInteger")
|
||||
const AtomicBoolean = Java.type("java.util.concurrent.atomic.AtomicBoolean")
|
||||
const Thread = Java.type('java.lang.Thread')
|
||||
const ThreadPoolExecutor = Java.type('java.util.concurrent.ThreadPoolExecutor')
|
||||
const ThreadPoolTaskExecutor = Java.type('org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor')
|
||||
|
||||
let executor: any
|
||||
let tasks: { [key: number]: task.Cancelable } = {}
|
||||
let taskId = 0
|
||||
const taskId = new AtomicInteger(0)
|
||||
const tasks: { [key: number]: task.Cancelable } = {}
|
||||
const executor = thread_pool.create({
|
||||
groupName: '@ccms/spring'
|
||||
})
|
||||
|
||||
@provideSingleton(task.TaskManager)
|
||||
export class SpringTaskManager implements task.TaskManager {
|
||||
@inject(plugin.PluginInstance)
|
||||
private pluginInstance: any
|
||||
|
||||
private innerTaskId: any
|
||||
private innerTasks: { [s: string]: task.Cancelable }
|
||||
private innerExecutor: java.util.concurrent.ThreadPoolExecutor
|
||||
|
||||
constructor() {
|
||||
executor = new ThreadPoolTaskExecutor()
|
||||
executor.setCorePoolSize(10)
|
||||
executor.setMaxPoolSize(100)
|
||||
executor.setQueueCapacity(500)
|
||||
executor.setKeepAliveSeconds(60)
|
||||
executor.setThreadNamePrefix("@ccms/spring-")
|
||||
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy())
|
||||
executor.initialize()
|
||||
this.innerTaskId = taskId
|
||||
this.innerTasks = tasks
|
||||
this.innerExecutor = executor
|
||||
}
|
||||
|
||||
create(func: Function): task.Task {
|
||||
@ -34,13 +35,13 @@ export class SpringTaskManager implements task.TaskManager {
|
||||
return func()
|
||||
}
|
||||
disable() {
|
||||
Object.values(tasks).forEach((task) => task?.cancel())
|
||||
executor.shutdown();
|
||||
Object.values(this.innerTasks).forEach((task) => task?.cancel())
|
||||
this.innerExecutor.shutdown()
|
||||
}
|
||||
}
|
||||
|
||||
export class SpringTask extends task.Task {
|
||||
public id = taskId++
|
||||
public id = taskId.incrementAndGet()
|
||||
private running = new AtomicBoolean(true)
|
||||
|
||||
run(...args: any[]) {
|
||||
@ -78,7 +79,7 @@ export class SpringTask extends task.Task {
|
||||
|
||||
submit(...args: any[]): task.Cancelable {
|
||||
tasks[this.id] = this
|
||||
executor.execute(() => this.run(...args))
|
||||
executor.execute((() => this.run(...args)) as any)
|
||||
return {
|
||||
cancel: () => {
|
||||
return this.cancel()
|
||||
|
Reference in New Issue
Block a user