Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[LOGMGR-147] Add a closeChildren property to the ExtHandler. This mak… #104

Merged
merged 1 commit into from
Mar 10, 2017
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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;
}
}
}