@Test
  public void testCommentsInDynamicVdb() throws Exception {
    MockFileBuilder portfolioXmlFile = VdbTestUtils.mockPortfolioVdbXmlFile();
    DynamicVdb vdb = new DynamicVdb(portfolioXmlFile.getResourceFile());

    CommentSets vdbComments = vdb.getComments();
    assertNotNull(vdbComments);
    assertEquals(2, vdbComments.size());
    checkComment(Comments.VDB_TITLE, vdbComments, EMPTY_STRING, 0);
    checkComment(Comments.VDB_TITLE_2, vdbComments, EMPTY_STRING, 1);
    checkComment(Comments.VDB_DESCRIPTION, vdbComments, DESCRIPTION, 0);

    CommentSets propertyComments = vdb.getPropertyComments("UseConnectorMetadata");
    assertNotNull(propertyComments);

    checkComment(Comments.USE_CONNECTOR_PROPERTY, propertyComments, EMPTY_STRING, 0);

    DynamicModel model = findModel(vdb.getDynamicModels(), "MarketData");
    checkComment(Comments.MODEL_MARKETDATA, model.getComments(), EMPTY_STRING, 0);

    VdbSource source = model.getSources()[0];
    assertEquals("text-connector", source.getName());
    checkComment(Comments.MARKETDATA_TEXT_CONNECTOR, source.getComments(), EMPTY_STRING, 0);

    model = findModel(vdb.getDynamicModels(), "Accounts");
    propertyComments = model.getPropertyComments("importer.useFullSchemaName");
    assertNotNull(propertyComments);
    checkComment(Comments.ACCOUNTS_USEFULLSCHEMA_PROPERTY, propertyComments, EMPTY_STRING, 0);

    source = model.getSources()[0];
    assertEquals("h2-connector", source.getName());
    checkComment(Comments.ACCOUNT_H2_CONNECTOR, source.getComments(), EMPTY_STRING, 0);

    model = findModel(vdb.getDynamicModels(), "PersonalValuations");
    propertyComments = model.getPropertyComments("importer.headerRowNumber");
    assertNotNull(propertyComments);
    checkComment(Comments.IMPORTER_HEADER_ROW_NUMBER_PROPERTY, propertyComments, EMPTY_STRING, 0);

    propertyComments = model.getPropertyComments("importer.ExcelFileName");
    assertNotNull(propertyComments);
    checkComment(Comments.IMPORT_EXCEL_FILE_NAME_PROPERTY, propertyComments, EMPTY_STRING, 0);

    Metadata metadata = model.getMetadata();
    assertNotNull(metadata);
    checkComment(Comments.METADATA_ELEMENT, metadata.getComments(), EMPTY_STRING, 0);

    Iterator<DataRole> dataRoleIter = vdb.getDataRoles().iterator();
    DataRole dataRole = dataRoleIter.next();
    assertNotNull(dataRole);
    checkComment(Comments.DATA_ROLE, dataRole.getComments(), EMPTY_STRING, 0);
    checkComment(Comments.DATA_ROLE_DESCRIPTION, dataRole.getComments(), DESCRIPTION, 0);
    checkComment(
        Comments.SUPERVISOR_MAPPED_ROLE,
        dataRole.getComments(),
        MAPPED_ROLE_NAME + HYPHEN + "supervisor",
        0);
    checkComment(
        Comments.DEPT_SUPER_MAPPED_ROLE,
        dataRole.getComments(),
        MAPPED_ROLE_NAME + HYPHEN + "dept-supervisor",
        0);

    Collection<Permission> permissions = dataRole.getPermissions();
    assertNotNull(permissions);
    Iterator<Permission> permIter = permissions.iterator();
    assertTrue(permIter.hasNext());
    Permission permission = permIter.next();
    assertEquals("Accounts", permission.getName());
    checkComment(Comments.PERMISSION_ON_ACCOUNTS_TABLE, permission.getComments(), EMPTY_STRING, 0);
    checkComment(
        Comments.RESOURCE_NAME_REFERENCED_BY_PERMISSION,
        permission.getComments(),
        RESOURCE_NAME,
        0);
    checkComment(Comments.DENY_CREATE, permission.getComments(), ALLOW_CREATE, 0);
    checkComment(Comments.ALLOW_READ, permission.getComments(), ALLOW_READ, 0);
    checkComment(Comments.ALLOW_UPDATE, permission.getComments(), ALLOW_UPDATE, 0);

    permission = permIter.next();
    assertEquals("Accounts.Customer", permission.getName());

    CommentSets conditionComments = permission.getConditionComments();
    assertNotNull(conditionComments);
    checkComment(Comments.PERMISSION_USING_A_CONDITION, conditionComments, EMPTY_STRING, 0);

    permission = permIter.next();
    assertEquals("Accounts.Customer.SSN", permission.getName());
    CommentSets maskComments = permission.getMaskComments();
    assertNotNull(maskComments);
    checkComment(Comments.PERMISSION_MASK, maskComments, EMPTY_STRING, 0);
  }
  @Test
  public void testWriteDynamicVdbWithComments() throws Exception {
    MockFileBuilder portfolioXmlFile = VdbTestUtils.mockPortfolioVdbXmlFile();
    DynamicVdb vdb = new DynamicVdb(portfolioXmlFile.getResourceFile());

    StringWriter destination = new StringWriter();
    vdb.write(destination);

    Document vdbDoc = VdbTestUtils.readDocument(destination.toString(), false);
    assertNotNull(vdbDoc);

    System.out.println(VdbTestUtils.printDocument(vdbDoc));

    Element vdbElement = vdbDoc.getDocumentElement();
    Node commentNode = prevComment(vdbElement);
    checkComment(Comments.VDB_TITLE_2, commentNode);

    commentNode = prevComment(commentNode);
    checkComment(Comments.VDB_TITLE, commentNode);

    Node elementNode = child(vdbElement, DESCRIPTION, null);
    commentNode = prevComment(elementNode);
    checkComment(Comments.VDB_DESCRIPTION, commentNode);

    elementNode = nextSibling(elementNode, PROPERTY);
    commentNode = prevComment(elementNode);
    checkComment(Comments.USE_CONNECTOR_PROPERTY, commentNode);

    elementNode = child(vdbElement, MODEL, "MarketData");
    Node modelNode = elementNode;
    commentNode = prevComment(modelNode);
    checkComment(Comments.MODEL_MARKETDATA, commentNode);

    Node sourceNode = child(modelNode, SOURCE, null);
    commentNode = prevComment(sourceNode);
    checkComment(Comments.MARKETDATA_TEXT_CONNECTOR, commentNode);

    modelNode = child(vdbElement, MODEL, "Accounts");
    elementNode = child(modelNode, PROPERTY, "importer.useFullSchemaName");
    commentNode = prevComment(elementNode);
    checkComment(Comments.ACCOUNTS_USEFULLSCHEMA_PROPERTY, commentNode);

    sourceNode = child(modelNode, SOURCE, null);
    commentNode = prevComment(sourceNode);
    checkComment(Comments.ACCOUNT_H2_CONNECTOR, commentNode);

    modelNode = child(vdbElement, MODEL, "PersonalValuations");
    elementNode = child(modelNode, PROPERTY, "importer.headerRowNumber");
    commentNode = prevComment(elementNode);
    checkComment(Comments.IMPORTER_HEADER_ROW_NUMBER_PROPERTY, commentNode);

    elementNode = child(modelNode, PROPERTY, "importer.ExcelFileName");
    commentNode = prevComment(elementNode);
    checkComment(Comments.IMPORT_EXCEL_FILE_NAME_PROPERTY, commentNode);

    elementNode = child(modelNode, METADATA, null);
    commentNode = prevComment(elementNode);
    checkComment(Comments.METADATA_ELEMENT, commentNode);

    elementNode = child(vdbElement, DATA_ROLE, null);
    Node dataRoleNode = elementNode;
    commentNode = prevComment(elementNode);
    checkComment(Comments.DATA_ROLE, commentNode);

    elementNode = child(dataRoleNode, DESCRIPTION, null);
    commentNode = prevComment(elementNode);
    checkComment(Comments.DATA_ROLE_DESCRIPTION, commentNode);

    elementNode = child(dataRoleNode, MAPPED_ROLE_NAME, null);
    commentNode = prevComment(elementNode);
    checkComment(Comments.SUPERVISOR_MAPPED_ROLE, commentNode);

    elementNode = nextSibling(elementNode, MAPPED_ROLE_NAME);
    commentNode = prevComment(elementNode);
    checkComment(Comments.DEPT_SUPER_MAPPED_ROLE, commentNode);

    elementNode = child(dataRoleNode, PERMISSION, null);
    Node permNode = elementNode;
    commentNode = prevComment(elementNode);
    checkComment(Comments.PERMISSION_ON_ACCOUNTS_TABLE, commentNode);

    elementNode = child(permNode, RESOURCE_NAME, null);
    commentNode = prevComment(elementNode);
    checkComment(Comments.RESOURCE_NAME_REFERENCED_BY_PERMISSION, commentNode);

    elementNode = nextSibling(elementNode, ALLOW_CREATE);
    commentNode = prevComment(elementNode);
    checkComment(Comments.DENY_CREATE, commentNode);

    elementNode = nextSibling(elementNode, ALLOW_READ);
    commentNode = prevComment(elementNode);
    checkComment(Comments.ALLOW_READ, commentNode);

    elementNode = nextSibling(elementNode, ALLOW_UPDATE);
    commentNode = prevComment(elementNode);
    checkComment(Comments.ALLOW_UPDATE, commentNode);

    permNode = nextSibling(permNode, PERMISSION);
    elementNode = child(permNode, CONDITION, null);
    commentNode = prevComment(elementNode);
    checkComment(Comments.PERMISSION_USING_A_CONDITION, commentNode);

    permNode = nextSibling(permNode, PERMISSION);
    elementNode = child(permNode, MASK, null);
    commentNode = prevComment(elementNode);
    checkComment(Comments.PERMISSION_MASK, commentNode);
  }
  @Test
  public void convertDynamicVdbToXmiVdb() throws Exception {
    DynamicVdb dynVdb = VdbTestUtils.mockPortfolioDynamicVdb(modelWorkspaceMock);
    assertNotNull(dynVdb);

    IFile dynVdbSrcFile = dynVdb.getSourceFile();
    IProject parent = dynVdbSrcFile.getProject();
    assertNotNull(parent);

    File destFile = File.createTempFile(dynVdb.getName(), ITeiidVdb.VDB_DOT_EXTENSION);
    MockFileBuilder destination = new MockFileBuilder(destFile);

    XmiVdb xmiVdb = dynVdb.convert(XmiVdb.class, destination.getResourceFile(), new Properties());

    assertEquals(dynVdb.getName(), xmiVdb.getName());
    assertEquals(dynVdb.getDescription(), xmiVdb.getDescription());

    for (Map.Entry<Object, Object> entry : dynVdb.getProperties().entrySet()) {
      System.out.println(
          "VDB Property:  "
              + entry.getValue()
              + " == "
              + xmiVdb.getProperties().getProperty(entry.getKey().toString()));
      assertEquals(entry.getValue(), xmiVdb.getProperties().getProperty(entry.getKey().toString()));
    }

    assertEquals(destination.getResourceFile(), xmiVdb.getSourceFile());
    assertEquals(dynVdb.getVersion(), xmiVdb.getVersion());

    assertEquals(dynVdb.getConnectionType(), xmiVdb.getConnectionType());
    assertEquals(dynVdb.isPreview(), xmiVdb.isPreview());
    assertEquals(dynVdb.getQueryTimeout(), xmiVdb.getQueryTimeout());

    assertEquals(dynVdb.getAllowedLanguages().size(), xmiVdb.getAllowedLanguages().size());
    List<String> dynLanguageValues =
        Arrays.asList(xmiVdb.getAllowedLanguages().getAllowedLanguageValues());
    for (String language : dynVdb.getAllowedLanguages().getAllowedLanguageValues()) {
      assertTrue(dynLanguageValues.contains(language));
    }

    assertEquals(dynVdb.getSecurityDomain(), xmiVdb.getSecurityDomain());
    assertEquals(dynVdb.getGssPattern(), xmiVdb.getGssPattern());
    assertEquals(dynVdb.getPasswordPattern(), xmiVdb.getPasswordPattern());
    assertEquals(dynVdb.getAuthenticationType(), xmiVdb.getAuthenticationType());
    assertEquals(dynVdb.getValidationDateTime(), xmiVdb.getValidationDateTime());
    assertEquals(dynVdb.isAutoGenerateRESTWar(), xmiVdb.isAutoGenerateRESTWar());

    assertEquals(dynVdb.getImports().size(), xmiVdb.getImports().size());
    for (VdbImportVdbEntry entry : dynVdb.getImports()) {
      assertTrue(xmiVdb.getImports().contains(entry));
    }

    assertEquals(dynVdb.getTranslators().size(), xmiVdb.getTranslators().size());
    for (TranslatorOverride translator : dynVdb.getTranslators()) {
      assertTrue(xmiVdb.getTranslators().contains(translator));
    }

    assertEquals(dynVdb.getDataRoles().size(), xmiVdb.getDataRoles().size());
    for (DataRole role : dynVdb.getDataRoles()) {
      assertTrue(xmiVdb.getDataRoles().contains(role));
    }

    assertEquals(dynVdb.getDynamicModels().size(), xmiVdb.getModelEntries().size());
    for (DynamicModel dynModel : dynVdb.getDynamicModels()) {

      VdbModelEntry modelEntry = null;
      Collection<VdbModelEntry> entries = xmiVdb.getModelEntries();
      for (VdbModelEntry entry : entries) {
        if (dynModel.getName().equals(entry.getName())) {
          modelEntry = entry;
          break;
        }
      }
      assertNotNull(modelEntry);

      assertEquals(dynModel.getDescription(), modelEntry.getDescription());

      for (Map.Entry<Object, Object> prop : dynModel.getProperties().entrySet()) {
        assertEquals(
            prop.getValue(), modelEntry.getProperties().getProperty(prop.getKey().toString()));
      }

      VdbSourceInfo sourceInfo = modelEntry.getSourceInfo();

      assertEquals(dynModel.getModelType().toString(), modelEntry.getType());
      assertEquals(dynModel.isMultiSource(), sourceInfo.isMultiSource());
      assertEquals(dynModel.doAddColumn(), sourceInfo.isAddColumn());
      assertEquals(dynModel.getColumnAlias(), sourceInfo.getColumnAlias());

      assertEquals(dynModel.getSources().length, sourceInfo.getSources().size());
      List<VdbSource> entrySources = new ArrayList<VdbSource>(sourceInfo.getSources());
      for (VdbSource source : dynModel.getSources()) {
        assertTrue(entrySources.contains(source));
      }
    }
  }