/*
Memory.java
(c) 2008-2015 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.memory;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
import ejs.base.settings.ISettingSection;
import v9t9.common.events.IEventNotifier;
import v9t9.common.files.PathFileLocator;
import v9t9.common.memory.IMemory;
import v9t9.common.memory.IMemoryDomain;
import v9t9.common.memory.IMemoryEntry;
import v9t9.common.memory.IMemoryEntryFactory;
import v9t9.common.memory.IMemoryListener;
import v9t9.common.memory.IMemoryModel;
/*
* @author ejs
*/
public class Memory implements IMemory {
private List<IMemoryListener> listeners;
private IMemoryModel model;
private Map<String, IMemoryDomain> domains = new TreeMap<String, IMemoryDomain>();
private IMemoryEntryFactory factory;
public Memory() {
factory = new MemoryEntryFactory(null, this, new PathFileLocator());
listeners = new java.util.ArrayList<IMemoryListener>();
}
/* (non-Javadoc)
* @see v9t9.common.memory.IMemory#addListener(v9t9.common.memory.MemoryListener)
*/
@Override
public void addListener(IMemoryListener listener) {
listeners.add(listener);
}
/* (non-Javadoc)
* @see v9t9.common.memory.IMemory#removeListener(v9t9.common.memory.MemoryListener)
*/
@Override
public void removeListener(IMemoryListener listener) {
listeners.remove(listener);
}
/* (non-Javadoc)
* @see v9t9.common.memory.IMemory#notifyListenersOfPhysicalChange(v9t9.common.memory.IMemoryEntry)
*/
@Override
public void notifyListenersOfPhysicalChange(IMemoryEntry entry) {
if (listeners != null) {
for (Iterator<IMemoryListener> iter = listeners.iterator(); iter
.hasNext();) {
IMemoryListener element = iter.next();
element.physicalMemoryMapChanged(entry);
}
}
}
/* (non-Javadoc)
* @see v9t9.common.memory.IMemory#notifyListenersOfLogicalChange(v9t9.common.memory.IMemoryEntry)
*/
@Override
public void notifyListenersOfLogicalChange(IMemoryEntry entry) {
if (listeners != null) {
for (Iterator<IMemoryListener> iter = listeners.iterator(); iter
.hasNext();) {
IMemoryListener element = iter.next();
element.logicalMemoryMapChanged(entry);
}
}
}
/* (non-Javadoc)
* @see v9t9.common.memory.IMemory#addDomain(java.lang.String, v9t9.common.memory.MemoryDomain)
*/
@Override
public void addDomain(String key, IMemoryDomain domain) {
this.domains.put(key, domain);
((MemoryDomain) domain).setMemory(this);
}
/* (non-Javadoc)
* @see v9t9.common.memory.IMemory#getDomain(java.lang.String)
*/
@Override
public IMemoryDomain getDomain(String key) {
if (key == null)
return null;
return domains.get(key);
}
/* (non-Javadoc)
* @see v9t9.common.memory.IMemory#addAndMap(v9t9.common.memory.IMemoryEntry)
*/
@Override
public void addAndMap(IMemoryEntry entry) {
entry.getDomain().mapEntry(entry);
notifyListenersOfPhysicalChange(entry);
}
/* (non-Javadoc)
* @see v9t9.common.memory.IMemory#removeAndUnmap(v9t9.common.memory.MemoryEntry)
*/
@Override
public void removeAndUnmap(IMemoryEntry entry) {
if (entry == null)
return;
entry.getDomain().unmapEntry(entry);
notifyListenersOfPhysicalChange(entry);
}
public void setModel(IMemoryModel model) {
this.model = model;
}
/* (non-Javadoc)
* @see v9t9.common.memory.IMemory#getModel()
*/
@Override
public IMemoryModel getModel() {
return model;
}
/* (non-Javadoc)
* @see v9t9.common.memory.IMemory#saveState(v9t9.base.settings.ISettingSection)
*/
@Override
public void saveState(ISettingSection section) {
for (Map.Entry<String, IMemoryDomain> entry : domains.entrySet()) {
entry.getValue().saveState(section.addSection(entry.getKey()));
}
}
/* (non-Javadoc)
* @see v9t9.common.memory.IMemory#loadState(v9t9.base.settings.ISettingSection)
*/
@Override
public void loadState(ISettingSection section) {
loadMemory(null, section);
}
/* (non-Javadoc)
* @see v9t9.common.memory.IMemory#loadMemory(v9t9.common.events.IEventNotifier, ejs.base.settings.ISettingSection)
*/
@Override
public void loadMemory(IEventNotifier notifier, ISettingSection section) {
if (section == null)
return;
Set<String> notSaved = new HashSet<String>(domains.keySet());
for (String domainName : section.getSectionNames()) {
IMemoryDomain domain = getDomain(domainName);
if (domain != null) {
notSaved.remove(domainName);
} else {
domain = new MemoryDomain(domainName, domainName);
addDomain(domainName, domain);
}
ISettingSection dSection = section.getSection(domainName);
domain.loadMemory(notifier, dSection);
}
for (IMemoryDomain domain : domains.values()) {
if (notSaved.contains(domain.getName())) {
domain.unmapAll();
}
}
domains.keySet().removeAll(notSaved);
}
/* (non-Javadoc)
* @see v9t9.common.memory.IMemory#getDomains()
*/
@Override
public IMemoryDomain[] getDomains() {
return (IMemoryDomain[]) domains.values().toArray(new IMemoryDomain[domains.values().size()]);
}
/* (non-Javadoc)
* @see v9t9.common.memory.IMemory#save()
*/
@Override
public void save() {
for (IMemoryDomain domain : domains.values()) {
domain.save();
}
}
/* (non-Javadoc)
* @see v9t9.common.memory.IMemory#clear()
*/
@Override
public void clear() {
for (IMemoryDomain domain : getDomains()) {
domain.unmapAll();
}
}
/* (non-Javadoc)
* @see v9t9.common.memory.IMemory#getMemoryEntryFactory()
*/
@Override
public IMemoryEntryFactory getMemoryEntryFactory() {
return factory;
}
public void setMemoryEntryFactory(IMemoryEntryFactory factory) {
this.factory = factory;
}
/* (non-Javadoc)
* @see v9t9.common.memory.IMemory#reset()
*/
@Override
public void reset() {
for (IMemoryDomain domain : domains.values()) {
domain.reset();
}
}
}