该设计一共五个类
接口类,接口实现类,回调类,结果类,异常类。
项目代码见附件
1.JcoTemplate接口类
/**
*
*/
package com.youisoft.sap;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.commons.logging.Log;
import com.sap.conn.jco.JCoDestination;
import com.sap.conn.jco.JCoDestinationManager;
import com.sap.conn.jco.JCoException;
import com.sap.conn.jco.JCoFunction;
import com.sap.conn.jco.JCoStructure;
import com.sap.conn.jco.JCoTable;
/**
* @author janly
*
*/
public abstract class JcoTemplate {
protected static Log logger=org.apache.commons.logging.LogFactory.getLog(JcoTemplate.class);
private String jcoproperties;
public void init(){
if(jcoproperties!=null) this.addJcoDestinationData(JcoTemplate.class.getSimpleName(),jcoproperties);
}
public void setJcoproperties(String jcoproperties) {
this.jcoproperties = jcoproperties;
}
public abstract void removeJcoDestinationData(String destinationName);
public abstract void addJcoDestinationData(String destinationName,java.util.Properties jcoproperties);
public void addJcoDestinationData(String destinationName){
URL url=Thread.currentThread().getContextClassLoader().getResource("jco3.properties");
this.addJcoDestinationData(destinationName, url.getFile());
}
public void addJcoDestinationData(String destinationName,String jcoproperties){
InputStream fis=null;
try {
fis=new FileInputStream(jcoproperties);
java.util.Properties properties = new java.util.Properties();
properties.load(fis);
this.addJcoDestinationData(destinationName, properties);
} catch (Exception e) {
logger.error(e);
}finally{
try {
if(fis!=null) fis.close();
} catch (IOException e) {
}
}
}
public final JCoDestination getJcoDestination(String destinationName) throws SapException{
try {
return JCoDestinationManager.getDestination(destinationName);
} catch (JCoException e) {
logger.error(e);
throw new SapException(e);
}
}
public final void callFunctionForParameterInTableAndStructure(final String destinationName,
final String rfcName,JcoCallback jcoCallback) throws SapException{
if (rfcName == null) {
throw new SapException("rfcName is empty");
}
try {
JCoFunction function = JCoDestinationManager.getDestination(destinationName).getRepository().getFunction(rfcName);
jcoCallback.beforeInvoke(function);
long be=System.currentTimeMillis();
function.execute(JCoDestinationManager.getDestination(destinationName));
long en=System.currentTimeMillis();
logger.debug("rfcName:"+rfcName+",time:"+(en-be));
jcoCallback.afterInvoke(function);
} catch (Exception e) {
logger.error(e);
throw new SapException(e);
}
}
public final SapResult callFunctionForParameterInTableAndStructure(
final String destinationName,
final String rfcName,
final Map<String, String> inParams,
final String[] inParamsStructureNames,
final Map<String, String>[] inParamsStructureValues,
final String[] inParamsTableNames,
final List<Map<String, String>>[] inParamsTableValues,
final String[] returnParameterColumns,
final String[] returnParamsStructureNames,
final List<String>[] returnParamsStructureColumns,
final String[] returnTableNames,
final List<String>[] returnTableColumns)
throws SapException{
final SapResult sapResult=new SapResult();
this.callFunctionForParameterInTableAndStructure(destinationName,rfcName, new JcoCallback(){
public void beforeInvoke(JCoFunction function) {
if (inParams != null) {
Set<String> inParamsKeys = inParams.keySet();
for (String inParamsKey : inParamsKeys)
function.getImportParameterList().setValue(inParamsKey,
inParams.get(inParamsKey));
}
if (inParamsStructureNames != null) {
String inStructureName = null;
Set<String> columnSet;
for (int i = 0; i < inParamsStructureNames.length; i++) {
inStructureName = inParamsStructureNames[i];
Map<String, String> inStructureValues = inParamsStructureValues[i];
JCoStructure inStructure = function.getImportParameterList()
.getStructure(inStructureName);
columnSet = inStructureValues.keySet();
for (String columnName : columnSet) {
inStructure.setValue(columnName,
inStructureValues.get(columnName));
}
}
}
if (inParamsTableNames != null) {
Set<String> columnSet;
for (int i = 0; i < inParamsTableNames.length; i++) {
String inTableName = inParamsTableNames[i];
List<Map<String, String>> inTableValues = inParamsTableValues[i];
JCoTable inTable = function.getTableParameterList().getTable(
inTableName);
for (Map<String, String> rowMap : inTableValues) {
inTable.appendRow();
columnSet = rowMap.keySet();
for (String columnName : columnSet)
inTable.setValue(columnName, rowMap.get(columnName));
}
}
}
}
public void afterInvoke(JCoFunction function) {
if (returnParameterColumns != null) {
Map<String, String> retRecords = new HashMap<String, String>();
for (int i = 0; i < returnParameterColumns.length; i++) {
String columnName = returnParameterColumns[i];
Object value = function.getExportParameterList().getValue(
columnName);
retRecords.put(columnName, value==null?null:value.toString());
}
sapResult.setResultParams(retRecords);
}
if (returnParamsStructureNames != null) {
Map<String, Map<String, String>> resultStructures = new HashMap<String, Map<String, String>>();
for (int i = 0; i < returnParamsStructureNames.length; i++) {
resultStructures.put(returnParamsStructureNames[i],new HashMap<String, String>());
JCoStructure js = function.getExportParameterList().getStructure(returnParamsStructureNames[i]);
for (int j = 0; j < returnParamsStructureColumns[i].size(); j++) {
Object obj=js.getValue(returnParamsStructureColumns[i].get(j));
resultStructures.get(returnParamsStructureNames[i]).put(
returnParamsStructureColumns[i].get(j),obj==null?null:obj.toString());
}
}
sapResult.setResultStructures(resultStructures);
}
if (returnTableNames != null) {
Map<String,List<Map<String, String>>> retTableRecords = new HashMap<String,List<Map<String, String>>>();
for (int i = 0; i < returnTableNames.length; i++) {
JCoTable table = function.getTableParameterList().getTable(returnTableNames[i]);
List<Map<String, String>> records = new ArrayList<Map<String, String>>();
if (table != null)
for (int k = 0; k < table.getNumRows(); k++) {
table.setRow(k);
Map<String, String> recordRow = new HashMap<String, String>();
for (int j = 0; j < returnTableColumns[i].size(); j++) {
Object obj=table.getValue(returnTableColumns[i].get(j));
recordRow.put(returnTableColumns[i].get(j),obj==null?null:obj.toString() );
}
records.add(recordRow);
}
retTableRecords.put(returnTableNames[i], records);
}
sapResult.setResultTables(retTableRecords);
}
}
});
return sapResult;
}
}
2.模板实现类
package com.youisoft.sap;
import java.util.HashMap;
import java.util.Properties;
import java.util.concurrent.Semaphore;
import com.sap.conn.jco.ext.DestinationDataEventListener;
import com.sap.conn.jco.ext.DestinationDataProvider;
import com.sap.conn.jco.ext.Environment;
/**
* @author janly
*
*/
public class DefaultJcoTemplate extends JcoTemplate{
private static DefaultDestinationDataProvider defaultDestinationDataProvider=new DefaultDestinationDataProvider();
private static Semaphore semaphore=new Semaphore(1);
static {
defaultDestinationDataProvider.setDestinationDataEventListener(new DestinationDataEventListener(){
public void deleted(String arg0) {
logger.info("deleted:"+arg0);
}
public void updated(String arg0) {
logger.info("updated:"+arg0);
}
});
Environment.registerDestinationDataProvider(defaultDestinationDataProvider);
}
public void removeJcoDestinationData(String destinationName){
defaultDestinationDataProvider.deleteDestination(destinationName);
}
@Override
public void addJcoDestinationData(String destinationName,java.util.Properties jcoproperties){
try {
semaphore.acquire();
if(defaultDestinationDataProvider.getDestinationProperties(destinationName)==null){
logger.info("Add destinationName:"+destinationName+",jcoproperties:"+jcoproperties);
defaultDestinationDataProvider.addDestination(destinationName, jcoproperties);
}else{
logger.info("destinationName:"+destinationName+" alread exist");
}
} catch (Exception e) {
logger.error(e);
}finally{
semaphore.release();
}
}
private static class DefaultDestinationDataProvider implements DestinationDataProvider {
private DestinationDataEventListener destinationDataEventListener;
private HashMap<String, Properties> destinations=new HashMap<String, Properties>();
private DefaultDestinationDataProvider(){
}
public Properties getDestinationProperties(String arg0) {
return this.destinations.get(arg0);
}
public void setDestinationDataEventListener(
DestinationDataEventListener arg0) {
destinationDataEventListener=arg0;
}
public boolean supportsEvents() {
return true;
}
public void addDestination(String destinationName, Properties properties) {
destinationDataEventListener.updated(destinationName);
synchronized (destinations) {
destinations.put(destinationName, properties);
}
}
public void deleteDestination(String destinationName) {
destinationDataEventListener.deleted(destinationName);
synchronized (destinations) {
destinations.remove(destinationName);
}
}
}
}
3.模板回调类
/**
*
*/
package com.youisoft.sap;
import com.sap.conn.jco.JCoFunction;
/**
* @author janly
*
*/
public interface JcoCallback {
public void beforeInvoke(JCoFunction function) throws Exception;
public void afterInvoke(JCoFunction function) throws Exception;
}
4.结果返回类
/**
*
*/
package com.youisoft.sap;
import java.util.List;
import java.util.Map;
/**
* @author janly
*
*/
public final class SapResult {
private Map<String, String> resultParams;
private Map<String,List<Map<String, String>>> resultTables;
private Map<String, Map<String, String>> resultStructures;
public Map<String, String> getResultParams()
{
return this.resultParams;
}
public void setResultParams(Map<String, String> resultParams) {
this.resultParams = resultParams;
}
public final Map<String, List<Map<String, String>>> getResultTables() {
return resultTables;
}
public final void setResultTables(
Map<String, List<Map<String, String>>> resultTables) {
this.resultTables = resultTables;
}
public Map<String, Map<String, String>> getResultStructures() {
return this.resultStructures;
}
public void setResultStructures(Map<String, Map<String, String>> resultStructures) {
this.resultStructures = resultStructures;
}
}
5.异常类
/**
*
*/
package com.youisoft.sap;
/**
* @author janly
*
*/
public class SapException extends Exception {
/**
*
*/
private static final long serialVersionUID = 1L;
public SapException(String message){
super(message);
}
public SapException(Throwable cause) {
super(cause);
}
}
相关推荐
在 SAP UI5 开发中,通用组件(commons)是开发者常用的一类元素,它们提供了许多基本的用户界面功能,能够帮助构建高效、易用的应用。本资料主要关注 SAP UI5 的通用组件及其在实际开发中的应用示例。 SAP UI5 是...
在SAP ABAP环境中,通用接口日志和RESTful动态调用FM是两个重要的概念,它们在企业级应用开发中发挥着关键作用。本文将详细阐述这两个知识点,并结合RESTful服务,探讨它们如何协同工作。 首先,让我们了解SAP ABAP...
本培训PPT将深入探讨如何有效地设计和管理SAP权限,以便在保障业务流程顺畅的同时,防止未授权访问和误操作。以下是对SAP权限设计关键知识点的详细阐述: 1. **权限基础理论**:理解SAP权限的基础始于了解SAP的用户...
- **寻找合适的表格策略**:提供了几种查找相关表格的方法,包括逻辑数据库搜索和通用表格搜索。 - **调用和准备表格数据**:指导如何选择显示的数据项、选择字段、排序数据以及将数据下载到Excel等外部工具中。 ...
在SAP系统中,权限管理是一项至关重要的任务,它确保了不同用户只能访问和操作他们被授权的数据和功能。本文将深入探讨SAP权限的各个方面,帮助读者理解其核心概念和工作原理。 首先,权限的基本理念是“允许”和...
- **通用数据获取增强 BI Content DataSource**: - 增量管理: 如何处理增量数据。 - **平面文件的传输**: - **传输方法**: - 文件格式要求。 - 传输流程。 - 错误处理机制。 以上是SAP BW的关键知识点概述,...
SAP Fiori 是一种全新的用户界面设计原则和技术框架,旨在为用户提供直观、简洁和一致的体验。本文档将详细介绍如何通过手动配置步骤或使用预定义任务列表来实现SAP Fiori应用程序的快速部署。此外,还将针对SAP ...
在处理这份关于Cisco AIR-SAP1602i设置手册的资料时,首先需要注意的是,Cisco AIR-SAP1602i是一种无线接入点设备,它属于Cisco Aironet 系列,具备通用访问点(Universal Access Points)的特点。通用访问点是一种...
- **通用架构:** - SAP Control Framework提供了一种标准化的方法来处理GUI元素。 - 它基于类层次结构,支持自定义控件的创建和集成。 - 控制框架的核心是容器控件和Enjoy SAP Control,它们可以嵌入到ABAP对话...
9. 安全性:WDA集成了SAP的安全性机制,因此在开发过程中可以方便地应用角色和权限管理,确保只有授权的用户才能访问敏感功能或数据。 10. 应用生命周期管理:WDA提供了强大的版本控制和配置管理功能,帮助开发者和...
虽然联想LENOVO有自己的HANA方案,但其方案并非SAP通用实施的合作伙伴范围之内。据官方文档显示,HP的硬件在文档中排在首位。 SAP HANA的架构设计与众不同,它不仅仅是一个数据库,而是一个全新的基于内存计算的...
BOPF提供了业务对象实现的集成功能,并通过设计形成了一个通用的编程模型。它控制应用程序业务逻辑以及缓冲区和持久层的数据检索。主要的设计原则是清晰地分离业务逻辑与缓冲区。 创建一个简单的业务对象(BO)包括...
- **ODBC(Open Database Connectivity)**:作为数据库访问的通用标准,ODBC驱动程序使得任何支持ODBC的应用程序都可以与HANA进行通信。Windows上的应用程序,如Excel或Python的pyodbc库,可以通过ODBC驱动连接到...
它帮助管理员了解用户的访问级别及其在 SAP 系统内的操作权限。 - **操作步骤**: - 输入要查询的用户名; - 查看该用户的所有权限对象; - 分析权限设置是否符合安全策略和业务需求。 #### St22:查看 Dump ...
- **定义:** 授权对象是SAP系统中用于控制用户访问特定功能或数据的最小单元。 - **作用:** 每个事务代码的执行都需要一组授权对象的支持。如果缺少任何一个授权对象,用户都无法成功执行该事务代码。 - **示例:** ...
SAP-1 CPU可能包含简单的寻址模式,如直接寻址或立即寻址,允许访问内存中的数据或直接使用指令中的数值。指令集通常包括基本的算术和逻辑操作,如加法、减法、转移等。 3. **三态输出(Three-state Output)**: ...
SAP BW/4 HANA是SAP公司推出的一款企业数据仓库解决方案,它是专门为满足现代企业对数据处理速度、灵活性和实时性要求而设计的产品。在介绍SAP BW/4 HANA之前,我们需要先了解数据仓库的概念,以及为什么企业需要...
- **入口设计**:优化用户的初次登录体验,确保用户可以轻松地访问到常用功能。 - **系统结构**:介绍SAP R/3系统的整体架构,帮助理解各个模块之间的关系。 - **导航机制**:提供清晰的导航路径,使用户在系统内...
- **数据库抽象层**:提供了一种通用的方法来访问数据库,使得应用程序能够独立于具体的数据库实现。 - **Web Dynpro**:一种用于快速构建用户界面的技术。 - **Web 服务基础设施**:支持 SOAP、WSDL 等协议,便于与...