Adding FlowRef,MeterRef and GroupRef for the Error message
[openflowplugin.git] / openflowplugin / src / main / java / org / opendaylight / openflowplugin / openflow / md / core / translator / ErrorTranslator.java
index 3ff9d9d1d0af0eb6059a62470e836e32964caa4d..dbdb8daf8500961e4dfc2424b22eff6e63517194 100644 (file)
@@ -1,17 +1,33 @@
+/**
+ * Copyright (c) 2013 Cisco Systems, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
 package org.opendaylight.openflowplugin.openflow.md.core.translator;
 
 import java.math.BigInteger;
+import java.util.Collections;
 import java.util.List;
 import java.util.concurrent.CopyOnWriteArrayList;
 
-import org.opendaylight.openflowplugin.openflow.md.core.ByteUtil;
 import org.opendaylight.openflowplugin.openflow.md.core.IMDMessageTranslator;
 import org.opendaylight.openflowplugin.openflow.md.core.SwitchConnectionDistinguisher;
 import org.opendaylight.openflowplugin.openflow.md.core.session.SessionContext;
+import org.opendaylight.openflowplugin.openflow.md.core.session.TransactionKey;
+import org.opendaylight.openflowplugin.openflow.md.util.ByteUtil;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.errors.rev131116.ErrorType;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.NodeErrorNotification;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.NodeErrorNotificationBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.NodeFlow;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.node.error.notification.object.reference.FlowRefBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.node.error.notification.object.reference.GroupRefBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.node.error.notification.object.reference.MeterRefBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.transaction.rev131103.TransactionId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.transaction.rev131103.TransactionMetadata;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.NodeGroup;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.NodeMeter;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.ErrorMessage;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.OfHeader;
 import org.opendaylight.yangtools.yang.binding.DataObject;
@@ -27,8 +43,8 @@ public class ErrorTranslator implements IMDMessageTranslator<OfHeader, List<Data
         if (msg instanceof ErrorMessage) {
             ErrorMessage message = (ErrorMessage) msg;
             List<DataObject> list = new CopyOnWriteArrayList<DataObject>();
-            LOG.error(" Error Message received: type={}[{}], code={}[{}], data={}[{}] ", message.getType(),
-                    message.getTypeString(), message.getCode(), message.getCodeString(), new String(message.getData()),
+            LOG.debug(" Error Message received: type={}[{}], code={}[{}], data=[{}] ", message.getType(),
+                    message.getTypeString(), message.getCode(), message.getCodeString(),
                     ByteUtil.bytesToHexstring(message.getData(), " "));
 
             // create a Node Error Notification event builder
@@ -39,6 +55,30 @@ public class ErrorTranslator implements IMDMessageTranslator<OfHeader, List<Data
 
             nodeErrBuilder.setTransactionId(new TransactionId(BigInteger.valueOf(message.getXid())));
 
+            Object object = sc.getbulkTransactionCache().getIfPresent(new TransactionKey(message.getXid()));
+            if (object != null) {
+                nodeErrBuilder.setTransactionUri(((TransactionMetadata) object).getTransactionUri());
+                FlowRefBuilder flowRef = new FlowRefBuilder();
+                GroupRefBuilder groupRef = new GroupRefBuilder();
+                MeterRefBuilder meterRef = new MeterRefBuilder();
+                if (object instanceof NodeFlow) {
+                    FlowEntityData flowEntry = new FlowEntityData();
+                    flowRef = flowEntry.getBuilder(object);
+                    nodeErrBuilder.setObjectReference(flowRef.build());
+                } else if (object instanceof NodeGroup) {
+                    GroupEntityData groupEntry = new GroupEntityData();
+                    groupRef = groupEntry.getBuilder(object);
+                    nodeErrBuilder.setObjectReference(groupRef.build());
+
+                } else if (object instanceof NodeMeter) {
+                    MeterEntityData meterEntry = new MeterEntityData();
+                    meterRef = meterEntry.getBuilder(object);
+                    nodeErrBuilder.setObjectReference(meterRef.build());
+
+                }
+
+            }
+
             nodeErrBuilder.setType(ErrorType.forValue(message.getType()));
 
             nodeErrBuilder.setCode(message.getCode());
@@ -54,7 +94,7 @@ public class ErrorTranslator implements IMDMessageTranslator<OfHeader, List<Data
             return list;
         } else {
             LOG.error("Message is not of Error Message ");
-            return null;
+            return Collections.emptyList();
         }
     }