package org.archstudio.myx.fw;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@SuppressWarnings("unused")
class MyxInterfaceRepository {
protected Map<IMyxBrick, List<MyxInterface>> brickToInterfaceListMap = Collections
.synchronizedMap(new HashMap<IMyxBrick, List<MyxInterface>>());
public MyxInterfaceRepository() {
}
public void addInterface(IMyxBrick b, IMyxName interfaceName, IMyxInterfaceDescription interfaceDescription,
EMyxInterfaceDirection interfaceDirection) {
synchronized (brickToInterfaceListMap) {
List<MyxInterface> l = brickToInterfaceListMap.get(b);
if (l == null) {
brickToInterfaceListMap.put(b, l = new ArrayList<MyxInterface>());
}
MyxInterface mi = new MyxInterface(interfaceName, interfaceDescription, interfaceDirection);
l.add(mi);
}
}
public void addInterface(IMyxBrick b, IMyxName interfaceName, IMyxInterfaceDescription interfaceDescription,
EMyxInterfaceDirection interfaceDirection, IMyxName internalBrickName, IMyxName internalInterfaceName) {
synchronized (brickToInterfaceListMap) {
List<MyxInterface> l = brickToInterfaceListMap.get(b);
if (l == null) {
brickToInterfaceListMap.put(b, l = new ArrayList<MyxInterface>());
}
MyxInterface mi = new MyxMappedInterface(interfaceName, interfaceDescription, interfaceDirection,
internalBrickName, internalInterfaceName);
l.add(mi);
}
}
public void removeInterface(IMyxBrick b, IMyxName interfaceName) {
synchronized (brickToInterfaceListMap) {
List<MyxInterface> l = brickToInterfaceListMap.get(b);
if (l == null) {
return;
}
MyxInterface doomedInterface = null;
for (MyxInterface mi : l) {
IMyxName name = mi.getInterfaceName();
if (name.equals(interfaceName)) {
doomedInterface = mi;
break;
}
}
l.remove(doomedInterface);
if (l.size() == 0) {
brickToInterfaceListMap.remove(b);
}
}
}
public Collection<? extends IMyxName> getAllInterfaceNames(IMyxBrick b) {
synchronized (brickToInterfaceListMap) {
List<MyxInterface> l = brickToInterfaceListMap.get(b);
if (l == null) {
return Collections.emptyList();
}
List<IMyxName> names = new ArrayList<IMyxName>();
for (MyxInterface iface : l) {
names.add(iface.getInterfaceName());
}
return Collections.unmodifiableList(names);
}
}
protected MyxInterface getMyxInterface(IMyxBrick b, IMyxName interfaceName) {
List<MyxInterface> l = brickToInterfaceListMap.get(b);
if (l != null) {
for (MyxInterface mi : l) {
IMyxName name = mi.getInterfaceName();
if (name.equals(interfaceName)) {
return mi;
}
}
}
return null;
}
public IMyxInterfaceDescription getInterfaceDescription(IMyxBrick b, IMyxName interfaceName) {
synchronized (brickToInterfaceListMap) {
MyxInterface mi = getMyxInterface(b, interfaceName);
if (mi != null) {
return mi.getInterfaceDescription();
}
return null;
}
}
public EMyxInterfaceDirection getInterfaceDirection(IMyxBrick b, IMyxName interfaceName) {
synchronized (brickToInterfaceListMap) {
MyxInterface mi = getMyxInterface(b, interfaceName);
if (mi != null) {
return mi.getInterfaceDirection();
}
return null;
}
}
public Collection<? extends IMyxName> getInternalBrickName(IMyxBrick b, IMyxName interfaceName) {
synchronized (brickToInterfaceListMap) {
List<MyxInterface> l = brickToInterfaceListMap.get(b);
if (l != null) {
List<IMyxName> intf = new ArrayList<IMyxName>();
for (MyxInterface mi : l) {
IMyxName name = mi.getInterfaceName();
if (name.equals(interfaceName)) {
if (mi instanceof MyxMappedInterface) {
MyxMappedInterface mmi = (MyxMappedInterface) mi;
intf.add(mmi.getInternalBrickName());
}
}
}
return Collections.unmodifiableList(intf);
}
}
return null;
}
public Collection<? extends IMyxName> getInternalInterfaceName(IMyxBrick b, IMyxName interfaceName) {
synchronized (brickToInterfaceListMap) {
List<MyxInterface> l = brickToInterfaceListMap.get(b);
if (l != null) {
List<IMyxName> intf = new ArrayList<IMyxName>();
for (MyxInterface mi : l) {
IMyxName name = mi.getInterfaceName();
if (name.equals(interfaceName)) {
if (mi instanceof MyxMappedInterface) {
MyxMappedInterface mmi = (MyxMappedInterface) mi;
intf.add(mmi.getInternalInterfaceName());
}
}
}
return Collections.unmodifiableList(intf);
}
}
return null;
}
private static class MyxInterface {
protected IMyxName interfaceName;
protected IMyxInterfaceDescription interfaceDescription;
protected EMyxInterfaceDirection interfaceDirection;
public MyxInterface(IMyxName interfaceName, IMyxInterfaceDescription interfaceDescription,
EMyxInterfaceDirection interfaceDirection) {
this.interfaceName = interfaceName;
this.interfaceDescription = interfaceDescription;
this.interfaceDirection = interfaceDirection;
}
public IMyxName getInterfaceName() {
return interfaceName;
}
public void setInterfaceName(IMyxName interfaceName) {
this.interfaceName = interfaceName;
}
public EMyxInterfaceDirection getInterfaceDirection() {
return interfaceDirection;
}
public void setInterfaceDirection(EMyxInterfaceDirection interfaceDirection) {
this.interfaceDirection = interfaceDirection;
}
public IMyxInterfaceDescription getInterfaceDescription() {
return interfaceDescription;
}
public void setInterfaceDescription(IMyxInterfaceDescription interfaceDescription) {
this.interfaceDescription = interfaceDescription;
}
}
private static class MyxMappedInterface extends MyxInterface {
protected IMyxName internalBrickName;
protected IMyxName internalInterfaceName;
public MyxMappedInterface(IMyxName interfaceName, IMyxInterfaceDescription interfaceDescription,
EMyxInterfaceDirection interfaceDirection, IMyxName internalBrickName, IMyxName internalInterfaceName) {
super(interfaceName, interfaceDescription, interfaceDirection);
this.internalBrickName = internalBrickName;
this.internalInterfaceName = internalInterfaceName;
}
public IMyxName getInternalBrickName() {
return internalBrickName;
}
public void setInternalBrickName(IMyxName internalBrickName) {
this.internalBrickName = internalBrickName;
}
public IMyxName getInternalInterfaceName() {
return internalInterfaceName;
}
public void setInternalInterfaceName(IMyxName internalInterfaceName) {
this.internalInterfaceName = internalInterfaceName;
}
}
}