axis-java-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From ami...@apache.org
Subject svn commit: r776555 - in /webservices/axis2/trunk/java/modules: jaxws/src/org/apache/axis2/jaxws/framework/ kernel/src/org/apache/axis2/ kernel/src/org/apache/axis2/deployment/ kernel/src/org/apache/axis2/deployment/repository/util/ kernel/src/org/apac...
Date Wed, 20 May 2009 05:12:58 GMT
Author: amilas
Date: Wed May 20 05:12:58 2009
New Revision: 776555

URL: http://svn.apache.org/viewvc?rev=776555&view=rev
Log:
applied the patch for AXIS2-4349

Modified:
    webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/framework/JAXWSDeployer.java
    webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/Constants.java
    webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/deployment/DeploymentClassLoader.java
    webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/deployment/DeploymentEngine.java
    webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/deployment/ModuleDeployer.java
    webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/deployment/POJODeployer.java
    webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/deployment/ServiceDeployer.java
    webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/deployment/TransportDeployer.java
    webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/deployment/repository/util/DeploymentFileData.java
    webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/deployment/util/Utils.java
    webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/description/AxisDescription.java
    webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/engine/AxisConfiguration.java

Modified: webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/framework/JAXWSDeployer.java
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/framework/JAXWSDeployer.java?rev=776555&r1=776554&r2=776555&view=diff
==============================================================================
--- webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/framework/JAXWSDeployer.java
(original)
+++ webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/framework/JAXWSDeployer.java
Wed May 20 05:12:58 2009
@@ -102,7 +102,8 @@
                         axisConfig.getSystemClassLoader(),
                         true,
                         (File) axisConfig.
-                                getParameterValue(Constants.Configuration.ARTIFACTS_TEMP_DIR));
+                                getParameterValue(Constants.Configuration.ARTIFACTS_TEMP_DIR),
+                        axisConfig.isChildFirstClassLoading());
                 Thread.currentThread().setContextClassLoader(classLoader);
                 deployClasses("JAXWS-Builtin", file.toURL(), Thread.currentThread().getContextClassLoader(),
classList);
             } catch (Exception e) {
@@ -151,7 +152,8 @@
                         axisConfig.getSystemClassLoader(),
                         true,
                         (File) axisConfig.
-                                getParameterValue(Constants.Configuration.ARTIFACTS_TEMP_DIR));
+                                getParameterValue(Constants.Configuration.ARTIFACTS_TEMP_DIR),
+                        axisConfig.isChildFirstClassLoading());
                 Thread.currentThread().setContextClassLoader(classLoader);
 
                 ArrayList classList = getListOfClasses(deploymentFileData);

Modified: webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/Constants.java
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/Constants.java?rev=776555&r1=776554&r2=776555&view=diff
==============================================================================
--- webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/Constants.java (original)
+++ webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/Constants.java Wed May
20 05:12:58 2009
@@ -438,6 +438,13 @@
         public static final String REST_METHOD_PARAM="RESTMethod";
         public static final String REST_INPUTSERIALIZE_PARAM="RESTInputSerialization";
         public static final String REST_OUTPUTSERIALIZE_PARAM="RESTOutputSerialization";
-        
+
+        /**
+         *  this parameter enables child first class loading.
+         *  so the modules and services first use the classes in their class loader first
+         */
+
+        public static final String ENABLE_CHILD_FIRST_CLASS_LOADING="EnableChldFirstClassLoading";
+
     }
 }

Modified: webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/deployment/DeploymentClassLoader.java
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/deployment/DeploymentClassLoader.java?rev=776555&r1=776554&r2=776555&view=diff
==============================================================================
--- webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/deployment/DeploymentClassLoader.java
(original)
+++ webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/deployment/DeploymentClassLoader.java
Wed May 20 05:12:58 2009
@@ -43,6 +43,8 @@
     // List of jar files inside the jars in the original url
     private List embedded_jars;
 
+    private boolean isChildFirstClassLoading;
+
     /**
      * DeploymentClassLoader is extended from URLClassLoader. The constructor
      * does not override the super constructor, but takes in an addition list of
@@ -51,10 +53,14 @@
      * @param urls   <code>URL</code>s
      * @param parent parent classloader <code>ClassLoader</code>
      */
-    public DeploymentClassLoader(URL[] urls, List embedded_jars, ClassLoader parent) {
+    public DeploymentClassLoader(URL[] urls,
+                                 List embedded_jars,
+                                 ClassLoader parent,
+                                 boolean isChildFirstClassLoading) {
         super(urls, parent);
         this.urls = urls;
         this.embedded_jars = embedded_jars;
+        this.isChildFirstClassLoading = isChildFirstClassLoading;
     }
 
     /**
@@ -260,4 +266,21 @@
         }
         return null;
     }
+
+    protected synchronized Class<?> loadClass(String name, boolean resolve) throws
ClassNotFoundException {
+        Class c = null;
+        if (!isChildFirstClassLoading) {
+            c = super.loadClass(name, resolve);
+        } else {
+            c = findLoadedClass(name);
+            if (c == null) {
+                try {
+                    c = findClass(name);
+                } catch (Exception e) {
+                    c = super.loadClass(name, resolve);
+                }
+            }
+        }
+        return c;
+    }
 }

Modified: webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/deployment/DeploymentEngine.java
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/deployment/DeploymentEngine.java?rev=776555&r1=776554&r2=776555&view=diff
==============================================================================
--- webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/deployment/DeploymentEngine.java
(original)
+++ webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/deployment/DeploymentEngine.java
Wed May 20 05:12:58 2009
@@ -311,7 +311,8 @@
                                     new URL[]{moduleurl},
                                     axisConfig.getModuleClassLoader(),
                                     true,
-                                    (File) axisConfig.getParameterValue(Constants.Configuration.ARTIFACTS_TEMP_DIR));
+                                    (File) axisConfig.getParameterValue(Constants.Configuration.ARTIFACTS_TEMP_DIR),
+                                    axisConfig.isChildFirstClassLoading());
                     AxisModule module = new AxisModule();
                     module.setModuleClassLoader(deploymentClassLoader);
                     module.setParent(axisConfig);
@@ -367,7 +368,8 @@
                     new URL[]{servicesURL},
                     axisConfig.getServiceClassLoader(),
                     true,
-                    (File) axisConfig.getParameterValue(Constants.Configuration.ARTIFACTS_TEMP_DIR));
+                    (File) axisConfig.getParameterValue(Constants.Configuration.ARTIFACTS_TEMP_DIR),
+                    axisConfig.isChildFirstClassLoading());
             String metainf = "meta-inf";
             serviceGroup.setServiceGroupClassLoader(serviceClassLoader);
             //processing wsdl.list
@@ -1163,7 +1165,8 @@
             axismodule = new AxisModule();
             ArchiveReader archiveReader = new ArchiveReader();
 
-            currentDeploymentFile.setClassLoader(false, config.getModuleClassLoader(), null);
+            currentDeploymentFile.setClassLoader(false, config.getModuleClassLoader(), null,
+                    config.isChildFirstClassLoading());
             axismodule.setModuleClassLoader(currentDeploymentFile.getClassLoader());
             archiveReader.readModuleArchive(currentDeploymentFile, axismodule,
                                             false, config);
@@ -1266,7 +1269,8 @@
             throws AxisFault {
         try {
             DeploymentFileData currentDeploymentFile = new DeploymentFileData(serviceFile,
null);
-            DeploymentClassLoader classLoader = Utils.createClassLoader(serviceFile);
+            DeploymentClassLoader classLoader = Utils.createClassLoader(serviceFile,
+                    configCtx.getAxisConfiguration().isChildFirstClassLoading());
             currentDeploymentFile.setClassLoader(classLoader);
             AxisServiceGroup serviceGroup = new AxisServiceGroup();
             serviceGroup.setServiceGroupClassLoader(classLoader);

Modified: webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/deployment/ModuleDeployer.java
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/deployment/ModuleDeployer.java?rev=776555&r1=776554&r2=776555&view=diff
==============================================================================
--- webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/deployment/ModuleDeployer.java
(original)
+++ webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/deployment/ModuleDeployer.java
Wed May 20 05:12:58 2009
@@ -25,9 +25,11 @@
 import org.apache.axis2.deployment.repository.util.ArchiveReader;
 import org.apache.axis2.deployment.repository.util.DeploymentFileData;
 import org.apache.axis2.description.AxisModule;
+import org.apache.axis2.description.Parameter;
 import org.apache.axis2.engine.AxisConfiguration;
 import org.apache.axis2.i18n.Messages;
 import org.apache.axis2.util.Utils;
+import org.apache.axis2.util.JavaUtils;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 
@@ -62,9 +64,11 @@
         StringWriter errorWriter = new StringWriter();
         boolean isDirectory = deploymentFileData.getFile().isDirectory();
         try {
+
             deploymentFileData.setClassLoader(isDirectory,
                                               axisConfig.getModuleClassLoader(),
-                    (File)axisConfig.getParameterValue(Constants.Configuration.ARTIFACTS_TEMP_DIR));
+                    (File)axisConfig.getParameterValue(Constants.Configuration.ARTIFACTS_TEMP_DIR),
+                    this.axisConfig.isChildFirstClassLoading());
             AxisModule metaData = new AxisModule();
             metaData.setModuleClassLoader(deploymentFileData.getClassLoader());
             metaData.setParent(axisConfig);

Modified: webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/deployment/POJODeployer.java
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/deployment/POJODeployer.java?rev=776555&r1=776554&r2=776555&view=diff
==============================================================================
--- webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/deployment/POJODeployer.java
(original)
+++ webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/deployment/POJODeployer.java
Wed May 20 05:12:58 2009
@@ -147,7 +147,8 @@
                             configCtx.getAxisConfiguration().getSystemClassLoader(),
                             true,
                             (File)configCtx.getAxisConfiguration().
-                                    getParameterValue(Constants.Configuration.ARTIFACTS_TEMP_DIR));
+                                    getParameterValue(Constants.Configuration.ARTIFACTS_TEMP_DIR),
+                            configCtx.getAxisConfiguration().isChildFirstClassLoading());
                     Thread.currentThread().setContextClassLoader(classLoader);
                     className = className.replaceAll(".class", "");
                     className = className.replaceAll("/", ".");

Modified: webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/deployment/ServiceDeployer.java
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/deployment/ServiceDeployer.java?rev=776555&r1=776554&r2=776555&view=diff
==============================================================================
--- webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/deployment/ServiceDeployer.java
(original)
+++ webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/deployment/ServiceDeployer.java
Wed May 20 05:12:58 2009
@@ -63,7 +63,8 @@
         try {
             deploymentFileData.setClassLoader(isDirectory,
                                               axisConfig.getServiceClassLoader(),
-                    (File)axisConfig.getParameterValue(Constants.Configuration.ARTIFACTS_TEMP_DIR));
+                    (File)axisConfig.getParameterValue(Constants.Configuration.ARTIFACTS_TEMP_DIR),
+                    axisConfig.isChildFirstClassLoading());
             HashMap wsdlservice = archiveReader.processWSDLs(deploymentFileData);
             if (wsdlservice != null && wsdlservice.size() > 0) {
                 Iterator services = wsdlservice.values().iterator();

Modified: webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/deployment/TransportDeployer.java
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/deployment/TransportDeployer.java?rev=776555&r1=776554&r2=776555&view=diff
==============================================================================
--- webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/deployment/TransportDeployer.java
(original)
+++ webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/deployment/TransportDeployer.java
Wed May 20 05:12:58 2009
@@ -53,7 +53,8 @@
         try {
             deploymentFileData.setClassLoader(isDirectory,
                     axisConfig.getModuleClassLoader(),
-                    (File) axisConfig.getParameterValue(Constants.Configuration.ARTIFACTS_TEMP_DIR));
+                    (File) axisConfig.getParameterValue(Constants.Configuration.ARTIFACTS_TEMP_DIR),
+                    axisConfig.isChildFirstClassLoading());
 
             ClassLoader loader = deploymentFileData.getClassLoader();
             Thread.currentThread().setContextClassLoader(loader);

Modified: webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/deployment/repository/util/DeploymentFileData.java
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/deployment/repository/util/DeploymentFileData.java?rev=776555&r1=776554&r2=776555&view=diff
==============================================================================
--- webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/deployment/repository/util/DeploymentFileData.java
(original)
+++ webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/deployment/repository/util/DeploymentFileData.java
Wed May 20 05:12:58 2009
@@ -102,7 +102,7 @@
         this.classLoader = classLoader;
     }
 
-    public void setClassLoader(boolean isDirectory, ClassLoader parent, File file) throws
AxisFault {
+    public void setClassLoader(boolean isDirectory, ClassLoader parent, File file, boolean
isChildFirstClassLoading) throws AxisFault {
         if (!isDirectory) {
             if (this.file != null) {
                 URL[] urlsToLoadFrom;
@@ -112,7 +112,7 @@
                                                                 this.file.getAbsolutePath()));
                     }
                     urlsToLoadFrom = new URL[]{this.file.toURL()};
-                    classLoader = Utils.createClassLoader(urlsToLoadFrom, parent, true, file);
+                    classLoader = Utils.createClassLoader(urlsToLoadFrom, parent, true, file,
isChildFirstClassLoading);
                 } catch (Exception e) {
                     throw AxisFault.makeFault(e);
                 }

Modified: webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/deployment/util/Utils.java
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/deployment/util/Utils.java?rev=776555&r1=776554&r2=776555&view=diff
==============================================================================
--- webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/deployment/util/Utils.java
(original)
+++ webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/deployment/util/Utils.java
Wed May 20 05:12:58 2009
@@ -667,13 +667,10 @@
                     DeploymentFileData filedata = new DeploymentFileData(
                             inputFile);
 
-                    filedata
-                            .setClassLoader(
-                                    false,
+                    filedata.setClassLoader(false,
                                     moduleClassLoader,
-                                    (File)axisConfig
-                                            .getParameterValue(
-                                                    Constants.Configuration.ARTIFACTS_TEMP_DIR));
+                                    (File)axisConfig.getParameterValue(Constants.Configuration.ARTIFACTS_TEMP_DIR),
+                                    axisConfig.isChildFirstClassLoading());
                     HashMap wsdlservice = archiveReader.processWSDLs(filedata);
                     if (wsdlservice != null && wsdlservice.size() > 0) {
                         Iterator servicesitr = wsdlservice.values().iterator();
@@ -846,7 +843,7 @@
         excludeList.add("shutDown");
     }
 
-    public static DeploymentClassLoader createClassLoader(File serviceFile)
+    public static DeploymentClassLoader createClassLoader(File serviceFile, boolean isChildFirstClassLoading)
             throws MalformedURLException {
         ClassLoader contextClassLoader =
                 (ClassLoader)org.apache.axis2.java.security.AccessController
@@ -856,13 +853,14 @@
                             }
                         });
         return createDeploymentClassLoader(new URL[]{serviceFile.toURL()},
-                                           contextClassLoader, new ArrayList());
+                                           contextClassLoader, new ArrayList(), isChildFirstClassLoading);
     }
 
     public static ClassLoader createClassLoader(ArrayList urls,
                                                 ClassLoader serviceClassLoader,
                                                 boolean extractJars,
-                                                File tmpDir) {
+                                                File tmpDir,
+                                                boolean isChildFirstClassLoading) {
         URL url = (URL)urls.get(0);
         if (extractJars) {
             try {
@@ -871,7 +869,7 @@
                 urls.addAll(0, Arrays.asList(urls1));
                 URL[] urls2 = (URL[])urls.toArray(new URL[urls.size()]);
                 return createDeploymentClassLoader(urls2, serviceClassLoader,
-                                                   null);
+                                                   null, isChildFirstClassLoading);
             } catch (Exception e) {
                 log
                         .warn("Exception extracting jars into temporary directory : "
@@ -883,7 +881,7 @@
         List embedded_jars = Utils.findLibJars(url);
         URL[] urls2 = (URL[])urls.toArray(new URL[urls.size()]);
         return createDeploymentClassLoader(urls2, serviceClassLoader,
-                                           embedded_jars);
+                                           embedded_jars, isChildFirstClassLoading);
     }
 
     public static File toFile(URL url) throws UnsupportedEncodingException {
@@ -894,12 +892,13 @@
     public static ClassLoader createClassLoader(URL[] urls,
                                                 ClassLoader serviceClassLoader,
                                                 boolean extractJars,
-                                                File tmpDir) {
+                                                File tmpDir,
+                                                boolean isChildFirstClassLoading) {
         if (extractJars) {
             try {
                 URL[] urls1 = Utils.getURLsForAllJars(urls[0], tmpDir);
                 return createDeploymentClassLoader(urls1, serviceClassLoader,
-                                                   null);
+                                                   null, isChildFirstClassLoading);
             } catch (Exception e) {
                 log
                         .warn("Exception extracting jars into temporary directory : "
@@ -910,17 +909,17 @@
         }
         List embedded_jars = Utils.findLibJars(urls[0]);
         return createDeploymentClassLoader(urls, serviceClassLoader,
-                                           embedded_jars);
+                                           embedded_jars, isChildFirstClassLoading);
     }
 
     private static DeploymentClassLoader createDeploymentClassLoader(
             final URL[] urls, final ClassLoader serviceClassLoader,
-            final List embeddedJars) {
+            final List embeddedJars, final boolean isChildFirstClassLoading) {
         return (DeploymentClassLoader)AccessController
                 .doPrivileged(new PrivilegedAction() {
                     public Object run() {
                         return new DeploymentClassLoader(urls, embeddedJars,
-                                                         serviceClassLoader);
+                                                         serviceClassLoader, isChildFirstClassLoading);
                     }
                 });
     }

Modified: webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/description/AxisDescription.java
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/description/AxisDescription.java?rev=776555&r1=776554&r2=776555&view=diff
==============================================================================
--- webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/description/AxisDescription.java
(original)
+++ webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/description/AxisDescription.java
Wed May 20 05:12:58 2009
@@ -25,6 +25,7 @@
 import org.apache.axiom.om.OMNode;
 import org.apache.axiom.om.OMText;
 import org.apache.axis2.AxisFault;
+import org.apache.axis2.Constants;
 import org.apache.axis2.engine.AxisConfiguration;
 import org.apache.axis2.i18n.Messages;
 import org.apache.axis2.modules.Module;
@@ -566,4 +567,6 @@
         return policySubject;
     }
 
+    
+
 }

Modified: webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/engine/AxisConfiguration.java
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/engine/AxisConfiguration.java?rev=776555&r1=776554&r2=776555&view=diff
==============================================================================
--- webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/engine/AxisConfiguration.java
(original)
+++ webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/engine/AxisConfiguration.java
Wed May 20 05:12:58 2009
@@ -34,6 +34,7 @@
 import javax.xml.namespace.QName;
 
 import org.apache.axis2.AxisFault;
+import org.apache.axis2.Constants;
 import org.apache.axis2.transaction.TransactionConfiguration;
 import org.apache.axis2.builder.Builder;
 import org.apache.axis2.builder.unknowncontent.UnknownContentBuilder;
@@ -62,6 +63,7 @@
 import org.apache.axis2.util.TargetResolver;
 import org.apache.axis2.util.Utils;
 import org.apache.axis2.util.FaultyServiceData;
+import org.apache.axis2.util.JavaUtils;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 
@@ -1426,4 +1428,13 @@
 					axisService, axisConfiguration);
 		}
 	}
+
+    public boolean isChildFirstClassLoading(){
+        boolean childFirstClassLoading = false;
+        Parameter isChildFirstClassLoading = this.getParameter(Constants.Configuration.ENABLE_CHILD_FIRST_CLASS_LOADING);
+        if (isChildFirstClassLoading != null){
+             childFirstClassLoading = JavaUtils.isTrueExplicitly(isChildFirstClassLoading.getValue());
+        }
+        return childFirstClassLoading;
+    }
 }



Mime
View raw message