Navigation Menu

Skip to content

Commit

Permalink
chore: Indexing is not required, so do not use it
Browse files Browse the repository at this point in the history
  • Loading branch information
rhwood committed Mar 8, 2020
1 parent b65fb23 commit 65f9b1a
Show file tree
Hide file tree
Showing 6 changed files with 114 additions and 184 deletions.
143 changes: 46 additions & 97 deletions java/src/jmri/managers/AbstractProxyManager.java
Expand Up @@ -12,7 +12,6 @@
import jmri.jmrix.SystemConnectionMemo;
import jmri.jmrix.internal.InternalSystemConnectionMemo;
import jmri.util.NamedBeanComparator;
import jmri.util.com.dictiography.collections.IndexedTreeSet;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

Expand All @@ -35,29 +34,6 @@
*/
abstract public class AbstractProxyManager<E extends NamedBean> implements ProxyManager<E>, ProvidingManager<E>, Manager.ManagerDataListener<E> {

/**
* Number of managers available through getManager(i) and getManagerList(),
* including the Internal manager
*
* @return the number of managers.
*/
protected int nMgrs() {
// make sure internal present
initInternal();
return mgrs.size();
}

protected Manager<E> getMgr(int index) {
// make sure internal present
initInternal();

if (index < mgrs.size()) {
return mgrs.exact(index);
} else {
throw new IllegalArgumentException("illegal index " + index); // NOI18N
}
}

/**
* {@inheritDoc}
*/
Expand Down Expand Up @@ -151,10 +127,7 @@ private Manager<E> initInternal() {
return internalManager;
}

private final IndexedTreeSet<Manager<E>> mgrs = new IndexedTreeSet<>(new Comparator<Manager<E>>(){
@Override
public int compare(Manager<E> e1, Manager<E> e2) { return e1.getSystemPrefix().compareTo(e2.getSystemPrefix()); }
});
private final Set<Manager<E>> mgrs = new TreeSet<>((Manager<E> e1, Manager<E> e2) -> e1.getSystemPrefix().compareTo(e2.getSystemPrefix()));
private Manager<E> internalManager = null;
protected Manager<E> defaultManager = null;

Expand Down Expand Up @@ -195,37 +168,35 @@ protected E provideNamedBean(String name) throws IllegalArgumentException {
return t;
}
// Doesn't exist. If the systemName was specified, find that system
int index = matchTentative(name);
if (index >= 0) {
return makeBean(index, name, null);
Manager<E> manager = getManager(name);
if (manager != null) {
return makeBean(manager, name, null);
}
log.debug("provideNamedBean did not find manager for name {}, defer to default", name); // NOI18N
return makeBean(mgrs.entryIndex(getDefaultManager()), getDefaultManager().makeSystemName(name), null);
return makeBean(getDefaultManager(), getDefaultManager().makeSystemName(name), null);
}

/**
* Defer creation of the proper type to the subclass.
*
* @param index the manager to invoke
* @param manager the manager to invoke
* @param systemName the system name
* @param userName the user name
* @return a bean
*/
abstract protected E makeBean(int index, String systemName, String userName);
abstract protected E makeBean(Manager<E> manager, String systemName, String userName);

/** {@inheritDoc} */
@Override
@CheckReturnValue
@CheckForNull
public E getBySystemName(@Nonnull String systemName) {
// System names can be matched to managers by system and type at front of name
int index = matchTentative(systemName);
if (index >= 0) {
Manager<E> m = getMgr(index);
return m.getBySystemName(systemName);
Manager<E> m = getManager(systemName);
if (m == null) {
log.debug("getBySystemName did not find manager from name {}, defer to default manager", systemName);
m = getDefaultManager();
}
log.debug("getBySystemName did not find manager from name {}, defer to default manager", systemName); // NOI18N
return getDefaultManager().getBySystemName(systemName);
return m.getBySystemName(systemName);
}

/** {@inheritDoc} */
Expand All @@ -252,10 +223,9 @@ public E getByUserName(@Nonnull String userName) {
@Override
@Nonnull
public String validateSystemNameFormat(@Nonnull String systemName, @Nonnull Locale locale) {
int i = matchTentative(systemName);
Manager manager = getDefaultManager();
if (i >= 0) {
manager = getMgr(i);
Manager manager = getManager(systemName);
if (manager == null) {
manager = getDefaultManager();
}
return manager.validateSystemNameFormat(systemName, locale);
}
Expand All @@ -269,11 +239,8 @@ public String validateSystemNameFormat(@Nonnull String systemName, @Nonnull Loca
*/
@Override
public NameValidity validSystemNameFormat(@Nonnull String systemName) {
int i = matchTentative(systemName);
if (i >= 0) {
return getMgr(i).validSystemNameFormat(systemName);
}
return NameValidity.INVALID;
Manager m = getManager(systemName);
return m == null ? NameValidity.INVALID : m.validSystemNameFormat(systemName);
}

/**
Expand Down Expand Up @@ -311,62 +278,44 @@ public E newNamedBean(String systemName, String userName) {
initInternal();

// if the systemName is specified, find that system
int i = matchTentative(systemName);
if (i >= 0) {
return makeBean(i, systemName, userName);
Manager<E> m = getManager(systemName);
if (m != null) {
return makeBean(m, systemName, userName);
}

// did not find a manager, allow it to default to the primary
log.debug("Did not find manager for system name {}, delegate to primary", systemName); // NOI18N
return makeBean(mgrs.entryIndex(getDefaultManager()), systemName, userName);
return makeBean(getDefaultManager(), systemName, userName);
}

/** {@inheritDoc} */
@Override
public void dispose() {
for (Manager<E> m : mgrs) {
m.dispose();
}
mgrs.forEach(m -> m.dispose());
mgrs.clear();
if (internalManager != null) {
internalManager.dispose(); // don't make if not made yet
}
}

/**
* Find the index of a matching manager.
*
* @param systemName the system name to find a manager for
* @return the index of the matching manager, or -1 if there is no match,
* which is not considered an error
*/
protected int matchTentative(String systemName) {
for (Manager<E> m : mgrs) {
if (systemName.startsWith(m.getSystemPrefix() + m.typeLetter())) {
return mgrs.entryIndex(m);
}
}
return -1;
}

/**
* Find the index of a matching manager. Throws IllegalArgumentException if
* there is no match, here considered to be an error that must be reported.
*
* @param systemName the system name to find a manager for
* @return the index of the matching manager
* Get the manager for the given system name.
*
* @param systemName the given name
* @return the requested manager or null if there is no matching manager
*/
protected int match(String systemName) {
@CheckForNull
protected Manager<E> getManager(@Nonnull String systemName) {
// make sure internal present
initInternal();

int index = matchTentative(systemName);
if (index < 0) {
throw new IllegalArgumentException("System name " + systemName + " failed to match"); // NOI18N
for (Manager<E> m : getManagerList()) {
if (systemName.startsWith(m.getSystemNamePrefix())) {
return m;
}
}
return index;
return null;
}

/**
* Shared method to create a systemName based on the address base, the prefix and manager class.
*
Expand Down Expand Up @@ -421,11 +370,9 @@ public String getNextValidAddress(@Nonnull String curAddress, @Nonnull String pr
/** {@inheritDoc} */
@Override
public void deleteBean(@Nonnull E s, @Nonnull String property) throws PropertyVetoException {
String systemName = s.getSystemName();
try {
getMgr(match(systemName)).deleteBean(s, property);
} catch (PropertyVetoException e) {
throw e;
Manager m = getManager(s.getSystemName());
if (m != null) {
m.deleteBean(s, property);
}
}

Expand All @@ -436,8 +383,10 @@ public void deleteBean(@Nonnull E s, @Nonnull String property) throws PropertyVe
*/
@Override
public void register(@Nonnull E s) {
String systemName = s.getSystemName();
getMgr(match(systemName)).register(s);
Manager m = getManager(s.getSystemName());
if (m != null) {
m.register(s);
}
}

/**
Expand All @@ -449,18 +398,18 @@ public void register(@Nonnull E s) {
*/
@Override
public void deregister(@Nonnull E s) {
String systemName = s.getSystemName();
getMgr(match(systemName)).deregister(s);
Manager m = getManager(s.getSystemName());
if (m != null) {
m.deregister(s);
}
}

/** {@inheritDoc} */
@Nonnull
@Override
public List<NamedBeanPropertyDescriptor<?>> getKnownBeanProperties() {
List<NamedBeanPropertyDescriptor<?>> l = new ArrayList<>();
for (Manager<E> m : mgrs) {
l.addAll(m.getKnownBeanProperties());
}
mgrs.forEach(m -> l.addAll(m.getKnownBeanProperties()));
return l;
}

Expand Down
4 changes: 2 additions & 2 deletions java/src/jmri/managers/ProxyIdTagManager.java
Expand Up @@ -86,9 +86,9 @@ public SortedSet<IdTag> getNamedBeanSet() {
}

@Override
protected IdTag makeBean(int i, String systemName, String userName) {
protected IdTag makeBean(Manager<IdTag> manager, String systemName, String userName) {
init();
return ((IdTagManager) getMgr(i)).newIdTag(systemName, userName);
return ((IdTagManager) manager).newIdTag(systemName, userName);
}

/**
Expand Down
43 changes: 15 additions & 28 deletions java/src/jmri/managers/ProxyLightManager.java
Expand Up @@ -3,6 +3,7 @@
import javax.annotation.Nonnull;
import jmri.Light;
import jmri.LightManager;
import jmri.Manager;

/**
* Implementation of a LightManager that can serve as a proxy for multiple
Expand Down Expand Up @@ -39,8 +40,8 @@ public Light getLight(@Nonnull String name) {
}

@Override
protected Light makeBean(int i, String systemName, String userName) {
return ((LightManager) getMgr(i)).newLight(systemName, userName);
protected Light makeBean(Manager<Light> manager, String systemName, String userName) {
return ((LightManager) manager).newLight(systemName, userName);
}

/** {@inheritDoc} */
Expand Down Expand Up @@ -98,19 +99,16 @@ public Light newLight(@Nonnull String systemName, String userName) {

/**
* Validate system name against the hardware configuration Locate a system
* specfic LightManager based on a system name.
* specific LightManager based on a system name.
*
* @return if a manager is found, return its determination of validity of
* system name formatrelative to the hardware configuration.
* Return false if no manager exists.
* system name format relative to the hardware configuration; false if no
* manager exists.
*/
@Override
public boolean validSystemNameConfig(@Nonnull String systemName) {
int i = matchTentative(systemName);
if (i >= 0) {
return ((LightManager) getMgr(i)).validSystemNameConfig(systemName);
}
return false;
LightManager m = (LightManager) getManager(systemName);
return (m == null) ? false : m.validSystemNameConfig(systemName);
}

/**
Expand All @@ -121,11 +119,8 @@ public boolean validSystemNameConfig(@Nonnull String systemName) {
@Override
@Nonnull
public String convertSystemNameToAlternate(@Nonnull String systemName) {
int i = matchTentative(systemName);
if (i >= 0) {
return ((LightManager) getMgr(i)).convertSystemNameToAlternate(systemName);
}
return "";
LightManager m = (LightManager) getManager(systemName);
return (m == null) ? "" : m.convertSystemNameToAlternate(systemName);
}

/**
Expand All @@ -134,9 +129,7 @@ public String convertSystemNameToAlternate(@Nonnull String systemName) {
*/
@Override
public void activateAllLights() {
for (int i = 0; i < nMgrs(); i++) {
((LightManager) getMgr(i)).activateAllLights();
}
getManagerList().forEach(m -> ((LightManager) m).activateAllLights());
}

/**
Expand All @@ -146,11 +139,8 @@ public void activateAllLights() {
*/
@Override
public boolean supportsVariableLights(@Nonnull String systemName) {
int i = matchTentative(systemName);
if (i >= 0) {
return ((LightManager) getMgr(i)).supportsVariableLights(systemName);
}
return false;
LightManager m = (LightManager) getManager(systemName);
return (m == null) ? false : m.supportsVariableLights(systemName);
}

/**
Expand All @@ -160,11 +150,8 @@ public boolean supportsVariableLights(@Nonnull String systemName) {
*/
@Override
public boolean allowMultipleAdditions(@Nonnull String systemName) {
int i = matchTentative(systemName);
if (i >= 0) {
return ((LightManager) getMgr(i)).allowMultipleAdditions(systemName);
}
return false;
LightManager m = (LightManager) getManager(systemName);
return (m == null) ? false : m.allowMultipleAdditions(systemName);
}

/**
Expand Down

0 comments on commit 65f9b1a

Please sign in to comment.