public function __construct()
 {
     parent::__construct();
     $this->type = self::FIELDLIST;
     $this->fieldOrder = new ArrayOf();
     $this->fields = new MapOf(function ($data) {
         switch ($data['type']) {
             case self::FIELDLIST:
                 return new LexConfigFieldList();
             case self::MULTITEXT:
                 return new LexConfigMultiText();
             case self::MULTIPARAGRAPH:
                 return new LexConfigMultiParagraph();
             case self::OPTIONLIST:
                 return new LexConfigOptionList();
             case self::MULTIOPTIONLIST:
                 return new LexConfigMultiOptionList();
             case self::PICTURES:
                 return new LexConfigPictures();
             default:
                 $type = $data['type'];
                 throw new \Exception("Unknown field list config type: {$type}");
         }
     });
 }
 public function __construct()
 {
     parent::__construct();
     $this->type = LexConfig::MULTITEXT;
     $this->displayMultiline = false;
     $this->width = 20;
     $this->inputSystems = new ArrayOf();
 }
 /**
  * @param LexProjectModel $projectModel
  * @param string $fieldName
  * @param string $jsonFilePath
  * @return bool true on success, false otherwise
  * @throws \Exception
  */
 public static function CreateFromJson($projectModel, $fieldName, $jsonFilePath)
 {
     $optionList = new LexOptionListModel($projectModel);
     $listCode = LexConfig::flexOptionlistCode($fieldName);
     if (!$optionList->readByProperty('code', $listCode)) {
         $optionList->name = LexConfig::flexOptionlistName($listCode);
         $optionList->code = $listCode;
         $optionList->canDelete = false;
         $optionList->readFromJson($jsonFilePath);
         $optionList->write();
         return true;
     }
     return false;
 }
 public function __construct()
 {
     $this->tasks = new MapOf(function ($data) {
         switch ($data['type']) {
             case LexTask::DASHBOARD:
                 return new LexTaskDashboard();
             case LexTask::SEMDOM:
                 return new LexTaskSemdom();
             default:
                 return new LexTask();
         }
     });
     $this->roleViews = new MapOf(function () {
         return new LexRoleViewConfig();
     });
     $this->userViews = new MapOf(function () {
         return new LexUserViewConfig();
     });
     // default tasks values
     $this->tasks[LexTask::VIEW] = new LexTask();
     $this->tasks[LexTask::DASHBOARD] = new LexTaskDashboard();
     $this->tasks[LexTask::GATHERTEXTS] = new LexTask();
     $this->tasks[LexTask::SEMDOM] = new LexTaskSemdom();
     $this->tasks[LexTask::WORDLIST] = new LexTask();
     $this->tasks[LexTask::DBE] = new LexTask();
     $this->tasks[LexTask::ADDMEANINGS] = new LexTask();
     $this->tasks[LexTask::ADDGRAMMAR] = new LexTask();
     $this->tasks[LexTask::ADDEXAMPLES] = new LexTask();
     $this->tasks[LexTask::REVIEW] = new LexTask();
     $this->tasks[LexTask::IMPORTEXPORT] = new LexTask();
     $this->tasks[LexTask::CONFIGURATION] = new LexTask();
     // default entry fields values
     $this->entry = new LexConfigFieldList();
     $this->entry->fieldOrder[] = LexConfig::LEXEME;
     $this->entry->fieldOrder[] = LexConfig::CITATIONFORM;
     //$this->entry->fieldOrder[] = LexConfig::ENVIRONMENTS; // Disabled 05-2016
     $this->entry->fieldOrder[] = LexConfig::PRONUNCIATION;
     $this->entry->fieldOrder[] = LexConfig::CVPATTERN;
     $this->entry->fieldOrder[] = LexConfig::TONE;
     $this->entry->fieldOrder[] = LexConfig::LOCATION;
     $this->entry->fieldOrder[] = LexConfig::ETYMOLOGY;
     $this->entry->fieldOrder[] = LexConfig::ETYMOLOGYGLOSS;
     $this->entry->fieldOrder[] = LexConfig::ETYMOLOGYCOMMENT;
     $this->entry->fieldOrder[] = LexConfig::ETYMOLOGYSOURCE;
     $this->entry->fieldOrder[] = LexConfig::NOTE;
     $this->entry->fieldOrder[] = LexConfig::LITERALMEANING;
     $this->entry->fieldOrder[] = LexConfig::ENTRYBIBLIOGRAPHY;
     $this->entry->fieldOrder[] = LexConfig::ENTRYRESTRICTIONS;
     $this->entry->fieldOrder[] = LexConfig::SUMMARYDEFINITION;
     $this->entry->fieldOrder[] = LexConfig::ENTRYIMPORTRESIDUE;
     $this->entry->fieldOrder[] = LexConfig::SENSES_LIST;
     $this->entry->fields[LexConfig::LEXEME] = new LexConfigMultiText();
     $this->entry->fields[LexConfig::LEXEME]->label = 'Word';
     $this->entry->fields[LexConfig::LEXEME]->inputSystems[] = 'th';
     $this->entry->fields[LexConfig::SENSES_LIST] = new LexConfigFieldList();
     $this->entry->fields[LexConfig::SENSES_LIST]->fieldOrder[] = LexConfig::DEFINITION;
     $this->entry->fields[LexConfig::SENSES_LIST]->fieldOrder[] = LexConfig::GLOSS;
     $this->entry->fields[LexConfig::SENSES_LIST]->fieldOrder[] = LexConfig::PICTURES;
     $this->entry->fields[LexConfig::SENSES_LIST]->fieldOrder[] = LexConfig::POS;
     $this->entry->fields[LexConfig::SENSES_LIST]->fieldOrder[] = LexConfig::SEMDOM;
     $this->entry->fields[LexConfig::SENSES_LIST]->fieldOrder[] = LexConfig::SCIENTIFICNAME;
     $this->entry->fields[LexConfig::SENSES_LIST]->fieldOrder[] = LexConfig::ANTHROPOLOGYNOTE;
     $this->entry->fields[LexConfig::SENSES_LIST]->fieldOrder[] = LexConfig::SENSEBIBLIOGRAPHY;
     $this->entry->fields[LexConfig::SENSES_LIST]->fieldOrder[] = LexConfig::DISCOURSENOTE;
     $this->entry->fields[LexConfig::SENSES_LIST]->fieldOrder[] = LexConfig::ENCYCLOPEDICNOTE;
     $this->entry->fields[LexConfig::SENSES_LIST]->fieldOrder[] = LexConfig::GENERALNOTE;
     $this->entry->fields[LexConfig::SENSES_LIST]->fieldOrder[] = LexConfig::GRAMMARNOTE;
     $this->entry->fields[LexConfig::SENSES_LIST]->fieldOrder[] = LexConfig::PHONOLOGYNOTE;
     $this->entry->fields[LexConfig::SENSES_LIST]->fieldOrder[] = LexConfig::SENSERESTRCTIONS;
     $this->entry->fields[LexConfig::SENSES_LIST]->fieldOrder[] = LexConfig::SEMANTICSNOTE;
     $this->entry->fields[LexConfig::SENSES_LIST]->fieldOrder[] = LexConfig::SOCIOLINGUISTICSNOTE;
     $this->entry->fields[LexConfig::SENSES_LIST]->fieldOrder[] = LexConfig::SOURCE;
     $this->entry->fields[LexConfig::SENSES_LIST]->fieldOrder[] = LexConfig::USAGES;
     //$this->entry->fields[LexConfig::SENSES_LIST]->fieldOrder[] = LexConfig::REVERSALENTRIES; // Disabled 05-2016
     $this->entry->fields[LexConfig::SENSES_LIST]->fieldOrder[] = LexConfig::SENSETYPE;
     $this->entry->fields[LexConfig::SENSES_LIST]->fieldOrder[] = LexConfig::ACADEMICDOMAINS;
     $this->entry->fields[LexConfig::SENSES_LIST]->fieldOrder[] = LexConfig::SENSEPUBLISHIN;
     $this->entry->fields[LexConfig::SENSES_LIST]->fieldOrder[] = LexConfig::ANTHROPOLOGYCATEGORIES;
     $this->entry->fields[LexConfig::SENSES_LIST]->fieldOrder[] = LexConfig::SENSEIMPORTRESIDUE;
     $this->entry->fields[LexConfig::SENSES_LIST]->fieldOrder[] = LexConfig::STATUS;
     $this->entry->fields[LexConfig::SENSES_LIST]->fieldOrder[] = LexConfig::EXAMPLES_LIST;
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::DEFINITION] = new LexConfigMultiText();
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::DEFINITION]->label = 'Definition';
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::DEFINITION]->inputSystems[] = 'en';
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::POS] = new LexConfigOptionList();
     $listCode = LexConfig::flexOptionlistCode(LexConfig::POS);
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::POS]->label = LexConfig::flexOptionlistName($listCode);
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::POS]->listCode = $listCode;
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::SEMDOM] = new LexConfigMultiOptionList();
     $listCode = LexConfig::flexOptionlistCode(LexConfig::SEMDOM);
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::SEMDOM]->label = LexConfig::flexOptionlistName($listCode);
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::SEMDOM]->listCode = $listCode;
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::EXAMPLES_LIST] = new LexConfigFieldList();
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::EXAMPLES_LIST]->fieldOrder[] = LexConfig::EXAMPLE_SENTENCE;
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::EXAMPLES_LIST]->fieldOrder[] = LexConfig::EXAMPLE_TRANSLATION;
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::EXAMPLES_LIST]->fieldOrder[] = LexConfig::REFERENCE;
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::EXAMPLES_LIST]->fieldOrder[] = LexConfig::EXAMPLEPUBLISHIN;
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::EXAMPLES_LIST]->fields[LexConfig::EXAMPLE_SENTENCE] = new LexConfigMultiText();
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::EXAMPLES_LIST]->fields[LexConfig::EXAMPLE_SENTENCE]->label = 'Sentence';
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::EXAMPLES_LIST]->fields[LexConfig::EXAMPLE_SENTENCE]->inputSystems[] = 'th';
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::EXAMPLES_LIST]->fields[LexConfig::EXAMPLE_TRANSLATION] = new LexConfigMultiText();
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::EXAMPLES_LIST]->fields[LexConfig::EXAMPLE_TRANSLATION]->label = 'Translation';
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::EXAMPLES_LIST]->fields[LexConfig::EXAMPLE_TRANSLATION]->inputSystems[] = 'en';
     //$this->entry->fields[LexConfig::CUSTOM_FIELDS_LIST] = new LexConfigFieldList();
     //$this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::CUSTOM_FIELDS_LIST] = new LexConfigFieldList();
     //$this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::EXAMPLES_LIST]->fields[LexConfig::CUSTOM_FIELDS_LIST] = new LexConfigFieldList();
     /*  Configuration for less common fields (mostly used in FLEx are defined below) */
     $this->entry->fields[LexConfig::CITATIONFORM] = new LexConfigMultiText();
     $this->entry->fields[LexConfig::CITATIONFORM]->label = 'Citation Form';
     $this->entry->fields[LexConfig::CITATIONFORM]->hideIfEmpty = true;
     $this->entry->fields[LexConfig::CITATIONFORM]->inputSystems[] = 'th';
     /*
     ENVIRONMENTS disabled 05-2016
     $this->entry->fields[LexConfig::ENVIRONMENTS] = new LexConfigMultiOptionList();
     $listCode = LexConfig::flexOptionlistCode(LexConfig::ENVIRONMENTS);
     $this->entry->fields[LexConfig::ENVIRONMENTS]->label = LexConfig::flexOptionlistName($listCode);
     $this->entry->fields[LexConfig::ENVIRONMENTS]->listCode = $listCode;
     $this->entry->fields[LexConfig::ENVIRONMENTS]->hideIfEmpty = true;
     */
     $this->entry->fields[LexConfig::PRONUNCIATION] = new LexConfigMultiText();
     $this->entry->fields[LexConfig::PRONUNCIATION]->label = 'Pronunciation';
     $this->entry->fields[LexConfig::PRONUNCIATION]->hideIfEmpty = true;
     $this->entry->fields[LexConfig::PRONUNCIATION]->inputSystems[] = 'en';
     $this->entry->fields[LexConfig::CVPATTERN] = new LexConfigMultiText();
     $this->entry->fields[LexConfig::CVPATTERN]->label = 'CV Pattern';
     $this->entry->fields[LexConfig::CVPATTERN]->hideIfEmpty = true;
     $this->entry->fields[LexConfig::CVPATTERN]->inputSystems[] = 'en';
     $this->entry->fields[LexConfig::TONE] = new LexConfigMultiText();
     $this->entry->fields[LexConfig::TONE]->label = 'Tone';
     $this->entry->fields[LexConfig::TONE]->hideIfEmpty = true;
     $this->entry->fields[LexConfig::TONE]->inputSystems[] = 'en';
     $this->entry->fields[LexConfig::LOCATION] = new LexConfigOptionList();
     $listCode = LexConfig::flexOptionlistCode(LexConfig::LOCATION);
     $this->entry->fields[LexConfig::LOCATION]->label = LexConfig::flexOptionlistName($listCode);
     $this->entry->fields[LexConfig::LOCATION]->listCode = $listCode;
     $this->entry->fields[LexConfig::LOCATION]->hideIfEmpty = true;
     $this->entry->fields[LexConfig::ETYMOLOGY] = new LexConfigMultiText();
     $this->entry->fields[LexConfig::ETYMOLOGY]->label = 'Etymology';
     $this->entry->fields[LexConfig::ETYMOLOGY]->hideIfEmpty = true;
     $this->entry->fields[LexConfig::ETYMOLOGY]->inputSystems[] = 'en';
     $this->entry->fields[LexConfig::ETYMOLOGYGLOSS] = new LexConfigMultiText();
     $this->entry->fields[LexConfig::ETYMOLOGYGLOSS]->label = 'Etymology Gloss';
     $this->entry->fields[LexConfig::ETYMOLOGYGLOSS]->hideIfEmpty = true;
     $this->entry->fields[LexConfig::ETYMOLOGYGLOSS]->inputSystems[] = 'en';
     $this->entry->fields[LexConfig::ETYMOLOGYCOMMENT] = new LexConfigMultiText();
     $this->entry->fields[LexConfig::ETYMOLOGYCOMMENT]->label = 'Etymology Comment';
     $this->entry->fields[LexConfig::ETYMOLOGYCOMMENT]->hideIfEmpty = true;
     $this->entry->fields[LexConfig::ETYMOLOGYCOMMENT]->inputSystems[] = 'en';
     $this->entry->fields[LexConfig::ETYMOLOGYSOURCE] = new LexConfigMultiText();
     $this->entry->fields[LexConfig::ETYMOLOGYSOURCE]->label = 'Etymology Source';
     $this->entry->fields[LexConfig::ETYMOLOGYSOURCE]->hideIfEmpty = true;
     $this->entry->fields[LexConfig::ETYMOLOGYSOURCE]->inputSystems[] = 'en';
     $this->entry->fields[LexConfig::NOTE] = new LexConfigMultiText();
     $this->entry->fields[LexConfig::NOTE]->label = 'Note';
     $this->entry->fields[LexConfig::NOTE]->hideIfEmpty = true;
     $this->entry->fields[LexConfig::NOTE]->inputSystems[] = 'en';
     $this->entry->fields[LexConfig::LITERALMEANING] = new LexConfigMultiText();
     $this->entry->fields[LexConfig::LITERALMEANING]->label = 'Literal Meaning';
     $this->entry->fields[LexConfig::LITERALMEANING]->hideIfEmpty = true;
     $this->entry->fields[LexConfig::LITERALMEANING]->inputSystems[] = 'en';
     $this->entry->fields[LexConfig::ENTRYBIBLIOGRAPHY] = new LexConfigMultiText();
     $this->entry->fields[LexConfig::ENTRYBIBLIOGRAPHY]->label = 'Bibliography';
     $this->entry->fields[LexConfig::ENTRYBIBLIOGRAPHY]->hideIfEmpty = true;
     $this->entry->fields[LexConfig::ENTRYBIBLIOGRAPHY]->inputSystems[] = 'en';
     $this->entry->fields[LexConfig::ENTRYRESTRICTIONS] = new LexConfigMultiText();
     $this->entry->fields[LexConfig::ENTRYRESTRICTIONS]->label = 'Restrictions';
     $this->entry->fields[LexConfig::ENTRYRESTRICTIONS]->hideIfEmpty = true;
     $this->entry->fields[LexConfig::ENTRYRESTRICTIONS]->inputSystems[] = 'en';
     $this->entry->fields[LexConfig::SUMMARYDEFINITION] = new LexConfigMultiText();
     $this->entry->fields[LexConfig::SUMMARYDEFINITION]->label = 'Summary Definition';
     $this->entry->fields[LexConfig::SUMMARYDEFINITION]->hideIfEmpty = true;
     $this->entry->fields[LexConfig::SUMMARYDEFINITION]->inputSystems[] = 'en';
     $this->entry->fields[LexConfig::ENTRYIMPORTRESIDUE] = new LexConfigMultiText();
     $this->entry->fields[LexConfig::ENTRYIMPORTRESIDUE]->label = 'Import Residue';
     $this->entry->fields[LexConfig::ENTRYIMPORTRESIDUE]->hideIfEmpty = true;
     $this->entry->fields[LexConfig::ENTRYIMPORTRESIDUE]->inputSystems[] = 'en';
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::GLOSS] = new LexConfigMultiText();
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::GLOSS]->label = 'Gloss';
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::GLOSS]->hideIfEmpty = true;
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::GLOSS]->inputSystems[] = 'en';
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::PICTURES] = new LexConfigPictures();
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::PICTURES]->label = 'Pictures';
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::PICTURES]->hideIfEmpty = true;
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::PICTURES]->captionLabel = 'Captions';
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::PICTURES]->captionHideIfEmpty = true;
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::PICTURES]->inputSystems[] = 'en';
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::SCIENTIFICNAME] = new LexConfigMultiText();
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::SCIENTIFICNAME]->label = 'Scientific Name';
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::SCIENTIFICNAME]->hideIfEmpty = true;
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::SCIENTIFICNAME]->inputSystems[] = 'en';
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::ANTHROPOLOGYNOTE] = new LexConfigMultiText();
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::ANTHROPOLOGYNOTE]->label = 'Anthropology Note';
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::ANTHROPOLOGYNOTE]->hideIfEmpty = true;
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::ANTHROPOLOGYNOTE]->inputSystems[] = 'en';
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::SENSEBIBLIOGRAPHY] = new LexConfigMultiText();
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::SENSEBIBLIOGRAPHY]->label = 'Bibliography';
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::SENSEBIBLIOGRAPHY]->hideIfEmpty = true;
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::SENSEBIBLIOGRAPHY]->inputSystems[] = 'en';
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::DISCOURSENOTE] = new LexConfigMultiText();
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::DISCOURSENOTE]->label = 'Discourse Note';
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::DISCOURSENOTE]->hideIfEmpty = true;
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::DISCOURSENOTE]->inputSystems[] = 'en';
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::ENCYCLOPEDICNOTE] = new LexConfigMultiText();
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::ENCYCLOPEDICNOTE]->label = 'Encyclopedic Note';
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::ENCYCLOPEDICNOTE]->hideIfEmpty = true;
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::ENCYCLOPEDICNOTE]->inputSystems[] = 'en';
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::GENERALNOTE] = new LexConfigMultiText();
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::GENERALNOTE]->label = 'General Note';
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::GENERALNOTE]->hideIfEmpty = true;
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::GENERALNOTE]->inputSystems[] = 'en';
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::GRAMMARNOTE] = new LexConfigMultiText();
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::GRAMMARNOTE]->label = 'Grammar Note';
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::GRAMMARNOTE]->hideIfEmpty = true;
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::GRAMMARNOTE]->inputSystems[] = 'en';
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::PHONOLOGYNOTE] = new LexConfigMultiText();
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::PHONOLOGYNOTE]->label = 'Phonology Note';
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::PHONOLOGYNOTE]->hideIfEmpty = true;
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::PHONOLOGYNOTE]->inputSystems[] = 'en';
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::SENSERESTRCTIONS] = new LexConfigMultiText();
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::SENSERESTRCTIONS]->label = 'Restrictions';
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::SENSERESTRCTIONS]->hideIfEmpty = true;
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::SENSERESTRCTIONS]->inputSystems[] = 'en';
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::SEMANTICSNOTE] = new LexConfigMultiText();
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::SEMANTICSNOTE]->label = 'Semantics Note';
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::SEMANTICSNOTE]->hideIfEmpty = true;
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::SEMANTICSNOTE]->inputSystems[] = 'en';
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::SOCIOLINGUISTICSNOTE] = new LexConfigMultiText();
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::SOCIOLINGUISTICSNOTE]->label = 'Sociolinguistics Note';
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::SOCIOLINGUISTICSNOTE]->hideIfEmpty = true;
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::SOCIOLINGUISTICSNOTE]->inputSystems[] = 'en';
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::SOURCE] = new LexConfigMultiText();
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::SOURCE]->label = 'Source';
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::SOURCE]->hideIfEmpty = true;
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::SOURCE]->inputSystems[] = 'en';
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::USAGES] = new LexConfigMultiOptionList();
     $listCode = LexConfig::flexOptionlistCode(LexConfig::USAGES);
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::USAGES]->label = LexConfig::flexOptionlistName($listCode);
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::USAGES]->listCode = $listCode;
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::USAGES]->hideIfEmpty = true;
     // TODO This needs to be a taglist DDW 2014-07
     /*
     REVERSALENTRIES disabled 05-2016
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::REVERSALENTRIES] = new LexConfigMultiOptionList();
     $listCode = LexConfig::flexOptionlistCode(LexConfig::REVERSALENTRIES);
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::REVERSALENTRIES]->label = LexConfig::flexOptionlistName($listCode);
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::REVERSALENTRIES]->listCode = $listCode;
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::REVERSALENTRIES]->hideIfEmpty = true;
     */
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::SENSETYPE] = new LexConfigOptionList();
     $listCode = LexConfig::flexOptionlistCode(LexConfig::SENSETYPE);
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::SENSETYPE]->label = LexConfig::flexOptionlistName($listCode);
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::SENSETYPE]->listCode = $listCode;
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::SENSETYPE]->hideIfEmpty = true;
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::ACADEMICDOMAINS] = new LexConfigMultiOptionList();
     $listCode = LexConfig::flexOptionlistCode(LexConfig::ACADEMICDOMAINS);
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::ACADEMICDOMAINS]->label = LexConfig::flexOptionlistName($listCode);
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::ACADEMICDOMAINS]->listCode = $listCode;
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::ACADEMICDOMAINS]->hideIfEmpty = true;
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::SENSEPUBLISHIN] = new LexConfigMultiOptionList();
     $listCode = LexConfig::flexOptionlistCode(LexConfig::SENSEPUBLISHIN);
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::SENSEPUBLISHIN]->label = LexConfig::flexOptionlistName($listCode);
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::SENSEPUBLISHIN]->listCode = $listCode;
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::SENSEPUBLISHIN]->hideIfEmpty = true;
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::ANTHROPOLOGYCATEGORIES] = new LexConfigMultiOptionList();
     $listCode = LexConfig::flexOptionlistCode(LexConfig::ANTHROPOLOGYCATEGORIES);
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::ANTHROPOLOGYCATEGORIES]->label = LexConfig::flexOptionlistName($listCode);
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::ANTHROPOLOGYCATEGORIES]->listCode = $listCode;
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::ANTHROPOLOGYCATEGORIES]->hideIfEmpty = true;
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::SENSEIMPORTRESIDUE] = new LexConfigMultiText();
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::SENSEIMPORTRESIDUE]->label = 'Import Residue';
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::SENSEIMPORTRESIDUE]->hideIfEmpty = true;
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::SENSEIMPORTRESIDUE]->inputSystems[] = 'en';
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::STATUS] = new LexConfigOptionList();
     $listCode = LexConfig::flexOptionlistCode(LexConfig::STATUS);
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::STATUS]->label = LexConfig::flexOptionlistName($listCode);
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::STATUS]->listCode = $listCode;
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::STATUS]->hideIfEmpty = true;
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::EXAMPLES_LIST]->fields[LexConfig::REFERENCE] = new LexConfigMultiText();
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::EXAMPLES_LIST]->fields[LexConfig::REFERENCE]->label = 'Reference';
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::EXAMPLES_LIST]->fields[LexConfig::REFERENCE]->hideIfEmpty = true;
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::EXAMPLES_LIST]->fields[LexConfig::REFERENCE]->inputSystems[] = 'en';
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::EXAMPLES_LIST]->fields[LexConfig::EXAMPLEPUBLISHIN] = new LexConfigMultiOptionList();
     $listCode = LexConfig::flexOptionlistCode(LexConfig::EXAMPLEPUBLISHIN);
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::EXAMPLES_LIST]->fields[LexConfig::EXAMPLEPUBLISHIN]->label = LexConfig::flexOptionlistName($listCode);
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::EXAMPLES_LIST]->fields[LexConfig::EXAMPLEPUBLISHIN]->listCode = $listCode;
     $this->entry->fields[LexConfig::SENSES_LIST]->fields[LexConfig::EXAMPLES_LIST]->fields[LexConfig::EXAMPLEPUBLISHIN]->hideIfEmpty = true;
     // default role views values
     $this->roleViews[LexRoles::OBSERVER] = new LexRoleViewConfig();
     $this->roleViews[LexRoles::OBSERVER_WITH_COMMENT] = new LexRoleViewConfig();
     $this->roleViews[LexRoles::CONTRIBUTOR] = new LexRoleViewConfig();
     $this->roleViews[LexRoles::MANAGER] = new LexRoleViewConfig();
     $this->roleViews[LexRoles::OBSERVER]->fields[LexConfig::LEXEME] = new LexViewMultiTextFieldConfig(true);
     $this->roleViews[LexRoles::OBSERVER]->fields[LexConfig::DEFINITION] = new LexViewMultiTextFieldConfig(true);
     $this->roleViews[LexRoles::OBSERVER]->fields[LexConfig::POS] = new LexViewFieldConfig(true);
     $this->roleViews[LexRoles::OBSERVER]->fields[LexConfig::SEMDOM] = new LexViewFieldConfig(true);
     $this->roleViews[LexRoles::OBSERVER]->fields[LexConfig::EXAMPLE_SENTENCE] = new LexViewMultiTextFieldConfig(true);
     $this->roleViews[LexRoles::OBSERVER]->fields[LexConfig::EXAMPLE_TRANSLATION] = new LexViewMultiTextFieldConfig(true);
     // Less common fields are visible by default
     $this->roleViews[LexRoles::OBSERVER]->fields[LexConfig::GLOSS] = new LexViewMultiTextFieldConfig(true);
     $this->roleViews[LexRoles::OBSERVER]->fields[LexConfig::PICTURES] = new LexViewMultiTextFieldConfig(true);
     $this->roleViews[LexRoles::OBSERVER]->fields[LexConfig::CITATIONFORM] = new LexViewMultiTextFieldConfig(true);
     //$this->roleViews[LexRoles::OBSERVER]->fields[LexConfig::ENVIRONMENTS] = new LexViewFieldConfig(true); // Disabled 05-2016
     $this->roleViews[LexRoles::OBSERVER]->fields[LexConfig::PRONUNCIATION] = new LexViewMultiTextFieldConfig(true);
     $this->roleViews[LexRoles::OBSERVER]->fields[LexConfig::CVPATTERN] = new LexViewMultiTextFieldConfig(true);
     $this->roleViews[LexRoles::OBSERVER]->fields[LexConfig::TONE] = new LexViewMultiTextFieldConfig(true);
     $this->roleViews[LexRoles::OBSERVER]->fields[LexConfig::LOCATION] = new LexViewFieldConfig(true);
     $this->roleViews[LexRoles::OBSERVER]->fields[LexConfig::ETYMOLOGY] = new LexViewMultiTextFieldConfig(true);
     $this->roleViews[LexRoles::OBSERVER]->fields[LexConfig::ETYMOLOGYGLOSS] = new LexViewMultiTextFieldConfig(true);
     $this->roleViews[LexRoles::OBSERVER]->fields[LexConfig::ETYMOLOGYCOMMENT] = new LexViewMultiTextFieldConfig(true);
     $this->roleViews[LexRoles::OBSERVER]->fields[LexConfig::ETYMOLOGYSOURCE] = new LexViewMultiTextFieldConfig(true);
     $this->roleViews[LexRoles::OBSERVER]->fields[LexConfig::NOTE] = new LexViewMultiTextFieldConfig(true);
     $this->roleViews[LexRoles::OBSERVER]->fields[LexConfig::LITERALMEANING] = new LexViewMultiTextFieldConfig(true);
     $this->roleViews[LexRoles::OBSERVER]->fields[LexConfig::ENTRYBIBLIOGRAPHY] = new LexViewMultiTextFieldConfig(true);
     $this->roleViews[LexRoles::OBSERVER]->fields[LexConfig::ENTRYRESTRICTIONS] = new LexViewMultiTextFieldConfig(true);
     $this->roleViews[LexRoles::OBSERVER]->fields[LexConfig::SUMMARYDEFINITION] = new LexViewMultiTextFieldConfig(true);
     $this->roleViews[LexRoles::OBSERVER]->fields[LexConfig::ENTRYIMPORTRESIDUE] = new LexViewMultiTextFieldConfig(true);
     $this->roleViews[LexRoles::OBSERVER]->fields[LexConfig::SCIENTIFICNAME] = new LexViewMultiTextFieldConfig(true);
     $this->roleViews[LexRoles::OBSERVER]->fields[LexConfig::ANTHROPOLOGYNOTE] = new LexViewMultiTextFieldConfig(true);
     $this->roleViews[LexRoles::OBSERVER]->fields[LexConfig::SENSEBIBLIOGRAPHY] = new LexViewMultiTextFieldConfig(true);
     $this->roleViews[LexRoles::OBSERVER]->fields[LexConfig::DISCOURSENOTE] = new LexViewMultiTextFieldConfig(true);
     $this->roleViews[LexRoles::OBSERVER]->fields[LexConfig::ENCYCLOPEDICNOTE] = new LexViewMultiTextFieldConfig(true);
     $this->roleViews[LexRoles::OBSERVER]->fields[LexConfig::GENERALNOTE] = new LexViewMultiTextFieldConfig(true);
     $this->roleViews[LexRoles::OBSERVER]->fields[LexConfig::GRAMMARNOTE] = new LexViewMultiTextFieldConfig(true);
     $this->roleViews[LexRoles::OBSERVER]->fields[LexConfig::PHONOLOGYNOTE] = new LexViewMultiTextFieldConfig(true);
     $this->roleViews[LexRoles::OBSERVER]->fields[LexConfig::SENSERESTRCTIONS] = new LexViewMultiTextFieldConfig(true);
     $this->roleViews[LexRoles::OBSERVER]->fields[LexConfig::SEMANTICSNOTE] = new LexViewMultiTextFieldConfig(true);
     $this->roleViews[LexRoles::OBSERVER]->fields[LexConfig::SOCIOLINGUISTICSNOTE] = new LexViewMultiTextFieldConfig(true);
     $this->roleViews[LexRoles::OBSERVER]->fields[LexConfig::SOURCE] = new LexViewMultiTextFieldConfig(true);
     $this->roleViews[LexRoles::OBSERVER]->fields[LexConfig::USAGES] = new LexViewFieldConfig(true);
     //$this->roleViews[LexRoles::OBSERVER]->fields[LexConfig::REVERSALENTRIES] = new LexViewFieldConfig(true); // Disabled 05-2016
     $this->roleViews[LexRoles::OBSERVER]->fields[LexConfig::SENSETYPE] = new LexViewFieldConfig(true);
     $this->roleViews[LexRoles::OBSERVER]->fields[LexConfig::ACADEMICDOMAINS] = new LexViewFieldConfig(true);
     $this->roleViews[LexRoles::OBSERVER]->fields[LexConfig::SENSEPUBLISHIN] = new LexViewFieldConfig(true);
     $this->roleViews[LexRoles::OBSERVER]->fields[LexConfig::ANTHROPOLOGYCATEGORIES] = new LexViewFieldConfig(true);
     $this->roleViews[LexRoles::OBSERVER]->fields[LexConfig::SENSEIMPORTRESIDUE] = new LexViewMultiTextFieldConfig(true);
     $this->roleViews[LexRoles::OBSERVER]->fields[LexConfig::STATUS] = new LexViewFieldConfig(true);
     $this->roleViews[LexRoles::OBSERVER]->fields[LexConfig::REFERENCE] = new LexViewMultiTextFieldConfig(true);
     $this->roleViews[LexRoles::OBSERVER]->fields[LexConfig::EXAMPLEPUBLISHIN] = new LexViewFieldConfig(true);
     $this->roleViews[LexRoles::OBSERVER_WITH_COMMENT]->fields = clone $this->roleViews[LexRoles::OBSERVER]->fields;
     $this->roleViews[LexRoles::CONTRIBUTOR]->fields = clone $this->roleViews[LexRoles::OBSERVER]->fields;
     $this->roleViews[LexRoles::MANAGER]->fields = clone $this->roleViews[LexRoles::OBSERVER]->fields;
     $this->roleViews[LexRoles::OBSERVER]->showTasks[LexTask::VIEW] = true;
     $this->roleViews[LexRoles::OBSERVER]->showTasks[LexTask::DASHBOARD] = true;
     $this->roleViews[LexRoles::OBSERVER]->showTasks[LexTask::GATHERTEXTS] = false;
     $this->roleViews[LexRoles::OBSERVER]->showTasks[LexTask::SEMDOM] = false;
     $this->roleViews[LexRoles::OBSERVER]->showTasks[LexTask::WORDLIST] = false;
     $this->roleViews[LexRoles::OBSERVER]->showTasks[LexTask::DBE] = true;
     $this->roleViews[LexRoles::OBSERVER]->showTasks[LexTask::ADDMEANINGS] = false;
     $this->roleViews[LexRoles::OBSERVER]->showTasks[LexTask::ADDGRAMMAR] = false;
     $this->roleViews[LexRoles::OBSERVER]->showTasks[LexTask::ADDEXAMPLES] = false;
     $this->roleViews[LexRoles::OBSERVER]->showTasks[LexTask::REVIEW] = false;
     $this->roleViews[LexRoles::OBSERVER_WITH_COMMENT]->showTasks = clone $this->roleViews[LexRoles::OBSERVER]->showTasks;
     $this->roleViews[LexRoles::CONTRIBUTOR]->showTasks = clone $this->roleViews[LexRoles::OBSERVER]->showTasks;
     $this->roleViews[LexRoles::CONTRIBUTOR]->showTasks[LexTask::ADDMEANINGS] = true;
     $this->roleViews[LexRoles::CONTRIBUTOR]->showTasks[LexTask::ADDGRAMMAR] = true;
     $this->roleViews[LexRoles::CONTRIBUTOR]->showTasks[LexTask::ADDEXAMPLES] = true;
     $this->roleViews[LexRoles::MANAGER]->showTasks = clone $this->roleViews[LexRoles::CONTRIBUTOR]->showTasks;
     $this->roleViews[LexRoles::MANAGER]->showTasks[LexTask::GATHERTEXTS] = true;
     $this->roleViews[LexRoles::MANAGER]->showTasks[LexTask::SEMDOM] = true;
     $this->roleViews[LexRoles::MANAGER]->showTasks[LexTask::WORDLIST] = true;
     $this->roleViews[LexRoles::MANAGER]->showTasks[LexTask::REVIEW] = true;
 }
 /**
  * @param string $liftFilePath
  * @param LexProjectModel $projectModel
  * @param string $mergeRule (use LiftMergeRule const)
  * @param boolean $skipSameModTime
  * @param boolean $deleteMatchingEntry
  * @return LiftImport
  */
 public function merge($liftFilePath, $projectModel, $mergeRule = LiftMergeRule::CREATE_DUPLICATES, $skipSameModTime = true, $deleteMatchingEntry = false)
 {
     ini_set('max_execution_time', 180);
     // Sufficient time to import webster.  TODO Make this async CP 2014-10
     $entryList = new LexEntryListModel($projectModel);
     $entryList->read();
     $hasExistingData = $entryList->count != 0;
     $savedInputSystems = array();
     if (!$hasExistingData) {
         $projectModel->config->clearAllInputSystems();
         // save and clear input systems
         $savedInputSystems = $projectModel->inputSystems->getArrayCopy();
         $projectModel->inputSystems->exchangeArray(array());
     }
     $reader = new \XMLReader();
     $reader->open($liftFilePath);
     $this->liftDecoder = new LiftDecoder($projectModel);
     $this->stats = new LiftImportStats($entryList->count);
     $this->report = new ImportErrorReport();
     $this->liftImportNodeError = new LiftImportNodeError(LiftImportNodeError::FILE, basename($liftFilePath));
     $liftRangeDecoder = new LiftRangeDecoder($projectModel);
     $liftRangeFiles = array();
     // Key: filenames. Value: parsed files.
     $liftRanges = array();
     // Key: @id attributes of <range> elements. Value: parsed <range> elements.
     $liftFolderPath = dirname($liftFilePath);
     while ($reader->read()) {
         // Read LIFT ranges in the header of the LIFT file
         if ($reader->nodeType == \XMLReader::ELEMENT && $reader->localName == 'range') {
             $node = $reader->expand();
             $rangeId = $node->attributes->getNamedItem('id')->textContent;
             $rangeHref = $node->attributes->getNamedItem('href')->textContent;
             $hrefPath = parse_url($rangeHref, PHP_URL_PATH);
             $rangeFilename = basename($hrefPath);
             $rangeFilePath = null;
             $rangeImportNodeError = new LiftRangeImportNodeError(LiftRangeImportNodeError::FILE, $rangeFilename);
             if (!array_key_exists($rangeFilename, $liftRangeFiles)) {
                 // Haven't parsed the .lift-ranges file yet. We'll assume it is alongside the .lift file.
                 $rangeFilePath = $liftFolderPath . "/" . $rangeFilename;
                 if (file_exists($rangeFilePath)) {
                     $sxeNode = simplexml_load_file($rangeFilePath);
                     $parsedRanges = $liftRangeDecoder->decode($sxeNode);
                     $liftRanges = array_merge($liftRanges, $parsedRanges);
                     $liftRangeFiles[] = $rangeFilename;
                 } else {
                     // Range file was NOT found in alongside the .lift file
                     $rangeImportNodeError->addRangeFileNotFound(basename($liftFilePath));
                 }
             }
             // pull out the referenced range
             if (isset($liftRanges[$rangeId])) {
                 $range = $liftRanges[$rangeId];
             } else {
                 $range = null;
                 if (file_exists($rangeFilePath)) {
                     // Range was NOT found in referenced .lift-ranges file after parsing it
                     $rangeImportNodeError->addRangeNotFound($rangeId);
                 }
             }
             // Range elements defined in LIFT file override any values defined in .lift-ranges file.
             if ($node->hasChildNodes()) {
                 $rangeNode = self::domNode_to_sxeNode($node);
                 $range = $liftRangeDecoder->readRange($rangeNode, $range);
                 $liftRanges[$rangeId] = $range;
             }
             if ($rangeImportNodeError->hasErrors()) {
                 $this->liftImportNodeError->addSubnodeError($rangeImportNodeError);
             }
         }
         // Read the custom 'fields' spec in the header of the LIFT file
         if ($reader->nodeType == \XMLReader::ELEMENT && $reader->localName == 'fields') {
             $isInFieldsSectionOfLift = true;
             $this->liftDecoder->liftFields = array();
             while ($isInFieldsSectionOfLift && $reader->read()) {
                 if ($reader->nodeType == \XMLReader::ELEMENT && $reader->localName == 'field') {
                     $node = $reader->expand();
                     $sxeNode = self::domNode_to_sxeNode($node);
                     $LiftFieldTag = (string) $sxeNode['tag'];
                     $liftField = array();
                     /** @var \SimpleXMLElement $element */
                     foreach ($sxeNode as $element) {
                         if ($element->getName() === 'form') {
                             $inputSystemTag = (string) $element['lang'];
                             $liftField[$inputSystemTag] = (string) $element->{'text'};
                         }
                     }
                     $this->liftDecoder->liftFields[$LiftFieldTag] = $liftField;
                 } elseif ($reader->nodeType == \XMLReader::END_ELEMENT && $reader->localName == 'fields') {
                     $isInFieldsSectionOfLift = false;
                 }
             }
         }
         // Read an entry node
         if ($reader->nodeType == \XMLReader::ELEMENT && $reader->localName == 'entry') {
             $this->stats->importEntries++;
             $node = $reader->expand();
             $sxeNode = self::domNode_to_sxeNode($node);
             $guid = $reader->getAttribute('guid');
             $existingEntry = $entryList->searchEntriesFor('guid', $guid);
             if ($existingEntry) {
                 $entry = new LexEntryModel($projectModel, $existingEntry['id']);
                 $dateModified = $reader->getAttribute('dateModified');
                 if (self::differentModTime($dateModified, $entry->authorInfo->modifiedDate) || !$skipSameModTime) {
                     if ($mergeRule == LiftMergeRule::CREATE_DUPLICATES) {
                         $entry = new LexEntryModel($projectModel);
                         $this->readEntryWithErrorReport($sxeNode, $entry, $mergeRule);
                         $entry->guid = '';
                         $entry->write();
                         $this->stats->entriesDuplicated++;
                     } else {
                         if (isset($sxeNode->{'lexical-unit'})) {
                             $this->readEntryWithErrorReport($sxeNode, $entry, $mergeRule);
                             $entry->write();
                             $this->stats->entriesMerged++;
                         } elseif (isset($sxeNode->attributes()->{'dateDeleted'}) && $deleteMatchingEntry) {
                             LexEntryModel::remove($projectModel, $existingEntry['id']);
                             $this->stats->entriesDeleted++;
                         }
                     }
                 } else {
                     // skip because same mod time and skip enabled
                     if (!isset($sxeNode->{'lexical-unit'}) && isset($sxeNode->attributes()->{'dateDeleted'}) && $deleteMatchingEntry) {
                         LexEntryModel::remove($projectModel, $existingEntry['id']);
                         $this->stats->entriesDeleted++;
                     }
                 }
             } else {
                 if (isset($sxeNode->{'lexical-unit'})) {
                     $entry = new LexEntryModel($projectModel);
                     $this->readEntryWithErrorReport($sxeNode, $entry, $mergeRule);
                     $entry->write();
                     $this->stats->newEntries++;
                 }
             }
         }
     }
     $reader->close();
     // put back saved input systems if none found in the imported data
     if (!$hasExistingData && $projectModel->inputSystems->count() <= 0) {
         $projectModel->inputSystems->exchangeArray($savedInputSystems);
     }
     // add lift ranges
     if ($mergeRule != LiftMergeRule::IMPORT_LOSES) {
         foreach ($liftRanges as $liftRangeCode => $liftRange) {
             // add everything except semantic domains
             if (strpos($liftRangeCode, 'semantic-domain') === false) {
                 self::rangeToOptionList($projectModel, $liftRangeCode, LexConfig::flexOptionlistName($liftRangeCode), $liftRange);
             }
         }
     }
     $this->report->nodeErrors[] = $this->liftImportNodeError;
     if ($this->report->hasError()) {
         error_log($this->report->toString());
     }
     return $this;
 }
 public function testLiftImportMerge_ExistingData_RangesChanged()
 {
     $liftFilePath = self::$environ->createTestLiftFile(self::liftWithRangesV0_13, 'LiftWithRangesV0_13.lift');
     self::$environ->createTestLiftFile(self::liftRangesV0_13, 'TestLangProj.lift-ranges');
     $project = self::$environ->createProject(SF_TESTPROJECT, SF_TESTPROJECTCODE);
     $mergeRule = LiftMergeRule::IMPORT_WINS;
     $skipSameModTime = false;
     LiftImport::get()->merge($liftFilePath, $project, $mergeRule, $skipSameModTime);
     $optionList = new LexOptionListModel($project);
     $optionList->readByProperty('code', LexConfig::flexOptionlistCode(LexConfig::POS));
     $this->assertEquals(3, $optionList->items->count());
     $this->assertEquals('article', $optionList->items[0]->value);
     self::$environ->createTestLiftFile(self::liftRangesAnotherPosV0_13, 'TestLangProj.lift-ranges');
     $importer = LiftImport::get()->merge($liftFilePath, $project, $mergeRule, $skipSameModTime);
     $this->assertEquals(1, $importer->stats->existingEntries);
     $optionList = new LexOptionListModel($project);
     $optionList->readByProperty('code', LexConfig::flexOptionlistCode(LexConfig::ANTHROPOLOGYCATEGORIES));
     $this->assertEquals(0, $optionList->items->count());
     $optionList->readByProperty('code', LexConfig::flexOptionlistCode(LexConfig::STATUS));
     $this->assertEquals(4, $optionList->items->count());
     $optionList->readByProperty('code', LexConfig::flexOptionlistCode(LexConfig::ACADEMICDOMAINS));
     $this->assertEquals(2, $optionList->items->count());
     $optionList->readByProperty('code', LexConfig::flexOptionlistCode(LexConfig::POS));
     $this->assertEquals(1, $optionList->items->count());
     $this->assertEquals('adjunct', $optionList->items[0]->value);
 }