/* DiskDirectoryMapper.java (c) 2010-2013 Edward Swartz All rights reserved. This program and the accompanying materials are made available under the terms of the Eclipse Public License v1.0 which accompanies this distribution, and is available at http://www.eclipse.org/legal/epl-v10.html */ package v9t9.engine.files.directory; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.Map; import v9t9.common.files.DiskDirectoryUtils; import v9t9.common.files.DiskDirectory; import v9t9.common.files.IDiskDirectory; import v9t9.common.files.IFilesInDirectoryMapper; import ejs.base.properties.IPersistable; import ejs.base.properties.IProperty; import ejs.base.properties.IPropertyListener; import ejs.base.settings.ISettingSection; public class DiskDirectoryMapper implements IFilesInDirectoryMapper, IPersistable { private Map<String, File> diskMap = new HashMap<String, File>(); private Map<String, String> deviceToDiskMap = new HashMap<String, String>(); private Map<String, String> diskToDeviceMap = new HashMap<String, String>(); private Map<String, IProperty> diskSettingsMap = new HashMap<String, IProperty>(); private Map<String, IPropertyListener> diskSettingsListenerMap = new HashMap<String, IPropertyListener>(); private IProperty enabledProperty; public DiskDirectoryMapper(IProperty enabledProperty) { this.enabledProperty = enabledProperty; } public void registerDiskSetting(String device, IProperty diskSetting) { diskMap.put(device, new File(diskSetting.getString())); deviceToDiskMap.put(device, diskSetting.getName()); diskToDeviceMap.put(diskSetting.getName(), device); diskSettingsMap.put(device, diskSetting); IPropertyListener listener = new IPropertyListener() { public void propertyChanged(IProperty setting) { diskMap.put(diskToDeviceMap.get(setting.getName()), new File(setting.getString())); } }; diskSettingsListenerMap.put(device, listener); diskSetting.addListener(listener); } public void unregisterDiskSetting(String devname) { diskMap.remove(devname); IProperty diskSetting = diskSettingsMap.remove(devname); if (diskSetting != null) { IPropertyListener listener = diskSettingsListenerMap.remove(devname); diskSetting.removeListener(listener); } } public void setDiskPath(String device, File dir) { diskMap.put(device, dir); IProperty diskSetting = diskSettingsMap.get(device); if (diskSetting != null) { try { diskSetting.setString(dir.getCanonicalPath()); } catch (IOException e) { diskSetting.setString(dir.getAbsolutePath()); } } } /* (non-Javadoc) * @see v9t9.emulator.hardware.dsrs.EmuDiskDsr.IFileMapper#getSetting() */ public IProperty[] getSettings() { ArrayList<? extends IProperty> list = new ArrayList<IProperty>(diskSettingsMap.values()); Collections.sort(list); return (IProperty[]) list.toArray(new IProperty[list.size()]); } public synchronized void saveState(ISettingSection settings) { for (Map.Entry<String, IProperty> entry : diskSettingsMap.entrySet()) { entry.getValue().saveState(settings); } } public synchronized void loadState(ISettingSection settings) { if (settings == null) return; for (Map.Entry<String, IProperty> entry : diskSettingsMap.entrySet()) { entry.getValue().loadState(settings); } } public File getLocalRoot(File file) { while (file != null) { for (Map.Entry<String, File> entry : diskMap.entrySet()) { if (entry.getValue().equals(file)) { return file; } } file = file.getParentFile(); } return null; } /* (non-Javadoc) * @see v9t9.emulator.hardware.dsrs.EmuDiskDsr.IFileMapper#getLocalDevice(java.lang.String) */ public String getDeviceNamed(String dsrName) { String localName = getLocalFileName(dsrName); for (Map.Entry<String, File> entry : diskMap.entrySet()) { if (entry.getValue().getName().equals(localName)) { return entry.getKey(); } } return null; } /* (non-Javadoc) * @see v9t9.emulator.hardware.dsrs.EmuDiskDsr.IFileMapper#getLocalFilePath(java.lang.String) */ public String getLocalFileName(String dsrPath) { return DiskDirectoryUtils.dsrToHost(dsrPath); } /* (non-Javadoc) * @see v9t9.emulator.hardware.dsrs.EmuDiskDsr.IFileMapper#getLocalDottedFile(java.lang.String) */ public File getLocalDottedFile(String deviceFilename) { int idx = deviceFilename.indexOf('.'); if (idx < 0) return getLocalFile(deviceFilename, null); else return getLocalFile(deviceFilename.substring(0, idx), deviceFilename.substring(idx + 1)); } @Override public File getLocalFile(String device, String filename) { if (!"DSK".equals(device)) { File dir = diskMap.get(device); if (dir == null) { return null; } return getLocalFile(dir, filename); } else { int idx = filename.indexOf('.'); String diskName = filename.substring(0, idx >= 0 ? idx : filename.length()); device = getDeviceNamed(diskName); if (device == null) return null; filename = filename.substring(diskName.length() + 1); return getLocalFile(device, filename); } } /** * @param dir * @param filename * @return */ @Override public File getLocalFile(File dir, String filename) { return DiskDirectoryUtils.getLocalFile(dir, filename); } public String getDsrFileName(String filename) { return DiskDirectoryUtils.hostToDSR(filename); } public String getDsrDeviceName(File dir) { for (Map.Entry<String, File> entry : diskMap.entrySet()) { if (entry.getValue().equals(dir)) { return entry.getKey(); } } return null; } /* (non-Javadoc) * @see v9t9.common.files.IFilesInDirectoryMapper#createCatalog(java.io.File) */ // @Override // public Catalog createCatalog(File dir) throws IOException { // FileDirectory fileDir = new FileDirectory(dir, this); // // Catalog catalog = fileDir.readCatalog(); // // return catalog; // } /* (non-Javadoc) * @see v9t9.common.files.IFilesInDirectoryMapper#createDiskDirectory(java.io.File) */ @Override public IDiskDirectory createDiskDirectory(File dir) { return new DiskDirectory(dir, this); } /* (non-Javadoc) * @see v9t9.common.files.IFilesInDirectoryMapper#getDirectorySupportProperty() */ @Override public IProperty getDirectorySupportProperty() { return enabledProperty; } /* (non-Javadoc) * @see v9t9.common.files.IFilesInDirectoryMapper#getDiskSettingMap() */ @Override public Map<String, IProperty> getDiskSettingMap() { return diskSettingsMap; } }