provision接口 作者:mouse 时间:06-02-05 16:17
附件:
用java写的,不知道你能用上不能.
这是主要的类,需要的类,都是一些工具方法,你自己写吧,主要是对soap包进行解析的.
package com.cellcom.wap.fala.common ;
import java.io.bufferedreader ;
import java.io.ioexception ;
import java.io.printwriter ;
import javax.servlet.servletexception ;
import javax.servlet.http.httpservlet ;
import javax.servlet.http.httpservletrequest ;
import javax.servlet.http.httpservletresponse ;
import javax.xml.parsers.documentbuilder ;
import javax.xml.parsers.documentbuilderfactory ;
import javax.xml.parsers.factoryconfigurationerror ;
import javax.xml.parsers.parserconfigurationexception ;
import org.w3c.dom.document ;
import org.xml.sax.inputsource ;
import org.xml.sax.saxexception ;
import com.cellcom.common.wap.mobile.misc.domparsing ;
import com.cellcom.common.wap.mobile.misc.dsmpserviceprov ;
import com.cellcom.common.wap.mobile.misc.syncorderrelationresp ;
import com.cellcom.common.wap.mobile.misc.unsubscribeserviceresp ;
import com.cellcom.common.wap.mobile.misc.provtransinterface ;
/**
*
title: wap.fala.cn
*
description: 接收
*
copyright: copyright (c) 2005
*
company: www.cellcom.com.cn
* @author cabin
* @version 1.0
*/
public class provision
extends httpservlet {
public provision() {
}
private static final string content_type = "text/xml" ;
public void service(httpservletrequest request, httpservletresponse response)
throws
servletexception, ioexception {
response.setcontenttype(content_type) ;
dsmpserviceprov prov = this.parsereq(request) ;
if (prov != null) {
this.logandsync(prov);
this.respreq(response,prov,0);
}
}
/**
* 将请求的soap包进行解析封装
* @param request
* @return
*/
private dsmpserviceprov parsereq(httpservletrequest request) {
dsmpserviceprov prov = null ;
document doc = null ;
try {
bufferedreader br = request.getreader() ;
documentbuilderfactory factory = documentbuilderfactory
.newinstance() ;
documentbuilder builder = factory.newdocumentbuilder() ;
doc = builder.parse(new inputsource(br)) ;
domparsing.printnode(doc, " ") ;
doc.normalize() ;
//对包进行解析,得到相应的包的内容prov
prov = dsmpserviceprov.parsesoapxml(doc) ;
}
catch (saxexception ex) {
system.out.println("## error saxexception:"+ex.tostring());
}
catch (parserconfigurationexception ex) {
system.out.println("## error parserconfigurationexception:"+ex.tostring());
}
catch (factoryconfigurationerror ex) {
system.out.println("## error factoryconfigurationerror:"+ex.tostring());
}
catch (ioexception ex) {
system.out.println("## error ioexception:"+ex.tostring());
}
return prov;
}
public void logandsync(dsmpserviceprov prov){
//业务处理
// 状态管理命令结果 errstate : 0 命令成功; -1 无效的action_id;-2 无效的service_id
//(其它任何非0值) 命令失败;
//action : 1 开通; 2 停止; 3 激活 4 暂停
provtransinterface provtrans = new provtranshandler() ;
provtrans.logprovtrans(prov) ;
provtrans.syncprov(prov) ;
}
public void respreq(httpservletresponse response,dsmpserviceprov prov,int errstate){
string sb = null ;
printwriter out = null ;
try {
out = response.getwriter() ;
}
catch (ioexception ex) {
system.out.println(ex.tostring());
}
if ("syncorderrelationreq".equals(prov.getmsgtype())) {
sb =
syncorderrelationresp.getresp(errstate, prov.gettransactionid()) ;
}
else if ("unsubscribeservicereq".equals(prov.getmsgtype())) {
sb =
unsubscribeserviceresp.getresp(errstate, prov.gettransactionid()) ;
}
out.print(sb.tostring()) ;
out.flush() ;
out.close() ;
}
}
标题: re:provision接口 作者:mouse 时间:06-02-05 16:18
附件:
移动wap同步关系provision接口的实现
前阵做的小wap项目 写的东西也挺烂的 功能就不说了 做wap的都明白
公布出完成的provision接口代码和数据表格式
package com.wap.provision;
import java.io.ioexception;
import java.io.printwriter;
import java.sql.connection;
import javax.servlet.servletexception;
import javax.servlet.servletinputstream;
import javax.servlet.http.httpservletrequest;
import javax.servlet.http.httpservletresponse;
import data.dtime;
public class provision extends javax.servlet.http.httpservlet implements javax.servlet.servlet
{
protected void doget(httpservletrequest request, httpservletresponse response) throws servletexception, ioexception
{
dopost(request, response);
}
protected void dopost(httpservletrequest request, httpservletresponse response) throws servletexception, ioexception
{
connection con;
con = (connection)this.getservletcontext().getattribute("con");//从容器里里获得数据库连接
dtime dtime = new dtime();//获取当前时间
system.out.println("provision start at " + dtime.getdtime());
servletinputstream in = request.getinputstream();//得到inputstream
printwriter out = response.getwriter();//得到writer
anatomy tempanatomy = new anatomy(in, out, con);//将数据流放入解析器
system.out.println("data input anatmomy");
}
}
--------------------------------------------------------------------------------
package com.wap.provision;
import java.io.printwriter;
import java.sql.connection;
import java.sql.sqlexception;
import javax.servlet.servletinputstream;
import javax.xml.parsers.documentbuilderfactory;
import org.w3c.dom.document;
import data.dtime;
import data.databean;
public class anatomy
{
private string transactionid = "";// 该消息编号
private string msgtype = "";// 消息类型
private string linkid = "";// 临时订购关系的事务id
private string version = "";// 该接口消息的版本号
private string actionid = "";// 服务状态管理动作代码
private string actionreasonid = "";// 产生服务状态管理动作原因的代码
private string spid = "";// 企业代码
private string spserviceid = "";// 服务代码
private string accessmode = "";// 访问模式
private string featurestr = "";// 服务订购参数
private string send_devicetype = "";// 发送方地址
private string send_deviceid = "";
private string dest_devicetype = "";// 接收方地址
private string dest_deviceid = "";
private string fee_useridtype = "";// 计费用户标识
private string fee_msisdn = "";
private string fee_pseudocode = "";// 记费用户mid
private string dest_useridtype = "";
private string dest_msisdn = "";
private string dest_pseudocode = "";
private string hret = "";// 返回值
private servletinputstream in;
private printwriter out;
private document document;
private connection con;
private string[][] relation;//已存在的订购关系
private string[][] pause;//已经暂停的订购关系
string delete_sql_relation;
string delete_sql_pause;
string relation_sql;
string pause_sql;
public anatomy(servletinputstream in, printwriter out, connection con)
{
try
{
this.in = in;
this.out = out;
this.con = con;
this.document = documentbuilderfactory.newinstance().newdocumentbuilder().parse(this.in);
getreqinfo();// 将各个字段付值
if (fee_useridtype.equals("1"))// fee_useridtype为1用mid,2为违代码
{
relation_sql = "select * from relation where spserviceid = '" + spserviceid + "' and fee_msisdn ='" + fee_msisdn + "'";
pause_sql = "select * from pause where spserviceid = '" + spserviceid + "' and fee_msisdn ='" + fee_msisdn + "'";
delete_sql_relation = "delete from relation where spserviceid = '" + spserviceid + "' and fee_msisdn ='" + fee_msisdn + "'";
delete_sql_pause = "delete from pause where spserviceid = '" + spserviceid + "' and fee_msisdn ='" + fee_msisdn + "'";
}
else
{
relation_sql = "select * from relation where spserviceid = '" + spserviceid + "' and fee_pseudocode ='" + fee_pseudocode + "'";
pause_sql = "select * from pause where spserviceid = '" + spserviceid + "' and fee_pseudocode ='" + fee_pseudocode + "'";
delete_sql_relation = "delete from relation where spserviceid = '" + spserviceid + "' and fee_pseudocode ='" + fee_pseudocode + "'";
delete_sql_pause = "delete from pause where spserviceid = '" + spserviceid + "' and fee_pseudocode ='" + fee_pseudocode + "'";
}
relation = databean.getresulttoarray(con, relation_sql);//得到当前的一该业务已订购的关系
system.out.print("reveice ");
string[] infoarray = this.getinfoarray();//将字段组合成数组
databean.inserttable(con, "allreceive", infoarray);// 插入同步数据库做记录
system.out.println();
this.sendback(this.gethret());//返回状态值
}
catch (exception e)
{
this.sendback("1");// 未知错误
e.printstacktrace();
}
}
private void getreqinfo()// 将各字段付值
{
transactionid = getnodevalue("transactionid", 0);
msgtype = getnodevalue("msgtype", 0);
linkid = getnodevalue("linkid", 0);
version = getnodevalue("version", 0);
actionid = getnodevalue("actionid", 0);
actionreasonid = getnodevalue("actionreasonid", 0);
spid = getnodevalue("spid", 0);
spserviceid = getnodevalue("spserviceid", 0);
accessmode = getnodevalue("accessmode", 0);
featurestr = getnodevalue("featurestr", 0);
send_devicetype = getnodevalue("devicetype", 0);
send_deviceid = getnodevalue("deviceid", 0);
dest_devicetype = getnodevalue("devicetype", 1);
dest_deviceid = getnodevalue("deviceid", 1);
fee_useridtype = getnodevalue("useridtype", 0);
fee_msisdn = getnodevalue("msisdn", 0);
fee_pseudocode = getnodevalue("pseudocode", 0);
dest_useridtype = getnodevalue("useridtype", 1);
dest_msisdn = getnodevalue("msisdn", 1);
dest_pseudocode = getnodevalue("pseudocode", 1);
}
private string getnodevalue(string tagname, int index)
{
if (document.getelementsbytagname(tagname) != null && document.getelementsbytagname(tagname).item(index) != null && document.getelementsbytagname(tagname).item(index).getfirstchild() != null)
{
string value = document.getelementsbytagname(tagname).item(index).getfirstchild().getnodevalue();
system.out.print(" " + tagname + " = " + value);
return value;
}
else
{
system.out.print(" " + tagname + " = null");
return "";
}
}
private string gethret()
{
try
{
if (!msgtype.equalsignorecase("syncorderrelationreq"))
{
return "4000";// 无效的msgtype
}
else if ((integer.parseint(actionreasonid) > 4) || (integer.parseint(actionreasonid) < 1))
{
return "4002";// 无效的actionreasonid
}
else if ((integer.parseint(accessmode) > 3) || (integer.parseint(accessmode) < 1))
{
return "4006";// 无效的accessmode
}
else if ((fee_msisdn == null) && (fee_pseudocode == null))
{
return "1";
}
int id = integer.parseint(actionid);
switch (id)
// relation==null 该消息在关系表无记录 pause==null
// 该消息在暂停表无记录
{
case 1:
{
if (relation == null)
{
string[] infoarray = this.getinfoarray();// 订购成功
// 插入关系表
databean.inserttable(con, "relation", infoarray);// 插入同步数据库做记录
return "0";
}
else
{
return "4007";// misc同步开通服务,但sp端以存在订购关系,且状态为开通
}
}
case 2:
{
if (relation == null)
{
return "4011";// misc同步停止服务,但sp端不存在订购关系
}
else if (relation != null)
{
databean.deleterow(con, delete_sql_relation);
return "0";
}
else
return "1";
}
case 3:
{
pause = databean.getresulttoarray(con, pause_sql);
if ((relation == null) && (pause == null))
{
return "4016";// misc平台激活服务,但sp端不存在订购关系
}
else if ((relation != null) && (pause == null))
{
return "4015";// misc平台激活服务,但sp端已存在订购关系,切状态为开通
}
else if (pause != null)
{
databean.inserttable(con, "relation", pause[0]);
databean.deleterow(con, delete_sql_pause);
return "0";// 成功
}
else
return "1";
}
case 4:
{
pause = databean.getresulttoarray(con, pause_sql);
if ((relation == null) && (pause == null))
{
return "4013";// misc平台暂停服务,但sp端不存在订购关系
}
else if (pause != null)
{
return "4014";// misc平台暂停服务,但sp端存在订购关系,//切状态为暂停
}
else if ((relation != null) && (pause == null))
{
databean.inserttable(con, "pause", relation[0]);
databean.deleterow(con, delete_sql_relation);
return "0";
}
else
return "1";
}
default:
{
return "4001";
}
}
}
catch (sqlexception e)
{
return "1";// 未知错误
}
}
private void sendback(string hret)
{
out.println("");
out.println("");
out.println("");
out.println("" + transactionid + "");
out.println("");
out.println("");
out.println("");
out.println("1.5.0");
out.println("syncorderrelationresp");
out.println("" + hret + "");
out.println("");
out.println("");
out.println("");
string[] sendinfo =
{ transactionid, hret, new dtime().getdtime() };
system.out.println("send transactionid = " + transactionid + " hret = " + hret);
databean.inserttable(con, "allsend", sendinfo);// 将发送数据插入发送记录表
out.close();
}
private string[] getinfoarray()
{
string[] infoarray =
{ transactionid, msgtype, linkid, version, actionid, actionreasonid, spid, spserviceid, accessmode, featurestr, send_devicetype, send_deviceid, dest_devicetype, dest_deviceid, fee_useridtype, fee_msisdn, fee_pseudocode, dest_useridtype, dest_msisdn, dest_pseudocode, new dtime().getdtime() };
return infoarray;
}
}
--------------------------------------------------------------------------------
里面涉及的一数据库操作的类
package data;
import java.sql.connection;
import java.sql.drivermanager;
import java.sql.resultset;
import java.sql.resultsetmetadata;
import java.sql.sqlexception;
import java.sql.statement;
import java.util.enumeration;
import java.util.hashtable;
public class databean
{
// 将数组按单元插入数据库 返回插入行数
public static int inserttable(connection conn, string tablename, string[] rows)
{
try
{
statement stmt = conn.createstatement(resultset.type_scroll_sensitive, resultset.concur_updatable);
stringbuffer row = new stringbuffer();
int i;
for (i = 0; i < rows.length - 1; i++)
{
row.append("'" + rows[i] + "'" + ",");
}
row.append("'" + rows[i] + "'");
string sql = "insert into " + tablename + " values (" + new string(row) + ")";
int rowcount = stmt.executeupdate(sql);
stmt.close();
return rowcount;
}
catch (sqlexception e)
{
system.out.println("insert table " + tablename + " error");
e.printstacktrace();
return -1;
}
}
// 按条件删除 返回删除的行数
public static int deleterow(connection conn, string sql)
{
try
{
statement stmt = conn.createstatement(resultset.type_scroll_sensitive, resultset.concur_updatable);
//stmt.execute(sql);
int rows = stmt.executeupdate(sql);
stmt.close();
return rows;
}
catch (sqlexception e)
{
system.out.println("delete sql = " + sql + " error");
e.printstacktrace();
return -1;
}
}
// 给定sql返回2唯数组结果
public static string[][] getresulttoarray(connection conn, string sql) throws sqlexception
{
statement stmt = conn.createstatement(resultset.type_scroll_sensitive, resultset.concur_updatable);
resultset rs = stmt.executequery(sql);
if (databean.getrowcounts(rs) == 0)
return null;
resultsetmetadata rsmd = rs.getmetadata();
int rows = databean.getrowcounts(rs);
string[][] information = new string[rows][rsmd.getcolumncount() - 1];
while (rs.next())
{
if (rs.getrow() > rows)
break;
for (int j = 0; j < rsmd.getcolumncount() - 1; j++)
{
information[rs.getrow() - 1][j] = rs.getstring(j + 2);// 我的数据表都有自动增长的id 做主键 我不取它 getstring从1开始取,第1字段为id号,故+2
}
}
rs.close();
stmt.close();
return information;
}
public static int getrowcounts(resultset rs)
{
int counts = 0;
try
{
while (rs.next())
{
counts++;
}
rs.beforefirst();
return counts;
}
catch (exception e)
{
system.out.println("getrowcounts error");
e.printstacktrace();
return -1;
}
}
public static connection getconnection(string dbname, string user, string password) throws sqlexception, exception
{
class.forname("com.microsoft.jdbc.sqlserver.sqlserverdriver");
//我用的ms sql
string url = "jdbc:microsoft:sqlserver://127.0.0.1:1433;databasename=" + dbname;
connection conn = drivermanager.getconnection(url, user, password);
return conn;
}
}
--------------------------------------------------------------------------------
数据库库中的表结构
create table [dbo].[allreceive] (
[id] [int] identity (1, 1) not null ,
[transactionid] [varchar] (50) collate chinese_prc_ci_as null ,
[msgtype] [varchar] (50) collate chinese_prc_ci_as null ,
[linkid] [varchar] (50) collate chinese_prc_ci_as null ,
[version] [varchar] (50) collate chinese_prc_ci_as null ,
[actionid] [varchar] (50) collate chinese_prc_ci_as null ,
[actionreasonid] [varchar] (50) collate chinese_prc_ci_as null ,
[spid] [varchar] (50) collate chinese_prc_ci_as null ,
[spserviceid] [varchar] (50) collate chinese_prc_ci_as null ,
[accessmode] [varchar] (50) collate chinese_prc_ci_as null ,
[featurestr] [varchar] (50) collate chinese_prc_ci_as null ,
[send_devicetype] [varchar] (50) collate chinese_prc_ci_as null ,
[send_deviceid] [varchar] (50) collate chinese_prc_ci_as null ,
[dest_devicetype] [varchar] (50) collate chinese_prc_ci_as null ,
[dest_deviceid] [varchar] (50) collate chinese_prc_ci_as null ,
[fee_useridtype] [varchar] (50) collate chinese_prc_ci_as null ,
[fee_msisdn] [varchar] (50) collate chinese_prc_ci_as null ,
[fee_pseudocode] [varchar] (50) collate chinese_prc_ci_as null ,
[dest_useridtype] [varchar] (50) collate chinese_prc_ci_as null ,
[dest_msisdn] [varchar] (50) collate chinese_prc_ci_as null ,
[dest_pseudocode] [varchar] (50) collate chinese_prc_ci_as null ,
[dtime] [varchar] (50) collate chinese_prc_ci_as null
)
其中再创建两张结构相同的表 这三张分别是allreceive 存放所有provision request数据
relation 当前已经存在的订阅关系 pause 当前已暂停的订阅关系
create table [dbo].[allsend] (
[id] [int] identity (1, 1) not null ,
[transactionid] [varchar] (50) collate chinese_prc_ci_as null ,
[hret] [varchar] (50) collate chinese_prc_ci_as null ,
[dtime] [varchar] (50) collate chinese_prc_ci_as null
)
这个表存放所有的返回状态代码
//该部分代码基本上满足要求,可以不作改动;
//sp收到同步请求包后,对订购请求做相应的订购关系处理,并返回订购关系同步应答syncorderrelationresp
//misc收到应答包后,根据返回结果是否正确,在系统中生成正式的订购关系或者取消订购关系,并由1862系统给用户下发订购成功或取消成功的提醒消息
//syncorderrelationresp消息字段描述:
//字段名 重要性 类型 说明
//msgtype 必须 string 消息类型
//transactionid 必须 string 该消息编号
//version 必须 string 该接口消息的版本号,本次所有的接口消息的版本都为“1.5.0”
//hret 必须 integer 返回值,主要错误如下:
//0:成功
//4007: misc 同步开通服务,但sp 端已存在订购关系,且状态为开通
//4008: misc 同步开通服务,且sp 端不存在订购关系,但开通服务失败
//4010: misc 同步停止服务, 且sp 端存在订购关系, 但取消服务失败
//4011: misc 同步停
闽公网安备 35060202000074号