/*
* Copyright (c) 2002-2012 Alibaba Group Holding Limited.
* All rights reserved.
*
* 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.alibaba.citrus.springext.impl;
import static com.alibaba.citrus.util.Assert.*;
import static com.alibaba.citrus.util.CollectionUtil.*;
import static com.alibaba.citrus.util.StringUtil.*;
import static java.util.Collections.*;
import java.io.IOException;
import java.util.List;
import com.alibaba.citrus.springext.ResourceResolver;
import com.alibaba.citrus.springext.ResourceResolver.Resource;
import com.alibaba.citrus.springext.support.ClasspathResourceResolver;
import org.slf4j.Logger;
import org.springframework.util.ClassUtils;
final class ConfigurationPointSettings {
public final ResourceResolver resourceResolver;
public final String baseLocation;
public final ClassLoader classLoader;
/**
* 从指定<code>ResourceResolver</code>中装载configuration points和contributions。
* 所有contribution classes都<em>不会</em>被创建和注册。
* 对于IDE plugin,此构造函数将被调用。
*/
ConfigurationPointSettings(ResourceResolver resourceResolver, String configurationPointsLocation) {
this(null, resourceResolver, configurationPointsLocation);
}
/**
* 从class loader中装载configuration points和contributions。
* 所有contribution classes也会被创建和注册。
*/
ConfigurationPointSettings(ClassLoader classLoader, String configurationPointsLocation) {
this(classLoader, null, configurationPointsLocation);
}
private ConfigurationPointSettings(ClassLoader classLoader, ResourceResolver resourceResolver, String configurationPointsLocation) {
if (resourceResolver == null) {
if (classLoader == null) {
classLoader = ClassUtils.getDefaultClassLoader();
}
this.classLoader = classLoader;
this.resourceResolver = new ClasspathResourceResolver(classLoader);
} else {
// 对于IDE plugin运行环境,不需要创建和注册contribution class类,因此也不需要classLoader。
this.classLoader = null;
this.resourceResolver = resourceResolver;
}
assertNotNull(configurationPointsLocation, "configurationPointsLocation");
this.baseLocation = configurationPointsLocation.substring(0, configurationPointsLocation.lastIndexOf("/") + 1);
}
Resource getResourceFromRelativeLocation(String relativeLocation, Logger log) {
String location = toAbsoluteLocation(relativeLocation);
if (log != null) {
log.trace("Trying to find resource at {}", location);
}
return resourceResolver.getResource(location);
}
List<Resource> getResourcesFromRelativeLocationPattern(String relativeLocationPattern, Logger log) {
String locationPattern = toAbsoluteLocation(relativeLocationPattern);
if (log != null) {
log.trace("Trying to find resources at {}", locationPattern);
}
try {
return createArrayList(resourceResolver.getResources(locationPattern));
} catch (IOException e) {
if (log != null) {
log.warn("Failed to load resources: {}: {}", relativeLocationPattern, e);
}
return emptyList();
}
}
private String toAbsoluteLocation(String relativeLocationPattern) {
return baseLocation + assertNotNull(trimToNull(relativeLocationPattern), "locationPattern");
}
}