You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@turbine.apache.org by tv...@apache.org on 2022/07/08 07:58:25 UTC

[turbine-core] branch trunk updated (b7b84650 -> 2a2337eb)

This is an automated email from the ASF dual-hosted git repository.

tv pushed a change to branch trunk
in repository https://gitbox.apache.org/repos/asf/turbine-core.git


    from b7b84650 manually updated PR #7, Bumped commons-configuration2 from 2.7 to 2.8.0, after test build and code check
     new 69ff4fcc Modernize AbstractSchedulerService
     new 3cdc9ee3 Use .valueOf() instead of constructor
     new 2a2337eb Merge branch 'trunk' of https://gitbox.apache.org/repos/asf/turbine-core.git into trunk

The 3 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../schedule/AbstractSchedulerService.java         | 110 ++++++++++-----------
 .../turbine/util/parser/BaseValueParserTest.java   |  48 ++++-----
 2 files changed, 75 insertions(+), 83 deletions(-)


[turbine-core] 03/03: Merge branch 'trunk' of https://gitbox.apache.org/repos/asf/turbine-core.git into trunk

Posted by tv...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

tv pushed a commit to branch trunk
in repository https://gitbox.apache.org/repos/asf/turbine-core.git

commit 2a2337eb28a5f461d6743d3b36b40db057c8c1fe
Merge: 3cdc9ee3 b7b84650
Author: Thomas Vandahl <tv...@apache.org>
AuthorDate: Fri Jul 8 09:53:05 2022 +0200

    Merge branch 'trunk' of https://gitbox.apache.org/repos/asf/turbine-core.git into trunk

 .gitignore                                         |    2 +
 README.md                                          |   24 +
 conf/docker-resources/db/Dockerfile                |    4 +-
 conf/test/CompleteTurbineResources.properties      |    8 +
 conf/test/TurbineURLMapperServiceTest.properties   |    2 +-
 .../CompleteTurbineResources.properties            |   11 +
 conf/test/docker-manager/Torque4Test.xml           |   25 +
 ...e.xml => turbine-classic-pipeline-extended.xml} |    0
 conf/turbine-classic-pipeline.xml                  |    1 -
 pom.xml                                            |   51 +-
 proposals/gk/log4j2/pom.xml                        | 1175 --------------------
 src/changes/changes.xml                            |    2 +-
 src/java/org/apache/turbine/Turbine.java           |    2 +-
 .../turbine/annotation/AnnotationProcessor.java    |  141 ++-
 .../apache/turbine/annotation/TurbineService.java  |    2 +-
 .../org/apache/turbine/modules/ActionEvent.java    |   14 +-
 .../turbine/om/security/DefaultUserImpl.java       |    2 +-
 .../apache/turbine/services/BaseServiceBroker.java |   13 +-
 .../turbine/services/jsp/TurbineJspService.java    |   10 +-
 .../localization/DateTimeFormatterInterface.java   |   83 ++
 .../localization/DateTimeFormatterService.java     |  177 +++
 .../services/pull/util/DateTimeFormatterTool.java  |  139 +++
 .../apache/turbine/services/schedule/JobQueue.java |    2 +-
 .../services/security/DefaultUserManager.java      |   12 +-
 .../services/template/TurbineTemplateService.java  |   12 +-
 .../urlmapper/TurbineURLMapperService.java         |   12 +-
 src/java/org/apache/turbine/util/ServletUtils.java |    4 +-
 .../org/apache/turbine/util/uri/TemplateURI.java   |   25 +-
 src/site/site.xml                                  |   24 +-
 .../turbine/annotation/AnnotatedMethodsTest.java   |   99 ++
 .../annotation/AnnotationProcessorTest.java        |    3 +
 .../turbine/services/LoadingComponentsTest.java    |   12 +
 .../localization/DateTimeFormatterServiceTest.java |  290 +++++
 .../urlmapper/TurbineURLMapperServiceTest.java     |    2 +-
 .../urlmapper/model/URLMappingContainerTest.java   |   19 +
 .../model/YamlURLMappingContainerTest.java         |   19 +
 .../services/velocity/PathConverterTest.java       |   96 +-
 src/test/org/apache/turbine/test/HsqlDB.java       |   19 +
 .../BuildContainerWithDockerfileTest.java          |   36 +-
 .../UserManagerWithContainerTest.java              |   19 +
 suppression-owasp-fp.xml                           |   79 +-
 xdocs/features.xml                                 |    2 +-
 xdocs/how-to-help.xml                              |    2 +-
 xdocs/howto/index.xml                              |    2 +-
 xdocs/howto/url-mapper-howto.xml                   |   50 +-
 xdocs/index.xml                                    |   10 +-
 xdocs/services/index.xml                           |    6 +
 xdocs/services/urlmapper-service.xml               |   50 +
 xdocs/todo.xml                                     |    9 +-
 49 files changed, 1382 insertions(+), 1421 deletions(-)


[turbine-core] 02/03: Use .valueOf() instead of constructor

Posted by tv...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

tv pushed a commit to branch trunk
in repository https://gitbox.apache.org/repos/asf/turbine-core.git

commit 3cdc9ee3552659e3780806f99ce95fc057b4848e
Author: Thomas Vandahl <tv...@apache.org>
AuthorDate: Fri Jul 8 09:52:08 2022 +0200

    Use .valueOf() instead of constructor
---
 .../turbine/util/parser/BaseValueParserTest.java   | 48 +++++++++++-----------
 1 file changed, 24 insertions(+), 24 deletions(-)

diff --git a/src/test/org/apache/turbine/util/parser/BaseValueParserTest.java b/src/test/org/apache/turbine/util/parser/BaseValueParserTest.java
index 0373425c..60e371af 100644
--- a/src/test/org/apache/turbine/util/parser/BaseValueParserTest.java
+++ b/src/test/org/apache/turbine/util/parser/BaseValueParserTest.java
@@ -22,9 +22,9 @@ package org.apache.turbine.util.parser;
 
 
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.fail;
 
 import java.math.BigDecimal;
@@ -120,13 +120,13 @@ public class BaseValueParserTest extends BaseTestCase
         assertNull(result);
 
         // default
-        result = parser.getByteObject("default", new Byte((byte)3));
-        assertEquals(result, new Byte((byte)3));
+        result = parser.getByteObject("default", Byte.valueOf((byte)3));
+        assertEquals(result, Byte.valueOf((byte)3));
 
         // param exists
         parser.add("exists", "1");
         result = parser.getByteObject("exists");
-        assertEquals(result, new Byte((byte)1));
+        assertEquals(result, Byte.valueOf((byte)1));
 
         // unparsable value
         parser.add("unparsable", "a");
@@ -186,13 +186,13 @@ public class BaseValueParserTest extends BaseTestCase
         assertNull(result);
 
         // default
-        result = parser.getIntObject("default", new Integer(3));
-        assertEquals(result, new Integer(3));
+        result = parser.getIntObject("default", Integer.valueOf(3));
+        assertEquals(result, Integer.valueOf(3));
 
         // param exists
         parser.add("exists", "1");
         result = parser.getIntObject("exists");
-        assertEquals(result, new Integer(1));
+        assertEquals(result, Integer.valueOf(1));
 
         // unparsable value
         parser.add("unparsable", "a");
@@ -204,7 +204,7 @@ public class BaseValueParserTest extends BaseTestCase
         parser.add("array", "2");
         parser.add("array", "3");
         Integer arrayResult[] = parser.getIntObjects("array");
-        Integer compare[] = {new Integer(1), new Integer(2), new Integer(3)};
+        Integer compare[] = {Integer.valueOf(1), Integer.valueOf(2), Integer.valueOf(3)};
         assertEquals(arrayResult.length, compare.length);
         for( int i=0; i<compare.length; i++)
         {
@@ -216,7 +216,7 @@ public class BaseValueParserTest extends BaseTestCase
         parser.add("array2", "a");
         parser.add("array2", "3");
         Integer arrayResult2[] = parser.getIntObjects("array2");
-        Integer compare2[] = {new Integer(1), null, new Integer(3)};
+        Integer compare2[] = {Integer.valueOf(1), null, Integer.valueOf(3)};
         assertEquals(arrayResult2.length, compare2.length);
         for( int i=0; i<compare2.length; i++)
         {
@@ -276,13 +276,13 @@ public class BaseValueParserTest extends BaseTestCase
         assertNull(result);
 
         // default
-        result = parser.getFloatObject("default", new Float(3));
-        assertEquals(result, new Float(3));
+        result = parser.getFloatObject("default", Float.valueOf(3));
+        assertEquals(result, Float.valueOf(3));
 
         // param exists
         parser.add("exists", "1");
         result = parser.getFloatObject("exists");
-        assertEquals(result, new Float(1));
+        assertEquals(result, Float.valueOf(1));
 
         // unparsable value
         parser.add("unparsable", "a");
@@ -294,7 +294,7 @@ public class BaseValueParserTest extends BaseTestCase
         parser.add("array", "2");
         parser.add("array", "3");
         Float arrayResult[] = parser.getFloatObjects("array");
-        Float compare[] = {new Float(1), new Float(2), new Float(3)};
+        Float compare[] = {Float.valueOf(1), Float.valueOf(2), Float.valueOf(3)};
         assertEquals(arrayResult.length, compare.length);
         for( int i=0; i<compare.length; i++)
         {
@@ -306,7 +306,7 @@ public class BaseValueParserTest extends BaseTestCase
         parser.add("array2", "a");
         parser.add("array2", "3");
         Float arrayResult2[] = parser.getFloatObjects("array2");
-        Float compare2[] = {new Float(1), null, new Float(3)};
+        Float compare2[] = {Float.valueOf(1), null, Float.valueOf(3)};
         assertEquals(arrayResult2.length, compare2.length);
         for( int i=0; i<compare2.length; i++)
         {
@@ -366,13 +366,13 @@ public class BaseValueParserTest extends BaseTestCase
         assertNull(result);
 
         // default
-        result = parser.getDoubleObject("default", new Double(3));
-        assertEquals(result, new Double(3));
+        result = parser.getDoubleObject("default", Double.valueOf(3));
+        assertEquals(result, Double.valueOf(3));
 
         // param exists
         parser.add("exists", "1");
         result = parser.getDoubleObject("exists");
-        assertEquals(result, new Double(1));
+        assertEquals(result, Double.valueOf(1));
 
         // unparsable value
         parser.add("unparsable", "a");
@@ -384,7 +384,7 @@ public class BaseValueParserTest extends BaseTestCase
         parser.add("array", "2");
         parser.add("array", "3");
         Double arrayResult[] = parser.getDoubleObjects("array");
-        Double compare[] = {new Double(1), new Double(2), new Double(3)};
+        Double compare[] = {Double.valueOf(1), Double.valueOf(2), Double.valueOf(3)};
         assertEquals(arrayResult.length, compare.length);
         for( int i=0; i<compare.length; i++)
         {
@@ -396,7 +396,7 @@ public class BaseValueParserTest extends BaseTestCase
         parser.add("array2", "a");
         parser.add("array2", "3");
         Double arrayResult2[] = parser.getDoubleObjects("array2");
-        Double compare2[] = {new Double(1), null, new Double(3)};
+        Double compare2[] = {Double.valueOf(1), null, Double.valueOf(3)};
         assertEquals(arrayResult2.length, compare2.length);
         for( int i=0; i<compare2.length; i++)
         {
@@ -456,13 +456,13 @@ public class BaseValueParserTest extends BaseTestCase
         assertNull(result);
 
         // default
-        result = parser.getLongObject("default", new Long(3));
-        assertEquals(result, new Long(3));
+        result = parser.getLongObject("default", Long.valueOf(3));
+        assertEquals(result, Long.valueOf(3));
 
         // param exists
         parser.add("exists", "1");
         result = parser.getLongObject("exists");
-        assertEquals(result, new Long(1));
+        assertEquals(result, Long.valueOf(1));
 
         // unparsable value
         parser.add("unparsable", "a");
@@ -474,7 +474,7 @@ public class BaseValueParserTest extends BaseTestCase
         parser.add("array", "2");
         parser.add("array", "3");
         Long arrayResult[] = parser.getLongObjects("array");
-        Long compare[] = {new Long(1), new Long(2), new Long(3)};
+        Long compare[] = {Long.valueOf(1), Long.valueOf(2), Long.valueOf(3)};
         assertEquals(arrayResult.length, compare.length);
         for( int i=0; i<compare.length; i++)
         {
@@ -486,7 +486,7 @@ public class BaseValueParserTest extends BaseTestCase
         parser.add("array2", "a");
         parser.add("array2", "3");
         Long arrayResult2[] = parser.getLongObjects("array2");
-        Long compare2[] = {new Long(1), null, new Long(3)};
+        Long compare2[] = {Long.valueOf(1), null, Long.valueOf(3)};
         assertEquals(arrayResult2.length, compare2.length);
         for( int i=0; i<compare2.length; i++)
         {


[turbine-core] 01/03: Modernize AbstractSchedulerService

Posted by tv...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

tv pushed a commit to branch trunk
in repository https://gitbox.apache.org/repos/asf/turbine-core.git

commit 69ff4fcc20ad0f8134729e727f62259579accbe4
Author: Thomas Vandahl <tv...@apache.org>
AuthorDate: Fri Jul 8 09:51:22 2022 +0200

    Modernize AbstractSchedulerService
---
 .../schedule/AbstractSchedulerService.java         | 110 ++++++++++-----------
 1 file changed, 51 insertions(+), 59 deletions(-)

diff --git a/src/java/org/apache/turbine/services/schedule/AbstractSchedulerService.java b/src/java/org/apache/turbine/services/schedule/AbstractSchedulerService.java
index 53276937..4729a3d7 100644
--- a/src/java/org/apache/turbine/services/schedule/AbstractSchedulerService.java
+++ b/src/java/org/apache/turbine/services/schedule/AbstractSchedulerService.java
@@ -20,7 +20,11 @@ package org.apache.turbine.services.schedule;
  */
 
 import java.util.List;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.atomic.AtomicBoolean;
 
+import org.apache.commons.lang3.concurrent.BasicThreadFactory;
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
 import org.apache.turbine.services.InitializationException;
@@ -43,22 +47,13 @@ public abstract class AbstractSchedulerService extends TurbineBaseService implem
     protected JobQueue<JobEntry> scheduleQueue = null;
 
     /** Current status of the scheduler */
-    protected boolean enabled = false;
+    private AtomicBoolean enabled = new AtomicBoolean(false);
 
-    /** The main loop for starting jobs. */
-    protected MainLoop mainLoop;
+    /** The housekeeping thread. */
+    protected Thread houseKeepingThread;
 
-    /** The thread used to process commands. */
-    protected Thread thread;
-
-    /**
-     * Creates a new instance.
-     */
-    public AbstractSchedulerService()
-    {
-        mainLoop = null;
-        thread = null;
-    }
+    /** The thread pool used to process jobs. */
+    protected ExecutorService threadPool;
 
     /**
      * Initializes the SchedulerService.
@@ -73,7 +68,11 @@ public abstract class AbstractSchedulerService extends TurbineBaseService implem
         {
             setEnabled(getConfiguration().getBoolean("enabled", true));
             scheduleQueue = new JobQueue<>();
-            mainLoop = new MainLoop();
+            threadPool = Executors.newCachedThreadPool(
+                    new BasicThreadFactory.Builder()
+                        .namingPattern("Turbine-ScheduledJob-")
+                        .daemon(true)
+                        .build());
 
             @SuppressWarnings("unchecked") // Why is this cast necessary?
             List<JobEntry> jobs = (List<JobEntry>)loadJobs();
@@ -108,6 +107,8 @@ public abstract class AbstractSchedulerService extends TurbineBaseService implem
         {
             getThread().interrupt();
         }
+
+        threadPool.shutdownNow();
     }
 
     /**
@@ -183,7 +184,7 @@ public abstract class AbstractSchedulerService extends TurbineBaseService implem
      */
     protected void setEnabled(boolean enabled)
     {
-        this.enabled = enabled;
+        this.enabled.set(enabled);
     }
 
     /**
@@ -194,7 +195,7 @@ public abstract class AbstractSchedulerService extends TurbineBaseService implem
     @Override
     public boolean isEnabled()
     {
-        return enabled;
+        return enabled.get();
     }
 
     /**
@@ -219,7 +220,7 @@ public abstract class AbstractSchedulerService extends TurbineBaseService implem
         {
             thread.interrupt();
         }
-        enabled = false;
+        setEnabled(false);
     }
 
     /**
@@ -231,7 +232,7 @@ public abstract class AbstractSchedulerService extends TurbineBaseService implem
      */
     public synchronized Thread getThread()
     {
-        return thread;
+        return houseKeepingThread;
     }
 
     /**
@@ -239,7 +240,7 @@ public abstract class AbstractSchedulerService extends TurbineBaseService implem
      */
     protected synchronized void clearThread()
     {
-        thread = null;
+        houseKeepingThread = null;
     }
 
     /**
@@ -250,21 +251,21 @@ public abstract class AbstractSchedulerService extends TurbineBaseService implem
      */
     public synchronized void restart()
     {
-        if (enabled)
+        if (enabled.get())
         {
             log.info("Starting job scheduler");
-            if (thread == null)
+            if (houseKeepingThread == null)
             {
                 // Create the the housekeeping thread of the scheduler. It will
                 // wait for the time when the next task needs to be started,
                 // and then launch a worker thread to execute the task.
-                thread = new Thread(mainLoop, ScheduleService.SERVICE_NAME);
+                houseKeepingThread = new Thread(() -> houseKeeping(), ScheduleService.SERVICE_NAME);
                 // Indicate that this is a system thread. JVM will quit only
                 // when there are no more enabled user threads. Settings threads
                 // spawned internally by Turbine as daemons allows commandline
                 // applications using Turbine to terminate in an orderly manner.
-                thread.setDaemon(true);
-                thread.start();
+                houseKeepingThread.setDaemon(true);
+                houseKeepingThread.start();
             }
             else
             {
@@ -324,48 +325,39 @@ public abstract class AbstractSchedulerService extends TurbineBaseService implem
     }
 
     /**
-     * Inner class. This is isolated in its own Runnable class just so that the
-     * main class need not implement Runnable, which would allow others to
-     * directly invoke run, which is not supported.
+     * Create the the housekeeping thread of the scheduler. It will
+     * wait for the time when the next task needs to be started,
+     * and then launch a worker thread to execute the task.
      */
-    protected class MainLoop implements Runnable
+    private void houseKeeping()
     {
-        /**
-         * Method to run the class.
-         */
-        @Override
-        public void run()
+        String taskName = null;
+        try
         {
-            String taskName = null;
-            try
+            while (enabled.get())
             {
-                while (enabled)
+                JobEntry je = nextJob();
+                if (je != null)
                 {
-                    JobEntry je = nextJob();
-                    if (je != null)
-                    {
-                        taskName = je.getTask();
+                    taskName = je.getTask();
 
-                        // Start the thread to run the job.
-                        Runnable wt = new WorkerThread(je);
-                        Thread helper = new Thread(wt);
-                        helper.start();
-                    }
-                    else
-                    {
-                        break;
-                    }
+                    // Get a thread to run the job.
+                    threadPool.execute(new WorkerThread(je));
+                }
+                else
+                {
+                    break;
                 }
             }
-            catch (Exception e)
-            {
-                log.error("Error running a Scheduled Job: {}", taskName, e);
-                enabled = false;
-            }
-            finally
-            {
-                clearThread();
-            }
+        }
+        catch (Exception e)
+        {
+            log.error("Error running a Scheduled Job: {}", taskName, e);
+            setEnabled(false);
+        }
+        finally
+        {
+            clearThread();
         }
     }
 }