protected void processModelBasicInformation() throws SetupException {
    List<String> filenames = this.getFilenames();

    ManagementBeanFactory factory = null;
    try {
      factory = this.getManagementBeanFactory();
      ModelBean modelBean = factory.createModelBean();

      if (System.getProperty("otas.dm.home") == null) {
        log.error(
            "ModelTask: "
                + "Could not found 'otas.dm.home' from system properties, please set 'otas.dm.home'.");
      }

      DDFTreeBean ddfBean = factory.createDDFTreeBean();

      // Import Model, DDF, TACs
      for (String filename : filenames) {
        // Process the file, and import data into database.
        File file = new File(filename);
        if (!file.isAbsolute()) {
          file = new File(this.getSetup().getWorkDir(), filename);
        }

        this.getSetup()
            .getConsole()
            .println("         Loading file [ " + file.getAbsolutePath() + " ]");
        List<ManufacturerItem> items = this.loadManufacturerItems(file.getAbsolutePath());
        for (ManufacturerItem manufacturerItem : items) {
          List<ModelItem> modelItems = manufacturerItem.getModels();
          Manufacturer manufacturer =
              modelBean.getManufacturerByExternalID(manufacturerItem.getExternalID());
          for (ModelItem modelItem : modelItems) {
            Model model =
                modelBean.getModelByManufacturerModelID(manufacturer, modelItem.getExternalID());
            if (model == null) {
              log.info(
                  "Create a new model: "
                      + manufacturer.getExternalId()
                      + " "
                      + modelItem.getExternalID());
              model = modelBean.newModelInstance();
              model.setManufacturer(manufacturer);
            } else {
              log.info(
                  "Modify a model: "
                      + manufacturer.getExternalId()
                      + " "
                      + modelItem.getExternalID());
            }

            // Copy information from family
            this.copyFromFamily(modelItem);
            // Copy item into model entity
            this.copy(modelItem, model);

            this.getSetup()
                .getConsole()
                .println(
                    "         * Importing ["
                        + manufacturer.getExternalId()
                        + " "
                        + model.getManufacturerModelId()
                        + "] from [ "
                        + modelItem.getDefinedByFilename()
                        + " ]");
            factory.beginTransaction();
            modelBean.update(model);
            this.getSetup().getConsole().println("           * Basic information processed");

            // ModelSpec: Icon, ...
            String iconFilename = modelItem.getIconFile();
            if (StringUtils.isEmpty(iconFilename)) {
              iconFilename = this.getSetup().getPropertyValue("model.default.icon.file");
            }
            File iconFile = new File(iconFilename);
            if (!iconFile.isAbsolute()) {
              iconFile = new File(this.getSetup().getWorkDir(), iconFilename);
            }
            if (iconFile.exists()) {
              model.setIconBinary(new FileInputStream(iconFile));
            } else {
              this.getSetup()
                  .getConsole()
                  .println("           Could not found icon file: " + iconFile.getAbsolutePath());
            }
            modelBean.update(model);

            Map<String, String> specMap = modelItem.getSpecifications();
            for (String specName : specMap.keySet()) {
              String category = null;
              String name = specName;
              int index = specName.indexOf(".");
              if (index >= 0) {
                category = specName.substring(0, index);
                name = specName.substring(index + 1, specName.length());
              }
              String value = specMap.get(specName);
              List<ModelCharacter> characters =
                  modelBean.findModelCharacters(model, category, name);
              ModelCharacter character = null;
              if (characters != null && characters.size() > 0) {
                // Update exists character
                character = characters.get(0);
              } else {
                // Create a new character
                character = modelBean.newModelCharacterInstance(model, category, name);
              }
              character.setValue(value);
              modelBean.update(character);
            }
            this.getSetup().getConsole().println("           * Specifications processed");

            // TACs
            for (String tac : modelItem.getTacs()) {
              if (StringUtils.isNotEmpty(tac)) {
                modelBean.addTACInfo(model, tac);
                this.getSetup().getConsole().println("           * TAC information processed");
              }
            }

            // DDF Files
            for (String ddfFilename : modelItem.getDdfFiles()) {
              File ddfFile = new File(ddfFilename);
              if (!ddfFile.isAbsolute()) {
                ddfFile = new File(this.getSetup().getWorkDir(), ddfFilename);
              }
              DDFTree ddfTree = null;
              try {
                ddfTree = ddfBean.parseDDFTree(new FileInputStream(ddfFile));
              } catch (Exception e) {
                throw new DMException("Error to parse DDF File: " + ddfFile.getAbsolutePath(), e);
              }
              ddfBean.addDDFTree(ddfTree);
              modelBean.attachDDFTree(model, ddfTree.getID());
              this.getSetup()
                  .getConsole()
                  .println("           * DDF information [ " + ddfFile + " ] processed");
            }
            factory.commit();
          }
        }
      }

    } catch (Exception ex) {
      if (factory != null) {
        factory.rollback();
      }
      throw new SetupException("Error in import models.", ex);
    } finally {
      if (factory != null) {
        factory.release();
      }
    }
  }