[DSL] Removed deleted things from internal map (#1058)

* Applied formatter
* Fixed warnings
* Removed deleted things from internal map

Signed-off-by: Christoph Weitkamp <github@christophweitkamp.de>
pull/1062/head
Christoph Weitkamp 2019-09-30 18:53:47 +02:00 committed by Wouter Born
parent 8b72770bf3
commit e8fcba2ccf
1 changed files with 55 additions and 54 deletions

View File

@ -56,7 +56,6 @@ import org.eclipse.smarthome.model.thing.thing.ModelPropertyContainer
import org.eclipse.smarthome.model.thing.thing.ModelThing import org.eclipse.smarthome.model.thing.thing.ModelThing
import org.eclipse.smarthome.model.thing.thing.ThingModel import org.eclipse.smarthome.model.thing.thing.ThingModel
import org.eclipse.xtend.lib.annotations.Data import org.eclipse.xtend.lib.annotations.Data
import org.osgi.framework.FrameworkUtil
import org.osgi.service.component.annotations.Component import org.osgi.service.component.annotations.Component
import org.osgi.service.component.annotations.Reference import org.osgi.service.component.annotations.Reference
import org.slf4j.Logger import org.slf4j.Logger
@ -74,7 +73,6 @@ import org.eclipse.smarthome.core.thing.type.AutoUpdatePolicy
* factory cannot load a thing yet (bug 470368), * factory cannot load a thing yet (bug 470368),
* added delay until ThingTypes are fully loaded * added delay until ThingTypes are fully loaded
* @author Markus Rathgeb - Add locale provider support * @author Markus Rathgeb - Add locale provider support
*
*/ */
@Component(immediate=true, service=ThingProvider) @Component(immediate=true, service=ThingProvider)
class GenericThingProvider extends AbstractProvider<Thing> implements ThingProvider, ModelRepositoryChangeListener, ReadyService.ReadyTracker { class GenericThingProvider extends AbstractProvider<Thing> implements ThingProvider, ModelRepositoryChangeListener, ReadyService.ReadyTracker {
@ -153,7 +151,9 @@ class GenericThingProvider extends AbstractProvider<Thing> implements ThingProvi
val bindingId = new ThingUID(modelThing.bridgeUID).bindingId val bindingId = new ThingUID(modelThing.bridgeUID).bindingId
return new ThingUID(bindingId, modelThing.thingTypeId, modelThing.thingId) return new ThingUID(bindingId, modelThing.thingTypeId, modelThing.thingId)
} else { } else {
logger.warn("Thing {} does not have a bridge so it needs to be defined in full notation like <bindingId>:{}:{}", modelThing.thingTypeId, modelThing.thingTypeId, modelThing.thingId) logger.warn(
"Thing {} does not have a bridge so it needs to be defined in full notation like <bindingId>:{}:{}",
modelThing.thingTypeId, modelThing.thingTypeId, modelThing.thingId)
return null return null
} }
} }
@ -189,7 +189,8 @@ class GenericThingProvider extends AbstractProvider<Thing> implements ThingProvi
return things + flattenModelThings(things.filter(typeof(ModelBridge)).map(b|b.things).flatten); return things + flattenModelThings(things.filter(typeof(ModelBridge)).map(b|b.things).flatten);
} }
def private void createThing(ModelThing modelThing, Collection<Thing> thingList, ThingHandlerFactory thingHandlerFactory) { def private void createThing(ModelThing modelThing, Collection<Thing> thingList,
ThingHandlerFactory thingHandlerFactory) {
val ThingUID thingUID = getThingUID(modelThing, null) val ThingUID thingUID = getThingUID(modelThing, null)
if (thingUID === null) { if (thingUID === null) {
// ignore the Thing because its definition is broken // ignore the Thing because its definition is broken
@ -372,12 +373,9 @@ class GenericThingProvider extends AbstractProvider<Thing> implements ThingProvi
parsedKind = ChannelKind.parse(kind) parsedKind = ChannelKind.parse(kind)
} }
var channel = ChannelBuilder.create(new ChannelUID(thingUID, id), itemType) var channel = ChannelBuilder.create(new ChannelUID(thingUID, id), itemType).withKind(parsedKind).
.withKind(parsedKind) withConfiguration(configuration).withType(channelTypeUID).withLabel(label).
.withConfiguration(configuration) withAutoUpdatePolicy(autoUpdatePolicy)
.withType(channelTypeUID)
.withLabel(label)
.withAutoUpdatePolicy(autoUpdatePolicy)
channels += channel.build() channels += channel.build()
} }
] ]
@ -386,8 +384,8 @@ class GenericThingProvider extends AbstractProvider<Thing> implements ThingProvi
val channelType = it.channelTypeUID.channelType val channelType = it.channelTypeUID.channelType
if (channelType !== null) { if (channelType !== null) {
channels += channels +=
ChannelBuilder.create(new ChannelUID(thingTypeUID, thingUID, id), channelType.itemType). ChannelBuilder.create(new ChannelUID(thingUID, id), channelType.itemType).withType(
withType(it.channelTypeUID).withAutoUpdatePolicy(channelType.autoUpdatePolicy).build it.channelTypeUID).withAutoUpdatePolicy(channelType.autoUpdatePolicy).build
} else { } else {
logger.warn( logger.warn(
"Could not create channel '{}' for thing '{}', because channel type '{}' could not be found.", "Could not create channel '{}' for thing '{}', because channel type '{}' could not be found.",
@ -431,12 +429,12 @@ class GenericThingProvider extends AbstractProvider<Thing> implements ThingProvi
return null return null
} }
} catch (NumberFormatException ex) { } catch (NumberFormatException ex) {
logger.warn("Could not parse default value '{}' as type '{}': {}", defaultValue, parameterType, ex.getMessage(), ex); logger.warn("Could not parse default value '{}' as type '{}': {}", defaultValue, parameterType,
ex.getMessage(), ex);
return null; return null;
} }
} }
def private createConfiguration(ModelPropertyContainer propertyContainer) { def private createConfiguration(ModelPropertyContainer propertyContainer) {
val configuration = new Configuration val configuration = new Configuration
propertyContainer.properties.forEach [ propertyContainer.properties.forEach [
@ -490,12 +488,15 @@ class GenericThingProvider extends AbstractProvider<Thing> implements ThingProvi
val newThingUIDs = model.allThingUIDs val newThingUIDs = model.allThingUIDs
val removedThings = oldThings.filter[!newThingUIDs.contains(it.UID)] val removedThings = oldThings.filter[!newThingUIDs.contains(it.UID)]
removedThings.forEach [ removedThings.forEach [
logger.debug("Removing thing '{}' from model '{}'.", it.UID, modelName)
notifyListenersAboutRemovedElement notifyListenersAboutRemovedElement
] ]
createThingsFromModel(modelName) createThingsFromModel(modelName)
thingsMap.get(modelName).removeAll(removedThings)
} }
} }
case org.eclipse.smarthome.model.core.EventType.REMOVED: { case org.eclipse.smarthome.model.core.EventType.REMOVED: {
logger.debug("Removing all things from model '{}'.", modelName)
val things = thingsMap.remove(modelName) ?: newArrayList val things = thingsMap.remove(modelName) ?: newArrayList
things.forEach [ things.forEach [
notifyListenersAboutRemovedElement notifyListenersAboutRemovedElement