Skip to content

Commit

Permalink
Merge pull request #104 from jamezp/LOGMGR-147
Browse files Browse the repository at this point in the history
[LOGMGR-147] Add a closeChildren property to the ExtHandler. This mak…
  • Loading branch information
jamezp authored Mar 10, 2017
2 parents 68be924 + a329325 commit ca62224
Show file tree
Hide file tree
Showing 2 changed files with 116 additions and 6 deletions.
39 changes: 33 additions & 6 deletions src/main/java/org/jboss/logmanager/ExtHandler.java
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@
package org.jboss.logmanager;

import java.io.UnsupportedEncodingException;

import java.security.Permission;
import java.util.concurrent.atomic.AtomicReferenceFieldUpdater;
import java.util.logging.ErrorManager;
Expand All @@ -43,6 +42,7 @@ public abstract class ExtHandler extends Handler implements FlushableCloseable,
private static final Permission CONTROL_PERMISSION = new LoggingPermission("control", null);
private volatile boolean autoFlush = true;
private volatile boolean enabled = true;
private volatile boolean closeChildren;
private static final ErrorManager DEFAULT_ERROR_MANAGER = new OnlyOnceErrorManager();

private volatile Object protectKey;
Expand All @@ -67,6 +67,7 @@ public abstract class ExtHandler extends Handler implements FlushableCloseable,
*/
protected ExtHandler() {
handlersUpdater.clear(this);
closeChildren = true;
super.setErrorManager(DEFAULT_ERROR_MANAGER);
}

Expand Down Expand Up @@ -230,6 +231,28 @@ public final boolean isEnabled() {
return enabled;
}

/**
* Indicates whether or not children handlers should be closed when this handler is {@linkplain #close() closed}.
*
* @return {@code true} if the children handlers should be closed when this handler is closed, {@code false} if
* children handlers should not be closed when this handler is closed
*/
public boolean isCloseChildren() {
return closeChildren;
}

/**
* Sets whether or not children handlers should be closed when this handler is {@linkplain #close() closed}.
*
* @param closeChildren {@code true} if all children handlers should be closed when this handler is closed,
* {@code false} if children handlers will <em>not</em> be closed when this handler
* is closed
*/
public void setCloseChildren(final boolean closeChildren) {
checkAccess(this);
this.closeChildren = closeChildren;
}

@Override
public final void protect(Object protectionKey) throws SecurityException {
if (protectKeyUpdater.compareAndSet(this, null, protectionKey)) {
Expand Down Expand Up @@ -313,11 +336,15 @@ public void flush() {
@Override
public void close() throws SecurityException {
checkAccess(this);
for (Handler handler : handlers) try {
handler.close();
} catch (Exception ex) {
reportError("Failed to close child handler", ex, ErrorManager.CLOSE_FAILURE);
} catch (Throwable ignored) {}
if (closeChildren) {
for (Handler handler : handlers)
try {
handler.close();
} catch (Exception ex) {
reportError("Failed to close child handler", ex, ErrorManager.CLOSE_FAILURE);
} catch (Throwable ignored) {
}
}
}

@Override
Expand Down
83 changes: 83 additions & 0 deletions src/test/java/org/jboss/logmanager/handlers/HandlerTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
/*
* JBoss, Home of Professional Open Source.
*
* Copyright 2017 Red Hat, Inc., and individual contributors
* as indicated by the @author tags.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

package org.jboss.logmanager.handlers;

import org.jboss.logmanager.ExtHandler;
import org.junit.Assert;
import org.junit.Test;

/**
* @author <a href="mailto:[email protected]">James R. Perkins</a>
*/
public class HandlerTest {

@Test
public void testHandlerClose() throws Exception {
final CloseHandler parent = new CloseHandler();
final CloseHandler child1 = new CloseHandler();
final CloseHandler child2 = new CloseHandler();
parent.setHandlers(new CloseHandler[] {child1, child2, new CloseHandler()});

// Ensure all handlers are not closed
Assert.assertFalse(parent.closed);
Assert.assertFalse(child1.closed);
Assert.assertFalse(child2.closed);

// Close the parent handler, the children should be closed
parent.close();
Assert.assertTrue(parent.closed);
Assert.assertTrue(child1.closed);
Assert.assertTrue(child2.closed);

// Reset and wrap
parent.reset();
child1.reset();
child2.reset();

parent.setCloseChildren(false);

// Ensure all handlers are not closed
Assert.assertFalse(parent.closed);
Assert.assertFalse(child1.closed);
Assert.assertFalse(child2.closed);

parent.close();

// The parent should be closed, the others should be open
Assert.assertTrue(parent.closed);
Assert.assertFalse(child1.closed);
Assert.assertFalse(child2.closed);

}

static class CloseHandler extends ExtHandler {
private boolean closed = false;

@Override
public void close() {
closed = true;
super.close();
}

void reset() {
closed = false;
}
}
}

0 comments on commit ca62224

Please sign in to comment.