--- /dev/null
+/*
+ * Copyright (c) 2018-2019. Developed by Hedgecode.
+ *
+ * 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 org.hedgecode.chess.img;
+
+import java.awt.image.BufferedImage;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.nio.file.DirectoryStream;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.imageio.ImageIO;
+
+import org.hedgecode.chess.img.fs.FileSystemDetector;
+import org.hedgecode.chess.img.fs.FileSystemContractor;
+
+/**
+ * Abstract common image loader with type state of saved resources.
+ *
+ * @author Dmitry Samoshin aka gotty
+ */
+public abstract class AbstractImageLoader implements ImageLoader {
+
+ private static final String IMAGES_DIR =
+ ImageConstants.RESOURCE_ROOT_DIR.concat(ImageConstants.RESOURCE_IMAGES_DIR);
+
+ private Type loadType;
+
+ private URI imageResourceUri;
+
+ public AbstractImageLoader() {
+ loadType = Type.STATELESS;
+ try {
+ if (FileSystemDetector.detectJar(getImageResourceUri())) {
+ loadType = Type.STATEFUL;
+ }
+ } catch (ImageException ignored) {
+ }
+ }
+
+ protected abstract void clear();
+
+ @Override
+ public Type loadType() {
+ return loadType;
+ }
+
+ protected void setLoadType(Type loadType) {
+ if (Type.STATELESS.equals(loadType)) {
+ clear();
+ }
+ this.loadType = loadType;
+ }
+
+ protected URI getImageResourceUri() throws ImageException {
+ if (imageResourceUri == null) {
+ try {
+ imageResourceUri = getClass().getResource(IMAGES_DIR).toURI();
+ } catch (URISyntaxException e) {
+ throw new ImageException("image.unable.access.resource");
+ }
+ }
+ return imageResourceUri;
+ }
+
+ protected Map<String, BufferedImage> loadImages(String imagesPath, ImageFilter filter)
+ throws ImageException
+ {
+ Map<String, BufferedImage> images = new HashMap<>();
+ try (FileSystemContractor fsc = FileSystemDetector.detect(getImageResourceUri())) {
+ try (DirectoryStream<Path> ds =
+ Files.newDirectoryStream(
+ fsc.getPath(imagesPath), filter
+ )
+ ) {
+ for (Path file : ds) {
+ images.put(
+ FilenameUtils.getBaseName(
+ file.getFileName().toString()
+ ).toLowerCase(),
+ ImageIO.read(
+ fsc.getResourceAsStream(file)
+ )
+ );
+ }
+ }
+ } catch (Exception e) {
+ throw new ImageException("image.unable.access.resource", e.getMessage());
+ }
+ return images;
+ }
+
+}