Search in sources :

Example 6 with ObjectId

use of org.apache.qpid.qmf2.common.ObjectId in project qpid by apache.

the class QmfConsoleData method initialise.

/**
 * Sets the state of the QmfConsoleData, used as an assignment operator.
 *
 * @param m the Map used to initialise the QmfConsoleData
 */
@SuppressWarnings("unchecked")
public void initialise(final Map m) {
    Map<String, Object> values = (Map<String, Object>) m.get("_values");
    _values = (values == null) ? m : values;
    Map<String, String> subtypes = (Map<String, String>) m.get("_subtypes");
    _subtypes = subtypes;
    setSchemaClassId(new SchemaClassId((Map) m.get("_schema_id")));
    setObjectId(new ObjectId((Map) m.get("_object_id")));
    long currentTime = System.currentTimeMillis() * 1000000l;
    _updateTimestamp = m.containsKey("_update_ts") ? getLong(m.get("_update_ts")) : currentTime;
    _createTimestamp = m.containsKey("_create_ts") ? getLong(m.get("_create_ts")) : currentTime;
    _deleteTimestamp = m.containsKey("_delete_ts") ? getLong(m.get("_delete_ts")) : currentTime;
}
Also used : ObjectId(org.apache.qpid.qmf2.common.ObjectId) Map(java.util.Map) HashMap(java.util.HashMap) SchemaClassId(org.apache.qpid.qmf2.common.SchemaClassId)

Example 7 with ObjectId

use of org.apache.qpid.qmf2.common.ObjectId in project qpid by apache.

the class QmfManagementAgent method onEvent.

// ******************************* QmfEventListener implementation method *******************************
/**
 * Callback method triggered when the underlying QMF2 Agent has WorkItems available for processing.
 * The purpose of this method is mainly to handle the METHOD_CALL WorkItem and demultiplex &amp; delegate
 * to the invokeMethod() call on the relevant concrete QmfAgentData Object.
 * @param wi the WorkItem that has been passed by the QMF2 Agent to be processed here (mainly METHOD_CALL).
 */
@Override
public void onEvent(final WorkItem wi) {
    if (wi.getType() == METHOD_CALL) {
        MethodCallWorkItem item = (MethodCallWorkItem) wi;
        MethodCallParams methodCallParams = item.getMethodCallParams();
        String methodName = methodCallParams.getName();
        ObjectId objectId = methodCallParams.getObjectId();
        // Look up QmfAgentData by ObjectId from the Agent's internal Object store.
        QmfAgentData object = _agent.getObject(objectId);
        if (object == null) {
            _agent.raiseException(item.getHandle(), "No object found with ID=" + objectId);
        } else {
            // other classes yet.
            if (object instanceof org.apache.qpid.server.qmf2.agentdata.Broker) {
                org.apache.qpid.server.qmf2.agentdata.Broker broker = (org.apache.qpid.server.qmf2.agentdata.Broker) object;
                broker.invokeMethod(_agent, item.getHandle(), methodName, methodCallParams.getArgs());
            } else if (object instanceof org.apache.qpid.server.qmf2.agentdata.Queue) {
                org.apache.qpid.server.qmf2.agentdata.Queue queue = (org.apache.qpid.server.qmf2.agentdata.Queue) object;
                queue.invokeMethod(_agent, item.getHandle(), methodName, methodCallParams.getArgs());
            } else {
                _agent.raiseException(item.getHandle(), "Unknown Method " + methodName + " on " + object.getClass().getSimpleName());
            }
        }
    }
}
Also used : MethodCallWorkItem(org.apache.qpid.qmf2.agent.MethodCallWorkItem) Broker(org.apache.qpid.server.model.Broker) ObjectId(org.apache.qpid.qmf2.common.ObjectId) MethodCallParams(org.apache.qpid.qmf2.agent.MethodCallParams) QmfAgentData(org.apache.qpid.qmf2.agent.QmfAgentData) Queue(org.apache.qpid.server.model.Queue)

Example 8 with ObjectId

use of org.apache.qpid.qmf2.common.ObjectId in project qpid by apache.

the class JSON method fromQmfData.

/**
 * Serialise a QmfData Object to JSON. If the Object is a QmfConsoleData we serialise the ObjectId as a String
 * which is the same encoding used for the various "ref" properies in fromObject().
 * @param data the QmfData that we wish to serialise to JSON.
 * @return the JSON String encoding.
 */
public static final String fromQmfData(final QmfData data) {
    String consoleDataInfo = "";
    if (data instanceof QmfConsoleData) {
        QmfConsoleData consoleData = (QmfConsoleData) data;
        SchemaClassId sid = consoleData.getSchemaClassId();
        long[] ts = consoleData.getTimestamps();
        String objectId = "\"_object_id\":\"" + consoleData.getObjectId().toString() + "\",";
        String schemaId = "\"_schema_id\":{" + "\"_package_name\":\"" + sid.getPackageName() + "\",\"_class_name\":\"" + sid.getClassName() + "\",\"_type\":\"" + sid.getType() + "\",\"_hash\":\"" + sid.getHashString() + "\"},";
        String timestamps = "\"_update_ts\":" + ts[0] + "," + "\"_create_ts\":" + ts[1] + "," + "\"_delete_ts\":" + ts[2] + ",";
        consoleDataInfo = objectId + schemaId + timestamps;
    }
    return "{" + consoleDataInfo + encodeMapContents(data.mapEncode()) + "}";
}
Also used : QmfConsoleData(org.apache.qpid.qmf2.console.QmfConsoleData) SchemaClassId(org.apache.qpid.qmf2.common.SchemaClassId)

Example 9 with ObjectId

use of org.apache.qpid.qmf2.common.ObjectId in project qpid by apache.

the class QpidServer method doGet.

/**
 * Called by the Web Server to allow a Server to handle a GET request.
 * The HTTP GET URL structure for the REST API is specified above in the overall class documentation.
 *
 * @param tx the HttpTransaction containing the request from the client and used to send the response.
 */
public void doGet(final HttpTransaction tx) throws IOException {
    String path = tx.getRequestURI();
    if (path.startsWith("/qpid/connection/")) {
        path = path.substring(17);
        // Using the principal lets different users use the default connection.
        String user = tx.getPrincipal();
        if (path.length() == 0) {
            // handle "/qpid/connection/" request with unspecified connection (returns list of available connections).
            tx.sendResponse(HTTP_OK, "application/json", JSON.fromObject(_connections.getAll(user)));
        } else {
            // if path.length() > 0 we're dealing with a specified Connection so extract the name and look it up.
            String connectionName = path;
            int i = path.indexOf("/");
            if (// Can use > rather than >= as we've already tested for "/qpid/connection/" above.
            i > 0) {
                connectionName = path.substring(0, i);
                path = path.substring(i + 1);
            } else {
                path = "";
            }
            connectionName = user + "." + connectionName;
            // attempts to connect to a broker specified in the QpidRestAPI config (or default 0.0.0.0:5672).
            if (connectionName.equals(user + ".default")) {
                ConnectionProxy defaultConnection = _connections.get(connectionName);
                if (defaultConnection == null) {
                    defaultConnection = _connections.create(connectionName, _defaultBroker, "", false);
                    // Wait a maximum of 1000ms for the underlying Qpid Connection to become available. If we
                    // don't do this the first call using the default will return 404 Not Found.
                    defaultConnection.waitForConnection(1000);
                }
            }
            // Find the Connection with the name extracted from the URI.
            ConnectionProxy connection = _connections.get(connectionName);
            if (connection == null) {
                tx.sendResponse(HTTP_NOT_FOUND, "text/plain", "404 Not Found.");
            } else if (!connection.isConnected()) {
                tx.sendResponse(HTTP_INTERNAL_ERROR, "text/plain", "500 Broker Disconnected.");
            } else {
                if (path.length() == 0) {
                    // handle request for information about a specified Console
                    tx.sendResponse(HTTP_OK, "application/json", connection.toString());
                } else {
                    // In this block we are dealing with resources associated with a specified connectionName.
                    // path describes the resources specifically related to "/qpid/connection/<connectionName>"
                    Console console = connection.getConsole();
                    if (path.startsWith("console/objects/")) {
                        // Get information about specified objects.
                        path = path.substring(16);
                        sendGetObjectsResponse(tx, console, path);
                    } else if (path.startsWith("console/objects") && path.length() == 15) {
                        // If objects is unspecified treat as a synonym for classes.
                        tx.sendResponse(HTTP_OK, "application/json", JSON.fromObject(console.getClasses()));
                    } else if (path.startsWith("console/address/")) {
                        // Get the Console AMQP Address
                        tx.sendResponse(HTTP_OK, "application/json", JSON.fromObject(console.getAddress()));
                    } else if (path.startsWith("console/address") && path.length() == 15) {
                        // Get the Console AMQP Address
                        tx.sendResponse(HTTP_OK, "application/json", JSON.fromObject(console.getAddress()));
                    } else if (path.startsWith("console/workItemCount/")) {
                        // Returns the count of pending WorkItems that can be retrieved.
                        tx.sendResponse(HTTP_OK, "text/plain", "" + console.getWorkitemCount());
                    } else if (path.startsWith("console/workItemCount") && path.length() == 21) {
                        // Returns the count of pending WorkItems that can be retrieved.
                        tx.sendResponse(HTTP_OK, "text/plain", "" + console.getWorkitemCount());
                    } else if (path.startsWith("console/nextWorkItem/")) {
                        // Obtains the next pending work item, or null if none available.
                        tx.sendResponse(HTTP_OK, "application/json", JSON.fromObject(console.getNextWorkitem()));
                    } else if (path.startsWith("console/nextWorkItem") && path.length() == 20) {
                        // Obtains the next pending work item, or null if none available.
                        tx.sendResponse(HTTP_OK, "application/json", JSON.fromObject(console.getNextWorkitem()));
                    } else if (path.startsWith("console/agents") && path.length() == 14) {
                        // Get information about all available Agents.
                        tx.sendResponse(HTTP_OK, "application/json", JSON.fromObject(console.getAgents()));
                    } else if (path.startsWith("console/agent/")) {
                        // Get information about a specified Agent.
                        Agent agent = console.getAgent(path.substring(14));
                        if (agent == null) {
                            tx.sendResponse(HTTP_NOT_FOUND, "text/plain", "404 Not Found.");
                        } else {
                            tx.sendResponse(HTTP_OK, "application/json", JSON.fromObject(agent));
                        }
                    } else if (path.startsWith("console/agent") && path.length() == 13) {
                        // If agent is unspecified treat as a synonym for agents.
                        tx.sendResponse(HTTP_OK, "application/json", JSON.fromObject(console.getAgents()));
                    } else if (path.startsWith("console/classes/")) {
                        // Get information about the classes for a specified Agent
                        // Get Agent name
                        path = path.substring(16);
                        // TODO handle getClasses() for specified Agent
                        tx.sendResponse(HTTP_NOT_IMPLEMENTED, "text/plain", "501 getClasses() for specified Agent not yet implemented.");
                    } else if (path.startsWith("console/classes") && path.length() == 15) {
                        // Get information about all the classes for all Agents
                        tx.sendResponse(HTTP_OK, "application/json", JSON.fromObject(console.getClasses()));
                    } else if (path.startsWith("console/packages/")) {
                        // Get information about the packages for a specified Agent
                        // Get Agent name
                        path = path.substring(17);
                        // TODO handle getPackages() for specified Agent.
                        tx.sendResponse(HTTP_NOT_IMPLEMENTED, "text/plain", "501 getPackages() for specified Agent not yet implemented.");
                    } else if (path.startsWith("object/")) {
                        /**
                         * This is the REST implementation of getObjects(oid) it is also the equivalent of
                         * the QmfConsoleData refresh() method where an object can update its state.
                         * N.B. that the ManagementAgent on the broker appears not to set the timestamp properties
                         * in the response to this call, which means that they get set to current time in the
                         * QmfConsoleData, this is OK for _update_ts but not for _create_ts and _delete_ts
                         * users of this call should be aware of that in their own code.
                         */
                        path = path.substring(7);
                        // The ObjectId has been passed in the URI, create a real ObjectId
                        ObjectId oid = new ObjectId(path);
                        List<QmfConsoleData> objects = console.getObjects(oid);
                        if (objects.size() == 0) {
                            tx.sendResponse(HTTP_NOT_FOUND, "text/plain", "404 Not Found.");
                        } else {
                            // Not that in a departure from the QMF2 API this returns the QmfConsoleData object
                            // rather than a list of size one. Perhaps the APIs should be completely consistent
                            // but this response seems more convenient.
                            tx.sendResponse(HTTP_OK, "application/json", JSON.fromObject(objects.get(0)));
                        }
                    } else if (path.startsWith("console/packages") && path.length() == 16) {
                        // Get information about all the packages for all Agents
                        tx.sendResponse(HTTP_OK, "application/json", JSON.fromObject(console.getPackages()));
                    } else {
                        tx.sendResponse(HTTP_NOT_FOUND, "text/plain", "404 Not Found.");
                    }
                }
            }
        }
    } else if (path.startsWith("/qpid/connection")) {
        // handle "/qpid/connection" request with unspecified connection (returns list of available connections).
        // Using the principal lets different users use the default connection.
        String user = tx.getPrincipal();
        tx.sendResponse(HTTP_OK, "application/json", JSON.fromObject(_connections.getAll(user)));
    } else {
        tx.sendResponse(HTTP_NOT_FOUND, "text/plain", "404 Not Found.");
    }
}
Also used : Agent(org.apache.qpid.qmf2.console.Agent) ObjectId(org.apache.qpid.qmf2.common.ObjectId) Console(org.apache.qpid.qmf2.console.Console) List(java.util.List)

Example 10 with ObjectId

use of org.apache.qpid.qmf2.common.ObjectId in project qpid by apache.

the class QpidServer method doPost.

/**
 * Called by the Web Server to allow a Server to handle a POST request.
 * <pre>
 * POST: &lt;host&gt;:&lt;port&gt;/qpid/connection/&lt;name&gt;/object/&lt;ObjectId&gt;
 *      HTTP body: {"_method_name":&lt;method&gt;,"_arguments":&lt;inArgs&gt;}
 *      &lt;method&gt;: A string containing the QMF2 method name e.g. "getLogLevel", "setLogLevel", "create", "delete".
 *      &lt;inArgs&gt;: A JSON string containing the method arguments e.g. {"level":"debug+:Broker"} for setLogLevel.
 *      HTTP response: A JSON string containing the response e.g. {"level":"notice+"} for getLogLevel (may be empty).
 *
 *      This method invokes the QMF2 method &lt;method&gt; with arguments &lt;inArgs&gt; on the object &lt;ObjectId&gt;
 * </pre>
 * @param tx the HttpTransaction containing the request from the client and used to send the response.
 */
@SuppressWarnings("unchecked")
public void doPost(final HttpTransaction tx) throws IOException {
    String path = tx.getRequestURI();
    if (path.startsWith("/qpid/connection/")) {
        path = path.substring(17);
        String user = tx.getPrincipal();
        String connectionName = path;
        int i = path.indexOf("/");
        if (// Can use > rather than >= as we've already tested for "/qpid/connection/" above.
        i > 0) {
            connectionName = user + "." + path.substring(0, i);
            path = path.substring(i + 1);
            // Find the Connection with the name extracted from the URI.
            ConnectionProxy connection = _connections.get(connectionName);
            if (connection == null) {
                _log.info("QpidServer.doPost path: {} Connection not found.", tx.getRequestURI());
                tx.sendResponse(HTTP_NOT_FOUND, "text/plain", "404 Not Found.");
            } else if (!connection.isConnected()) {
                tx.sendResponse(HTTP_INTERNAL_ERROR, "text/plain", "500 Broker Disconnected.");
            } else {
                // If we get this far we should have found a Qpid Connection so retrieve the QMF2 Console Object.
                Console console = connection.getConsole();
                if (path.startsWith("object/")) {
                    path = path.substring(7);
                    // The ObjectId has been passed in the URI create an ObjectId and retrieve the Agent Name.
                    ObjectId oid = new ObjectId(path);
                    String agentName = oid.getAgentName();
                    // The qpidd ManagementAgent doesn't populate AgentName, if it's empty assume it's the broker.
                    agentName = agentName.equals("") ? "broker" : agentName;
                    // Find the Agent we got the QmfData from.
                    Agent agent = console.getAgent(agentName);
                    if (agent == null) {
                        _log.info("QpidServer.doPost path: {} Agent: {} not found.", tx.getRequestURI(), agentName);
                        tx.sendResponse(HTTP_NOT_FOUND, "text/plain", "404 Not Found.");
                    } else {
                        // If we get this far we can create the Object and invoke the method.
                        // We can create a QmfConsoleData with nothing but an ObjectId and the agent.
                        QmfConsoleData object = new QmfConsoleData(Collections.EMPTY_MAP, agent);
                        object.setObjectId(oid);
                        String request = tx.getRequestString();
                        _log.info("QpidServer.doPost path: {} body: {}", tx.getRequestURI(), request);
                        // System.out.println(request);
                        String method = "";
                        try {
                            Map<String, Object> reqMap = JSON.toMap(request);
                            method = (String) reqMap.get("_method_name");
                            Object arguments = reqMap.get("_arguments");
                            Map args = (arguments instanceof Map) ? (Map) arguments : null;
                            // System.out.println("method: " + method + ", args: " + args);
                            // Parse the args if present into a QmfData (needed by invokeMethod).
                            QmfData inArgs = (args == null) ? new QmfData() : new QmfData(args);
                            // Invoke the specified method on the QmfConsoleData we've created.
                            MethodResult results = null;
                            _log.info("invokeMethod: {}", request);
                            results = object.invokeMethod(method, inArgs);
                            tx.sendResponse(HTTP_OK, "application/json", JSON.fromObject(results));
                        } catch (QmfException qmfe) {
                            _log.info("QpidServer.doPost() caught Exception {}", qmfe.getMessage());
                            tx.sendResponse(HTTP_INTERNAL_ERROR, "text/plain", "invokeMethod(" + method + ") -> " + qmfe.getMessage());
                        } catch (Exception e) {
                            _log.info("QpidServer.doPost() caught Exception {}", e.getMessage());
                            tx.sendResponse(HTTP_INTERNAL_ERROR, "text/plain", "500 " + e.getMessage());
                        }
                    }
                } else {
                    tx.sendResponse(HTTP_NOT_FOUND, "text/plain", "404 Not Found.");
                }
            }
        } else {
            tx.sendResponse(HTTP_NOT_FOUND, "text/plain", "404 Not Found.");
        }
    } else {
        tx.sendResponse(HTTP_NOT_FOUND, "text/plain", "404 Not Found.");
    }
}
Also used : Agent(org.apache.qpid.qmf2.console.Agent) QmfData(org.apache.qpid.qmf2.common.QmfData) ObjectId(org.apache.qpid.qmf2.common.ObjectId) QmfException(org.apache.qpid.qmf2.common.QmfException) IOException(java.io.IOException) Console(org.apache.qpid.qmf2.console.Console) QmfConsoleData(org.apache.qpid.qmf2.console.QmfConsoleData) ConcurrentHashMap(java.util.concurrent.ConcurrentHashMap) Map(java.util.Map) MethodResult(org.apache.qpid.qmf2.console.MethodResult) QmfException(org.apache.qpid.qmf2.common.QmfException)

Aggregations

ObjectId (org.apache.qpid.qmf2.common.ObjectId)28 QmfConsoleData (org.apache.qpid.qmf2.console.QmfConsoleData)15 Map (java.util.Map)10 HashMap (java.util.HashMap)8 QmfException (org.apache.qpid.qmf2.common.QmfException)7 QmfAgentData (org.apache.qpid.qmf2.agent.QmfAgentData)6 QmfData (org.apache.qpid.qmf2.common.QmfData)6 SchemaClassId (org.apache.qpid.qmf2.common.SchemaClassId)6 ArrayList (java.util.ArrayList)5 QmfEvent (org.apache.qpid.qmf2.common.QmfEvent)5 Agent (org.apache.qpid.qmf2.console.Agent)5 MethodCallParams (org.apache.qpid.qmf2.agent.MethodCallParams)4 MethodCallWorkItem (org.apache.qpid.qmf2.agent.MethodCallWorkItem)4 AgentHeartbeatWorkItem (org.apache.qpid.qmf2.console.AgentHeartbeatWorkItem)4 MethodResult (org.apache.qpid.qmf2.console.MethodResult)4 ConcurrentHashMap (java.util.concurrent.ConcurrentHashMap)3 QmfQuery (org.apache.qpid.qmf2.common.QmfQuery)3 SchemaClass (org.apache.qpid.qmf2.common.SchemaClass)3 EventReceivedWorkItem (org.apache.qpid.qmf2.console.EventReceivedWorkItem)3 MethodResponseWorkItem (org.apache.qpid.qmf2.console.MethodResponseWorkItem)3