001package jmri.managers; 002 003import javax.annotation.CheckForNull; 004import javax.annotation.Nonnull; 005import jmri.IdTag; 006import jmri.InstanceManager; 007import jmri.RailCom; 008import jmri.RailComManager; 009import jmri.implementation.DefaultRailCom; 010import jmri.managers.configurexml.DefaultIdTagManagerXml; 011import org.slf4j.Logger; 012import org.slf4j.LoggerFactory; 013 014/** 015 * Concrete implementation for the Internal {@link jmri.RailComManager} 016 * interface. 017 * 018 * @author Kevin Dickerson Copyright (C) 2012 019 * @since 2.99.4 020 */ 021public class DefaultRailComManager extends DefaultIdTagManager 022 implements RailComManager { 023 024 public DefaultRailComManager() { 025 super(new jmri.jmrix.CaptiveSystemConnectionMemo("R", "RailCom")); // NOI18N 026 setInstances(); 027 } 028 029 final void setInstances() { 030 InstanceManager.store(this, RailComManager.class); 031 InstanceManager.setIdTagManager(this); 032 } 033 034 @Override 035 protected RailCom createNewIdTag(@Nonnull String systemName, String userName) { 036 // we've decided to enforce that IdTag system 037 // names start with RD by prepending if not present 038 if (!systemName.startsWith(getSystemPrefix() + "D")) { 039 systemName = getSystemPrefix() + "D" + systemName; 040 } 041 return new DefaultRailCom(systemName, userName); 042 } 043 044 private void checkSystemName(@Nonnull String systemName, @CheckForNull String userName) { 045 if (systemName == null) { 046 log.error("SystemName cannot be null. UserName was {}", 047 (userName == null ? "null" : userName)); 048 throw new IllegalArgumentException("SystemName cannot be null. UserName was " 049 + ((userName == null) ? "null" : userName)); 050 } 051 } 052 053 /** 054 * Provide by userName, then SystemName, else create new. 055 * {@inheritDoc} 056 */ 057 @Override 058 @Nonnull 059 public IdTag newIdTag(@Nonnull String systemName, @CheckForNull String userName) throws IllegalArgumentException { 060 log.debug("new IdTag: {};{}", systemName, (userName == null ? "null" : userName)); 061 checkSystemName(systemName, userName); 062 063 // return existing if there is one 064 RailCom s; 065 if ((userName != null) && ((s = (RailCom)getByUserName(userName)) != null)) { 066 if (getBySystemName(systemName) != s) { 067 log.error("inconsistent user ({}) and system name ({}) results; userName related to ({})", 068 userName, systemName, s.getSystemName()); 069 } 070 return s; 071 } 072 if ((s = (RailCom) getBySystemName(systemName)) != null) { 073 if ((s.getUserName() == null) && (userName != null)) { 074 s.setUserName(userName); 075 } else if (userName != null) { 076 log.warn("Found IdTag via system name ({}) with non-null user name ({})", systemName, userName); 077 } 078 return s; 079 } 080 081 // doesn't exist, make a new one 082 s = createNewIdTag(systemName, userName); 083 // save in the maps 084 register(s); 085 086 // if that failed, blame it on the input arguments 087 if (s == null) { 088 throw new IllegalArgumentException(); 089 } 090 091 return s; 092 } 093 094 @Override 095 public void writeIdTagDetails() throws java.io.IOException { 096 if (this.dirty) { 097 new DefaultIdTagManagerXml(this,"RailComIdTags.xml").store(); // NOI18N 098 this.dirty = false; 099 log.debug("...done writing IdTag details"); 100 } 101 } 102 103 @Override 104 public void readIdTagDetails() { 105 log.debug("reading idTag Details"); 106 new DefaultIdTagManagerXml(this,"RailComIdTags.xml").load(); // NOI18N 107 this.dirty = false; 108 log.debug("...done reading IdTag details"); 109 } 110 111 private static final Logger log = LoggerFactory.getLogger(DefaultRailComManager.class); 112 113}