📄 xmlmailbean.java
字号:
package xmlMail;
import java.util.*;
import java.io.*;
import java.sql.*;
import javax.mail.*;
import javax.mail.internet.*;
import javax.activation.*;
import MyNa.utils.*;
import MyNa.xml.*;
public class XmlMailBean extends XmlConfigBase {
Env beanEnv; // contains subbeans, including
// RowViewSources, MessageSenders, MessageMakers
Env requestEnv; // given by servlet or JSP; temporary.
// may be used, e.g., for rowViewSource.getRow(n);
Logger lg;
RowSeq rows; // result from rowViewSource
RowViewSource rowViewSource; String rowViewSourceName;
MessageMaker messageMaker; String messageMakerName;
MessageSender messageSender; String messageSenderName;
String mbcmd;
String mbresult;
String errorMessage;
String className; // should be xmlMail.XmlMailBean
RowSeq messageList; // filled by msgList;
Env currentMessage; // filled by msgShow
public XmlMailBean(){
beanEnv=new Env(); requestEnv=new Env();
currentMessage=new Env(); setMsgcontent("");
lg=new Logger(); lg.clearLog();
lg.logIt("XmlMailBean created at "+MiscDate.todaysDate());
}
public boolean hasError(){
return errorMessage!=null && errorMessage.length()>0;
}
public void setInitDefs(Env E){
lg.logIt("setInitDefs of XmlMailBean");
beanEnv.addHashtable(E);
}
public void setStringArraysFromEnv(Env E){
// at the moment, we are only concerned with columnLabels.
Object ob=E.get("columnLabels");
if(null==ob || !(ob instanceof String[])) return;
setColumnLabels((String[])ob);
}
public void setRequestEnv(Env E){requestEnv=E;} // jsp or servlet connection.
public void initBeanTree(){ // from requestEnv
String S=initFromXmlFile(requestEnv.getStr("xmlInitFile","mailConfig.xml"),
false,beanEnv); // NOT CHECKED HERE!
lg.logIt("initresponse="+S+"\nresult:\n"+beanEnv.toStringRec());
if(S.length()>0)setMiscError(S);
if(hasError())return;
// bean structure is initialized with defaults;
initFromTopEnv(requestEnv);
// override/extend string defaults with html form info; this deals with
// all kinds of simple strings, but not string arrays.
setStringArraysFromEnv(requestEnv);
lg.logIt("\n\n***\ninitFromTopEnv(requestEnv)\n"+requestEnv.toStringRec());
messageMaker.setMessageSender(messageSender);
initAliases(requestEnv);
messageSender.startSession();
// sender will manage the session, and in this case will share it
beanEnv.put("msgSession", messageSender.getSession());
}
public void initAliases(Env E){
Env subE=E.getEnv("rowViewSource");
if(null!=subE && null!=rowViewSource)
((XmlConfig)rowViewSource).initFromEnv(subE);
subE=E.getEnv("messageSender");
if(null!=subE && null!=messageSender)
((XmlConfig)messageSender).initFromEnv(subE);
subE=E.getEnv("messageMaker");
if(null!=subE && null!=messageMaker)
((XmlConfig)messageMaker).initFromEnv(subE);
}
public void setMbcmd(String S){mbcmd=S; lg.logIt("mbcmd="+S);}
public void setMbresult(String S){mbresult=S; lg.logIt("mbresult="+S);}
public void setErrorMessage(String S){errorMessage=S;}
public void setMiscError(String S){
setMbresult("miscError"); setErrorMessage(S);
}
public void setColumnLabels(String[]A){
rowViewSource.setColumnLabels(A);
}
public void setColumnLabels(String S){
if(S!=null && S.length()>0)
rowViewSource.setColumnLabels(S);
}
String[]savedColumnLabels,savedColumnTypes;
public void expandAndSaveColumns(){
savedColumnLabels=rowViewSource.getColumnLabels();
savedColumnTypes=rowViewSource.getColumnTypes();
rowViewSource.setColumnLabels(MessageData.getAllLabels());
}
public void restoreColumns(){
rowViewSource.setColumnTypes(savedColumnTypes);
rowViewSource.setColumnLabels(savedColumnLabels);
}
public String getDbSource(){
return((XmlConfig)rowViewSource).getString("dbSource");
}
public boolean inErrorState(){
return errorMessage!=null && errorMessage.length()>0;
}
public void setString(String key,String val){
if(key==null)return;
if(key.equals("verbose"))setVerbose(val);
else if(key.equals("debug"))setDebug(val);
else if(key.equals("messageSenderName"))setMessageSenderName(val);
else if(key.equals("messageMakerName"))setMessageMakerName(val);
else if(key.equals("rowViewSourceName"))setRowViewSourceName(val);
else if(key.equals("columnLabels"))setColumnLabels(val);
else if(key.equals("mbcmd"))setMbcmd(val);
else if(key.equals("class"))className=val;
else lg.logIt("unknown or unpublished set: "+key+"!="+val);
}
public String[] getColumnLabels(){
if(null==rowViewSource)return MessageData.getDefaultLabels();
return rowViewSource.getColumnLabels();
}
public String[] getColumnValues(Env E){
// called after msgShow,msgList.
try{
String[]columnLabels=getColumnLabels();
String[]V=E.getStrSeq("columnValues");
if(null!=V)return V;
V=new String[columnLabels.length];
for(int i=0;i<columnLabels.length;i++)
V[i]=E.getStr(columnLabels[i]);
return V;
}catch(Exception ex){
lg.logIt("XmlMailBean.getColumnValues: "+ex);
return MessageData.getDefaultLabels();
}
}
public String[] getColumnValues(){return getColumnValues(currentMessage);}
public String getMbresult(){return mbresult;}
public String getErrorMessage(){return errorMessage;}
public String getString(String S){return null;}
public RowSeq getRowList(){return rows;}
public Env getBeanEnv(){return beanEnv;}
public int getRowNum(){return rowViewSource.getRowNum();}
public String getMsgcontent(){return currentMessage.getStr("msgcontent");}
public void setMsgcontent(String S){currentMessage.put("msgcontent",S);}
public void setLoginError(String S){
mbresult="loginError"; errorMessage=S;
}
public void doLogin(){
try{
initBeanTree(); // assume requestEnv is set.
if(hasError())return;
rowViewSource.initSession(beanEnv);
checkRVErr();
if(hasError())return;
msgList();
}catch(Exception E){setMiscError("error in Login: "+Logger.stackTrace(E));}
}
public void doLogout(){
setMbresult("logout");
rowViewSource.close();
messageSender.endSession();
checkRVErr();
}
public void checkRVErr(){
if(rowViewSource.hasError())
setMiscError("rowViewSource err: "+
rowViewSource.getErrorType()+"\n"+
rowViewSource.getErrorMessage());
}
public void doCommand(Env requestEnv){
try{
setErrorMessage(null);
setRequestEnv(requestEnv);
initFromTopEnv(requestEnv); initAliases(requestEnv);
lg.logIt("doCommand with env "+requestEnv.toStringRec());
setMbcmd(requestEnv.getStr("mbcmd"));
if(null==mbcmd)setMiscError("no mailbean command given");
else if("login".equals(mbcmd))doLogin();
else if("logout".equals(mbcmd))doLogout();
else if("msgList".equals(mbcmd))msgList();
else if("msgListSendForward".equals(mbcmd))msgListSendForward();
else if("msgListOutputXML".equals(mbcmd))msgListOutputXML();
else if("msgListSave2XML".equals(mbcmd))msgListSave2XMLFile();
else if("msgListSave2DB".equals(mbcmd))msgListSave2DB();
else if("msgShow".equals(mbcmd))msgShow();
else if("msgSend".equals(mbcmd))msgSend();
else if("msgDelete".equals(mbcmd))msgDelete();
else setMiscError("unknown mailbean command ["+mbcmd+"]");
}catch(Exception E){setMiscError("ERROR: "+Logger.stackTrace(E));}
}
public void msgList(){
setMbresult("msgList");
rows=rowViewSource.getRowList();
checkRVErr();
}
public RowSeq getMsgList(){ // refresh with msgList() cmd
return rows;
}
public void msgListSendForward(){
setMbresult("msgForward");
rowViewSource.sendTo("mail",messageMaker.getMsgtoaddr());
checkRVErr();
}
public String outputTarget(){
String target=messageMaker.getMsgtoaddr();
if(target==null || target.length()==0)target=getDbSource();
return target;
}
public void msgListOutputXML(){
String target=outputTarget();
try{
setMbresult("msgListOutput");
StringWriter sw=new StringWriter();
RowSeq rE=rowViewSource.getAllColumnsRowList();
checkRVErr();
if(hasError())return;
rE.toXML(sw,target,false);
setMsgcontent(sw.toString());
}catch(Exception ex){
setMiscError("can't save XML to message "+target+"\n"+ex);
}
}
public void msgListSave2XMLFile(){
String target=outputTarget();
try{
setMbresult("msgListSave2XML");
RowSeq rE=rowViewSource.getAllColumnsRowList();
checkRVErr();
if(hasError())return;
FileWriter fw=new FileWriter(new File(target));
rE.toXML(fw,target,false);
fw.close();
}catch(Exception ex){
setMiscError("can't save XML to file "+target+"\n"+ex);
}
}
public void msgListSave2DB(){
String target=outputTarget();
setMbresult("msgListSave2DB");
try{
boolean reset=false;
RowSeq rE=rowViewSource.getAllColumnsRowList();
checkRVErr();
if(hasError())return;
findDbConnection();
rE.toDB(dbConnection,target,reset);
freeDbConnection();
checkRVErr();
}catch(Exception ex){
setMiscError("can't save XML to DB table "+
target+"\n"+Logger.stackTrace(ex));
}
}
public void msgShow(){
setMbresult("msgShow");
currentMessage =rowViewSource.getRow(rowViewSource.getRowNum());
checkRVErr();
}
public void msgSend(){
setMbresult("messageSent");
try{messageSender.sendMessage(messageMaker.getMessage());}
catch(Exception E){
setMiscError("failed to send msg; "+Logger.stackTrace(E));}
}
public void msgDelete(){
setMbresult("msgDelete");
rowViewSource.delRow(rowViewSource.getRowNum());
checkRVErr();
}
public void setRowViewSourceName(String S){
// note that even at first, this is called _after_ the
// XmlConfig initFromEnv has instantiated the beans; that's
// just because the XmlConfig puts subbeans first.
String[]columnLabels=getColumnLabels();
Env beanE=beanEnv.getEnv(S);
if(null==beanE){
setMiscError("no such RowViewSource as "+S);
return;
}
Object ob=beanE.get("theBeanItself");
if(null==ob || !(ob instanceof RowViewSource)){
setMiscError("there is no RowViewSource called "+S);
return;
}
rowViewSourceName=S;
rowViewSource=(RowViewSource)ob;
if(null!=columnLabels)
rowViewSource.setColumnLabels(Misc.stringArrayJoin(columnLabels,","));
}
public void setMessageMakerName(String S){
Env beanE=beanEnv.getEnv(S);
if(null==beanE){
setMiscError("no such MessageMaker as "+S);
return;
}
Object ob=beanE.get("theBeanItself");
if(null==ob || !(ob instanceof MessageMaker)){
setMiscError("there is no MessageMaker called "+S);
return;
}
messageMakerName=S;
messageMaker=(MessageMaker)ob;
}
public void setMessageSenderName(String S){
Env beanE=beanEnv.getEnv(S);
if(null==beanE){
setMiscError("no such MessageSender as "+S);
return;
}
Object ob=beanE.get("theBeanItself");
if(null==ob || !(ob instanceof MessageSender)){
setMiscError("there is no MessageSender called "+S);
return;
}
messageSenderName=S;
messageSender=(MessageSender)ob;
if(null!=messageMaker)
messageMaker.setMessageSender(messageSender);
// can't count on this for init; also do it in doLogin.
}
/* This is where connection pooling code would go */
Connection dbConnection;
boolean dbDriverHasBeenInitialized=false;
public void findDbConnection()throws Exception{
Env theEnv=beanEnv.getEnv("databaseSource");
// this may or may not be the rowViewSource at the moment.
String dbDriver=theEnv.getStr("dbDriver","sun.jdbc.odbc.JdbcOdbcDriver");
String dbUrl=theEnv.getStr("dbUrl","jdbc:odbc:PHONEBOOK");
String dbUser=theEnv.getStr("dbUser","JohnSmith");
String dbPwd=theEnv.getStr("dbPwd","password");
if(!dbDriverHasBeenInitialized){
lg.logIt("about to get driver "+dbDriver);
Class.forName(dbDriver);
dbDriverHasBeenInitialized=true;
}
dbConnection=DriverManager.getConnection(dbUrl,dbUser,dbPwd);
}
public void freeDbConnection()throws Exception{
dbConnection.close();
}
}
/* 11/06/99
the overall XmlMail package is structured as a
browser-based email package which uses database tables
for storage and remote connections as needed. It isn't a
full-featured email package, but it allows for folder
selection (if supported by the provider; pop3 allows only
the INBOX, but imap goes further), for individual messages
and message-summary lists, for deletion and saving and
forwarding (in groups).
This XmlMailBean is a manager class, providing data for
JSP presentation, but it is intended to be usable without
modification in a non-JSP context: it knows nothing about
JSP. It doesn't actually know anything about mail, either.
The design is interesting for two reasons: first, its
initialization depends not only on JSP property-settings,
but on a recursive initialization-by-XML process in which
the XmlMailBean constructs itself at the beginning of
a session. We want to provide defaults in the XML; that's
easy to make recursive, i.e. the XmlMailBean initializes
itself on a DOM tree and passes subtrees to subbeans. We
also want to allow HTML overrides, and that's a bit harder;
we note that
<input type=text name="alpha_beta_gamma" value="12345">,
will automatically call on the bean's
setAlpha_beta_gamma("1234"); method,
and we define a convention in which
setAlpha_beta_gamma(S) is alpha.beta.setGamma(S). Similarly
<input type=text name="alpha_1_beta" value="3">
<input type=text name="alpha_2_beta" value="4">
will call on alpha[1].setBeta("3") and alpha[2].setBeta("4");
These must be done _after_ the xml initialization, since
these structures may not exist until then. Note that it
requires that underscores be used only for this purpose
within html names.
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -