def _load_preset(self, path):
        ''' load, validate and store a single preset file'''

        try:
            with open(path, 'r') as f:
                presetBody = json.load(f)
        except IOError as e:
            raise PresetException("IOError: " + e.strerror)
        except ValueError as e:
            raise PresetException("JSON decoding error: " + str(e))
        except Exception as e:
            raise PresetException(str(e))

        try:
            preset = Preset(presetBody)
        except PresetException as e:
            e.message = "Bad format: " + e.message
            raise

        if(preset.id in self.presets):
            raise PresetException("Duplicate preset id: " + preset.id)
        else:
            self.presets[preset.id] = preset
load, validate and store a single preset file