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;
}
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 & 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());
}
}
}
}
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()) + "}";
}
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.");
}
}
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: <host>:<port>/qpid/connection/<name>/object/<ObjectId>
* HTTP body: {"_method_name":<method>,"_arguments":<inArgs>}
* <method>: A string containing the QMF2 method name e.g. "getLogLevel", "setLogLevel", "create", "delete".
* <inArgs>: 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 <method> with arguments <inArgs> on the object <ObjectId>
* </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.");
}
}
Aggregations