/**
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.apache.storm.multilang;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.Serializable;
import java.util.List;
import java.util.Map;

import org.apache.storm.task.TopologyContext;

/**
 * The ISerializer interface describes the methods that an object should
 * implement to provide serialization and de-serialization capabilities to
 * non-JVM language components.
 */
public interface ISerializer extends Serializable {

    /**
     * This method sets the input and output streams of the serializer
     *
     * @param processIn output stream to non-JVM component
     * @param processOut input stream from non-JVM component
     */
    void initialize(OutputStream processIn, InputStream processOut);

    /**
     * This method transmits the Storm config to the non-JVM process and
     * receives its pid.
     *
     * @param conf storm configuration
     * @param context topology context
     * @return process pid
     */
    Number connect(Map conf, TopologyContext context) throws IOException,
            NoOutputException;

    /**
     * This method receives a shell message from the non-JVM process
     *
     * @return shell message
     */
    ShellMsg readShellMsg() throws IOException, NoOutputException;

    /**
     * This method sends a bolt message to a non-JVM bolt process
     *
     * @param msg bolt message
     */
    void writeBoltMsg(BoltMsg msg) throws IOException;

    /**
     * This method sends a spout message to a non-JVM spout process
     *
     * @param msg spout message
     */
    void writeSpoutMsg(SpoutMsg msg) throws IOException;

    /**
     * This method sends a list of task IDs to a non-JVM bolt process
     *
     * @param taskIds list of task IDs
     */
    void writeTaskIds(List<Integer> taskIds) throws IOException;
}
