Migrated Server and Status client interface to equinox extension.

This commit is contained in:
Heng Sin Low 2010-09-21 11:38:44 +08:00
parent 3c1f8d98fb
commit 59de85428c
18 changed files with 842 additions and 422 deletions

View File

@ -29,6 +29,7 @@ Export-Package: com.akunagroup.uk.postcode,
org.compiere.dbPort, org.compiere.dbPort,
org.compiere.impexp, org.compiere.impexp,
org.compiere.interfaces, org.compiere.interfaces,
org.compiere.interfaces.impl,
org.compiere.model, org.compiere.model,
org.compiere.print, org.compiere.print,
org.compiere.print.layout, org.compiere.print.layout,
@ -46,5 +47,7 @@ Bundle-RequiredExecutionEnvironment: JavaSE-1.6
Eclipse-ExtensibleAPI: true Eclipse-ExtensibleAPI: true
Import-Package: net.sf.cglib.proxy, Import-Package: net.sf.cglib.proxy,
org.eclipse.core.runtime;version="3.4.0", org.eclipse.core.runtime;version="3.4.0",
org.osgi.framework org.osgi.framework,
org.restlet.representation,
org.restlet.util

View File

@ -7,5 +7,7 @@
<extension-point id="org.adempiere.base.Process" name="Process" schema="schema/org.adempiere.base.Process.exsd"/> <extension-point id="org.adempiere.base.Process" name="Process" schema="schema/org.adempiere.base.Process.exsd"/>
<extension-point id="org.adempiere.base.ModelValidator" name="Model Validator" schema="schema/org.adempiere.base.ModelValidator.exsd"/> <extension-point id="org.adempiere.base.ModelValidator" name="Model Validator" schema="schema/org.adempiere.base.ModelValidator.exsd"/>
<extension-point id="org.compiere.db.AdempiereDatabase" name="Adempiere Database Interface" schema="schema/org.compiere.db.AdempiereDatabase.exsd"/> <extension-point id="org.compiere.db.AdempiereDatabase" name="Adempiere Database Interface" schema="schema/org.compiere.db.AdempiereDatabase.exsd"/>
<extension-point id="org.compiere.interfaces.Server" name="Server Interface" schema="schema/org.compiere.interfaces.Server.exsd"/>
<extension-point id="org.compiere.interfaces.Status" name="Status interface" schema="schema/org.compiere.interfaces.Status.exsd"/>
</plugin> </plugin>

View File

@ -0,0 +1,102 @@
<?xml version='1.0' encoding='UTF-8'?>
<!-- Schema file written by PDE -->
<schema targetNamespace="org.adempiere.base" xmlns="http://www.w3.org/2001/XMLSchema">
<annotation>
<appinfo>
<meta.schema plugin="org.adempiere.base" id="org.compiere.interfaces.Server" name="Server Interface"/>
</appinfo>
<documentation>
[Enter description of this extension point.]
</documentation>
</annotation>
<element name="extension">
<annotation>
<appinfo>
<meta.element />
</appinfo>
</annotation>
<complexType>
<choice>
<element ref="interface"/>
</choice>
<attribute name="point" type="string" use="required">
<annotation>
<documentation>
</documentation>
</annotation>
</attribute>
<attribute name="id" type="string">
<annotation>
<documentation>
</documentation>
</annotation>
</attribute>
<attribute name="name" type="string">
<annotation>
<documentation>
</documentation>
<appinfo>
<meta.attribute translatable="true"/>
</appinfo>
</annotation>
</attribute>
</complexType>
</element>
<element name="interface">
<complexType>
<attribute name="class" type="string">
<annotation>
<documentation>
</documentation>
<appinfo>
<meta.attribute kind="java" basedOn=":org.compiere.interfaces.Server"/>
</appinfo>
</annotation>
</attribute>
</complexType>
</element>
<annotation>
<appinfo>
<meta.section type="since"/>
</appinfo>
<documentation>
[Enter the first release in which this extension point appears.]
</documentation>
</annotation>
<annotation>
<appinfo>
<meta.section type="examples"/>
</appinfo>
<documentation>
[Enter extension point usage example here.]
</documentation>
</annotation>
<annotation>
<appinfo>
<meta.section type="apiinfo"/>
</appinfo>
<documentation>
[Enter API information here.]
</documentation>
</annotation>
<annotation>
<appinfo>
<meta.section type="implementation"/>
</appinfo>
<documentation>
[Enter information about supplied implementation of this extension point.]
</documentation>
</annotation>
</schema>

View File

@ -0,0 +1,102 @@
<?xml version='1.0' encoding='UTF-8'?>
<!-- Schema file written by PDE -->
<schema targetNamespace="org.adempiere.base" xmlns="http://www.w3.org/2001/XMLSchema">
<annotation>
<appinfo>
<meta.schema plugin="org.adempiere.base" id="org.compiere.interfaces.Status" name="Status interface"/>
</appinfo>
<documentation>
[Enter description of this extension point.]
</documentation>
</annotation>
<element name="extension">
<annotation>
<appinfo>
<meta.element />
</appinfo>
</annotation>
<complexType>
<choice>
<element ref="interface"/>
</choice>
<attribute name="point" type="string" use="required">
<annotation>
<documentation>
</documentation>
</annotation>
</attribute>
<attribute name="id" type="string">
<annotation>
<documentation>
</documentation>
</annotation>
</attribute>
<attribute name="name" type="string">
<annotation>
<documentation>
</documentation>
<appinfo>
<meta.attribute translatable="true"/>
</appinfo>
</annotation>
</attribute>
</complexType>
</element>
<element name="interface">
<complexType>
<attribute name="class" type="string">
<annotation>
<documentation>
</documentation>
<appinfo>
<meta.attribute kind="java" basedOn=":org.compiere.interfaces.Status"/>
</appinfo>
</annotation>
</attribute>
</complexType>
</element>
<annotation>
<appinfo>
<meta.section type="since"/>
</appinfo>
<documentation>
[Enter the first release in which this extension point appears.]
</documentation>
</annotation>
<annotation>
<appinfo>
<meta.section type="examples"/>
</appinfo>
<documentation>
[Enter extension point usage example here.]
</documentation>
</annotation>
<annotation>
<appinfo>
<meta.section type="apiinfo"/>
</appinfo>
<documentation>
[Enter API information here.]
</documentation>
</annotation>
<annotation>
<appinfo>
<meta.section type="implementation"/>
</appinfo>
<documentation>
[Enter information about supplied implementation of this extension point.]
</documentation>
</annotation>
</schema>

View File

@ -0,0 +1,59 @@
/******************************************************************************
* Copyright (C) 2010 Low Heng Sin All Rights Reserved. *
* This program is free software; you can redistribute it and/or modify it *
* under the terms version 2 of the GNU General Public License as published *
* by the Free Software Foundation. This program is distributed in the hope *
* that it will be useful, but WITHOUT ANY WARRANTY; without even the implied *
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. *
* See the GNU General Public License for more details. *
* You should have received a copy of the GNU General Public License along *
* with this program; if not, write to the Free Software Foundation, Inc., *
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. *
*****************************************************************************/
package org.adempiere.util;
import java.io.ObjectInputStream;
import java.util.logging.Level;
import org.compiere.util.CLogger;
import org.restlet.representation.InputRepresentation;
import org.restlet.representation.ObjectRepresentation;
import org.restlet.representation.Representation;
import org.restlet.util.WrapperRepresentation;
/**
* Utility method for restlet support.
* @author hengsin
*
*/
public class RestletUtil {
public final static CLogger log = CLogger.getCLogger(RestletUtil.class);
/**
* Convert response or request representation to java object.
* @param entity
* @return T
*/
@SuppressWarnings("unchecked")
public static <T> T toObject(Representation entity) {
try {
if (entity instanceof WrapperRepresentation) {
entity = ((WrapperRepresentation)entity).getWrappedRepresentation();
}
if (entity instanceof ObjectRepresentation<?>) {
ObjectRepresentation<?> or = (ObjectRepresentation<?>) entity;
return (T) or.getObject();
} else if (entity instanceof InputRepresentation) {
InputRepresentation ir = (InputRepresentation) entity;
ObjectInputStream ois = new ObjectInputStream(ir.getStream());
return (T) ois.readObject();
} else {
return null;
}
} catch (Exception e) {
log.log(Level.SEVERE, e.getLocalizedMessage(), e);
return null;
}
}
}

View File

@ -26,11 +26,11 @@ import javax.naming.InitialContext;
import javax.sql.DataSource; import javax.sql.DataSource;
import javax.swing.JOptionPane; import javax.swing.JOptionPane;
import org.adempiere.base.Service;
import org.compiere.Adempiere; import org.compiere.Adempiere;
import org.compiere.interfaces.Server; import org.compiere.interfaces.Server;
import org.compiere.interfaces.Status; import org.compiere.interfaces.Status;
import org.compiere.util.CLogger; import org.compiere.util.CLogger;
import org.compiere.util.Env;
import org.compiere.util.Ini; import org.compiere.util.Ini;
import org.compiere.util.ValueNamePair; import org.compiere.util.ValueNamePair;
@ -72,9 +72,6 @@ public class CConnection implements Serializable, Cloneable
@Deprecated @Deprecated
public static final String PROFILE_WAN = "W"; public static final String PROFILE_WAN = "W";
/** System property flag to embed server bean in process **/
public final static String SERVER_EMBEDDED = "org.adempiere.server.embedded";
/** /**
* Get/Set default client/server Connection * Get/Set default client/server Connection
* @return Connection Descriptor * @return Connection Descriptor
@ -98,7 +95,7 @@ public class CConnection implements Serializable, Cloneable
{ {
//hengsin, zero setup for webstart client //hengsin, zero setup for webstart client
CConnection cc = null; CConnection cc = null;
if (apps_host != null && Adempiere.isWebStartClient() && !CConnection.isServerEmbedded()) if (apps_host != null && Adempiere.isWebStartClient())
{ {
cc = new CConnection(apps_host); cc = new CConnection(apps_host);
cc.setConnectionProfile(CConnection.PROFILE_LAN); cc.setConnectionProfile(CConnection.PROFILE_LAN);
@ -238,8 +235,10 @@ public class CConnection implements Serializable, Cloneable
private Server m_server = null; private Server m_server = null;
/** DB Info */ /** DB Info */
private String m_dbInfo = null; private String m_dbInfo = null;
private int m_webPort;
private final static String SECURITY_PRINCIPAL = "org.adempiere.security.principal"; private int m_sslPort;
private boolean m_queryAppsServer;
private SecurityPrincipal securityPrincipal;
/************************************************************************* /*************************************************************************
* Get Name * Get Name
@ -262,7 +261,7 @@ public class CConnection implements Serializable, Cloneable
/** /**
* Set Name * Set Name
*/ */
protected void setName () public void setName ()
{ {
m_name = toString (); m_name = toString ();
} // setName } // setName
@ -288,6 +287,78 @@ public class CConnection implements Serializable, Cloneable
m_okApps = false; m_okApps = false;
} }
/**
* @return web port
*/
public int getWebPort()
{
return m_webPort;
}
/**
* set web port
* @param webPort
*/
public void setWebPort(int webPort)
{
m_webPort = webPort;
}
/**
* Set Web Port
* @param webPortString web port as String
*/
public void setWebPort (String webPortString)
{
try
{
if (webPortString == null || webPortString.length() == 0)
;
else
setWebPort (Integer.parseInt (webPortString));
}
catch (Exception e)
{
log.severe(e.toString ());
}
}
/**
* @return ssl port
*/
public int getSSLPort()
{
return m_sslPort;
}
/**
* set ssl port
* @param sslPort
*/
public void setSSLPort(int sslPort)
{
m_sslPort = sslPort;
}
/**
* Set SSL Port
* @param sslPortString web port as String
*/
public void setSSLPort (String sslPortString)
{
try
{
if (sslPortString == null || sslPortString.length() == 0)
;
else
setSSLPort (Integer.parseInt (sslPortString));
}
catch (Exception e)
{
log.severe(e.toString ());
}
}
/** /**
* Is Application Server OK * Is Application Server OK
* @param tryContactAgain try to contact again * @param tryContactAgain try to contact again
@ -295,6 +366,26 @@ public class CConnection implements Serializable, Cloneable
*/ */
public boolean isAppsServerOK (boolean tryContactAgain) public boolean isAppsServerOK (boolean tryContactAgain)
{ {
if (!tryContactAgain && m_queryAppsServer)
return m_okApps;
if (getAppServerCredential() == null)
{
m_okApps = false;
return m_okApps;
}
m_queryAppsServer = true;
try
{
Status status = Service.locate(Status.class);
m_version = status.getDateVersion();
}
catch (Throwable t)
{
m_okApps = false;
}
return m_okApps; return m_okApps;
} // isAppsOK } // isAppsOK
@ -304,6 +395,7 @@ public class CConnection implements Serializable, Cloneable
*/ */
public synchronized Exception testAppsServer () public synchronized Exception testAppsServer ()
{ {
m_appsException = null;
queryAppsServerInfo(); queryAppsServerInfo();
return getAppsServerException (); return getAppsServerException ();
} // testAppsServer } // testAppsServer
@ -314,6 +406,10 @@ public class CConnection implements Serializable, Cloneable
*/ */
public Server getServer() public Server getServer()
{ {
if (m_server == null)
{
m_server = Service.locate(Server.class);
}
return m_server; return m_server;
} // getServer } // getServer
@ -957,23 +1053,35 @@ public class CConnection implements Serializable, Cloneable
public String toStringLong () public String toStringLong ()
{ {
StringBuffer sb = new StringBuffer ("CConnection["); StringBuffer sb = new StringBuffer ("CConnection[");
sb.append ("name=").append (m_name) sb.append ("name=").append (escape(m_name))
.append (",AppsHost=").append (m_apps_host) .append (",AppsHost=").append (escape(m_apps_host))
.append (",type=").append (m_type) .append (",WebPort=").append (m_webPort)
.append (",DBhost=").append (m_db_host) .append (",SSLPort=").append (m_sslPort)
.append (",type=").append (escape(m_type))
.append (",DBhost=").append (escape(m_db_host))
.append (",DBport=").append (m_db_port) .append (",DBport=").append (m_db_port)
.append (",DBname=").append (m_db_name) .append (",DBname=").append (escape(m_db_name))
.append (",BQ=").append (m_bequeath) .append (",BQ=").append (m_bequeath)
.append (",FW=").append (m_firewall) .append (",FW=").append (m_firewall)
.append (",FWhost=").append (m_fw_host) .append (",FWhost=").append (escape(m_fw_host))
.append (",FWport=").append (m_fw_port) .append (",FWport=").append (m_fw_port)
.append (",UID=").append (m_db_uid) .append (",UID=").append (escape(m_db_uid))
.append (",PWD=").append (m_db_pwd) .append (",PWD=").append (escape(m_db_pwd))
.append("]");
; // the format is read by setAttributes ; // the format is read by setAttributes
sb.append ("]");
return sb.toString (); return sb.toString ();
} // toStringLong } // toStringLong
private String escape(String value) {
if (value == null)
return null;
// use html like escape sequence to escape = and ,
value = value.replace("=", "&eq;");
value = value.replace(",", "&comma;");
return value;
}
/** /**
* Set Attributes from String (pares toStringLong()) * Set Attributes from String (pares toStringLong())
* @param attributes attributes * @param attributes attributes
@ -982,22 +1090,70 @@ public class CConnection implements Serializable, Cloneable
{ {
try try
{ {
setName (attributes.substring (attributes.indexOf ("name=") + 5, attributes.indexOf (",AppsHost="))); attributes = attributes.substring(attributes.indexOf("[")+1, attributes.length() - 1);
setAppsHost (attributes.substring (attributes.indexOf ("AppsHost=") + 9, attributes.indexOf (",type="))); String[] pairs= attributes.split("[,]");
// for(String pair : pairs)
setType (attributes.substring (attributes.indexOf ("type=")+5, attributes.indexOf (",DBhost="))); {
setDbHost (attributes.substring (attributes.indexOf ("DBhost=") + 7, attributes.indexOf (",DBport="))); String[] pairComponents = pair.split("[=]");
setDbPort (attributes.substring (attributes.indexOf ("DBport=") + 7, attributes.indexOf (",DBname="))); String key = pairComponents[0];
setDbName (attributes.substring (attributes.indexOf ("DBname=") + 7, attributes.indexOf (",BQ="))); String value = unescape(pairComponents[1]);
// if ("name".equalsIgnoreCase(key))
setBequeath (attributes.substring (attributes.indexOf ("BQ=") + 3, attributes.indexOf (",FW="))); {
setViaFirewall (attributes.substring (attributes.indexOf ("FW=") + 3, attributes.indexOf (",FWhost="))); setName(value);
setFwHost (attributes.substring (attributes.indexOf ("FWhost=") + 7, attributes.indexOf (",FWport="))); }
setFwPort (attributes.substring (attributes.indexOf ("FWport=") + 7, attributes.indexOf (",UID="))); else if ("AppsHost".equalsIgnoreCase(key))
// {
setDbUid (attributes.substring (attributes.indexOf ("UID=") + 4, attributes.indexOf (",PWD="))); setAppsHost(value);
setDbPwd (attributes.substring (attributes.indexOf ("PWD=") + 4, attributes.indexOf ("]"))); }
// else if ("type".equalsIgnoreCase(key))
{
setType(value);
}
else if ("DBhost".equalsIgnoreCase(key))
{
setDbHost(value);
}
else if ("DBport".equalsIgnoreCase(key))
{
setDbPort(value);
}
else if ("DbName".equalsIgnoreCase(key))
{
setDbName(value);
}
else if ("BQ".equalsIgnoreCase(key))
{
setBequeath(value);
}
else if ("FW".equalsIgnoreCase(key))
{
setViaFirewall(value);
}
else if ("FWhost".equalsIgnoreCase(key))
{
setFwHost(value);
}
else if ("FWport".equalsIgnoreCase(key))
{
setFwPort(value);
}
else if ("UID".equalsIgnoreCase(key))
{
setDbUid(value);
}
else if ("PWD".equalsIgnoreCase(key))
{
setDbPwd(value);
}
else if ("WebPort".equalsIgnoreCase(key))
{
setWebPort(value);
}
else if ("SSLPort".equalsIgnoreCase(key))
{
setSSLPort(value);
}
}
} }
catch (Exception e) catch (Exception e)
{ {
@ -1005,6 +1161,12 @@ public class CConnection implements Serializable, Cloneable
} }
} // setAttributes } // setAttributes
private String unescape(String value) {
value = value.replace("&eq;", "=");
value = value.replace("&comma;", ",");
return value;
}
/** /**
* Equals * Equals
* @param o object * @param o object
@ -1105,37 +1267,6 @@ public class CConnection implements Serializable, Cloneable
return ""; return "";
} // getConnectionURL } // getConnectionURL
/**
* Get Server Connection - do close
* @param autoCommit true if autocommit connection
* @param trxLevel Connection transaction level
* @return Connection
*/
public Connection getServerConnection (boolean autoCommit, int trxLevel)
{
Connection conn = null;
// Server Connection
if (m_ds != null)
{
try
{
conn = m_ds.getConnection ();
conn.setAutoCommit (autoCommit);
conn.setTransactionIsolation (trxLevel);
m_okDB = true;
}
catch (SQLException ex)
{
m_dbException = ex;
log.log(Level.SEVERE, "", ex);
}
}
// Server
return conn;
} // getServerConnection
/** /**
* Create Connection - no not close. * Create Connection - no not close.
* Sets m_dbException * Sets m_dbException
@ -1261,6 +1392,22 @@ public class CConnection implements Serializable, Cloneable
*/ */
private boolean queryAppsServerInfo () private boolean queryAppsServerInfo ()
{ {
m_okApps = false;
m_queryAppsServer = true;
if (getAppsHost().equalsIgnoreCase("MyAppsServer")) {
log.warning (getAppsHost() + " ignored");
return m_okApps; // false
}
Status status = Service.locate(Status.class);
try {
updateInfoFromServer(status);
m_okApps = true;
} catch (Exception e) {
m_appsException = e;
}
return m_okApps; return m_okApps;
} // setAppsServerInfo } // setAppsServerInfo
@ -1293,7 +1440,7 @@ public class CConnection implements Serializable, Cloneable
// //
setFwHost (svr.getFwHost ()); setFwHost (svr.getFwHost ());
setFwPort (svr.getFwPort ()); setFwPort (svr.getFwPort ());
if (getFwHost ().length () == 0) if (getFwHost() == null || getFwHost().length () == 0)
setViaFirewall (false); setViaFirewall (false);
m_version = svr.getDateVersion (); m_version = svr.getDateVersion ();
log.config("Server=" + getDbHost() + ", DB=" + getDbName()); log.config("Server=" + getDbHost() + ", DB=" + getDbName());
@ -1353,20 +1500,17 @@ public class CConnection implements Serializable, Cloneable
return "<?" + transactionIsolation + "?>"; return "<?" + transactionIsolation + "?>";
} // getTransactionIsolationInfo } // getTransactionIsolationInfo
/** public void setAppServerCredential(String identity, char[] secret)
* @return true if server is embedded in process {
*/ securityPrincipal = new SecurityPrincipal();
public static boolean isServerEmbedded() { securityPrincipal.identity = identity;
return "true".equalsIgnoreCase(System.getProperty(SERVER_EMBEDDED)); securityPrincipal.secret= secret;
m_server = null;
} }
public void setAppServerCredential(String principal, String credential) public SecurityPrincipal getAppServerCredential()
{ {
SecurityPrincipal sp = new SecurityPrincipal(); return securityPrincipal;
sp.principal = principal;
sp.credential = credential;
Env.getCtx().put(SECURITY_PRINCIPAL, sp);
m_server = null;
} }
@Override @Override

View File

@ -19,11 +19,11 @@ import java.io.Serializable;
* @author Low Heng Sin * @author Low Heng Sin
* *
*/ */
class SecurityPrincipal implements Serializable { public class SecurityPrincipal implements Serializable {
/** /**
* * generated serial version id
*/ */
private static final long serialVersionUID = -4703480025159571932L; private static final long serialVersionUID = -6924078376448056295L;
String principal; public String identity;
String credential; public char[] secret;
} }

View File

@ -11,10 +11,6 @@ import org.compiere.util.EMail;
*/ */
public interface Server public interface Server
{ {
public final static String JNDI_NAME = "adempiere/Server";
public final static String EJB_NAME = "adempiereServer";
/** /**
* Post Immediate * Post Immediate
* @param ctx Client Context * @param ctx Client Context
@ -22,10 +18,9 @@ public interface Server
* @param AD_Table_ID Table ID of Document * @param AD_Table_ID Table ID of Document
* @param Record_ID Record ID of this document * @param Record_ID Record ID of this document
* @param force force posting * @param force force posting
* @param trxName ignore, retained for backward compatibility
* @return null, if success or error message */ * @return null, if success or error message */
public String postImmediate( Properties ctx, int AD_Client_ID, int AD_Table_ID, public String postImmediate( Properties ctx, int AD_Client_ID, int AD_Table_ID,
int Record_ID, boolean force, String trxName); int Record_ID, boolean force);
/** /**
* Process Remote * Process Remote
@ -43,50 +38,32 @@ public interface Server
public ProcessInfo workflow( Properties ctx, ProcessInfo pi, int AD_Workflow_ID ); public ProcessInfo workflow( Properties ctx, ProcessInfo pi, int AD_Workflow_ID );
/** /**
* Create EMail from Server (Request User) * Send EMail from Server
* @param ctx Context * @param ctx Context
* @param AD_Client_ID client * @param email
* @param to recipient email address * @return message return from email server */
* @param subject subject public String sendEMail( Properties ctx, EMail email);
* @param message message
* @return EMail */
public EMail createEMail( Properties ctx, int AD_Client_ID, String to,
String subject, String message );
/**
* Create EMail from Server (Request User)
* @param ctx Context
* @param AD_Client_ID client
* @param AD_User_ID user to send email from
* @param to recipient email address
* @param subject subject
* @param message message
* @return EMail */
public EMail createEMail( Properties ctx, int AD_Client_ID, int AD_User_ID,
String to, String subject, String message );
/** /**
* Execute task on server * Execute task on server
* @param ctx Context
* @param AD_Task_ID task * @param AD_Task_ID task
* @return execution trace */ * @return execution trace */
public String executeTask( int AD_Task_ID ); public String executeTask( Properties ctx, int AD_Task_ID );
/** /**
* Cash Reset * Cash Reset
* @param ctx Context
* @param tableName table name * @param tableName table name
* @param Record_ID record or 0 for all * @param Record_ID record or 0 for all
* @return number of records reset */ * @return number of records reset */
public int cacheReset( String tableName,int Record_ID ); public int cacheReset( Properties ctx, String tableName,int Record_ID );
/**
* Describes the instance and its content for debugging purpose
* @return Debugging information about the instance and its content */
public String getStatus( );
/** /**
* Execute db proces on server * Execute db proces on server
* @param ctx Context
* @param processInfo * @param processInfo
* @param procedureName * @param procedureName
* @return ProcessInfo */ * @return ProcessInfo */
public ProcessInfo dbProcess( ProcessInfo processInfo, String procedureName ); public ProcessInfo dbProcess( Properties ctx, ProcessInfo processInfo, String procedureName );
} }

View File

@ -5,10 +5,6 @@ package org.compiere.interfaces;
*/ */
public interface Status public interface Status
{ {
public final static String JNDI_NAME="adempiere/Status";
public final static String EJB_NAME="adempiereStatus";
/** /**
* Get Version (Date) * Get Version (Date)
* @return version e.g. 2002-09-02 */ * @return version e.g. 2002-09-02 */
@ -63,19 +59,4 @@ public interface Status
* Get Connection Manager Port * Get Connection Manager Port
* @return Connection Manager Port */ * @return Connection Manager Port */
public int getFwPort( ); public int getFwPort( );
/**
* Get Version Count
* @return number of version inquiries */
public int getVersionCount( );
/**
* Get Database Count
* @return number of database inquiries */
public int getDatabaseCount( );
/**
* Describes the instance and its content for debugging purpose
* @return Debugging information about the instance and its content */
public String getStatus( );
} }

View File

@ -0,0 +1,140 @@
/******************************************************************************
* Product: Adempiere ERP & CRM Smart Business Solution *
* Copyright (C) 1999-2006 ComPiere, Inc. All Rights Reserved. *
* This program is free software; you can redistribute it and/or modify it *
* under the terms version 2 of the GNU General Public License as published *
* by the Free Software Foundation. This program is distributed in the hope *
* that it will be useful, but WITHOUT ANY WARRANTY; without even the implied *
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. *
* See the GNU General Public License for more details. *
* You should have received a copy of the GNU General Public License along *
* with this program; if not, write to the Free Software Foundation, Inc., *
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. *
* For the text or an alternative of this public license, you may reach us *
* ComPiere, Inc., 2620 Augustine Dr. #245, Santa Clara, CA 95054, USA *
* or via info@compiere.org or http://www.compiere.org/license.html *
*****************************************************************************/
package org.compiere.interfaces.impl;
import java.util.Properties;
import org.adempiere.util.ProcessUtil;
import org.compiere.acct.Doc;
import org.compiere.interfaces.Server;
import org.compiere.model.MAcctSchema;
import org.compiere.model.MTask;
import org.compiere.process.ProcessInfo;
import org.compiere.util.CLogger;
import org.compiere.util.CacheMgt;
import org.compiere.util.EMail;
import org.compiere.util.Env;
/**
* Adempiere Server Bean.
*
* @author Jorg Janke
* @version $Id: ServerBean.java,v 1.3 2006/07/30 00:53:33 jjanke Exp $
* @author Low Heng Sin
* - Added remote transaction management
* - Added support to run db process remotely on server
*
* @author Teo Sarca, SC ARHIPAC SERVICE SRL - BF [ 1757523 ]
*/
public class ServerBean implements Server
{
/** Logger */
private static CLogger log = CLogger.getCLogger(ServerBean.class);
//
/**
* Post Immediate
*
* @param ctx Client Context
* @param AD_Client_ID Client ID of Document
* @param AD_Table_ID Table ID of Document
* @param Record_ID Record ID of this document
* @param force force posting
* @return null, if success or error message
*/
public String postImmediate (Properties ctx,
int AD_Client_ID, int AD_Table_ID, int Record_ID, boolean force)
{
log.info ("Table=" + AD_Table_ID + ", Record=" + Record_ID);
MAcctSchema[] ass = MAcctSchema.getClientAcctSchema(ctx, AD_Client_ID);
return Doc.postImmediate(ass, AD_Table_ID, Record_ID, force, null);
} // postImmediate
/*************************************************************************
* Process Remote
*
* @param ctx Context
* @param pi Process Info
* @return resulting Process Info
*/
public ProcessInfo process (Properties ctx, ProcessInfo pi)
{
// Start Process
ProcessUtil.startJavaProcess(ctx, pi, null);
return pi;
} // process
/*************************************************************************
* Run Workflow (and wait) on Server
*
* @param ctx Context
* @param pi Process Info
* @param AD_Workflow_ID id
* @return process info
*/
public ProcessInfo workflow (Properties ctx, ProcessInfo pi, int AD_Workflow_ID)
{
log.info ("AD_Workflow_ID=" + AD_Workflow_ID);
ProcessUtil.startWorkFlow(ctx, pi, AD_Workflow_ID);
return pi;
} // workflow
/**
* Execute task on server
* @param ctx Context
* @param AD_Task_ID task
* @return execution trace
*/
public String executeTask (Properties ctx, int AD_Task_ID)
{
MTask task = new MTask (Env.getCtx(), AD_Task_ID, null); // Server Context
return task.execute();
} // executeTask
/**
* Cash Reset
* @param ctx Context
* @param tableName table name
* @param Record_ID record or 0 for all
* @return number of records reset
*/
public int cacheReset (Properties ctx, String tableName, int Record_ID)
{
log.config(tableName + " - " + Record_ID);
return CacheMgt.get().reset(tableName, Record_ID);
} // cacheReset
/**
* Execute db proces on server
* @param ctx Context
* @param processInfo
* @param procedureName
* @return ProcessInfo
*/
public ProcessInfo dbProcess(Properties ctx, ProcessInfo processInfo, String procedureName)
{
ProcessUtil.startDatabaseProcedure(processInfo, procedureName, null);
return processInfo;
}
@Override
public String sendEMail(Properties ctx, EMail email) {
return email.send();
}
} // ServerBean

View File

@ -0,0 +1,142 @@
/******************************************************************************
* Product: Adempiere ERP & CRM Smart Business Solution *
* Copyright (C) 1999-2006 ComPiere, Inc. All Rights Reserved. *
* This program is free software; you can redistribute it and/or modify it *
* under the terms version 2 of the GNU General Public License as published *
* by the Free Software Foundation. This program is distributed in the hope *
* that it will be useful, but WITHOUT ANY WARRANTY; without even the implied *
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. *
* See the GNU General Public License for more details. *
* You should have received a copy of the GNU General Public License along *
* with this program; if not, write to the Free Software Foundation, Inc., *
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. *
* For the text or an alternative of this public license, you may reach us *
* ComPiere, Inc., 2620 Augustine Dr. #245, Santa Clara, CA 95054, USA *
* or via info@compiere.org or http://www.compiere.org/license.html *
*****************************************************************************/
package org.compiere.interfaces.impl;
import org.compiere.Adempiere;
import org.compiere.db.CConnection;
import org.compiere.interfaces.Status;
import org.compiere.util.CLogger;
/**
* Adempiere Status Bean
*
* @author Jorg Janke
* @version $Id: StatusBean.java,v 1.3 2006/07/30 00:53:33 jjanke Exp $
*/
public class StatusBean implements Status
{
private static final String ALLOW_CLIENT_QUERY_DB_PWD = "adempiere.client.getDBPwd";
/** Logging */
@SuppressWarnings("unused")
private static CLogger log = CLogger.getCLogger(StatusBean.class);
/**
* Get Version (Date)
* @return version e.g. 2002-09-02
*/
public String getDateVersion()
{
return Adempiere.DATE_VERSION;
} // getDateVersion
/**
* Get Main Version
* @return main version - e.g. Version 2.4.3b
*/
public String getMainVersion()
{
return Adempiere.MAIN_VERSION;
} // getMainVersion
/**
* Get Database Type
* @return Database Type
*/
public String getDbType()
{
return CConnection.get().getType();
} // getDbType
/**
* Get Database Host
* @return Database Host Name
*/
public String getDbHost()
{
return CConnection.get().getDbHost();
} // getDbHost
/**
* Get Database Port
* @return Database Port
*/
public int getDbPort()
{
return CConnection.get().getDbPort();
} // getDbPort
/**
* Get Database SID
* @return Database SID
*/
public String getDbName()
{
return CConnection.get().getDbName();
} // getDbSID
/**
* Get Database URL
* @return Database URL
*/
public String getConnectionURL()
{
return CConnection.get().getConnectionURL();
} // getConnectionURL
/**
* Get Database UID
* @return Database User Name
*/
public String getDbUid()
{
return CConnection.get().getDbUid();
} // getDbUID
/**
* Get Database PWD
* @return Database User Password
*/
public String getDbPwd()
{
String f = System.getProperty(ALLOW_CLIENT_QUERY_DB_PWD);
if ("false".equalsIgnoreCase(f))
return "";
return CConnection.get().getDbPwd();
} // getDbPWD
/**
* Get Connection Manager Host
* @return Connection Manager Host
*/
public String getFwHost()
{
return CConnection.get().getFwHost();
} // getCMHost
/**
* Get Connection Manager Port
* @return Connection Manager Port
*/
public int getFwPort()
{
return CConnection.get().getFwPort();
} // getCMPort
} // StatusBean

View File

@ -32,13 +32,11 @@ import java.util.logging.Level;
import javax.mail.internet.InternetAddress; import javax.mail.internet.InternetAddress;
import org.compiere.db.CConnection; import org.compiere.db.CConnection;
import org.compiere.interfaces.Server;
import org.compiere.util.CCache; import org.compiere.util.CCache;
import org.compiere.util.CLogger; import org.compiere.util.CLogger;
import org.compiere.util.DB; import org.compiere.util.DB;
import org.compiere.util.EMail; import org.compiere.util.EMail;
import org.compiere.util.Env; import org.compiere.util.Env;
import org.compiere.util.Ini;
import org.compiere.util.Language; import org.compiere.util.Language;
/** /**
@ -106,6 +104,7 @@ public class MClient extends X_AD_Client
} // get } // get
/** Static Logger */ /** Static Logger */
@SuppressWarnings("unused")
private static CLogger s_log = CLogger.getCLogger (MClient.class); private static CLogger s_log = CLogger.getCLogger (MClient.class);
/** Cache */ /** Cache */
private static CCache<Integer,MClient> s_cache = new CCache<Integer,MClient>("AD_Client", 3); private static CCache<Integer,MClient> s_cache = new CCache<Integer,MClient>("AD_Client", 3);
@ -479,7 +478,15 @@ public class MClient extends X_AD_Client
return "Could not create EMail: " + getName(); return "Could not create EMail: " + getName();
try try
{ {
String msg = email.send(); String msg = null;
if (isServerEMail())
{
msg = CConnection.get().getServer().sendEMail(Env.getRemoteCallCtx(Env.getCtx()), email);
}
else
{
msg = email.send();
}
if (EMail.SENT_OK.equals (msg)) if (EMail.SENT_OK.equals (msg))
{ {
log.info("Sent Test EMail to " + getRequestEMail()); log.info("Sent Test EMail to " + getRequestEMail());
@ -599,7 +606,15 @@ public class MClient extends X_AD_Client
email.addAttachment(attachment); email.addAttachment(attachment);
try try
{ {
String msg = email.send(); String msg = null;
if (isServerEMail())
{
msg = CConnection.get().getServer().sendEMail(Env.getRemoteCallCtx(Env.getCtx()), email);
}
else
{
msg = email.send();
}
if (EMail.SENT_OK.equals (msg)) if (EMail.SENT_OK.equals (msg))
{ {
log.info("Sent EMail " + subject + " to " + to); log.info("Sent EMail " + subject + " to " + to);
@ -676,7 +691,15 @@ public class MClient extends X_AD_Client
*/ */
public boolean sendEmailNow(MUser from, MUser to, EMail email) public boolean sendEmailNow(MUser from, MUser to, EMail email)
{ {
String msg = email.send(); String msg = null;
if (isServerEMail())
{
msg = CConnection.get().getServer().sendEMail(Env.getRemoteCallCtx(Env.getCtx()), email);
}
else
{
msg = email.send();
}
// //
X_AD_UserMail um = new X_AD_UserMail(getCtx(), 0, null); X_AD_UserMail um = new X_AD_UserMail(getCtx(), 0, null);
um.setClientOrg(this); um.setClientOrg(this);
@ -749,29 +772,7 @@ public class MClient extends X_AD_Client
return null; return null;
} }
// //
EMail email = null; EMail email = new EMail (this,
if (isServerEMail() && Ini.isClient())
{
Server server = CConnection.get().getServer();
try
{
if (server != null)
{ // See ServerBean
if (html && message != null)
message = EMail.HTML_MAIL_MARKER + message;
email = server.createEMail(Env.getRemoteCallCtx(getCtx()), getAD_Client_ID(),
to, subject, message);
}
else
log.log(Level.WARNING, "No AppsServer");
}
catch (Exception ex)
{
log.log(Level.SEVERE, getName() + " - AppsServer error", ex);
}
}
if (email == null)
email = new EMail (this,
getRequestEMail(), to, getRequestEMail(), to,
subject, message, html); subject, message, html);
if (isSmtpAuthorization()) if (isSmtpAuthorization())
@ -861,30 +862,7 @@ public class MClient extends X_AD_Client
return null; return null;
} }
// //
EMail email = null; EMail email = new EMail (this,
if (isServerEMail() && Ini.isClient())
{
Server server = CConnection.get().getServer();
try
{
if (server != null)
{ // See ServerBean
if (html && message != null)
message = EMail.HTML_MAIL_MARKER + message;
email = server.createEMail(Env.getRemoteCallCtx(getCtx()), getAD_Client_ID(),
from.getAD_User_ID(),
to, subject, message);
}
else
log.log(Level.WARNING, "No AppsServer");
}
catch (Exception ex)
{
log.log(Level.SEVERE, getName() + " - AppsServer error", ex);
}
}
if (email == null)
email = new EMail (this,
from.getEMail(), from.getEMail(),
to, to,
subject, subject,

View File

@ -24,14 +24,11 @@ import java.util.Iterator;
import java.util.Properties; import java.util.Properties;
import java.util.logging.Level; import java.util.logging.Level;
import org.compiere.db.CConnection;
import org.compiere.interfaces.Server;
import org.compiere.util.CCache; import org.compiere.util.CCache;
import org.compiere.util.CLogger; import org.compiere.util.CLogger;
import org.compiere.util.DB; import org.compiere.util.DB;
import org.compiere.util.EMail; import org.compiere.util.EMail;
import org.compiere.util.Env; import org.compiere.util.Env;
import org.compiere.util.Ini;
import org.compiere.util.Msg; import org.compiere.util.Msg;
/** /**
@ -74,7 +71,7 @@ public class MStore extends X_W_Store
public static MStore get (Properties ctx, String contextPath) public static MStore get (Properties ctx, String contextPath)
{ {
MStore wstore = null; MStore wstore = null;
Iterator it = s_cache.values().iterator(); Iterator<?> it = s_cache.values().iterator();
while (it.hasNext()) while (it.hasNext())
{ {
wstore = (MStore)it.next(); wstore = (MStore)it.next();
@ -204,7 +201,7 @@ public class MStore extends X_W_Store
s_log.info(""); s_log.info("");
try try
{ {
Collection cc = s_cache.values(); Collection<?> cc = s_cache.values();
Object[] oo = cc.toArray(); Object[] oo = cc.toArray();
for (int i = 0; i < oo.length; i++) for (int i = 0; i < oo.length; i++)
s_log.info(i + ": " + oo[i]); s_log.info(i + ": " + oo[i]);
@ -353,31 +350,11 @@ public class MStore extends X_W_Store
return null; return null;
} }
// //
EMail email = null;
MClient client = MClient.get(getCtx(), getAD_Client_ID()); MClient client = MClient.get(getCtx(), getAD_Client_ID());
if (client.isServerEMail() && Ini.isClient())
{
Server server = CConnection.get().getServer();
try
{
if (server != null)
{ // See ServerBean
email = server.createEMail(Env.getRemoteCallCtx(getCtx()), getAD_Client_ID(),
to, subject, message);
}
else
log.log(Level.WARNING, "No AppsServer");
}
catch (Exception ex)
{
log.log(Level.SEVERE, getName() + " - AppsServer error", ex);
}
}
String from = getWStoreEMail(); String from = getWStoreEMail();
if (from == null || from.length() == 0) if (from == null || from.length() == 0)
from = client.getRequestEMail(); from = client.getRequestEMail();
if (email == null) EMail email = new EMail (client,
email = new EMail (client,
from, to, from, to,
subject, message); subject, message);
// Authorizetion // Authorizetion

View File

@ -141,7 +141,6 @@ public class ServerProcessCtl implements Runnable {
int AD_ReportView_ID = 0; int AD_ReportView_ID = 0;
int AD_Workflow_ID = 0; int AD_Workflow_ID = 0;
boolean IsReport = false; boolean IsReport = false;
boolean isPrintPreview = m_pi.isPrintPreview();
// //
String sql = "SELECT p.Name, p.ProcedureName,p.ClassName, p.AD_Process_ID," // 1..4 String sql = "SELECT p.Name, p.ProcedureName,p.ClassName, p.AD_Process_ID," // 1..4
@ -428,7 +427,6 @@ public class ServerProcessCtl implements Runnable {
// execute on this thread/connection // execute on this thread/connection
log.fine(ProcedureName + "(" + m_pi.getAD_PInstance_ID() + ")"); log.fine(ProcedureName + "(" + m_pi.getAD_PInstance_ID() + ")");
boolean started = false; boolean started = false;
String trxName = m_trx != null ? m_trx.getTrxName() : null;
if (m_IsServerProcess) if (m_IsServerProcess)
{ {
Server server = CConnection.get().getServer(); Server server = CConnection.get().getServer();
@ -436,7 +434,7 @@ public class ServerProcessCtl implements Runnable {
{ {
if (server != null) if (server != null)
{ // See ServerBean { // See ServerBean
m_pi = server.dbProcess(m_pi, ProcedureName); m_pi = server.dbProcess(Env.getRemoteCallCtx(Env.getCtx()), m_pi, ProcedureName);
log.finest("server => " + m_pi); log.finest("server => " + m_pi);
started = true; started = true;
} }

View File

@ -1,191 +0,0 @@
/******************************************************************************
* Product: Adempiere ERP & CRM Smart Business Solution *
* Copyright (C) 1999-2006 ComPiere, Inc. All Rights Reserved. *
* This program is free software; you can redistribute it and/or modify it *
* under the terms version 2 of the GNU General Public License as published *
* by the Free Software Foundation. This program is distributed in the hope *
* that it will be useful, but WITHOUT ANY WARRANTY; without even the implied *
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. *
* See the GNU General Public License for more details. *
* You should have received a copy of the GNU General Public License along *
* with this program; if not, write to the Free Software Foundation, Inc., *
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. *
* For the text or an alternative of this public license, you may reach us *
* ComPiere, Inc., 2620 Augustine Dr. #245, Santa Clara, CA 95054, USA *
* or via info@compiere.org or http://www.compiere.org/license.html *
*****************************************************************************/
package org.compiere.util;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.Hashtable;
import javax.naming.InitialContext;
import javax.naming.NamingEnumeration;
import org.compiere.interfaces.Status;
/**
* Apps Server Connection Test
*
* @author Jorg Janke
* @version $Id: ConnectTest.java,v 1.2 2006/07/30 00:54:35 jjanke Exp $
*/
public class ConnectTest
{
/**
* Connection Test Constructor
* @param serverName server name or IP
*/
public ConnectTest (String serverName)
{
System.out.println("ConnectTest: " + serverName);
System.out.println();
//
Hashtable<String,String> env = new Hashtable<String,String>();
env.put(InitialContext.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory");
env.put(InitialContext.URL_PKG_PREFIXES, "org.jboss.naming:org.jnp.interfaces");
env.put(InitialContext.PROVIDER_URL, serverName);
// env.put(InitialContext.SECURITY_PROTOCOL, ""); // "ssl"
// env.put(InitialContext.SECURITY_AUTHENTICATION, "none"); // "none", "simple", "strong"
// env.put(InitialContext.SECURITY_PRINCIPAL, "");
// env.put(InitialContext.SECURITY_CREDENTIALS, "");
// Get Context
System.out.println ("Creating context ...");
System.out.println (" " + env);
InitialContext context = null;
try
{
context = new InitialContext(env);
}
catch (Exception e)
{
System.err.println("ERROR: Could not create context: " + e);
return;
}
testJNP (serverName, context);
testEJB (serverName, context);
} // ConnectTest
/**
* Test JNP
* @param serverName server name
* @param context context
*/
private void testJNP (String serverName, InitialContext context)
{
// Connect to MBean
System.out.println();
System.out.println ("Connecting to MBean ...");
/**
try
{
String connectorName = "jmx:" + serverName + ":rmi";
RMIAdaptor server = (RMIAdaptor) context.lookup (connectorName);
System.out.println("- have Server");
System.out.println("- Default Domain=" + server.getDefaultDomain());
System.out.println("- MBeanCount = " + server.getMBeanCount());
// ObjectName serviceName = new ObjectName ("Adempiere:service=AdempiereCtrl");
// System.out.println("- " + serviceName + " is registered=" + server.isRegistered(serviceName));
// System.out.println(" - AdempiereSummary= "
// + server.getAttribute(serviceName, "AdempiereSummary"));
Object[] params = {};
String[] signature = {};
}
catch (Exception e)
{
System.err.println("ERROR: Could not contact MBean: " + e);
return;
}
**/
// List Context
System.out.println();
System.out.println(" Examining context ....");
try
{
System.out.println(" Namespace=" + context.getNameInNamespace());
System.out.println(" Environment=" + context.getEnvironment());
System.out.println(" Context '/':");
NamingEnumeration ne = context.list("/");
while (ne.hasMore())
System.out.println(" - " + ne.nextElement());
//
System.out.println(" Context 'ejb':");
ne = context.list("ejb");
while (ne.hasMore())
System.out.println(" - " + ne.nextElement());
//
System.out.println(" Context 'ejb/adempiere':");
ne = context.list("ejb/adempiere");
while (ne.hasMore())
System.out.println(" - " + ne.nextElement());
}
catch (Exception e)
{
System.err.println("ERROR: Could not examine context: " + e);
return;
}
} // testJNP
/**
* Test EJB
* @param serverName server name
* @param context context
*/
private void testEJB (String serverName, InitialContext context)
{
System.out.println();
System.out.println ("Connecting to EJB server ...");
try
{
System.out.println(" Name=" + Status.JNDI_NAME);
Status sta = (Status)context.lookup (Status.JNDI_NAME);
System.out.println(" .. bean created");
System.out.println(" ServerVersion=" + sta.getMainVersion() + " " + sta.getDateVersion());
System.out.println(" .. bean removed");
}
catch (Exception e)
{
System.err.println("ERROR: Could not connect: " + e);
return;
}
System.out.println();
System.out.println("SUCCESS !!");
} // testEJB
/**************************************************************************
* Start Method
* @param args serverName
*/
public static void main(String[] args)
{
String serverName = null;
if (args.length > 0)
serverName = args[0];
if (serverName == null || serverName.length() == 0)
{
try
{
serverName = InetAddress.getLocalHost().getHostName();
}
catch (UnknownHostException ex)
{
ex.printStackTrace();
}
}
// Start
ConnectTest ct = new ConnectTest (serverName);
} // main
} // ConnectionTest

View File

@ -19,6 +19,7 @@ package org.compiere.util;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.io.Serializable; import java.io.Serializable;
import java.net.MalformedURLException;
import java.net.URI; import java.net.URI;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
@ -170,7 +171,7 @@ public final class EMail implements Serializable
/** SMTP enable start TLS */ /** SMTP enable start TLS */
// @TODO - make tls configurable - private boolean m_smtpStarttlsEnable = false; // @TODO - make tls configurable - private boolean m_smtpStarttlsEnable = false;
/** Attachments */ /** Attachments */
private ArrayList<Object> m_attachments; private ArrayList<DataSource> m_attachments;
/** UserName and Password */ /** UserName and Password */
private EMailAuthenticator m_auth = null; private EMailAuthenticator m_auth = null;
/** Message */ /** Message */
@ -406,7 +407,7 @@ public final class EMail implements Serializable
return; return;
try try
{ {
Enumeration e = m_msg.getAllHeaderLines (); Enumeration<?> e = m_msg.getAllHeaderLines ();
while (e.hasMoreElements ()) while (e.hasMoreElements ())
log.fine("- " + e.nextElement ()); log.fine("- " + e.nextElement ());
} }
@ -785,8 +786,8 @@ public final class EMail implements Serializable
if (file == null) if (file == null)
return; return;
if (m_attachments == null) if (m_attachments == null)
m_attachments = new ArrayList<Object>(); m_attachments = new ArrayList<DataSource>();
m_attachments.add(file); m_attachments.add(new FileDataSource(file));
} // addAttachment } // addAttachment
/** /**
@ -811,8 +812,12 @@ public final class EMail implements Serializable
if (url == null) if (url == null)
return; return;
if (m_attachments == null) if (m_attachments == null)
m_attachments = new ArrayList<Object>(); m_attachments = new ArrayList<DataSource>();
m_attachments.add(url); try {
m_attachments.add(new URLDataSource(url.toURL()));
} catch (MalformedURLException e) {
throw new RuntimeException(e);
}
} // addAttachment } // addAttachment
/** /**
@ -837,7 +842,7 @@ public final class EMail implements Serializable
if (dataSource == null) if (dataSource == null)
return; return;
if (m_attachments == null) if (m_attachments == null)
m_attachments = new ArrayList<Object>(); m_attachments = new ArrayList<DataSource>();
m_attachments.add(dataSource); m_attachments.add(dataSource);
} // addAttachment } // addAttachment

View File

@ -1534,11 +1534,14 @@ public final class Env
Set<Object> keys = ctx.keySet(); Set<Object> keys = ctx.keySet();
for (Object key : keys) for (Object key : keys)
{ {
String s = key.toString(); if(!(key instanceof String))
if (s.startsWith("#") || s.startsWith("$")) continue;
{
p.put(key, ctx.get(key)); Object value = ctx.get(key);
} if (!(value instanceof String))
continue;
p.put(key, value);
} }
return p; return p;

View File

@ -242,8 +242,6 @@ public class Login
// Authentification // Authentification
boolean authenticated = false; boolean authenticated = false;
if (Ini.isClient())
CConnection.get().setAppServerCredential(app_user, app_pwd);
MSystem system = MSystem.get(m_ctx); MSystem system = MSystem.get(m_ctx);
if (system == null) if (system == null)
throw new IllegalStateException("No System Info"); throw new IllegalStateException("No System Info");