/*
 * Copyright 2019, TeamDev. All rights reserved.
 *
 * Redistribution and use in source and/or binary forms, with or without
 * modification, must retain the above copyright notice and the following
 * disclaimer.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

package io.spine.system.server;

import io.grpc.stub.StreamObserver;
import io.spine.base.EventMessage;
import io.spine.core.Ack;
import io.spine.core.Event;
import io.spine.core.Origin;
import io.spine.core.UserId;
import io.spine.grpc.LoggingObserver;

import static com.google.common.base.Preconditions.checkNotNull;
import static io.spine.grpc.LoggingObserver.Level.WARN;
import static io.spine.system.server.SystemEventFactory.forMessage;

/**
 * The default implementation of {@link SystemWriteSide}.
 */
final class DefaultSystemWriteSide implements SystemWriteSide {

    /**
     * The ID of the user which is used for generating system commands and events.
     */
    static final UserId SYSTEM_USER = UserId
            .newBuilder()
            .setValue("SYSTEM")
            .build();

    private final SystemContext system;

    DefaultSystemWriteSide(SystemContext system) {
        this.system = system;
    }

    @Override
    public void postEvent(EventMessage systemEvent, Origin origin) {
        checkNotNull(systemEvent);
        checkNotNull(origin);
        Event event = event(systemEvent, origin);
        StreamObserver<Ack> loggingObserver =
                LoggingObserver.<Ack>forClass(DefaultSystemWriteSide.class, WARN);
        system.eventBus()
              .post(event, loggingObserver);
    }

    private Event event(EventMessage message, Origin origin) {
        SystemEventFactory factory = forMessage(message, origin, system.isMultitenant());
        Event event = factory.createEvent(message, null);
        return event;
    }
}

@@ -1053,93 +1053,31 @@
  io.
-grpc.stub.StreamObserver;%0Aimport io.spine.base.EventMessage;%0Aimport io.spine.core.Ack
+spine.base.EventMessage
 ;%0Aim
@@ -1163,46 +1163,8 @@
 rId;
-%0Aimport io.spine.grpc.LoggingObserver;
 %0A%0Aim
@@ -1254,31 +1254,30 @@
 ne.grpc.
-Logging
+Stream
 Observer
 .Level.W
@@ -1272,19 +1272,22 @@
 rver
-.Level.WARN
+s.noOpObserver
 ;%0Aim
@@ -2040,137 +2040,8 @@
 n);%0A
-        StreamObserver%3CAck%3E loggingObserver =%0A                LoggingObserver.%3CAck%3EforClass(DefaultSystemWriteSide.class, WARN);%0A
     
@@ -2093,23 +2093,20 @@
 nt, 
-logging
+noOp
 Observer
 );%0A 
@@ -2101,16 +2101,18 @@
 Observer
+()
 );%0A    %7D

Revert to a NOP observer