zoukankan      html  css  js  c++  java
  • OpenSSO源码分析之配置篇(SystemProperties类分析)

    这个类提供了允许访问单点登录系统有关的系统属性。

    这个系统属性能够通过几个方式进行设置:

    以编程方式调用 initializeProperties方法,或者通过static 方法从AMConfig.properties文件中加载。

    该类中有以下几个属性用来存储属性信息:

    • Map attributeMap  //存储serverAttributeMap.properties文件中的属性,Property name to service attribute schema name mapping
    • Properties props  //存储AMConfig.properties文件中的属性
    • Map mapTagswap = new HashMap(); //KEY是某个System的属性的别名,value为某个System的属性名,这样可以避免在程序中直接引      用System的属性名
    • Map tagswapValues   //key保存着某个System的属性的别名,value保存着System的属性的值

    主要对外暴露出以下方法:

    • public static String get(String key)

    //查询系统属性(如果是server模式,SMS services中查找,然后在props中查找,否则只在props中查找)

    //如果查找到的属性值中有System的属性的别名占位符的话,通过tagswapValues变量进行替换

    • public static String get(String key, String def)
    • public static Properties getProperties()
    • public static Properties getAll()
    • public static synchronized void initializeProperties(String file)
    • public static synchronized void initializeProperties(Properties properties)
    • public static synchronized void initializeProperties(Properties properties,boolean reset)  //将被OpenSSO调用
    • public static synchronized void initializeProperties(Properties properties,boolean reset,boolean withDefaults)
    • public static synchronized void initializeProperties(String propertyName,String propertyValue)
    • public static boolean isServerMode()
    • public static Map getAttributeMap()

    在该类中有两个static代码块,用来加载属性信息

    View Code
     1 private static void initAttributeMapping() {
     2  ResourceBundle rb = ResourceBundle.getBundle("serverAttributeMap");
     3      for (Enumeration e = rb.getKeys(); e.hasMoreElements(); ) {
     4             String propertyName = (String)e.nextElement();
     5             attributeMap.put(propertyName, new AttributeStruct(
     6                 rb.getString(propertyName)));
     7      }
     8 }
     9 
    10 //加载serverAttributeMap.properties文件中的属性到attributeMap中
    View Code
     1 static {
     2         mapTagswap.put("%SERVER_PORT%", Constants.AM_SERVER_PORT);
     3         mapTagswap.put("%SERVER_URI%", Constants.AM_SERVICES_DEPLOYMENT_DESCRIPTOR);
     4         mapTagswap.put("%SERVER_HOST%", Constants.AM_SERVER_HOST);
     5         mapTagswap.put("%SERVER_PROTO%", Constants.AM_SERVER_PROTOCOL);
     6         mapTagswap.put("%BASE_DIR%", CONFIG_PATH);
     7         
     8         try {
     9             // Initialize properties
    10             props = new Properties();
    11 
    12             // Load properties from file
    13             String serverName = System.getProperty(SERVER_NAME_PROPERTY);
    14             // 如果配置文件名的属性不存在,默认为AMConfig.properties
    15             String configName = System.getProperty(CONFIG_NAME_PROPERTY,AMCONFIG_FILE_NAME);
    16             String fname = null;
    17             FileInputStream fis = null;
    18             if (serverName != null) { //如果有多个服务实例,则每个实例会访问各自的配置文件
    19                 serverName = serverName.replace('.', '_');
    20                 fname = configName + "-" + serverName;
    21             } else {
    22                 fname = configName;
    23             }
    24              //把AMConfig.properties中的属性追加到props变量中,并修改最后编辑时间
    25             initializeProperties(fname);
    26 
    27             // Get the location of the new configuration file in case
    28             // of single war deployment
    29              //以下提供了扩展配置的机制,如果需要,得先在AMConfig.properties属性中
    30 //配置com.sun.identity.configFilePath属性
    31             try {
    32                 String newConfigFileLoc = props.getProperty(Constants.AM_NEW_CONFIGFILE_PATH);
    33                 if ((newConfigFileLoc != null) && (newConfigFileLoc.length() > 0) && 
    34                     !newConfigFileLoc.equals(NEWCONFDIR) ) {
    35                     String hostName = InetAddress.getLocalHost().getHostName().toLowerCase();
    36                     String serverURI = props.getProperty( Constants.AM_SERVICES_DEPLOYMENT_DESCRIPTOR);
    37                     serverURI = serverURI.replace('/', '_').toLowerCase();
    38                     StringBuffer fileName = new StringBuffer();
    39                     fileName.append(newConfigFileLoc).append("/").append(
    40                             AMCONFIG_FILE_NAME).append(serverURI).append(
    41                             hostName).append(props.getProperty(Constants.AM_SERVER_PORT))
    42                             .append(".").append(PROPERTIES);
    43                     Properties modProp = new Properties();
    44                     try {
    45                         fis = new FileInputStream(fileName.toString());
    46                         modProp.load(fis);
    47                         props.putAll(modProp);
    48                     } catch (IOException ioe) {
    49                         StringBuffer fileNameOrig = new StringBuffer();
    50                         fileNameOrig.append(newConfigFileLoc).append("/")
    51                                 .append(AMCONFIG_FILE_NAME).append(".").append(
    52                                         PROPERTIES);
    53                         try {
    54                             fis = new FileInputStream(fileNameOrig.toString());
    55                             modProp.load(fis);
    56                             props.putAll(modProp);
    57                         } catch (IOException ioexp) {
    58                             saveException(ioexp);
    59                         }
    60                     } finally {
    61                         if (fis != null) {
    62                             fis.close();
    63                         }
    64                     }
    65                 }
    66             } catch (Exception ex) {
    67                 saveException(ex);
    68             }
    69         } catch (MissingResourceException e) {
    70             // Can't print the message to debug due to dependency
    71             // Save it as a String and provide when requested.
    72             ByteArrayOutputStream baos = new ByteArrayOutputStream();
    73             e.printStackTrace(new PrintStream(baos));
    74             initError = baos.toString();
    75             try {
    76                 baos.close();
    77             } catch (IOException ioe) {
    78                 // Should not happend, ignore the exception
    79             }
    80         }
    81     }
  • 相关阅读:
    多线程
    带缓存的字符输入输出流
    输入输出流(I/O)
    课本235页2-3题
    包装&工具类
    集合类SetMap
    tp框架之增删改查
    tp框架之数据添加
    tp框架之查询
    tp框架之Model类与命名空间
  • 原文地址:https://www.cnblogs.com/hzhuxin/p/2825436.html
Copyright © 2011-2022 走看看