summaryrefslogtreecommitdiff
path: root/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredObjectFactory.java
diff options
context:
space:
mode:
Diffstat (limited to 'qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredObjectFactory.java')
-rw-r--r--qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredObjectFactory.java141
1 files changed, 141 insertions, 0 deletions
diff --git a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredObjectFactory.java b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredObjectFactory.java
new file mode 100644
index 0000000000..2389fc742f
--- /dev/null
+++ b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredObjectFactory.java
@@ -0,0 +1,141 @@
+/*
+ *
+ * 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 org.apache.qpid.server.plugin.ConfiguredObjectTypeFactory;
+import org.apache.qpid.server.plugin.QpidServiceLoader;
+import org.apache.qpid.server.store.ConfiguredObjectRecord;
+import org.apache.qpid.server.store.UnresolvedConfiguredObject;
+import org.apache.qpid.server.util.ServerScopedRuntimeException;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+
+public class ConfiguredObjectFactory
+{
+ private final Map<String, String> _defaultTypes = new HashMap<String, String>();
+ private final Map<String, Map<String, ConfiguredObjectTypeFactory>> _allFactories =
+ new HashMap<String, Map<String, ConfiguredObjectTypeFactory>>();
+ private final Map<String, Collection<String>> _supportedTypes = new HashMap<String, Collection<String>>();
+
+ public ConfiguredObjectFactory()
+ {
+ QpidServiceLoader<ConfiguredObjectTypeFactory> serviceLoader = new QpidServiceLoader<ConfiguredObjectTypeFactory>();
+ Iterable<ConfiguredObjectTypeFactory> allFactories = serviceLoader.instancesOf(ConfiguredObjectTypeFactory.class);
+ for(ConfiguredObjectTypeFactory factory : allFactories)
+ {
+ final Class<? extends ConfiguredObject> categoryClass = factory.getCategoryClass();
+ final String categoryName = categoryClass.getSimpleName();
+
+ Map<String, ConfiguredObjectTypeFactory> categoryFactories = _allFactories.get(categoryName);
+ if(categoryFactories == null)
+ {
+ categoryFactories = new HashMap<String, ConfiguredObjectTypeFactory>();
+ _allFactories.put(categoryName, categoryFactories);
+ _supportedTypes.put(categoryName, new ArrayList<String>());
+ ManagedObject annotation = categoryClass.getAnnotation(ManagedObject.class);
+ if(annotation != null && !"".equals(annotation.defaultType()))
+ {
+ _defaultTypes.put(categoryName, annotation.defaultType());
+ }
+
+ }
+ if(categoryFactories.put(factory.getType(),factory) != null)
+ {
+ throw new ServerScopedRuntimeException("Misconfiguration - there is more than one factory defined for class " + categoryName
+ + " with type " + factory.getType());
+ }
+ if(factory.getType() != null)
+ {
+ _supportedTypes.get(categoryName).add(factory.getType());
+ }
+ }
+ }
+
+ public <X extends ConfiguredObject<X>> UnresolvedConfiguredObject<X> recover(ConfiguredObjectRecord record,
+ ConfiguredObject<?>... parents)
+ {
+ String category = record.getType();
+
+
+ String type = (String) record.getAttributes().get(ConfiguredObject.TYPE);
+
+ ConfiguredObjectTypeFactory factory = getConfiguredObjectTypeFactory(category, type);
+
+ if(factory == null)
+ {
+ throw new ServerScopedRuntimeException("No factory defined for ConfiguredObject of category " + category + " and type " + type);
+ }
+
+ return factory.recover(record, parents);
+ }
+
+ public <X extends ConfiguredObject<X>> ConfiguredObjectTypeFactory<X> getConfiguredObjectTypeFactory(final Class<X> categoryClass, Map<String,Object> attributes)
+ {
+ final String category = categoryClass.getSimpleName();
+ Map<String, ConfiguredObjectTypeFactory> categoryFactories = _allFactories.get(category);
+ if(categoryFactories == null)
+ {
+ throw new ServerScopedRuntimeException("No factory defined for ConfiguredObject of category " + category);
+ }
+ String type = (String) attributes.get(ConfiguredObject.TYPE);
+
+ ConfiguredObjectTypeFactory factory;
+
+ if(type != null)
+ {
+ factory = getConfiguredObjectTypeFactory(category, type);
+ }
+ else
+ {
+ factory = getConfiguredObjectTypeFactory(category, null);
+ if(factory == null)
+ {
+ ManagedObject annotation = categoryClass.getAnnotation(ManagedObject.class);
+ factory = getConfiguredObjectTypeFactory(category, annotation.defaultType());
+ }
+ }
+ return factory;
+ }
+
+ public ConfiguredObjectTypeFactory getConfiguredObjectTypeFactory(final String category, final String type)
+ {
+ Map<String, ConfiguredObjectTypeFactory> categoryFactories = _allFactories.get(category);
+ if(categoryFactories == null)
+ {
+ throw new ServerScopedRuntimeException("No factory defined for ConfiguredObject of category " + category);
+ }
+ ConfiguredObjectTypeFactory factory = categoryFactories.get(type);
+ if(factory == null)
+ {
+ factory = categoryFactories.get(_defaultTypes.get(category));
+ }
+ return factory;
+ }
+
+ public Collection<String> getSupportedTypes(Class<? extends ConfiguredObject> category)
+ {
+ return Collections.unmodifiableCollection(_supportedTypes.get(category.getSimpleName()));
+ }
+}