blob: 77270ec2d078bcbc94fdd92647a937935abd3860 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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.apache.servicecomb.foundation.common.config;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Properties;
import org.apache.commons.lang3.StringUtils;
import org.apache.servicecomb.foundation.common.config.impl.PropertiesLoader;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.core.io.support.ResourcePatternResolver;
public class PaaSResourceUtils extends org.springframework.util.ResourceUtils {
public static final String PROPERTIES_SUFFIX = ".properties";
private static final ResourcePatternResolver resourcePatternResolver = new PathMatchingResourcePatternResolver();
/**
* 失败,则返回空数组
*/
public static Resource[] getResources(String locationPattern) {
try {
return resourcePatternResolver.getResources(locationPattern);
} catch (IOException e) {
return new Resource[0];
}
}
/**
* 失败,则返回空列表
*/
public static List<Resource> getResources(String... locationPatterns) {
List<Resource> ret = new ArrayList<>();
for (String locationPattern : locationPatterns) {
Resource[] resArr = getResources(locationPattern);
ret.addAll(Arrays.asList(resArr));
}
return ret;
}
/**
* 文件同名时,jar的优先级比较低
* jar: xxx.xml
* jar: xxx.model.xml
* file:xxx.xml
* 调用者保证,所有res的后缀都是suffix
* file文件应该只有一个,因为放在目录中的配置文件,应该是最终的部署定制文件
* 此时,还分多个,是不合适的
*/
public static void sortResources(List<Resource> resList, String suffix) {
resList.sort((o1, o2) -> {
try {
// jar的优先级比较低
if (isJarURL(o1.getURL()) && isFileURL(o2.getURL())) {
return -1;
}
// 干掉后缀,再排序
String name1 = o1.getFilename();
String name2 = o2.getFilename();
//Resource.getFilename接口会返回null,当路径的文件名不存在时
//配置文件一定存在,并且Resource有合法的文件名,name1和name2不可能为空,
//这里做判断是为了处理CodeDEX报的null引用
if (StringUtils.isEmpty(name1) || StringUtils.isEmpty(name2)) {
throw new IOException(
String.format("Resource %s or %s is not a file", o1.getURI(), o2.getURI()));
}
name1 = name1.substring(0, name1.length() - suffix.length());
name2 = name2.substring(0, name2.length() - suffix.length());
return name1.compareTo(name2);
} catch (IOException e) {
throw new RuntimeException(e);
}
});
}
public static void sortProperties(List<Resource> resList) {
sortResources(resList, PROPERTIES_SUFFIX);
}
public static List<Resource> getSortedResources(String locationPattern, String suffix) {
if (StringUtils.isEmpty(locationPattern)) {
throw new RuntimeException("Resource path must not be null or empty");
}
if (!locationPattern.endsWith(suffix)) {
throw new RuntimeException("Resource path must ends with " + suffix);
}
String prefix = locationPattern.substring(0, locationPattern.length() - suffix.length());
List<Resource> resList = PaaSResourceUtils.getResources(locationPattern, prefix + ".*" + suffix);
sortResources(resList, suffix);
return resList;
}
public static List<Resource> getSortedPorperties(String locationPattern) {
return getSortedResources(locationPattern, PROPERTIES_SUFFIX);
}
public static Properties loadMergedProperties(String locationPattern) throws Exception {
PropertiesLoader loader = new PropertiesLoader(Arrays.asList(locationPattern));
return loader.load();
}
}