perfsonar-dev - [pS-dev] [GEANT/SA2/ps-java-services] r5769 - trunk/perfsonar-java-rrd-ma/src/main/java/org/perfsonar/se rvice/measurementArchive/rrdType
Subject: perfsonar development work
List archive
[pS-dev] [GEANT/SA2/ps-java-services] r5769 - trunk/perfsonar-java-rrd-ma/src/main/java/org/perfsonar/se rvice/measurementArchive/rrdType
Chronological Thread
- From:
- To:
- Subject: [pS-dev] [GEANT/SA2/ps-java-services] r5769 - trunk/perfsonar-java-rrd-ma/src/main/java/org/perfsonar/se rvice/measurementArchive/rrdType
- Date: Wed, 20 Oct 2010 10:34:10 +0100
Author: psnc.pikusa
Date: 2010-10-20 10:34:10 +0100 (Wed, 20 Oct 2010)
New Revision: 5769
Modified:
trunk/perfsonar-java-rrd-ma/src/main/java/org/perfsonar/service/measurementArchive/rrdType/MetadataKeyMessageHandler.java
Log:
Bug 508 fixing - fixed method which merge messages from MetadataKeyReponse.
Modified:
trunk/perfsonar-java-rrd-ma/src/main/java/org/perfsonar/service/measurementArchive/rrdType/MetadataKeyMessageHandler.java
===================================================================
---
trunk/perfsonar-java-rrd-ma/src/main/java/org/perfsonar/service/measurementArchive/rrdType/MetadataKeyMessageHandler.java
2010-10-20 09:02:41 UTC (rev 5768)
+++
trunk/perfsonar-java-rrd-ma/src/main/java/org/perfsonar/service/measurementArchive/rrdType/MetadataKeyMessageHandler.java
2010-10-20 09:34:10 UTC (rev 5769)
@@ -1,183 +1,465 @@
-package main.java.org.perfsonar.service.measurementArchive.rrdType;
+/**
+ * $Id: GenericMessageHandler.java 4932 2009-02-02 14:35:16Z mac $
+ * Project: perfSONAR
+ */
+package org.perfsonar.service.measurementArchive.rrdType;
import java.util.ArrayList;
import java.util.Collection;
+import java.util.HashMap;
import java.util.Hashtable;
+import java.util.List;
import java.util.Map;
import org.apache.log4j.Logger;
+import org.perfsonar.base2.service.authn.component.AuthNComponent;
+import org.perfsonar.base2.service.configuration.Configuration;
+import org.perfsonar.base2.service.configuration.ConfigurationManager;
import org.perfsonar.base2.service.exceptions.PerfSONARException;
-import org.perfsonar.base2.service.messages.GenericMessageHandler;
+import org.perfsonar.base2.service.messages.MessageHandler;
+import org.perfsonar.base2.service.requesthandler.ServiceEngine;
import org.perfsonar.base2.service.requesthandler.ServiceMessage;
+import org.perfsonar.base2.service.util.ResultCodesUtil;
import org.perfsonar.base2.xml.nmwg.Data;
import org.perfsonar.base2.xml.nmwg.Message;
import org.perfsonar.base2.xml.nmwg.Metadata;
-public class MetadataKeyMessageHandler extends GenericMessageHandler {
-
- private static final Logger logger =
Logger.getLogger(GenericMessageHandler.class.getName());
-
-
- public MetadataKeyMessageHandler() throws PerfSONARException {
- super();
- }
-
-
- protected MessagePair mergeMultipleResponses(ArrayList<MessagePair>
messagePairs) {
-
- final Map<String, String> ids = new Hashtable<String,
String>();
+/**
+ * Abstract class that does all the things that a "request" message
+ * handler will need to do.
+ *
+ * @author Maciej Glowiak
+ * @author Roman Lapacz
+ * @author Jeff Boote
+ */
+public class MetadataKeyMessageHandler implements MessageHandler {
- if (messagePairs == null || messagePairs.size() == 0)
- return null;
- else if (messagePairs.size() == 1)
- return messagePairs.get(0);
- else {
- int metaid=0;
- int dataid=0;
+ private static final Logger logger =
Logger.getLogger(MetadataKeyMessageHandler.class.getName());
- //create new common response message
- Message respMessage = new Message();
-
-
-
- logger.info("MOJA METODA");
- /*
- * Bug 508 fixing - BEGIN
- */
-
- //Prepare Message Text
- StringBuffer responseText = new StringBuffer();
- String t =
messagePairs.get(0).getRequest().getElement().getAttribute("type");
- String type = (t == null? "": t.replaceFirst("Request",
"Response"));
- responseText.append("<nmwg:message type=\"" + type + "\"
xmlns:nmwg=\"http://ggf.org/ns/nmwg/base/2.0/\"
xmlns=\"http://ggf.org/ns/nmwg/base/2.0/\">");
-
- //Concatenate Messages
- int messageCounter = 0;
- for (MessagePair messagePair : messagePairs) {
-
- if(messagePair.getResponse().getText() != null &&
messagePair.getResponse().getElement() == null){
- //If it's true it means that on message pairs
list there is no response which has element object so responses can be
concatenated
-
-
responseText.append(messagePair.getResponse().getText());
- messageCounter++;
-
- }
- else{
- break;
- }
- }
-
- responseText.append("</nmwg:message>");
-
-
- //If it's true it means that on message pairs list there is
no response which has element object so responses can be concatenated
- if(messagePairs.size() == messageCounter){
-
messagePairs.get(0).getResponse().setText(responseText.toString());
- return messagePairs.get(0);
-
- }
- /*
- * Bug 508 fixing - END
- */
-
-
- for (MessagePair messagePair : messagePairs) {
+ public MetadataKeyMessageHandler() throws PerfSONARException {
- //ServiceMessage request = messagePair.getRequest();
- ServiceMessage response = messagePair.getResponse();
- Message m = (Message) response.getElement();
-
-
+ }
- if (m == null) return messagePair;
- Collection<Metadata> metadatas =
m.getMetadataMap().values();
- Collection<Data> datas = m.getDataMap().values();
+ protected ServiceEngine getServiceEngine(String serviceEngineClassName)
+ throws Exception {
- //for each metadata
- for (Metadata meta1 : metadatas) {
+ ServiceEngine se = (ServiceEngine)Class.forName(
+ serviceEngineClassName ).newInstance();
- //get old meta id
- String meta1id = meta1.getId();
- //compute new meta id
- String newMeta1id = meta1id+"_"+metaid;
+ return se;
+ }
- //set new id
- meta1.setId(newMeta1id);
+ protected void checkAuth(Configuration c, String messageType) throws
PerfSONARException {
+ try {
+ String authR =
c.getMessageHandler(messageType).getOption("authR").getValue();
+ logger.debug("Checking authorization: "+authR);
+ if ("yes".equals(authR)) {
+ AuthNComponent authComponent =
(AuthNComponent)c.getAuxiliaryComponent("auth");
+ authComponent.requestAuthR(messageType, null);
+ }
+ else {
+ String authN =
c.getMessageHandler(messageType).getOption("authN").getValue();
+ logger.debug("Checking authentication: "+authN);
+ if ("yes".equals(authN)) {
+ AuthNComponent authComponent =
(AuthNComponent)c.getAuxiliaryComponent("auth");
+ authComponent.requestAuthN(messageType);
+ }
+ }
+ } catch (RuntimeException ex) { }
+ }
- metaid++;
-
- ids.put(meta1id, newMeta1id);
+ public void execute(ServiceMessage request, ServiceMessage response)
+ throws PerfSONARException {
- /*
- * TODO:
- * subject chaining reference
- * if there is metadata/subject with
- * metadataRefId, it should be changed
- *
- * perhaps some metadata-id mapping table
- * should be prepared and then all metadata
- * should be iterated and subjects changed?
- *
- * something like:
- *
- * mapping.add(oldId, newId);
- *
- */
- if ((meta1.getSubject() != null)
- &&
(meta1.getSubject().getMetadataIdRef() != null)) {
- if
(ids.get(meta1.getSubject().getMetadataIdRef()) != null)
-
meta1.getSubject().setMetadataIdRef(ids.get(meta1.getSubject().getMetadataIdRef()));
- }
+ Message reqMessage = (Message) request.getElement();
- //put metadata to new common response message
- respMessage.setMetadata(meta1);
+ logger.debug("Message Handler started for message type
["+reqMessage.getType()+"]");
+
//logger.debug("--------------------\n"+reqMessage+"\n------------------------\n");
- //find all data linked to meta
- for (Data data1 : datas) {
+ //get Service engine for this message
+ String messageType = null;
+ String serviceEngineClassName = null;
+ ServiceEngine serviceEngine = null;
+ try {
+ messageType = reqMessage.getType();
+ Configuration c =
ConfigurationManager.getInstance().getConfiguration();
+ //authentication
+ checkAuth(c, messageType);
+ //service engine
+ serviceEngineClassName = c.getServiceEngineOption(messageType);
+ serviceEngine = getServiceEngine(serviceEngineClassName);
+ if (serviceEngine == null) throw new NullPointerException(
+ "Cannot Instantiate ServiceEngine class
["+serviceEngineClassName+"]");
- //if data's metadata id res == metadata id
- //put data
- if (data1.getMetadataIdRef().equals(meta1id))
{
+ } catch (Exception ex) {
- data1.setId(data1.getId() + "_"+dataid);
- //change data metadata id ref to new meta
id
- data1.setMetadataIdRef(newMeta1id);
+ String m = "Cannot find ServiceEngine ["+serviceEngineClassName +
+ "] for message type ["+messageType+"], nested exception
was:"+
+ ex.toString();
+ PerfSONARException pse = new PerfSONARException(
+ "no_service_engine", m);
+ logger.error(m,ex);
- //put changed data to response common
message
- respMessage.setData(data1);
+ response.setElement(
+ ResultCodesUtil.generateResultMessage(null, pse));
+ return; //finish when cannot execute ServiceEngine
- dataid++;
+ }
- } //if
- } //datas
- } //metadata
- }
+ ArrayList<MessagePair> output = new ArrayList<MessagePair>();
- return new MessagePair(null, new
ServiceMessage(respMessage));
+ List<Message> inputMessages=extractMultipleRequests(reqMessage);
+ if(inputMessages.isEmpty()){
+ //TODO: url event types
+ throw new
PerfSONARException("error.common.no_metadata_data_pair","There were no
metadata/data pairs found in the message");
+ }
+
+ for (Message inputMessage: inputMessages) {
- }
- }
-
-
- class MessagePair {
- private ServiceMessage request = null;
- private ServiceMessage response = null;
-
- public MessagePair(ServiceMessage request, ServiceMessage
response) {
- this.request = request;
- this.response = response;
- }
-
- public void setRequest(ServiceMessage request) { this.request =
request; }
- public void setResponse(ServiceMessage response) { this.response
= response; }
- public ServiceMessage getRequest() { return request; }
- public ServiceMessage getResponse() { return response; }
- }
+ ServiceMessage reqSM = new ServiceMessage(inputMessage);
+ ServiceMessage resSM = new ServiceMessage();
-}
+ try {
+
+ logger.debug("Request.execute: run Service Engine for
extracted request");
+
+ //run service engine and add result to output list
+ try {
+
+ serviceEngine.takeAction(reqSM, resSM);
+
+ } catch (RuntimeException rex) {
+ //just in case of unexpected runtime exception such as
+ //null, indexoutofbounds, classcast, etc.
+ logger.error(rex,rex);
+ throw new PerfSONARException(
+ "runtime_exception", "Runtime exception in
ServiceEngine: "+rex.getMessage());
+ }
+ } catch (PerfSONARException e) {
+
+ //if an exception was thrown, convert it to result code
+ //and add as a new message (to be joined) to array
+ logger.error("Message handler result code: "+e);
+
resSM.setElement(ResultCodesUtil.generateResultMessage(e.getResultCode(),e.getMessage()));
+
+ }
+
+ //add response from ServiceEngine or Result code generated above
+ output.add(new MessagePair(reqSM, resSM));
+
+ }
+
+ MessagePair messagePair = mergeMultipleResponses(output);
+ response.setElement(messagePair.getResponse().getElement());
+ response.setText(messagePair.getResponse().getText());
+
+ Message respMessage = (Message) response.getElement();
+ if (respMessage != null) {
+ respMessage.setType(messageType.replaceFirst("Request",
"Response"));
+ respMessage.setMessageIdRef(reqMessage.getId());
+ }
+
+ }
+
+
+ protected ArrayList<Message> extractMultipleRequests(Message reqMessage)
{
+
+ ArrayList<Message> messages = new ArrayList<Message>();
+ Collection<Data> dataTriggers = reqMessage.getDataMap().values();
+
+ for (Data data : dataTriggers) {
+
+ String metadataIdRef = data.getMetadataIdRef();
+ Message message = new Message();
+ try {
+
+ Map<String,Metadata> metadatas = new
HashMap<String,Metadata>();
+ getChaining(reqMessage, metadataIdRef, metadatas);
+ Map<String,Metadata> mergedMetadatas =
mergeAllMetadata(metadatas);
+
+
+ for (Metadata metadata : mergedMetadatas.values())
+ message.setMetadata(metadata);
+
+ message.setId(reqMessage.getId());
+ message.setType(reqMessage.getType());
+ message.setData(data);
+
+ messages.add(message);
+
+ } catch (NoSuchMetadataException e) {
+
+ //wrong MetadataIdRef, remove it
+ //TODO: ?
+ e.printStackTrace();
+
+ }
+
+ }
+
+ return messages;
+
+ }
+
+
+ public class MessagePair {
+ private ServiceMessage request = null;
+ private ServiceMessage response = null;
+ public MessagePair(ServiceMessage request, ServiceMessage response) {
+ this.request = request;
+ this.response = response;
+ }
+ public void setRequest(ServiceMessage request) { this.request =
request; }
+ public void setResponse(ServiceMessage response) { this.response =
response; }
+ public ServiceMessage getRequest() { return request; }
+ public ServiceMessage getResponse() { return response; }
+ }
+
+
+ protected MessagePair mergeMultipleResponses(ArrayList<MessagePair>
messagePairs){
+
+ final Map<String, String> ids = new Hashtable<String, String>();
+
+ if (messagePairs == null || messagePairs.size() == 0)
+ return null;
+
+
+ /*
+ * BUG 508 fixing begin
+ */
+ else if (messagePairs.size() == 1 &&
messagePairs.get(0).getResponse().getText() != null &&
messagePairs.get(0).getResponse().getElement() == null){
+ StringBuffer responseText = new StringBuffer();
+ String t =
messagePairs.get(0).getRequest().getElement().getAttribute("type");
+ String type = (t == null? "": t.replaceFirst("Request",
"Response"));
+ responseText.append("<nmwg:message type=\"" + type + "\"
xmlns:nmwg=\"http://ggf.org/ns/nmwg/base/2.0/\"
xmlns=\"http://ggf.org/ns/nmwg/base/2.0/\">");
+
responseText.append(messagePairs.get(0).getResponse().getText());
+ responseText.append("</nmwg:message>");
+
messagePairs.get(0).getResponse().setText(responseText.toString());
+ return messagePairs.get(0);
+
+ /*
+ * BUG 508 fixing end
+ */
+
+ }else if(messagePairs.size() == 1)
+ return messagePairs.get(0);
+
+ else {
+
+ int metaid=0;
+ int dataid=0;
+
+ //create new common response message
+ Message respMessage = new Message();
+
+
+
+ logger.info("MOJA METODA");
+ /*
+ * Bug 508 fixing - BEGIN
+ */
+
+ //Prepare Message Text
+ StringBuffer responseText = new StringBuffer();
+ String t =
messagePairs.get(0).getRequest().getElement().getAttribute("type");
+ String type = (t == null? "": t.replaceFirst("Request",
"Response"));
+ responseText.append("<nmwg:message type=\"" + type + "\"
xmlns:nmwg=\"http://ggf.org/ns/nmwg/base/2.0/\"
xmlns=\"http://ggf.org/ns/nmwg/base/2.0/\">");
+
+ //Concatenate Messages
+ int messageCounter = 0;
+ for (MessagePair messagePair : messagePairs) {
+
+ if(messagePair.getResponse().getText() != null &&
messagePair.getResponse().getElement() == null){
+ //If it's true it means that on message pairs list
there is no response which has element object so responses can be concatenated
+
+
responseText.append(messagePair.getResponse().getText());
+ messageCounter++;
+
+ }
+ else{
+ break;
+ }
+ }
+
+ responseText.append("</nmwg:message>");
+
+
+ //If it's true it means that on message pairs list there is no
response which has element object so responses can be concatenated
+ if(messagePairs.size() == messageCounter){
+
messagePairs.get(0).getResponse().setText(responseText.toString());
+ return messagePairs.get(0);
+
+ }
+
+ /*
+ * Bug 508 fixing - END
+ */
+
+
+ for (MessagePair messagePair : messagePairs) {
+
+ //ServiceMessage request = messagePair.getRequest();
+ ServiceMessage response = messagePair.getResponse();
+ Message m = (Message) response.getElement();
+
+
+
+ if (m == null) return messagePair;
+
+ Collection<Metadata> metadatas = m.getMetadataMap().values();
+ Collection<Data> datas = m.getDataMap().values();
+
+ //for each metadata
+ for (Metadata meta1 : metadatas) {
+
+ //get old meta id
+ String meta1id = meta1.getId();
+ //compute new meta id
+ String newMeta1id = meta1id+"_"+metaid;
+
+ //set new id
+ meta1.setId(newMeta1id);
+
+ metaid++;
+
+ ids.put(meta1id, newMeta1id);
+
+ /*
+ * TODO:
+ * subject chaining reference
+ * if there is metadata/subject with
+ * metadataRefId, it should be changed
+ *
+ * perhaps some metadata-id mapping table
+ * should be prepared and then all metadata
+ * should be iterated and subjects changed?
+ *
+ * something like:
+ *
+ * mapping.add(oldId, newId);
+ *
+ */
+ if ((meta1.getSubject() != null)
+ && (meta1.getSubject().getMetadataIdRef() !=
null)) {
+ if (ids.get(meta1.getSubject().getMetadataIdRef()) !=
null)
+
meta1.getSubject().setMetadataIdRef(ids.get(meta1.getSubject().getMetadataIdRef()));
+ }
+
+ //put metadata to new common response message
+ respMessage.setMetadata(meta1);
+
+ //find all data linked to meta
+ for (Data data1 : datas) {
+
+ //if data's metadata id res == metadata id
+ //put data
+ if (data1.getMetadataIdRef().equals(meta1id)) {
+
+ data1.setId(data1.getId() + "_"+dataid);
+ //change data metadata id ref to new meta id
+ data1.setMetadataIdRef(newMeta1id);
+
+ //put changed data to response common message
+ respMessage.setData(data1);
+
+ dataid++;
+
+ } //if
+ } //datas
+ } //metadata
+
+ }
+
+ return new MessagePair(null, new ServiceMessage(respMessage));
+
+ }
+ }
+
+
+ /**
+ * Find metadata chain for metadata ID (the last metadata in chain)
+ *
+ * @param inputMessage message to process (won't be changed)
+ * @param lastMetadataId id of metadata which is last in chain
+ * @return map <id,metadata>
+ * @throws NoSuchMetadataException thrown if there is no metadata with
given ID
+ */
+ protected Map<String,Metadata> getChaining(
+ Message inputMessage, String metadataId, Map<String,Metadata>
metadatas)
+ throws NoSuchMetadataException {
+
+ if (metadataId == null) throw new NoSuchMetadataException();
+ Metadata metadata = inputMessage.getMetadata(metadataId);
+ if (metadata == null) throw new NoSuchMetadataException();
+
+ metadatas.put(metadata.getId(), metadata);
+
+ //metadataIdRef in Subject
+ //prevent endless loop
+ if (metadata.getSubject() != null) {
+
+ if ( (metadata.getSubject().getMetadataIdRef()!=null)&&
+ !("".equals(metadata.getSubject().getMetadataIdRef()))&&
+
!(metadata.getId().equals(metadata.getSubject().getMetadataIdRef()))) {
+
+ getChaining(
+ inputMessage,
+ metadata.getSubject().getMetadataIdRef(),
+ metadatas);
+ }
+
+ }
+
+ String chainedMetadataId = metadata.getMetadataIdRef();
+
+ //get other chain, prevent endless loop
+ if ( (chainedMetadataId!=null)&&
+ !("".equals(chainedMetadataId))&&
+ !(metadata.getId().equals(chainedMetadataId))) {
+ getChaining(inputMessage, chainedMetadataId, metadatas);
+ }
+
+
+ return metadatas;
+
+ }
+
+
+ /**
+ * Merge chained metadata elements
+ * @param metadatas map of metadata elements
+ * @return metadatas map of merged metadata elements
+ */
+ public Map<String,Metadata> mergeAllMetadata(Map<String,Metadata>
metadatas) {
+ return metadatas;
+ };
+
+
+ /**
+ * Exception thrown when Metadata could not be found. It's internal
+ * Message Handler
+ * exception.
+ *
+ * @author Maciej Glowiak
+ *
+ */
+ protected class NoSuchMetadataException extends Exception {
+
+ private static final long serialVersionUID = -3725261560519487460L;
+
+ }
+
+
+} //GenericMessageHandler
+
+
+
+
+
+
- [pS-dev] [GEANT/SA2/ps-java-services] r5769 - trunk/perfsonar-java-rrd-ma/src/main/java/org/perfsonar/se rvice/measurementArchive/rrdType, svn-noreply, 10/20/2010
Archive powered by MHonArc 2.6.16.