Author: rgodfrey
Date: Mon Aug  1 19:35:17 2016
New Revision: 1754791

URL: http://svn.apache.org/viewvc?rev=1754791&view=rev
Log:
QPID-7359 : Add methods to extract config at the Broker and VirtualHost levels

Added:
    
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/ConfigurationExtractor.java
   (with props)
Modified:
    
qpid/java/trunk/bdbstore/src/main/java/org/apache/qpid/server/virtualhost/berkeleydb/BDBHAReplicaVirtualHostImpl.java
    
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/Broker.java
    
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/BrokerImpl.java
    
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/VirtualHost.java
    
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/virtualhost/AbstractVirtualHost.java
    
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/virtualhostnode/RedirectingVirtualHostImpl.java
    
qpid/java/trunk/broker-plugins/access-control/src/main/java/org/apache/qpid/server/security/access/config/LegacyAccessControlAdapter.java

Modified: 
qpid/java/trunk/bdbstore/src/main/java/org/apache/qpid/server/virtualhost/berkeleydb/BDBHAReplicaVirtualHostImpl.java
URL: 
http://svn.apache.org/viewvc/qpid/java/trunk/bdbstore/src/main/java/org/apache/qpid/server/virtualhost/berkeleydb/BDBHAReplicaVirtualHostImpl.java?rev=1754791&r1=1754790&r2=1754791&view=diff
==============================================================================
--- 
qpid/java/trunk/bdbstore/src/main/java/org/apache/qpid/server/virtualhost/berkeleydb/BDBHAReplicaVirtualHostImpl.java
 (original)
+++ 
qpid/java/trunk/bdbstore/src/main/java/org/apache/qpid/server/virtualhost/berkeleydb/BDBHAReplicaVirtualHostImpl.java
 Mon Aug  1 19:35:17 2016
@@ -452,6 +452,12 @@ public class BDBHAReplicaVirtualHostImpl
     }
 
     @Override
+    public Map<String, Object> extractConfig(boolean includeSecureAttributes)
+    {
+        return Collections.emptyMap();
+    }
+
+    @Override
     public List<String> getEnabledConnectionValidators()
     {
         return _enabledConnectionValidators;

Modified: 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/Broker.java
URL: 
http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/Broker.java?rev=1754791&r1=1754790&r2=1754791&view=diff
==============================================================================
--- 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/Broker.java
 (original)
+++ 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/Broker.java
 Mon Aug  1 19:35:17 2016
@@ -23,6 +23,7 @@ package org.apache.qpid.server.model;
 import java.security.Principal;
 import java.util.Collection;
 import java.util.List;
+import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.ScheduledFuture;
 import java.util.concurrent.TimeUnit;
@@ -189,6 +190,12 @@ public interface Broker<X extends Broker
     @ManagedOperation(nonModifying = true, description = "Initiates an orderly 
shutdown of the Broker.")
     void initiateShutdown();
 
+    @ManagedOperation(nonModifying = true, description = "Extract 
configuration")
+    Map<String,Object> extractConfig(@Param(name="includeSecureAttributes",
+                                            description = "include attributes 
that may contain passwords or other"
+                                                          + " confidential 
information",
+                                            defaultValue = "false") boolean 
includeSecureAttributes);
+
     @DerivedAttribute(description = "Maximum heap memory size")
     long getMaximumHeapMemorySize();
 

Modified: 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/BrokerImpl.java
URL: 
http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/BrokerImpl.java?rev=1754791&r1=1754790&r2=1754791&view=diff
==============================================================================
--- 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/BrokerImpl.java
 (original)
+++ 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/BrokerImpl.java
 Mon Aug  1 19:35:17 2016
@@ -381,6 +381,12 @@ public class BrokerImpl extends Abstract
         _parent.closeAsync();
     }
 
+    @Override
+    public Map<String, Object> extractConfig(final boolean 
includeSecureAttributes)
+    {
+        return (new ConfigurationExtractor()).extractConfig(this, 
includeSecureAttributes);
+    }
+
     private void performActivation()
     {
         boolean hasBrokerAnyErroredChildren = false;

Added: 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/ConfigurationExtractor.java
URL: 
http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/ConfigurationExtractor.java?rev=1754791&view=auto
==============================================================================
--- 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/ConfigurationExtractor.java
 (added)
+++ 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/ConfigurationExtractor.java
 Mon Aug  1 19:35:17 2016
@@ -0,0 +1,178 @@
+/*
+ *
+ * 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.model;
+
+import java.lang.reflect.ParameterizedType;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+public class ConfigurationExtractor
+{
+    private static final Set<String> EXCLUDED_ATTRIBUTES = new 
HashSet<>(Arrays.asList(ConfiguredObject.ID,
+                                                                               
        ConfiguredObject.LAST_UPDATED_BY,
+                                                                               
        ConfiguredObject.LAST_UPDATED_TIME,
+                                                                               
        ConfiguredObject.CREATED_BY,
+                                                                               
        ConfiguredObject.CREATED_TIME));
+
+    public Map<String,Object> extractConfig(ConfiguredObject<?> object, final 
boolean includeSecure)
+    {
+        Map<String, Object> results = new LinkedHashMap<>();
+
+        Map<String, ConfiguredObjectAttribute<?,?>> attributeDefinitions = new 
HashMap<>();
+        final Model model = object.getModel();
+        final ConfiguredObjectTypeRegistry typeRegistry = 
model.getTypeRegistry();
+
+        for(ConfiguredObjectAttribute<?, ?> attributeDefinition : 
typeRegistry.getAttributes(object.getClass()))
+        {
+            attributeDefinitions.put(attributeDefinition.getName(), 
attributeDefinition);
+        }
+
+
+        for(Map.Entry<String, Object> attr : 
object.getActualAttributes().entrySet())
+        {
+            if(!EXCLUDED_ATTRIBUTES.contains(attr.getKey()))
+            {
+                final ConfiguredObjectAttribute attributeDefinition = 
attributeDefinitions.get(attr.getKey());
+                if 
(attributeDefinition.isSecureValue(attributeDefinition.getValue(object)))
+                {
+                    if(includeSecure)
+                    {
+                        if(attributeDefinition.isSecure() && 
object.hasEncrypter())
+                        {
+                            results.put(attr.getKey(), 
attributeDefinition.getValue(object));
+                        }
+                        else
+                        {
+                            results.put(attr.getKey(), attr.getValue());
+                        }
+                    }
+                    else
+                    {
+                        results.put(attr.getKey(), 
AbstractConfiguredObject.SECURED_STRING_VALUE);
+                    }
+                }
+                else
+                {
+                    if 
(ConfiguredObject.class.isAssignableFrom(attributeDefinition.getType()))
+                    {
+                        ConfiguredObject<?> obj = (ConfiguredObject<?>) 
attributeDefinition.getValue(object);
+                        if (!(attr.getValue() instanceof String) || 
obj.getId().toString().equals(attr.getValue()))
+                        {
+                            results.put(attr.getKey(), obj.getName());
+                        }
+                        else
+                        {
+                            results.put(attr.getKey(), attr.getValue());
+                        }
+                    }
+                    else if 
(Collection.class.isAssignableFrom(attributeDefinition.getType())
+                             && (attr.getValue() instanceof Collection)
+                             && attributeDefinition.getGenericType() 
instanceof ParameterizedType
+                             && ((ParameterizedType) 
attributeDefinition.getGenericType()).getActualTypeArguments().length
+                                == 1
+                             && 
ConfiguredObject.class.isAssignableFrom((Class) ((ParameterizedType) 
attributeDefinition
+                            .getGenericType()).getActualTypeArguments()[0])
+                            )
+                    {
+                        List<Object> listResults = new ArrayList<>();
+                        Collection<? extends ConfiguredObject> values =
+                                (Collection<? extends ConfiguredObject>) 
attributeDefinition.getValue(object);
+
+                        Iterator<? extends ConfiguredObject> valuesIter = 
values.iterator();
+                        for (Object attrValue : (Collection) attr.getValue())
+                        {
+                            ConfiguredObject obj = valuesIter.next();
+                            if (!(attrValue instanceof String) || 
obj.getId().toString().equals(attrValue))
+                            {
+                                listResults.add(obj.getName());
+                            }
+                            else
+                            {
+                                listResults.add(attrValue);
+                            }
+                        }
+
+
+                        results.put(attr.getKey(), listResults);
+                    }
+                    else
+                    {
+                        results.put(attr.getKey(), attr.getValue());
+                    }
+
+                }
+            }
+        }
+        Collection<Class<? extends ConfiguredObject>> parentTypes = 
model.getParentTypes(object.getCategoryClass());
+        if(parentTypes.size() > 1)
+        {
+            Iterator<Class<? extends ConfiguredObject>>
+                    parentClassIter = parentTypes.iterator();
+
+            for(int i = 1; i < parentTypes.size(); i++)
+            {
+                Class<? extends ConfiguredObject> parentClass = 
parentClassIter.next();
+                ConfiguredObject parent = object.getParent(parentClass);
+                if(parent != null)
+                {
+                    results.put(parentClass.getSimpleName().toLowerCase(), 
parent.getName());
+                }
+            }
+        }
+        
if(!(object.getCategoryClass().getAnnotation(ManagedObject.class).managesChildren()
 ||object.getTypeClass().getAnnotation(ManagedObject.class).managesChildren()))
+        {
+            for (Class<? extends ConfiguredObject> childClass : model
+                    .getChildTypes(object.getCategoryClass()))
+            {
+                ArrayList<Class<? extends ConfiguredObject>> parentClasses =
+                        new ArrayList<>(model.getParentTypes(childClass));
+                
if(parentClasses.get(parentClasses.size()-1).equals(object.getCategoryClass()))
+                {
+                    List<Map<String,Object>> children = new ArrayList<>();
+                    for(ConfiguredObject child : 
object.getChildren(childClass))
+                    {
+                        if(child.isDurable())
+                        {
+                            children.add(extractConfig(child, includeSecure));
+                        }
+                    }
+                    if(!children.isEmpty())
+                    {
+                        String singularName = 
childClass.getSimpleName().toLowerCase();
+                        String attrName = singularName + 
(singularName.endsWith("s") ? "es" : "s");
+                        results.put(attrName, children);
+                    }
+                }
+            }
+        }
+
+
+        return results;
+    }
+}

Propchange: 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/ConfigurationExtractor.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/VirtualHost.java
URL: 
http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/VirtualHost.java?rev=1754791&r1=1754790&r2=1754791&view=diff
==============================================================================
--- 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/VirtualHost.java
 (original)
+++ 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/VirtualHost.java
 Mon Aug  1 19:35:17 2016
@@ -26,6 +26,7 @@ import java.security.AccessControlContex
 import java.security.Principal;
 import java.util.Collection;
 import java.util.List;
+import java.util.Map;
 import java.util.UUID;
 import java.util.concurrent.ScheduledFuture;
 
@@ -197,6 +198,12 @@ public interface VirtualHost<X extends V
     @ManagedOperation
     int publishMessage(@Param(name = "message")ManageableMessage message);
 
+    @ManagedOperation(nonModifying = true, description = "Extract 
configuration")
+    Map<String,Object> extractConfig(@Param(name="includeSecureAttributes",
+                                            description = "include attributes 
that may contain passwords or other "
+                                                          + "confidential 
information",
+                                            defaultValue = "false") boolean 
includeSecureAttributes);
+
     void start();
 
     void stop();

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=1754791&r1=1754790&r2=1754791&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 Aug  1 19:35:17 2016
@@ -813,6 +813,12 @@ public abstract class AbstractVirtualHos
     }
 
     @Override
+    public Map<String, Object> extractConfig(boolean includeSecureAttributes)
+    {
+        return (new ConfigurationExtractor()).extractConfig(this, 
includeSecureAttributes);
+    }
+
+    @Override
     public boolean authoriseCreateConnection(final AMQPConnection<?> 
connection)
     {
         authorise(Operation.ACTION("connect"));

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=1754791&r1=1754790&r2=1754791&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 Aug  1 19:35:17 2016
@@ -311,6 +311,12 @@ class RedirectingVirtualHostImpl
     }
 
     @Override
+    public Map<String, Object> extractConfig(boolean includeSecureAttributes)
+    {
+        return Collections.emptyMap();
+    }
+
+    @Override
     public int publishMessage(final ManageableMessage message)
     {
         throwUnsupportedForRedirector();

Modified: 
qpid/java/trunk/broker-plugins/access-control/src/main/java/org/apache/qpid/server/security/access/config/LegacyAccessControlAdapter.java
URL: 
http://svn.apache.org/viewvc/qpid/java/trunk/broker-plugins/access-control/src/main/java/org/apache/qpid/server/security/access/config/LegacyAccessControlAdapter.java?rev=1754791&r1=1754790&r2=1754791&view=diff
==============================================================================
--- 
qpid/java/trunk/broker-plugins/access-control/src/main/java/org/apache/qpid/server/security/access/config/LegacyAccessControlAdapter.java
 (original)
+++ 
qpid/java/trunk/broker-plugins/access-control/src/main/java/org/apache/qpid/server/security/access/config/LegacyAccessControlAdapter.java
 Mon Aug  1 19:35:17 2016
@@ -68,7 +68,8 @@ class LegacyAccessControlAdapter
                                                                     "dumpHeap",
                                                                     
"performGC",
                                                                     
"getThreadStackTraces",
-                                                                    
"findThreadStackTraces")));
+                                                                    
"findThreadStackTraces",
+                                                                    
"extractConfig")));
 
     private final LegacyAccessControl _accessControl;
     private final Model _model;



---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to