/* * 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 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 static final int DEF_IMAGE_SIZE = 100; 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 loadImages(String imagesPath, ImageFilter filter) throws ImageException { return loadImages(imagesPath, filter, DEF_IMAGE_SIZE); } protected Map loadImages(String imagesPath, ImageFilter filter, int size) throws ImageException { Map images = new HashMap<>(); try (FileSystemContractor fsc = FileSystemDetector.detect(getImageResourceUri())) { try (DirectoryStream ds = Files.newDirectoryStream( fsc.getPath(imagesPath), filter ) ) { ImageFormatShaper formatShaper = ImageFormatShaper.getInstance(); for (Path file : ds) { String fileName = file.getFileName().toString(); String baseName = FilenameUtils.getBaseName(fileName).toLowerCase(); String imageFormat = FilenameUtils.getExtension(fileName).toLowerCase(); images.put( baseName, formatShaper.shape( imageFormat, fsc.getResourceAsStream(file), size ) ); } } } catch (Exception e) { throw new ImageException("image.unable.access.resource", e.getMessage()); } return images; } }