Eliminate infinite busy wait in KarafIniWebEnvironment
[aaa.git] / aaa-shiro / impl / src / main / java / org / opendaylight / aaa / shiro / web / env / KarafIniWebEnvironment.java
1 /*
2  * Copyright (c) 2015 - 2017 Brocade Communications Systems, Inc. and others.  All rights reserved.
3  *
4  * This program and the accompanying materials are made available under the
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6  * and is available at http://www.eclipse.org/legal/epl-v10.html
7  */
8
9 package org.opendaylight.aaa.shiro.web.env;
10
11 import java.util.List;
12 import java.util.concurrent.ExecutionException;
13 import org.apache.shiro.SecurityUtils;
14 import org.apache.shiro.config.Ini;
15 import org.apache.shiro.config.IniSecurityManagerFactory;
16 import org.apache.shiro.mgt.SecurityManager;
17 import org.apache.shiro.util.Factory;
18 import org.apache.shiro.web.env.IniWebEnvironment;
19 import org.opendaylight.aaa.AAAShiroProvider;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.aaa.app.config.rev170619.ShiroConfiguration;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.aaa.app.config.rev170619.shiro.configuration.Main;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.aaa.app.config.rev170619.shiro.configuration.Urls;
23 import org.slf4j.Logger;
24 import org.slf4j.LoggerFactory;
25
26 /**
27  * Identical to <code>IniWebEnvironment</code> except the Ini is loaded from
28  * <code>${KARAF_HOME}/etc/shiro.ini</code>.
29  */
30 public class KarafIniWebEnvironment extends IniWebEnvironment {
31
32     private static final Logger LOG = LoggerFactory.getLogger(KarafIniWebEnvironment.class);
33
34     private static final String MAIN_SECTION_HEADER = "main";
35     private static final String URLS_SECTION_HEADER = "urls";
36
37     public KarafIniWebEnvironment() {
38         LOG.info("Initializing the Web Environment using {}",
39                 KarafIniWebEnvironment.class.getName());
40     }
41
42     private static Ini createIniFromClusteredAppConfig(
43             final ShiroConfiguration shiroConfiguration) {
44
45         final Ini ini = new Ini();
46
47         final Ini.Section mainSection = ini.addSection(MAIN_SECTION_HEADER);
48         final List<Main> mains = shiroConfiguration.getMain();
49         for (final Main main : mains) {
50             mainSection.put(main.getPairKey(), main.getPairValue());
51         }
52
53         final Ini.Section urlsSection = ini.addSection(URLS_SECTION_HEADER);
54         final List<Urls> urls = shiroConfiguration.getUrls();
55         for (final Urls url : urls) {
56             urlsSection.put(url.getPairKey(), url.getPairValue());
57         }
58
59         final Factory<SecurityManager> factory = new IniSecurityManagerFactory(ini);
60         final SecurityManager securityManager = factory.getInstance();
61         SecurityUtils.setSecurityManager(securityManager);
62
63         return ini;
64     }
65
66     @Override
67     public void init() {
68         try {
69             AAAShiroProvider provider = AAAShiroProvider.getInstanceFuture().get();
70
71             // Initialize the Shiro environment from clustered-app-config
72             final Ini ini = createIniFromClusteredAppConfig(provider.getShiroConfiguration());
73             setIni(ini);
74             super.init();
75         } catch (InterruptedException | ExecutionException e) {
76             throw new RuntimeException("Error obtaining AAAShiroProvider", e);
77         }
78     }
79 }