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]