summaryrefslogtreecommitdiff
path: root/qpid/tools/src/java/qpid-qmf2/src/main/java/org/apache/qpid/qmf2/common/SchemaMethod.java
diff options
context:
space:
mode:
Diffstat (limited to 'qpid/tools/src/java/qpid-qmf2/src/main/java/org/apache/qpid/qmf2/common/SchemaMethod.java')
-rw-r--r--qpid/tools/src/java/qpid-qmf2/src/main/java/org/apache/qpid/qmf2/common/SchemaMethod.java275
1 files changed, 275 insertions, 0 deletions
diff --git a/qpid/tools/src/java/qpid-qmf2/src/main/java/org/apache/qpid/qmf2/common/SchemaMethod.java b/qpid/tools/src/java/qpid-qmf2/src/main/java/org/apache/qpid/qmf2/common/SchemaMethod.java
new file mode 100644
index 0000000000..a9f8080fca
--- /dev/null
+++ b/qpid/tools/src/java/qpid-qmf2/src/main/java/org/apache/qpid/qmf2/common/SchemaMethod.java
@@ -0,0 +1,275 @@
+/*
+ *
+ * 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.qmf2.common;
+
+// Misc Imports
+import java.io.UnsupportedEncodingException;
+import java.security.MessageDigest;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * The SchemaMethod class describes a method call's parameter list.
+ * <p>
+ * Note that <a href=https://cwiki.apache.org/confluence/display/qpid/QMFv2+API+Proposal>QMF2 API</a> suggests that
+ * the parameter list is represented by an unordered map of SchemaProperty entries indexed by parameter name,
+ * however is is actually represented in the QMF2 protocol as a "List of SCHEMA_PROPERTY elements that describe
+ * the method's arguments".
+ * <p>
+ * In this implementation getArguments() returns a List<SchemaProperty> reflecting the reality of the protocol
+ * rather than what is suggested by the API documentation.
+ *
+ * @author Fraser Adams
+ */
+public final class SchemaMethod extends QmfData
+{
+ private List<SchemaProperty> _arguments = new ArrayList<SchemaProperty>();
+
+ /**
+ * The main constructor, taking a java.util.Map as a parameter.
+ *
+ * @param m the map used to construct the SchemaMethod.
+ */
+ public SchemaMethod(final Map m)
+ {
+ super(m);
+ if (m != null)
+ {
+ List<Map> mapEncodedArguments = this.<List<Map>>getValue("_arguments");
+ if (mapEncodedArguments != null)
+ { // In theory this shouldn't be null as "_arguments" property of SchemaMethod is not optional but.....
+ for (Map argument : mapEncodedArguments)
+ {
+ addArgument(new SchemaProperty(argument));
+ }
+ }
+ }
+ }
+
+ /**
+ * Construct a SchemaMethod from its name.
+ *
+ * @param name the name of the SchemaMethod.
+ */
+ public SchemaMethod(final String name)
+ {
+ this(name, null);
+ }
+
+ /**
+ * Construct a SchemaMethod from its name and description.
+ *
+ * @param name the name of the SchemaMethod.
+ * @param description a description of the SchemaMethod.
+ */
+ public SchemaMethod(final String name, final String description)
+ {
+ setValue("_name", name);
+
+ if (description != null)
+ {
+ setValue("_desc", description);
+ }
+ }
+
+ /**
+ * Construct a SchemaMethod from a map of "name":<SchemaProperty> entries and description.
+ *
+ * Note this Constructor is the one given in the QMF2 API specification at
+ * <a href=https://cwiki.apache.org/confluence/display/qpid/QMFv2+API+Proposal>QMF2 API</a>Note too that this method does not
+ * set a name so setName() needs to be called explicitly by clients after construction.
+ *
+ * @param args a Map of "name":<SchemaProperty> entries.
+ * @param description a description of the SchemaMethod.
+ */
+ public SchemaMethod(final Map<String, SchemaProperty> args, final String description)
+ {
+ if (description != null)
+ {
+ setValue("_desc", description);
+ }
+
+ for (Map.Entry<String, SchemaProperty> entry : args.entrySet())
+ {
+ addArgument(entry.getKey(), entry.getValue());
+ }
+ }
+
+ /**
+ * Return the method's name.
+ * @return the method's name.
+ */
+ public String getName()
+ {
+ return getStringValue("_name");
+ }
+
+ /**
+ * Sets the method's name.
+ * @param name the method's name.
+ */
+ public void setName(final String name)
+ {
+ setValue("_name", name);
+ }
+
+ /**
+ * Return a description of the method.
+ * @return a description of the method.
+ */
+ public String getDesc()
+ {
+ return getStringValue("_desc");
+ }
+
+ /**
+ * Return the number of arguments for this method.
+ * @return the number of arguments for this method.
+ */
+ public int getArgumentCount()
+ {
+ return getArguments().size();
+ }
+
+ /**
+ * Return the Method's arguments.
+ *<p>
+ * <a href=https://cwiki.apache.org/confluence/display/qpid/QMFv2+API+Proposal>QMF2 API</a> suggests that
+ * the parameter list is represented by an unordered map of SchemaProperty entries indexed by parameter name,
+ * however is is actually represented in the QMF2 protocol as a "List of SCHEMA_PROPERTY elements that describe
+ * the method's arguments". In this implementation getArguments() returns a List<SchemaProperty> reflecting the
+ * reality of the protocol rather than what is suggested by the API documentation.
+ *
+ * @return the Method's arguments.
+ */
+ public List<SchemaProperty> getArguments()
+ {
+ return _arguments;
+ }
+
+ /**
+ * Return the argument with the name "name" as a SchemaProperty.
+ * @param name the name of the SchemaProperty to return.
+ * @return the argument with the name "name" as a SchemaProperty.
+ */
+ public SchemaProperty getArgument(final String name)
+ {
+ for (SchemaProperty p : _arguments)
+ {
+ if (p.getName().equals(name))
+ {
+ return p;
+ }
+ }
+ return null;
+ }
+
+ /**
+ * Return the argument for the index i as a SchemaProperty.
+ * @param i the index of the SchemaProperty to return.
+ * @return the argument for the index i as a SchemaProperty.
+ */
+ public SchemaProperty getArgument(final int i)
+ {
+ return _arguments.get(i);
+ }
+
+ /**
+ * Add a new method argument.
+ *
+ * @param name the name of the SchemaProperty.
+ * @param value the SchemaProperty to add.
+ */
+ public void addArgument(final String name, final SchemaProperty value)
+ {
+ value.setValue("_name", name);
+ _arguments.add(value);
+ }
+
+ /**
+ * Add a new method argument.
+ *
+ * @param value the SchemaProperty to add.
+ */
+ public void addArgument(final SchemaProperty value)
+ {
+ _arguments.add(value);
+ }
+
+ /**
+ * Return the underlying map.
+ *
+ * @return the underlying map.
+ */
+ @Override
+ public Map<String, Object> mapEncode()
+ {
+ List<Map> args = new ArrayList<Map>();
+ for (SchemaProperty p : _arguments)
+ {
+ args.add(p.mapEncode());
+ }
+ setValue("_arguments", args);
+
+ return super.mapEncode();
+ }
+
+ /**
+ * Generate the partial hash for the schema fields in this class.
+ * @param md5 the MessageDigest to be updated.
+ */
+ protected void updateHash(MessageDigest md5)
+ {
+ try
+ {
+ md5.update(getName().getBytes("UTF-8"));
+ md5.update(getDesc().toString().getBytes("UTF-8"));
+ }
+ catch (UnsupportedEncodingException uee)
+ {
+ }
+ for (SchemaProperty p : _arguments)
+ {
+ p.updateHash(md5);
+ }
+ }
+
+ /**
+ * Helper/debug method to list the QMF Object properties and their type.
+ */
+ @Override
+ public void listValues()
+ {
+ System.out.println("SchemaMethod:");
+ System.out.println("_name: " + getName());
+ if (hasValue("_desc")) System.out.println("_desc: " + getDesc());
+ if (getArgumentCount() > 0)
+ {
+ System.out.println("_arguments:");
+ }
+ for (SchemaProperty p : _arguments)
+ {
+ p.listValues();
+ }
+ }
+}
+