/**
   * Used to save a model entry
   *
   * @param model
   * @throws Exception
   */
  ModelElement(final DynamicModel model) throws Exception {
    super();
    name = model.getName();
    type = model.getModelType().toString();
    visible = model.isVisible();
    path = null; // Not used by dynamic vdbs

    if (model.getDescription() != null && !model.getDescription().isEmpty()) {
      description = model.getDescription();
    }

    getComments().add(model.getComments());

    for (VdbSource source : model.getSources()) {
      getSources().add(new SourceElement(source));
    }

    if (model.isMultiSource())
      getProperties()
          .add(new PropertyElement(MULTI_SOURCE, Boolean.toString(model.isMultiSource())));

    if (model.doAddColumn())
      getProperties()
          .add(new PropertyElement(MULTI_SOURCE_ADD_COLUMN, Boolean.toString(model.doAddColumn())));

    String alias = model.getColumnAlias();
    if (alias != null && alias.length() > 0)
      getProperties().add(new PropertyElement(MULTI_SOURCE_COLUMN_ALIAS, alias));

    for (Map.Entry<Object, Object> entry : model.getProperties().entrySet()) {
      getProperties()
          .add(new PropertyElement(entry.getKey().toString(), entry.getValue().toString()));
    }

    // Append any comments to the property elements
    for (PropertyElement propElement : getProperties()) {
      CommentSets propertyComments = model.getPropertyComments(propElement.getName());
      propElement.getComments().add(propertyComments);
    }

    Metadata metadata = model.getMetadata();
    if (metadata != null && metadata.getSchemaText() != null) {
      MetadataElement metadataElement =
          new MetadataElement(metadata.getSchemaText(), metadata.getType().name());
      metadataElement.getComments().add(metadata.getComments());
      getMetadata().add(metadataElement);
    }
  }