/*
* 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 com.asual.summer.core.resource;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.core.Ordered;
import org.springframework.core.io.Resource;
import org.springframework.core.io.ResourceEditor;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.util.ResourceUtils;
/**
*
* @author Rostislav Hristov
* @author Rostislav Georgiev
*
*/
public class PropertyResource extends AbstractResource implements BeanFactoryPostProcessor {
private ExtendedPropertyPlaceholderConfigurer eppc;
private final Log logger = LogFactory.getLog(getClass());
private Resource[] resources;
public PropertyResource() {
setOrder(Ordered.HIGHEST_PRECEDENCE);
eppc = ExtendedPropertyPlaceholderConfigurer.get(this);
}
public Object getProperty(String key) {
return eppc.getProperty(key);
}
/*public void setProperties(Properties properties) {
eppc.setProperties(properties);
}*/
/*
public void setPropertiesArray(Properties[] propertiesArray) {
eppc.setPropertiesArray(propertiesArray);
}*/
public void setIgnoreResourceNotFound(boolean ignoreResourceNotFound) {
eppc.setIgnoreResourceNotFound(ignoreResourceNotFound);
}
public void setLocation(String location) {
ResourceEditor editor = (ResourceEditor) BeanUtils.findEditorByConvention(Resource.class);
this.resources = new Resource[] {locationStringToResource(location, editor)};
}
public void setLocations(String[] locations) {
ResourceEditor editor = (ResourceEditor) BeanUtils.findEditorByConvention(Resource.class);
Resource[] resources = new Resource[locations.length];
for (int i = 0; i < locations.length; i++) {
resources[i] = locationStringToResource(locations[i], editor);
}
this.resources = resources;
}
public void setLocations(List<String> locations){
setLocations(locations.toArray(new String[locations.size()]));
}
private Resource locationStringToResource(String location, ResourceEditor editor){
editor.setAsText(location);
return (Resource) editor.getValue();
}
public void setWildcardLocations(String[] locations) {
PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
List<Resource[]> resourceLocations = new ArrayList<Resource[]>();
List<Resource> fileResources = new ArrayList<Resource>();
List<Resource> jarResources = new ArrayList<Resource>();
for (String location : locations) {
try {
Resource[] wildcard = resolver.getResources(location);
if (wildcard != null && wildcard.length > 0) {
resourceLocations.add(wildcard);
}
} catch (IOException e) {
logger.error(e.getMessage(), e);
}
}
int i = 0;
boolean entries = true;
while(entries) {
entries = false;
for (Resource[] location : resourceLocations) {
if (location.length > i) {
try {
boolean isJar = ResourceUtils.isJarURL(location[i].getURL());
if (isJar) {
jarResources.add(location[i]);
} else {
fileResources.add(location[i]);
}
} catch (IOException e) {
logger.error(e.getMessage(), e);
}
entries = true;
}
}
i++;
}
fileResources.addAll(jarResources);
Collections.reverse(fileResources);
this.resources = fileResources.toArray(new Resource[fileResources.size()]);
}
public void postProcessBeanFactory(
ConfigurableListableBeanFactory beanFactory) throws BeansException {
eppc.postProcessBeanFactory(beanFactory);
}
protected void reloadPropertyPlaceholderConfigurer(){
eppc.updateLocations();
}
/**
* @return the locations
*/
public Resource[] getResources() {
return resources;
}
}