diff --git a/base/META-INF/MANIFEST.MF b/base/META-INF/MANIFEST.MF
index 859eeb45ad..520d9836dc 100644
--- a/base/META-INF/MANIFEST.MF
+++ b/base/META-INF/MANIFEST.MF
@@ -29,6 +29,7 @@ Export-Package: com.akunagroup.uk.postcode,
org.compiere.dbPort,
org.compiere.impexp,
org.compiere.interfaces,
+ org.compiere.interfaces.impl,
org.compiere.model,
org.compiere.print,
org.compiere.print.layout,
@@ -46,5 +47,7 @@ Bundle-RequiredExecutionEnvironment: JavaSE-1.6
Eclipse-ExtensibleAPI: true
Import-Package: net.sf.cglib.proxy,
org.eclipse.core.runtime;version="3.4.0",
- org.osgi.framework
+ org.osgi.framework,
+ org.restlet.representation,
+ org.restlet.util
diff --git a/base/plugin.xml b/base/plugin.xml
index f64414c49c..1f6d81fa85 100644
--- a/base/plugin.xml
+++ b/base/plugin.xml
@@ -7,5 +7,7 @@
+
+
diff --git a/base/schema/org.compiere.interfaces.Server.exsd b/base/schema/org.compiere.interfaces.Server.exsd
new file mode 100644
index 0000000000..1b0b256b44
--- /dev/null
+++ b/base/schema/org.compiere.interfaces.Server.exsd
@@ -0,0 +1,102 @@
+
+
+
+
+
+
+
+
+ [Enter description of this extension point.]
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ [Enter the first release in which this extension point appears.]
+
+
+
+
+
+
+
+
+ [Enter extension point usage example here.]
+
+
+
+
+
+
+
+
+ [Enter API information here.]
+
+
+
+
+
+
+
+
+ [Enter information about supplied implementation of this extension point.]
+
+
+
+
+
diff --git a/base/schema/org.compiere.interfaces.Status.exsd b/base/schema/org.compiere.interfaces.Status.exsd
new file mode 100644
index 0000000000..fd39332060
--- /dev/null
+++ b/base/schema/org.compiere.interfaces.Status.exsd
@@ -0,0 +1,102 @@
+
+
+
+
+
+
+
+
+ [Enter description of this extension point.]
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ [Enter the first release in which this extension point appears.]
+
+
+
+
+
+
+
+
+ [Enter extension point usage example here.]
+
+
+
+
+
+
+
+
+ [Enter API information here.]
+
+
+
+
+
+
+
+
+ [Enter information about supplied implementation of this extension point.]
+
+
+
+
+
diff --git a/base/src/org/adempiere/util/RestletUtil.java b/base/src/org/adempiere/util/RestletUtil.java
new file mode 100644
index 0000000000..ed4ba160e1
--- /dev/null
+++ b/base/src/org/adempiere/util/RestletUtil.java
@@ -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 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;
+ }
+ }
+}
diff --git a/base/src/org/compiere/db/CConnection.java b/base/src/org/compiere/db/CConnection.java
index 8657ebe06c..1c2b2c8ea8 100644
--- a/base/src/org/compiere/db/CConnection.java
+++ b/base/src/org/compiere/db/CConnection.java
@@ -26,11 +26,11 @@ import javax.naming.InitialContext;
import javax.sql.DataSource;
import javax.swing.JOptionPane;
+import org.adempiere.base.Service;
import org.compiere.Adempiere;
import org.compiere.interfaces.Server;
import org.compiere.interfaces.Status;
import org.compiere.util.CLogger;
-import org.compiere.util.Env;
import org.compiere.util.Ini;
import org.compiere.util.ValueNamePair;
@@ -72,9 +72,6 @@ public class CConnection implements Serializable, Cloneable
@Deprecated
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
* @return Connection Descriptor
@@ -98,7 +95,7 @@ public class CConnection implements Serializable, Cloneable
{
//hengsin, zero setup for webstart client
CConnection cc = null;
- if (apps_host != null && Adempiere.isWebStartClient() && !CConnection.isServerEmbedded())
+ if (apps_host != null && Adempiere.isWebStartClient())
{
cc = new CConnection(apps_host);
cc.setConnectionProfile(CConnection.PROFILE_LAN);
@@ -238,8 +235,10 @@ public class CConnection implements Serializable, Cloneable
private Server m_server = null;
/** DB Info */
private String m_dbInfo = null;
-
- private final static String SECURITY_PRINCIPAL = "org.adempiere.security.principal";
+ private int m_webPort;
+ private int m_sslPort;
+ private boolean m_queryAppsServer;
+ private SecurityPrincipal securityPrincipal;
/*************************************************************************
* Get Name
@@ -262,7 +261,7 @@ public class CConnection implements Serializable, Cloneable
/**
* Set Name
*/
- protected void setName ()
+ public void setName ()
{
m_name = toString ();
} // setName
@@ -288,6 +287,78 @@ public class CConnection implements Serializable, Cloneable
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
* @param tryContactAgain try to contact again
@@ -295,6 +366,26 @@ public class CConnection implements Serializable, Cloneable
*/
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;
} // isAppsOK
@@ -304,6 +395,7 @@ public class CConnection implements Serializable, Cloneable
*/
public synchronized Exception testAppsServer ()
{
+ m_appsException = null;
queryAppsServerInfo();
return getAppsServerException ();
} // testAppsServer
@@ -314,6 +406,10 @@ public class CConnection implements Serializable, Cloneable
*/
public Server getServer()
{
+ if (m_server == null)
+ {
+ m_server = Service.locate(Server.class);
+ }
return m_server;
} // getServer
@@ -957,23 +1053,35 @@ public class CConnection implements Serializable, Cloneable
public String toStringLong ()
{
StringBuffer sb = new StringBuffer ("CConnection[");
- sb.append ("name=").append (m_name)
- .append (",AppsHost=").append (m_apps_host)
- .append (",type=").append (m_type)
- .append (",DBhost=").append (m_db_host)
+ sb.append ("name=").append (escape(m_name))
+ .append (",AppsHost=").append (escape(m_apps_host))
+ .append (",WebPort=").append (m_webPort)
+ .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 (",DBname=").append (m_db_name)
+ .append (",DBname=").append (escape(m_db_name))
.append (",BQ=").append (m_bequeath)
.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 (",UID=").append (m_db_uid)
- .append (",PWD=").append (m_db_pwd)
+ .append (",UID=").append (escape(m_db_uid))
+ .append (",PWD=").append (escape(m_db_pwd))
+ .append("]");
; // the format is read by setAttributes
- sb.append ("]");
return sb.toString ();
} // 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(",", ",");
+ return value;
+ }
+
/**
* Set Attributes from String (pares toStringLong())
* @param attributes attributes
@@ -982,22 +1090,70 @@ public class CConnection implements Serializable, Cloneable
{
try
{
- setName (attributes.substring (attributes.indexOf ("name=") + 5, attributes.indexOf (",AppsHost=")));
- setAppsHost (attributes.substring (attributes.indexOf ("AppsHost=") + 9, attributes.indexOf (",type=")));
- //
- setType (attributes.substring (attributes.indexOf ("type=")+5, attributes.indexOf (",DBhost=")));
- setDbHost (attributes.substring (attributes.indexOf ("DBhost=") + 7, attributes.indexOf (",DBport=")));
- setDbPort (attributes.substring (attributes.indexOf ("DBport=") + 7, attributes.indexOf (",DBname=")));
- setDbName (attributes.substring (attributes.indexOf ("DBname=") + 7, attributes.indexOf (",BQ=")));
- //
- setBequeath (attributes.substring (attributes.indexOf ("BQ=") + 3, attributes.indexOf (",FW=")));
- setViaFirewall (attributes.substring (attributes.indexOf ("FW=") + 3, attributes.indexOf (",FWhost=")));
- setFwHost (attributes.substring (attributes.indexOf ("FWhost=") + 7, attributes.indexOf (",FWport=")));
- setFwPort (attributes.substring (attributes.indexOf ("FWport=") + 7, attributes.indexOf (",UID=")));
- //
- setDbUid (attributes.substring (attributes.indexOf ("UID=") + 4, attributes.indexOf (",PWD=")));
- setDbPwd (attributes.substring (attributes.indexOf ("PWD=") + 4, attributes.indexOf ("]")));
- //
+ attributes = attributes.substring(attributes.indexOf("[")+1, attributes.length() - 1);
+ String[] pairs= attributes.split("[,]");
+ for(String pair : pairs)
+ {
+ String[] pairComponents = pair.split("[=]");
+ String key = pairComponents[0];
+ String value = unescape(pairComponents[1]);
+ if ("name".equalsIgnoreCase(key))
+ {
+ setName(value);
+ }
+ else if ("AppsHost".equalsIgnoreCase(key))
+ {
+ setAppsHost(value);
+ }
+ 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)
{
@@ -1005,6 +1161,12 @@ public class CConnection implements Serializable, Cloneable
}
} // setAttributes
+ private String unescape(String value) {
+ value = value.replace("&eq;", "=");
+ value = value.replace(",", ",");
+ return value;
+ }
+
/**
* Equals
* @param o object
@@ -1105,37 +1267,6 @@ public class CConnection implements Serializable, Cloneable
return "";
} // 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.
* Sets m_dbException
@@ -1261,6 +1392,22 @@ public class CConnection implements Serializable, Cloneable
*/
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;
} // setAppsServerInfo
@@ -1293,7 +1440,7 @@ public class CConnection implements Serializable, Cloneable
//
setFwHost (svr.getFwHost ());
setFwPort (svr.getFwPort ());
- if (getFwHost ().length () == 0)
+ if (getFwHost() == null || getFwHost().length () == 0)
setViaFirewall (false);
m_version = svr.getDateVersion ();
log.config("Server=" + getDbHost() + ", DB=" + getDbName());
@@ -1353,21 +1500,18 @@ public class CConnection implements Serializable, Cloneable
return "" + transactionIsolation + "?>";
} // getTransactionIsolationInfo
- /**
- * @return true if server is embedded in process
- */
- public static boolean isServerEmbedded() {
- return "true".equalsIgnoreCase(System.getProperty(SERVER_EMBEDDED));
- }
-
- public void setAppServerCredential(String principal, String credential)
+ public void setAppServerCredential(String identity, char[] secret)
{
- SecurityPrincipal sp = new SecurityPrincipal();
- sp.principal = principal;
- sp.credential = credential;
- Env.getCtx().put(SECURITY_PRINCIPAL, sp);
+ securityPrincipal = new SecurityPrincipal();
+ securityPrincipal.identity = identity;
+ securityPrincipal.secret= secret;
m_server = null;
}
+
+ public SecurityPrincipal getAppServerCredential()
+ {
+ return securityPrincipal;
+ }
@Override
public Object clone() throws CloneNotSupportedException {
diff --git a/base/src/org/compiere/db/SecurityPrincipal.java b/base/src/org/compiere/db/SecurityPrincipal.java
index 6ac6a7dc19..19abd0b6bc 100644
--- a/base/src/org/compiere/db/SecurityPrincipal.java
+++ b/base/src/org/compiere/db/SecurityPrincipal.java
@@ -19,11 +19,11 @@ import java.io.Serializable;
* @author Low Heng Sin
*
*/
-class SecurityPrincipal implements Serializable {
+public class SecurityPrincipal implements Serializable {
/**
- *
+ * generated serial version id
*/
- private static final long serialVersionUID = -4703480025159571932L;
- String principal;
- String credential;
+ private static final long serialVersionUID = -6924078376448056295L;
+ public String identity;
+ public char[] secret;
}
diff --git a/base/src/org/compiere/interfaces/Server.java b/base/src/org/compiere/interfaces/Server.java
index d9be4475c6..b1aa61cf77 100644
--- a/base/src/org/compiere/interfaces/Server.java
+++ b/base/src/org/compiere/interfaces/Server.java
@@ -11,10 +11,6 @@ import org.compiere.util.EMail;
*/
public interface Server
{
- public final static String JNDI_NAME = "adempiere/Server";
-
- public final static String EJB_NAME = "adempiereServer";
-
/**
* Post Immediate
* @param ctx Client Context
@@ -22,10 +18,9 @@ public interface Server
* @param AD_Table_ID Table ID of Document
* @param Record_ID Record ID of this document
* @param force force posting
- * @param trxName ignore, retained for backward compatibility
* @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, String trxName);
+ int Record_ID, boolean force);
/**
* Process Remote
@@ -43,50 +38,32 @@ public interface Server
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 AD_Client_ID client
- * @param to recipient email address
- * @param subject subject
- * @param message message
- * @return EMail */
- public EMail createEMail( Properties ctx, int AD_Client_ID, String to,
- String subject, String message );
+ * @param email
+ * @return message return from email server */
+ public String sendEMail( Properties ctx, EMail email);
- /**
- * 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
+ * @param ctx Context
* @param AD_Task_ID task
* @return execution trace */
- public String executeTask( int AD_Task_ID );
+ public String executeTask( Properties ctx, int AD_Task_ID );
/**
* 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( 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( );
+ public int cacheReset( Properties ctx, String tableName,int Record_ID );
/**
* Execute db proces on server
+ * @param ctx Context
* @param processInfo
* @param procedureName
* @return ProcessInfo */
- public ProcessInfo dbProcess( ProcessInfo processInfo, String procedureName );
+ public ProcessInfo dbProcess( Properties ctx, ProcessInfo processInfo, String procedureName );
}
diff --git a/base/src/org/compiere/interfaces/Status.java b/base/src/org/compiere/interfaces/Status.java
index 794c51b59e..489624df55 100644
--- a/base/src/org/compiere/interfaces/Status.java
+++ b/base/src/org/compiere/interfaces/Status.java
@@ -5,10 +5,6 @@ package org.compiere.interfaces;
*/
public interface Status
{
- public final static String JNDI_NAME="adempiere/Status";
-
- public final static String EJB_NAME="adempiereStatus";
-
/**
* Get Version (Date)
* @return version e.g. 2002-09-02 */
@@ -63,19 +59,4 @@ public interface Status
* Get Connection Manager Port
* @return Connection Manager Port */
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( );
}
diff --git a/base/src/org/compiere/interfaces/impl/ServerBean.java b/base/src/org/compiere/interfaces/impl/ServerBean.java
new file mode 100644
index 0000000000..267ba12819
--- /dev/null
+++ b/base/src/org/compiere/interfaces/impl/ServerBean.java
@@ -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
diff --git a/base/src/org/compiere/interfaces/impl/StatusBean.java b/base/src/org/compiere/interfaces/impl/StatusBean.java
new file mode 100644
index 0000000000..02220546b5
--- /dev/null
+++ b/base/src/org/compiere/interfaces/impl/StatusBean.java
@@ -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
diff --git a/base/src/org/compiere/model/MClient.java b/base/src/org/compiere/model/MClient.java
index 2e4f3bc2ed..0333bb3f99 100644
--- a/base/src/org/compiere/model/MClient.java
+++ b/base/src/org/compiere/model/MClient.java
@@ -32,13 +32,11 @@ import java.util.logging.Level;
import javax.mail.internet.InternetAddress;
import org.compiere.db.CConnection;
-import org.compiere.interfaces.Server;
import org.compiere.util.CCache;
import org.compiere.util.CLogger;
import org.compiere.util.DB;
import org.compiere.util.EMail;
import org.compiere.util.Env;
-import org.compiere.util.Ini;
import org.compiere.util.Language;
/**
@@ -106,6 +104,7 @@ public class MClient extends X_AD_Client
} // get
/** Static Logger */
+ @SuppressWarnings("unused")
private static CLogger s_log = CLogger.getCLogger (MClient.class);
/** Cache */
private static CCache s_cache = new CCache("AD_Client", 3);
@@ -479,7 +478,15 @@ public class MClient extends X_AD_Client
return "Could not create EMail: " + getName();
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))
{
log.info("Sent Test EMail to " + getRequestEMail());
@@ -599,7 +606,15 @@ public class MClient extends X_AD_Client
email.addAttachment(attachment);
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))
{
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)
{
- 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);
um.setClientOrg(this);
@@ -749,29 +772,7 @@ public class MClient extends X_AD_Client
return null;
}
//
- EMail email = null;
- 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,
+ EMail email = new EMail (this,
getRequestEMail(), to,
subject, message, html);
if (isSmtpAuthorization())
@@ -861,30 +862,7 @@ public class MClient extends X_AD_Client
return null;
}
//
- EMail email = null;
- 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,
+ EMail email = new EMail (this,
from.getEMail(),
to,
subject,
diff --git a/base/src/org/compiere/model/MStore.java b/base/src/org/compiere/model/MStore.java
index 2466c2c1f1..258fb501bf 100644
--- a/base/src/org/compiere/model/MStore.java
+++ b/base/src/org/compiere/model/MStore.java
@@ -24,14 +24,11 @@ import java.util.Iterator;
import java.util.Properties;
import java.util.logging.Level;
-import org.compiere.db.CConnection;
-import org.compiere.interfaces.Server;
import org.compiere.util.CCache;
import org.compiere.util.CLogger;
import org.compiere.util.DB;
import org.compiere.util.EMail;
import org.compiere.util.Env;
-import org.compiere.util.Ini;
import org.compiere.util.Msg;
/**
@@ -74,7 +71,7 @@ public class MStore extends X_W_Store
public static MStore get (Properties ctx, String contextPath)
{
MStore wstore = null;
- Iterator it = s_cache.values().iterator();
+ Iterator> it = s_cache.values().iterator();
while (it.hasNext())
{
wstore = (MStore)it.next();
@@ -204,7 +201,7 @@ public class MStore extends X_W_Store
s_log.info("");
try
{
- Collection cc = s_cache.values();
+ Collection> cc = s_cache.values();
Object[] oo = cc.toArray();
for (int i = 0; i < oo.length; i++)
s_log.info(i + ": " + oo[i]);
@@ -353,31 +350,11 @@ public class MStore extends X_W_Store
return null;
}
//
- EMail email = null;
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();
if (from == null || from.length() == 0)
from = client.getRequestEMail();
- if (email == null)
- email = new EMail (client,
+ EMail email = new EMail (client,
from, to,
subject, message);
// Authorizetion
diff --git a/base/src/org/compiere/process/ServerProcessCtl.java b/base/src/org/compiere/process/ServerProcessCtl.java
index f2cd838e1a..389201ba34 100644
--- a/base/src/org/compiere/process/ServerProcessCtl.java
+++ b/base/src/org/compiere/process/ServerProcessCtl.java
@@ -141,7 +141,6 @@ public class ServerProcessCtl implements Runnable {
int AD_ReportView_ID = 0;
int AD_Workflow_ID = 0;
boolean IsReport = false;
- boolean isPrintPreview = m_pi.isPrintPreview();
//
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
log.fine(ProcedureName + "(" + m_pi.getAD_PInstance_ID() + ")");
boolean started = false;
- String trxName = m_trx != null ? m_trx.getTrxName() : null;
if (m_IsServerProcess)
{
Server server = CConnection.get().getServer();
@@ -436,7 +434,7 @@ public class ServerProcessCtl implements Runnable {
{
if (server != null)
{ // 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);
started = true;
}
diff --git a/base/src/org/compiere/util/ConnectTest.java b/base/src/org/compiere/util/ConnectTest.java
deleted file mode 100644
index 055aea6e09..0000000000
--- a/base/src/org/compiere/util/ConnectTest.java
+++ /dev/null
@@ -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 env = new Hashtable();
- 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
diff --git a/base/src/org/compiere/util/EMail.java b/base/src/org/compiere/util/EMail.java
index 2298f7b27d..5f8b17e614 100644
--- a/base/src/org/compiere/util/EMail.java
+++ b/base/src/org/compiere/util/EMail.java
@@ -19,6 +19,7 @@ package org.compiere.util;
import java.io.File;
import java.io.IOException;
import java.io.Serializable;
+import java.net.MalformedURLException;
import java.net.URI;
import java.util.ArrayList;
import java.util.Collection;
@@ -170,7 +171,7 @@ public final class EMail implements Serializable
/** SMTP enable start TLS */
// @TODO - make tls configurable - private boolean m_smtpStarttlsEnable = false;
/** Attachments */
- private ArrayList