diff options
| author | Benjamin J. Culkin <bjculkin@mix.wvu.edu> | 2017-10-08 22:39:59 -0300 |
|---|---|---|
| committer | Benjamin J. Culkin <bjculkin@mix.wvu.edu> | 2017-10-08 22:39:59 -0300 |
| commit | c82e3b3b2de0633317ec8fc85925e91422820597 (patch) | |
| tree | 96567416ce23c5ce85601f9cedc3a94bb1c55cba /BJC-Utils2/src/main/java/bjc/utils/components/FileComponentRepository.java | |
| parent | b3ac1c8690c3e14c879913e5dcc03a5f5e14876e (diff) | |
Start splitting into maven modules
Diffstat (limited to 'BJC-Utils2/src/main/java/bjc/utils/components/FileComponentRepository.java')
| -rw-r--r-- | BJC-Utils2/src/main/java/bjc/utils/components/FileComponentRepository.java | 181 |
1 files changed, 0 insertions, 181 deletions
diff --git a/BJC-Utils2/src/main/java/bjc/utils/components/FileComponentRepository.java b/BJC-Utils2/src/main/java/bjc/utils/components/FileComponentRepository.java deleted file mode 100644 index efde5c7..0000000 --- a/BJC-Utils2/src/main/java/bjc/utils/components/FileComponentRepository.java +++ /dev/null @@ -1,181 +0,0 @@ -package bjc.utils.components; - -import java.io.File; -import java.io.IOException; -import java.nio.file.Path; -import java.nio.file.attribute.BasicFileAttributes; -import java.util.function.BiPredicate; -import java.util.function.Function; -import java.util.logging.Level; -import java.util.logging.Logger; - -import bjc.utils.data.IHolder; -import bjc.utils.data.Identity; -import bjc.utils.funcdata.FunctionalMap; -import bjc.utils.funcdata.IList; -import bjc.utils.funcdata.IMap; -import bjc.utils.funcutils.FileUtils; - -/** - * A component repository that loads its components from files in a directory - * - * @author ben - * - * @param <ComponentType> - * The type of component being read in - */ -public class FileComponentRepository<ComponentType extends IDescribedComponent> - implements IComponentRepository<ComponentType> { - // The logger to use for storing data about this class - private static final Logger CLASS_LOGGER = Logger.getLogger("FileComponentRepository"); - - // The internal storage of components - private IMap<String, ComponentType> components; - - // The path that all the components came from - private Path sourceDirectory; - - /** - * Create a new component repository sourcing components from files in a - * directory - * - * An exception thrown during the loading of a component will only cause - * the loading of that component to fail, but a warning will be logged. - * - * @param directory - * The directory to read component files from - * @param componentReader - * The function to use to convert files to components - */ - public FileComponentRepository(final File directory, - final Function<File, ? extends ComponentType> componentReader) { - // Make sure we have valid arguments - if (directory == null) - throw new NullPointerException("Directory must not be null"); - else if (!directory.isDirectory()) - throw new IllegalArgumentException("File " + directory + " is not a directory.\n" - + "Components can only be read from a directory"); - else if (componentReader == null) throw new NullPointerException("Component reader must not be null"); - - // Initialize our fields - components = new FunctionalMap<>(); - sourceDirectory = directory.toPath().toAbsolutePath(); - - // Marker for making sure we don't skip the parent - final IHolder<Boolean> isFirstDir = new Identity<>(true); - - // Predicate to use to traverse all the files in a directory, - // but - // not recurse into sub-directories - final BiPredicate<Path, BasicFileAttributes> firstLevelTraverser = (pth, attr) -> { - if (attr.isDirectory() && !isFirstDir.getValue()) /* - * Skip - * directories, - * they - * probably - * have - * component - * support - * files. - */ - return false; - - /* - * Don't skip the first directory, that's the parent - * directory - */ - isFirstDir.replace(false); - - return true; - }; - - // Try reading components - try { - FileUtils.traverseDirectory(sourceDirectory, firstLevelTraverser, (pth, attr) -> { - loadComponent(componentReader, pth); - - // Keep loading components, even if this one - // failed - return true; - }); - } catch (final IOException ioex) { - CLASS_LOGGER.log(Level.WARNING, ioex, () -> "Error found reading component from file."); - } - } - - @Override - public IMap<String, ComponentType> getAll() { - return components; - } - - @Override - public ComponentType getByName(final String name) { - return components.get(name); - } - - @Override - public IList<ComponentType> getList() { - return components.valueList(); - } - - @Override - public String getSource() { - return "Components read from directory " + sourceDirectory + "."; - } - - /* - * Load a component from a file - */ - private void loadComponent(final Function<File, ? extends ComponentType> componentReader, final Path pth) { - try { - // Try to load the component - final ComponentType component = componentReader.apply(pth.toFile()); - - if (component == null) - throw new NullPointerException("Component reader read null component"); - else if (!components.containsKey(component.getName())) { - // We only care about the latest version of a - // component - final ComponentType oldComponent = components.put(component.getName(), component); - - if (oldComponent.getVersion() > component.getVersion()) { - components.put(oldComponent.getName(), oldComponent); - } - } else { - CLASS_LOGGER.warning("Found a duplicate component.\n" - + "Multiple versions of the same component are not currently supported.\n" - + "Only the latest version of the component" + component - + " will be registered ."); - } - } catch (final Exception ex) { - CLASS_LOGGER.log(Level.WARNING, ex, () -> "Error found reading component from file " - + pth.toString() + ". This component will not be loaded"); - } - } - - /* - * (non-Javadoc) - * - * @see java.lang.Object#toString() - */ - @Override - public String toString() { - final StringBuilder builder = new StringBuilder(); - builder.append("FileComponentRepository ["); - - if (components != null) { - builder.append("components="); - builder.append(components); - builder.append(", "); - } - - if (sourceDirectory != null) { - builder.append("sourceDirectory="); - builder.append(sourceDirectory); - } - - builder.append("]"); - - return builder.toString(); - } -}
\ No newline at end of file |
