/*
 * Copyright 2014 Red Hat, Inc, and individual contributors.
 *
 * Licensed 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.projectodd.wunderboss.messaging;

import org.projectodd.wunderboss.Option;
import org.projectodd.wunderboss.codecs.Codec;
import org.projectodd.wunderboss.codecs.Codecs;

import java.util.Map;

public interface Destination {
    String name();

    class ListenOption extends Option {
        public static final ListenOption CONTEXT     = opt("context", ListenOption.class);
        public static final ListenOption CONCURRENCY = opt("concurrency", 1, ListenOption.class);
        public static final ListenOption SELECTOR    = opt("selector", ListenOption.class);
        public static final ListenOption MODE        = opt("mode", Context.Mode.TRANSACTED, ListenOption.class);
    }

    Listener listen(MessageHandler handler,
                    Codecs codecs,
                    Map<ListenOption, Object> options) throws Exception;

    class MessageOpOption extends Option {
        public static final MessageOpOption CONTEXT = opt("context", MessageOpOption.class);
    }

    class PublishOption extends MessageOpOption {
        public static final PublishOption PRIORITY   = opt("priority", 4, PublishOption.class); //TODO: 4 is JMS specific?
        public static final PublishOption TTL        = opt("ttl", 0, PublishOption.class);
        public static final PublishOption PERSISTENT = opt("persistent", true, PublishOption.class);
        public static final PublishOption PROPERTIES = opt("properties", PublishOption.class);
    }

    void publish(Object content, Codec codec, Map<MessageOpOption, Object> options) throws Exception;

    class ReceiveOption extends MessageOpOption {
        public static final ReceiveOption TIMEOUT  = opt("timeout", 10000, ReceiveOption.class);
        public static final ReceiveOption SELECTOR = opt("selector", ReceiveOption.class);
    }

    /**
     *
     * @param endpoint
     * @param options
     * @return the Message, or null on timeout
     * @throws Exception
     */
    Message receive(Codecs codecs, Map<MessageOpOption, Object> options) throws Exception;

    void stop() throws Exception;
}

/*
 * Copyright 2014 Red Hat, Inc, and individual contributors.
 *
 * Licensed 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.projectodd.wunderboss.messaging;

import org.projectodd.wunderboss.Option;
import org.projectodd.wunderboss.codecs.Codec;
import org.projectodd.wunderboss.codecs.Codecs;

import java.util.Map;

public interface Destination {
    String name();

    class ListenOption extends Option {
        public static final ListenOption CONTEXT     = opt("context", ListenOption.class);
        public static final ListenOption CONCURRENCY = opt("concurrency", 1, ListenOption.class);
        public static final ListenOption SELECTOR    = opt("selector", ListenOption.class);
        public static final ListenOption MODE        = opt("mode", Context.Mode.TRANSACTED, ListenOption.class);
    }

    Listener listen(MessageHandler handler,
                    Codecs codecs,
                    Map<ListenOption, Object> options) throws Exception;

    class MessageOpOption extends Option {
        public static final MessageOpOption CONTEXT = opt("context", MessageOpOption.class);
    }

    class PublishOption extends MessageOpOption {
        public static final PublishOption PRIORITY   = opt("priority", 4, PublishOption.class); //TODO: 4 is JMS specific?
        public static final PublishOption TTL        = opt("ttl", 0, PublishOption.class);
        public static final PublishOption PERSISTENT = opt("persistent", true, PublishOption.class);
        public static final PublishOption PROPERTIES = opt("properties", PublishOption.class);
    }

    void publish(Object content, Codec codec, Map<MessageOpOption, Object> options) throws Exception;

    class ReceiveOption extends MessageOpOption {
        public static final ReceiveOption TIMEOUT  = opt("timeout", 10000, ReceiveOption.class);
        public static final ReceiveOption SELECTOR = opt("selector", ReceiveOption.class);
    }

    Message receive(Codecs codecs, Map<MessageOpOption, Object> options) throws Exception;

    void stop() throws Exception;
}

Remove bogus javadoc comments that trip up javadoc generation during release.