package com.marklogic.client.modulesloader.impl; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import org.springframework.core.io.Resource; import org.springframework.core.io.support.PathMatchingResourcePatternResolver; import org.springframework.core.io.support.ResourcePatternResolver; import com.marklogic.client.modulesloader.Modules; import com.marklogic.client.modulesloader.ModulesFinder; /** * Default implementation that loads all of the different kinds of REST modules. */ public class DefaultModulesFinder extends BaseModulesFinder implements ModulesFinder { private ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(); @Override public Modules findModules(File baseDir) { Modules modules = new Modules(); addServices(modules, baseDir); addAssetDirectories(modules, baseDir); addOptions(modules, baseDir); addTransforms(modules, baseDir); addNamespaces(modules, baseDir); addPropertiesFile(modules, baseDir); return modules; } /** * This currently uses the Client REST API to load assets instead of XCC, as the XccAssetLoader is based on * FileVisitor, which doesn't work for classpath resources. * * @param basePath * @return */ public Modules findClasspathModules(String basePath) { try { Modules modules = new Modules(); modules.setAssets(findResources(basePath, "/ext/**/*.*")); modules.setNamespaces(findResources(basePath, "/namespaces/*.*")); modules.setOptions(findResources(basePath, "/options/*.xml")); modules.setServices(findResources(basePath, "/services/*.xq*")); modules.setTransforms(findResources(basePath, "/transforms/*.xq*", "/transforms/*.xsl*")); return modules; } catch (IOException ex) { throw new RuntimeException(ex); } } private List<Resource> findResources(String basePath, String... paths) throws IOException { List<Resource> list = new ArrayList<>(); for (String path : paths) { Resource[] r = resolver.getResources(basePath + path); list.addAll(Arrays.asList(r)); } return list; } }