/* * Copyright 2007-2009 the original author or authors. * * 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 net.paoding.rose.load.context.core; import java.io.IOException; import java.util.Arrays; import java.util.LinkedList; import java.util.List; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.core.io.Resource; import org.springframework.core.io.support.PathMatchingResourcePatternResolver; import org.springframework.core.io.support.ResourcePatternResolver; import net.paoding.rose.load.LoadScope; import net.paoding.rose.load.ResourceRef; import net.paoding.rose.load.RoseScanner; /** * * @author 王志亮 [qieqie.wang@gmail.com] * */ public class RoseResources { protected static Log logger = LogFactory.getLog(RoseResources.class); public static List<Resource> findContextResources(LoadScope load) throws IOException { String[] scopeValues = load.getScope("applicationContext"); return findContextResources(scopeValues); } public static List<Resource> findContextResources(String[] scope) throws IOException { if (logger.isInfoEnabled()) { logger.info("[applicationContext] start to found applicationContext files ..."); } if (logger.isDebugEnabled()) { if (scope == null) { logger.debug("[applicationContext] use default scope" + " [all class folders and rosed jar files]"); } else { logger.debug("[applicationContext] use scope: " + Arrays.toString(scope)); } } if (logger.isDebugEnabled()) { logger.debug("[applicationContext] call 'findFiles'"); } List<ResourceRef> resources = RoseScanner.getInstance().getJarOrClassesFolderResources( scope); if (logger.isDebugEnabled()) { logger.debug("[applicationContext] exits from 'findFiles'"); logger.debug("[applicationContext] it has " + resources.size() + " classes folders or jar files " + "in the applicationContext scope: " + resources); logger.debug("[applicationContext] iterates the 'findFiles'" + " classes folders or jar files; size=" + resources.size()); } List<Resource> ctxResources = new LinkedList<Resource>(); ResourcePatternResolver resourcePatternResolver = new PathMatchingResourcePatternResolver(); int index = 0; for (ResourceRef ref : resources) { index++; if (ref.hasModifier("applicationContext")) { Resource[] founds = ref.getInnerResources(resourcePatternResolver, "applicationContext*.xml"); List<Resource> asList = Arrays.asList(founds); ctxResources.addAll(asList); if (logger.isDebugEnabled()) { logger.debug("[applicationContext] found applicationContext resources (" + index + "/" + resources.size() + ": " + asList); } } else { if (logger.isDebugEnabled()) { logger.debug("[applicationContext] ignored bacause not marked as" + " 'rose:applicationContext' or 'rose:*' (" + index + "/" + resources.size() + ": " + ref); } } } if (logger.isInfoEnabled()) { logger.info("[applicationContext] FOUND " + ctxResources.size() + " applcationContext files: " + ctxResources); } return ctxResources; } public static String[] findMessageBasenames(LoadScope load) throws IOException { String[] scopeValues = load.getScope("messages"); return findMessageBasenames(scopeValues); } public static String[] findMessageBasenames(String[] scope) throws IOException { if (logger.isInfoEnabled()) { logger.info("[messages] start to found rose.root 'messages' files ..."); } if (logger.isDebugEnabled()) { logger.debug("[messages] call 'scoped'"); } List<ResourceRef> resources = RoseScanner.getInstance().getJarOrClassesFolderResources( scope); if (logger.isDebugEnabled()) { logger.debug("[messages] exits from 'scoped'"); logger.debug("[messages] it has " + resources.size() + " classes folders or jar files " + "in the messages scope: " + resources); logger.debug("[messages] iterates the 'scoped'" + " classes folders or jar files; size=" + resources.size()); } List<String> messagesResources = new LinkedList<String>(); int index = 0; for (ResourceRef ref : resources) { index++; if (ref.hasModifier("messages")) { messagesResources.add(ref.getInnerResourcePattern("messages")); if (logger.isDebugEnabled()) { logger.debug("[messages] add messages base name (" + index + "/" + resources.size() + ": " + ref); } } else { if (logger.isDebugEnabled()) { logger .debug("[messages] ignored bacause not marked as 'rose:messages' or 'rose:*' (" + index + "/" + resources.size() + ": " + ref); } } } if (logger.isInfoEnabled()) { logger.info("[messages] found " + messagesResources.size() + " messages base names: " + messagesResources); } return messagesResources.toArray(new String[0]); } }