Changeset 8125


Ignore:
Timestamp:
Mar 9, 2023, 1:39:24 PM (7 months ago)
Author:
Nicklas Nordborg
Message:

References #2295: Add API for services to send log messages that can be displayed by the web client

Renamed classes Service* -> Extensions* and extract inner classes to separate files.

Location:
branches/3.19-stable
Files:
2 added
7 edited
2 moved

Legend:

Unmodified
Added
Removed
  • branches/3.19-stable/src/clients/web/net/sf/basedb/clients/web/extensions/service/DummyService.java

    r8124 r8125  
    2929import net.sf.basedb.util.extensions.ActionFactory;
    3030import net.sf.basedb.util.extensions.InvokationContext;
    31 import net.sf.basedb.util.extensions.logging.ServiceLogger;
    32 import net.sf.basedb.util.extensions.logging.ServiceLog.LogLevel;
     31import net.sf.basedb.util.extensions.logging.ExtensionsLogger;
     32import net.sf.basedb.util.extensions.logging.LogLevel;
    3333
    3434/**
     
    8888 
    8989  @Override
    90   public void start(final ServiceLogger logger)
     90  public void start(final ExtensionsLogger logger)
    9191  {
    9292    if (running) return;
  • branches/3.19-stable/src/clients/web/net/sf/basedb/clients/web/extensions/service/ServiceControllerAction.java

    r8124 r8125  
    2323
    2424import net.sf.basedb.util.extensions.Action;
    25 import net.sf.basedb.util.extensions.logging.ServiceLogger;
     25import net.sf.basedb.util.extensions.logging.ExtensionsLogger;
    2626
    2727/**
     
    5151    is called on a running service it should do nothing. If the service can't
    5252    be started it may throw an exception.
    53     @deprecated In 3.19.8, implement the {@link #start(ServiceLogger)}
     53    @deprecated In 3.19.8, implement the {@link #start(ExtensionsLogger)}
    5454      method instead. This method will never be called from the BASE
    55       core except for the default implementation of {@link #start(ServiceLogger)}.
     55      core except for the default implementation of {@link #start(ExtensionsLogger)}.
    5656  */
    5757  @Deprecated
     
    7272    @since 3.19.8
    7373  */
    74   public default void start(ServiceLogger logger)
     74  public default void start(ExtensionsLogger logger)
    7575  {
    7676    start();
  • branches/3.19-stable/src/clients/web/net/sf/basedb/clients/web/extensions/service/StartServiceRenderer.java

    r8124 r8125  
    2424import net.sf.basedb.util.extensions.AbstractRenderer;
    2525import net.sf.basedb.util.extensions.Extension;
    26 import net.sf.basedb.util.extensions.logging.ServiceLog;
    27 import net.sf.basedb.util.extensions.logging.ServiceLogger;
    28 import net.sf.basedb.util.extensions.logging.ServiceLog.LogLevel;
     26import net.sf.basedb.util.extensions.logging.ExtensionsLog;
     27import net.sf.basedb.util.extensions.logging.ExtensionsLogger;
     28import net.sf.basedb.util.extensions.logging.LogLevel;
    2929
    3030/**
     
    5252  {
    5353    log.info("Starting service: " + service);
    54     ServiceLogger logger = ServiceLog.getLogger(ext.getId(), true);
     54    ExtensionsLogger logger = ExtensionsLog.getLogger(ext.getId(), true);
    5555    service.start(logger);
    5656    logger.log(LogLevel.INFO, "Service started");
  • branches/3.19-stable/src/clients/web/net/sf/basedb/clients/web/extensions/service/StopServiceRenderer.java

    r8124 r8125  
    2323
    2424import net.sf.basedb.util.extensions.Extension;
    25 import net.sf.basedb.util.extensions.logging.ServiceLog;
    26 import net.sf.basedb.util.extensions.logging.ServiceLogger;
    27 import net.sf.basedb.util.extensions.logging.ServiceLog.LogLevel;
     25import net.sf.basedb.util.extensions.logging.ExtensionsLog;
     26import net.sf.basedb.util.extensions.logging.ExtensionsLogger;
     27import net.sf.basedb.util.extensions.logging.LogLevel;
    2828import net.sf.basedb.util.extensions.AbstractRenderer;
    2929
     
    5454    log.info("Stopping service: " + service);
    5555    service.stop();
    56     ServiceLogger logger = ServiceLog.getLogger(ext.getId(), false);
     56    ExtensionsLogger logger = ExtensionsLog.getLogger(ext.getId(), false);
    5757    if (logger != null) logger.log(LogLevel.INFO, "Service stopped");
    5858    log.info("Stopping service done: " + service);
  • branches/3.19-stable/src/core/net/sf/basedb/util/extensions/logging/ExtensionsLog.java

    r8124 r8125  
    2222package net.sf.basedb.util.extensions.logging;
    2323
    24 import java.util.Date;
    2524import java.util.Deque;
    2625import java.util.HashMap;
     
    3332
    3433import org.apache.commons.collections4.iterators.UnmodifiableIterator;
    35 import org.slf4j.Logger;
    36 
    37 import net.sf.basedb.core.DateUtil;
    38 import net.sf.basedb.util.error.ThrowableUtil;
    3934
    4035/**
     
    4439  @since 3.19.8
    4540*/
    46 public class ServiceLog
     41public class ExtensionsLog
    4742{
    48   private static Map<String, ServiceLog> logs = new HashMap<>();
     43  private static Map<String, ExtensionsLog> logs = new HashMap<>();
    4944 
    5045  /**
     
    5247    doens't exists yet it can optionally be created.
    5348  */
    54   public static ServiceLog getLog(String extensionId, boolean create)
    55   {
    56     ServiceLog log = logs.get(extensionId);
     49  public static ExtensionsLog getLog(String extensionId, boolean create)
     50  {
     51    ExtensionsLog log = logs.get(extensionId);
    5752    if (log == null && create)
    5853    {
     
    6257        if (log == null)
    6358        {
    64           log = new ServiceLog(extensionId);
     59          log = new ExtensionsLog(extensionId);
    6560          logs.put(extensionId, log);
    6661        }
     
    7469    If the log doesn't exists yet, it can optionally be created.
    7570  */
    76   public static ServiceLogger getLogger(String extensionId, boolean create)
    77   {
    78     ServiceLog log = getLog(extensionId, create);
     71  public static ExtensionsLogger getLogger(String extensionId, boolean create)
     72  {
     73    ExtensionsLog log = getLog(extensionId, create);
    7974    return log == null ? null : log.createLogger();
    8075  }
     
    9287  private boolean copyToStdout;
    9388 
    94   private ServiceLog(String extensionId)
     89  private ExtensionsLog(String extensionId)
    9590  {
    9691    this.extensionId = extensionId;
     
    198193    Create a logger that adds messages to this log.
    199194  */
    200   public ServiceLogger createLogger()
    201   {
    202     return new ServiceLogger(this);
     195  public ExtensionsLogger createLogger()
     196  {
     197    return new ExtensionsLogger(this);
    203198  }
    204199
     
    211206  void add(LogEntry entry)
    212207  {
    213     if (copyToStdout && (entry.level != LogLevel.TRACE || isDebugEnabled))
     208    if (copyToStdout && (entry.getLevel() != LogLevel.TRACE || isDebugEnabled))
    214209    {
    215210      System.out.println("["+extensionId+"] "+entry);
    216211    }
    217     if (entry.level == LogLevel.TRACE || (entry.level == LogLevel.DEBUG && !isDebugEnabled))
     212    if (entry.getLevel() == LogLevel.TRACE || (entry.getLevel() == LogLevel.DEBUG && !isDebugEnabled))
    218213    {
    219214      return;
     
    225220      l.lock();
    226221      logEntries.addFirst(entry);
    227       if (entry.level == LogLevel.WARNING) numWarnings++;
    228       if (entry.level == LogLevel.ERROR) numErrors++;
     222      if (entry.getLevel() == LogLevel.WARNING) numWarnings++;
     223      if (entry.getLevel() == LogLevel.ERROR) numErrors++;
    229224     
    230225      if (numEntries++ > maxEntries)
     
    233228        numEntries--;
    234229        LogEntry last = logEntries.removeLast();
    235         if (last.level == LogLevel.WARNING) numWarnings--;
    236         if (last.level == LogLevel.ERROR) numErrors--;
     230        if (last.getLevel() == LogLevel.WARNING) numWarnings--;
     231        if (last.getLevel() == LogLevel.ERROR) numErrors--;
    237232      }
    238233    }
     
    252247    return UnmodifiableIterator.unmodifiableIterator(logEntries.iterator());
    253248  }
    254  
    255   /**
    256     The level of the log message.
    257   */
    258   public enum LogLevel
    259   {
    260     INFO("info.png")
    261     {
    262       @Override
    263       void logTo(Logger logger, String msg, Throwable t)
    264       {
    265         logger.info(msg, t);
    266       }
    267     },
    268     WARNING("warning.png")
    269     {
    270       @Override
    271       void logTo(Logger logger, String msg, Throwable t)
    272       {
    273         logger.warn(msg, t);
    274       }
    275     },
    276     ERROR("error.png")
    277     {
    278       @Override
    279       void logTo(Logger logger, String msg, Throwable t)
    280       {
    281         logger.error(msg, t);
    282       }
    283     },
    284     DEBUG("bug.png")
    285     {
    286       @Override
    287       void logTo(Logger logger, String msg, Throwable t)
    288       {
    289         logger.debug(msg, t);
    290       }
    291     },
    292     TRACE("trace.png")
    293     {
    294       @Override
    295       void logTo(Logger logger, String msg, Throwable t)
    296       {
    297         logger.trace(msg, t);
    298       }
    299     };
    300    
    301     private final String icon;
    302    
    303     private LogLevel(String icon)
    304     {
    305       this.icon = icon;
    306     }
    307    
    308     /**
    309       Get the icon that represents this log level.
    310     */
    311     public String getIcon()
    312     {
    313       return icon;
    314     }
    315    
    316     abstract void logTo(org.slf4j.Logger logger, String msg, Throwable t);
    317   }
    318  
    319   /**
    320     An entry in the log.
    321   */
    322   public static class LogEntry
    323   {
    324     private final long timestamp;
    325     private final LogLevel level;
    326     private final String message;
    327     private final Throwable t;
    328    
    329     LogEntry(LogLevel level, String message, Throwable t)
    330     {
    331       this.timestamp = System.currentTimeMillis();
    332       this.level = level;
    333       this.message = message;
    334       this.t = t;
    335     }
    336    
    337     /**
    338       The level of the log entry.
    339     */
    340     public LogLevel getLevel()
    341     {
    342       return level;
    343     }
    344    
    345     /**
    346       The timestamp of the log entry.
    347     */
    348     public long getTimestamp()
    349     {
    350       return timestamp;
    351     }
    352    
    353     /**
    354       The timestamp of the log entry as a date.
    355     */
    356     public Date getDate()
    357     {
    358       return new Date(timestamp);
    359     }
    360    
    361     /**
    362       Get the log message.
    363     */
    364     public String getMessage()
    365     {
    366       return message;
    367     }
    368    
    369     /**
    370       Get the stacktrace of the log entry.
    371     */
    372     public Throwable getStacktrace()
    373     {
    374       return t;
    375     }
    376 
    377     @Override
    378     public String toString()
    379     {
    380       String s = "["+level.name()+"] ["+DateUtil.formatTimestamp(getDate())+"] "+message;
    381       if (t != null)
    382       {
    383         s+="\n"+ThrowableUtil.stackTraceToString(t);
    384       }
    385       return s;
    386     }
    387    
    388   }
    389249
    390250}
  • branches/3.19-stable/src/core/net/sf/basedb/util/extensions/logging/ExtensionsLogger.java

    r8124 r8125  
     1/**
     2  $Id$
     3
     4  Copyright (C) 2023 Nicklas Nordborg
     5
     6  This file is part of BASE - BioArray Software Environment.
     7  Available at http://base.thep.lu.se/
     8
     9  BASE is free software; you can redistribute it and/or
     10  modify it under the terms of the GNU General Public License
     11  as published by the Free Software Foundation; either version 3
     12  of the License, or (at your option) any later version.
     13
     14  BASE is distributed in the hope that it will be useful,
     15  but WITHOUT ANY WARRANTY; without even the implied warranty of
     16  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     17  GNU General Public License for more details.
     18
     19  You should have received a copy of the GNU General Public License
     20  along with BASE. If not, see <http://www.gnu.org/licenses/>.
     21*/
    122package net.sf.basedb.util.extensions.logging;
    2 
    3 import net.sf.basedb.util.extensions.logging.ServiceLog.LogEntry;
    4 import net.sf.basedb.util.extensions.logging.ServiceLog.LogLevel;
    523
    624/**
    725  A simple logger that services can use to send log message to the BASE
    826  core. An instance is handed out to the service by the {@link
    9   ServiceControllerAction#start(ServiceLogger)} method, which the service
     27  ServiceControllerAction#start(ExtensionsLogger)} method, which the service
    1028  can use as long as it is running.
    1129  <p>
     
    2038  @since 3.19.8
    2139*/
    22 public class ServiceLogger
     40public class ExtensionsLogger
    2341{
    24   private final ServiceLog log;
     42  private final ExtensionsLog log;
    2543  private final org.slf4j.Logger otherLogger;
    2644 
    27   ServiceLogger(ServiceLog log)
     45  ExtensionsLogger(ExtensionsLog log)
    2846  {
    2947    this(log, null);
    3048  }
    3149 
    32   ServiceLogger(ServiceLog log, org.slf4j.Logger otherLogger)
     50  ExtensionsLogger(ExtensionsLog log, org.slf4j.Logger otherLogger)
    3351  {
    3452    this.log = log;
     
    4159    also forwarded to the SLF4J logger.
    4260  */
    43   public ServiceLogger wrap(org.slf4j.Logger otherLogger)
     61  public ExtensionsLogger wrap(org.slf4j.Logger otherLogger)
    4462  {
    45     return new ServiceLogger(this.log, otherLogger);
     63    return new ExtensionsLogger(this.log, otherLogger);
    4664  }
    4765 
    4866  /**
    4967    Check if DEBUG logging has been enabled or not. Debug logging
    50     can be enabled either by the {@link ServiceLog#setDebugEnabled(boolean)}
     68    can be enabled either by the {@link ExtensionsLog#setDebugEnabled(boolean)}
    5169    method or by a wrapped {@link Logger}.
    5270  */
     
    5876  /**
    5977    Check if TRACE logging has been enabled or not. Trace logging is enabled
    60     only if both DEBUG logging and {@link ServiceLog#isCopyingToStdout()}
     78    only if both DEBUG logging and {@link ExtensionsLog#isCopyingToStdout()}
    6179    are enabled or if a wrapped {@link Logger} has it enabled.
    6280  */
  • branches/3.19-stable/www/admin/services/index.jsp

    r8124 r8125  
    3434  import="net.sf.basedb.util.extensions.Extension"
    3535  import="net.sf.basedb.clients.web.extensions.ExtensionsControl"
    36   import="net.sf.basedb.util.extensions.logging.ServiceLogger"
    37   import="net.sf.basedb.util.extensions.logging.ServiceLog.LogLevel"
    38   import="net.sf.basedb.util.extensions.logging.ServiceLog"
     36  import="net.sf.basedb.util.extensions.logging.ExtensionsLogger"
     37  import="net.sf.basedb.util.extensions.logging.ExtensionsLog"
     38  import="net.sf.basedb.util.extensions.logging.LogLevel"
    3939  import="java.util.List"
    4040%>
     
    8080    boolean copyToStdout = Values.getBoolean(request.getParameter("copyToStdout"));
    8181    boolean autoUpdate = Values.getBoolean(request.getParameter("autoUpdate"));
    82     ServiceLog serviceLog = ServiceLog.getLog(extensionId, true);
    83     ServiceLogger logger = serviceLog.createLogger();
     82    ExtensionsLog serviceLog = ExtensionsLog.getLog(extensionId, true);
     83    ExtensionsLogger logger = serviceLog.createLogger();
    8484    if (copyToStdout != serviceLog.isCopyingToStdout())
    8585    {
    86       if (!copyToStdout) logger.info("Stop copy to stdout");
    87       serviceLog.setCopyToStdout(copyToStdout);
    88       if (copyToStdout) logger.info("Start copy to stdout");
     86  if (!copyToStdout) logger.info("Stop copy to stdout");
     87  serviceLog.setCopyToStdout(copyToStdout);
     88  if (copyToStdout) logger.info("Start copy to stdout");
    8989    }
    9090    serviceLog.setCopyToStdout(copyToStdout);
    9191    if (enableDebug != serviceLog.isDebugEnabled())
    9292    {
    93       if (!enableDebug) logger.debug("Debug logging was disabled");
    94       serviceLog.setDebugEnabled(enableDebug);
    95       if (enableDebug) logger.debug("Debug logging was enabled");
     93  if (!enableDebug) logger.debug("Debug logging was disabled");
     94  serviceLog.setDebugEnabled(enableDebug);
     95  if (enableDebug) logger.debug("Debug logging was enabled");
    9696    }
    9797    redirect = "view_log.jsp?ID="+ID+"&extensionId="+HTML.urlEncode(extensionId)+"&autoUpdate="+autoUpdate;
     
    100100  {
    101101    String extensionId = request.getParameter("extensionId");
    102     ServiceLog serviceLog = ServiceLog.getLog(extensionId, false);
     102    ExtensionsLog serviceLog = ExtensionsLog.getLog(extensionId, false);
    103103    if (serviceLog != null)
    104104    {
    105       serviceLog.clearLog();
    106       serviceLog.createLogger().log(LogLevel.INFO, "The log was cleared by "+sc.getLoggedInUserName()+" ("+sc.getLoggedInUserLogin()+")");
     105  serviceLog.clearLog();
     106  serviceLog.createLogger().log(LogLevel.INFO, "The log was cleared by "+sc.getLoggedInUserName()+" ("+sc.getLoggedInUserLogin()+")");
    107107    }
    108108    redirect = "view_log.jsp?ID="+ID+"&extensionId="+HTML.urlEncode(extensionId);
  • branches/3.19-stable/www/admin/services/services.jsp

    r8124 r8125  
    1515  import="net.sf.basedb.clients.web.extensions.service.ServiceControllerAction"
    1616  import="net.sf.basedb.clients.web.extensions.service.Services"
    17   import="net.sf.basedb.util.extensions.logging.ServiceLog"
     17  import="net.sf.basedb.util.extensions.logging.ExtensionsLog"
    1818  import="java.util.Iterator"
    1919%>
     
    4040try
    4141{
    42   %>
     42%>
    4343  <base:page title="Manage Services" id="list-page">
    4444  <base:head scripts="table.js,~services.js" styles="table.css">
    45     <ext:scripts context="<%=jspContext %>" />
     45    <ext:scripts context="<%=jspContext%>" />
    4646    <ext:stylesheets context="<%=jspContext%>" />
    4747  </base:head>
     
    8080        <%
    8181        Extension<? extends ServiceControllerAction> last = null;
    82         while (it.hasNext())
    83         {
    84           numServices++;
    85           ServiceControllerAction action = it.next();
    86           Extension<? extends ServiceControllerAction> ext = it.getExtension();
    87           boolean isNewExtension = ext != last;
    88           last = ext;
    89           ServiceLog serviceLog = ServiceLog.getLog(ext.getId(), false);
    90           String serviceLogSummary = "";
    91           String serviceLogIcon = "service_log.png";
    92           if (serviceLog != null)
    93           {
    94             serviceLogSummary = "View the log for this service; "+
    95               serviceLog.getNumEntries() +" entries; " +
    96               serviceLog.getNumErrors()+" errors; "+
    97               serviceLog.getNumWarnings()+" warnings";
    98             if (serviceLog.getNumErrors() > 0)
     82            while (it.hasNext())
    9983            {
    100               serviceLogIcon = "service_log_error.png";
    101             }
    102             else if (serviceLog.getNumWarnings() > 0)
    103             {
    104               serviceLogIcon = "service_log_warning.png";
    105             }
    106           }
    107           boolean isRunning = false;
    108           Throwable error = null;
    109           try
    110           {
    111             isRunning = action.isRunning();
    112             if (!isRunning) error = ec.getLastExtensionError(ext.getId());
    113           }
    114           catch (Throwable t)
    115           {
    116             error = t;
    117           }
    118           boolean hasError = error != null;
    119           %>
     84              numServices++;
     85              ServiceControllerAction action = it.next();
     86              Extension<? extends ServiceControllerAction> ext = it.getExtension();
     87              boolean isNewExtension = ext != last;
     88              last = ext;
     89              ExtensionsLog serviceLog = ExtensionsLog.getLog(ext.getId(), false);
     90              String serviceLogSummary = "";
     91              String serviceLogIcon = "service_log.png";
     92              if (serviceLog != null)
     93              {
     94                serviceLogSummary = "View the log for this service; "+
     95                  serviceLog.getNumEntries() +" entries; " +
     96                  serviceLog.getNumErrors()+" errors; "+
     97                  serviceLog.getNumWarnings()+" warnings";
     98                if (serviceLog.getNumErrors() > 0)
     99                {
     100                  serviceLogIcon = "service_log_error.png";
     101                }
     102                else if (serviceLog.getNumWarnings() > 0)
     103                {
     104                  serviceLogIcon = "service_log_warning.png";
     105                }
     106              }
     107              boolean isRunning = false;
     108              Throwable error = null;
     109              try
     110              {
     111                isRunning = action.isRunning();
     112                if (!isRunning) error = ec.getLastExtensionError(ext.getId());
     113              }
     114              catch (Throwable t)
     115              {
     116                error = t;
     117              }
     118              boolean hasError = error != null;
     119        %>
    120120          <tbl:row>
    121121            <tbl:cell column="extension">
  • branches/3.19-stable/www/admin/services/view_log.jsp

    r8124 r8125  
    1717  import="net.sf.basedb.clients.web.extensions.service.ServiceControllerAction"
    1818  import="net.sf.basedb.clients.web.extensions.service.Services"
    19   import="net.sf.basedb.util.extensions.logging.ServiceLog"
    20   import="net.sf.basedb.util.extensions.logging.ServiceLog.LogEntry"
     19  import="net.sf.basedb.util.extensions.logging.ExtensionsLog"
     20  import="net.sf.basedb.util.extensions.logging.LogEntry"
    2121  import="net.sf.basedb.clients.web.util.HTML"
    2222  import="java.util.Date"
     
    3232final boolean autoUpdate = Values.getBoolean(request.getParameter("autoUpdate"));
    3333Extension ext = ExtensionsControl.get(null).getExtension(xtId);
    34 ServiceLog serviceLog = ServiceLog.getLog(ext.getId(), true);
     34ExtensionsLog serviceLog = ExtensionsLog.getLog(ext.getId(), true);
    3535try
    3636{
    37   %>
     37%>
    3838  <base:page type="popup" title="View log" id="view-page">
    3939  <base:head scripts="table.js,~services.js" styles="table.css,toolbar.css">
Note: See TracChangeset for help on using the changeset viewer.