package com.orientechnologies.orient.server.network.protocol.binary;

import com.orientechnologies.common.log.OLogManager;
import com.orientechnologies.orient.core.command.OCommandResultListener;
import com.orientechnologies.orient.core.db.record.OIdentifiable;
import com.orientechnologies.orient.core.fetch.remote.ORemoteFetchListener;
import com.orientechnologies.orient.core.record.ORecord;
import com.orientechnologies.orient.core.record.ORecordInternal;

import java.io.IOException;
import java.util.concurrent.atomic.AtomicBoolean;

/**
 * Asynchronous command result manager. As soon as a record is returned by the command is sent over the wire.
 * 
 * @author Luca Garulli (l.garulli--at--orientechnologies.com)
 * 
 */
public class OAsyncCommandResultListener extends OAbstractCommandResultListener {

  private final ONetworkProtocolBinary protocol;
  private final AtomicBoolean          empty = new AtomicBoolean(true);
  private final int                    txId;
  private final OCommandResultListener resultListener;

  public OAsyncCommandResultListener(final ONetworkProtocolBinary iNetworkProtocolBinary, final int txId,
      OCommandResultListener resultListener) {
    this.protocol = iNetworkProtocolBinary;
    this.txId = txId;
    this.resultListener = resultListener;
  }

  @Override
  public boolean result(final Object iRecord) {
    if (empty.compareAndSet(true, false))
      try {
        protocol.sendOk(txId);
      } catch (IOException e1) {
      }

    try {
      fetchRecord(iRecord, new ORemoteFetchListener() {
        @Override
        protected void sendRecord(ORecord<?> iLinked) {
          try {
            if (protocol.connection.data.protocolVersion >= 17) {
              protocol.channel.writeByte((byte) 2); // CACHE IT ON THE CLIENT
              protocol.writeIdentifiable(iLinked);
            }
          } catch (IOException e) {
            OLogManager.instance().error(this, "Cannot write against channel", e);
          }
        }
      });

      protocol.channel.writeByte((byte) 1); // ONE MORE RECORD
      protocol.writeIdentifiable((ORecordInternal<?>) ((OIdentifiable) iRecord).getRecord());

    } catch (IOException e) {
      return false;
    }

    return true;
  }

  @Override
  public void end() {
    super.end();
    resultListener.end();
  }

  public boolean isEmpty() {
    return empty.get();
  }
}

@@ -63,16 +63,95 @@
 inary;%0A%0A
+import java.io.IOException;%0Aimport java.util.concurrent.atomic.AtomicBoolean;%0A%0A
 import c
@@ -191,24 +191,24 @@
 LogManager;%0A
-
 import com.o
@@ -470,152 +470,8 @@
 ord;
-%0Aimport com.orientechnologies.orient.core.record.ORecordInternal;%0A%0Aimport java.io.IOException;%0Aimport java.util.concurrent.atomic.AtomicBoolean;
 %0A%0A/*
@@ -1404,10 +1404,15 @@
 ion 
-e1
+ignored
 ) %7B%0A
@@ -2037,29 +2037,8 @@
 ble(
-(ORecordInternal%3C?%3E) 
 ((OI
@@ -2204,16 +2204,50 @@
 .end();%0A
+    if (resultListener != null)%0A  
     resu

Revert "Revert "Fixed issue #2342""