/*
 * 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.sling.mom;

/**
 */
public final class Types {
    private Types() {
    }

    public interface Name {
    }
    public interface TopicName extends Name {
    }
    public interface QueueName extends Name {
    }
    public interface CommandName {
    }

    public static TopicName topicName(String topicName) {
        return new TopicNameImpl(topicName);
    }

    public static QueueName queueName(String queueName) {
        return new QueueNameImpl(queueName);
    }

    public static CommandName commandName(String commandName) {
        return new CommandNameImpl(commandName);
    }


    private static class QueueNameImpl extends StringWrapper implements QueueName {

        private QueueNameImpl(String value) {
            super(value);
        }
    }

    private static class CommandNameImpl extends StringWrapper implements CommandName {

        private CommandNameImpl(String value) {
            super(value);
        }
    }

    private static class TopicNameImpl extends StringWrapper implements TopicName {

        private TopicNameImpl(String value) {
            super(value);
        }
    }

    private static class StringWrapper implements Comparable<String> {


        private String value;

        private StringWrapper(String value) {
            this.value = value;
        }

        @Override
        public int hashCode() {
            return value.hashCode();
        }

        @Override
        public boolean equals(Object obj) {
            return value.equals(obj.toString());
        }

        @Override
        public int compareTo(String o) {
            return value.compareTo(o);
        }

        public String toString() {
            return value;
        }
    }

}
