blob: c21f26c4afca54762de40452b608ca15fe44b700 [file] [log] [blame]
/*=============================================================================#
# Copyright (c) 2009, 2019 Stephan Wahlbrink and others.
#
# This program and the accompanying materials are made available under the
# terms of the Eclipse Public License 2.0 which is available at
# https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0
# which is available at https://www.apache.org/licenses/LICENSE-2.0.
#
# SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
#
# Contributors:
# Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
#=============================================================================*/
package org.eclipse.statet.rj.servi.webapp;
import java.util.concurrent.CopyOnWriteArraySet;
import java.util.logging.Level;
import java.util.logging.LogRecord;
import java.util.logging.Logger;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import org.eclipse.statet.jcommons.lang.Disposable;
import org.eclipse.statet.jcommons.runtime.AppEnvironment;
import org.eclipse.statet.jcommons.runtime.CommonsRuntime;
import org.eclipse.statet.jcommons.status.Status;
public class EAppEnvDummy implements ServletContextListener, AppEnvironment {
private final CopyOnWriteArraySet<Disposable> stopListeners= new CopyOnWriteArraySet<>();
private ServletContext context;
private Logger logger;
public EAppEnvDummy() {
}
@Override
public void contextInitialized(final ServletContextEvent sce) {
this.context= sce.getServletContext();
CommonsRuntime.init(this);
this.logger= Logger.getLogger("org.eclipse.statet.rj.servi.pool");
}
@Override
public void contextDestroyed(final ServletContextEvent sce) {
try {
for (final Disposable listener : this.stopListeners) {
listener.dispose();
}
}
finally {
this.stopListeners.clear();
this.context= null;
}
}
@Override
public String getBundleId() {
return "org.eclipse.statet.rj.services.eruntime";
}
@Override
public void log(final Status status) {
final Level level;
switch (status.getSeverity()) {
case Status.INFO:
level= Level.INFO;
break;
case Status.WARNING:
level= Level.WARNING;
break;
case Status.ERROR:
level= Level.SEVERE;
break;
default:
level= Level.FINE;
}
final LogRecord record= new LogRecord(level, status.getMessage());
if (status.getException() != null) {
record.setThrown(status.getException());
}
// set correct caller
try {
final StackTraceElement[] stackTrace= new Exception().getStackTrace();
for (int i= 1; i < stackTrace.length; i++) {
if (!stackTrace[i].getMethodName().startsWith("log")) {
record.setSourceClassName(stackTrace[i].getClassName());
record.setSourceMethodName(stackTrace[i].getMethodName());
break;
}
}
}
catch (final Exception ignore) {}
this.logger.log(record);
}
@Override
public void addStoppingListener(final Disposable listener) {
this.stopListeners.add(listener);
}
@Override
public void removeStoppingListener(final Disposable listener) {
this.stopListeners.remove(listener);
}
}