package fr.lyrgard.hexScape.service; import java.awt.Color; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Properties; import org.apache.commons.lang.StringUtils; import fr.lyrgard.hexScape.bus.CoreMessageBus; import fr.lyrgard.hexScape.bus.GuiMessageBus; import fr.lyrgard.hexScape.message.DiceDefinitionReloadedMessage; import fr.lyrgard.hexScape.message.ErrorMessage; import fr.lyrgard.hexScape.model.CurrentUserInfo; import fr.lyrgard.hexScape.model.ImageExtensionEnum; import fr.lyrgard.hexScape.model.dice.DiceFace; import fr.lyrgard.hexScape.model.dice.DiceType; public class DiceService { public static synchronized DiceService getInstance() { if (INSTANCE == null) { INSTANCE = new DiceService(); } return INSTANCE; } private static final String DICE_FOLDER_NAME = "dice"; private static final String diePropertiesFilename = "dice.properties"; private static final String dieIconFilename = "icon.png"; private static final String NAME = "name"; private static final String VALUES = "values"; private static final String MAX_NUMBER_THROWN = "maxNumberThrown"; private static final String BACKGROUND_COLOR = "backgroundColor"; private static final String FOREGROUND_COLOR = "foregroundColor"; private static DiceService INSTANCE; private Map<String, DiceType> diceTypes; private DiceService() { loadDiceTypes(); } private List<File> getDiceFolders() { List<File> folders = new ArrayList<File>(); File commonFolder = new File(AssetService.COMMON_ASSET_FOLDER, DICE_FOLDER_NAME); File gameFolder = new File(new File(AssetService.ASSET_FOLDER, ConfigurationService.getInstance().getGameFolder()), DICE_FOLDER_NAME); folders.add(commonFolder); folders.add(gameFolder); return folders; } public void loadDiceTypes() { diceTypes = new HashMap<>(); for (File baseFolder : getDiceFolders()) { if (baseFolder.exists()) { diceDefinition: for (File folder : baseFolder.listFiles()) { if (folder.exists() && folder.isDirectory()) { File dicePropertiesFile = new File(folder, diePropertiesFilename); if (dicePropertiesFile.exists() && dicePropertiesFile.isFile() && dicePropertiesFile.canRead()) { DiceType type = new DiceType(); Properties diceProperties = new Properties(); InputStream input; try { input = new FileInputStream(dicePropertiesFile); diceProperties.load(input); type.setId(folder.getName()); type.setName(diceProperties.getProperty(NAME)); String maxNumberThrownString = diceProperties.getProperty(MAX_NUMBER_THROWN); if (StringUtils.isNotEmpty(maxNumberThrownString)) { try { type.setMaxNumberThrown(Integer.parseInt(maxNumberThrownString)); } catch (IllegalArgumentException e) { } } String backgroundColor = diceProperties.getProperty(BACKGROUND_COLOR); if (StringUtils.isNotEmpty(backgroundColor)) { try { type.setBackgroundColor(Color.decode(backgroundColor)); } catch (NumberFormatException e) { } } String foregroundcolor = diceProperties.getProperty(FOREGROUND_COLOR); if (StringUtils.isNotEmpty(foregroundcolor)) { try { type.setForegroundColor(Color.decode(foregroundcolor)); } catch (NumberFormatException e) { } } String[] faces = diceProperties.getProperty(VALUES).split(","); for (String face : faces) { face = face.trim(); File faceFile = new File(folder, face); if (!faceFile.exists()) { for (ImageExtensionEnum extension : ImageExtensionEnum.values()) { faceFile = new File(folder, face + "." + extension.name().toLowerCase()); if (faceFile.exists()) { break; } faceFile = null; } if (faceFile == null) { CoreMessageBus.post(new ErrorMessage(CurrentUserInfo.getInstance().getPlayerId(), "No image was found for face \"" + face + "\" for dice \"" + folder.getAbsolutePath() + "\". Dice definition skiped")); break diceDefinition; } } DiceFace diceFace = new DiceFace(); diceFace.setImage(faceFile); diceFace.setName(face); diceFace.setId(face); type.getFaces().add(diceFace); } } catch (IOException e) { e.printStackTrace(); } File diceIconFile = new File(folder, dieIconFilename); if (diceIconFile.exists() && diceIconFile.isFile() && diceIconFile.canRead()) { type.setIconFile(diceIconFile); } diceTypes.put(type.getId(), type); } } } } } GuiMessageBus.post(new DiceDefinitionReloadedMessage()); } public Collection<DiceType> getDiceTypes() { if (diceTypes == null) { loadDiceTypes(); } return diceTypes.values(); } public DiceType getDiceType(String diceId) { if (diceTypes == null) { loadDiceTypes(); } return diceTypes.get(diceId); } }