pioneer
2 years ago
commit
d348f539d5
31 changed files with 2805 additions and 0 deletions
@ -0,0 +1,6 @@
|
||||
# open-JSD-10036 |
||||
|
||||
JSD-10036 在填报提交时,能先完成身份验证\ |
||||
免责说明:该源码为第三方爱好者提供,不保证源码和方案的可靠性,也不提供任何形式的源码教学指导和协助!\ |
||||
仅作为开发者学习参考使用!禁止用于任何商业用途!\ |
||||
为保护开发者隐私,开发者信息已隐去!若原开发者希望公开自己的信息,可联系【pioneer】处理。 |
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -0,0 +1,40 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?> |
||||
<plugin> |
||||
<id>com.fr.plugin.xx.submitjob.ino</id> |
||||
<name><![CDATA[填报数据接口提交-INO]]></name> |
||||
<active>yes</active> |
||||
<version>1.1.12</version> |
||||
<env-version>10.0~11.0</env-version> |
||||
<jartime>2018-07-31</jartime> |
||||
<vendor>fr.open</vendor> |
||||
<description><![CDATA[报表填报属性中扩展提交类型,实现提交数据给HTTP接口功能。]]></description> |
||||
<change-notes><![CDATA[ |
||||
[2022-03-21]POB-1658示例接口适配依赖;优化提交方式类加载和国际化处理<br/> |
||||
[2021-09-18]适配帆软11.0版本<br/> |
||||
[2021-06-03]单元格变更状态去掉修改删除、增加返回报错结果的测试接口。<br/> |
||||
[2021-05-21]增加返回结果的报错信息处理功能。<br/> |
||||
版本1.0主要功能:<br/> |
||||
提供接口参数配置页面,可配置 提交方式、单元格状态、接口url 参数值配置。<br/> |
||||
单行填报 HTTP GET 方式提交接口,可设置ur参数值功能。<br/> |
||||
单行填报 HTTP POST 方式提交接口,参数处理包括 表单 form-data形式、x-www-form-urlencodeed形式、json形式。<br/> |
||||
多行填报 HTTP POST 方式提交接口,参数处理为json形式。<br/> |
||||
单行、多行填报 WebService 方式提交接口。<br/> |
||||
自定义Body参数、Header参数属性数据支持单元格、函数公式、公式等。<br/> |
||||
调用接口返回结果保存到系统消息。<br/> |
||||
]]></change-notes> |
||||
<main-package>com.fr.plugin.xx.submitjob</main-package> |
||||
<prefer-packages> |
||||
<prefer-package>com.fanruan.api</prefer-package> |
||||
<prefer-package>com.jayway.jsonpath</prefer-package> |
||||
</prefer-packages> |
||||
<extra-core> |
||||
<LocaleFinder class="com.fr.plugin.xx.submitjob.LocaleFinder"/> |
||||
</extra-core> |
||||
<extra-decision> |
||||
<ControllerRegisterProvider class="com.fr.plugin.xx.submitjob.request.SubmitControllerBridge"/> |
||||
</extra-decision> |
||||
<extra-designer> |
||||
<SubmitProvider class="com.fr.plugin.xx.submitjob.SubmitUIBridge"/> |
||||
</extra-designer> |
||||
<function-recorder class="com.fr.plugin.xx.submitjob.LocaleFinder"/> |
||||
</plugin> |
@ -0,0 +1,19 @@
|
||||
/* |
||||
* Copyright (C), 2018-2021 |
||||
* Project: starter |
||||
* FileName: Constants |
||||
* Author: xx |
||||
* Date: 2021/2/21 16:11 |
||||
*/ |
||||
package com.fr.plugin.xx.submitjob; |
||||
|
||||
/** |
||||
* <Function Description><br> |
||||
* <Constants> |
||||
* |
||||
* @author xx |
||||
* @since 1.0.0 |
||||
*/ |
||||
public class Constants { |
||||
public static final String PLUGIN_ID = "com.fr.plugin.xx.submitjob.ino"; |
||||
} |
@ -0,0 +1,39 @@
|
||||
/* |
||||
* Copyright (C), 2018-2020 |
||||
* Project: starter |
||||
* FileName: LocaleFinder |
||||
* Author: xx |
||||
* Date: 2020/8/31 22:19 |
||||
*/ |
||||
package com.fr.plugin.xx.submitjob; |
||||
|
||||
import com.fr.intelli.record.Focus; |
||||
import com.fr.intelli.record.Original; |
||||
import com.fr.record.analyzer.EnableMetrics; |
||||
import com.fr.stable.fun.Authorize; |
||||
import com.fr.stable.fun.impl.AbstractLocaleFinder; |
||||
|
||||
import static com.fr.plugin.xx.submitjob.Constants.PLUGIN_ID; |
||||
|
||||
/** |
||||
* <Function Description><br> |
||||
* <LocaleFinder> |
||||
* |
||||
* @author xx |
||||
* @since 1.0.0 |
||||
*/ |
||||
@EnableMetrics |
||||
@Authorize(callSignKey = PLUGIN_ID) |
||||
public class LocaleFinder extends AbstractLocaleFinder { |
||||
|
||||
@Override |
||||
@Focus(id = PLUGIN_ID, text = "Plugin-submitjob", source = Original.PLUGIN) |
||||
public String find() { |
||||
return "com/fr/plugin/xx/submitjob/locale/lang"; |
||||
} |
||||
|
||||
@Override |
||||
public int currentAPILevel() { |
||||
return CURRENT_LEVEL; |
||||
} |
||||
} |
@ -0,0 +1,39 @@
|
||||
/* |
||||
* Copyright (C), 2018-2020 |
||||
* Project: starter |
||||
* FileName: SubmitUIBridge |
||||
* Author: xx |
||||
* Date: 2020/8/31 21:50 |
||||
*/ |
||||
package com.fr.plugin.xx.submitjob; |
||||
|
||||
import com.fanruan.api.i18n.I18nKit; |
||||
import com.fr.design.beans.BasicBeanPane; |
||||
import com.fr.design.fun.impl.AbstractSubmitProvider; |
||||
import com.fr.plugin.xx.submitjob.ui.DataSubmitConfigPane; |
||||
|
||||
/** |
||||
* <Function Description><br> |
||||
* <SubmitUIBridge> |
||||
* |
||||
* @author xx |
||||
* @since 1.0.0 |
||||
*/ |
||||
public class SubmitUIBridge extends AbstractSubmitProvider { |
||||
public static final String KEY = "DataSubmitJob"; |
||||
|
||||
@Override |
||||
public BasicBeanPane appearanceForSubmit() { |
||||
return new DataSubmitConfigPane(); |
||||
} |
||||
|
||||
@Override |
||||
public String dataForSubmit() { |
||||
return I18nKit.getLocText("Plugin-submitjob_Submit_Data"); |
||||
} |
||||
|
||||
@Override |
||||
public String keyForSubmit() { |
||||
return SubmitUIBridge.KEY; |
||||
} |
||||
} |
@ -0,0 +1,249 @@
|
||||
/* |
||||
* Copyright (C), 2018-2021 |
||||
* Project: starter |
||||
* FileName: JobBean |
||||
* Author: xx |
||||
* Date: 2021/3/8 20:51 |
||||
*/ |
||||
package com.fr.plugin.xx.submitjob.bean; |
||||
|
||||
import com.fr.base.Parameter; |
||||
import com.fr.data.DefinedSubmitJob; |
||||
import com.fr.data.JobValue; |
||||
import com.fr.general.ComparatorUtils; |
||||
import com.fr.general.DefaultValues; |
||||
import com.fr.general.GeneralContext; |
||||
import com.fr.plugin.xx.submitjob.job.AbstractDataSubmitTask; |
||||
import com.fr.plugin.xx.submitjob.ui.StateItems; |
||||
import com.fr.script.Calculator; |
||||
import com.fr.stable.Primitive; |
||||
import com.fr.stable.StableUtils; |
||||
|
||||
import java.util.Date; |
||||
import java.util.HashMap; |
||||
import java.util.Map; |
||||
|
||||
/** |
||||
* <Function Description><br> |
||||
* <任务参数JobBean> |
||||
* |
||||
* @author xx |
||||
* @since 1.0.0 |
||||
*/ |
||||
public class JobBean { |
||||
private Map<String, Object> headerMap; |
||||
private Map<String, Object> propertyMap; |
||||
private String url; |
||||
private String state; |
||||
private String bodyContent; |
||||
private String errorFlag; |
||||
private String successStatus; |
||||
private String errorMessageFlag; |
||||
|
||||
public JobBean() { |
||||
} |
||||
|
||||
public JobBean(Calculator calculator) { |
||||
this.headerMap = calculator.getAttribute(AbstractDataSubmitTask.HEADER_VALUE); |
||||
this.propertyMap = calculator.getAttribute(DefinedSubmitJob.PROPERTY_VALUE); |
||||
this.url = calculator.getAttribute(AbstractDataSubmitTask.API_URL); |
||||
this.state = calculator.getAttribute(AbstractDataSubmitTask.JOB_STATE); |
||||
this.bodyContent = calculator.getAttribute(AbstractDataSubmitTask.BODY_CONTENT); |
||||
this.errorFlag = calculator.getAttribute(AbstractDataSubmitTask.ERROR_FLAG); |
||||
this.successStatus = calculator.getAttribute(AbstractDataSubmitTask.SUCCESS_STATUS); |
||||
this.errorMessageFlag = calculator.getAttribute(AbstractDataSubmitTask.ERROR_MESSAGE_FLAG); |
||||
} |
||||
|
||||
public JobBean(Calculator calculator, String type) { |
||||
this.headerMap = calculator.getAttribute(AbstractDataSubmitTask.HEADER_VALUE); |
||||
this.url = calculator.getAttribute(AbstractDataSubmitTask.API_URL); |
||||
this.state = calculator.getAttribute(AbstractDataSubmitTask.JOB_STATE); |
||||
this.bodyContent = calculator.getAttribute(AbstractDataSubmitTask.BODY_CONTENT); |
||||
this.errorFlag = calculator.getAttribute(AbstractDataSubmitTask.ERROR_FLAG); |
||||
this.successStatus = calculator.getAttribute(AbstractDataSubmitTask.SUCCESS_STATUS); |
||||
this.errorMessageFlag = calculator.getAttribute(AbstractDataSubmitTask.ERROR_MESSAGE_FLAG); |
||||
} |
||||
|
||||
public Map<String, String> getHeaders() { |
||||
return getSubmitAttribute(this.headerMap); |
||||
} |
||||
|
||||
public Map<String, String> getParams() { |
||||
return getSubmitAttribute(this.propertyMap); |
||||
} |
||||
|
||||
/** |
||||
* 提取填报属性值 |
||||
*/ |
||||
private Map<String, String> getSubmitAttribute(Map<String, Object> propertyMap) { |
||||
Map<String, String> params = new HashMap<String, String>(); |
||||
for (Map.Entry<String, Object> entry : propertyMap.entrySet()) { |
||||
if (entry.getValue() instanceof JobValue) { |
||||
JobValue ce = (JobValue) entry.getValue(); |
||||
if (ce.getValue() instanceof Primitive) { |
||||
continue; |
||||
} |
||||
params.put(entry.getKey(), valueToString(ce.getValue())); |
||||
} |
||||
} |
||||
return params; |
||||
} |
||||
|
||||
/** |
||||
* jobValue to String |
||||
* |
||||
* @return |
||||
*/ |
||||
public static String valueToString(Object value) { |
||||
String result; |
||||
if (value instanceof Date) { |
||||
DefaultValues defaultValues = GeneralContext.getDefaultValues(); |
||||
result = defaultValues.getDateTimeFormat().format(value); |
||||
} else if (value instanceof Parameter) { |
||||
result = ((Parameter) value).valueToString(); |
||||
} else if (value instanceof Double) { |
||||
result = StableUtils.doubleToString((Double) value); |
||||
} else { |
||||
result = String.valueOf(value); |
||||
} |
||||
return result; |
||||
} |
||||
|
||||
/** |
||||
* 填报属性状态判断 |
||||
* |
||||
* @return |
||||
*/ |
||||
public Boolean isOperationState() { |
||||
for (Map.Entry<String, Object> entry : propertyMap.entrySet()) { |
||||
if (entry.getValue() instanceof JobValue) { |
||||
JobValue ce = (JobValue) entry.getValue(); |
||||
return isState(ce); |
||||
} |
||||
} |
||||
return false; |
||||
} |
||||
|
||||
/** |
||||
* 填报属性状态判断 |
||||
* |
||||
* @param jobValue |
||||
* @return |
||||
*/ |
||||
public Boolean isState(JobValue jobValue) { |
||||
if (ComparatorUtils.equals(state, StateItems.CHANGED) |
||||
&& checkChange(jobValue.getState())) { |
||||
return true; |
||||
} else if (ComparatorUtils.equals(state, StateItems.INSERT) |
||||
&& (jobValue.getState().checkInsert() || jobValue.getState().checkDefault())) { |
||||
return true; |
||||
} else if (ComparatorUtils.equals(state, StateItems.DELETED) |
||||
&& (jobValue.getState().checkDeleted() || jobValue.getState().checkDefault())) { |
||||
return true; |
||||
} else if (ComparatorUtils.equals(state, StateItems.DEFAULT) && jobValue.getState().checkDefault()) { |
||||
return true; |
||||
} |
||||
return false; |
||||
} |
||||
|
||||
/** |
||||
* 填报属性状态判断 |
||||
* |
||||
* @param jobValue |
||||
* @return |
||||
*/ |
||||
public Boolean isStateStrict(JobValue jobValue) { |
||||
if (ComparatorUtils.equals(state, StateItems.CHANGED) |
||||
&& (jobValue.getState().checkChanged() && !jobValue.getState().checkDeleted())) { |
||||
return true; |
||||
} else if (ComparatorUtils.equals(state, StateItems.INSERT) |
||||
&& jobValue.getState().checkInsert()) { |
||||
return true; |
||||
} else if (ComparatorUtils.equals(state, StateItems.DELETED) |
||||
&& jobValue.getState().checkDeleted()) { |
||||
return true; |
||||
} else if (ComparatorUtils.equals(state, StateItems.DEFAULT) && jobValue.getState().checkDefault()) { |
||||
return true; |
||||
} |
||||
return false; |
||||
} |
||||
|
||||
/** |
||||
* 填报判断变更 |
||||
* |
||||
* @return |
||||
*/ |
||||
private boolean checkChange(JobValue.State state) { |
||||
if (state.checkChanged() && !state.checkDeleted()) { |
||||
return true; |
||||
} |
||||
if (state.checkDefault()) { |
||||
return true; |
||||
} |
||||
return false; |
||||
} |
||||
|
||||
public Map<String, Object> getHeaderMap() { |
||||
return headerMap; |
||||
} |
||||
|
||||
public void setHeaderMap(Map<String, Object> headerMap) { |
||||
this.headerMap = headerMap; |
||||
} |
||||
|
||||
public Map<String, Object> getPropertyMap() { |
||||
return propertyMap; |
||||
} |
||||
|
||||
public void setPropertyMap(Map<String, Object> propertyMap) { |
||||
this.propertyMap = propertyMap; |
||||
} |
||||
|
||||
public String getUrl() { |
||||
return url; |
||||
} |
||||
|
||||
public void setUrl(String url) { |
||||
this.url = url; |
||||
} |
||||
|
||||
public String getState() { |
||||
return state; |
||||
} |
||||
|
||||
public void setState(String state) { |
||||
this.state = state; |
||||
} |
||||
|
||||
public String getBodyContent() { |
||||
return bodyContent; |
||||
} |
||||
|
||||
public void setBodyContent(String bodyContent) { |
||||
this.bodyContent = bodyContent; |
||||
} |
||||
|
||||
public String getErrorFlag() { |
||||
return errorFlag; |
||||
} |
||||
|
||||
public void setErrorFlag(String errorFlag) { |
||||
this.errorFlag = errorFlag; |
||||
} |
||||
|
||||
public String getSuccessStatus() { |
||||
return successStatus; |
||||
} |
||||
|
||||
public void setSuccessStatus(String successStatus) { |
||||
this.successStatus = successStatus; |
||||
} |
||||
|
||||
public String getErrorMessageFlag() { |
||||
return errorMessageFlag; |
||||
} |
||||
|
||||
public void setErrorMessageFlag(String errorMessageFlag) { |
||||
this.errorMessageFlag = errorMessageFlag; |
||||
} |
||||
} |
@ -0,0 +1,117 @@
|
||||
/* |
||||
* Copyright (C), 2018-2021 |
||||
* Project: starter |
||||
* FileName: AbstractDataSubmitJob |
||||
* Author: xx |
||||
* Date: 2021/3/11 12:07 |
||||
*/ |
||||
package com.fr.plugin.xx.submitjob.job; |
||||
|
||||
import com.fanruan.api.i18n.I18nKit; |
||||
import com.fanruan.api.log.LogKit; |
||||
import com.fanruan.api.util.StringKit; |
||||
import com.fr.data.DefinedSubmitJob; |
||||
import com.fr.decision.system.bean.message.MessageUrlType; |
||||
import com.fr.decision.webservice.v10.message.MessageService; |
||||
import com.fr.general.ComparatorUtils; |
||||
import com.fr.plugin.xx.submitjob.SubmitUIBridge; |
||||
import com.fr.plugin.xx.submitjob.bean.JobBean; |
||||
import com.fr.script.Calculator; |
||||
import com.fr.stable.StringUtils; |
||||
import com.jayway.jsonpath.JsonPath; |
||||
|
||||
import java.util.Map; |
||||
|
||||
/** |
||||
* <Function Description><br> |
||||
* <AbstractDataSubmitJob> |
||||
* |
||||
* @author xx |
||||
* @since 1.0.0 |
||||
*/ |
||||
public abstract class AbstractDataSubmitJob extends DefinedSubmitJob { |
||||
private static final long serialVersionUID = 225145504253862142L; |
||||
protected JobBean jobBean; |
||||
|
||||
/** |
||||
* 接口返回结果发送消息 |
||||
* |
||||
* @param response |
||||
*/ |
||||
public static void throwErrorMessage(String response, String type, JobBean jobBean) throws Exception { |
||||
String errorFlag = jobBean.getErrorFlag(); |
||||
String successStatus = jobBean.getSuccessStatus(); |
||||
String errorMessageFlag = jobBean.getErrorMessageFlag(); |
||||
if (StringKit.isBlank(errorFlag) || StringKit.isBlank(errorMessageFlag)) { |
||||
sendSystemMessage(type, response); |
||||
return; |
||||
} |
||||
String errorMessage = StringKit.EMPTY; |
||||
try { |
||||
Object errorCode = JsonPath.read(response, errorFlag); |
||||
LogKit.info("submitjob-AbstractDataSubmitJob-throwErrorMessage-errorCode:{}", errorCode); |
||||
if (StringKit.isNotBlank(successStatus) && ComparatorUtils.equalsIgnoreCase(String.valueOf(errorCode), successStatus)) { |
||||
return; |
||||
} |
||||
if (StringKit.isBlank(successStatus) && (errorCode == null || StringKit.isBlank(String.valueOf(errorCode)))) { |
||||
return; |
||||
} |
||||
errorMessage = JsonPath.read(response, errorMessageFlag); |
||||
} catch (Exception e) { |
||||
LogKit.error(e.getMessage(), e); |
||||
sendSystemMessage(type, response); |
||||
} |
||||
if (StringKit.isNotBlank(errorMessage)) { |
||||
throw new Exception(errorMessage); |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* 发送系统消息 |
||||
* |
||||
* @param type |
||||
* @param response |
||||
*/ |
||||
private static void sendSystemMessage(String type, String response) { |
||||
String content = I18nKit.getLocText("Plugin-submitjob") + "-" + |
||||
type + "-" + |
||||
I18nKit.getLocText("Plugin-submitjob_Result_Message") + |
||||
response; |
||||
MessageService.getInstance().sendMessage2SupperRole(content, StringUtils.EMPTY, MessageUrlType.NONE); |
||||
} |
||||
|
||||
@Override |
||||
public String getJobType() { |
||||
return SubmitUIBridge.KEY; |
||||
} |
||||
|
||||
@Override |
||||
public void doJob(Calculator calculator) throws Exception { |
||||
this.jobBean = new JobBean(calculator); |
||||
this.checkParams(); |
||||
if (!this.jobBean.isOperationState()) { |
||||
return; |
||||
} |
||||
Map<String, String> params = this.jobBean.getParams(); |
||||
if (params.isEmpty()) { |
||||
return; |
||||
} |
||||
Map<String, String> headers = this.jobBean.getHeaders(); |
||||
checkHeader(headers); |
||||
operation(params, headers, calculator); |
||||
} |
||||
|
||||
public void checkParams() throws Exception { |
||||
if (this.jobBean.getPropertyMap() == null || StringKit.isBlank(this.jobBean.getUrl())) { |
||||
throw new Exception(I18nKit.getLocText("Plugin-submitjob_Link_Valid")); |
||||
} |
||||
if (StringKit.isBlank(this.jobBean.getState())) { |
||||
throw new Exception(I18nKit.getLocText("Plugin-submitjob_State_Valid")); |
||||
} |
||||
} |
||||
|
||||
public void checkHeader(Map<String, String> headers) throws Exception { |
||||
} |
||||
|
||||
public abstract void operation(Map<String, String> params, Map<String, String> headers, Calculator calculator) throws Exception; |
||||
} |
@ -0,0 +1,415 @@
|
||||
/* |
||||
* Copyright (C), 2018-2021 |
||||
* Project: starter |
||||
* FileName: AbstractDataSubmitTask |
||||
* Author: xx |
||||
* Date: 2021/2/21 13:05 |
||||
*/ |
||||
package com.fr.plugin.xx.submitjob.job; |
||||
|
||||
import com.fanruan.api.log.LogKit; |
||||
import com.fanruan.api.util.StringKit; |
||||
import com.fr.data.AbstractSubmitTask; |
||||
import com.fr.data.FinishJob; |
||||
import com.fr.data.SubmitJob; |
||||
import com.fr.data.impl.SubmitJobValue; |
||||
import com.fr.general.ComparatorUtils; |
||||
import com.fr.general.DateUtils; |
||||
import com.fr.general.GeneralUtils; |
||||
import com.fr.general.xml.GeneralXMLTools; |
||||
import com.fr.script.Calculator; |
||||
import com.fr.stable.*; |
||||
import com.fr.stable.script.CalculatorKey; |
||||
import com.fr.stable.xml.StableXMLUtils; |
||||
import com.fr.stable.xml.XMLPrintWriter; |
||||
import com.fr.stable.xml.XMLReadable; |
||||
import com.fr.stable.xml.XMLableReader; |
||||
import com.fr.write.DMLReport; |
||||
import com.fr.writex.assist.DmlAssist; |
||||
import com.fr.writex.cal.RowDataCalculator; |
||||
|
||||
import java.lang.reflect.Field; |
||||
import java.util.Arrays; |
||||
import java.util.HashSet; |
||||
import java.util.LinkedHashMap; |
||||
import java.util.Map; |
||||
|
||||
/** |
||||
* <Function Description><br> |
||||
* <AbstractDataSubmitTask> |
||||
* |
||||
* @author xx |
||||
* @since 1.0.0 |
||||
*/ |
||||
public abstract class AbstractDataSubmitTask extends AbstractSubmitTask { |
||||
public static final CalculatorKey HEADER_VALUE = CalculatorKey.createKey("HEADER_VALUE"); |
||||
public static final CalculatorKey API_URL = CalculatorKey.createKey("API_URL"); |
||||
public static final CalculatorKey JOB_STATE = CalculatorKey.createKey("JOB_STATE"); |
||||
public static final CalculatorKey BODY_CONTENT = CalculatorKey.createKey("BODY_CONTENT"); |
||||
public static final CalculatorKey ERROR_FLAG = CalculatorKey.createKey("ERROR_FLAG"); |
||||
public static final CalculatorKey SUCCESS_STATUS = CalculatorKey.createKey("SUCCESS_STATUS"); |
||||
public static final CalculatorKey ERROR_MESSAGE_FLAG = CalculatorKey.createKey("ERROR_MESSAGE_FLAG"); |
||||
public static final Map<String, SubmitJob> submitTypeMap = new LinkedHashMap<String, SubmitJob>() { |
||||
private static final long serialVersionUID = -7952964928237105471L; |
||||
|
||||
{ |
||||
put(GetSubmitJob.class.getName(), new GetSubmitJob()); |
||||
put(PostSubmitJob.class.getName(), new PostSubmitJob()); |
||||
put(PostJsonSubmitJob.class.getName(), new PostJsonSubmitJob()); |
||||
put(PostTotalSubmitJob.class.getName(), new PostTotalSubmitJob()); |
||||
put(SoapSubmitJob.class.getName(), new SoapSubmitJob()); |
||||
put(SoapTotalSubmitJob.class.getName(), new SoapTotalSubmitJob()); |
||||
} |
||||
}; |
||||
private static final long serialVersionUID = -3454687937286690692L; |
||||
public FinishJob definedJob; |
||||
public String className; |
||||
public String state; |
||||
public String url; |
||||
public String bodyContent; |
||||
public ListMap<String, Object> headerMap = new ListMap<String, Object>(); |
||||
public ListMap<String, Object> propertyMap = new ListMap<String, Object>(); |
||||
public String errorFlag; |
||||
public String successStatus; |
||||
public String errorMessageFlag; |
||||
|
||||
public AbstractDataSubmitTask() { |
||||
} |
||||
|
||||
/** |
||||
* 行列值处理 |
||||
* |
||||
* @param listMap |
||||
* @return |
||||
*/ |
||||
protected ColumnRow[] calculateRelatedColumnRows(ListMap listMap) { |
||||
HashSet<ColumnRow> columnRowSet = new HashSet<ColumnRow>(); |
||||
for (Object element : listMap.entrySet()) { |
||||
Object value = ((Map.Entry) element).getValue(); |
||||
if (value instanceof ColumnRowRelated) { |
||||
ColumnRow[] relatedColumnRows = ((ColumnRowRelated) value).getRelatedColumnRows(); |
||||
columnRowSet.addAll(Arrays.asList(relatedColumnRows)); |
||||
} |
||||
} |
||||
return columnRowSet.toArray(new ColumnRow[0]); |
||||
} |
||||
|
||||
@Override |
||||
public void doJob(Calculator calculator) throws Exception { |
||||
this.definedJob = this.createFinishJob(); |
||||
if (CommonUtils.isNull(this.definedJob)) { |
||||
return; |
||||
} |
||||
RowDataCalculator rowDataCalculator = this.getRowDataCalculator(); |
||||
DMLReport dmlReport = calculator.getAttribute(DMLReport.KEY); |
||||
if (dmlReport != null) { |
||||
ColumnRow[] columnRows = this.calculateRelatedColumnRows(this.propertyMap); |
||||
calculator.setAttribute(DmlAssist.RELATED_CR_ARRAY, columnRows); |
||||
dmlReport.getGroupRowDataCollector(calculator, rowDataCalculator).collectData(); |
||||
} else { |
||||
rowDataCalculator.run(calculator); |
||||
} |
||||
this.doFinish(calculator); |
||||
} |
||||
|
||||
protected abstract RowDataCalculator getRowDataCalculator(); |
||||
|
||||
@Override |
||||
public void doFinish(Calculator calculator) throws Exception { |
||||
} |
||||
|
||||
protected FinishJob createFinishJob() { |
||||
if (StringUtils.isBlank(this.getClassName())) { |
||||
return null; |
||||
} |
||||
try { |
||||
return submitTypeMap.get(this.getClassName()); |
||||
} catch (Exception e) { |
||||
LogKit.error(e.getMessage(), e); |
||||
return null; |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* 计算header属性值 |
||||
* |
||||
* @param calculator |
||||
* @return |
||||
* @throws Exception |
||||
*/ |
||||
protected ListMap<String, Object> getHeader4Action(Calculator calculator) throws Exception { |
||||
if (this.definedJob == null) { |
||||
return null; |
||||
} |
||||
ListMap<String, Object> listMap = new ListMap<String, Object>(this.headerMap.size()); |
||||
for (Object element : this.headerMap.entrySet()) { |
||||
Map.Entry entry = (Map.Entry) element; |
||||
if (!listMap.containsKey((String) entry.getKey())) { |
||||
listMap.put((String) entry.getKey(), this.dealPropertyValue(calculator, entry.getValue(), null)); |
||||
} |
||||
} |
||||
return listMap; |
||||
} |
||||
|
||||
/** |
||||
* 计算body属性值 |
||||
* |
||||
* @param calculator |
||||
* @return |
||||
* @throws Exception |
||||
*/ |
||||
protected ListMap<String, Object> getValues4Action(Calculator calculator) throws Exception { |
||||
if (this.definedJob == null) { |
||||
return null; |
||||
} |
||||
ListMap<String, Object> listMap = new ListMap<String, Object>(this.propertyMap.size()); |
||||
for (Object element : this.propertyMap.entrySet()) { |
||||
Map.Entry entry = (Map.Entry) element; |
||||
if (!listMap.containsKey((String) entry.getKey())) { |
||||
listMap.put((String) entry.getKey(), this.dealPropertyValue(calculator, entry.getValue(), null)); |
||||
} |
||||
} |
||||
return listMap; |
||||
} |
||||
|
||||
protected Object dealPropertyValue(Calculator calculator, Object propertyValueOld, Field field) throws Exception { |
||||
Object propertyValue = propertyValueOld; |
||||
int state = -1; |
||||
if (propertyValueOld instanceof ColumnRowRelated) { |
||||
if (this.needConvert(propertyValueOld, field)) { |
||||
ColumnRow[] relatedColumnRows = ((ColumnRowRelated) propertyValueOld).getRelatedColumnRows(); |
||||
if (relatedColumnRows != null && relatedColumnRows.length == 1) { |
||||
state = GeneralUtils.objectToNumber(calculator.eval(relatedColumnRows[0].stateDescription()), false).intValue(); |
||||
} |
||||
} |
||||
if (propertyValueOld instanceof ColumnRow) { |
||||
propertyValue = calculator.resolveVariable(propertyValueOld); |
||||
} |
||||
if (propertyValueOld instanceof FormulaProvider) { |
||||
propertyValue = calculator.evalValue((FormulaProvider) propertyValueOld); |
||||
} |
||||
} |
||||
if (!ComparatorUtils.equals(state, -1) || CommonUtils.isNull(field)) { |
||||
return new SubmitJobValue(propertyValue, state); |
||||
} |
||||
String fieldType = field.getType().getName(); |
||||
if ("String".equals(fieldType)) { |
||||
return propertyValue.toString(); |
||||
} else if ("Integer".equals(fieldType)) { |
||||
return new Integer(propertyValue.toString()); |
||||
} else if ("Double".equals(fieldType)) { |
||||
return new Double(propertyValue.toString()); |
||||
} else if ("Boolean".equals(fieldType)) { |
||||
return Boolean.valueOf(propertyValue.toString()); |
||||
} else { |
||||
return "Date".equals(fieldType) ? DateUtils.object2Date(propertyValue, false) : propertyValue; |
||||
} |
||||
} |
||||
|
||||
private boolean needConvert(Object value, Field field) { |
||||
return (value instanceof ColumnRow || value instanceof FormulaProvider && ((FormulaProvider) value).getContent().matches("^=[a-zA-Z]+\\d+$")) |
||||
&& (field == null || field.getType().getName().contains("JobValue")); |
||||
} |
||||
|
||||
@Override |
||||
public void readXML(XMLableReader reader) { |
||||
if (reader.isAttr()) { |
||||
this.headerMap.clear(); |
||||
this.propertyMap.clear(); |
||||
} |
||||
if (reader.isChildNode()) { |
||||
if (ComparatorUtils.equals(reader.getTagName(), "ClassAttr")) { |
||||
String className = reader.getAttrAsString("className", StringKit.EMPTY); |
||||
String state = reader.getAttrAsString("state", StringKit.EMPTY); |
||||
String url = reader.getAttrAsString("url", StringKit.EMPTY); |
||||
String bodyContent = reader.getAttrAsString("bodyContent", StringKit.EMPTY); |
||||
String errorFlag = reader.getAttrAsString("errorFlag", StringKit.EMPTY); |
||||
String successStatus = reader.getAttrAsString("successStatus", StringKit.EMPTY); |
||||
String errorMessageFlag = reader.getAttrAsString("errorMessageFlag", StringKit.EMPTY); |
||||
if (StringKit.isBlank(className) || StringKit.isBlank(url)) { |
||||
return; |
||||
} |
||||
this.setClassName(className); |
||||
this.setState(state); |
||||
this.setUrl(url); |
||||
this.setBodyContent(bodyContent); |
||||
this.setErrorFlag(errorFlag); |
||||
this.setSuccessStatus(successStatus); |
||||
this.setErrorMessageFlag(errorMessageFlag); |
||||
} |
||||
if (ComparatorUtils.equals(reader.getTagName(), "Header")) { |
||||
final String name = reader.getAttrAsString("name", StringKit.EMPTY); |
||||
if (StringKit.isBlank(name)) { |
||||
return; |
||||
} |
||||
reader.readXMLObject(new XMLReadable() { |
||||
public void readXML(XMLableReader xmLableReader) { |
||||
if (xmLableReader.isChildNode()) { |
||||
if (ComparatorUtils.equals(xmLableReader.getTagName(), "ColumnRow")) { |
||||
int column = xmLableReader.getAttrAsInt("column", 0); |
||||
int row = xmLableReader.getAttrAsInt("row", 0); |
||||
AbstractDataSubmitTask.this.headerMap.put(name, ColumnRow.valueOf(column, row)); |
||||
} |
||||
if (ComparatorUtils.equals(xmLableReader.getTagName(), "O")) { |
||||
AbstractDataSubmitTask.this.headerMap.put(name, GeneralXMLTools.readObject(xmLableReader)); |
||||
} |
||||
} |
||||
} |
||||
}); |
||||
} |
||||
if (ComparatorUtils.equals(reader.getTagName(), "Property")) { |
||||
final String name = reader.getAttrAsString("name", StringKit.EMPTY); |
||||
if (StringKit.isBlank(name)) { |
||||
return; |
||||
} |
||||
reader.readXMLObject(new XMLReadable() { |
||||
public void readXML(XMLableReader xmLableReader) { |
||||
if (xmLableReader.isChildNode()) { |
||||
if (ComparatorUtils.equals(xmLableReader.getTagName(), "ColumnRow")) { |
||||
int column = xmLableReader.getAttrAsInt("column", 0); |
||||
int row = xmLableReader.getAttrAsInt("row", 0); |
||||
AbstractDataSubmitTask.this.propertyMap.put(name, ColumnRow.valueOf(column, row)); |
||||
} |
||||
if (ComparatorUtils.equals(xmLableReader.getTagName(), "O")) { |
||||
AbstractDataSubmitTask.this.propertyMap.put(name, GeneralXMLTools.readObject(xmLableReader)); |
||||
} |
||||
} |
||||
} |
||||
}); |
||||
} |
||||
} |
||||
} |
||||
|
||||
@Override |
||||
public void writeXML(XMLPrintWriter writer) { |
||||
if (StringUtils.isNotBlank(this.getClassName())) { |
||||
writer.startTAG("ClassAttr") |
||||
.attr("className", this.getClassName()) |
||||
.attr("state", this.getState()) |
||||
.attr("url", this.getUrl()) |
||||
.attr("bodyContent", this.getBodyContent()) |
||||
.attr("errorFlag", this.getErrorFlag()) |
||||
.attr("successStatus", this.getSuccessStatus()) |
||||
.attr("errorMessageFlag", this.getErrorMessageFlag()) |
||||
.end(); |
||||
} |
||||
for (Object object : this.headerMap.entrySet()) { |
||||
Map.Entry entry = (Map.Entry) object; |
||||
Object value = entry.getValue(); |
||||
writer.startTAG("Header").attr("name", (String) entry.getKey()); |
||||
if (value instanceof ColumnRow) { |
||||
StableXMLUtils.writeColumnRow(writer, (ColumnRow) value); |
||||
} else { |
||||
GeneralXMLTools.writeObject(writer, value); |
||||
} |
||||
writer.end(); |
||||
} |
||||
for (Object object : this.propertyMap.entrySet()) { |
||||
Map.Entry entry = (Map.Entry) object; |
||||
Object value = entry.getValue(); |
||||
writer.startTAG("Property").attr("name", (String) entry.getKey()); |
||||
if (value instanceof ColumnRow) { |
||||
StableXMLUtils.writeColumnRow(writer, (ColumnRow) value); |
||||
} else { |
||||
GeneralXMLTools.writeObject(writer, value); |
||||
} |
||||
writer.end(); |
||||
} |
||||
} |
||||
|
||||
public Object clone() throws CloneNotSupportedException { |
||||
AbstractDataSubmitTask dataSubmitTask = (AbstractDataSubmitTask) super.clone(); |
||||
dataSubmitTask.headerMap = StableUtils.cloneListMap(this.headerMap); |
||||
dataSubmitTask.propertyMap = StableUtils.cloneListMap(this.propertyMap); |
||||
return dataSubmitTask; |
||||
} |
||||
|
||||
public boolean equals(Object obj) { |
||||
return obj instanceof AbstractDataSubmitTask |
||||
&& ComparatorUtils.equals(((AbstractDataSubmitTask) obj).className, this.className) |
||||
&& ComparatorUtils.equals(((AbstractDataSubmitTask) obj).state, this.state) |
||||
&& ComparatorUtils.equals(((AbstractDataSubmitTask) obj).url, this.url) |
||||
&& ComparatorUtils.equals(((AbstractDataSubmitTask) obj).bodyContent, this.bodyContent) |
||||
&& ComparatorUtils.equals(((AbstractDataSubmitTask) obj).errorFlag, this.errorFlag) |
||||
&& ComparatorUtils.equals(((AbstractDataSubmitTask) obj).successStatus, this.successStatus) |
||||
&& ComparatorUtils.equals(((AbstractDataSubmitTask) obj).errorMessageFlag, this.errorMessageFlag) |
||||
&& ComparatorUtils.equals(((AbstractDataSubmitTask) obj).headerMap, this.headerMap) |
||||
&& ComparatorUtils.equals(((AbstractDataSubmitTask) obj).propertyMap, this.propertyMap); |
||||
} |
||||
|
||||
public int hashCode() { |
||||
return AssistUtils.hashCode(new Object[]{this.className, this.state, this.url, this.bodyContent, this.errorFlag, this.successStatus, this.errorMessageFlag}); |
||||
} |
||||
|
||||
public String getClassName() { |
||||
return className; |
||||
} |
||||
|
||||
public void setClassName(String className) { |
||||
this.className = className; |
||||
} |
||||
|
||||
public String getState() { |
||||
return state; |
||||
} |
||||
|
||||
public void setState(String state) { |
||||
this.state = state; |
||||
} |
||||
|
||||
public ListMap<String, Object> getHeaderMap() { |
||||
return headerMap; |
||||
} |
||||
|
||||
public void setHeaderMap(ListMap<String, Object> headerMap) { |
||||
this.headerMap = headerMap; |
||||
} |
||||
|
||||
public ListMap<String, Object> getPropertyMap() { |
||||
return propertyMap; |
||||
} |
||||
|
||||
public void setPropertyMap(ListMap<String, Object> propertyMap) { |
||||
this.propertyMap = propertyMap; |
||||
} |
||||
|
||||
public String getUrl() { |
||||
return url; |
||||
} |
||||
|
||||
public void setUrl(String url) { |
||||
this.url = url; |
||||
} |
||||
|
||||
public String getBodyContent() { |
||||
return bodyContent; |
||||
} |
||||
|
||||
public void setBodyContent(String bodyContent) { |
||||
this.bodyContent = bodyContent; |
||||
} |
||||
|
||||
public String getErrorFlag() { |
||||
return errorFlag; |
||||
} |
||||
|
||||
public void setErrorFlag(String errorFlag) { |
||||
this.errorFlag = errorFlag; |
||||
} |
||||
|
||||
public String getSuccessStatus() { |
||||
return successStatus; |
||||
} |
||||
|
||||
public void setSuccessStatus(String successStatus) { |
||||
this.successStatus = successStatus; |
||||
} |
||||
|
||||
public String getErrorMessageFlag() { |
||||
return errorMessageFlag; |
||||
} |
||||
|
||||
public void setErrorMessageFlag(String errorMessageFlag) { |
||||
this.errorMessageFlag = errorMessageFlag; |
||||
} |
||||
} |
@ -0,0 +1,115 @@
|
||||
/* |
||||
* Copyright (C), 2018-2021 |
||||
* Project: starter |
||||
* FileName: AbstractDataTotalSubmitJob |
||||
* Author: xx |
||||
* Date: 2021/3/11 12:11 |
||||
*/ |
||||
package com.fr.plugin.xx.submitjob.job; |
||||
|
||||
import com.fanruan.api.i18n.I18nKit; |
||||
import com.fanruan.api.log.LogKit; |
||||
import com.fanruan.api.util.StringKit; |
||||
import com.fr.data.JobValue; |
||||
import com.fr.data.TotalSubmitJob; |
||||
import com.fr.plugin.xx.submitjob.SubmitUIBridge; |
||||
import com.fr.plugin.xx.submitjob.bean.JobBean; |
||||
import com.fr.plugin.xx.submitjob.kit.HttpKit; |
||||
import com.fr.script.Calculator; |
||||
import com.fr.stable.CommonUtils; |
||||
import com.fr.third.org.apache.http.entity.StringEntity; |
||||
import com.fr.third.springframework.web.util.HtmlUtils; |
||||
|
||||
import java.util.ArrayList; |
||||
import java.util.HashMap; |
||||
import java.util.List; |
||||
import java.util.Map; |
||||
|
||||
import static com.fr.plugin.xx.submitjob.bean.JobBean.valueToString; |
||||
import static com.fr.plugin.xx.submitjob.job.GetSubmitJob.throwErrorMessage; |
||||
|
||||
/** |
||||
* <Function Description><br> |
||||
* <AbstractDataTotalSubmitJob> |
||||
* |
||||
* @author xx |
||||
* @since 1.0.0 |
||||
*/ |
||||
public abstract class AbstractDataTotalSubmitJob extends TotalSubmitJob { |
||||
private static final long serialVersionUID = 6348254394120760490L; |
||||
protected JobBean jobBean; |
||||
|
||||
@Override |
||||
public String getJobType() { |
||||
return SubmitUIBridge.KEY; |
||||
} |
||||
|
||||
@Override |
||||
public void doJob(Calculator calculator) throws Exception { |
||||
if (CommonUtils.isNull(jobBean)) { |
||||
jobBean = new JobBean(calculator, "total"); |
||||
} |
||||
super.doJob(calculator); |
||||
} |
||||
|
||||
@Override |
||||
protected void doTotalJob(Data data, Calculator calculator) throws Exception { |
||||
checkParams(); |
||||
List<Map<String, String>> paramList = new ArrayList<Map<String, String>>(); |
||||
boolean isRecordModify; |
||||
for (int row = 0; row < data.getRowCount(); row++) { |
||||
Map<String, String> params = new HashMap<String, String>(); |
||||
isRecordModify = false; |
||||
for (int col = 0; col < data.getColumnCount(); col++) { |
||||
Object cellValue = data.getValueAt(row, col); |
||||
if (!(cellValue instanceof JobValue)) { |
||||
continue; |
||||
} |
||||
JobValue ce = (JobValue) cellValue; |
||||
if (!isRecordModify && this.jobBean.isStateStrict(ce)) { |
||||
isRecordModify = true; |
||||
} |
||||
params.put(data.getColumnName(col), valueToString(ce.getValue())); |
||||
} |
||||
if (isRecordModify) { |
||||
paramList.add(params); |
||||
} |
||||
} |
||||
if (paramList.isEmpty()) { |
||||
return; |
||||
} |
||||
Map<String, String> headers = jobBean.getHeaders(); |
||||
checkHeader(headers); |
||||
String bodyContent = calculateContent(paramList, calculator); |
||||
operation(bodyContent, headers); |
||||
} |
||||
|
||||
public void checkParams() throws Exception { |
||||
if (StringKit.isBlank(this.jobBean.getUrl())) { |
||||
throw new Exception(I18nKit.getLocText("Plugin-submitjob_Link_Valid")); |
||||
} |
||||
if (StringKit.isBlank(this.jobBean.getState())) { |
||||
throw new Exception(I18nKit.getLocText("Plugin-submitjob_State_Valid")); |
||||
} |
||||
} |
||||
|
||||
public abstract String calculateContent(List<Map<String, String>> paramList, Calculator calculator) throws Exception; |
||||
|
||||
public abstract void checkHeader(Map<String, String> headers) throws Exception; |
||||
|
||||
/** |
||||
* 提交属性处理操作 |
||||
* |
||||
* @param bodyContent |
||||
* @param headers |
||||
* @throws Exception |
||||
*/ |
||||
private void operation(String bodyContent, Map<String, String> headers) throws Exception { |
||||
LogKit.info("submitjob-AbstractDataTotalSubmitJob-operation-bodyContent:{}, headers:{}", bodyContent, headers); |
||||
StringEntity stringEntity = new StringEntity(bodyContent, "UTF-8"); |
||||
String response = HttpKit.executeAndParse(com.fanruan.api.net.http.rs.HttpRequest.custom() |
||||
.url(this.jobBean.getUrl()).post(stringEntity).headers(headers).build()); |
||||
LogKit.info("submitjob-AbstractDataTotalSubmitJob-operation-response:{}", response); |
||||
throwErrorMessage(HtmlUtils.htmlUnescape(response), this.getJobType(), this.jobBean); |
||||
} |
||||
} |
@ -0,0 +1,95 @@
|
||||
/* |
||||
* Copyright (C), 2018-2021 |
||||
* Project: starter |
||||
* FileName: DataSubmitJob |
||||
* Author: xx |
||||
* Date: 2021/2/19 20:57 |
||||
*/ |
||||
package com.fr.plugin.xx.submitjob.job; |
||||
|
||||
import com.fanruan.api.i18n.I18nKit; |
||||
import com.fanruan.api.log.LogKit; |
||||
import com.fr.data.DefinedSubmitJob; |
||||
import com.fr.data.TotalSubmitJob; |
||||
import com.fr.plugin.context.PluginContexts; |
||||
import com.fr.plugin.xx.submitjob.SubmitUIBridge; |
||||
import com.fr.script.Calculator; |
||||
import com.fr.stable.script.CalculatorProvider; |
||||
import com.fr.writex.cal.RowDataCalculator; |
||||
|
||||
/** |
||||
* <Function Description><br> |
||||
* <DataSubmitJob> |
||||
* |
||||
* @author xx |
||||
* @since 1.0.0 |
||||
*/ |
||||
public class DataSubmitTask extends AbstractDataSubmitTask { |
||||
private static final long serialVersionUID = 2800082714711002017L; |
||||
|
||||
public DataSubmitTask() { |
||||
} |
||||
|
||||
public DataSubmitTask(String className) { |
||||
this.setClassName(className); |
||||
} |
||||
|
||||
@Override |
||||
public String getJobType() { |
||||
return SubmitUIBridge.KEY; |
||||
} |
||||
|
||||
@Override |
||||
public void doFinish(Calculator calculator) throws Exception { |
||||
if (this.definedJob instanceof TotalSubmitJob) { |
||||
this.definedJob.doFinish(calculator); |
||||
} |
||||
} |
||||
|
||||
private void doJobByColumn(Calculator calculator) throws Exception { |
||||
if (!PluginContexts.currentContext().isAvailable()) { |
||||
LogKit.error(I18nKit.getLocText("Plugin-submitjob_licence_Expired")); |
||||
return; |
||||
} |
||||
calculator.setAttribute(AbstractDataSubmitTask.HEADER_VALUE, this.getHeader4Action(calculator)); |
||||
calculator.setAttribute(DefinedSubmitJob.PROPERTY_VALUE, this.getValues4Action(calculator)); |
||||
calculator.setAttribute(AbstractDataSubmitTask.API_URL, this.getUrl()); |
||||
calculator.setAttribute(AbstractDataSubmitTask.JOB_STATE, this.getState()); |
||||
calculator.setAttribute(AbstractDataSubmitTask.BODY_CONTENT, this.getBodyContent()); |
||||
calculator.setAttribute(AbstractDataSubmitTask.ERROR_FLAG, this.getErrorFlag()); |
||||
calculator.setAttribute(AbstractDataSubmitTask.SUCCESS_STATUS, this.getSuccessStatus()); |
||||
calculator.setAttribute(AbstractDataSubmitTask.ERROR_MESSAGE_FLAG, this.getErrorMessageFlag()); |
||||
try { |
||||
this.definedJob.doJob(calculator); |
||||
} finally { |
||||
calculator.removeAttribute(AbstractDataSubmitTask.HEADER_VALUE); |
||||
calculator.removeAttribute(DefinedSubmitJob.PROPERTY_VALUE); |
||||
calculator.removeAttribute(AbstractDataSubmitTask.API_URL); |
||||
calculator.removeAttribute(AbstractDataSubmitTask.JOB_STATE); |
||||
calculator.removeAttribute(AbstractDataSubmitTask.BODY_CONTENT); |
||||
calculator.removeAttribute(AbstractDataSubmitTask.ERROR_FLAG); |
||||
calculator.removeAttribute(AbstractDataSubmitTask.SUCCESS_STATUS); |
||||
calculator.removeAttribute(AbstractDataSubmitTask.ERROR_MESSAGE_FLAG); |
||||
} |
||||
} |
||||
|
||||
protected RowDataCalculator getRowDataCalculator() { |
||||
return new RowDataCalculator() { |
||||
public void run(CalculatorProvider calculatorProvider) throws Exception { |
||||
DataSubmitTask.this.doJobByColumn((Calculator) calculatorProvider); |
||||
} |
||||
|
||||
public boolean isDynamic() { |
||||
return true; |
||||
} |
||||
}; |
||||
} |
||||
|
||||
public boolean equals(Object obj) { |
||||
return obj instanceof DataSubmitTask && super.equals(obj); |
||||
} |
||||
|
||||
public int hashCode() { |
||||
return super.hashCode(); |
||||
} |
||||
} |
@ -0,0 +1,41 @@
|
||||
/* |
||||
* Copyright (C), 2018-2020 |
||||
* Project: starter |
||||
* FileName: GetSubmitJob |
||||
* Author: xx |
||||
* Date: 2020/8/28 17:01 |
||||
*/ |
||||
package com.fr.plugin.xx.submitjob.job; |
||||
|
||||
import com.fanruan.api.log.LogKit; |
||||
import com.fr.plugin.xx.submitjob.kit.HttpKit; |
||||
import com.fr.script.Calculator; |
||||
import com.fr.third.springframework.web.util.HtmlUtils; |
||||
|
||||
import java.util.Map; |
||||
|
||||
/** |
||||
* <Function Description><br> |
||||
* <GetSubmitJob> |
||||
* |
||||
* @author xx |
||||
* @since 1.0.0 |
||||
*/ |
||||
public class GetSubmitJob extends AbstractDataSubmitJob { |
||||
private static final long serialVersionUID = 9185266482517664080L; |
||||
public static final String KEY = "GetSubmitJob"; |
||||
|
||||
/** |
||||
* 提交属性处理操作 |
||||
* |
||||
* @param params |
||||
* @throws Exception |
||||
*/ |
||||
@Override |
||||
public void operation(Map<String, String> params, Map<String, String> headers, Calculator calculator) throws Exception { |
||||
LogKit.info("submitjob-GetSubmitJob-operation-params:{}, headers:{}", params, headers); |
||||
String response = HttpKit.get(this.jobBean.getUrl(), params, headers); |
||||
LogKit.info("submitjob-GetSubmitJob-operation-response:{}", response); |
||||
throwErrorMessage(HtmlUtils.htmlUnescape(response), GetSubmitJob.KEY, this.jobBean); |
||||
} |
||||
} |
@ -0,0 +1,110 @@
|
||||
/* |
||||
* Copyright (C), 2018-2020 |
||||
* Project: starter |
||||
* FileName: PostSubmitJob |
||||
* Author: xx |
||||
* Date: 2020/8/28 17:01 |
||||
*/ |
||||
package com.fr.plugin.xx.submitjob.job; |
||||
|
||||
import com.fanruan.api.i18n.I18nKit; |
||||
import com.fanruan.api.log.LogKit; |
||||
import com.fanruan.api.net.http.rs.HttpRequest; |
||||
import com.fr.base.TemplateUtils; |
||||
import com.fr.general.ComparatorUtils; |
||||
import com.fr.json.JSONObject; |
||||
import com.fr.plugin.xx.submitjob.kit.HttpKit; |
||||
import com.fr.script.Calculator; |
||||
import com.fr.stable.StringUtils; |
||||
import com.fr.third.org.apache.http.client.methods.CloseableHttpResponse; |
||||
import com.fr.third.org.apache.http.conn.ssl.NoopHostnameVerifier; |
||||
import com.fr.third.org.apache.http.conn.ssl.SSLConnectionSocketFactory; |
||||
import com.fr.third.org.apache.http.conn.ssl.TrustSelfSignedStrategy; |
||||
import com.fr.third.org.apache.http.cookie.Cookie; |
||||
import com.fr.third.org.apache.http.entity.StringEntity; |
||||
import com.fr.third.org.apache.http.impl.client.BasicCookieStore; |
||||
import com.fr.third.org.apache.http.impl.client.CloseableHttpClient; |
||||
import com.fr.third.org.apache.http.impl.client.HttpClients; |
||||
import com.fr.third.org.apache.http.ssl.SSLContexts; |
||||
import com.fr.third.org.apache.http.util.EntityUtils; |
||||
import com.fr.third.springframework.web.util.HtmlUtils; |
||||
|
||||
import java.util.HashMap; |
||||
import java.util.List; |
||||
import java.util.Map; |
||||
|
||||
/** |
||||
* <Function Description><br> |
||||
* <PostSubmitJob> |
||||
* |
||||
* @author xx |
||||
* @since 1.0.0 |
||||
*/ |
||||
public class PostJsonSubmitJob extends AbstractDataSubmitJob { |
||||
public static final String KEY = "PostJsonSubmitJob"; |
||||
private static final long serialVersionUID = -2439535244039859157L; |
||||
|
||||
@Override |
||||
public void checkHeader(Map<String, String> headers) throws Exception { |
||||
if (!headers.containsKey("Content-Type")) { |
||||
headers.put("Content-Type", "application/json"); |
||||
} |
||||
if (!ComparatorUtils.equalsIgnoreCase(headers.get("Content-Type"), "application/json")) { |
||||
throw new Exception(I18nKit.getLocText("Plugin-submitjob_Header_Content-Type_Valid")); |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* 提交属性处理操作 |
||||
* |
||||
* @param params |
||||
* @throws Exception |
||||
*/ |
||||
@Override |
||||
public void operation(Map<String, String> params, Map<String, String> headers, Calculator calculator) throws Exception { |
||||
setCookies(headers); |
||||
LogKit.info("submitjob-PostJsonSubmitJob-operation-params:{}, headers:{}", params, headers); |
||||
String bodyContent; |
||||
if (StringUtils.isNotBlank(this.jobBean.getBodyContent())) { |
||||
bodyContent = TemplateUtils.render(this.jobBean.getBodyContent(), params, calculator); |
||||
} else { |
||||
bodyContent = JSONObject.mapFrom(params).encode(); |
||||
} |
||||
StringEntity stringEntity = new StringEntity(bodyContent, "UTF-8"); |
||||
String response = HttpKit.executeAndParse(com.fanruan.api.net.http.rs.HttpRequest.custom() |
||||
.url(this.jobBean.getUrl()).post(stringEntity).headers(headers).build()); |
||||
LogKit.info("submitjob-PostJsonSubmitJob-operation-response:{}", response); |
||||
throwErrorMessage(HtmlUtils.htmlUnescape(response), PostJsonSubmitJob.KEY, this.jobBean); |
||||
} |
||||
|
||||
private void setCookies(Map<String, String> headers) { |
||||
if (!headers.containsKey("loginUrl") || !headers.containsKey("loginParams")) { |
||||
return; |
||||
} |
||||
List<Cookie> cookieList = getLoginCookies(headers.remove("loginUrl"), headers.remove("loginParams")).getCookies(); |
||||
StringBuilder cookieBuilder = new StringBuilder(); |
||||
for (Cookie cookie : cookieList) { |
||||
cookieBuilder.append(cookie.getName()).append("=").append(cookie.getValue()).append(";"); |
||||
} |
||||
headers.put("Cookie", cookieBuilder.toString()); |
||||
} |
||||
|
||||
private BasicCookieStore getLoginCookies(String loginUrl, String bodyContent) { |
||||
BasicCookieStore loginCookie = new BasicCookieStore(); |
||||
try { |
||||
SSLConnectionSocketFactory scsf = new SSLConnectionSocketFactory(SSLContexts.custom().loadTrustMaterial(null, new TrustSelfSignedStrategy()).build(), NoopHostnameVerifier.INSTANCE); |
||||
CloseableHttpClient httpClient = HttpClients.custom().setSSLSocketFactory(scsf).setDefaultCookieStore(loginCookie).build(); |
||||
Map<String, String> headers = new HashMap<>(); |
||||
headers.put("Content-Type", "application/json"); |
||||
StringEntity stringEntity = new StringEntity(bodyContent, "UTF-8"); |
||||
HttpRequest httpRequest = HttpRequest.custom() |
||||
.url(loginUrl).post(stringEntity).headers(headers).build(); |
||||
CloseableHttpResponse response = HttpKit.execute(httpClient, httpRequest); |
||||
String result = EntityUtils.toString(response.getEntity()); |
||||
LogKit.info("submitjob-PostJsonSubmitJob-getLoginCookies-result:{}", result); |
||||
} catch (Exception e) { |
||||
LogKit.error(e.getMessage(), e); |
||||
} |
||||
return loginCookie; |
||||
} |
||||
} |
@ -0,0 +1,41 @@
|
||||
/* |
||||
* Copyright (C), 2018-2020 |
||||
* Project: starter |
||||
* FileName: PostSubmitJob |
||||
* Author: xx |
||||
* Date: 2020/8/28 17:01 |
||||
*/ |
||||
package com.fr.plugin.xx.submitjob.job; |
||||
|
||||
import com.fanruan.api.log.LogKit; |
||||
import com.fr.plugin.xx.submitjob.kit.HttpKit; |
||||
import com.fr.script.Calculator; |
||||
import com.fr.third.springframework.web.util.HtmlUtils; |
||||
|
||||
import java.util.Map; |
||||
|
||||
/** |
||||
* <Function Description><br> |
||||
* <PostSubmitJob> |
||||
* |
||||
* @author xx |
||||
* @since 1.0.0 |
||||
*/ |
||||
public class PostSubmitJob extends AbstractDataSubmitJob { |
||||
private static final long serialVersionUID = -7229039666384758696L; |
||||
public static final String KEY = "PostSubmitJob"; |
||||
|
||||
/** |
||||
* 提交属性处理操作 |
||||
* |
||||
* @param params |
||||
* @throws Exception |
||||
*/ |
||||
@Override |
||||
public void operation(Map<String, String> params, Map<String, String> headers, Calculator calculator) throws Exception { |
||||
LogKit.info("submitjob-PostSubmitJob-operation-params:{}, headers:{}", params, headers); |
||||
String response = HttpKit.post(this.jobBean.getUrl(), params, headers); |
||||
LogKit.info("submitjob-PostSubmitJob-operation-response:{}", response); |
||||
throwErrorMessage(HtmlUtils.htmlUnescape(response), PostSubmitJob.KEY, this.jobBean); |
||||
} |
||||
} |
@ -0,0 +1,62 @@
|
||||
/* |
||||
* Copyright (C), 2018-2021 |
||||
* Project: starter |
||||
* FileName: GetTotalSubmitJob |
||||
* Author: xx |
||||
* Date: 2021/2/22 10:46 |
||||
*/ |
||||
package com.fr.plugin.xx.submitjob.job; |
||||
|
||||
import com.fanruan.api.i18n.I18nKit; |
||||
import com.fr.base.TemplateUtils; |
||||
import com.fr.general.ComparatorUtils; |
||||
import com.fr.json.JSONArray; |
||||
import com.fr.script.Calculator; |
||||
import com.fr.stable.StringUtils; |
||||
|
||||
import java.io.IOException; |
||||
import java.util.List; |
||||
import java.util.Map; |
||||
|
||||
/** |
||||
* <Function Description><br> |
||||
* <GetTotalSubmitJob> |
||||
* |
||||
* @author xx |
||||
* @since 1.0.0 |
||||
*/ |
||||
public class PostTotalSubmitJob extends AbstractDataTotalSubmitJob { |
||||
private static final long serialVersionUID = 3323384848317314231L; |
||||
public static final String KEY = "PostTotalSubmitJob"; |
||||
public static final String PARAMS_DATA = "paramsData"; |
||||
|
||||
@Override |
||||
public String getJobType() { |
||||
return PostTotalSubmitJob.KEY; |
||||
} |
||||
|
||||
/** |
||||
* 处理body内容 |
||||
* |
||||
* @param paramList |
||||
* @return |
||||
* @throws IOException |
||||
*/ |
||||
@Override |
||||
public String calculateContent(List<Map<String, String>> paramList, Calculator calculator) throws Exception { |
||||
if (StringUtils.isBlank(this.jobBean.getBodyContent())) { |
||||
return JSONArray.create(paramList).encode(); |
||||
} |
||||
return TemplateUtils.render(this.jobBean.getBodyContent(), PARAMS_DATA, JSONArray.create(paramList).encode()); |
||||
} |
||||
|
||||
@Override |
||||
public void checkHeader(Map<String, String> headers) throws Exception { |
||||
if (!headers.containsKey("Content-Type")){ |
||||
headers.put("Content-Type", "application/json"); |
||||
} |
||||
if (!ComparatorUtils.equalsIgnoreCase(headers.get("Content-Type"), "application/json")){ |
||||
throw new Exception(I18nKit.getLocText("Plugin-submitjob_Header_Content-Type_Valid")); |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,88 @@
|
||||
/* |
||||
* Copyright (C), 2018-2021 |
||||
* Project: starter |
||||
* FileName: SoapSubmitJob |
||||
* Author: xx |
||||
* Date: 2021/3/2 16:56 |
||||
*/ |
||||
package com.fr.plugin.xx.submitjob.job; |
||||
|
||||
import com.fanruan.api.i18n.I18nKit; |
||||
import com.fanruan.api.log.LogKit; |
||||
import com.fr.plugin.xx.submitjob.kit.HttpKit; |
||||
import com.fanruan.api.util.StringKit; |
||||
import com.fr.base.TemplateUtils; |
||||
import com.fr.general.ComparatorUtils; |
||||
import com.fr.script.Calculator; |
||||
import com.fr.third.org.apache.http.entity.StringEntity; |
||||
import com.fr.third.springframework.web.util.HtmlUtils; |
||||
|
||||
import java.io.IOException; |
||||
import java.util.Map; |
||||
|
||||
/** |
||||
* <Function Description><br> |
||||
* <SoapSubmitJob> |
||||
* |
||||
* @author xx |
||||
* @since 1.0.0 |
||||
*/ |
||||
public class SoapSubmitJob extends AbstractDataSubmitJob { |
||||
private static final long serialVersionUID = -1927219126342645238L; |
||||
public static final String KEY = "SoapSubmitJob"; |
||||
|
||||
@Override |
||||
public void checkParams() throws Exception { |
||||
super.checkParams(); |
||||
if (StringKit.isBlank(this.jobBean.getBodyContent())) { |
||||
throw new Exception(I18nKit.getLocText("Plugin-submitjob_Body_Content_Valid")); |
||||
} |
||||
} |
||||
|
||||
@Override |
||||
public void checkHeader(Map<String, String> headers) throws Exception { |
||||
checkSoapHeader(headers); |
||||
} |
||||
|
||||
/** |
||||
* 提交属性处理操作 |
||||
* |
||||
* @param params |
||||
* @param headers |
||||
* @param calculator |
||||
* @throws Exception |
||||
*/ |
||||
@Override |
||||
public void operation(Map<String, String> params, Map<String, String> headers, Calculator calculator) throws Exception { |
||||
String soapXml = calculateXML(params, calculator); |
||||
LogKit.info("submitjob-SoapSubmitJob-operation-soapXml:{}, headers:{}", soapXml, headers); |
||||
StringEntity stringEntity = new StringEntity(soapXml, "UTF-8"); |
||||
String response = HttpKit.executeAndParse(com.fanruan.api.net.http.rs.HttpRequest.custom().url(this.jobBean.getUrl()).post(stringEntity).headers(headers).build()); |
||||
LogKit.info("submitjob-SoapSubmitJob-operation-response:{}", HtmlUtils.htmlUnescape(response)); |
||||
throwErrorMessage(HtmlUtils.htmlUnescape(response), SoapSubmitJob.KEY, this.jobBean); |
||||
} |
||||
|
||||
/** |
||||
* 处理body内容 |
||||
* |
||||
* @param params |
||||
* @return |
||||
* @throws IOException |
||||
*/ |
||||
private String calculateXML(Map<String, String> params, Calculator calculator) throws Exception { |
||||
return TemplateUtils.render(this.jobBean.getBodyContent(), params, calculator); |
||||
} |
||||
|
||||
public static void checkSoapHeader(Map<String, String> headers) throws Exception { |
||||
if (!headers.containsKey("Content-Type")) { |
||||
headers.put("Content-Type", "text/xml;charset=UTF-8"); |
||||
} |
||||
if (!ComparatorUtils.equalsIgnoreCase(headers.get("Content-Type"), "application/soap+xml;charset=UTF-8") |
||||
&& !ComparatorUtils.equalsIgnoreCase(headers.get("Content-Type"), "text/xml;charset=UTF-8")) { |
||||
throw new Exception(I18nKit.getLocText("Plugin-submitjob_Header_Content-Type_Valid")); |
||||
} |
||||
if (StringKit.isBlank(headers.get("SOAPAction"))) { |
||||
throw new Exception(I18nKit.getLocText("Plugin-submitjob_Header_SOAPAction_Valid")); |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,81 @@
|
||||
/* |
||||
* Copyright (C), 2018-2021 |
||||
* Project: starter |
||||
* FileName: SoapTotalSubmitJob |
||||
* Author: xx |
||||
* Date: 2021/2/22 10:46 |
||||
*/ |
||||
package com.fr.plugin.xx.submitjob.job; |
||||
|
||||
import com.fanruan.api.i18n.I18nKit; |
||||
import com.fanruan.api.util.StringKit; |
||||
import com.fr.base.TemplateUtils; |
||||
import com.fr.general.ComparatorUtils; |
||||
import com.fr.json.JSONArray; |
||||
import com.fr.script.Calculator; |
||||
import com.fr.stable.StringUtils; |
||||
|
||||
import java.io.IOException; |
||||
import java.util.List; |
||||
import java.util.Map; |
||||
|
||||
/** |
||||
* <Function Description><br> |
||||
* <SoapTotalSubmitJob> |
||||
* |
||||
* @author xx |
||||
* @since 1.0.0 |
||||
*/ |
||||
public class SoapTotalSubmitJob extends AbstractDataTotalSubmitJob { |
||||
private static final long serialVersionUID = 3323384848317314231L; |
||||
public static final String KEY = "SoapTotalSubmitJob"; |
||||
public static final String TEMPLATE_SEPERATE = "##LOOP##"; |
||||
|
||||
@Override |
||||
public String getJobType() { |
||||
return SoapTotalSubmitJob.KEY; |
||||
} |
||||
|
||||
/** |
||||
* 检查参数值 |
||||
* |
||||
* @throws Exception |
||||
*/ |
||||
@Override |
||||
public void checkParams() throws Exception { |
||||
super.checkParams(); |
||||
if (StringKit.isBlank(this.jobBean.getBodyContent())) { |
||||
throw new Exception(I18nKit.getLocText("Plugin-submitjob_Body_Content_Valid")); |
||||
} |
||||
if (!ComparatorUtils.equals(this.jobBean.getBodyContent().split(TEMPLATE_SEPERATE).length, 3)) { |
||||
throw new Exception(I18nKit.getLocText("Plugin-submitjob_Body_Content_Format_Valid")); |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* 处理body内容 |
||||
* |
||||
* @param paramList |
||||
* @return |
||||
* @throws IOException |
||||
*/ |
||||
@Override |
||||
public String calculateContent(List<Map<String, String>> paramList, Calculator calculator) throws Exception { |
||||
if (StringUtils.isBlank(this.jobBean.getBodyContent())) { |
||||
return JSONArray.create(paramList).encode(); |
||||
} |
||||
String[] templateArray = this.jobBean.getBodyContent().split(TEMPLATE_SEPERATE); |
||||
StringBuilder bodyContent = new StringBuilder(); |
||||
bodyContent.append(TemplateUtils.render(templateArray[0], calculator)); |
||||
for (Map<String, String> params : paramList) { |
||||
bodyContent.append(TemplateUtils.render(templateArray[1], params, calculator)); |
||||
} |
||||
bodyContent.append(TemplateUtils.render(templateArray[2], calculator)); |
||||
return bodyContent.toString(); |
||||
} |
||||
|
||||
@Override |
||||
public void checkHeader(Map<String, String> headers) throws Exception { |
||||
SoapSubmitJob.checkSoapHeader(headers); |
||||
} |
||||
} |
@ -0,0 +1,718 @@
|
||||
/* |
||||
* Copyright (C), 2018-2021 |
||||
* Project: starter |
||||
* FileName: HttpKit |
||||
* Author: xx |
||||
* Date: 2021/3/17 14:19 |
||||
*/ |
||||
package com.fr.plugin.xx.submitjob.kit; |
||||
|
||||
import com.fanruan.api.log.LogKit; |
||||
import com.fanruan.api.macro.EncodeConstants; |
||||
import com.fanruan.api.net.http.rs.HttpRequest; |
||||
import com.fanruan.api.net.http.rs.*; |
||||
import com.fr.third.guava.collect.Maps; |
||||
import com.fr.third.org.apache.http.*; |
||||
import com.fr.third.org.apache.http.client.HttpRequestRetryHandler; |
||||
import com.fr.third.org.apache.http.client.config.RequestConfig; |
||||
import com.fr.third.org.apache.http.client.entity.UrlEncodedFormEntity; |
||||
import com.fr.third.org.apache.http.client.methods.CloseableHttpResponse; |
||||
import com.fr.third.org.apache.http.client.methods.HttpEntityEnclosingRequestBase; |
||||
import com.fr.third.org.apache.http.client.methods.HttpRequestBase; |
||||
import com.fr.third.org.apache.http.client.protocol.HttpClientContext; |
||||
import com.fr.third.org.apache.http.client.utils.URIBuilder; |
||||
import com.fr.third.org.apache.http.config.Registry; |
||||
import com.fr.third.org.apache.http.config.RegistryBuilder; |
||||
import com.fr.third.org.apache.http.conn.routing.HttpRoute; |
||||
import com.fr.third.org.apache.http.conn.socket.ConnectionSocketFactory; |
||||
import com.fr.third.org.apache.http.conn.socket.LayeredConnectionSocketFactory; |
||||
import com.fr.third.org.apache.http.conn.socket.PlainConnectionSocketFactory; |
||||
import com.fr.third.org.apache.http.conn.ssl.NoopHostnameVerifier; |
||||
import com.fr.third.org.apache.http.conn.ssl.SSLConnectionSocketFactory; |
||||
import com.fr.third.org.apache.http.conn.ssl.TrustSelfSignedStrategy; |
||||
import com.fr.third.org.apache.http.entity.FileEntity; |
||||
import com.fr.third.org.apache.http.entity.mime.HttpMultipartMode; |
||||
import com.fr.third.org.apache.http.entity.mime.MultipartEntityBuilder; |
||||
import com.fr.third.org.apache.http.impl.client.CloseableHttpClient; |
||||
import com.fr.third.org.apache.http.impl.client.HttpClients; |
||||
import com.fr.third.org.apache.http.impl.conn.PoolingHttpClientConnectionManager; |
||||
import com.fr.third.org.apache.http.message.BasicNameValuePair; |
||||
import com.fr.third.org.apache.http.protocol.HttpContext; |
||||
import com.fr.third.org.apache.http.ssl.SSLContexts; |
||||
import org.jetbrains.annotations.NotNull; |
||||
import org.jetbrains.annotations.Nullable; |
||||
|
||||
import javax.net.ssl.*; |
||||
import java.io.*; |
||||
import java.net.URI; |
||||
import java.net.URISyntaxException; |
||||
import java.net.URLEncoder; |
||||
import java.net.UnknownHostException; |
||||
import java.nio.charset.Charset; |
||||
import java.security.KeyManagementException; |
||||
import java.security.NoSuchAlgorithmException; |
||||
import java.security.cert.CertificateException; |
||||
import java.util.ArrayList; |
||||
import java.util.Collections; |
||||
import java.util.List; |
||||
import java.util.Map; |
||||
|
||||
import static com.fanruan.api.net.http.rs.HttpRequestType.POST; |
||||
|
||||
/** |
||||
* @author richie |
||||
* @version 10.0 |
||||
* Created by richie on 2019-08-29 |
||||
* <p> |
||||
* http请求工具类,封装了用于http请求的各种方法 |
||||
* 新增https忽略证书功能 Update By xx on 2021-03-17 |
||||
* </p> |
||||
*/ |
||||
public class HttpKit { |
||||
|
||||
private static final int RETRY_TIMES = 5; |
||||
private final static Object SYNC_LOCK = new Object(); |
||||
private static CloseableHttpClient httpClient = null; |
||||
|
||||
/** |
||||
* 根据请求地址创建HttpClient对象 |
||||
* |
||||
* @param url 请求地址 |
||||
* @return HttpClient对象 |
||||
*/ |
||||
public static CloseableHttpClient getHttpClient(String url) { |
||||
String hostname = url.split("/")[2]; |
||||
int port = 80; |
||||
if (hostname.contains(":")) { |
||||
String[] arr = hostname.split(":"); |
||||
hostname = arr[0]; |
||||
port = Integer.parseInt(arr[1]); |
||||
} |
||||
if (httpClient == null) { |
||||
synchronized (SYNC_LOCK) { |
||||
if (httpClient == null) { |
||||
try { |
||||
httpClient = createHttpClient(hostname, port, createIgnoreVerifySSL()); |
||||
} catch (NoSuchAlgorithmException e) { |
||||
LogKit.error(e.getMessage(), e); |
||||
} catch (KeyManagementException e) { |
||||
LogKit.error(e.getMessage(), e); |
||||
} |
||||
} |
||||
} |
||||
} |
||||
return httpClient; |
||||
} |
||||
|
||||
/** |
||||
* 新增了https 请求绕过证书认证 |
||||
* |
||||
* @return |
||||
* @throws NoSuchAlgorithmException |
||||
* @throws KeyManagementException |
||||
*/ |
||||
public static SSLContext createIgnoreVerifySSL() throws NoSuchAlgorithmException, KeyManagementException { |
||||
SSLContext sc = SSLContext.getInstance("SSLv3"); |
||||
// 实现一个X509TrustManager接口,用于绕过验证,不用修改里面的方法
|
||||
X509TrustManager trustManager = new X509TrustManager() { |
||||
@Override |
||||
public void checkClientTrusted( |
||||
java.security.cert.X509Certificate[] paramArrayOfX509Certificate, |
||||
String paramString) throws CertificateException { |
||||
} |
||||
|
||||
@Override |
||||
public void checkServerTrusted( |
||||
java.security.cert.X509Certificate[] paramArrayOfX509Certificate, |
||||
String paramString) throws CertificateException { |
||||
} |
||||
|
||||
@Override |
||||
public java.security.cert.X509Certificate[] getAcceptedIssuers() { |
||||
return null; |
||||
} |
||||
}; |
||||
sc.init(null, new TrustManager[]{trustManager}, null); |
||||
return sc; |
||||
} |
||||
|
||||
public static CloseableHttpClient createHttpClient(String hostname, int port, SSLContext sslContext) { |
||||
return createHttpClient(200, 40, 100, hostname, port, sslContext); |
||||
} |
||||
|
||||
private static CloseableHttpClient createHttpClient(int maxTotal, |
||||
int maxPerRoute, |
||||
int maxRoute, |
||||
String hostname, |
||||
int port, |
||||
SSLContext sslContext) { |
||||
ConnectionSocketFactory socketFactory = PlainConnectionSocketFactory.getSocketFactory(); |
||||
LayeredConnectionSocketFactory sslConnectionSocketFactory; |
||||
try { |
||||
sslConnectionSocketFactory = new SSLConnectionSocketFactory(SSLContexts.custom().loadTrustMaterial(null, new TrustSelfSignedStrategy()).build(), NoopHostnameVerifier.INSTANCE); |
||||
} catch (Exception e) { |
||||
LogKit.error(e.getMessage(), e); |
||||
sslConnectionSocketFactory = new SSLConnectionSocketFactory(sslContext, NoopHostnameVerifier.INSTANCE); |
||||
} |
||||
Registry<ConnectionSocketFactory> registry = RegistryBuilder |
||||
.<ConnectionSocketFactory>create() |
||||
.register("http", socketFactory) |
||||
.register("https", sslConnectionSocketFactory) |
||||
.build(); |
||||
PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager(registry); |
||||
// 将最大连接数增加
|
||||
cm.setMaxTotal(maxTotal); |
||||
// 将每个路由基础的连接增加
|
||||
cm.setDefaultMaxPerRoute(maxPerRoute); |
||||
HttpHost httpHost = new HttpHost(hostname, port); |
||||
// 将目标主机的最大连接数增加
|
||||
cm.setMaxPerRoute(new HttpRoute(httpHost), maxRoute); |
||||
|
||||
// 请求重试处理
|
||||
HttpRequestRetryHandler httpRequestRetryHandler = new HttpRequestRetryHandler() { |
||||
@Override |
||||
public boolean retryRequest(IOException exception, int executionCount, HttpContext context) { |
||||
if (executionCount >= RETRY_TIMES) {// 如果已经重试了5次,就放弃
|
||||
return false; |
||||
} |
||||
if (exception instanceof NoHttpResponseException) {// 如果服务器丢掉了连接,那么就重试
|
||||
return true; |
||||
} |
||||
if (exception instanceof SSLHandshakeException) {// 不要重试SSL握手异常
|
||||
return false; |
||||
} |
||||
if (exception instanceof InterruptedIOException) {// 超时
|
||||
return false; |
||||
} |
||||
if (exception instanceof UnknownHostException) {// 目标服务器不可达
|
||||
return false; |
||||
} |
||||
if (exception instanceof SSLException) {// SSL握手异常
|
||||
return false; |
||||
} |
||||
|
||||
HttpClientContext clientContext = HttpClientContext.adapt(context); |
||||
com.fr.third.org.apache.http.HttpRequest request = clientContext.getRequest(); |
||||
// 如果请求是幂等的,就再次尝试
|
||||
return !(request instanceof HttpEntityEnclosingRequest); |
||||
} |
||||
}; |
||||
|
||||
return HttpClients.custom() |
||||
.setConnectionManager(cm) |
||||
.setRetryHandler(httpRequestRetryHandler) |
||||
.build(); |
||||
} |
||||
|
||||
/** |
||||
* 设置 httpEntity |
||||
* |
||||
* @param requestBase 请求体 |
||||
* @param httpRequest 请求 |
||||
*/ |
||||
private static void setHttpEntity(@NotNull HttpEntityEnclosingRequestBase requestBase, @NotNull HttpRequest httpRequest) { |
||||
HttpEntity httpEntity = httpRequest.getHttpEntity(); |
||||
if (httpEntity != null) { |
||||
// 如果存在 httpEntity 直接设置
|
||||
requestBase.setEntity(httpEntity); |
||||
return; |
||||
} |
||||
Map<String, String> params = httpRequest.getParams(); |
||||
if (params == null || params.isEmpty()) { |
||||
return; |
||||
} |
||||
List<NameValuePair> pairs = new ArrayList<NameValuePair>(); |
||||
for (Map.Entry<String, String> entry : params.entrySet()) { |
||||
pairs.add(new BasicNameValuePair(entry.getKey(), entry.getValue())); |
||||
} |
||||
try { |
||||
requestBase.setEntity(new UrlEncodedFormEntity(pairs, httpRequest.getEncoding())); |
||||
} catch (UnsupportedEncodingException e) { |
||||
LogKit.error(e.getMessage(), e); |
||||
} |
||||
} |
||||
|
||||
private static <V> Map<String, String> transformMap(Map<String, V> oldMap) { |
||||
if (oldMap == null) { |
||||
return null; |
||||
} |
||||
return Maps.transformEntries(oldMap, new Maps.EntryTransformer<String, V, String>() { |
||||
@Override |
||||
public String transformEntry(@Nullable String key, @Nullable V value) { |
||||
return value == null ? null : value.toString(); |
||||
} |
||||
}); |
||||
} |
||||
|
||||
/** |
||||
* 发起POST请求并获取返回的文本 |
||||
* |
||||
* @param url 响应请求的的服务器地址 |
||||
* @param params POST请求的参数 |
||||
* @return 服务器返回的文本内容 |
||||
*/ |
||||
public static <V> String post(String url, Map<String, V> params) throws IOException { |
||||
return executeAndParse(HttpRequest |
||||
.custom() |
||||
.url(url) |
||||
.post(transformMap(params)) |
||||
.build()); |
||||
} |
||||
|
||||
/** |
||||
* 发起POST请求并获取返回的文本 |
||||
* |
||||
* @param url 响应请求的的服务器地址 |
||||
* @param params POST请求的参数 |
||||
* @param responseType 返回类型 |
||||
* @return 服务器返回的文本内容 |
||||
* @see com.fanruan.api.net.http.HttpKit#execute(HttpRequest) |
||||
*/ |
||||
@Deprecated |
||||
public static <T, V> T post(String url, Map<String, V> params, HttpResponseType<T> responseType) throws IOException { |
||||
CloseableHttpResponse response = execute(HttpRequest |
||||
.custom() |
||||
.url(url) |
||||
.post(transformMap(params)) |
||||
.build()); |
||||
return responseType.result(response, null); |
||||
} |
||||
|
||||
/** |
||||
* 发起POST请求并获取返回的文本 |
||||
* |
||||
* @param url 响应请求的的服务器地址 |
||||
* @param params POST请求的参数 |
||||
* @param headers 请求头 |
||||
* @return 服务器返回的文本内容 |
||||
* @see com.fanruan.api.net.http.HttpKit#executeAndParse(HttpRequest) |
||||
*/ |
||||
@Deprecated |
||||
public static <V> String post(String url, Map<String, V> params, Map<String, String> headers) throws IOException { |
||||
return executeAndParse(HttpRequest |
||||
.custom() |
||||
.url(url) |
||||
.post(transformMap(params)) |
||||
.headers(headers) |
||||
.build()); |
||||
} |
||||
|
||||
/** |
||||
* 发起POST请求并获取返回的文本 |
||||
* |
||||
* @param url 响应请求的的服务器地址 |
||||
* @param params POST请求的参数 |
||||
* @param headers 请求头 |
||||
* @param responseType 返回类型 |
||||
* @return 服务器返回的文本内容 |
||||
* @see com.fanruan.api.net.http.HttpKit#execute(HttpRequest) |
||||
*/ |
||||
@Deprecated |
||||
public static <T, V> T post(String url, Map<String, V> params, Map<String, String> headers, HttpResponseType<T> responseType) throws IOException { |
||||
CloseableHttpResponse response = execute(HttpRequest |
||||
.custom() |
||||
.url(url) |
||||
.post(transformMap(params)) |
||||
.headers(headers) |
||||
.build()); |
||||
return responseType.result(response, null); |
||||
} |
||||
|
||||
/** |
||||
* 发起POST请求并获取返回的文本 |
||||
* |
||||
* @param url 响应请求的的服务器地址 |
||||
* @param params POST请求的参数 |
||||
* @param responseEncoding 响应的文本的编码 |
||||
* @return 服务器返回的文本内容 |
||||
* @see com.fanruan.api.net.http.HttpKit#executeAndParse(HttpRequest, BaseHttpResponseHandle) |
||||
*/ |
||||
@Deprecated |
||||
public static <V> String post(String url, Map<String, V> params, String responseEncoding) throws IOException { |
||||
return executeAndParse(HttpRequest |
||||
.custom() |
||||
.url(url) |
||||
.post(transformMap(params)) |
||||
.build(), |
||||
new TextResponseHandle(responseEncoding)); |
||||
} |
||||
|
||||
/** |
||||
* 发起POST请求并获取返回的文本 |
||||
* |
||||
* @param url 响应请求的的服务器地址 |
||||
* @param params POST请求的参数 |
||||
* @param responseEncoding 响应的文本的编码 |
||||
* @param headers 请求头 |
||||
* @return 服务器返回的文本内容 |
||||
* @see com.fanruan.api.net.http.HttpKit#executeAndParse(HttpRequest, BaseHttpResponseHandle) |
||||
*/ |
||||
@Deprecated |
||||
public static <V> String post(String url, Map<String, V> params, String responseEncoding, Map<String, String> headers) throws IOException { |
||||
return executeAndParse(HttpRequest |
||||
.custom() |
||||
.url(url) |
||||
.post(transformMap(params)) |
||||
.headers(headers) |
||||
.build(), |
||||
new TextResponseHandle(responseEncoding)); |
||||
} |
||||
|
||||
|
||||
/** |
||||
* 发起POST请求并获取返回的文本 |
||||
* |
||||
* @param url 响应请求的的服务器地址 |
||||
* @param params POST请求的参数 |
||||
* @param responseEncoding 响应的文本的编码 |
||||
* @param paramsEncoding 参数编码 |
||||
* @param headers 请求头 |
||||
* @return 服务器返回的文本内容 |
||||
* @see com.fanruan.api.net.http.HttpKit#executeAndParse(HttpRequest, BaseHttpResponseHandle) |
||||
*/ |
||||
public static <V> String post(String url, Map<String, V> params, String responseEncoding, String paramsEncoding, Map<String, String> headers) throws IOException { |
||||
return executeAndParse(HttpRequest |
||||
.custom() |
||||
.url(url) |
||||
.post(transformMap(params)) |
||||
.encoding(paramsEncoding) |
||||
.headers(headers) |
||||
.build(), |
||||
new TextResponseHandle(responseEncoding)); |
||||
} |
||||
|
||||
/** |
||||
* 发起POST请求并获取返回的文本 |
||||
* |
||||
* @param url 响应请求的的服务器地址 |
||||
* @param params POST请求的参数 |
||||
* @param responseEncoding 响应的文本的编码 |
||||
* @param paramsEncoding 参数编码 |
||||
* @param headers 请求头 |
||||
* @param responseType 返回值类型 |
||||
* @return 服务器返回的文本内容 |
||||
* @see com.fanruan.api.net.http.HttpKit#execute(HttpRequest) |
||||
*/ |
||||
public static <T, V> T post(String url, Map<String, V> params, String responseEncoding, String paramsEncoding, Map<String, String> headers, HttpResponseType<T> responseType) throws IOException { |
||||
CloseableHttpResponse response = execute(HttpRequest |
||||
.custom() |
||||
.url(url) |
||||
.post(transformMap(params)) |
||||
.encoding(paramsEncoding) |
||||
.headers(headers) |
||||
.build()); |
||||
return responseType.result(response, responseEncoding); |
||||
} |
||||
|
||||
/** |
||||
* 发起GET请求并获取返回的文本 |
||||
* |
||||
* @param url 响应请求的的服务器地址 |
||||
* @return 服务器返回的文本内容 |
||||
*/ |
||||
public static String get(String url) throws IOException { |
||||
return executeAndParse(HttpRequest.custom().url(url).build()); |
||||
} |
||||
|
||||
/** |
||||
* 发起GET请求并获取返回的文本 |
||||
* |
||||
* @param url 响应请求的的服务器地址 |
||||
* @param params 参数 |
||||
* @return 服务器返回的文本内容 |
||||
*/ |
||||
public static String get(String url, Map<String, String> params) throws IOException { |
||||
return executeAndParse(HttpRequest.custom().url(url).params(params).build()); |
||||
} |
||||
|
||||
/** |
||||
* 发起GET请求并获取返回的文本 |
||||
* |
||||
* @param url 响应请求的的服务器地址 |
||||
* @param params 参数 |
||||
* @param headers 请求头 |
||||
* @return 服务器返回的文本内容 |
||||
* @see com.fanruan.api.net.http.HttpKit#executeAndParse(HttpRequest, BaseHttpResponseHandle) |
||||
*/ |
||||
public static String get(String url, Map<String, String> params, Map<String, String> headers) throws IOException { |
||||
return executeAndParse(HttpRequest.custom().url(url).params(params).headers(headers).build()); |
||||
} |
||||
|
||||
/** |
||||
* 发起GET请求并获取返回的文本 |
||||
* |
||||
* @param url 响应请求的的服务器地址 |
||||
* @param params 参数 |
||||
* @param responseEncoding 返回的文本的编码 |
||||
* @return 服务器返回的文本内容 |
||||
* @see com.fanruan.api.net.http.HttpKit#executeAndParse(HttpRequest, BaseHttpResponseHandle) |
||||
*/ |
||||
public static String get(String url, Map<String, String> params, String responseEncoding) throws IOException { |
||||
return executeAndParse(HttpRequest |
||||
.custom() |
||||
.url(url) |
||||
.params(params) |
||||
.build(), |
||||
new TextResponseHandle(responseEncoding)); |
||||
} |
||||
|
||||
/** |
||||
* 发起GET请求并获取返回的文本 |
||||
* |
||||
* @param url 响应请求的的服务器地址 |
||||
* @param params 参数 |
||||
* @param responseEncoding 返回的文本的编码 |
||||
* @return 服务器返回的文本内容 |
||||
* @see com.fanruan.api.net.http.HttpKit#executeAndParse(HttpRequest, BaseHttpResponseHandle) |
||||
*/ |
||||
public static String get(String url, Map<String, String> params, String responseEncoding, Map<String, String> headers) throws IOException { |
||||
return executeAndParse(HttpRequest |
||||
.custom() |
||||
.url(url) |
||||
.params(params) |
||||
.headers(headers) |
||||
.build(), |
||||
new TextResponseHandle(responseEncoding)); |
||||
} |
||||
|
||||
/** |
||||
* 从指定的地址下载文件 |
||||
* |
||||
* @param url 文件下载地址 |
||||
* @return 文件的字节流 |
||||
* @throws IOException 下载过程中出现错误则抛出此异常 |
||||
*/ |
||||
public static ByteArrayInputStream download(String url) throws IOException { |
||||
return executeAndParse(HttpRequest.custom().url(url).build(), StreamResponseHandle.DEFAULT); |
||||
} |
||||
|
||||
/** |
||||
* 从指定的地址下载文件 |
||||
* |
||||
* @param url 文件下载地址 |
||||
* @param params 参数对 |
||||
* @param responseEncoding 响应的文件编码 |
||||
* @param headers 请求头 |
||||
* @return 文件的字节流 |
||||
* @throws IOException 下载过程中出现错误则抛出此异常 |
||||
*/ |
||||
public static ByteArrayInputStream download(String url, Map<String, String> params, String responseEncoding, Map<String, String> headers) throws IOException { |
||||
return executeAndParse(HttpRequest |
||||
.custom() |
||||
.url(url) |
||||
.params(params) |
||||
.headers(headers) |
||||
.build(), |
||||
new StreamResponseHandle(responseEncoding)); |
||||
} |
||||
|
||||
/** |
||||
* 上传文件到指定的服务器 |
||||
* |
||||
* @param url 接收文件的服务器地址 |
||||
* @param file 要上传的文件,默认的文件编码为utf-8 |
||||
* @throws IOException 上传中出现错误则抛出此异常 |
||||
*/ |
||||
public static void upload(String url, File file) throws IOException { |
||||
upload(url, file, Charset.forName("utf-8")); |
||||
} |
||||
|
||||
/** |
||||
* 上传文件到指定的服务器 |
||||
* |
||||
* @param url 接收文件的服务器地址 |
||||
* @param file 要上传的文件 |
||||
* @param charset 文件的编码 |
||||
* @throws IOException 上传中出现错误则抛出此异常 |
||||
*/ |
||||
public static void upload(String url, File file, Charset charset) throws IOException { |
||||
upload(url, new FileEntity(file), charset); |
||||
} |
||||
|
||||
/** |
||||
* 上传文件到指定的服务器 |
||||
* |
||||
* @param url 接收文件的服务器地址 |
||||
* @param builder 附件构造器 |
||||
* @param charset 文件的编码 |
||||
* @throws IOException 上传中出现错误则抛出此异常 |
||||
*/ |
||||
public static void upload(String url, MultipartEntityBuilder builder, Charset charset) throws IOException { |
||||
upload(url, builder, charset, Collections.<String, String>emptyMap(), POST); |
||||
} |
||||
|
||||
/** |
||||
* 上传文件到指定的服务器 |
||||
* |
||||
* @param url 接收文件的服务器地址 |
||||
* @param fileEntity 文件实体 |
||||
* @param charset 文件的编码 |
||||
* @throws IOException 上传中出现错误则抛出此异常 |
||||
*/ |
||||
public static void upload(String url, FileEntity fileEntity, Charset charset) throws IOException { |
||||
upload(url, fileEntity, charset, Collections.<String, String>emptyMap(), POST); |
||||
} |
||||
|
||||
/** |
||||
* 上传多文件到指定的服务器 |
||||
* |
||||
* @param url 接收文件的服务器地址 |
||||
* @param builder 附件构造器 |
||||
* @param charset 文件的编码 |
||||
* @param headers 请求头 |
||||
* @param httpRequestType 请求类型 |
||||
* @throws IOException 上传中出现错误则抛出此异常 |
||||
*/ |
||||
public static void upload(String url, MultipartEntityBuilder builder, Charset charset, Map<String, String> headers, HttpRequestType httpRequestType) throws IOException { |
||||
// richie:采用浏览器模式,防止出现乱码
|
||||
builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE); |
||||
HttpEntity reqEntity = builder.setCharset(charset).build(); |
||||
upload(url, reqEntity, charset, headers, httpRequestType); |
||||
} |
||||
|
||||
/** |
||||
* 上传文件到指定的服务器 |
||||
* |
||||
* @param url 接收文件的服务器地址 |
||||
* @param reqEntity 请求实体 |
||||
* @param charset 文件的编码 |
||||
* @param headers 请求头 |
||||
* @param httpRequestType 请求类型 |
||||
* @throws IOException 上传中出现错误则抛出此异常 |
||||
*/ |
||||
public static void upload(String url, HttpEntity reqEntity, Charset charset, Map<String, String> headers, HttpRequestType httpRequestType) throws IOException { |
||||
executeAndParse(HttpRequest |
||||
.custom() |
||||
.url(url) |
||||
.headers(headers) |
||||
.method(httpRequestType) |
||||
.httpEntity(reqEntity) |
||||
.encoding(charset.toString()) |
||||
.build(), |
||||
UploadResponseHandle.DEFAULT); |
||||
} |
||||
|
||||
/** |
||||
* 请求资源或服务,使用默认文本http解析器,UTF-8编码 |
||||
* |
||||
* @param httpRequest httpRequest |
||||
* @return 返回处理结果 |
||||
*/ |
||||
public static String executeAndParse(HttpRequest httpRequest) throws IOException { |
||||
return executeAndParse(httpRequest, TextResponseHandle.DEFAULT); |
||||
} |
||||
|
||||
/** |
||||
* 请求资源或服务,自请求参数,并指定 http 响应处理器 |
||||
* 例: |
||||
* <pre> |
||||
* String res = HttpToolbox.executeAndParse(HttpRequest |
||||
* .custom() |
||||
* .url("") |
||||
* .build(), |
||||
* TextResponseHandle.DEFAULT); |
||||
* </pre> |
||||
* |
||||
* @param httpRequest httpRequest |
||||
* @param handle http 解析器 |
||||
* @return 返回处理结果 |
||||
*/ |
||||
public static <T> T executeAndParse(HttpRequest httpRequest, BaseHttpResponseHandle<T> handle) throws IOException { |
||||
return handle.parse(execute(httpRequest)); |
||||
} |
||||
|
||||
/** |
||||
* 请求资源或服务,传入请求参数 |
||||
* |
||||
* @param httpRequest httpRequest |
||||
* @return 返回处理结果 |
||||
*/ |
||||
public static CloseableHttpResponse execute(HttpRequest httpRequest) throws IOException { |
||||
return execute(getHttpClient(httpRequest.getUrl()), httpRequest); |
||||
} |
||||
|
||||
/** |
||||
* 请求资源或服务,自定义client对象,传入请求参数 |
||||
* |
||||
* @param httpClient http客户端 |
||||
* @param httpRequest httpRequest |
||||
* @return 返回处理结果 |
||||
*/ |
||||
public static CloseableHttpResponse execute(CloseableHttpClient httpClient, HttpRequest httpRequest) throws IOException { |
||||
String url = httpRequest.getUrl(); |
||||
|
||||
// 创建请求对象
|
||||
HttpRequestBase httpRequestBase = httpRequest.getMethod().createHttpRequest(url); |
||||
|
||||
// 设置header信息
|
||||
httpRequestBase.setHeader("User-Agent", "Mozilla/5.0"); |
||||
Map<String, String> headers = httpRequest.getHeaders(); |
||||
if (headers != null && !headers.isEmpty()) { |
||||
for (Map.Entry<String, String> entry : headers.entrySet()) { |
||||
httpRequestBase.setHeader(entry.getKey(), entry.getValue()); |
||||
} |
||||
} |
||||
|
||||
// 配置请求的设置
|
||||
RequestConfig requestConfig = httpRequest.getConfig(); |
||||
if (requestConfig != null) { |
||||
httpRequestBase.setConfig(requestConfig); |
||||
} |
||||
|
||||
// 判断是否支持设置entity(仅HttpPost、HttpPut、HttpPatch支持)
|
||||
if (HttpEntityEnclosingRequestBase.class.isAssignableFrom(httpRequestBase.getClass())) { |
||||
setHttpEntity((HttpEntityEnclosingRequestBase) httpRequestBase, httpRequest); |
||||
} else { |
||||
Map<String, String> params = httpRequest.getParams(); |
||||
if (params != null && !params.isEmpty()) { |
||||
// 注意get等不支持设置entity需要更新拼接之后的URL,但是url变量没有更新
|
||||
httpRequestBase.setURI(URI.create(buildUrl(url, params, httpRequest.getEncoding()))); |
||||
} |
||||
} |
||||
|
||||
return httpClient.execute(httpRequestBase); |
||||
} |
||||
|
||||
/** |
||||
* 构建 Url |
||||
* |
||||
* @param url 请求地址 |
||||
* @param params 参数 |
||||
* @return 拼接之后的地址 |
||||
*/ |
||||
public static String buildUrl(String url, Map<String, String> params) { |
||||
try { |
||||
return buildUrl(url, params, EncodeConstants.ENCODING_UTF_8); |
||||
} catch (UnsupportedEncodingException ignore) { |
||||
} |
||||
return url; |
||||
} |
||||
|
||||
|
||||
/** |
||||
* 构建 Url |
||||
* |
||||
* @param url 请求地址 |
||||
* @param params 参数 |
||||
* @return 拼接之后的地址 |
||||
* @throws UnsupportedEncodingException 不支持的编码 |
||||
*/ |
||||
private static String buildUrl(String url, Map<String, String> params, String paramsEncoding) throws UnsupportedEncodingException { |
||||
if (params == null || params.isEmpty()) { |
||||
return url; |
||||
} |
||||
URIBuilder builder; |
||||
try { |
||||
builder = new URIBuilder(url); |
||||
for (Map.Entry<String, String> entry : params.entrySet()) { |
||||
String key = URLEncoder.encode(entry.getKey(), paramsEncoding); |
||||
String value = URLEncoder.encode(entry.getValue(), paramsEncoding); |
||||
builder.setParameter(key, value); |
||||
} |
||||
return builder.build().toString(); |
||||
} catch (URISyntaxException e) { |
||||
LogKit.debug("Error to build url, please check the arguments."); |
||||
} |
||||
return url; |
||||
} |
||||
} |
@ -0,0 +1,28 @@
|
||||
/* |
||||
* Copyright (C), 2018-2021 |
||||
* Project: starter |
||||
* FileName: SubmitControllerBridge |
||||
* Author: xx |
||||
* Date: 2021/3/4 16:45 |
||||
*/ |
||||
package com.fr.plugin.xx.submitjob.request; |
||||
|
||||
import com.fr.decision.fun.impl.AbstractControllerRegisterProvider; |
||||
import com.fr.plugin.xx.submitjob.request.controller.SubmitJobController; |
||||
|
||||
/** |
||||
* <Function Description><br> |
||||
* <接口测试用途SubmitControllerBridge> |
||||
* |
||||
* @author xx |
||||
* @since 1.0.0 |
||||
*/ |
||||
public class SubmitControllerBridge extends AbstractControllerRegisterProvider { |
||||
|
||||
@Override |
||||
public Class[] getControllers() { |
||||
return new Class[]{ |
||||
SubmitJobController.class |
||||
}; |
||||
} |
||||
} |
@ -0,0 +1,100 @@
|
||||
/* |
||||
* Copyright (C), 2018-2021 |
||||
* Project: starter |
||||
* FileName: SubmitJobController |
||||
* Author: xx |
||||
* Date: 2021/3/4 16:51 |
||||
*/ |
||||
package com.fr.plugin.xx.submitjob.request.controller; |
||||
|
||||
import com.fanruan.api.log.LogKit; |
||||
import com.fr.decision.webservice.annotation.LoginStatusChecker; |
||||
import com.fr.third.springframework.stereotype.Controller; |
||||
import com.fr.third.springframework.web.bind.annotation.*; |
||||
|
||||
import java.io.UnsupportedEncodingException; |
||||
import java.net.URLDecoder; |
||||
|
||||
/** |
||||
* <Function Description><br> |
||||
* <测试接口SubmitJobController> |
||||
* |
||||
* @author xx |
||||
* @since 1.0.0 |
||||
*/ |
||||
@Controller |
||||
@RequestMapping("submitjob") |
||||
public class SubmitJobController { |
||||
|
||||
// submitjob
|
||||
@RequestMapping(value = "get", method = RequestMethod.GET) |
||||
@ResponseBody |
||||
@LoginStatusChecker(required = false) |
||||
public String submitjobGet(@RequestParam(value = "documentCode", required = true) String documentCode, |
||||
@RequestHeader(value = "token", required = true) String token, |
||||
@RequestParam(value = "VENDOR_CODE", required = true) String vendorCode) throws UnsupportedEncodingException { |
||||
LogKit.info("submitjob-测试接口-get, documentCode:" + URLDecoder.decode(documentCode, "UTF-8").replace("+", " ") |
||||
+ ", vendorCode:" + URLDecoder.decode(vendorCode, "UTF-8").replace("+", " ") |
||||
+ ", token:" + URLDecoder.decode(token, "UTF-8").replace("+", " ")); |
||||
return "{\"code\":0,\"message\":\"\",\"status\":\"OK\"}"; |
||||
} |
||||
|
||||
@RequestMapping(value = "post", method = RequestMethod.POST) |
||||
@ResponseBody |
||||
@LoginStatusChecker(required = false) |
||||
public String submitjobPost(@RequestParam(value = "documentCode", required = true) String documentCode, |
||||
// @RequestHeader(value = "token", required = true) String token,
|
||||
@RequestParam(value = "VENDOR_CODE", required = true) String vendorCode) { |
||||
LogKit.info("submitjob-测试接口-post, documentCode:" + documentCode + ", vendorCode:" + vendorCode); |
||||
return "{\"code\":0,\"message\":\"\",\"status\":\"OK\"}"; |
||||
} |
||||
|
||||
@RequestMapping(value = "post-json", method = RequestMethod.POST) |
||||
@ResponseBody |
||||
@LoginStatusChecker(required = false) |
||||
public String submitjobPostJson(@RequestBody String paramBody) { |
||||
LogKit.info("submitjob-测试接口-post, paramBody:" + paramBody); |
||||
return "{\"code\":0,\"message\":\"\",\"status\":\"OK\"}"; |
||||
} |
||||
|
||||
@RequestMapping(value = "post-total", method = RequestMethod.POST) |
||||
@ResponseBody |
||||
@LoginStatusChecker(required = false) |
||||
public String submitjobPostTotal(@RequestBody String paramBody) { |
||||
LogKit.info("submitjob-测试接口-post-total, paramBody:" + paramBody); |
||||
return "{\"code\":0,\"message\":\"\",\"status\":\"OK\"}"; |
||||
} |
||||
|
||||
@RequestMapping(value = "soap", method = RequestMethod.POST) |
||||
@ResponseBody |
||||
@LoginStatusChecker(required = false) |
||||
public String submitjobSoap(@RequestHeader(value = "Content-Type", required = true) String ContentType, |
||||
@RequestHeader(value = "SOAPAction", required = true) String SOAPAction, |
||||
@RequestBody String bodyContent) { |
||||
LogKit.info("submitjob-测试接口-soap, bodyContent:" + bodyContent + ", ContentType:" + ContentType + ", SOAPAction:" + SOAPAction); |
||||
return "{\"code\":0,\"message\":\"\",\"status\":\"OK\"}"; |
||||
} |
||||
|
||||
@RequestMapping(value = "soap-total", method = RequestMethod.POST) |
||||
@ResponseBody |
||||
@LoginStatusChecker(required = false) |
||||
public String submitjobSoapTotal(@RequestHeader(value = "Content-Type", required = true) String ContentType, |
||||
@RequestHeader(value = "SOAPAction", required = true) String SOAPAction, |
||||
@RequestBody String bodyContent) { |
||||
LogKit.info("submitjob-测试接口-soap-total, bodyContent:" + bodyContent + ", ContentType:" + ContentType + ", SOAPAction:" + SOAPAction); |
||||
return "{\"code\":0,\"message\":\"\",\"status\":\"OK\"}"; |
||||
} |
||||
|
||||
// submitjob
|
||||
@RequestMapping(value = "getError", method = RequestMethod.GET) |
||||
@ResponseBody |
||||
@LoginStatusChecker(required = false) |
||||
public String submitjobGetError(@RequestParam(value = "documentCode", required = true) String documentCode, |
||||
@RequestHeader(value = "token", required = true) String token, |
||||
@RequestParam(value = "VENDOR_CODE", required = true) String vendorCode) throws UnsupportedEncodingException { |
||||
LogKit.info("submitjob-测试接口-getError, documentCode:" + URLDecoder.decode(documentCode, "UTF-8").replace("+", " ") |
||||
+ ", vendorCode:" + URLDecoder.decode(vendorCode, "UTF-8").replace("+", " ") |
||||
+ ", token:" + URLDecoder.decode(token, "UTF-8").replace("+", " ")); |
||||
return "{\"code\":1,\"message\":\"运行错误异常\",\"status\":\"OK\"}"; |
||||
} |
||||
} |
@ -0,0 +1,197 @@
|
||||
/* |
||||
* Copyright (C), 2018-2020 |
||||
* Project: starter |
||||
* FileName: DataSubmitConfigPane |
||||
* Author: xx |
||||
* Date: 2020/8/31 21:59 |
||||
*/ |
||||
package com.fr.plugin.xx.submitjob.ui; |
||||
|
||||
import com.fanruan.api.design.ui.component.UILabel; |
||||
import com.fanruan.api.design.ui.component.UITextArea; |
||||
import com.fanruan.api.design.ui.component.UITextField; |
||||
import com.fanruan.api.design.ui.container.UIScrollPane; |
||||
import com.fanruan.api.design.ui.layout.TableLayoutKit; |
||||
import com.fanruan.api.i18n.I18nKit; |
||||
import com.fanruan.api.util.StringKit; |
||||
import com.fr.design.beans.BasicBeanPane; |
||||
import com.fr.design.designer.properties.items.Item; |
||||
import com.fr.design.gui.frpane.ObjectProperiesPane; |
||||
import com.fr.design.gui.frpane.UITabbedPane; |
||||
import com.fr.design.gui.icombobox.UIComboBox; |
||||
import com.fr.design.gui.itextfield.PlaceholderTextField; |
||||
import com.fr.design.layout.FRGUIPaneFactory; |
||||
import com.fr.design.utils.gui.GUICoreUtils; |
||||
import com.fr.general.ComparatorUtils; |
||||
import com.fr.plugin.xx.submitjob.SubmitUIBridge; |
||||
import com.fr.plugin.xx.submitjob.job.DataSubmitTask; |
||||
import com.fr.plugin.xx.submitjob.job.GetSubmitJob; |
||||
import com.fr.plugin.xx.submitjob.job.PostSubmitJob; |
||||
import com.fr.stable.CommonUtils; |
||||
|
||||
import javax.swing.*; |
||||
import java.awt.*; |
||||
import java.awt.event.ItemEvent; |
||||
import java.awt.event.ItemListener; |
||||
import java.util.List; |
||||
|
||||
/** |
||||
* <Function Description><br> |
||||
* <数据提交配置DataSubmitConfigPane> |
||||
* |
||||
* @author xx |
||||
* @since 1.0.0 |
||||
*/ |
||||
public class DataSubmitConfigPane extends BasicBeanPane<DataSubmitTask> { |
||||
public static final int CONTENT_PANE_INDEX = 2; |
||||
private static final int CONTENT_PANE_COLUMNS = 30; |
||||
private static String WATER_MARK = "decision/view/report"; |
||||
|
||||
protected UIComboBox classNameComboBox; |
||||
protected ObjectProperiesPane headerProperiesPane; |
||||
protected ObjectProperiesPane objectProperiesPane; |
||||
private UIComboBox stateComboBox; |
||||
private JTabbedPane tabbedPane; |
||||
private PlaceholderTextField linkField; |
||||
private UITextArea bodyContent; |
||||
private UITextField errorFlagTextField; |
||||
private UITextField successStatusTextField; |
||||
private UITextField errorMessageFlagTextField; |
||||
|
||||
public DataSubmitConfigPane() { |
||||
this.setLayout(FRGUIPaneFactory.createBorderLayout()); |
||||
JPanel classPathPane = FRGUIPaneFactory.createBoxFlowInnerContainer_S_Pane(); |
||||
this.classNameComboBox = initUIComboBox(DataSubmitItems.LIST_ITEMS); |
||||
this.classNameComboBox.addItemListener(new ItemListener() { |
||||
@Override |
||||
public void itemStateChanged(ItemEvent e) { |
||||
if (!ComparatorUtils.equals(e.getStateChange(), ItemEvent.SELECTED)) { |
||||
return; |
||||
} |
||||
if (ComparatorUtils.equals(e.getItem().toString(), I18nKit.getLocText("Plugin-submitjob_ClassName_Get_Submit")) || |
||||
ComparatorUtils.equals(e.getItem().toString(), I18nKit.getLocText("Plugin-submitjob_ClassName_Post_Submit"))) { |
||||
DataSubmitConfigPane.this.tabbedPane.setEnabledAt(CONTENT_PANE_INDEX, false); |
||||
} else { |
||||
DataSubmitConfigPane.this.tabbedPane.setEnabledAt(CONTENT_PANE_INDEX, true); |
||||
} |
||||
} |
||||
}); |
||||
this.stateComboBox = initUIComboBox(StateItems.LIST_ITEMS); |
||||
this.linkField = this.createHolderTextField(); |
||||
classPathPane.add(this.classNameComboBox); |
||||
classPathPane.add(this.stateComboBox); |
||||
classPathPane.add(this.linkField); |
||||
classPathPane.setBorder(GUICoreUtils.createTitledBorder(I18nKit.getLocText("Plugin-submitjob_ClassPath_Title"), null)); |
||||
this.add(classPathPane, BorderLayout.NORTH); |
||||
|
||||
this.headerProperiesPane = new ObjectProperiesPane(); |
||||
this.objectProperiesPane = new ObjectProperiesPane(); |
||||
|
||||
UIScrollPane bodyContentPane = new UIScrollPane(this.bodyContent = new UITextArea(5, CONTENT_PANE_COLUMNS)); |
||||
bodyContentPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); |
||||
UIScrollPane uiScrollPane = new UIScrollPane(bodyContentPane); |
||||
uiScrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); |
||||
|
||||
errorFlagTextField = new UITextField(); |
||||
successStatusTextField = new UITextField(); |
||||
errorMessageFlagTextField = new UITextField(); |
||||
double p = TableLayoutKit.PREFERRED; |
||||
double f = TableLayoutKit.FILL; |
||||
double[] rowSize = new double[]{p, p, p}; |
||||
double[] columnSize = new double[]{p, f}; |
||||
JComponent[][] comps = new JComponent[][]{ |
||||
{new UILabel(I18nKit.getLocText("Plugin-submitjob_Result_Error_Flag") + ":"), errorFlagTextField}, |
||||
{new UILabel(I18nKit.getLocText("Plugin-submitjob_Result_Success_Status") + ":"), successStatusTextField}, |
||||
{new UILabel(I18nKit.getLocText("Plugin-submitjob_Result_Error_Message_Flag") + ":"), errorMessageFlagTextField} |
||||
}; |
||||
JPanel resultContentPane = TableLayoutKit.createTableLayoutPane(comps, rowSize, columnSize); |
||||
|
||||
this.tabbedPane = new UITabbedPane(); |
||||
this.tabbedPane.add(I18nKit.getLocText("Plugin-submitjob_Body_Property"), this.objectProperiesPane); |
||||
this.tabbedPane.add(I18nKit.getLocText("Plugin-submitjob_Header_Property"), this.headerProperiesPane); |
||||
this.tabbedPane.add(I18nKit.getLocText("Plugin-submitjob_Body_Content"), uiScrollPane); |
||||
this.tabbedPane.add(I18nKit.getLocText("Plugin-submitjob_Result_Content"), resultContentPane); |
||||
this.add(this.tabbedPane, BorderLayout.CENTER); |
||||
|
||||
UITextArea description = new UITextArea(2, 1); |
||||
description.setText(I18nKit.getLocText("Plugin-submitjob_Basic_Extend_Class", "com.fr.data.AbstractSubmitTask")); |
||||
JPanel descriptionPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); |
||||
descriptionPane.add(description); |
||||
descriptionPane.setBorder(GUICoreUtils.createTitledBorder(I18nKit.getLocText("Plugin-submitjob_Basic_Custom_Job_Description"), null)); |
||||
this.add(descriptionPane, BorderLayout.SOUTH); |
||||
this.checkAddButtonEnable(); |
||||
} |
||||
|
||||
@Override |
||||
protected String title4PopupWindow() { |
||||
return SubmitUIBridge.KEY; |
||||
} |
||||
|
||||
@Override |
||||
public void populateBean(DataSubmitTask submitJob) { |
||||
if (CommonUtils.isNull(submitJob)) { |
||||
return; |
||||
} |
||||
this.classNameComboBox.setSelectedIndex(DataSubmitItems.classNameList.indexOf(submitJob.getClassName())); |
||||
if (ComparatorUtils.equals(submitJob.getClassName(), GetSubmitJob.class.getName()) |
||||
|| ComparatorUtils.equals(submitJob.getClassName(), PostSubmitJob.class.getName())) { |
||||
this.tabbedPane.setEnabledAt(CONTENT_PANE_INDEX, false); |
||||
} |
||||
this.stateComboBox.setSelectedIndex(StateItems.stateList.indexOf(submitJob.getState())); |
||||
this.linkField.setText(submitJob.getUrl()); |
||||
this.bodyContent.setText(submitJob.getBodyContent()); |
||||
this.errorFlagTextField.setText(submitJob.getErrorFlag()); |
||||
this.successStatusTextField.setText(submitJob.getSuccessStatus()); |
||||
this.errorMessageFlagTextField.setText(submitJob.getErrorMessageFlag()); |
||||
this.headerProperiesPane.populateBean(submitJob.getHeaderMap()); |
||||
this.objectProperiesPane.populateBean(submitJob.getPropertyMap()); |
||||
this.checkAddButtonEnable(); |
||||
} |
||||
|
||||
@Override |
||||
public DataSubmitTask updateBean() { |
||||
DataSubmitTask submitJob = new DataSubmitTask(DataSubmitItems.classNameList.get(this.classNameComboBox.getSelectedIndex())); |
||||
submitJob.setState(StateItems.stateList.get(this.stateComboBox.getSelectedIndex())); |
||||
submitJob.setUrl(this.linkField.getText()); |
||||
submitJob.setBodyContent(this.bodyContent.getText()); |
||||
submitJob.setErrorFlag(this.errorFlagTextField.getText()); |
||||
submitJob.setSuccessStatus(this.successStatusTextField.getText()); |
||||
submitJob.setErrorMessageFlag(this.errorMessageFlagTextField.getText()); |
||||
submitJob.setPropertyMap(this.objectProperiesPane.updateBean()); |
||||
submitJob.setHeaderMap(this.headerProperiesPane.updateBean()); |
||||
this.checkAddButtonEnable(); |
||||
return submitJob; |
||||
} |
||||
|
||||
@Override |
||||
public void checkValid() throws Exception { |
||||
if (StringKit.isBlank(this.linkField.getText())) { |
||||
throw new Exception(I18nKit.getLocText("Plugin-submitjob_Link_Valid")); |
||||
} |
||||
} |
||||
|
||||
public void checkAddButtonEnable() { |
||||
this.headerProperiesPane.enableAddButton(true); |
||||
this.objectProperiesPane.enableAddButton(true); |
||||
} |
||||
|
||||
private PlaceholderTextField createHolderTextField() { |
||||
PlaceholderTextField placeholderTextField = new PlaceholderTextField(CONTENT_PANE_COLUMNS); |
||||
placeholderTextField.setPlaceholder(WATER_MARK); |
||||
return placeholderTextField; |
||||
} |
||||
|
||||
/** |
||||
* 初始化类名下拉框 |
||||
* |
||||
* @param items |
||||
* @return |
||||
*/ |
||||
private UIComboBox initUIComboBox(List<Item> items) { |
||||
DefaultComboBoxModel model = new DefaultComboBoxModel(); |
||||
for (Item item : items) { |
||||
model.addElement(item); |
||||
} |
||||
return new UIComboBox(model); |
||||
} |
||||
} |
@ -0,0 +1,60 @@
|
||||
/* |
||||
* Copyright (C), 2018-2020 |
||||
* Project: starter |
||||
* FileName: DataSubmitItems |
||||
* Author: xx |
||||
* Date: 2020/9/1 8:47 |
||||
*/ |
||||
package com.fr.plugin.xx.submitjob.ui; |
||||
|
||||
import com.fanruan.api.i18n.I18nKit; |
||||
import com.fr.design.designer.properties.items.Item; |
||||
import com.fr.design.designer.properties.items.ItemProvider; |
||||
import com.fr.plugin.xx.submitjob.job.*; |
||||
|
||||
import java.util.ArrayList; |
||||
import java.util.List; |
||||
|
||||
/** |
||||
* <Function Description><br> |
||||
* <DataSubmitItems> |
||||
* |
||||
* @author xx |
||||
* @since 1.0.0 |
||||
*/ |
||||
public class DataSubmitItems implements ItemProvider { |
||||
|
||||
public static List<Item> LIST_ITEMS = new ArrayList<Item>() { |
||||
private static final long serialVersionUID = 4517273885238014305L; |
||||
|
||||
{ |
||||
add(new Item(I18nKit.getLocText("Plugin-submitjob_ClassName_Get_Submit"), GetSubmitJob.class.getName())); |
||||
add(new Item(I18nKit.getLocText("Plugin-submitjob_ClassName_Post_Submit"), PostSubmitJob.class.getName())); |
||||
add(new Item(I18nKit.getLocText("Plugin-submitjob_ClassName_Post_Json_Submit"), PostJsonSubmitJob.class.getName())); |
||||
add(new Item(I18nKit.getLocText("Plugin-submitjob_ClassName_Post_Total_Submit"), PostTotalSubmitJob.class.getName())); |
||||
add(new Item(I18nKit.getLocText("Plugin-submitjob_ClassName_Soap_Submit"), SoapSubmitJob.class.getName())); |
||||
add(new Item(I18nKit.getLocText("Plugin-submitjob_ClassName_Soap_Total_Submit"), SoapTotalSubmitJob.class.getName())); |
||||
} |
||||
}; |
||||
|
||||
public static List<String> classNameList = new ArrayList<String>() { |
||||
private static final long serialVersionUID = 1815958019785941089L; |
||||
|
||||
{ |
||||
add(GetSubmitJob.class.getName()); |
||||
add(PostSubmitJob.class.getName()); |
||||
add(PostJsonSubmitJob.class.getName()); |
||||
add(PostTotalSubmitJob.class.getName()); |
||||
add(SoapSubmitJob.class.getName()); |
||||
add(SoapTotalSubmitJob.class.getName()); |
||||
} |
||||
}; |
||||
|
||||
public DataSubmitItems() { |
||||
} |
||||
|
||||
@Override |
||||
public Item[] getItems() { |
||||
return LIST_ITEMS.toArray(new Item[0]); |
||||
} |
||||
} |
@ -0,0 +1,55 @@
|
||||
/* |
||||
* Copyright (C), 2018-2021 |
||||
* Project: starter |
||||
* FileName: StateItems |
||||
* Author: xx |
||||
* Date: 2021/2/22 16:56 |
||||
*/ |
||||
package com.fr.plugin.xx.submitjob.ui; |
||||
|
||||
import com.fanruan.api.i18n.I18nKit; |
||||
import com.fr.design.designer.properties.items.Item; |
||||
import com.fr.design.designer.properties.items.ItemProvider; |
||||
|
||||
import java.util.ArrayList; |
||||
import java.util.List; |
||||
|
||||
/** |
||||
* <Function Description><br> |
||||
* <StateItems> |
||||
* |
||||
* @author xx |
||||
* @since 1.0.0 |
||||
*/ |
||||
public class StateItems implements ItemProvider { |
||||
public static final String CHANGED = "Changed"; |
||||
public static final String INSERT = "Insert"; |
||||
public static final String DELETED = "Deleted"; |
||||
public static final String DEFAULT = "Default"; |
||||
public static List<Item> LIST_ITEMS = new ArrayList<Item>() { |
||||
private static final long serialVersionUID = 6046814757149293673L; |
||||
|
||||
{ |
||||
add(new Item(I18nKit.getLocText("Plugin-submitjob_State_Changed"), CHANGED)); |
||||
add(new Item(I18nKit.getLocText("Plugin-submitjob_State_Insert"), INSERT)); |
||||
add(new Item(I18nKit.getLocText("Plugin-submitjob_State_Deleted"), DELETED)); |
||||
add(new Item(I18nKit.getLocText("Plugin-submitjob_State_Default"), DEFAULT)); |
||||
} |
||||
}; |
||||
|
||||
public static List<String> stateList = new ArrayList<String>() { |
||||
private static final long serialVersionUID = 4772266674754035741L; |
||||
|
||||
{ |
||||
add("Changed"); |
||||
add("Insert"); |
||||
add("Deleted"); |
||||
add("Default"); |
||||
} |
||||
}; |
||||
|
||||
@Override |
||||
public Item[] getItems() { |
||||
return LIST_ITEMS.toArray(new Item[0]); |
||||
} |
||||
} |
@ -0,0 +1,30 @@
|
||||
Plugin-submitjob=Data Submit Job |
||||
Plugin-submitjob_Submit_Data=API Data Submit |
||||
Plugin-submitjob_ClassPath_Title=Submit Method & Cell State & Url |
||||
Plugin-submitjob_Header_Property=Header Property |
||||
Plugin-submitjob_Body_Property=Body Property |
||||
Plugin-submitjob_Body_Content=Body Content |
||||
Plugin-submitjob_Result_Content=Result Content |
||||
Plugin-submitjob_Result_Error_Flag=Error Flag |
||||
Plugin-submitjob_Result_Success_Status=Success Status |
||||
Plugin-submitjob_Result_Error_Message_Flag=Error Message Flag |
||||
Plugin-submitjob_ClassName_Get_Submit=Get |
||||
Plugin-submitjob_ClassName_Post_Submit=Post |
||||
Plugin-submitjob_ClassName_Post_Json_Submit=PostJson |
||||
Plugin-submitjob_ClassName_Post_Total_Submit=PostTotal |
||||
Plugin-submitjob_ClassName_Soap_Submit=Soap |
||||
Plugin-submitjob_ClassName_Soap_Total_Submit=SoapTotal |
||||
Plugin-submitjob_State_Changed=Changed |
||||
Plugin-submitjob_State_Insert=Insert |
||||
Plugin-submitjob_State_Deleted=Deleted |
||||
Plugin-submitjob_State_Default=Default |
||||
Plugin-submitjob_Link_Valid=URL is not empty |
||||
Plugin-submitjob_State_Valid=State is not empty |
||||
Plugin-submitjob_Body_Content_Valid=Body Template is not empty |
||||
Plugin-submitjob_Body_Content_Format_Valid=body Template Error |
||||
Plugin-submitjob_Header_Content-Type_Valid=Header Content-Type Error |
||||
Plugin-submitjob_Header_SOAPAction_Valid=Header SOAPAction Error |
||||
Plugin-submitjob_Result_Message=Result: |
||||
Plugin-submitjob_Licence_Expired=Submitjob Plugin Licence Expired |
||||
Plugin-submitjob_Basic_Extend_Class=Extend Class:{}. |
||||
Plugin-submitjob_Basic_Custom_Job_Description=Description |
@ -0,0 +1,30 @@
|
||||
Plugin-submitjob=Data Submit Job |
||||
Plugin-submitjob_Submit_Data=API Data Submit |
||||
Plugin-submitjob_ClassPath_Title=Submit Method & Cell State & Url |
||||
Plugin-submitjob_Header_Property=Header Property |
||||
Plugin-submitjob_Body_Property=Body Property |
||||
Plugin-submitjob_Body_Content=Body Content |
||||
Plugin-submitjob_Result_Content=Result Content |
||||
Plugin-submitjob_Result_Error_Flag=Error Flag |
||||
Plugin-submitjob_Result_Success_Status=Success Status |
||||
Plugin-submitjob_Result_Error_Message_Flag=Error Message Flag |
||||
Plugin-submitjob_ClassName_Get_Submit=Get |
||||
Plugin-submitjob_ClassName_Post_Submit=Post |
||||
Plugin-submitjob_ClassName_Post_Json_Submit=PostJson |
||||
Plugin-submitjob_ClassName_Post_Total_Submit=PostTotal |
||||
Plugin-submitjob_ClassName_Soap_Submit=Soap |
||||
Plugin-submitjob_ClassName_Soap_Total_Submit=SoapTotal |
||||
Plugin-submitjob_State_Changed=Changed |
||||
Plugin-submitjob_State_Insert=Insert |
||||
Plugin-submitjob_State_Deleted=Deleted |
||||
Plugin-submitjob_State_Default=Default |
||||
Plugin-submitjob_Link_Valid=URL is not empty |
||||
Plugin-submitjob_State_Valid=State is not empty |
||||
Plugin-submitjob_Body_Content_Valid=Body Template is not empty |
||||
Plugin-submitjob_Body_Content_Format_Valid=body Template Error |
||||
Plugin-submitjob_Header_Content-Type_Valid=Header Content-Type Error |
||||
Plugin-submitjob_Header_SOAPAction_Valid=Header SOAPAction Error |
||||
Plugin-submitjob_Result_Message=Result: |
||||
Plugin-submitjob_Licence_Expired=Submitjob Plugin Licence Expired |
||||
Plugin-submitjob_Basic_Extend_Class=Extend Class:{}. |
||||
Plugin-submitjob_Basic_Custom_Job_Description=Description |
@ -0,0 +1,30 @@
|
||||
Plugin-submitjob=\u586B\u62A5\u6570\u636E\u63A5\u53E3\u63D0\u4EA4 |
||||
Plugin-submitjob_Submit_Data=\u63A5\u53E3\u6570\u636E\u63D0\u4EA4 |
||||
Plugin-submitjob_ClassPath_Title=\u63D0\u4EA4\u65B9\u5F0F & \u5355\u5143\u683C\u72B6\u6001 & \u94FE\u63A5 |
||||
Plugin-submitjob_Header_Property=Header\u53C2\u6570 |
||||
Plugin-submitjob_Body_Property=Body\u53C2\u6570 |
||||
Plugin-submitjob_Body_Content=Body\u5185\u5BB9 |
||||
Plugin-submitjob_Result_Content=\u8FD4\u56DE\u7ED3\u679C |
||||
Plugin-submitjob_Result_Error_Flag=\u9519\u8BEF\u6807\u8BC6 |
||||
Plugin-submitjob_Result_Success_Status=\u6210\u529F\u72B6\u6001\u503C |
||||
Plugin-submitjob_Result_Error_Message_Flag=\u9519\u8BEF\u4FE1\u606F\u6807\u8BC6 |
||||
Plugin-submitjob_ClassName_Get_Submit=Get |
||||
Plugin-submitjob_ClassName_Post_Submit=Post |
||||
Plugin-submitjob_ClassName_Post_Json_Submit=PostJson |
||||
Plugin-submitjob_ClassName_Post_Total_Submit=PostTotal |
||||
Plugin-submitjob_ClassName_Soap_Submit=Soap |
||||
Plugin-submitjob_ClassName_Soap_Total_Submit=SoapTotal |
||||
Plugin-submitjob_State_Changed=\u53D8\u66F4 |
||||
Plugin-submitjob_State_Insert=\u65B0\u589E |
||||
Plugin-submitjob_State_Deleted=\u5220\u9664 |
||||
Plugin-submitjob_State_Default=\u9ED8\u8BA4 |
||||
Plugin-submitjob_Link_Valid=\u94FE\u63A5\u4E0D\u80FD\u4E3A\u7A7A |
||||
Plugin-submitjob_State_Valid=\u72B6\u6001\u4E0D\u80FD\u4E3A\u7A7A |
||||
Plugin-submitjob_Body_Content_Valid=body\u6A21\u677F\u4E0D\u80FD\u4E3A\u7A7A |
||||
Plugin-submitjob_Body_Content_Format_Valid=body\u6A21\u677F\u683C\u5F0F\u9519\u8BEF |
||||
Plugin-submitjob_Header_Content-Type_Valid=Header\u53C2\u6570Content-Type\u4E3A\u7A7A\u6216\u9519\u8BEF |
||||
Plugin-submitjob_Header_SOAPAction_Valid=Header\u53C2\u6570SOAPAction\u4E3A\u7A7A\u6216\u9519\u8BEF |
||||
Plugin-submitjob_Result_Message=\u7ED3\u679C: |
||||
Plugin-submitjob_licence_Expired=\u586B\u62A5\u6570\u636E\u63A5\u53E3\u63D0\u4EA4\u63D2\u4EF6\u6388\u6743\u8BB8\u53EF\u8FC7\u671F |
||||
Plugin-submitjob_Basic_Extend_Class=\u7EE7\u627F\u7C7B:{}\u3002 |
||||
Plugin-submitjob_Basic_Custom_Job_Description=\u63CF\u8FF0 |
Loading…
Reference in new issue