Browse Source

init

master
Nicholas.Jee 3 years ago
parent
commit
bf33db9d02
  1. 125
      build.gradle
  2. 137
      build.xml
  3. 13
      encrypt.xml
  4. BIN
      lib/fine-tool-echarts-export-1.0.jar
  5. BIN
      lib/report/fine-plugin-com.tptj.plugin.hg.client.center.v10-1.0.10.jar
  6. 26
      plugin.xml
  7. 245
      src/main/java/com/fr/plugin/jee/port/AbstractDataApi.java
  8. 21
      src/main/java/com/fr/plugin/jee/port/DemoAuth.java
  9. 27
      src/main/java/com/fr/plugin/jee/port/DemoCaller.java
  10. 31
      src/main/java/com/fr/plugin/jee/port/DemoCallerProvider.java
  11. 33
      src/main/java/com/fr/plugin/jee/port/DemoLoader.java
  12. 71
      src/main/java/com/fr/plugin/jee/port/GetBySql.java
  13. 4
      src/main/java/com/fr/plugin/jee/port/TestPort.java

125
build.gradle

@ -0,0 +1,125 @@
apply plugin: 'java'
tasks.withType(JavaCompile) {
options.encoding = 'UTF-8'
}
ext {
/**
* jar的路径
* 1.jar需要打包到zip中,lib根目录下
* 2.jar仅仅是编译时需要lib下子目录下即可
*/
libPath = "$projectDir/../webroot/WEB-INF/lib"
/**
* class进行加密保护
*/
guard = true
def pluginInfo = getPluginInfo()
pluginPre = "fine-plugin"
pluginName = pluginInfo.id
pluginVersion = pluginInfo.version
outputPath = "$projectDir/../webroot/WEB-INF/plugins/plugin-" + pluginName + "-" + pluginVersion + "/classes"
}
group = 'com.fr.plugin'
version = '10.0'
sourceCompatibility = '8'
sourceSets {
main {
java.outputDir = file(outputPath)
output.resourcesDir = file(outputPath)
}
}
ant.importBuild("encrypt.xml")
//ant变量
ant.projectDir = projectDir
ant.references["compile.classpath"] = ant.path {
fileset(dir: libPath, includes: '**/*.jar')
fileset(dir: ".",includes:"**/*.jar" )
}
classes.dependsOn('clean')
task copyFiles(type: Copy,dependsOn: 'classes'){
from outputPath
into "$projectDir/classes"
}
task preJar(type:Copy,dependsOn: guard ? 'compile_encrypt_javas' : 'compile_plain_javas'){
from "$projectDir/classes"
into "$projectDir/transform-classes"
include "**/*.*"
}
jar.dependsOn("preJar")
task makeJar(type: Jar,dependsOn: preJar){
from fileTree(dir: "$projectDir/transform-classes")
baseName pluginPre
appendix "data-factory"
version pluginVersion
destinationDir = file("$buildDir/libs")
doLast(){
delete file("$projectDir/classes")
delete file("$projectDir/transform-classes")
}
}
task copyFile(type: Copy,dependsOn: ["makeJar"]){
from "$buildDir/libs"
from("$projectDir/lib") {
include "*.jar"
}
from "$projectDir/plugin.xml"
into file("$buildDir/temp/plugin")
}
task zip(type:Zip,dependsOn:["copyFile"]){
from "$buildDir/temp/plugin"
destinationDir file("$buildDir/install")
baseName pluginPre
appendix pluginName
version pluginVersion
}
//build时包含哪些文件,
processResources {
// exclude everything
// *.css没效果
// exclude '**/*.css'
// except this file
// include 'xx.xml'
}
/*读取plugin.xml中的version*/
def getPluginInfo(){
def xmlFile = file("plugin.xml")
if (!xmlFile.exists()) {
return ["id":"none", "version":"1.0.0"]
}
def plugin = new XmlParser().parse(xmlFile)
def version = plugin.version[0].text()
def id = plugin.id[0].text()
return ["id":id,"version":version]
}
repositories {
mavenLocal()
maven {
url = uri('http://mvn.finedevelop.com/repository/maven-public/')
}
}
dependencies {
//使jar
implementation fileTree(dir: 'lib', include: ['**/*.jar'])
implementation fileTree(dir: libPath, include: ['**/*.jar'])
}

137
build.xml

@ -0,0 +1,137 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<project basedir="." default="jar" name="plugin">
<!-- JDK路径,根据自己机器上实际位置修改-->
<property name="jdk.home" value="G:/JDK/jdk1.8.0_45"/>
<property name="libs" value="${basedir}/lib"/>
<property name="dependenceLibs" value="${basedir}/dependence"/>
<property name="FRLibs" value="G:/ReportCode10.0/jar"/>
<property name="destLoc" value="."/>
<property name="classes" value="classes"/>
<xmlproperty file="${basedir}/plugin.xml"/>
<property name="current-version" value="${plugin.version}"/>
<property name="current-id" value="${plugin.id}"/>
<!-- 插件版本-->
<property name="plugin-version" value="${current-version}"/>
<!-- 插件名字-->
<property name="plugin-name" value="data-factory"/>
<property name="plugin-jar" value="fr-plugin-${plugin-name}-${plugin-version}.jar"/>
<target name="prepare">
<delete dir="${classes}"/>
</target>
<path id="compile.classpath">
<fileset dir="${FRLibs}">
<include name="**/*.jar"/>
</fileset>
<fileset dir="${libs}">
<include name="**/*.jar"/>
</fileset>
<fileset dir="${dependenceLibs}">
<include name="**/*.jar"/>
</fileset>
</path>
<patternset id="resources4Jar">
<exclude name="**/.settings/**"/>
<exclude name=".classpath"/>
<exclude name=".project"/>
<exclude name="**/*.java"/>
<exclude name="**/*.db"/>
<exclude name="**/*.g"/>
<exclude name="**/package.html"/>
</patternset>
<target name="copy_resources">
<echo message="从${resources_from}拷贝图片,JS,CSS等资源文件"/>
<delete dir="tmp"/>
<copy todir="tmp">
<fileset dir="${resources_from}\src\main\java">
<patternset refid="resources4Jar"/>
</fileset>
</copy>
<copy todir="tmp">
<fileset dir="${resources_from}\src\main\resources">
<patternset refid="resources4Jar"/>
</fileset>
</copy>
<copy todir="${classes}">
<fileset dir="tmp"/>
</copy>
<delete dir="tmp"/>
</target>
<target name="compile_javas">
<echo message="编译${compile_files}下的Java文件"/>
<javac destdir="${classes}" debug="false" optimize="on" source="${source_jdk_version}"
target="${target_jdk_version}"
fork="true" memoryMaximumSize="512m" listfiles="false" srcdir="${basedir}"
executable="${compile_jdk_version}/bin/javac" includeantruntime="on">
<src path="${basedir}/src"/>
<exclude name="**/.svn/**"/>
<compilerarg line="-encoding UTF8 "/>
<classpath refid="compile.classpath"/>
</javac>
<taskdef name="pretreatment" classname="com.fr.plugin.pack.PluginPretreatmentTask">
<classpath refid="compile.classpath"/>
</taskdef>
<pretreatment baseDir="${basedir}"/>
</target>
<target name="jar_classes">
<echo message="打Jar包:${jar_name}"/>
<delete file="${basedir}/${jar_name}"/>
<jar jarfile="${basedir}/${jar_name}">
<fileset dir="${classes}">
</fileset>
</jar>
</target>
<target name="super_jar" depends="prepare">
<antcall target="copy_resources">
<param name="resources_from" value="${basedir}"/>
</antcall>
<antcall target="compile_javas">
<param name="source_jdk_version" value="1.8"/>
<param name="target_jdk_version" value="1.8"/>
<param name="compile_jdk_version" value="${jdk.home}"/>
<param name="compile_files" value="${basedir}/src"/>
</antcall>
<echo message="compile plugin success!"/>
<antcall target="jar_classes">
<param name="jar_name" value="${plugin-jar}"/>
</antcall>
<delete dir="${classes}"/>
</target>
<target name="jar" depends="super_jar">
<antcall target="zip"/>
</target>
<target name="zip">
<property name="plugin-folder" value="fr-plugin-${plugin-name}-${plugin-version}"/>
<echo message="----------zip files----------"/>
<mkdir dir="${plugin-folder}"/>
<copy todir="${plugin-folder}">
<fileset dir=".">
<include name="*.jar"/>
<include name="plugin.xml"/>
</fileset>
</copy>
<copy todir="${plugin-folder}">
<fileset dir="${libs}">
<include name="**/*.jar"/>
</fileset>
</copy>
<zip destfile="${basedir}/${plugin-folder}.zip" basedir=".">
<include name="${plugin-folder}/*.jar"/>
<include name="${plugin-folder}/plugin.xml"/>
</zip>
<xmlproperty file="${basedir}/plugin.xml"/>
<!--
<move file="${plugin-folder}.zip" todir="${destLoc}/${plugin.name}"/>
-->
<delete dir="${plugin-folder}"/>
<delete file="${plugin-jar}" />
<!--<delete file="${basedir}/${plugin-folder}.zip" />-->
</target>
</project>

13
encrypt.xml

@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<project>
<target name="compile_encrypt_javas" depends="copyFiles">
<echo message="加密文件"/>
<echo message="${projectDir}"/>
<taskdef name="pretreatment" classname="com.fr.plugin.pack.PluginPretreatmentTask">
<classpath refid="compile.classpath"/>
</taskdef>
<pretreatment baseDir="${projectDir}"/>
</target>
<target name="compile_plain_javas" depends="copyFiles">
</target>
</project>

BIN
lib/fine-tool-echarts-export-1.0.jar

Binary file not shown.

BIN
lib/report/fine-plugin-com.tptj.plugin.hg.client.center.v10-1.0.10.jar

Binary file not shown.

26
plugin.xml

@ -0,0 +1,26 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?><plugin>
<id>com.fr.plugin.jee.open.port.demo</id>
<name><![CDATA[ 开放平台子插件demo ]]></name>
<active>yes</active>
<version>2.3.2</version>
<env-version>10.0~</env-version>
<vendor>tptj</vendor>
<jartime>2019-12-30</jartime>
<description><![CDATA[ 通过不同的装载器和解析器实现个性化的数据装配,对接比如JSON WebService 网络爬虫 自己开发的数据中心等等 ]]></description>
<change-notes><![CDATA[
]]></change-notes>
<main-package>com.fr.plugin.jee.port</main-package>
<extra-designer>
</extra-designer>
<extra-core>
<OpenClientAPIProvider class="com.fr.plugin.jee.port.DemoCallerProvider"/>
<OpenClientAuthProvider class="com.fr.plugin.jee.port.DemoAuth"/>
</extra-core>
<function-recorder class="com.fr.plugin.jee.port.DemoCallerProvider"/>
<dependence>
<Item key="com.tptj.plugin.hg.client.center.v10" type="plugin"/> <!-- 依赖于主框架 -->
</dependence>
</plugin>

245
src/main/java/com/fr/plugin/jee/port/AbstractDataApi.java

@ -0,0 +1,245 @@
package com.fr.plugin.jee.port;
import com.fr.base.*;
import com.fr.data.TableDataSource;
import com.fr.data.api.TableDataAssist;
import com.fr.decision.webservice.Response;
import com.fr.form.main.FormIO;
import com.fr.general.data.DataModel;
import com.fr.intelli.record.MetricRegistry;
import com.fr.io.TemplateWorkBookIO;
import com.fr.json.JSONObject;
import com.fr.log.FineLoggerFactory;
import com.fr.main.TemplateWorkBook;
import com.fr.main.workbook.ResultWorkBook;
import com.fr.report.report.Report;
import com.fr.script.Calculator;
import com.fr.stable.Primitive;
import com.fr.stable.StringUtils;
import com.fr.stable.WriteActor;
import com.fr.stable.query.QueryFactory;
import com.fr.stable.query.condition.QueryCondition;
import com.fr.stable.query.data.DataList;
import com.fr.stable.query.restriction.RestrictionFactory;
import com.fr.web.utils.WebUtils;
import com.fr.write.main.WriteRWorkBook;
import com.tptj.plugin.hg.client.open.exception.CodeException;
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
import java.text.SimpleDateFormat;
import java.util.*;
/**
* @author 秃破天际
* @version 10.0
* Created by 秃破天际 on 2020-09-07
**/
public abstract class AbstractDataApi {
protected List<Map<String,Object>> format(DataModel data )throws CodeException {
List<Map<String,Object>> content = new ArrayList<Map<String,Object>>();
try{
int colCount = data.getColumnCount();
String [] colNames = new String[colCount];
for( int i=0; i<colCount; i++){
colNames[i] = data.getColumnName(i);
}
int rowCount = data.getRowCount();
for( int i=0;i<rowCount;i++ ){
Map<String,Object> row = new HashMap<String,Object>();
for( int j=0;j<colCount;j++ ){
row.put( colNames[j], format(data.getValueAt(i,j)) );
}
content.add(row);
}
}catch (Exception e){
throw CodeException.create("10009",e.getMessage());
}
return content;
}
private final static SimpleDateFormat FORMAT = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
private Object format(Object val)throws CodeException{
if( val instanceof Date){
return FORMAT.format((Date)val);
}
if( val instanceof Primitive){
return null;
}
return val;
}
protected Calculator initCalculator(HttpServletRequest req, TableDataSource source ){
Calculator calculator = Calculator.createCalculator();
Map<String, Object> parameters = getSpParameters(req);
ParameterMapNameSpace space = ParameterMapNameSpace.create(parameters);
calculator.pushNameSpace( space );
calculator.setAttribute( TableDataSource.KEY, source );
return calculator;
}
protected TableDataSource getTableDataSource( String report )throws CodeException{
try{
if( report.endsWith(".frm") ){
return FormIO.readForm(report);
}
return TemplateWorkBookIO.readTemplateWorkBook(report);
}catch(Exception e){
throw CodeException.create("10010",e.getMessage());
}
}
protected String parseSql(HttpServletRequest req,String sql)throws CodeException{
Parameter[] parameters = ParameterHelper.analyze4Parameters(sql, false);
Map<String, Object> params = new HashMap<String, Object>();
for( Parameter p : parameters ){
params.put(p.getName(),getSpParameters(req).get(p.getName()));
}
try{
return TemplateUtils.render( sql, params,Calculator.createCalculator() );
}catch(Exception e){
throw CodeException.create("10011",e.getMessage());
}
}
protected String[] getDataConfig( String id, String dsName )throws CodeException{
Calculator cal = Calculator.createCalculator();
Map<String,Object> parameters = new HashMap<String,Object>();
parameters.put("id",id);
ParameterMapNameSpace space = ParameterMapNameSpace.create(parameters);
cal.pushNameSpace(space);
DataModel rs = SynchronizedLiveDataModelUtils.getSELiveDataModel4Share(cal, dsName);
if (rs == null) {
TableData td = TableDataAssist.getTableData(cal, dsName);
rs = td == null ? null : td.createDataModel(cal);
}
try{
if( 0 == rs.getRowCount() ){
throw new Exception("["+id+"] 对应的服务不存在!请联系管理员处理!");
}
if( 1 < rs.getRowCount() ){
throw new Exception("["+id+"] 服务异常!一个ID只能对应一个数据服务!请联系管理员处理!");
}
int idxSql = rs.getColumnIndex("data");
int connIdx = rs.getColumnIndex("source");
return new String[]{
(String)rs.getValueAt(0,connIdx),(String)rs.getValueAt(0,idxSql)
};
}catch(Exception e){
throw CodeException.create("10012",e.getMessage());
}
}
protected ResultWorkBook getResultWorkBook( TemplateWorkBook workbook, HttpServletRequest req )throws CodeException {
Map<String, Object> parameters = getSpParameters(req);
return workbook.execute(parameters,new WriteActor());
}
protected Report getSheet(Map<String, Object> config, WriteRWorkBook resultBook ){
//sheet名
String name = (String) config.get("tag");
if( StringUtils.isEmpty(name) ){
name = resultBook.getReportName(0);
}
int idx = getSheetIndex( name, resultBook,0 );
return resultBook.getReport(idx);
}
protected int getSheetIndex( String name, WriteRWorkBook resultBook, int dft){
int count = resultBook.getReportCount();
for( int i=0; i<count; i++ ){
if( resultBook.getReportName(i).equals(name) ){
return i;
}
}
return dft;
}
/**
* 获取计算报表需要的参数在原产品的基础上增加了body中JSON参数的读取
* @param req
* @return
*/
protected Map<String,Object> getSpParameters(HttpServletRequest req){
Map<String, Object> parameters = WebUtils.parameters4SessionIDInfor(req);
if( null == parameters ){
parameters = new HashMap<String, Object>();
}
ServletInputStream in = null;
try{
int len = req.getContentLength();
String charset = req.getCharacterEncoding();
if( StringUtils.isEmpty(charset) ){
charset = "UTF-8";
}
byte[] buffer = new byte[len];
in = req.getInputStream();
in.read(buffer, 0, len);
String body = new String(buffer,charset);
parameters.put("body",body);
Map<String,Object> obj = new JSONObject(body).toMap();
parameters.putAll(obj);
}catch(Exception e){
FineLoggerFactory.getLogger().info("####HUGH####:error={}",e.getMessage());
}finally {
if( null != in ){
try{
in.close();
}catch(Exception e){ }
}
}
return parameters;
}
/**
* 额外增加相应参数
* @param req
* @param defaultParameters
* @param config
* @return
* @throws CodeException
*/
public abstract Response mixCall(HttpServletRequest req, Map<String, Object> defaultParameters, Map<String, Object> config) throws CodeException ;
/**
* 获取要回显的其他内容
* @param config
* @return
*/
public abstract Map<String, Object> getOptions(Map<String, Object> config);
public Response call(HttpServletRequest req, Map<String, Object> defaultParameters, Map<String, Object> config) throws CodeException {
Response res = mixCall(req, defaultParameters, config);
Object data = res.getData();
if( null == data || null == config ){
return res;
}
config = getOptions(config);
if( config.isEmpty() ){
return res;
}
if( config.containsKey("url") ){
String url = (String) config.get("url");
if( !url.startsWith("http://") && !url.startsWith("https://") ){
config.put("url",getBaseUrl(req)+config.get("url"));
}
}
return Response.ok(data );
}
private String getBaseUrl( HttpServletRequest req ){
String url = req.getScheme()+"://"+req.getServerName();
int port = req.getServerPort();
if( 443 != port && 80 != port ){
url += ":"+ port;
}
url += req.getContextPath()+req.getServletPath();
return url;
}
}

21
src/main/java/com/fr/plugin/jee/port/DemoAuth.java

@ -0,0 +1,21 @@
package com.fr.plugin.jee.port;
import com.tptj.plugin.hg.client.open.exception.CodeException;
import com.tptj.plugin.hg.client.open.impl.AbstractAuthProvider;
import javax.servlet.http.HttpServletRequest;
import java.util.Map;
public class DemoAuth extends AbstractAuthProvider {
@Override
public String AuthName() {
return "DEMO认证";
}
@Override
public boolean auth(HttpServletRequest httpServletRequest, Map<String, Object> map, Map<String, Object> map1) throws CodeException {
return true;
}
}

27
src/main/java/com/fr/plugin/jee/port/DemoCaller.java

@ -0,0 +1,27 @@
package com.fr.plugin.jee.port;
import com.fr.decision.webservice.Response;
import com.sun.management.ThreadMXBean;
import com.tptj.plugin.hg.client.open.exception.CodeException;
import com.tptj.plugin.hg.client.open.impl.AbstractAPICaller;
import javax.servlet.http.HttpServletRequest;
import java.lang.management.ManagementFactory;
import java.util.Map;
public class DemoCaller extends AbstractAPICaller {
@Override
public Response call(HttpServletRequest httpServletRequest, Map<String, Object> map, Map<String, Object> map1) throws CodeException {
ThreadMXBean threadMXBean = (ThreadMXBean) ManagementFactory.getThreadMXBean();
System.out.println(threadMXBean.getThreadAllocatedBytes(Thread.currentThread().getId()));
String[] st = new String[100000000];
System.out.println(threadMXBean.getThreadAllocatedBytes(Thread.currentThread().getId()));
return Response.success();
}
@Override
public String Description() {
return "测试";
}
}

31
src/main/java/com/fr/plugin/jee/port/DemoCallerProvider.java

@ -0,0 +1,31 @@
package com.fr.plugin.jee.port;
import com.fr.plugin.transform.ExecuteFunctionRecord;
import com.fr.plugin.transform.FunctionRecorder;
import com.tptj.plugin.hg.client.open.fun.APILoader;
import com.tptj.plugin.hg.client.open.impl.AbstractAPICallerProvider;
@FunctionRecorder
public class DemoCallerProvider extends AbstractAPICallerProvider {
@ExecuteFunctionRecord
@Override
public APILoader[] registerCallers() {
return new APILoader[]{
new DemoLoader()
};
}
@Override
public String groupName() {
return "测试";
}
@Override
public String groupDescription() {
return "这是测试";
}
}

33
src/main/java/com/fr/plugin/jee/port/DemoLoader.java

@ -0,0 +1,33 @@
package com.fr.plugin.jee.port;
import com.fr.decision.webservice.Response;
import com.tptj.plugin.hg.client.open.exception.CodeException;
import com.tptj.plugin.hg.client.open.fun.APICaller;
import com.tptj.plugin.hg.client.open.impl.AbstractAPILoader;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Map;
public class DemoLoader extends AbstractAPILoader {
@Override
public String APIName(){
return "这是DEMO";
}
@Override
public String RequestType() {
return "GET";
}
@Override
public String path() {
return "demo";
}
@Override
public APICaller APICaller() {
return new DemoCaller();
}
}

71
src/main/java/com/fr/plugin/jee/port/GetBySql.java

@ -0,0 +1,71 @@
package com.fr.plugin.jee.port;
import com.fr.data.impl.DBTableData;
import com.fr.data.impl.NameDatabaseConnection;
import com.fr.decision.webservice.Response;
import com.fr.general.data.DataModel;
import com.fr.json.JSONObject;
import com.tptj.plugin.hg.client.open.exception.CodeException;
import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @author 秃破天际
* @version 10.0
* Created by 秃破天际 on 2020-09-07
**/
public class GetBySql extends AbstractDataApi {
{
}
@Override
public Response mixCall(HttpServletRequest req, Map<String, Object> defaultParameters, Map<String, Object> config) throws CodeException {
String connection = (String)config.get("connection");
String sql = (String)config.get("sql");
sql = parseSql(req,sql);
DataModel data = DBTableData.createCacheableDBResultSet(new NameDatabaseConnection(connection), sql, -1);
List content = format( data );
return Response.ok(content);
}
@Override
public Map<String, Object> getOptions(Map<String, Object> config) {
config.remove("connection");
config.remove("sql");
return config;
}
public String APIName() {
return "[demo]Sql数据服务-插件化";
}
public Map<String, Object> defaultParameters() {
return new HashMap();
}
public Map<String, Object> config() {
return new HashMap(){{
put("connection","FRDemo");
put("sql","SELECT * FROM `销量` where 地区 = '${地区}'");
}};
}
public boolean isPublic() {
return true;
}
public String RequestType() {
return "GET";
}
public String Description() {
return "通过配置SQL和数据源连接向外提供数据服务";
}
}

4
src/main/java/com/fr/plugin/jee/port/TestPort.java

@ -0,0 +1,4 @@
package com.fr.plugin.jee.port;
public class TestPort {
}
Loading…
Cancel
Save