You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by or...@apache.org on 2015/06/15 17:43:54 UTC

svn commit: r1685599 [2/3] - in /qpid/java/trunk: bdbstore/src/main/java/org/apache/qpid/server/virtualhost/berkeleydb/ broker-core/src/main/java/org/apache/qpid/server/logging/ broker-core/src/main/java/org/apache/qpid/server/model/ broker-core/src/ma...

Modified: qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/queue/AbstractQueue.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/queue/AbstractQueue.java?rev=1685599&r1=1685598&r2=1685599&view=diff
==============================================================================
--- qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/queue/AbstractQueue.java (original)
+++ qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/queue/AbstractQueue.java Mon Jun 15 15:43:53 2015
@@ -1150,7 +1150,7 @@ public abstract class AbstractQueue<X ex
         {
             if (action != null || (exclusiveSub == null  && _queueRunner.isIdle()))
             {
-                Subject.doAs(SecurityManager.getSystemTaskSubject("Immediate Delivery"),
+                Subject.doAs(SecurityManager.getSystemTaskSubject("Immediate Delivery", _virtualHost.getPrincipal()),
                              new PrivilegedAction<Void>()
                              {
                                  @Override

Modified: qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/queue/QueueRunner.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/queue/QueueRunner.java?rev=1685599&r1=1685598&r2=1685599&view=diff
==============================================================================
--- qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/queue/QueueRunner.java (original)
+++ qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/queue/QueueRunner.java Mon Jun 15 15:43:53 2015
@@ -66,7 +66,7 @@ public class QueueRunner implements Runn
     {
         if(_scheduled.compareAndSet(SCHEDULED,RUNNING))
         {
-            Subject.doAs(SecurityManager.getSystemTaskSubject("Queue Delivery"), new PrivilegedAction<Object>()
+            Subject.doAs(SecurityManager.getSystemTaskSubject("Queue Delivery", _queue.getVirtualHost().getPrincipal()), new PrivilegedAction<Object>()
             {
                 @Override
                 public Object run()

Modified: qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/security/SecurityManager.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/security/SecurityManager.java?rev=1685599&r1=1685598&r2=1685599&view=diff
==============================================================================
--- qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/security/SecurityManager.java (original)
+++ qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/security/SecurityManager.java Mon Jun 15 15:43:53 2015
@@ -59,6 +59,8 @@ import org.apache.qpid.server.model.Stat
 import org.apache.qpid.server.model.User;
 import org.apache.qpid.server.model.VirtualHost;
 import org.apache.qpid.server.model.VirtualHostAlias;
+import org.apache.qpid.server.model.VirtualHostLogger;
+import org.apache.qpid.server.model.VirtualHostLoggerFilter;
 import org.apache.qpid.server.model.VirtualHostNode;
 import org.apache.qpid.server.protocol.AMQConnectionModel;
 import org.apache.qpid.server.queue.QueueConsumer;
@@ -108,8 +110,24 @@ public class SecurityManager
 
     public static Subject getSystemTaskSubject(String taskName)
     {
+        return getSystemSubject(new TaskPrincipal(taskName));
+    }
+
+    public static Subject getSystemTaskSubject(String taskName, Principal principal)
+    {
+        return getSystemSubject(new TaskPrincipal(taskName), principal);
+    }
+
+    private static Subject getSystemSubject(Principal... principals)
+    {
         Subject subject = new Subject(false, SYSTEM.getPrincipals(), SYSTEM.getPublicCredentials(), SYSTEM.getPrivateCredentials());
-        subject.getPrincipals().add(new TaskPrincipal(taskName));
+        if (principals !=null)
+        {
+            for (Principal principal:principals)
+            {
+                subject.getPrincipals().add(principal);
+            }
+        }
         subject.setReadOnly();
         return subject;
     }
@@ -398,6 +416,7 @@ public class SecurityManager
         return Broker.class.isAssignableFrom(category) ||
                PreferencesProvider.class.isAssignableFrom(category) ||
                BrokerLoggerFilter.class.isAssignableFrom(category) ||
+               VirtualHostAlias.class.isAssignableFrom(category) ||
                ( !VirtualHostNode.class.isAssignableFrom(category) && getModel().getChildTypes(Broker.class).contains(category));
     }
 
@@ -447,6 +466,11 @@ public class SecurityManager
                     objectName);
             properties = new OperationLoggingDetails(description);
         }
+        else if (isVirtualHostType(configuredObjectType))
+        {
+            ConfiguredObject<?> virtualHost = getModel().getAncestor(VirtualHost.class, configuredObject);
+            properties = new ObjectProperties((String)virtualHost.getAttribute(ConfiguredObject.NAME));
+        }
         return properties;
     }
 
@@ -489,6 +513,10 @@ public class SecurityManager
         {
             return ObjectType.BROKER;
         }
+        else if (isVirtualHostType(category))
+        {
+            return ObjectType.VIRTUALHOST;
+        }
         else if (Group.class.isAssignableFrom(category))
         {
             return ObjectType.GROUP;
@@ -502,14 +530,6 @@ public class SecurityManager
         {
             return ObjectType.USER;
         }
-        else if (VirtualHost.class.isAssignableFrom(category))
-        {
-            return ObjectType.VIRTUALHOST;
-        }
-        else if (VirtualHostAlias.class.isAssignableFrom(category))
-        {
-            return ObjectType.VIRTUALHOST;
-        }
         else if (Queue.class.isAssignableFrom(category))
         {
             return ObjectType.QUEUE;
@@ -518,11 +538,6 @@ public class SecurityManager
         {
             return ObjectType.EXCHANGE;
         }
-        else if (Connection.class.isAssignableFrom(category))
-        {
-            // ACCESS VIRTUALHOST
-            return ObjectType.VIRTUALHOST;
-        }
         else if (Session.class.isAssignableFrom(category))
         {
             // PUBLISH EXCHANGE
@@ -541,6 +556,14 @@ public class SecurityManager
         return null;
     }
 
+    private boolean isVirtualHostType(Class<? extends ConfiguredObject> category)
+    {
+        return VirtualHost.class.isAssignableFrom(category) ||
+                VirtualHostLogger.class.isAssignableFrom(category) ||
+                VirtualHostLoggerFilter.class.isAssignableFrom(category) ||
+                Connection.class.isAssignableFrom(category);
+    }
+
     public void authoriseUserUpdate(final String userName)
     {
         AuthenticatedPrincipal principal = getCurrentUser();

Modified: qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/virtualhost/AbstractVirtualHost.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/virtualhost/AbstractVirtualHost.java?rev=1685599&r1=1685598&r2=1685599&view=diff
==============================================================================
--- qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/virtualhost/AbstractVirtualHost.java (original)
+++ qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/virtualhost/AbstractVirtualHost.java Mon Jun 15 15:43:53 2015
@@ -21,6 +21,7 @@
 package org.apache.qpid.server.virtualhost;
 
 import java.io.File;
+import java.security.Principal;
 import java.security.PrivilegedAction;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -33,7 +34,6 @@ import java.util.Map;
 import java.util.Set;
 import java.util.UUID;
 import java.util.concurrent.BlockingQueue;
-import java.util.concurrent.CopyOnWriteArrayList;
 import java.util.concurrent.ScheduledFuture;
 import java.util.concurrent.ScheduledThreadPoolExecutor;
 import java.util.concurrent.TimeUnit;
@@ -153,6 +153,7 @@ public abstract class AbstractVirtualHos
 
     private NetworkConnectionScheduler _networkConnectionScheduler;
 
+    private final VirtualHostPrincipal _principal;
 
     @ManagedAttributeField
     private boolean _queue_deadLetterQueueEnabled;
@@ -190,8 +191,9 @@ public abstract class AbstractVirtualHos
 
     private MessageStore _messageStore;
     private MessageStoreRecoverer _messageStoreRecoverer;
-    private final FileSystemSpaceChecker _fileSystemSpaceChecker = new FileSystemSpaceChecker();
+    private final FileSystemSpaceChecker _fileSystemSpaceChecker;
     private int _fileSystemMaxUsagePercent;
+    private Collection<VirtualHostLogger> _virtualHostLoggersToClose;
 
     public AbstractVirtualHost(final Map<String, Object> attributes, VirtualHostNode<?> virtualHostNode)
     {
@@ -214,6 +216,8 @@ public abstract class AbstractVirtualHos
         _dataDelivered = new StatisticsCounter("bytes-delivered-" + getName());
         _messagesReceived = new StatisticsCounter("messages-received-" + getName());
         _dataReceived = new StatisticsCounter("bytes-received-" + getName());
+        _principal = new VirtualHostPrincipal(this);
+        _fileSystemSpaceChecker = new FileSystemSpaceChecker();
     }
 
     public void onValidate()
@@ -502,6 +506,10 @@ public abstract class AbstractVirtualHos
         {
             throw new UnsupportedOperationException();
         }
+        else if(childClass == VirtualHostLogger.class)
+        {
+            return getObjectFactory().createAsync(childClass, attributes, this);
+        }
         throw new IllegalArgumentException("Cannot create a child of class " + childClass.getSimpleName());
     }
 
@@ -852,7 +860,7 @@ public abstract class AbstractVirtualHos
     protected ListenableFuture<Void> beforeClose()
     {
         setState(State.UNAVAILABLE);
-
+        _virtualHostLoggersToClose = new ArrayList(getChildren(VirtualHostLogger.class));
         return super.beforeClose();
     }
 
@@ -870,6 +878,8 @@ public abstract class AbstractVirtualHos
             _networkConnectionScheduler = null;
         }
         _eventLogger.message(VirtualHostMessages.CLOSED(getName()));
+
+        stopLogging(_virtualHostLoggersToClose);
     }
 
     private void closeMessageStore()
@@ -1375,6 +1385,7 @@ public abstract class AbstractVirtualHos
     protected ListenableFuture<Void> doStop()
     {
         final SettableFuture<Void> returnVal = SettableFuture.create();
+        final List<VirtualHostLogger> loggers = new ArrayList<>(getChildren(VirtualHostLogger.class));
         closeChildren().addListener(
                 new Runnable()
                 {
@@ -1392,6 +1403,7 @@ public abstract class AbstractVirtualHos
                             closeMessageStore();
                             setState(State.STOPPED);
 
+                            stopLogging(loggers);
                         }
                         finally
                         {
@@ -1403,6 +1415,14 @@ public abstract class AbstractVirtualHos
         return returnVal;
     }
 
+    private void stopLogging(Collection<VirtualHostLogger> loggers)
+    {
+        for (VirtualHostLogger logger : loggers)
+        {
+            logger.stopLogging();
+        }
+    }
+
     @StateTransition( currentState = { State.ACTIVE, State.ERRORED }, desiredState = State.DELETED )
     private ListenableFuture<Void> doDelete()
     {
@@ -1629,6 +1649,13 @@ public abstract class AbstractVirtualHos
         return calculateTotalEnqueuedSize(getQueues());
     }
 
+
+    @Override
+    public Principal getPrincipal()
+    {
+        return _principal;
+    }
+
     private long calculateTotalEnqueuedSize(final Collection<AMQQueue<?>> queues)
     {
         long total = 0;

Modified: qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/virtualhost/HouseKeepingTask.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/virtualhost/HouseKeepingTask.java?rev=1685599&r1=1685598&r2=1685599&view=diff
==============================================================================
--- qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/virtualhost/HouseKeepingTask.java (original)
+++ qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/virtualhost/HouseKeepingTask.java Mon Jun 15 15:43:53 2015
@@ -41,7 +41,7 @@ public abstract class HouseKeepingTask i
     public HouseKeepingTask(VirtualHost vhost)
     {
         _name = vhost.getName() + ":" + this.getClass().getSimpleName();
-        _subject = SecurityManager.getSystemTaskSubject(_name);
+        _subject = SecurityManager.getSystemTaskSubject(_name, vhost.getPrincipal());
     }
 
     final public void run()

Added: qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/virtualhost/VirtualHostPrincipal.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/virtualhost/VirtualHostPrincipal.java?rev=1685599&view=auto
==============================================================================
--- qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/virtualhost/VirtualHostPrincipal.java (added)
+++ qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/virtualhost/VirtualHostPrincipal.java Mon Jun 15 15:43:53 2015
@@ -0,0 +1,67 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.apache.qpid.server.virtualhost;
+
+import java.security.Principal;
+import java.util.Objects;
+
+import org.apache.qpid.server.model.VirtualHost;
+
+public class VirtualHostPrincipal implements Principal
+{
+    private static String VIRTUALHOST_SUBJECT_TEMPLATE = "virtualhost:%s-%s";
+    private final VirtualHost<?,?,?> _virtualHost;
+    private final String _name;
+
+    public VirtualHostPrincipal(VirtualHost<?, ?, ?> virtualHost)
+    {
+        _virtualHost = virtualHost;
+        _name = String.format(VIRTUALHOST_SUBJECT_TEMPLATE, virtualHost.getName(), virtualHost.getId());
+    }
+
+    @Override
+    public String getName()
+    {
+        return _name;
+    }
+
+    @Override
+    public boolean equals(Object o)
+    {
+        if (this == o)
+        {
+            return true;
+        }
+        if (o == null || getClass() != o.getClass())
+        {
+            return false;
+        }
+
+        VirtualHostPrincipal that = (VirtualHostPrincipal) o;
+        return Objects.equals(_virtualHost, that._virtualHost);
+    }
+
+    @Override
+    public int hashCode()
+    {
+        return Objects.hash(_virtualHost);
+    }
+}

Modified: qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/virtualhostnode/RedirectingVirtualHostImpl.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/virtualhostnode/RedirectingVirtualHostImpl.java?rev=1685599&r1=1685598&r2=1685599&view=diff
==============================================================================
--- qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/virtualhostnode/RedirectingVirtualHostImpl.java (original)
+++ qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/virtualhostnode/RedirectingVirtualHostImpl.java Mon Jun 15 15:43:53 2015
@@ -20,6 +20,7 @@
  */
 package org.apache.qpid.server.virtualhostnode;
 
+import java.security.Principal;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
@@ -59,6 +60,7 @@ import org.apache.qpid.server.txn.DtxReg
 import org.apache.qpid.server.virtualhost.ExchangeIsAlternateException;
 import org.apache.qpid.server.virtualhost.HouseKeepingTask;
 import org.apache.qpid.server.virtualhost.RequiredExchangeException;
+import org.apache.qpid.server.virtualhost.VirtualHostPrincipal;
 
 @ManagedObject( category = false, type = RedirectingVirtualHostImpl.TYPE, register = false )
 class RedirectingVirtualHostImpl
@@ -68,6 +70,7 @@ class RedirectingVirtualHostImpl
     public static final String TYPE = "REDIRECTOR";
     private final StatisticsCounter _messagesDelivered, _dataDelivered, _messagesReceived, _dataReceived;
     private final Broker<?> _broker;
+    private final VirtualHostPrincipal _principal;
 
     @ManagedAttributeField
     private boolean _queue_deadLetterQueueEnabled;
@@ -108,6 +111,7 @@ class RedirectingVirtualHostImpl
         _dataDelivered = new StatisticsCounter("bytes-delivered-" + getName());
         _messagesReceived = new StatisticsCounter("messages-received-" + getName());
         _dataReceived = new StatisticsCounter("bytes-received-" + getName());
+        _principal = new VirtualHostPrincipal(this);
         setState(State.UNAVAILABLE);
     }
 
@@ -532,6 +536,11 @@ class RedirectingVirtualHostImpl
         return localAddress;
     }
 
+    @Override
+    public Principal getPrincipal()
+    {
+        return _principal;
+    }
 
     private void throwUnsupportedForRedirector()
     {

Modified: qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/logging/BrokerLoggerTest.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/logging/BrokerLoggerTest.java?rev=1685599&r1=1685598&r2=1685599&view=diff
==============================================================================
--- qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/logging/BrokerLoggerTest.java (original)
+++ qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/logging/BrokerLoggerTest.java Mon Jun 15 15:43:53 2015
@@ -33,6 +33,7 @@ import java.util.Map;
 import ch.qos.logback.classic.Level;
 import ch.qos.logback.classic.spi.ILoggingEvent;
 import ch.qos.logback.core.Appender;
+import ch.qos.logback.core.Context;
 import ch.qos.logback.core.read.ListAppender;
 import org.apache.qpid.server.configuration.updater.TaskExecutor;
 import org.apache.qpid.server.configuration.updater.TaskExecutorImpl;
@@ -78,13 +79,12 @@ public class BrokerLoggerTest extends Qp
         _brokerLogger = new AbstractBrokerLogger(attributes, broker)
         {
             @Override
-            public Appender<ILoggingEvent> asAppender()
+            public Appender<ILoggingEvent> asAppender(Context context)
             {
                 return _loggerAppender;
             }
         };
         _brokerLogger.open();
-        _loggerAppender.addFilter(_brokerLogger.getCompositeFilter());
     }
 
     @Override
@@ -92,14 +92,8 @@ public class BrokerLoggerTest extends Qp
     {
         try
         {
+            _brokerLogger.delete();
             _taskExecutor.stopImmediately();
-
-            ch.qos.logback.classic.Logger rootLogger =
-                    (ch.qos.logback.classic.Logger) LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME);
-
-            _loggerAppender.clearAllFilters();
-
-            rootLogger.detachAppender(_loggerAppender);
         }
         finally
         {
@@ -156,7 +150,8 @@ public class BrokerLoggerTest extends Qp
 
     public void testDeleteLogger()
     {
-        ch.qos.logback.classic.Logger rootLogger = (ch.qos.logback.classic.Logger) LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME);
+        ch.qos.logback.classic.Logger rootLogger =
+                (ch.qos.logback.classic.Logger) LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME);
         assertNotNull("Appender not found when it should have been created", rootLogger.getAppender(_brokerLogger.getName()));
         _brokerLogger.delete();
         assertEquals("Unexpected state after deletion", State.DELETED, _brokerLogger.getState());

Modified: qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/logging/BrokerNameAndLevelFilterTest.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/logging/BrokerNameAndLevelFilterTest.java?rev=1685599&r1=1685598&r2=1685599&view=diff
==============================================================================
--- qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/logging/BrokerNameAndLevelFilterTest.java (original)
+++ qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/logging/BrokerNameAndLevelFilterTest.java Mon Jun 15 15:43:53 2015
@@ -24,15 +24,13 @@ import static org.mockito.Mockito.doRetu
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
-import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashMap;
-import java.util.List;
 import java.util.Map;
 
 import ch.qos.logback.classic.Level;
 import ch.qos.logback.classic.spi.ILoggingEvent;
-import ch.qos.logback.core.read.ListAppender;
+import ch.qos.logback.core.filter.Filter;
 import org.apache.qpid.server.configuration.IllegalConfigurationException;
 import org.apache.qpid.server.configuration.updater.TaskExecutor;
 import org.apache.qpid.server.configuration.updater.TaskExecutorImpl;
@@ -43,24 +41,16 @@ import org.apache.qpid.server.model.Mode
 import org.apache.qpid.server.security.SecurityManager;
 import org.apache.qpid.test.utils.QpidTestCase;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
 public class BrokerNameAndLevelFilterTest extends QpidTestCase
 {
-    private Logger _logger = null;
-    private Logger _nonQpidLogger = null;
-
     private BrokerLogger<?> _brokerLogger;
-    private BrokerNameAndLevelFilter<?> _brokerNameAndLevelFilter;
-    private ListAppender _loggerAppender;
     private TaskExecutor _taskExecutor;
+    private final Broker<?> _broker = mock(Broker.class);
 
     @Override
     public void setUp() throws Exception
     {
         super.setUp();
-        _loggerAppender = new ListAppender();
 
         _taskExecutor =  new TaskExecutorImpl();
         _taskExecutor.start();
@@ -68,54 +58,23 @@ public class BrokerNameAndLevelFilterTes
         Model model = BrokerModel.getInstance();
 
         SecurityManager securityManager = mock(SecurityManager.class);
-        Broker<?> broker = mock(Broker.class);
-        when(broker.getSecurityManager()).thenReturn(securityManager);
-        when(broker.getModel()).thenReturn(model);
-        doReturn(Broker.class).when(broker).getCategoryClass();
+        when(_broker.getSecurityManager()).thenReturn(securityManager);
+        when(_broker.getModel()).thenReturn(model);
+        doReturn(Broker.class).when(_broker).getCategoryClass();
 
         _brokerLogger = mock(BrokerLogger.class);
         when(_brokerLogger.getModel()).thenReturn(model);
         when(_brokerLogger.getChildExecutor()).thenReturn(_taskExecutor);
-        when(_brokerLogger.getParent(Broker.class)).thenReturn(broker);
+        when(_brokerLogger.getParent(Broker.class)).thenReturn(_broker);
         doReturn(BrokerLogger.class).when(_brokerLogger).getCategoryClass();
-
-
-        _logger = LoggerFactory.getLogger("org.apache.qpid.server.test");
-        _nonQpidLogger = LoggerFactory.getLogger("org.apache.qpid.test");
-    }
-
-    private void setUpFilterAndAppender(String loggerName, LogLevel logLevel)
-    {
-        Map<String, Object> attributes = new HashMap<>();
-        attributes.put("loggerName", loggerName);
-        attributes.put("level", logLevel);
-        attributes.put("name", "test");
-
-        _brokerNameAndLevelFilter = new BrokerNameAndLevelFilterImplFactory().createInstance(attributes, _brokerLogger);
-        _brokerNameAndLevelFilter.open();
-        ch.qos.logback.classic.Logger rootLogger =
-                (ch.qos.logback.classic.Logger) LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME);
-        rootLogger.addAppender(_loggerAppender);
-        _loggerAppender.setContext(rootLogger.getLoggerContext());
-        _loggerAppender.addFilter(_brokerNameAndLevelFilter.asFilter());
-        _loggerAppender.addFilter(DenyAllFilter.getInstance());
-    }
+   }
 
     @Override
     public void tearDown() throws Exception
     {
         try
         {
-            _brokerNameAndLevelFilter.close();
             _taskExecutor.stopImmediately();
-
-            ch.qos.logback.classic.Logger rootLogger =
-                    (ch.qos.logback.classic.Logger) LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME);
-
-            _loggerAppender.clearAllFilters();
-
-            _loggerAppender.stop();
-            rootLogger.detachAppender(_loggerAppender);
         }
         finally
         {
@@ -123,85 +82,64 @@ public class BrokerNameAndLevelFilterTes
         }
     }
 
-    public void testSetNameOnWildcardFilter() throws Exception
+
+    public void testAsFilter()
     {
-        setUpFilterAndAppender("org.apache.qpid.server.*", LogLevel.DEBUG);
-        _loggerAppender.start();
-        _logger.debug("Test1");
-        _nonQpidLogger.debug("Test2");
-        _loggerAppender.stop();
+        BrokerNameAndLevelFilter<?> filterObject = createFilter("org.apache.qpid", LogLevel.INFO);
 
-        assertLoggedEvent(true, "Test1", _logger.getName(), Level.DEBUG);
-        assertLoggedEvent(false, "Test2", _nonQpidLogger.getName(), Level.DEBUG);
+        Filter<ILoggingEvent> filter = filterObject.asFilter();
 
-        try
-        {
-            _brokerNameAndLevelFilter.setAttributes(Collections.<String, Object>singletonMap("loggerName", "org.apache.qpid.*"));
-            fail("Changing of logger name is unsupported");
-        }
-        catch (IllegalConfigurationException e)
-        {
-            // pass
-        }
-    }
+        assertTrue("Unexpected filter instance", filter instanceof LoggerNameAndLevelFilter);
 
-    public void testSetLevelOnWildcardFilter() throws Exception
-    {
-        setUpFilterAndAppender("org.apache.qpid.server.*", LogLevel.DEBUG);
-        doChangeLevelTest();
+        LoggerNameAndLevelFilter f = (LoggerNameAndLevelFilter)filter;
+        assertEquals("Unexpected log level", Level.INFO, f.getLevel());
+        assertEquals("Unexpected logger name", "org.apache.qpid", f.getLoggerName());
     }
 
-    public void testSetLevelOnEmptyLogNameFilter() throws Exception
+    public void testLevelChangeAffectsFilter()
     {
-        setUpFilterAndAppender("", LogLevel.DEBUG);
-        doChangeLevelTest();
-    }
+        BrokerNameAndLevelFilter<?> filterObject = createFilter("org.apache.qpid", LogLevel.INFO);
 
-    public void testSetLevelOnNonEmptyAndNonWildCardLogNameFilter() throws Exception
-    {
-        setUpFilterAndAppender(_logger.getName(), LogLevel.DEBUG);
-        doChangeLevelTest();
+        LoggerNameAndLevelFilter filter = (LoggerNameAndLevelFilter)filterObject.asFilter();
+
+        assertEquals("Unexpected log level", Level.INFO, filter.getLevel());
+
+        filterObject.setAttributes(Collections.<String, Object>singletonMap("level", LogLevel.DEBUG));
+        assertEquals("Unexpected log level attribute", Level.DEBUG, filter.getLevel());
     }
 
-    private void doChangeLevelTest()
+    public void testLoggerNameChangeNotAllowed()
     {
-        _loggerAppender.start();
-        _logger.debug("Test1");
-        _loggerAppender.stop();
+        BrokerNameAndLevelFilter<?> filterObject = createFilter("org.apache.qpid", LogLevel.INFO);
 
-        assertLoggedEvent(true, "Test1", _logger.getName(), Level.DEBUG);
+        LoggerNameAndLevelFilter filter = (LoggerNameAndLevelFilter)filterObject.asFilter();
 
-        _brokerNameAndLevelFilter.setAttributes(Collections.<String, Object>singletonMap("level", LogLevel.INFO));
-        assertEquals("Unexpected log level attribute", LogLevel.INFO, _brokerNameAndLevelFilter.getLevel());
+        assertEquals("Unexpected logger name", "org.apache.qpid", filter.getLoggerName());
 
-        _loggerAppender.start();
-        _logger.debug("Test2");
-        _logger.info("Test3");
-        _loggerAppender.stop();
+        try
+        {
+            filterObject.setAttributes(Collections.<String,Object>singletonMap(BrokerNameAndLevelFilter.LOGGER_NAME, "org.apache.qpid.foo"));
+            fail("IllegalConfigurationException is expected to throw on attempt to change logger name");
+        }
+        catch(IllegalConfigurationException e)
+        {
+            // pass
+        }
 
-        assertLoggedEvent(false, "Test2", _logger.getName(), Level.DEBUG);
-        assertLoggedEvent(true, "Test3", _logger.getName(), Level.INFO);
+        assertEquals("Unexpected logger name", "org.apache.qpid", filter.getLoggerName());
     }
 
-    private void assertLoggedEvent(boolean exists, String message, String loggerName, Level level)
+
+    private BrokerNameAndLevelFilter createFilter(String loggerName, LogLevel logLevel)
     {
-        List<ILoggingEvent> events;
-        synchronized(_loggerAppender)
-        {
-            events = new ArrayList<>(_loggerAppender.list);
-        }
+        Map<String, Object> attributes = new HashMap<>();
+        attributes.put("loggerName", loggerName);
+        attributes.put("level", logLevel);
+        attributes.put("name", "test");
 
-        boolean logged = false;
-        for (ILoggingEvent event: events)
-        {
-            if (event.getFormattedMessage().equals(message) && event.getLoggerName().equals(loggerName) && event.getLevel() == level)
-            {
-                logged = true;
-                break;
-            }
-        }
-        assertEquals("Event " + message + " from logger " + loggerName + " of log level " + level
-                + " is " + (exists ? "not" : "") + " found", exists, logged);
+        BrokerNameAndLevelFilter brokerNameAndLevelFilter = new BrokerNameAndLevelFilterImpl(attributes, _brokerLogger);
+        brokerNameAndLevelFilter.open();
+        return brokerNameAndLevelFilter;
     }
 
 }

Modified: qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/logging/CompositeFilterTest.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/logging/CompositeFilterTest.java?rev=1685599&r1=1685598&r2=1685599&view=diff
==============================================================================
--- qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/logging/CompositeFilterTest.java (original)
+++ qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/logging/CompositeFilterTest.java Mon Jun 15 15:43:53 2015
@@ -32,7 +32,6 @@ import java.util.Arrays;
 import ch.qos.logback.classic.spi.ILoggingEvent;
 import ch.qos.logback.core.filter.Filter;
 import ch.qos.logback.core.spi.FilterReply;
-import org.apache.qpid.server.model.BrokerLoggerFilter;
 import org.apache.qpid.test.utils.QpidTestCase;
 
 public class CompositeFilterTest extends QpidTestCase
@@ -48,7 +47,7 @@ public class CompositeFilterTest extends
     {
         CompositeFilter compositeFilter = new CompositeFilter();
 
-        compositeFilter.addFilter(createBrokerFilter(FilterReply.ACCEPT));
+        compositeFilter.addFilter(createFilter(FilterReply.ACCEPT));
 
         FilterReply reply = compositeFilter.decide(mock(ILoggingEvent.class));
         assertEquals("Unexpected reply with ACCEPT filter added", FilterReply.ACCEPT, reply);
@@ -58,7 +57,7 @@ public class CompositeFilterTest extends
     {
         CompositeFilter compositeFilter = new CompositeFilter();
 
-        compositeFilter.addFilter(createBrokerFilter(FilterReply.NEUTRAL));
+        compositeFilter.addFilter(createFilter(FilterReply.NEUTRAL));
 
         FilterReply reply = compositeFilter.decide(mock(ILoggingEvent.class));
         assertEquals("Unexpected reply with NEUTRAL filter added", FilterReply.DENY, reply);
@@ -68,34 +67,34 @@ public class CompositeFilterTest extends
     {
         CompositeFilter compositeFilter = new CompositeFilter();
 
-        BrokerLoggerFilter brokerFilterNeutral = createBrokerFilter(FilterReply.NEUTRAL);
+        LoggerFilter brokerFilterNeutral = createFilter(FilterReply.NEUTRAL);
         compositeFilter.addFilter(brokerFilterNeutral);
 
-        BrokerLoggerFilter brokerFilterDeny = createBrokerFilter(FilterReply.DENY);
+        LoggerFilter brokerFilterDeny = createFilter(FilterReply.DENY);
         compositeFilter.addFilter(brokerFilterDeny);
 
-        BrokerLoggerFilter brokerFilterAccept = createBrokerFilter(FilterReply.ACCEPT);
+        LoggerFilter brokerFilterAccept = createFilter(FilterReply.ACCEPT);
         compositeFilter.addFilter(brokerFilterAccept);
 
         FilterReply reply = compositeFilter.decide(mock(ILoggingEvent.class));
         assertEquals("Unexpected reply", FilterReply.DENY, reply);
 
-        verify(brokerFilterNeutral.asFilter()).decide(any());
-        verify(brokerFilterDeny.asFilter()).decide(any());
-        verify(brokerFilterAccept.asFilter(), never()).decide(any());
+        verify(brokerFilterNeutral.asFilter()).decide(any(ILoggingEvent.class));
+        verify(brokerFilterDeny.asFilter()).decide(any(ILoggingEvent.class));
+        verify(brokerFilterAccept.asFilter(), never()).decide(any(ILoggingEvent.class));
     }
 
     public void testRemoveFilterFromChain()
     {
         CompositeFilter compositeFilter = new CompositeFilter();
 
-        BrokerLoggerFilter brokerFilterNeutral = createBrokerFilter(FilterReply.NEUTRAL, "neutral");
+        LoggerFilter brokerFilterNeutral = createFilter(FilterReply.NEUTRAL, "neutral");
         compositeFilter.addFilter(brokerFilterNeutral);
 
-        BrokerLoggerFilter brokerFilterDeny = createBrokerFilter(FilterReply.DENY, "deny");
+        LoggerFilter brokerFilterDeny = createFilter(FilterReply.DENY, "deny");
         compositeFilter.addFilter(brokerFilterDeny);
 
-        BrokerLoggerFilter brokerFilterAccept = createBrokerFilter(FilterReply.ACCEPT, "accept");
+        LoggerFilter brokerFilterAccept = createFilter(FilterReply.ACCEPT, "accept");
         compositeFilter.addFilter(brokerFilterAccept);
 
         FilterReply reply = compositeFilter.decide(mock(ILoggingEvent.class));
@@ -106,16 +105,16 @@ public class CompositeFilterTest extends
         FilterReply reply2 = compositeFilter.decide(mock(ILoggingEvent.class));
         assertEquals("Unexpected reply", FilterReply.ACCEPT, reply2);
 
-        verify(brokerFilterNeutral.asFilter(), times(2)).decide(any());
-        verify(brokerFilterDeny.asFilter()).decide(any());
-        verify(brokerFilterAccept.asFilter()).decide(any());
+        verify(brokerFilterNeutral.asFilter(), times(2)).decide(any(ILoggingEvent.class));
+        verify(brokerFilterDeny.asFilter()).decide(any(ILoggingEvent.class));
+        verify(brokerFilterAccept.asFilter()).decide(any(ILoggingEvent.class));
     }
 
     public void testAddFilter()
     {
         CompositeFilter compositeFilter = new CompositeFilter();
 
-        BrokerLoggerFilter brokerFilter = createBrokerFilter(FilterReply.ACCEPT, "accept");
+        LoggerFilter brokerFilter = createFilter(FilterReply.ACCEPT, "accept");
         compositeFilter.addFilter(brokerFilter);
 
         verify(brokerFilter.asFilter()).setName("accept");
@@ -125,32 +124,32 @@ public class CompositeFilterTest extends
     {
         CompositeFilter compositeFilter = new CompositeFilter();
 
-        BrokerLoggerFilter brokerFilterNeutral = createBrokerFilter(FilterReply.NEUTRAL, "neutral");
-        BrokerLoggerFilter brokerFilterAccept = createBrokerFilter(FilterReply.ACCEPT, "accept");
-        BrokerLoggerFilter brokerFilterDeny = createBrokerFilter(FilterReply.DENY, "deny");
+        LoggerFilter brokerFilterNeutral = createFilter(FilterReply.NEUTRAL, "neutral");
+        LoggerFilter brokerFilterAccept = createFilter(FilterReply.ACCEPT, "accept");
+        LoggerFilter brokerFilterDeny = createFilter(FilterReply.DENY, "deny");
 
         compositeFilter.addFilters(Arrays.asList(brokerFilterNeutral, brokerFilterAccept, brokerFilterDeny));
 
         FilterReply reply = compositeFilter.decide(mock(ILoggingEvent.class));
         assertEquals("Unexpected reply", FilterReply.ACCEPT, reply);
 
-        verify(brokerFilterNeutral.asFilter()).decide(any());
-        verify(brokerFilterAccept.asFilter()).decide(any());
-        verify(brokerFilterDeny.asFilter(), never()).decide(any());
+        verify(brokerFilterNeutral.asFilter()).decide(any(ILoggingEvent.class));
+        verify(brokerFilterAccept.asFilter()).decide(any(ILoggingEvent.class));
+        verify(brokerFilterDeny.asFilter(), never()).decide(any(ILoggingEvent.class));
     }
 
-    private BrokerLoggerFilter createBrokerFilter(FilterReply decision)
+    private LoggerFilter createFilter(FilterReply decision)
     {
-        return createBrokerFilter(decision, "UNNAMED");
+        return createFilter(decision, "UNNAMED");
     }
 
-    private BrokerLoggerFilter createBrokerFilter(final FilterReply decision, String name)
+    private LoggerFilter createFilter(final FilterReply decision, String name)
     {
-        BrokerLoggerFilter brokerFilter = mock(BrokerLoggerFilter.class);
+        LoggerFilter brokerFilter = mock(LoggerFilter.class);
         when(brokerFilter.getName()).thenReturn(name);
         Filter filter = mock(Filter.class);
         when(filter.getName()).thenReturn(name);
-        when(filter.decide(any())).thenReturn(decision);
+        when(filter.decide(any(ILoggingEvent.class))).thenReturn(decision);
         when(brokerFilter.asFilter()).thenReturn(filter);
         return brokerFilter;
     }

Added: qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/logging/LoggerNameAndLevelFilterTest.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/logging/LoggerNameAndLevelFilterTest.java?rev=1685599&view=auto
==============================================================================
--- qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/logging/LoggerNameAndLevelFilterTest.java (added)
+++ qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/logging/LoggerNameAndLevelFilterTest.java Mon Jun 15 15:43:53 2015
@@ -0,0 +1,116 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.apache.qpid.server.logging;
+
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import ch.qos.logback.classic.Level;
+import ch.qos.logback.classic.Logger;
+import ch.qos.logback.classic.spi.ILoggingEvent;
+import ch.qos.logback.core.spi.FilterReply;
+import org.apache.qpid.test.utils.QpidTestCase;
+
+public class LoggerNameAndLevelFilterTest extends QpidTestCase
+{
+
+    public void testDecideForWildcardLoggerName() throws Exception
+    {
+        LoggerNameAndLevelFilter filter = new LoggerNameAndLevelFilter("org.apache.qpid.server.*", Level.INFO);
+
+        ILoggingEvent event = mock(ILoggingEvent.class);
+        when(event.getLevel()).thenReturn(Level.INFO);
+        when(event.getLoggerName()).thenReturn("org.apache.qpid.server.foo");
+        assertEquals("Unexpected reply for matching logger name and log level", FilterReply.ACCEPT, filter.decide(event));
+
+        when(event.getLoggerName()).thenReturn("org.apache.qpid.foo");
+        assertEquals("Unexpected reply for non matching logger name but matching log level", FilterReply.NEUTRAL, filter.decide(event));
+
+        when(event.getLoggerName()).thenReturn("org.apache.qpid.server.foo");
+        when(event.getLevel()).thenReturn(Level.DEBUG);
+        assertEquals("Unexpected reply for matching logger name but non matching log level", FilterReply.NEUTRAL, filter.decide(event));
+    }
+
+    public void testDecideForEmptyLoggerName() throws Exception
+    {
+        LoggerNameAndLevelFilter filter = new LoggerNameAndLevelFilter("", Level.INFO);
+
+        ILoggingEvent event = mock(ILoggingEvent.class);
+        when(event.getLevel()).thenReturn(Level.INFO);
+        when(event.getLoggerName()).thenReturn("org.apache.qpid.server.foo");
+        assertEquals("Unexpected reply for matching log level and arbitrary logger name", FilterReply.ACCEPT, filter.decide(event));
+
+        when(event.getLoggerName()).thenReturn("org.apache.qpid.foo");
+        assertEquals("Unexpected reply for matching log level and arbitrary logger namel", FilterReply.ACCEPT, filter.decide(event));
+
+        when(event.getLevel()).thenReturn(Level.DEBUG);
+        assertEquals("Unexpected reply for non matching log level", FilterReply.NEUTRAL, filter.decide(event));
+    }
+
+    public void testDecideForRootLoggerName() throws Exception
+    {
+        LoggerNameAndLevelFilter filter = new LoggerNameAndLevelFilter(Logger.ROOT_LOGGER_NAME, Level.INFO);
+
+        ILoggingEvent event = mock(ILoggingEvent.class);
+        when(event.getLevel()).thenReturn(Level.INFO);
+        when(event.getLoggerName()).thenReturn("org.apache.qpid.server.foo");
+        assertEquals("Unexpected reply for matching log level and arbitrary logger name", FilterReply.ACCEPT, filter.decide(event));
+
+        when(event.getLoggerName()).thenReturn("org.apache.qpid.foo");
+        assertEquals("Unexpected reply for matching log level and arbitrary logger name", FilterReply.ACCEPT, filter.decide(event));
+
+        when(event.getLevel()).thenReturn(Level.DEBUG);
+        assertEquals("Unexpected reply for non matching log level", FilterReply.NEUTRAL, filter.decide(event));
+    }
+
+    public void testDecideForNullLoggerName() throws Exception
+    {
+        LoggerNameAndLevelFilter filter = new LoggerNameAndLevelFilter(null, Level.INFO);
+
+        ILoggingEvent event = mock(ILoggingEvent.class);
+        when(event.getLevel()).thenReturn(Level.INFO);
+        when(event.getLoggerName()).thenReturn("org.apache.qpid.server.foo");
+        assertEquals("Unexpected reply for matching log level and arbitrary logger name", FilterReply.ACCEPT, filter.decide(event));
+
+        when(event.getLoggerName()).thenReturn("org.apache.qpid.foo");
+        assertEquals("Unexpected reply for matching log level and arbitrary logger name", FilterReply.ACCEPT, filter.decide(event));
+
+        when(event.getLevel()).thenReturn(Level.DEBUG);
+        assertEquals("Unexpected reply for non matching log level", FilterReply.NEUTRAL, filter.decide(event));
+    }
+
+    public void testDecideForNonWildCardLoggerName() throws Exception
+    {
+        LoggerNameAndLevelFilter filter = new LoggerNameAndLevelFilter("org.apache.qpid", Level.INFO);
+
+        ILoggingEvent event = mock(ILoggingEvent.class);
+        when(event.getLevel()).thenReturn(Level.INFO);
+        when(event.getLoggerName()).thenReturn("org.apache.qpid");
+        assertEquals("Unexpected reply for matching log level and same logger name", FilterReply.ACCEPT, filter.decide(event));
+
+        when(event.getLoggerName()).thenReturn("org.apache.qpid.foo");
+        assertEquals("Unexpected reply for matching log level and not same logger name", FilterReply.NEUTRAL, filter.decide(event));
+
+        when(event.getLevel()).thenReturn(Level.DEBUG);
+        when(event.getLoggerName()).thenReturn("org.apache.qpid");
+        assertEquals("Unexpected reply for non matching log leve and same logger namel", FilterReply.NEUTRAL, filter.decide(event));
+    }
+}

Added: qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/logging/PrincipalLogEventFilterTest.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/logging/PrincipalLogEventFilterTest.java?rev=1685599&view=auto
==============================================================================
--- qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/logging/PrincipalLogEventFilterTest.java (added)
+++ qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/logging/PrincipalLogEventFilterTest.java Mon Jun 15 15:43:53 2015
@@ -0,0 +1,95 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.apache.qpid.server.logging;
+
+import static org.mockito.Mockito.mock;
+
+import java.security.Principal;
+import java.security.PrivilegedAction;
+
+import javax.security.auth.Subject;
+
+import ch.qos.logback.classic.spi.ILoggingEvent;
+import ch.qos.logback.core.spi.FilterReply;
+
+import org.apache.qpid.test.utils.QpidTestCase;
+
+public class PrincipalLogEventFilterTest extends QpidTestCase
+{
+
+    private PrincipalLogEventFilter _principalLogEventFilter;
+    private ILoggingEvent _event = mock(ILoggingEvent.class);
+    private Subject _subject;
+    private Principal _principal;
+
+    @Override
+    protected void setUp() throws Exception
+    {
+        super.setUp();
+        _subject = new Subject();
+        _principal = mock(Principal.class);
+        _principalLogEventFilter = new PrincipalLogEventFilter(_principal);
+    }
+
+    public void testPrincipalMatches()
+    {
+        _subject.getPrincipals().add(_principal);
+
+        FilterReply reply = doFilter();
+
+        assertEquals(FilterReply.NEUTRAL, reply);
+    }
+
+    public void testNoPrincipal()
+    {
+        FilterReply reply = doFilter();
+
+        assertEquals(FilterReply.DENY, reply);
+    }
+
+    public void testWrongPrincipal()
+    {
+        _subject.getPrincipals().add(mock(Principal.class));
+
+        FilterReply reply = doFilter();
+
+        assertEquals(FilterReply.DENY, reply);
+    }
+
+    public void testNoSubject()
+    {
+        _subject.getPrincipals().add(mock(Principal.class));
+
+        assertEquals(FilterReply.DENY, _principalLogEventFilter.decide(_event));
+    }
+
+    private FilterReply doFilter()
+    {
+        return Subject.doAs(_subject, new PrivilegedAction<FilterReply>()
+        {
+            @Override
+            public FilterReply run()
+            {
+                return _principalLogEventFilter.decide(_event);
+            }
+        });
+    }
+}
\ No newline at end of file

Added: qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/logging/RollingFileAppenderFactoryTest.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/logging/RollingFileAppenderFactoryTest.java?rev=1685599&view=auto
==============================================================================
--- qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/logging/RollingFileAppenderFactoryTest.java (added)
+++ qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/logging/RollingFileAppenderFactoryTest.java Mon Jun 15 15:43:53 2015
@@ -0,0 +1,104 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.apache.qpid.server.logging;
+
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import ch.qos.logback.classic.encoder.PatternLayoutEncoder;
+import ch.qos.logback.classic.spi.ILoggingEvent;
+import ch.qos.logback.core.Context;
+import ch.qos.logback.core.encoder.Encoder;
+import ch.qos.logback.core.rolling.RollingFileAppender;
+import ch.qos.logback.core.rolling.RollingPolicy;
+import ch.qos.logback.core.rolling.TimeBasedRollingPolicy;
+import ch.qos.logback.core.rolling.TriggeringPolicy;
+import ch.qos.logback.core.rolling.helper.CompressionMode;
+import org.apache.qpid.test.utils.QpidTestCase;
+
+public class RollingFileAppenderFactoryTest extends QpidTestCase
+{
+    public static final String FILE_NAME = "TEST";
+    public static final String LAYOUT = "%d %-5p [%t] \\(%c{2}\\) - %m%n";
+    public static final String MAX_FILE_SIZE = "100mb";
+    public static final int MAX_HISTORY = 10;
+
+    private RollingFileAppenderFactory _helper;
+    private FileLoggerSettings _settings;
+
+    @Override
+    public void setUp() throws Exception
+    {
+        super.setUp();
+        _helper = new RollingFileAppenderFactory();
+        _settings = mock(FileLoggerSettings.class);
+        when(_settings.getFileName()).thenReturn(FILE_NAME);
+        when(_settings.getLayout()).thenReturn(LAYOUT);
+        when(_settings.getMaxFileSize()).thenReturn(MAX_FILE_SIZE);
+        when(_settings.isCompressOldFiles()).thenReturn(Boolean.TRUE);
+        when(_settings.isRollDaily()).thenReturn(Boolean.TRUE);
+        when(_settings.isRollOnRestart()).thenReturn(Boolean.TRUE);
+        when(_settings.getMaxHistory()).thenReturn(MAX_HISTORY);
+    }
+
+    public void testCreateRollingFileAppenderDailyRolling()
+    {
+        RollingFileAppender<ILoggingEvent> appender = _helper.createRollingFileAppender(_settings, mock(Context.class));
+
+        assertEquals("Unexpected appender file name", FILE_NAME, appender.getFile());
+
+        RollingPolicy rollingPolicy = appender.getRollingPolicy();
+        assertTrue("Unexpected rolling policy", rollingPolicy instanceof TimeBasedRollingPolicy);
+        assertEquals("Unexpected max history", MAX_HISTORY, ((TimeBasedRollingPolicy) rollingPolicy).getMaxHistory());
+        assertEquals("Unexpected file name pattern", FILE_NAME + ".%d{yyyy-MM-dd}.%i.gz", ((TimeBasedRollingPolicy) rollingPolicy).getFileNamePattern());
+        assertEquals("Unexpected compression mode", CompressionMode.GZ, rollingPolicy.getCompressionMode());
+
+        TriggeringPolicy triggeringPolicy = ((TimeBasedRollingPolicy) rollingPolicy).getTimeBasedFileNamingAndTriggeringPolicy();
+        assertTrue("Unexpected triggering policy", triggeringPolicy instanceof RollingFileAppenderFactory.DailyTriggeringPolicy);
+        assertEquals("Unexpected triggering policy", MAX_FILE_SIZE, ((RollingFileAppenderFactory.DailyTriggeringPolicy) triggeringPolicy).getMaxFileSize());
+    }
+
+    public void testCreateRollingFileAppenderNonDailyRolling()
+    {
+        when(_settings.isRollDaily()).thenReturn(Boolean.FALSE);
+        when(_settings.isCompressOldFiles()).thenReturn(Boolean.FALSE);
+
+        RollingFileAppender<ILoggingEvent> appender = _helper.createRollingFileAppender(_settings, mock(Context.class));
+
+        assertEquals("Unexpected appender file name", FILE_NAME, appender.getFile());
+
+        RollingPolicy rollingPolicy = appender.getRollingPolicy();
+        assertTrue("Unexpected rolling policy", rollingPolicy instanceof RollingFileAppenderFactory.SimpleRollingPolicy);
+        assertEquals("Unexpected max history", MAX_HISTORY, ((RollingFileAppenderFactory.SimpleRollingPolicy) rollingPolicy).getMaxIndex());
+        assertEquals("Unexpected file name pattern", FILE_NAME + ".%i", ((RollingFileAppenderFactory.SimpleRollingPolicy) rollingPolicy).getFileNamePattern());
+        assertEquals("Unexpected compression mode", CompressionMode.NONE, rollingPolicy.getCompressionMode());
+
+        TriggeringPolicy triggeringPolicy = appender.getTriggeringPolicy();
+        assertEquals("Unexpected triggering policy", MAX_FILE_SIZE, ((RollingFileAppenderFactory.SizeTriggeringPolicy) triggeringPolicy).getMaxFileSize());
+
+        Encoder encoder = appender.getEncoder();
+        assertTrue("Unexpected encoder", encoder instanceof PatternLayoutEncoder);
+        assertEquals("Unexpected layout pattern", LAYOUT, ((PatternLayoutEncoder)encoder).getPattern());
+
+    }
+
+}

Added: qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/logging/VirtualHostLoggerTest.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/logging/VirtualHostLoggerTest.java?rev=1685599&view=auto
==============================================================================
--- qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/logging/VirtualHostLoggerTest.java (added)
+++ qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/logging/VirtualHostLoggerTest.java Mon Jun 15 15:43:53 2015
@@ -0,0 +1,181 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.apache.qpid.server.logging;
+
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import java.io.File;
+import java.util.HashMap;
+import java.util.Map;
+
+import ch.qos.logback.classic.spi.ILoggingEvent;
+import ch.qos.logback.core.Appender;
+import org.apache.qpid.server.store.DurableConfigurationStore;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.apache.qpid.server.configuration.updater.TaskExecutor;
+import org.apache.qpid.server.configuration.updater.TaskExecutorImpl;
+import org.apache.qpid.server.model.Broker;
+import org.apache.qpid.server.model.BrokerModel;
+import org.apache.qpid.server.model.ConfiguredObject;
+import org.apache.qpid.server.model.Model;
+import org.apache.qpid.server.model.State;
+import org.apache.qpid.server.model.SystemConfig;
+import org.apache.qpid.server.model.VirtualHost;
+import org.apache.qpid.server.model.VirtualHostLogger;
+import org.apache.qpid.server.model.VirtualHostNode;
+import org.apache.qpid.server.security.SecurityManager;
+import org.apache.qpid.server.virtualhost.TestMemoryVirtualHost;
+import org.apache.qpid.test.utils.QpidTestCase;
+
+public class VirtualHostLoggerTest  extends QpidTestCase
+{
+    private VirtualHost<?,?,?> _virtualHost;
+    private TaskExecutor _taskExecutor;
+    private File _logFile;
+
+    @Override
+    public void setUp() throws Exception
+    {
+        super.setUp();
+        _taskExecutor = new TaskExecutorImpl();
+        _taskExecutor.start();
+
+        Model model = BrokerModel.getInstance();
+
+        SecurityManager securityManager = mock(SecurityManager.class);
+        EventLogger eventLogger = mock(EventLogger.class);
+
+        SystemConfig<?> systemConfig = mock(SystemConfig.class);
+        when(systemConfig.getModel()).thenReturn(model);
+        when(systemConfig.getChildExecutor()).thenReturn(_taskExecutor);
+        when(systemConfig.getEventLogger()).thenReturn(eventLogger);
+        doReturn(SystemConfig.class).when(systemConfig).getCategoryClass();
+
+        Broker<?> broker = mock(Broker.class);
+        when(broker.getSecurityManager()).thenReturn(securityManager);
+        when(broker.getModel()).thenReturn(model);
+        when(broker.getChildExecutor()).thenReturn(_taskExecutor);
+        when(broker.getParent(SystemConfig.class)).thenReturn(systemConfig);
+        doReturn(Broker.class).when(broker).getCategoryClass();
+
+        VirtualHostNode<?> node =  mock(VirtualHostNode.class);
+        when(node.getModel()).thenReturn(model);
+        when(node.getChildExecutor()).thenReturn(_taskExecutor);
+        when(node.getParent(Broker.class)).thenReturn(broker);
+        when(node.getConfigurationStore()).thenReturn(mock(DurableConfigurationStore.class));
+        doReturn(VirtualHostNode.class).when(node).getCategoryClass();
+
+        // use real VH object rather then mock in order to test create/start/stop functionality
+        Map<String, Object> attributes = new HashMap<>();
+        attributes.put(VirtualHost.NAME, getName());
+        attributes.put(VirtualHost.TYPE, TestMemoryVirtualHost.VIRTUAL_HOST_TYPE);
+        _virtualHost = new TestMemoryVirtualHost(attributes, node);
+        _virtualHost.open();
+
+        _logFile = new File(TMP_FOLDER, "tmp-virtual-host.log." + System.currentTimeMillis());
+        if (_logFile.exists())
+        {
+            assertTrue(String.format("Log file '%s' is not deleted in setUp", _logFile.getPath()), _logFile.delete());
+        }
+    }
+
+    @Override
+    public void tearDown() throws Exception
+    {
+        try
+        {
+            _virtualHost.close();
+            _taskExecutor.stopImmediately();
+            if (_logFile != null && _logFile.exists())
+            {
+                _logFile.delete();
+            }
+        }
+        finally
+        {
+            super.tearDown();
+        }
+    }
+
+    public void testAddLogger()
+    {
+        VirtualHostLogger logger = createVirtualHostLogger();
+
+        assertTrue("Unexpected logger created " + logger, logger instanceof VirtualHostFileLogger);
+        assertEquals("Unexpected log file", _logFile.getPath(), ((VirtualHostFileLogger<?>) logger).getFileName());
+        assertEquals("Unexpected state on creation", State.ACTIVE, logger.getState());
+
+        Appender<ILoggingEvent> appender = ((ch.qos.logback.classic.Logger) LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME))
+                .getAppender(logger.getName());
+        assertTrue("Appender was not started", appender.isStarted());
+    }
+
+    public void testDeleteLogger()
+    {
+        VirtualHostLogger logger = createVirtualHostLogger();
+        assertEquals("Unexpected state on creation", State.ACTIVE, logger.getState());
+
+        Appender<ILoggingEvent> appender = ((ch.qos.logback.classic.Logger) LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME))
+                .getAppender(logger.getName());
+        assertTrue("Appender is not started", appender.isStarted());
+
+        logger.delete();
+
+        appender = ((ch.qos.logback.classic.Logger) LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME)).getAppender(logger.getName());
+        assertNull("Appender should be detached on logger deletion", appender);
+    }
+
+
+    public void testLoggersRemovedOnVirtualHostStop()
+    {
+        VirtualHostLogger logger = createVirtualHostLogger();
+        _virtualHost.stop();
+
+        Appender<ILoggingEvent> appender = ((ch.qos.logback.classic.Logger) LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME))
+                .getAppender(logger.getName());
+        assertNull("Appender was not deleted", appender);
+    }
+
+    public void testLoggersRemovedOnVirtualHostClose()
+    {
+        VirtualHostLogger logger = createVirtualHostLogger();
+        _virtualHost.close();
+
+        Appender<ILoggingEvent> appender = ((ch.qos.logback.classic.Logger) LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME))
+                .getAppender(logger.getName());
+        assertNull("Appender was not deleted", appender);
+    }
+
+
+    private VirtualHostLogger createVirtualHostLogger()
+    {
+        Map<String, Object> attributes = new HashMap<>();
+        attributes.put(VirtualHostLogger.NAME, getTestName());
+        attributes.put(ConfiguredObject.TYPE, VirtualHostFileLogger.TYPE);
+        attributes.put(VirtualHostFileLogger.FILE_NAME, _logFile.getPath());
+        return _virtualHost.createChild(VirtualHostLogger.class, attributes);
+    }
+
+}

Added: qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/logging/VirtualHostNameAndLevelFilterImplTest.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/logging/VirtualHostNameAndLevelFilterImplTest.java?rev=1685599&view=auto
==============================================================================
--- qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/logging/VirtualHostNameAndLevelFilterImplTest.java (added)
+++ qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/logging/VirtualHostNameAndLevelFilterImplTest.java Mon Jun 15 15:43:53 2015
@@ -0,0 +1,166 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.apache.qpid.server.logging;
+
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+
+import ch.qos.logback.classic.Level;
+import ch.qos.logback.classic.spi.ILoggingEvent;
+import ch.qos.logback.core.filter.Filter;
+
+import org.apache.qpid.server.configuration.IllegalConfigurationException;
+import org.apache.qpid.server.configuration.updater.TaskExecutor;
+import org.apache.qpid.server.configuration.updater.TaskExecutorImpl;
+import org.apache.qpid.server.model.Broker;
+import org.apache.qpid.server.model.BrokerModel;
+import org.apache.qpid.server.model.Model;
+import org.apache.qpid.server.model.SystemConfig;
+import org.apache.qpid.server.model.VirtualHost;
+import org.apache.qpid.server.model.VirtualHostLogger;
+import org.apache.qpid.server.model.VirtualHostNode;
+import org.apache.qpid.server.security.*;
+import org.apache.qpid.server.security.SecurityManager;
+import org.apache.qpid.server.store.DurableConfigurationStore;
+import org.apache.qpid.test.utils.QpidTestCase;
+
+public class VirtualHostNameAndLevelFilterImplTest extends QpidTestCase
+{
+    private VirtualHostLogger _virtualHostLogger;
+    private TaskExecutor _taskExecutor;
+    private final VirtualHost<?,?,?> _virtualhost = mock(VirtualHost.class);
+
+    @Override
+    public void setUp() throws Exception
+    {
+        super.setUp();
+
+        _taskExecutor =  new TaskExecutorImpl();
+        _taskExecutor.start();
+
+        Model model = BrokerModel.getInstance();
+        org.apache.qpid.server.security.SecurityManager securityManager = mock(SecurityManager.class);
+
+        Broker broker = mock(Broker.class);
+        when(broker.getSecurityManager()).thenReturn(securityManager);
+        when(broker.getModel()).thenReturn(model);
+        when(broker.getChildExecutor()).thenReturn(_taskExecutor);
+        doReturn(Broker.class).when(broker).getCategoryClass();
+
+        VirtualHostNode<?> node =  mock(VirtualHostNode.class);
+        when(node.getModel()).thenReturn(model);
+        when(node.getChildExecutor()).thenReturn(_taskExecutor);
+        when(node.getParent(Broker.class)).thenReturn(broker);
+        doReturn(VirtualHostNode.class).when(node).getCategoryClass();
+
+        when(_virtualhost.getModel()).thenReturn(model);
+        when(_virtualhost.getParent(VirtualHostNode.class)).thenReturn(node);
+        doReturn(VirtualHost.class).when(_virtualhost).getCategoryClass();
+
+        _virtualHostLogger = mock(VirtualHostLogger.class);
+        when(_virtualHostLogger.getModel()).thenReturn(model);
+        when(_virtualHostLogger.getChildExecutor()).thenReturn(_taskExecutor);
+        when(_virtualHostLogger.getParent(VirtualHost.class)).thenReturn(_virtualhost);
+        doReturn(VirtualHostLogger.class).when(_virtualHostLogger).getCategoryClass();
+    }
+
+    @Override
+    public void tearDown() throws Exception
+    {
+        try
+        {
+            _taskExecutor.stopImmediately();
+        }
+        finally
+        {
+            super.tearDown();
+        }
+    }
+
+
+    public void testAsFilter()
+    {
+        VirtualHostNameAndLevelFilter<?> filterObject = createFilter("org.apache.qpid", LogLevel.INFO);
+
+        Filter<ILoggingEvent> filter = filterObject.asFilter();
+
+        assertTrue("Unexpected filter instance", filter instanceof LoggerNameAndLevelFilter);
+
+        LoggerNameAndLevelFilter f = (LoggerNameAndLevelFilter)filter;
+        assertEquals("Unexpected log level", Level.INFO, f.getLevel());
+        assertEquals("Unexpected logger name", "org.apache.qpid", f.getLoggerName());
+    }
+
+    public void testLevelChangeAffectsFilter()
+    {
+        VirtualHostNameAndLevelFilter<?> filterObject = createFilter("org.apache.qpid", LogLevel.INFO);
+
+        LoggerNameAndLevelFilter filter = (LoggerNameAndLevelFilter)filterObject.asFilter();
+
+        assertEquals("Unexpected log level", Level.INFO, filter.getLevel());
+
+        filterObject.setAttributes(Collections.<String, Object>singletonMap("level", LogLevel.DEBUG));
+        assertEquals("Unexpected log level attribute", Level.DEBUG, filter.getLevel());
+    }
+
+    public void testLoggerNameChangeNotAllowed()
+    {
+        VirtualHostNameAndLevelFilter<?> filterObject = createFilter("org.apache.qpid", LogLevel.INFO);
+
+        LoggerNameAndLevelFilter filter = (LoggerNameAndLevelFilter)filterObject.asFilter();
+
+        assertEquals("Unexpected logger name", "org.apache.qpid", filter.getLoggerName());
+
+        try
+        {
+            filterObject.setAttributes(Collections.<String,Object>singletonMap(BrokerNameAndLevelFilter.LOGGER_NAME, "org.apache.qpid.foo"));
+            fail("IllegalConfigurationException is expected to throw on attempt to change logger name");
+        }
+        catch(IllegalConfigurationException e)
+        {
+            // pass
+        }
+
+        assertEquals("Unexpected logger name", "org.apache.qpid", filter.getLoggerName());
+    }
+
+
+    private VirtualHostNameAndLevelFilter createFilter(String loggerName, LogLevel logLevel)
+    {
+        Map<String, Object> attributes = new HashMap<>();
+        attributes.put("loggerName", loggerName);
+        attributes.put("level", logLevel);
+        attributes.put("name", "test");
+
+        VirtualHostNameAndLevelFilterImpl nameAndLevelFilter = new VirtualHostNameAndLevelFilterImpl(attributes,
+                                                                                             _virtualHostLogger);
+        nameAndLevelFilter.open();
+        return nameAndLevelFilter;
+    }
+
+
+
+}
\ No newline at end of file

Modified: qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/model/BrokerTest.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/model/BrokerTest.java?rev=1685599&r1=1685598&r2=1685599&view=diff
==============================================================================
--- qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/model/BrokerTest.java (original)
+++ qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/model/BrokerTest.java Mon Jun 15 15:43:53 2015
@@ -72,19 +72,31 @@ public class BrokerTest extends QpidTest
 
     public void testCreateBrokerLogger()
     {
-        Broker broker = _systemConfig.getBroker();
-        Map<String,Object> attributes = new HashMap<>();
         final String brokerLoggerName = "TestBrokerLogger";
-        attributes.put(ConfiguredObject.NAME, brokerLoggerName);
-        attributes.put(ConfiguredObject.TYPE, BrokerMemoryLogger.TYPE);
-
-        BrokerLogger child = (BrokerLogger) broker.createChild(BrokerLogger.class, attributes);
-        assertEquals("Created BrokerLoger has unexcpected name", brokerLoggerName, child.getName());
-        assertTrue("BrokerLogger has unexpected type", child instanceof BrokerMemoryLogger);
-
         ch.qos.logback.classic.Logger rootLogger =
                 (ch.qos.logback.classic.Logger) LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME);
-        Appender appender = rootLogger.getAppender(brokerLoggerName);
-        assertNotNull("Appender not attached to root logger after BrokerLogger creation", appender);
+        try
+        {
+            Broker broker = _systemConfig.getBroker();
+            Map<String, Object> attributes = new HashMap<>();
+            attributes.put(ConfiguredObject.NAME, brokerLoggerName);
+            attributes.put(ConfiguredObject.TYPE, BrokerMemoryLogger.TYPE);
+
+            BrokerLogger child = (BrokerLogger) broker.createChild(BrokerLogger.class, attributes);
+            assertEquals("Created BrokerLoger has unexcpected name", brokerLoggerName, child.getName());
+            assertTrue("BrokerLogger has unexpected type", child instanceof BrokerMemoryLogger);
+
+            Appender appender = rootLogger.getAppender(brokerLoggerName);
+            assertNotNull("Appender not attached to root logger after BrokerLogger creation", appender);
+        }
+        finally
+        {
+            Appender appender = rootLogger.getAppender(brokerLoggerName);
+            if (appender!= null)
+            {
+                appender.stop();
+                rootLogger.detachAppender(appender);
+            }
+        }
     }
 }

Modified: qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/security/SecurityManagerTest.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/security/SecurityManagerTest.java?rev=1685599&r1=1685598&r2=1685599&view=diff
==============================================================================
--- qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/security/SecurityManagerTest.java (original)
+++ qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/security/SecurityManagerTest.java Mon Jun 15 15:43:53 2015
@@ -24,6 +24,7 @@ import static org.apache.qpid.server.sec
 import static org.apache.qpid.server.security.access.Operation.ACCESS_LOGS;
 import static org.mockito.Matchers.any;
 import static org.mockito.Matchers.eq;
+import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
@@ -55,9 +56,10 @@ import org.apache.qpid.server.model.Stat
 import org.apache.qpid.server.model.TrustStore;
 import org.apache.qpid.server.model.User;
 import org.apache.qpid.server.model.VirtualHost;
+import org.apache.qpid.server.model.VirtualHostLogger;
+import org.apache.qpid.server.model.VirtualHostLoggerFilter;
 import org.apache.qpid.server.model.VirtualHostNode;
 import org.apache.qpid.server.protocol.AMQConnectionModel;
-import org.apache.qpid.server.queue.AMQQueue;
 import org.apache.qpid.server.queue.QueueConsumer;
 import org.apache.qpid.server.security.access.ObjectProperties;
 import org.apache.qpid.server.security.access.ObjectProperties.Property;
@@ -92,6 +94,8 @@ public class SecurityManagerTest extends
 
         when(_virtualHost.getName()).thenReturn(TEST_VIRTUAL_HOST);
         when(_virtualHost.getAttribute(VirtualHost.NAME)).thenReturn(TEST_VIRTUAL_HOST);
+        when(_virtualHost.getModel()).thenReturn(BrokerModel.getInstance());
+        doReturn(VirtualHost.class).when(_virtualHost).getCategoryClass();
 
         _broker = mock(Broker.class);
         when(_broker.getAccessControlProviders()).thenReturn(Collections.singleton(aclProvider));
@@ -832,15 +836,64 @@ public class SecurityManagerTest extends
 
     public void testAuthoriseBrokerLoggerFilterOperations()
     {
+        BrokerLogger bl = mock(BrokerLogger.class);
+        when(bl.getAttribute(ConfiguredObject.NAME)).thenReturn("LOGGER");
+        when(bl.getCategoryClass()).thenReturn(BrokerLogger.class);
+        when(bl.getParent(Broker.class)).thenReturn(_broker);
+
         BrokerLoggerFilter mock = mock(BrokerLoggerFilter.class);
         when(mock.getAttribute(ConfiguredObject.NAME)).thenReturn("TEST");
-        when(mock.getCategoryClass()).thenReturn(BrokerLogger.class);
-        when(mock.getParent(Broker.class)).thenReturn(_broker);
-        assertBrokerChildCreateAuthorization(mock);
+        when(mock.getCategoryClass()).thenReturn(BrokerLoggerFilter.class);
+        when(mock.getParent(BrokerLogger.class)).thenReturn(bl);
+        when(mock.getModel()).thenReturn(BrokerModel.getInstance());
+        assertBrokerChildCreateAuthorization(mock, bl);
 
         when(mock.getAttribute(ConfiguredObject.NAME)).thenReturn("test");
-        assertBrokerChildUpdateAuthorization(mock);
-        assertBrokerChildDeleteAuthorization(mock);
+        assertBrokerChildUpdateAuthorization(mock, bl);
+        assertBrokerChildDeleteAuthorization(mock, bl);
+    }
+
+
+    public void testAuthoriseVirtualHostLoggerOperations()
+    {
+        ObjectProperties properties = new ObjectProperties(TEST_VIRTUAL_HOST);
+
+        VirtualHostLogger<?> mock = mock(VirtualHostLogger.class);
+        when(mock.getAttribute(ConfiguredObject.NAME)).thenReturn("TEST");
+        doReturn(VirtualHostLogger.class).when(mock).getCategoryClass();
+        when(mock.getParent(VirtualHost.class)).thenReturn(_virtualHost);
+        when(mock.getModel()).thenReturn(BrokerModel.getInstance());
+
+        assertCreateAuthorization(mock, Operation.CREATE, ObjectType.VIRTUALHOST, properties, _virtualHost);
+
+        when(mock.getAttribute(ConfiguredObject.NAME)).thenReturn("test");
+
+        assertUpdateAuthorization(mock, Operation.UPDATE, ObjectType.VIRTUALHOST, properties, _virtualHost);
+        assertDeleteAuthorization(mock, Operation.DELETE, ObjectType.VIRTUALHOST, properties, _virtualHost);
+    }
+
+    public void testAuthoriseVirtualHostLoggerFilterOperations()
+    {
+        ObjectProperties properties = new ObjectProperties(TEST_VIRTUAL_HOST);
+
+        VirtualHostLogger<?> vhl = mock(VirtualHostLogger.class);
+        when(vhl.getAttribute(ConfiguredObject.NAME)).thenReturn("LOGGER");
+        doReturn(VirtualHostLogger.class).when(vhl).getCategoryClass();
+        when(vhl.getParent(VirtualHost.class)).thenReturn(_virtualHost);
+        when(vhl.getModel()).thenReturn(BrokerModel.getInstance());
+
+        VirtualHostLoggerFilter<?> mock = mock(VirtualHostLoggerFilter.class);
+        when(mock.getAttribute(ConfiguredObject.NAME)).thenReturn("TEST");
+        doReturn(VirtualHostLoggerFilter.class).when(mock).getCategoryClass();
+        when(mock.getParent(VirtualHostLogger.class)).thenReturn(vhl);
+        when(mock.getModel()).thenReturn(BrokerModel.getInstance());
+
+        assertCreateAuthorization(mock, Operation.CREATE, ObjectType.VIRTUALHOST, properties, vhl);
+
+        when(mock.getAttribute(ConfiguredObject.NAME)).thenReturn("test");
+
+        assertUpdateAuthorization(mock, Operation.UPDATE, ObjectType.VIRTUALHOST, properties, vhl);
+        assertDeleteAuthorization(mock, Operation.DELETE, ObjectType.VIRTUALHOST, properties, vhl);
     }
 
     private VirtualHost getMockVirtualHost()
@@ -867,16 +920,26 @@ public class SecurityManagerTest extends
 
     private void assertBrokerChildCreateAuthorization(ConfiguredObject object)
     {
+        assertBrokerChildCreateAuthorization(object, _broker);
+    }
+
+    private void assertBrokerChildCreateAuthorization(ConfiguredObject object, ConfiguredObject parent)
+    {
         String description = String.format("%s %s '%s'",
                 Operation.CREATE.name().toLowerCase(),
                 object.getCategoryClass().getSimpleName().toLowerCase(),
                 "TEST");
         ObjectProperties properties = new OperationLoggingDetails(description);
-        assertCreateAuthorization(object, Operation.CONFIGURE, ObjectType.BROKER, properties, _broker );
+        assertCreateAuthorization(object, Operation.CONFIGURE, ObjectType.BROKER, properties, parent);
     }
 
     private void assertBrokerChildUpdateAuthorization(ConfiguredObject configuredObject)
     {
+        assertBrokerChildUpdateAuthorization(configuredObject, _broker);
+    }
+
+    private void assertBrokerChildUpdateAuthorization(ConfiguredObject configuredObject, ConfiguredObject parent)
+    {
         String description = String.format("%s %s '%s'",
                 Operation.UPDATE.name().toLowerCase(),
                 configuredObject.getCategoryClass().getSimpleName().toLowerCase(),
@@ -884,11 +947,16 @@ public class SecurityManagerTest extends
         ObjectProperties properties = new OperationLoggingDetails(description);
 
         assertUpdateAuthorization(configuredObject, Operation.CONFIGURE, ObjectType.BROKER,
-                properties, _broker );
+                properties, parent);
     }
 
     private void assertBrokerChildDeleteAuthorization(ConfiguredObject configuredObject)
     {
+        assertBrokerChildDeleteAuthorization(configuredObject, _broker);
+    }
+
+    private void assertBrokerChildDeleteAuthorization(ConfiguredObject configuredObject, ConfiguredObject parent)
+    {
         String description = String.format("%s %s '%s'",
                 Operation.DELETE.name().toLowerCase(),
                 configuredObject.getCategoryClass().getSimpleName().toLowerCase(),
@@ -896,7 +964,7 @@ public class SecurityManagerTest extends
         ObjectProperties properties = new OperationLoggingDetails(description);
 
         assertDeleteAuthorization(configuredObject, Operation.CONFIGURE, ObjectType.BROKER,
-                properties, _broker );
+                properties, parent );
     }
 
     private void assertAuthorization(Operation operation, ConfiguredObject<?> configuredObject, Operation aclOperation, ObjectType aclObjectType, ObjectProperties expectedProperties, ConfiguredObject... objects)

Modified: qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/virtualhost/HouseKeepingTaskTest.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/virtualhost/HouseKeepingTaskTest.java?rev=1685599&r1=1685598&r2=1685599&view=diff
==============================================================================
--- qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/virtualhost/HouseKeepingTaskTest.java (original)
+++ qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/virtualhost/HouseKeepingTaskTest.java Mon Jun 15 15:43:53 2015
@@ -37,8 +37,9 @@ public class HouseKeepingTaskTest extend
 
         String expectedThreadNameDuringExecution = vhostName + ":" + "ThreadNameRememberingTask";
 
-        VirtualHost virtualHost = mock(VirtualHost.class);
+        VirtualHostImpl virtualHost = mock(VirtualHostImpl.class);
         when(virtualHost.getName()).thenReturn(vhostName);
+        when(virtualHost.getPrincipal()).thenReturn(mock(VirtualHostPrincipal.class));
         ThreadNameRememberingTask testTask = new ThreadNameRememberingTask(virtualHost);
 
         testTask.run();

Modified: qpid/java/trunk/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/ServerConnection.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/ServerConnection.java?rev=1685599&r1=1685598&r2=1685599&view=diff
==============================================================================
--- qpid/java/trunk/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/ServerConnection.java (original)
+++ qpid/java/trunk/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/ServerConnection.java Mon Jun 15 15:43:53 2015
@@ -245,6 +245,7 @@ public class ServerConnection extends Co
         {
             _messageCompressionThreshold = Integer.MAX_VALUE;
         }
+        _authorizedSubject.getPrincipals().add(_virtualHost.getPrincipal());
     }
 
     @Override

Modified: qpid/java/trunk/broker-plugins/amqp-0-8-protocol/src/main/java/org/apache/qpid/server/protocol/v0_8/AMQProtocolEngine.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-plugins/amqp-0-8-protocol/src/main/java/org/apache/qpid/server/protocol/v0_8/AMQProtocolEngine.java?rev=1685599&r1=1685598&r2=1685599&view=diff
==============================================================================
--- qpid/java/trunk/broker-plugins/amqp-0-8-protocol/src/main/java/org/apache/qpid/server/protocol/v0_8/AMQProtocolEngine.java (original)
+++ qpid/java/trunk/broker-plugins/amqp-0-8-protocol/src/main/java/org/apache/qpid/server/protocol/v0_8/AMQProtocolEngine.java Mon Jun 15 15:43:53 2015
@@ -1066,6 +1066,7 @@ public class AMQProtocolEngine implement
         {
             _messageCompressionThreshold = Integer.MAX_VALUE;
         }
+        _authorizedSubject.getPrincipals().add(virtualHost.getPrincipal());
     }
 
     public void addDeleteTask(Action<? super AMQProtocolEngine> task)

Modified: qpid/java/trunk/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/Connection_1_0.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/Connection_1_0.java?rev=1685599&r1=1685598&r2=1685599&view=diff
==============================================================================
--- qpid/java/trunk/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/Connection_1_0.java (original)
+++ qpid/java/trunk/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/Connection_1_0.java Mon Jun 15 15:43:53 2015
@@ -161,6 +161,7 @@ public class Connection_1_0 implements C
             {
                 setUserPrincipal(user);
             }
+            _subject.getPrincipals().add(_vhost.getPrincipal());
             if(AuthenticatedPrincipal.getOptionalAuthenticatedPrincipalFromSubject(_subject) == null)
             {
                 final Error err = new Error();

Modified: qpid/java/trunk/broker-plugins/amqp-1-0-protocol/src/test/java/org/apache/qpid/server/protocol/v1_0/ProtocolEngine_1_0_0Test.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-plugins/amqp-1-0-protocol/src/test/java/org/apache/qpid/server/protocol/v1_0/ProtocolEngine_1_0_0Test.java?rev=1685599&r1=1685598&r2=1685599&view=diff
==============================================================================
--- qpid/java/trunk/broker-plugins/amqp-1-0-protocol/src/test/java/org/apache/qpid/server/protocol/v1_0/ProtocolEngine_1_0_0Test.java (original)
+++ qpid/java/trunk/broker-plugins/amqp-1-0-protocol/src/test/java/org/apache/qpid/server/protocol/v1_0/ProtocolEngine_1_0_0Test.java Mon Jun 15 15:43:53 2015
@@ -42,6 +42,7 @@ import java.util.UUID;
 import javax.security.auth.Subject;
 import javax.security.sasl.Sasl;
 
+import org.apache.qpid.server.virtualhost.VirtualHostPrincipal;
 import org.mockito.ArgumentCaptor;
 import org.mockito.invocation.InvocationOnMock;
 import org.mockito.stubbing.Answer;
@@ -122,6 +123,7 @@ public class ProtocolEngine_1_0_0Test ex
             }
         }).when(_connectionRegistry).registerConnection(connectionCaptor.capture());
         when(virtualHost.getConnectionRegistry()).thenReturn(_connectionRegistry);
+        when(virtualHost.getPrincipal()).thenReturn(mock(VirtualHostPrincipal.class));
         when(_port.getVirtualHost(anyString())).thenReturn(virtualHost);
         when(_authenticationProvider.getSubjectCreator(anyBoolean())).thenReturn(_subjectCreator);
 

Modified: qpid/java/trunk/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/HttpManagement.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/HttpManagement.java?rev=1685599&r1=1685598&r2=1685599&view=diff
==============================================================================
--- qpid/java/trunk/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/HttpManagement.java (original)
+++ qpid/java/trunk/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/HttpManagement.java Mon Jun 15 15:43:53 2015
@@ -302,7 +302,7 @@ public class HttpManagement extends Abst
         root.addFilter(new FilterHolder(new RedirectingAuthorisationFilter()), "/", EnumSet.of(DispatcherType.REQUEST));
 
         addRestServlet(root, Broker.class);
-        
+
         ServletHolder apiDocsServlet = new ServletHolder(new ApiDocsServlet(getModel(), Collections.<String>emptyList()));
         root.addServlet(apiDocsServlet, "/apidocs");
         root.addServlet(apiDocsServlet, "/apidocs/");



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org