openwebbeans-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From strub...@apache.org
Subject svn commit: r1606260 - in /openwebbeans/trunk/webbeans-impl/src: main/java/org/apache/webbeans/container/ main/java/org/apache/webbeans/portable/ main/java/org/apache/webbeans/portable/events/ test/java/org/apache/webbeans/test/mock/
Date Fri, 27 Jun 2014 22:18:40 GMT
Author: struberg
Date: Fri Jun 27 22:18:40 2014
New Revision: 1606260

URL: http://svn.apache.org/r1606260
Log:
OWB-976 remove AbstractBeanManager

Removed:
    openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/container/AbstractBeanManager.java
Modified:
    openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/container/BeanManagerImpl.java
    openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/container/InjectableBeanManager.java
    openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/ExtensionProducer.java
    openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/events/ExtensionLoader.java
    openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/mock/MockManager.java

Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/container/BeanManagerImpl.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/container/BeanManagerImpl.java?rev=1606260&r1=1606259&r2=1606260&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/container/BeanManagerImpl.java
(original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/container/BeanManagerImpl.java
Fri Jun 27 22:18:40 2014
@@ -42,18 +42,7 @@ import javax.enterprise.context.spi.Cont
 import javax.enterprise.context.spi.CreationalContext;
 import javax.enterprise.inject.Default;
 import javax.enterprise.inject.Stereotype;
-import javax.enterprise.inject.spi.AnnotatedType;
-import javax.enterprise.inject.spi.Bean;
-import javax.enterprise.inject.spi.BeanManager;
-import javax.enterprise.inject.spi.Decorator;
-import javax.enterprise.inject.spi.EventMetadata;
-import javax.enterprise.inject.spi.InjectionPoint;
-import javax.enterprise.inject.spi.InjectionTarget;
-import javax.enterprise.inject.spi.InterceptionType;
-import javax.enterprise.inject.spi.Interceptor;
-import javax.enterprise.inject.spi.ObserverMethod;
-import javax.enterprise.inject.spi.PassivationCapable;
-import javax.enterprise.inject.spi.Producer;
+import javax.enterprise.inject.spi.*;
 import javax.inject.Scope;
 import javax.interceptor.InterceptorBinding;
 import javax.naming.NamingException;
@@ -63,9 +52,14 @@ import javax.naming.StringRefAddr;
 
 import org.apache.webbeans.component.AbstractOwbBean;
 import org.apache.webbeans.component.EnterpriseBeanMarker;
+import org.apache.webbeans.component.InjectionTargetBean;
 import org.apache.webbeans.component.JmsBeanMarker;
 import org.apache.webbeans.component.NewBean;
 import org.apache.webbeans.component.OwbBean;
+import org.apache.webbeans.component.WebBeansType;
+import org.apache.webbeans.component.creation.BeanAttributesBuilder;
+import org.apache.webbeans.component.creation.FieldProducerFactory;
+import org.apache.webbeans.component.creation.MethodProducerFactory;
 import org.apache.webbeans.component.third.PassivationCapableThirdpartyBeanImpl;
 import org.apache.webbeans.component.third.ThirdpartyBeanImpl;
 import org.apache.webbeans.config.WebBeansContext;
@@ -76,8 +70,6 @@ import org.apache.webbeans.event.Notific
 import org.apache.webbeans.exception.WebBeansConfigurationException;
 import org.apache.webbeans.exception.definition.DuplicateDefinitionException;
 
-import javax.enterprise.inject.spi.DefinitionException;
-
 import org.apache.webbeans.plugins.OpenWebBeansJmsPlugin;
 import org.apache.webbeans.portable.AnnotatedElementFactory;
 import org.apache.webbeans.portable.events.discovery.ErrorStack;
@@ -101,7 +93,7 @@ import org.apache.webbeans.util.WebBeans
  * @see BeanManager 
  */
 @SuppressWarnings("unchecked")
-public class BeanManagerImpl extends AbstractBeanManager implements BeanManager, Referenceable
+public class BeanManagerImpl implements BeanManager, Referenceable
 {
     private static final long serialVersionUID = 2L;
 
@@ -213,7 +205,6 @@ public class BeanManagerImpl extends Abs
         annotatedElementFactory = webBeansContext.getAnnotatedElementFactory();
     }
 
-    @Override
     public WebBeansContext getWebBeansContext()
     {
         return webBeansContext;
@@ -728,6 +719,66 @@ public class BeanManagerImpl extends Abs
         return instance;
     }
 
+    /**
+     * {@inheritDoc}
+     */
+    public BeanAttributes<?> createBeanAttributes(AnnotatedMember<?> member)
+    {
+        if (member instanceof AnnotatedField)
+        {
+            return BeanAttributesBuilder.forContext(webBeansContext).newBeanAttibutes((AnnotatedField<?>)member).build();
+        }
+        else if (member instanceof AnnotatedMethod)
+        {
+            return BeanAttributesBuilder.forContext(webBeansContext).newBeanAttibutes((AnnotatedMethod<?>)member).build();
+        }
+        else
+        {
+            throw new IllegalArgumentException("Unsupported member type " + member.getClass().getName());
+        }
+    }
+
+    public InjectionPoint createInjectionPoint(AnnotatedField<?> field)
+    {
+        return webBeansContext.getInjectionPointFactory().buildInjectionPoint(null, field);
+    }
+
+    public InjectionPoint createInjectionPoint(AnnotatedParameter<?> parameter)
+    {
+        return webBeansContext.getInjectionPointFactory().buildInjectionPoint(null, parameter);
+    }
+
+    public <X> ProducerFactory<X> getProducerFactory(AnnotatedField<? super
X> field, Bean<X> bean)
+    {
+        return new FieldProducerFactory<X>(field, bean, webBeansContext);
+    }
+
+    public <X> ProducerFactory<X> getProducerFactory(AnnotatedMethod<? super
X> method, Bean<X> bean)
+    {
+        return new MethodProducerFactory<X>(method, bean, webBeansContext);
+    }
+
+    public <X> InjectionTargetFactory<X> getInjectionTargetFactory(AnnotatedType<X>
type)
+    {
+        return new InjectionTargetFactoryImpl<X>(type, webBeansContext);
+    }
+
+    public <T> Bean<T> createBean(BeanAttributes<T> attributes, Class<T>
type, InjectionTargetFactory<T> factory)
+    {
+        AnnotatedType<T> annotatedType = webBeansContext.getAnnotatedElementFactory().getAnnotatedType(type);
+        if (annotatedType == null)
+        {
+            annotatedType = webBeansContext.getAnnotatedElementFactory().newAnnotatedType(type);
+        }
+        return new InjectionTargetBean<T>(
+                webBeansContext,
+                WebBeansType.THIRDPARTY,
+                annotatedType,
+                attributes,
+                type,
+                factory);
+    }
+
 
     private boolean isBeanTypeAssignableToGivenType(Set<Type> beanTypes, Type givenType,
boolean newBean)
     {
@@ -917,6 +968,47 @@ public class BeanManagerImpl extends Abs
         return AnnotationUtil.hasAnnotation(annotationType.getDeclaredAnnotations(), Stereotype.class);
     }
 
+    public boolean areInterceptorBindingsEquivalent(Annotation annotation1, Annotation annotation2)
+    {
+        return AnnotationUtil.isCdiAnnotationEqual(annotation1, annotation2);
+    }
+
+    public boolean areQualifiersEquivalent(Annotation annotation1, Annotation annotation2)
+    {
+        return AnnotationUtil.isCdiAnnotationEqual(annotation1, annotation2);
+    }
+
+    public int getInterceptorBindingHashCode(Annotation annotation)
+    {
+        return AnnotationUtil.getCdiAnnotationHashCode(annotation);
+    }
+
+    public int getQualifierHashCode(Annotation annotation)
+    {
+        return AnnotationUtil.getCdiAnnotationHashCode(annotation);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public <T> BeanAttributes<T> createBeanAttributes(AnnotatedType<T>
type)
+    {
+        return BeanAttributesBuilder.forContext(webBeansContext).newBeanAttibutes(type).build();
+    }
+
+
+    public <T, X> Bean<T> createBean(BeanAttributes<T> attributes, Class<X>
type, ProducerFactory<X> factory)
+    {
+        //X TODO we need to add the ProducerFactory stuff
+        return null;
+        //return new AbstractProducerBean<T>(type, webBeansContext, WebBeansType.THIRDPARTY,
attributes, returnType, factory);
+    }
+
+    public <T extends Extension> T getExtension(Class<T> type)
+    {
+        return webBeansContext.getExtensionLoader().getExtension(type);
+    }
+
     @Override
     public <X> Bean<? extends X> resolve(Set<Bean<? extends X>> beans)
     {

Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/container/InjectableBeanManager.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/container/InjectableBeanManager.java?rev=1606260&r1=1606259&r2=1606260&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/container/InjectableBeanManager.java
(original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/container/InjectableBeanManager.java
Fri Jun 27 22:18:40 2014
@@ -33,15 +33,23 @@ import javax.el.ExpressionFactory;
 import javax.enterprise.context.spi.Context;
 import javax.enterprise.context.spi.Contextual;
 import javax.enterprise.context.spi.CreationalContext;
+import javax.enterprise.inject.spi.AnnotatedField;
+import javax.enterprise.inject.spi.AnnotatedMember;
+import javax.enterprise.inject.spi.AnnotatedMethod;
+import javax.enterprise.inject.spi.AnnotatedParameter;
 import javax.enterprise.inject.spi.AnnotatedType;
 import javax.enterprise.inject.spi.Bean;
+import javax.enterprise.inject.spi.BeanAttributes;
 import javax.enterprise.inject.spi.BeanManager;
 import javax.enterprise.inject.spi.Decorator;
+import javax.enterprise.inject.spi.Extension;
 import javax.enterprise.inject.spi.InjectionPoint;
 import javax.enterprise.inject.spi.InjectionTarget;
+import javax.enterprise.inject.spi.InjectionTargetFactory;
 import javax.enterprise.inject.spi.InterceptionType;
 import javax.enterprise.inject.spi.Interceptor;
 import javax.enterprise.inject.spi.ObserverMethod;
+import javax.enterprise.inject.spi.ProducerFactory;
 
 import org.apache.webbeans.config.WebBeansContext;
 
@@ -55,7 +63,7 @@ import org.apache.webbeans.config.WebBea
  * This class is Serializable and always resolves the current
  * instance of the central BeanManager automatically.
  */
-public class InjectableBeanManager extends AbstractBeanManager implements BeanManager, Serializable,
Externalizable 
+public class InjectableBeanManager implements BeanManager, Serializable, Externalizable
 {
 
     private static final long serialVersionUID = 1L;
@@ -76,12 +84,6 @@ public class InjectableBeanManager exten
     }
 
     @Override
-    public WebBeansContext getWebBeansContext()
-    {
-        return bm.getWebBeansContext();
-    }
-
-    @Override
     public <T> AnnotatedType<T> createAnnotatedType(Class<T> type)
     {
         return bm.createAnnotatedType(type);
@@ -232,6 +234,90 @@ public class InjectableBeanManager exten
     }
 
     @Override
+    public boolean areQualifiersEquivalent(Annotation qualifier1, Annotation qualifier2)
+    {
+        return bm.areQualifiersEquivalent(qualifier1, qualifier2);
+    }
+
+    @Override
+    public int getQualifierHashCode(Annotation qualifier)
+    {
+        return bm.getQualifierHashCode(qualifier);
+    }
+
+    @Override
+    public boolean areInterceptorBindingsEquivalent(Annotation interceptorBinding1, Annotation
interceptorBinding2)
+    {
+        return bm.areInterceptorBindingsEquivalent(interceptorBinding1, interceptorBinding2);
+    }
+
+    @Override
+    public int getInterceptorBindingHashCode(Annotation interceptorBinding)
+    {
+        return bm.getInterceptorBindingHashCode(interceptorBinding);
+    }
+
+    @Override
+    public InjectionPoint createInjectionPoint(AnnotatedField<?> field)
+    {
+        return bm.createInjectionPoint(field);
+    }
+
+    @Override
+    public InjectionPoint createInjectionPoint(AnnotatedParameter<?> parameter)
+    {
+        return bm.createInjectionPoint(parameter);
+    }
+
+    @Override
+    public <T> InjectionTargetFactory<T> getInjectionTargetFactory(AnnotatedType<T>
type)
+    {
+        return bm.getInjectionTargetFactory(type);
+    }
+
+    @Override
+    public <X> ProducerFactory<X> getProducerFactory(AnnotatedField<? super
X> field, Bean<X> declaringBean)
+    {
+        return bm.getProducerFactory(field, declaringBean);
+    }
+
+    @Override
+    public <X> ProducerFactory<X> getProducerFactory(AnnotatedMethod<? super
X> method, Bean<X> declaringBean)
+    {
+        return bm.getProducerFactory(method, declaringBean);
+    }
+
+    @Override
+    public <T> BeanAttributes<T> createBeanAttributes(AnnotatedType<T>
type)
+    {
+        return bm.createBeanAttributes(type);
+    }
+
+    @Override
+    public BeanAttributes<?> createBeanAttributes(AnnotatedMember<?> member)
+    {
+        return bm.createBeanAttributes(member);
+    }
+
+    @Override
+    public <T> Bean<T> createBean(BeanAttributes<T> attributes, Class<T>
beanClass, InjectionTargetFactory<T> injectionTargetFactory)
+    {
+        return bm.createBean(attributes, beanClass, injectionTargetFactory);
+    }
+
+    @Override
+    public <T, X> Bean<T> createBean(BeanAttributes<T> attributes, Class<X>
beanClass, ProducerFactory<X> producerFactory)
+    {
+        return bm.createBean(attributes, beanClass, producerFactory);
+    }
+
+    @Override
+    public <T extends Extension> T getExtension(Class<T> extensionClass)
+    {
+        return bm.getExtension(extensionClass);
+    }
+
+    @Override
     public void writeExternal(ObjectOutput out) throws IOException
     {    
     }

Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/ExtensionProducer.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/ExtensionProducer.java?rev=1606260&r1=1606259&r2=1606260&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/ExtensionProducer.java
(original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/ExtensionProducer.java
Fri Jun 27 22:18:40 2014
@@ -45,6 +45,6 @@ public class ExtensionProducer<R> extend
     {
         ExtensionLoader loader = webBeansContext.getExtensionLoader();
         
-        return loader.getBeanInstance((Bean<R>)((CreationalContextImpl<R>) creationalContext).getBean());
+        return (R) loader.getExtension(creationalContext.getBean().getBeanClass());
     }
 }

Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/events/ExtensionLoader.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/events/ExtensionLoader.java?rev=1606260&r1=1606259&r2=1606260&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/events/ExtensionLoader.java
(original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/events/ExtensionLoader.java
Fri Jun 27 22:18:40 2014
@@ -30,7 +30,6 @@ import javax.enterprise.inject.spi.Exten
 import org.apache.webbeans.config.WebBeansContext;
 import org.apache.webbeans.container.BeanManagerImpl;
 import org.apache.webbeans.exception.WebBeansException;
-import org.apache.webbeans.util.Asserts;
 import org.apache.webbeans.util.WebBeansUtil;
 
 /**
@@ -43,7 +42,7 @@ import org.apache.webbeans.util.WebBeans
 public class ExtensionLoader
 {
     /**Map of extensions*/
-    private final  Map<Bean<?>, Object> extensions = new ConcurrentHashMap<Bean<?>,
Object>();
+    private final  Map<Class<?>, Object> extensions = new ConcurrentHashMap<Class<?>,
Object>();
     private final Set<Class<? extends Extension>> extensionClasses = new HashSet<Class<?
extends Extension>>();
     private final BeanManagerImpl manager;
 
@@ -95,20 +94,13 @@ public class ExtensionLoader
     /**
      * Returns service bean instance.
      * 
-     * @param bean service bean
+     * @param extensionClass class of the extension
      * @return service bean instance
      */
     @SuppressWarnings("unchecked")
-    public <T> T getBeanInstance(Bean<T> bean)
+    public <T> T getExtension(Class<T> extensionClass)
     {
-        Asserts.assertNotNull(bean,"bean parameter cannot be null");
-        
-        if(extensions.containsKey(bean))
-        {
-            return (T) extensions.get(bean);
-        }
-        
-        return null;
+        return (T) extensions.get(extensionClass);
     }
 
 
@@ -119,7 +111,8 @@ public class ExtensionLoader
     public void addExtension(Extension ext)
     {
         Bean<?> bean = webBeansContext.getWebBeansUtil().createExtensionComponent(ext.getClass());
-        extensions.put(bean, ext);
+        Class<?> extensionClass = ext.getClass();
+        extensions.put(extensionClass, ext);
 
         manager.addBean(bean);
     }

Modified: openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/mock/MockManager.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/mock/MockManager.java?rev=1606260&r1=1606259&r2=1606260&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/mock/MockManager.java
(original)
+++ openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/mock/MockManager.java
Fri Jun 27 22:18:40 2014
@@ -18,7 +18,6 @@
  */
 package org.apache.webbeans.test.mock;
 
-import java.io.InputStream;
 import java.lang.annotation.Annotation;
 import java.lang.reflect.Type;
 import java.util.ArrayList;
@@ -30,15 +29,23 @@ import javax.el.ExpressionFactory;
 import javax.enterprise.context.spi.Context;
 import javax.enterprise.context.spi.Contextual;
 import javax.enterprise.context.spi.CreationalContext;
+import javax.enterprise.inject.spi.AnnotatedField;
+import javax.enterprise.inject.spi.AnnotatedMember;
+import javax.enterprise.inject.spi.AnnotatedMethod;
+import javax.enterprise.inject.spi.AnnotatedParameter;
 import javax.enterprise.inject.spi.AnnotatedType;
 import javax.enterprise.inject.spi.Bean;
+import javax.enterprise.inject.spi.BeanAttributes;
 import javax.enterprise.inject.spi.BeanManager;
 import javax.enterprise.inject.spi.Decorator;
+import javax.enterprise.inject.spi.Extension;
 import javax.enterprise.inject.spi.InjectionPoint;
 import javax.enterprise.inject.spi.InjectionTarget;
+import javax.enterprise.inject.spi.InjectionTargetFactory;
 import javax.enterprise.inject.spi.InterceptionType;
 import javax.enterprise.inject.spi.Interceptor;
 import javax.enterprise.inject.spi.ObserverMethod;
+import javax.enterprise.inject.spi.ProducerFactory;
 import javax.enterprise.util.TypeLiteral;
 
 import org.apache.webbeans.component.AbstractOwbBean;
@@ -46,11 +53,10 @@ import org.apache.webbeans.component.Bea
 import org.apache.webbeans.component.creation.BeanAttributesBuilder;
 import org.apache.webbeans.config.WebBeansContext;
 import org.apache.webbeans.config.WebBeansFinder;
-import org.apache.webbeans.container.AbstractBeanManager;
 import org.apache.webbeans.container.BeanManagerImpl;
 import org.apache.webbeans.util.WebBeansUtil;
 
-public class MockManager extends AbstractBeanManager implements BeanManager
+public class MockManager implements BeanManager
 {
     private BeanManagerImpl manager = null;
 
@@ -64,7 +70,6 @@ public class MockManager extends Abstrac
         manager.addBean(webBeansContext.getWebBeansUtil().getManagerBean());
     }
 
-    @Override
     public WebBeansContext getWebBeansContext()
     {
         return manager.getWebBeansContext();
@@ -298,4 +303,82 @@ public class MockManager extends Abstrac
     {
         return null;
     }
+
+    @Override
+    public boolean areQualifiersEquivalent(Annotation qualifier1, Annotation qualifier2)
+    {
+        return manager.areQualifiersEquivalent(qualifier1, qualifier2);
+    }
+
+    @Override
+    public int getQualifierHashCode(Annotation qualifier)
+    {
+        return manager.getQualifierHashCode(qualifier);
+    }
+
+    @Override
+    public boolean areInterceptorBindingsEquivalent(Annotation interceptorBinding1, Annotation
interceptorBinding2)
+    {
+        return manager.areInterceptorBindingsEquivalent(interceptorBinding1, interceptorBinding2);
+    }
+
+    @Override
+    public int getInterceptorBindingHashCode(Annotation interceptorBinding)
+    {
+        return manager.getInterceptorBindingHashCode(interceptorBinding);
+    }
+
+    @Override
+    public InjectionPoint createInjectionPoint(AnnotatedField<?> field)
+    {
+        return manager.createInjectionPoint(field);
+    }
+
+    @Override
+    public InjectionPoint createInjectionPoint(AnnotatedParameter<?> parameter)
+    {
+        return manager.createInjectionPoint(parameter);
+    }
+
+    @Override
+    public <T> InjectionTargetFactory<T> getInjectionTargetFactory(AnnotatedType<T>
type)
+    {
+        return manager.getInjectionTargetFactory(type);
+    }
+
+    @Override
+    public <X> ProducerFactory<X> getProducerFactory(AnnotatedField<? super
X> field, Bean<X> declaringBean)
+    {
+        return manager.getProducerFactory(field, declaringBean);
+    }
+
+    @Override
+    public <X> ProducerFactory<X> getProducerFactory(AnnotatedMethod<? super
X> method, Bean<X> declaringBean)
+    {
+        return manager.getProducerFactory(method, declaringBean);
+    }
+
+    @Override
+    public BeanAttributes<?> createBeanAttributes(AnnotatedMember<?> member)
+    {
+        return manager.createBeanAttributes(member);
+    }
+
+    @Override
+    public <T> Bean<T> createBean(BeanAttributes<T> attributes, Class<T>
beanClass, InjectionTargetFactory<T> injectionTargetFactory)
+    {
+        return manager.createBean(attributes, beanClass, injectionTargetFactory);
+    }
+
+    @Override
+    public <T, X> Bean<T> createBean(BeanAttributes<T> attributes, Class<X>
beanClass, ProducerFactory<X> producerFactory)
+    {
+        return manager.createBean(attributes, beanClass, producerFactory);
+    }
+
+    @Override
+    public <T extends Extension> T getExtension(Class<T> extensionClass)
+    {
+        return manager.getExtension(extensionClass);
+    }
 }



Mime
View raw message