package com.marklogic.client.modulesloader.impl;
import java.io.File;
import java.io.FilenameFilter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.springframework.core.io.FileSystemResource;
import org.springframework.core.io.Resource;
import com.marklogic.client.helper.FilenameUtil;
import com.marklogic.client.modulesloader.Modules;
import com.marklogic.client.modulesloader.ModulesFinder;
/**
* Abstract implementation that provides implementations for loading all the different kinds of modules, but doesn't
* actually implement findModules.
*/
public abstract class BaseModulesFinder implements ModulesFinder {
private FilenameFilter transformFilenameFilter = new TransformFilenameFilter();
private FilenameFilter namespaceFilenameFilter = new NamespaceFilenameFilter();
/**
* Whether to treat paths that aren't recognized by this class (i.e. not services, options, namespaces, or
* transforms) as asset paths that will then be loaded as asset modules.
*/
private boolean includeUnrecognizedPathsAsAssetPaths = true;
private String extPath = "ext";
private String rootPath = "root";
private String servicesPath = "services";
private String optionsPath = "options";
private String namespacesPath = "namespaces";
private String transformsPath = "transforms";
// special case for excluding from assets.
private String schemasPath = "schemas";
/**
* Only supports JSON for now.
*
* @param modules
* @param baseDir
*/
protected void addPropertiesFile(Modules modules, File baseDir) {
File jsonFile = new File(baseDir, "rest-properties.json");
if (jsonFile.exists()) {
modules.setPropertiesFile(new FileSystemResource(jsonFile));
}
}
protected void addServices(Modules modules, File baseDir) {
File servicesBaseDir = new File(baseDir, servicesPath);
List<Resource> services = new ArrayList<>();
if (servicesBaseDir.exists()) {
for (File f : servicesBaseDir.listFiles()) {
if (FilenameUtil.isXqueryFile(f.getName()) || FilenameUtil.isJavascriptFile(f.getName())) {
services.add(new FileSystemResource(f));
}
}
}
modules.setServices(services);
}
protected void addAssetDirectories(Modules modules, File baseDir) {
List<Resource> dirs = new ArrayList<>();
File dir = new File(baseDir, "ext");
if (dir.exists()) {
dirs.add(new FileSystemResource(dir));
}
dir = new File(baseDir, "root");
if (dir.exists()) {
dirs.add(new FileSystemResource(dir));
}
if (includeUnrecognizedPathsAsAssetPaths && baseDir != null && baseDir.exists()) {
List<String> recognizedPaths = getRecognizedPaths();
for (File f : baseDir.listFiles()) {
if (f.isDirectory() && !recognizedPaths.contains(f.getName())) {
dirs.add(new FileSystemResource(f));
}
}
}
modules.setAssetDirectories(dirs);
}
protected List<String> getRecognizedPaths() {
return Arrays
.asList(new String[] { extPath, rootPath, optionsPath, servicesPath, transformsPath, namespacesPath, schemasPath });
}
protected void addOptions(Modules modules, File baseDir) {
File queryOptionsBaseDir = new File(baseDir, optionsPath);
List<Resource> queryOptions = new ArrayList<>();
if (queryOptionsBaseDir.exists()) {
for (File f : queryOptionsBaseDir.listFiles()) {
String filename = f.getName();
if (filename.endsWith(".xml") || filename.endsWith(".json")) {
queryOptions.add(new FileSystemResource(f));
}
}
}
modules.setOptions(queryOptions);
}
protected void addNamespaces(Modules modules, File baseDir) {
File namespacesDir = new File(baseDir, namespacesPath);
List<Resource> namespaces = new ArrayList<>();
if (namespacesDir.exists()) {
for (File f : namespacesDir.listFiles(namespaceFilenameFilter)) {
namespaces.add(new FileSystemResource(f));
}
}
modules.setNamespaces(namespaces);
}
protected void addTransforms(Modules modules, File baseDir) {
File transformsBaseDir = new File(baseDir, transformsPath);
List<Resource> transforms = new ArrayList<>();
if (transformsBaseDir.exists()) {
for (File f : transformsBaseDir.listFiles(transformFilenameFilter)) {
transforms.add(new FileSystemResource(f));
}
}
modules.setTransforms(transforms);
}
public FilenameFilter getTransformFilenameFilter() {
return transformFilenameFilter;
}
public void setTransformFilenameFilter(FilenameFilter transformFilenameFilter) {
this.transformFilenameFilter = transformFilenameFilter;
}
public FilenameFilter getNamespaceFilenameFilter() {
return namespaceFilenameFilter;
}
public void setNamespaceFilenameFilter(FilenameFilter namespaceFilenameFilter) {
this.namespaceFilenameFilter = namespaceFilenameFilter;
}
public void setServicesPath(String servicesPath) {
this.servicesPath = servicesPath;
}
public void setOptionsPath(String optionsPath) {
this.optionsPath = optionsPath;
}
public void setNamespacesPath(String namespacesPath) {
this.namespacesPath = namespacesPath;
}
public void setTransformsPath(String transformsPath) {
this.transformsPath = transformsPath;
}
public boolean isIncludeUnrecognizedPathsAsAssetPaths() {
return includeUnrecognizedPathsAsAssetPaths;
}
public void setIncludeUnrecognizedPathsAsAssetPaths(boolean includeUnrecognizedPathsAsAssetPaths) {
this.includeUnrecognizedPathsAsAssetPaths = includeUnrecognizedPathsAsAssetPaths;
}
public void setExtPath(String extPath) {
this.extPath = extPath;
}
public void setRootPath(String rootPath) {
this.rootPath = rootPath;
}
}
class AssetFilenameFilter implements FilenameFilter {
@Override
public boolean accept(File dir, String name) {
return !name.startsWith(".");
}
}
class TransformFilenameFilter implements FilenameFilter {
@Override
public boolean accept(File dir, String name) {
return FilenameUtil.isXslFile(name) || FilenameUtil.isXqueryFile(name) || FilenameUtil.isJavascriptFile(name);
}
}
class NamespaceFilenameFilter implements FilenameFilter {
@Override
public boolean accept(File dir, String name) {
return true;
}
}