| 1 |  |   | 
  | 2 |  |   | 
  | 3 |  |   | 
  | 4 |  |   | 
  | 5 |  |   | 
  | 6 |  |   | 
  | 7 |  |   | 
  | 8 |  |   | 
  | 9 |  |   | 
  | 10 |  |   | 
  | 11 |  |   | 
  | 12 |  |   | 
  | 13 |  |   | 
  | 14 |  |   | 
  | 15 |  |   | 
  | 16 |  |  package org.kuali.student.common.util; | 
  | 17 |  |   | 
  | 18 |  |  import java.util.HashSet; | 
  | 19 |  |  import java.util.Properties; | 
  | 20 |  |   | 
  | 21 |  |  import org.springframework.beans.BeansException; | 
  | 22 |  |  import org.springframework.beans.factory.BeanDefinitionStoreException; | 
  | 23 |  |  import org.springframework.beans.factory.BeanFactory; | 
  | 24 |  |  import org.springframework.beans.factory.InitializingBean; | 
  | 25 |  |  import org.springframework.beans.factory.config.BeanDefinition; | 
  | 26 |  |  import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; | 
  | 27 |  |  import org.springframework.beans.factory.config.PropertyPlaceholderConfigurer; | 
  | 28 |  |  import org.springframework.core.io.DefaultResourceLoader; | 
  | 29 |  |  import org.springframework.core.io.Resource; | 
  | 30 |  |  import org.springframework.util.StringValueResolver; | 
  | 31 |  |   | 
  | 32 | 13 |  public class ModPropertyPlaceholderConfigurer extends | 
  | 33 |  |                  PropertyPlaceholderConfigurer implements InitializingBean  { | 
  | 34 |  |           | 
  | 35 |  |          private String customConfigSystemProperty; | 
  | 36 |  |          private String customConfigFileLocation; | 
  | 37 |  |          private Resource[] locations;         | 
  | 38 |  |           | 
  | 39 |  |          private String beanName; | 
  | 40 |  |          private BeanFactory beanFactory; | 
  | 41 |  |          private String nullValue; | 
  | 42 |  |           | 
  | 43 |  |           | 
  | 44 |  |          public String getCustomConfigSystemProperty() { | 
  | 45 | 0 |                  return customConfigSystemProperty; | 
  | 46 |  |          } | 
  | 47 |  |   | 
  | 48 |  |          public void setCustomConfigSystemProperty(String customConfigSystemProperty) { | 
  | 49 | 0 |                  this.customConfigSystemProperty = customConfigSystemProperty; | 
  | 50 | 0 |          } | 
  | 51 |  |   | 
  | 52 |  |          @Override | 
  | 53 |  |          public void setLocations(Resource[] locations) { | 
  | 54 | 1 |                  this.locations=locations; | 
  | 55 | 1 |                  super.setLocations(locations); | 
  | 56 |  |                   | 
  | 57 | 1 |          } | 
  | 58 |  |   | 
  | 59 |  |          @Override | 
  | 60 |  |          public void afterPropertiesSet() throws Exception { | 
  | 61 | 1 |                  if(customConfigSystemProperty!=null){ | 
  | 62 | 0 |                          String customConfigLocation = System.getProperty(customConfigSystemProperty); | 
  | 63 |  |                          try{ | 
  | 64 | 0 |                                  customConfigLocation = this.parseStringValue(customConfigLocation, System.getProperties(), new HashSet<String>()); | 
  | 65 |  |   | 
  | 66 | 0 |                                  Resource customConfigResource = new DefaultResourceLoader().getResource(customConfigLocation); | 
  | 67 | 0 |                                  if(customConfigResource.exists()){ | 
  | 68 | 0 |                                          Resource[] finalLocations = new Resource[locations.length+1]; | 
  | 69 | 0 |                                          int i=0; | 
  | 70 | 0 |                                          for(Resource resource:locations){ | 
  | 71 | 0 |                                                  finalLocations[i]=resource; | 
  | 72 | 0 |                                                  i++; | 
  | 73 |  |                                          } | 
  | 74 | 0 |                                          finalLocations[i]=customConfigResource; | 
  | 75 |  |                                           | 
  | 76 | 0 |                                          super.setLocations(finalLocations); | 
  | 77 | 0 |                                  }else{ | 
  | 78 | 0 |                                          logger.warn("File does not exist:"+customConfigLocation); | 
  | 79 |  |                                  } | 
  | 80 | 0 |                          }catch(Exception e){ | 
  | 81 | 0 |                                  logger.warn("Could not load custom properties from property:"+customConfigSystemProperty+" location:"+customConfigLocation); | 
  | 82 | 0 |                          } | 
  | 83 |  |                  } | 
  | 84 | 1 |                  if(customConfigFileLocation!=null){ | 
  | 85 | 1 |                          String location = this.parseStringValue(customConfigFileLocation, System.getProperties(), new HashSet<String>()); | 
  | 86 |  |                          try{ | 
  | 87 | 1 |                                  Resource customConfigResource = new DefaultResourceLoader().getResource(location); | 
  | 88 |  |                   | 
  | 89 | 1 |                                  if(customConfigResource.exists()){ | 
  | 90 | 1 |                                          Resource[] finalLocations = new Resource[locations.length+1]; | 
  | 91 | 1 |                                          int i=0; | 
  | 92 | 2 |                                          for(Resource resource:locations){ | 
  | 93 | 1 |                                                  finalLocations[i] = resource; | 
  | 94 | 1 |                                                  i++; | 
  | 95 |  |                                          } | 
  | 96 | 1 |                                          finalLocations[i] = customConfigResource; | 
  | 97 |  |                                           | 
  | 98 | 1 |                                          super.setLocations(finalLocations); | 
  | 99 | 1 |                                  }else{ | 
  | 100 | 0 |                                          logger.warn("File does not exist:"+location); | 
  | 101 |  |                                  } | 
  | 102 | 0 |                          }catch(Exception e){ | 
  | 103 | 0 |                                  logger.warn("Could not load custom properties from file:"+location); | 
  | 104 | 1 |                          } | 
  | 105 |  |                  } | 
  | 106 | 1 |          } | 
  | 107 |  |   | 
  | 108 |  |          @Override | 
  | 109 |  |          public void setBeanName(String beanName) { | 
  | 110 | 1 |                  this.beanName = beanName; | 
  | 111 | 1 |                  super.setBeanName(beanName); | 
  | 112 | 1 |          } | 
  | 113 |  |   | 
  | 114 |  |          @Override | 
  | 115 |  |          public void setBeanFactory(BeanFactory beanFactory) { | 
  | 116 | 1 |                  this.beanFactory = beanFactory; | 
  | 117 | 1 |                  super.setBeanFactory(beanFactory); | 
  | 118 | 1 |          } | 
  | 119 |  |           | 
  | 120 |  |          @Override | 
  | 121 |  |          public void setNullValue(String nullValue) { | 
  | 122 | 0 |                  this.nullValue = nullValue; | 
  | 123 | 0 |                  super.setNullValue(nullValue); | 
  | 124 | 0 |          } | 
  | 125 |  |           | 
  | 126 |  |          @Override | 
  | 127 |  |          protected void processProperties(ConfigurableListableBeanFactory beanFactoryToProcess, Properties props) | 
  | 128 |  |                          throws BeansException { | 
  | 129 |  |   | 
  | 130 | 1 |                  StringValueResolver valueResolver = new PlaceholderResolvingStringValueResolver(props); | 
  | 131 | 1 |                  ModBeanDefinitionVisitor visitor = new ModBeanDefinitionVisitor(valueResolver); | 
  | 132 |  |                   | 
  | 133 | 1 |                  String[] beanNames = beanFactoryToProcess.getBeanDefinitionNames(); | 
  | 134 | 4 |                  for (int i = 0; i < beanNames.length; i++) { | 
  | 135 |  |                           | 
  | 136 |  |                           | 
  | 137 | 3 |                          if (!(beanNames[i].equals(this.beanName) && beanFactoryToProcess.equals(this.beanFactory))) { | 
  | 138 | 2 |                                  BeanDefinition bd = beanFactoryToProcess.getBeanDefinition(beanNames[i]); | 
  | 139 |  |                                  try { | 
  | 140 | 2 |                                          visitor.visitBeanDefinition(bd); | 
  | 141 |  |                                  } | 
  | 142 | 0 |                                  catch (BeanDefinitionStoreException ex) { | 
  | 143 | 0 |                                          throw new BeanDefinitionStoreException(bd.getResourceDescription(), beanNames[i], ex.getMessage()); | 
  | 144 | 2 |                                  } | 
  | 145 |  |                          } | 
  | 146 |  |                  } | 
  | 147 |  |                   | 
  | 148 |  |                   | 
  | 149 | 1 |                  beanFactoryToProcess.resolveAliases(valueResolver); | 
  | 150 | 1 |          } | 
  | 151 |  |           | 
  | 152 |  |           | 
  | 153 |  |   | 
  | 154 |  |   | 
  | 155 |  |   | 
  | 156 |  |   | 
  | 157 | 1 |          public class PlaceholderResolvingStringValueResolver implements StringValueResolver { | 
  | 158 |  |   | 
  | 159 |  |                  private final Properties props; | 
  | 160 |  |   | 
  | 161 | 1 |                  public PlaceholderResolvingStringValueResolver(Properties props) { | 
  | 162 | 1 |                          this.props = props; | 
  | 163 | 1 |                  } | 
  | 164 |  |   | 
  | 165 |  |                  public String resolveStringValue(String strVal) throws BeansException { | 
  | 166 | 6 |                          String value = parseStringValue(strVal, this.props, new HashSet<String>()); | 
  | 167 | 6 |                          return (value.equals(nullValue) ? null : value); | 
  | 168 |  |                  } | 
  | 169 |  |                   | 
  | 170 |  |                  public Properties resolvePropertyValue(String strVal){ | 
  | 171 | 0 |                          Properties prefixedProps = new Properties(); | 
  | 172 |  |                           | 
  | 173 | 0 |                          for(Object key:props.keySet()){ | 
  | 174 | 0 |                                  String keyStr = (String)key;  | 
  | 175 | 0 |                                  if(keyStr.startsWith(strVal)){ | 
  | 176 | 0 |                                          String newKeyStr = keyStr.substring(strVal.length()+1); | 
  | 177 | 0 |                                          prefixedProps.put(newKeyStr, resolveStringValue((String)props.get(key))); | 
  | 178 |  |                                  } | 
  | 179 | 0 |                          } | 
  | 180 |  |                           | 
  | 181 | 0 |                          return prefixedProps; | 
  | 182 |  |                  } | 
  | 183 |  |                   | 
  | 184 |  |          } | 
  | 185 |  |   | 
  | 186 |  |          public String getCustomConfigFileLocation() { | 
  | 187 | 0 |                  return customConfigFileLocation; | 
  | 188 |  |          } | 
  | 189 |  |   | 
  | 190 |  |          public void setCustomConfigFileLocation(String customConfigFileLocation) { | 
  | 191 | 1 |                  this.customConfigFileLocation = customConfigFileLocation; | 
  | 192 | 1 |          } | 
  | 193 |  |  } |