You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by "Adam Harris (JIRA)" <ji...@apache.org> on 2008/02/25 21:30:51 UTC

[jira] Created: (WICKET-1371) wicket.properties cannot be found in OSGi

wicket.properties cannot be found in OSGi
-----------------------------------------

                 Key: WICKET-1371
                 URL: https://issues.apache.org/jira/browse/WICKET-1371
             Project: Wicket
          Issue Type: Bug
          Components: wicket
    Affects Versions: 1.3.1
         Environment: Windows XP, Java 5, Wicket 1.3.1, Equinox OSGi 3.3.1
            Reporter: Adam Harris


The wicket.properties file is not being loaded by the Application class due to exclusive use of the thread context classloader in Wicket 1.3.1 when used in an OSGi environment.

>From looking at Wicket's Application code, it appears that multiple wicket.properties files can exist, and it will load them all.  So, the wicket.properties in wicket.jar should always be loaded as well as any other  wicket.properties that are application specific.  This will work in a traditional WAR file.

However, in OSGi, each bundle has its own classloader.  So, if Wicket is in its own bundle and my web application is in its own bundle, the current implementation of Application will not work.  Using only the thread context classloader will not accomodate loading multiple wicket.properties.  Multiple classloaders must be checked.  

Here's a reference to an mail list thread:  
http://www.nabble.com/NPE-in-PropertyResolver.getGetAndSetter%28%29-td11194510.html#a15647641

I've put together and tested a modified Application.java which works in OSGi.  Would something like this be acceptable?

public final void initializeComponents()
{
        // Load any wicket properties files we can find
        try
        {
            Set loadedFiles = new HashSet();
            // Load properties files used by all libraries
           
            // Try the classloader for the wicket jar/bundle
            Enumeration resources = Application.class.getClassLoader()
                                .getResources("wicket.properties");
            loadResources(resources, loadedFiles);

            // Try the classloader for the user's application jar/bundle
            resources = getClass().getClassLoader()
                                .getResources("wicket.properties");
            loadResources(resources, loadedFiles);

            // Try the context class loader
            resources = Thread.currentThread()
                                .getContextClassLoader()
                                .getResources("wicket.properties");
            loadResources(resources, loadedFiles);
        }
        catch (IOException e)
        {
                        throw new WicketRuntimeException("Unable to load initializers file", e);
        }

        // now call any initializers we read
        callInitializers();
}

private void loadResources(Enumeration resources, Set loadedFiles) throws IOException
{
        if (resources != null)
        {
                while (resources.hasMoreElements())
                {
                        InputStream in = null;
                        try
                        {
                                final URL url = (URL)resources.nextElement();
                                if (!loadedFiles.contains(url))
                                {
                                          log.info("resource url: {} ", url);
                                          final Properties properties = new Properties();
                                          in = url.openStream();
                                          properties.load(in);
                                          load(properties);
                                          loadedFiles.add(url);
                                }
                        }
                        finally
                        {
                                if (in != null)
                                {
                                        in.close();
                                }
                        }
                }
        }
    } 

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.


[jira] Updated: (WICKET-1371) wicket.properties cannot be found in OSGi

Posted by "Johan Compagner (JIRA)" <ji...@apache.org>.
     [ https://issues.apache.org/jira/browse/WICKET-1371?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Johan Compagner updated WICKET-1371:
------------------------------------

    Fix Version/s: 1.4-M1

> wicket.properties cannot be found in OSGi
> -----------------------------------------
>
>                 Key: WICKET-1371
>                 URL: https://issues.apache.org/jira/browse/WICKET-1371
>             Project: Wicket
>          Issue Type: Bug
>          Components: wicket
>    Affects Versions: 1.3.1
>         Environment: Windows XP, Java 5, Wicket 1.3.1, Equinox OSGi 3.3.1
>            Reporter: Adam Harris
>            Assignee: Johan Compagner
>             Fix For: 1.4-M1
>
>         Attachments: classresolverpatch.txt
>
>
> The wicket.properties file is not being loaded by the Application class due to exclusive use of the thread context classloader in Wicket 1.3.1 when used in an OSGi environment.
> From looking at Wicket's Application code, it appears that multiple wicket.properties files can exist, and it will load them all.  So, the wicket.properties in wicket.jar should always be loaded as well as any other  wicket.properties that are application specific.  This will work in a traditional WAR file.
> However, in OSGi, each bundle has its own classloader.  So, if Wicket is in its own bundle and my web application is in its own bundle, the current implementation of Application will not work.  Using only the thread context classloader will not accomodate loading multiple wicket.properties.  Multiple classloaders must be checked.  
> Here's a reference to an mail list thread:  
> http://www.nabble.com/NPE-in-PropertyResolver.getGetAndSetter%28%29-td11194510.html#a15647641
> I've put together and tested a modified Application.java which works in OSGi.  Would something like this be acceptable?
> public final void initializeComponents()
> {
>         // Load any wicket properties files we can find
>         try
>         {
>             Set loadedFiles = new HashSet();
>             // Load properties files used by all libraries
>            
>             // Try the classloader for the wicket jar/bundle
>             Enumeration resources = Application.class.getClassLoader()
>                                 .getResources("wicket.properties");
>             loadResources(resources, loadedFiles);
>             // Try the classloader for the user's application jar/bundle
>             resources = getClass().getClassLoader()
>                                 .getResources("wicket.properties");
>             loadResources(resources, loadedFiles);
>             // Try the context class loader
>             resources = Thread.currentThread()
>                                 .getContextClassLoader()
>                                 .getResources("wicket.properties");
>             loadResources(resources, loadedFiles);
>         }
>         catch (IOException e)
>         {
>                         throw new WicketRuntimeException("Unable to load initializers file", e);
>         }
>         // now call any initializers we read
>         callInitializers();
> }
> private void loadResources(Enumeration resources, Set loadedFiles) throws IOException
> {
>         if (resources != null)
>         {
>                 while (resources.hasMoreElements())
>                 {
>                         InputStream in = null;
>                         try
>                         {
>                                 final URL url = (URL)resources.nextElement();
>                                 if (!loadedFiles.contains(url))
>                                 {
>                                           log.info("resource url: {} ", url);
>                                           final Properties properties = new Properties();
>                                           in = url.openStream();
>                                           properties.load(in);
>                                           load(properties);
>                                           loadedFiles.add(url);
>                                 }
>                         }
>                         finally
>                         {
>                                 if (in != null)
>                                 {
>                                         in.close();
>                                 }
>                         }
>                 }
>         }
>     } 

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.


[jira] Closed: (WICKET-1371) wicket.properties cannot be found in OSGi

Posted by "Johan Compagner (JIRA)" <ji...@apache.org>.
     [ https://issues.apache.org/jira/browse/WICKET-1371?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Johan Compagner closed WICKET-1371.
-----------------------------------

    Resolution: Fixed

applied the patch

> wicket.properties cannot be found in OSGi
> -----------------------------------------
>
>                 Key: WICKET-1371
>                 URL: https://issues.apache.org/jira/browse/WICKET-1371
>             Project: Wicket
>          Issue Type: Bug
>          Components: wicket
>    Affects Versions: 1.3.1
>         Environment: Windows XP, Java 5, Wicket 1.3.1, Equinox OSGi 3.3.1
>            Reporter: Adam Harris
>            Assignee: Johan Compagner
>             Fix For: 1.4-M1
>
>         Attachments: classresolverpatch.txt
>
>
> The wicket.properties file is not being loaded by the Application class due to exclusive use of the thread context classloader in Wicket 1.3.1 when used in an OSGi environment.
> From looking at Wicket's Application code, it appears that multiple wicket.properties files can exist, and it will load them all.  So, the wicket.properties in wicket.jar should always be loaded as well as any other  wicket.properties that are application specific.  This will work in a traditional WAR file.
> However, in OSGi, each bundle has its own classloader.  So, if Wicket is in its own bundle and my web application is in its own bundle, the current implementation of Application will not work.  Using only the thread context classloader will not accomodate loading multiple wicket.properties.  Multiple classloaders must be checked.  
> Here's a reference to an mail list thread:  
> http://www.nabble.com/NPE-in-PropertyResolver.getGetAndSetter%28%29-td11194510.html#a15647641
> I've put together and tested a modified Application.java which works in OSGi.  Would something like this be acceptable?
> public final void initializeComponents()
> {
>         // Load any wicket properties files we can find
>         try
>         {
>             Set loadedFiles = new HashSet();
>             // Load properties files used by all libraries
>            
>             // Try the classloader for the wicket jar/bundle
>             Enumeration resources = Application.class.getClassLoader()
>                                 .getResources("wicket.properties");
>             loadResources(resources, loadedFiles);
>             // Try the classloader for the user's application jar/bundle
>             resources = getClass().getClassLoader()
>                                 .getResources("wicket.properties");
>             loadResources(resources, loadedFiles);
>             // Try the context class loader
>             resources = Thread.currentThread()
>                                 .getContextClassLoader()
>                                 .getResources("wicket.properties");
>             loadResources(resources, loadedFiles);
>         }
>         catch (IOException e)
>         {
>                         throw new WicketRuntimeException("Unable to load initializers file", e);
>         }
>         // now call any initializers we read
>         callInitializers();
> }
> private void loadResources(Enumeration resources, Set loadedFiles) throws IOException
> {
>         if (resources != null)
>         {
>                 while (resources.hasMoreElements())
>                 {
>                         InputStream in = null;
>                         try
>                         {
>                                 final URL url = (URL)resources.nextElement();
>                                 if (!loadedFiles.contains(url))
>                                 {
>                                           log.info("resource url: {} ", url);
>                                           final Properties properties = new Properties();
>                                           in = url.openStream();
>                                           properties.load(in);
>                                           load(properties);
>                                           loadedFiles.add(url);
>                                 }
>                         }
>                         finally
>                         {
>                                 if (in != null)
>                                 {
>                                         in.close();
>                                 }
>                         }
>                 }
>         }
>     } 

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.


[jira] Assigned: (WICKET-1371) wicket.properties cannot be found in OSGi

Posted by "Igor Vaynberg (JIRA)" <ji...@apache.org>.
     [ https://issues.apache.org/jira/browse/WICKET-1371?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Igor Vaynberg reassigned WICKET-1371:
-------------------------------------

    Assignee: Johan Compagner

> wicket.properties cannot be found in OSGi
> -----------------------------------------
>
>                 Key: WICKET-1371
>                 URL: https://issues.apache.org/jira/browse/WICKET-1371
>             Project: Wicket
>          Issue Type: Bug
>          Components: wicket
>    Affects Versions: 1.3.1
>         Environment: Windows XP, Java 5, Wicket 1.3.1, Equinox OSGi 3.3.1
>            Reporter: Adam Harris
>            Assignee: Johan Compagner
>         Attachments: classresolverpatch.txt
>
>
> The wicket.properties file is not being loaded by the Application class due to exclusive use of the thread context classloader in Wicket 1.3.1 when used in an OSGi environment.
> From looking at Wicket's Application code, it appears that multiple wicket.properties files can exist, and it will load them all.  So, the wicket.properties in wicket.jar should always be loaded as well as any other  wicket.properties that are application specific.  This will work in a traditional WAR file.
> However, in OSGi, each bundle has its own classloader.  So, if Wicket is in its own bundle and my web application is in its own bundle, the current implementation of Application will not work.  Using only the thread context classloader will not accomodate loading multiple wicket.properties.  Multiple classloaders must be checked.  
> Here's a reference to an mail list thread:  
> http://www.nabble.com/NPE-in-PropertyResolver.getGetAndSetter%28%29-td11194510.html#a15647641
> I've put together and tested a modified Application.java which works in OSGi.  Would something like this be acceptable?
> public final void initializeComponents()
> {
>         // Load any wicket properties files we can find
>         try
>         {
>             Set loadedFiles = new HashSet();
>             // Load properties files used by all libraries
>            
>             // Try the classloader for the wicket jar/bundle
>             Enumeration resources = Application.class.getClassLoader()
>                                 .getResources("wicket.properties");
>             loadResources(resources, loadedFiles);
>             // Try the classloader for the user's application jar/bundle
>             resources = getClass().getClassLoader()
>                                 .getResources("wicket.properties");
>             loadResources(resources, loadedFiles);
>             // Try the context class loader
>             resources = Thread.currentThread()
>                                 .getContextClassLoader()
>                                 .getResources("wicket.properties");
>             loadResources(resources, loadedFiles);
>         }
>         catch (IOException e)
>         {
>                         throw new WicketRuntimeException("Unable to load initializers file", e);
>         }
>         // now call any initializers we read
>         callInitializers();
> }
> private void loadResources(Enumeration resources, Set loadedFiles) throws IOException
> {
>         if (resources != null)
>         {
>                 while (resources.hasMoreElements())
>                 {
>                         InputStream in = null;
>                         try
>                         {
>                                 final URL url = (URL)resources.nextElement();
>                                 if (!loadedFiles.contains(url))
>                                 {
>                                           log.info("resource url: {} ", url);
>                                           final Properties properties = new Properties();
>                                           in = url.openStream();
>                                           properties.load(in);
>                                           load(properties);
>                                           loadedFiles.add(url);
>                                 }
>                         }
>                         finally
>                         {
>                                 if (in != null)
>                                 {
>                                         in.close();
>                                 }
>                         }
>                 }
>         }
>     } 

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.


[jira] Commented: (WICKET-1371) wicket.properties cannot be found in OSGi

Posted by "Adam Harris (JIRA)" <ji...@apache.org>.
    [ https://issues.apache.org/jira/browse/WICKET-1371?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12577487#action_12577487 ] 

Adam Harris commented on WICKET-1371:
-------------------------------------

Johan,

Thanks for the patch.  It has one problem.  DefaultClassResolver.getResources(String name) never uses the "name" parameter, but still has the hard-coded string "wicket.properties".  

Otherwise, I think this will work.  I'll try it out.


> wicket.properties cannot be found in OSGi
> -----------------------------------------
>
>                 Key: WICKET-1371
>                 URL: https://issues.apache.org/jira/browse/WICKET-1371
>             Project: Wicket
>          Issue Type: Bug
>          Components: wicket
>    Affects Versions: 1.3.1
>         Environment: Windows XP, Java 5, Wicket 1.3.1, Equinox OSGi 3.3.1
>            Reporter: Adam Harris
>            Assignee: Johan Compagner
>         Attachments: classresolverpatch.txt
>
>
> The wicket.properties file is not being loaded by the Application class due to exclusive use of the thread context classloader in Wicket 1.3.1 when used in an OSGi environment.
> From looking at Wicket's Application code, it appears that multiple wicket.properties files can exist, and it will load them all.  So, the wicket.properties in wicket.jar should always be loaded as well as any other  wicket.properties that are application specific.  This will work in a traditional WAR file.
> However, in OSGi, each bundle has its own classloader.  So, if Wicket is in its own bundle and my web application is in its own bundle, the current implementation of Application will not work.  Using only the thread context classloader will not accomodate loading multiple wicket.properties.  Multiple classloaders must be checked.  
> Here's a reference to an mail list thread:  
> http://www.nabble.com/NPE-in-PropertyResolver.getGetAndSetter%28%29-td11194510.html#a15647641
> I've put together and tested a modified Application.java which works in OSGi.  Would something like this be acceptable?
> public final void initializeComponents()
> {
>         // Load any wicket properties files we can find
>         try
>         {
>             Set loadedFiles = new HashSet();
>             // Load properties files used by all libraries
>            
>             // Try the classloader for the wicket jar/bundle
>             Enumeration resources = Application.class.getClassLoader()
>                                 .getResources("wicket.properties");
>             loadResources(resources, loadedFiles);
>             // Try the classloader for the user's application jar/bundle
>             resources = getClass().getClassLoader()
>                                 .getResources("wicket.properties");
>             loadResources(resources, loadedFiles);
>             // Try the context class loader
>             resources = Thread.currentThread()
>                                 .getContextClassLoader()
>                                 .getResources("wicket.properties");
>             loadResources(resources, loadedFiles);
>         }
>         catch (IOException e)
>         {
>                         throw new WicketRuntimeException("Unable to load initializers file", e);
>         }
>         // now call any initializers we read
>         callInitializers();
> }
> private void loadResources(Enumeration resources, Set loadedFiles) throws IOException
> {
>         if (resources != null)
>         {
>                 while (resources.hasMoreElements())
>                 {
>                         InputStream in = null;
>                         try
>                         {
>                                 final URL url = (URL)resources.nextElement();
>                                 if (!loadedFiles.contains(url))
>                                 {
>                                           log.info("resource url: {} ", url);
>                                           final Properties properties = new Properties();
>                                           in = url.openStream();
>                                           properties.load(in);
>                                           load(properties);
>                                           loadedFiles.add(url);
>                                 }
>                         }
>                         finally
>                         {
>                                 if (in != null)
>                                 {
>                                         in.close();
>                                 }
>                         }
>                 }
>         }
>     } 

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.


[jira] Updated: (WICKET-1371) wicket.properties cannot be found in OSGi

Posted by "Johan Compagner (JIRA)" <ji...@apache.org>.
     [ https://issues.apache.org/jira/browse/WICKET-1371?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Johan Compagner updated WICKET-1371:
------------------------------------

    Attachment: classresolverpatch.txt

does this patch work for you?
We already have IClassResolver interface for OSGI to load the right classes
So that one should also be used for loading resources

The default implementation is what you did.

> wicket.properties cannot be found in OSGi
> -----------------------------------------
>
>                 Key: WICKET-1371
>                 URL: https://issues.apache.org/jira/browse/WICKET-1371
>             Project: Wicket
>          Issue Type: Bug
>          Components: wicket
>    Affects Versions: 1.3.1
>         Environment: Windows XP, Java 5, Wicket 1.3.1, Equinox OSGi 3.3.1
>            Reporter: Adam Harris
>         Attachments: classresolverpatch.txt
>
>
> The wicket.properties file is not being loaded by the Application class due to exclusive use of the thread context classloader in Wicket 1.3.1 when used in an OSGi environment.
> From looking at Wicket's Application code, it appears that multiple wicket.properties files can exist, and it will load them all.  So, the wicket.properties in wicket.jar should always be loaded as well as any other  wicket.properties that are application specific.  This will work in a traditional WAR file.
> However, in OSGi, each bundle has its own classloader.  So, if Wicket is in its own bundle and my web application is in its own bundle, the current implementation of Application will not work.  Using only the thread context classloader will not accomodate loading multiple wicket.properties.  Multiple classloaders must be checked.  
> Here's a reference to an mail list thread:  
> http://www.nabble.com/NPE-in-PropertyResolver.getGetAndSetter%28%29-td11194510.html#a15647641
> I've put together and tested a modified Application.java which works in OSGi.  Would something like this be acceptable?
> public final void initializeComponents()
> {
>         // Load any wicket properties files we can find
>         try
>         {
>             Set loadedFiles = new HashSet();
>             // Load properties files used by all libraries
>            
>             // Try the classloader for the wicket jar/bundle
>             Enumeration resources = Application.class.getClassLoader()
>                                 .getResources("wicket.properties");
>             loadResources(resources, loadedFiles);
>             // Try the classloader for the user's application jar/bundle
>             resources = getClass().getClassLoader()
>                                 .getResources("wicket.properties");
>             loadResources(resources, loadedFiles);
>             // Try the context class loader
>             resources = Thread.currentThread()
>                                 .getContextClassLoader()
>                                 .getResources("wicket.properties");
>             loadResources(resources, loadedFiles);
>         }
>         catch (IOException e)
>         {
>                         throw new WicketRuntimeException("Unable to load initializers file", e);
>         }
>         // now call any initializers we read
>         callInitializers();
> }
> private void loadResources(Enumeration resources, Set loadedFiles) throws IOException
> {
>         if (resources != null)
>         {
>                 while (resources.hasMoreElements())
>                 {
>                         InputStream in = null;
>                         try
>                         {
>                                 final URL url = (URL)resources.nextElement();
>                                 if (!loadedFiles.contains(url))
>                                 {
>                                           log.info("resource url: {} ", url);
>                                           final Properties properties = new Properties();
>                                           in = url.openStream();
>                                           properties.load(in);
>                                           load(properties);
>                                           loadedFiles.add(url);
>                                 }
>                         }
>                         finally
>                         {
>                                 if (in != null)
>                                 {
>                                         in.close();
>                                 }
>                         }
>                 }
>         }
>     } 

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.


[jira] Commented: (WICKET-1371) wicket.properties cannot be found in OSGi

Posted by "Johan Compagner (JIRA)" <ji...@apache.org>.
    [ https://issues.apache.org/jira/browse/WICKET-1371?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12572367#action_12572367 ] 

Johan Compagner commented on WICKET-1371:
-----------------------------------------

this is kind of touching the samething that we discussed a few days ago. We really should use the ClassResolver of the application i guess because thats our hook into osgi

> wicket.properties cannot be found in OSGi
> -----------------------------------------
>
>                 Key: WICKET-1371
>                 URL: https://issues.apache.org/jira/browse/WICKET-1371
>             Project: Wicket
>          Issue Type: Bug
>          Components: wicket
>    Affects Versions: 1.3.1
>         Environment: Windows XP, Java 5, Wicket 1.3.1, Equinox OSGi 3.3.1
>            Reporter: Adam Harris
>
> The wicket.properties file is not being loaded by the Application class due to exclusive use of the thread context classloader in Wicket 1.3.1 when used in an OSGi environment.
> From looking at Wicket's Application code, it appears that multiple wicket.properties files can exist, and it will load them all.  So, the wicket.properties in wicket.jar should always be loaded as well as any other  wicket.properties that are application specific.  This will work in a traditional WAR file.
> However, in OSGi, each bundle has its own classloader.  So, if Wicket is in its own bundle and my web application is in its own bundle, the current implementation of Application will not work.  Using only the thread context classloader will not accomodate loading multiple wicket.properties.  Multiple classloaders must be checked.  
> Here's a reference to an mail list thread:  
> http://www.nabble.com/NPE-in-PropertyResolver.getGetAndSetter%28%29-td11194510.html#a15647641
> I've put together and tested a modified Application.java which works in OSGi.  Would something like this be acceptable?
> public final void initializeComponents()
> {
>         // Load any wicket properties files we can find
>         try
>         {
>             Set loadedFiles = new HashSet();
>             // Load properties files used by all libraries
>            
>             // Try the classloader for the wicket jar/bundle
>             Enumeration resources = Application.class.getClassLoader()
>                                 .getResources("wicket.properties");
>             loadResources(resources, loadedFiles);
>             // Try the classloader for the user's application jar/bundle
>             resources = getClass().getClassLoader()
>                                 .getResources("wicket.properties");
>             loadResources(resources, loadedFiles);
>             // Try the context class loader
>             resources = Thread.currentThread()
>                                 .getContextClassLoader()
>                                 .getResources("wicket.properties");
>             loadResources(resources, loadedFiles);
>         }
>         catch (IOException e)
>         {
>                         throw new WicketRuntimeException("Unable to load initializers file", e);
>         }
>         // now call any initializers we read
>         callInitializers();
> }
> private void loadResources(Enumeration resources, Set loadedFiles) throws IOException
> {
>         if (resources != null)
>         {
>                 while (resources.hasMoreElements())
>                 {
>                         InputStream in = null;
>                         try
>                         {
>                                 final URL url = (URL)resources.nextElement();
>                                 if (!loadedFiles.contains(url))
>                                 {
>                                           log.info("resource url: {} ", url);
>                                           final Properties properties = new Properties();
>                                           in = url.openStream();
>                                           properties.load(in);
>                                           load(properties);
>                                           loadedFiles.add(url);
>                                 }
>                         }
>                         finally
>                         {
>                                 if (in != null)
>                                 {
>                                         in.close();
>                                 }
>                         }
>                 }
>         }
>     } 

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.