/**
 * Copyright 2016 Nikita Koksharov
 *
 * 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.redisson.spring.support;

import org.springframework.beans.factory.xml.NamespaceHandlerSupport;

/**
 *
 * @author Rui Gu (https://github.com/jackygurui)
 */
public class RedissonNamespaceHandlerSupport extends NamespaceHandlerSupport {
    
    @Override
    public void init() {
        RedissonNamespaceParserSupport helper
                = new RedissonNamespaceParserSupport();
        
        RedissonGenericObjectDefinitionParser defaultParser
                = new RedissonGenericObjectDefinitionParser(helper);
        
        RedissonReadAndWriteLockDefinitionParser readAndWriteLockParser
                = new RedissonReadAndWriteLockDefinitionParser(helper);
        
        RedissonMultiLockDefinitionParser nestedParser
                = new RedissonMultiLockDefinitionParser(helper);
        
        RedissonNestedElementAwareDecorator readWriteLockDecorator
                = new RedissonNestedElementAwareDecorator(
                        new String[]{
                            RedissonNamespaceParserSupport.READ_LOCK_ELEMENT,
                            RedissonNamespaceParserSupport.WRITE_LOCK_ELEMENT
                        },
                        RedissonNamespaceParserSupport.READ_WRITE_LOCK_REF_ATTRIBUTE);
        
        RedissonGenericObjectDefinitionParser readWriteLockParser
                = new RedissonGenericObjectDefinitionParser(helper,
                        readWriteLockDecorator);
        
        RedissonNestedElementAwareDecorator remoteServiceDecorator
                = new RedissonNestedElementAwareDecorator(
                        new String[]{
                            RedissonNamespaceParserSupport.RPC_SERVER_ELEMENT,
                            RedissonNamespaceParserSupport.RPC_CLIENT_ELEMENT
                        },
                        RedissonNamespaceParserSupport.REMOTE_SERVICE_REF_ATTRIBUTE);
        
        RedissonGenericObjectDefinitionParser remoteServiceParser
                = new RedissonGenericObjectDefinitionParser(helper,
                        remoteServiceDecorator);
        
        RedissonNestedElementAwareDecorator liveObjectServiceDecorator
                = new RedissonNestedElementAwareDecorator(
                        new String[]{
                            RedissonNamespaceParserSupport.LIVE_OBJECT_ELEMENT,
                            RedissonNamespaceParserSupport.LIVE_OBJECT_REGISTRATION_ELEMENT
                        },
                        RedissonNamespaceParserSupport.LIVE_OBJECT_SERVICE_REF_ATTRIBUTE);
        
        RedissonGenericObjectDefinitionParser liveObjectServiceParser
                = new RedissonGenericObjectDefinitionParser(helper,
                        liveObjectServiceDecorator);
        
        //root beans
        registerBeanDefinitionParser("client",
                new RedissonDefinitionParser(helper));
        registerBeanDefinitionParser("redis", new RedisDefinitionParser(helper));
        //object parsers
        registerBeanDefinitionParser("binary-stream", defaultParser);
        registerBeanDefinitionParser("geo", defaultParser);
        registerBeanDefinitionParser("set-cache", defaultParser);
        registerBeanDefinitionParser("map-cache", defaultParser);
        registerBeanDefinitionParser("bucket", defaultParser);
        registerBeanDefinitionParser("buckets", defaultParser);
        registerBeanDefinitionParser("hyper-log-log", defaultParser);
        registerBeanDefinitionParser("list", defaultParser);
        registerBeanDefinitionParser("list-multimap", defaultParser);
        registerBeanDefinitionParser("list-multimap-cache", defaultParser);
        registerBeanDefinitionParser("local-cached-map",
                new RedissonGenericObjectDefinitionParser(helper,
                        new LocalCachedMapOptionsDecorator()));
        registerBeanDefinitionParser("map", defaultParser);
        registerBeanDefinitionParser("set-multimap", defaultParser);
        registerBeanDefinitionParser("set-multimap-cache", defaultParser);
        registerBeanDefinitionParser("semaphore", defaultParser);
        registerBeanDefinitionParser("permit-expirable-semaphore", defaultParser);
        registerBeanDefinitionParser("lock", defaultParser);
        registerBeanDefinitionParser("fair-lock", defaultParser);
        registerBeanDefinitionParser("read-write-lock",readWriteLockParser);
        registerBeanDefinitionParser("read-lock", readAndWriteLockParser);
        registerBeanDefinitionParser("write-lock", readAndWriteLockParser);
        registerBeanDefinitionParser("multi-lock", nestedParser);
        registerBeanDefinitionParser("red-lock", nestedParser);
        registerBeanDefinitionParser("set", defaultParser);
        registerBeanDefinitionParser("sorted-set", defaultParser);
        registerBeanDefinitionParser("scored-sorted-set", defaultParser);
        registerBeanDefinitionParser("lex-sorted-set", defaultParser);
        registerBeanDefinitionParser("topic", defaultParser);
        registerBeanDefinitionParser("pattern-topic", defaultParser);
        registerBeanDefinitionParser("blocking-fair-queue", defaultParser);
        registerBeanDefinitionParser("queue", defaultParser);
        registerBeanDefinitionParser("delayed-queue",
                new RedissonGenericObjectDefinitionParser(helper,
                        new DelayedQueueDecorator()));
        registerBeanDefinitionParser("priority-queue", defaultParser);
        registerBeanDefinitionParser("priority-deque", defaultParser);
        registerBeanDefinitionParser("blocking-queue", defaultParser);
        registerBeanDefinitionParser("bounded-blocking-queue", defaultParser);
        registerBeanDefinitionParser("deque", defaultParser);
        registerBeanDefinitionParser("blocking-deque", defaultParser);
        registerBeanDefinitionParser("atomic-long", defaultParser);
        registerBeanDefinitionParser("atomic-double", defaultParser);
        registerBeanDefinitionParser("count-down-latch", defaultParser);
        registerBeanDefinitionParser("bit-set", defaultParser);
        registerBeanDefinitionParser("bloom-filter", defaultParser);
        registerBeanDefinitionParser("script", defaultParser);
        registerBeanDefinitionParser("executor-service", defaultParser);//nested unfinished
        registerBeanDefinitionParser("remote-service", remoteServiceParser);
        registerBeanDefinitionParser("rpc-server",
                new RedissonRPCServerDefinitionParser(helper));
        registerBeanDefinitionParser("rpc-client",
                new RedissonRPCClientDefinitionParser(helper,
                        new RemoteInvocationOptionDecorator()));
        registerBeanDefinitionParser("keys", defaultParser);
        registerBeanDefinitionParser("live-object-service", liveObjectServiceParser);
        registerBeanDefinitionParser("live-object",
                new RedissonLiveObjectDefinitionParser(helper));
        registerBeanDefinitionParser("live-object-registration",
                new RedissonLiveObjectRegistrationDefinitionParser(helper));
    }
    
}
