diff options
-rw-r--r-- | src/org/traccar/BaseProtocolDecoder.java | 10 | ||||
-rw-r--r-- | src/org/traccar/database/DeviceManager.java | 16 |
2 files changed, 26 insertions, 0 deletions
diff --git a/src/org/traccar/BaseProtocolDecoder.java b/src/org/traccar/BaseProtocolDecoder.java index d8130c79e..103a999b0 100644 --- a/src/org/traccar/BaseProtocolDecoder.java +++ b/src/org/traccar/BaseProtocolDecoder.java @@ -19,6 +19,7 @@ import org.jboss.netty.channel.Channel; import org.jboss.netty.channel.socket.DatagramChannel; import org.traccar.helper.Log; import org.traccar.model.Device; +import org.traccar.model.Group; import org.traccar.model.Position; import java.net.InetSocketAddress; @@ -34,8 +35,17 @@ public abstract class BaseProtocolDecoder extends ExtendedObjectDecoder { public long addUnknownDevice(String uniqueId) { Device device = new Device(); + String defaultGroupName = Context.getConfig().getString("database.registerUnknown.defaultGroup", "NOTDEFINED"); device.setName(uniqueId); device.setUniqueId(uniqueId); + device.setCategory(Context.getConfig().getString("database.registerUnknown.defaultCategory", "default")); + + if (!defaultGroupName.equals("NOTDEFINED")) { + Group defaultGroup = Context.getDeviceManager().getGroupByName(defaultGroupName); + if (defaultGroup != null) { + device.setGroupId(defaultGroup.getId()); + } + } try { Context.getDeviceManager().addDevice(device); diff --git a/src/org/traccar/database/DeviceManager.java b/src/org/traccar/database/DeviceManager.java index c70e67231..a75b0616c 100644 --- a/src/org/traccar/database/DeviceManager.java +++ b/src/org/traccar/database/DeviceManager.java @@ -49,6 +49,7 @@ public class DeviceManager implements IdentityManager { private AtomicLong devicesLastUpdate = new AtomicLong(); private Map<Long, Group> groupsById; + private Map<String, Group> groupsByName; private AtomicLong groupsLastUpdate = new AtomicLong(); private final Map<Long, Position> positions = new ConcurrentHashMap<>(); @@ -245,6 +246,9 @@ public class DeviceManager implements IdentityManager { if (groupsById == null) { groupsById = new ConcurrentHashMap<>(databaseGroups.size()); } + if (groupsByName == null) { + groupsByName = new ConcurrentHashMap<>(databaseGroups.size()); + } Set<Long> databaseGroupsIds = new HashSet<>(); for (Group group : databaseGroups) { databaseGroupsIds.add(group.getId()); @@ -254,6 +258,7 @@ public class DeviceManager implements IdentityManager { cachedGroup.setGroupId(group.getGroupId()); } else { groupsById.put(group.getId(), group); + groupsByName.put(group.getName(), group); } } for (Long cachedGroupId : groupsById.keySet()) { @@ -269,6 +274,10 @@ public class DeviceManager implements IdentityManager { return groupsById.get(id); } + public Group getGroupByName(String name) { + return groupsByName.get(name); + } + public Collection<Group> getAllGroups() { boolean forceUpdate = groupsById.isEmpty(); @@ -304,17 +313,24 @@ public class DeviceManager implements IdentityManager { checkGroupCycles(group); dataManager.addGroup(group); groupsById.put(group.getId(), group); + groupsByName.put(group.getName(), group); } public void updateGroup(Group group) throws SQLException { + String oldGroupName = groupsById.get(group.getId()).getName(); checkGroupCycles(group); dataManager.updateGroup(group); groupsById.put(group.getId(), group); + if (!oldGroupName.equals(group.getName())) { + groupsByName.remove(oldGroupName); + } + groupsByName.put(group.getName(), group); } public void removeGroup(long groupId) throws SQLException { dataManager.removeGroup(groupId); groupsById.remove(groupId); + groupsByName.remove(getGroupById(groupId).getName()); } public boolean lookupAttributeBoolean( |