@Test
  public void testKieModuleMetaDataInMemoryWithJavaClassDefaultPackage() throws Exception {
    final KieServices ks = KieServices.Factory.get();
    final ReleaseId releaseId = ks.newReleaseId("org.kie", "javaDefaultPackage", "1.0-SNAPSHOT");
    final KieModuleModel kproj = ks.newKieModuleModel();

    final KieFileSystem kfs = ks.newKieFileSystem();
    kfs.writeKModuleXML(kproj.toXML())
        .writePomXML(generatePomXml(releaseId))
        .write("src/main/java/test/Bean.java", createJavaSource());

    final KieBuilder kieBuilder = ks.newKieBuilder(kfs);
    final List<Message> messages = kieBuilder.buildAll().getResults().getMessages();
    assertTrue(messages.isEmpty());

    final KieModule kieModule = kieBuilder.getKieModule();
    final KieModuleMetaData kieModuleMetaData =
        KieModuleMetaData.Factory.newKieModuleMetaData(kieModule);

    // The call to kieModuleMetaData.getClass() assumes a Java file has an explicit package
    final Class<?> beanClass = kieModuleMetaData.getClass("", "test.Bean");
    assertNotNull(beanClass);

    final TypeMetaInfo beanMetaInfo = kieModuleMetaData.getTypeMetaInfo(beanClass);
    assertNotNull(beanMetaInfo);
  }
  private void testKieModuleMetaDataForDependenciesInMemory(boolean useTypeDeclaration)
      throws Exception {
    KieServices ks = KieServices.Factory.get();
    ReleaseId dependency = ks.newReleaseId("org.drools", "drools-core", "5.5.0.Final");
    ReleaseId releaseId = ks.newReleaseId("org.kie", "metadata-test", "1.0-SNAPSHOT");

    InternalKieModule kieModule =
        createKieJarWithClass(ks, releaseId, useTypeDeclaration, 2, 7, dependency);
    KieModuleMetaData kieModuleMetaData = KieModuleMetaData.Factory.newKieModuleMetaData(kieModule);
    checkDroolsCoreDep(kieModuleMetaData);

    Collection<String> testClasses = kieModuleMetaData.getClasses("org.drools");
    assertEquals(55, testClasses.size());
    Class<?> beanClass = kieModuleMetaData.getClass("org.drools", "QueryResult");
    assertNotNull(beanClass);

    // Classes in dependencies should have TypeMetaInfo
    TypeMetaInfo beanTypeInfo = kieModuleMetaData.getTypeMetaInfo(beanClass);
    assertNotNull(beanTypeInfo);

    if (useTypeDeclaration) {
      assertTrue(beanTypeInfo.isEvent());
    }

    assertEquals(useTypeDeclaration, beanTypeInfo.isDeclaredType());
  }
 private void checkDroolsCoreDep(KieModuleMetaData kieModuleMetaData) {
   assertEquals(17, kieModuleMetaData.getClasses("org.drools.runtime").size());
   Class<?> statefulKnowledgeSessionClass =
       kieModuleMetaData.getClass("org.drools.runtime", "StatefulKnowledgeSession");
   assertTrue(statefulKnowledgeSessionClass.isInterface());
   assertEquals(2, statefulKnowledgeSessionClass.getDeclaredMethods().length);
 }
  private void testKieModuleMetaDataInMemory(boolean useTypeDeclaration) throws Exception {
    KieServices ks = KieServices.Factory.get();
    ReleaseId dependency = ks.newReleaseId("org.drools", "drools-core", "5.5.0.Final");
    ReleaseId releaseId = ks.newReleaseId("org.kie", "metadata-test", "1.0-SNAPSHOT");

    InternalKieModule kieModule =
        createKieJarWithClass(ks, releaseId, useTypeDeclaration, 2, 7, dependency);
    KieModuleMetaData kieModuleMetaData = KieModuleMetaData.Factory.newKieModuleMetaData(kieModule);
    checkDroolsCoreDep(kieModuleMetaData);

    Collection<String> testClasses = kieModuleMetaData.getClasses("org.kie.test");
    assertEquals(1, testClasses.size());
    assertEquals("Bean", testClasses.iterator().next());
    Class<?> beanClass = kieModuleMetaData.getClass("org.kie.test", "Bean");
    assertNotNull(beanClass.getMethod("getValue"));

    TypeMetaInfo beanTypeInfo = kieModuleMetaData.getTypeMetaInfo(beanClass);
    assertNotNull(beanTypeInfo);

    assertTrue(beanTypeInfo.isEvent());

    Role role = beanClass.getAnnotation(Role.class);
    assertNotNull(role);
    assertEquals(Role.Type.EVENT, role.value());

    assertEquals(useTypeDeclaration, beanTypeInfo.isDeclaredType());
  }
  @Test
  public void testGetRuleNames() {
    final KieServices ks = KieServices.Factory.get();

    final KieFileSystem kfs = ks.newKieFileSystem();
    kfs.write(
        "src/main/resources/test1.drl",
        "package org.test\n"
            + "rule A\n"
            + " when\n"
            + "then\n"
            + "end\n"
            + "rule B\n"
            + " when\n"
            + "then\n"
            + "end\n");
    kfs.write(
        "src/main/resources/test2.drl",
        "package org.test\n" + "rule C\n" + " when\n" + "then\n" + "end\n");

    final KieBuilder kieBuilder = ks.newKieBuilder(kfs);
    final List<Message> messages = kieBuilder.buildAll().getResults().getMessages();
    assertTrue(messages.isEmpty());

    final KieModule kieModule = kieBuilder.getKieModule();
    final KieModuleMetaData kieModuleMetaData =
        KieModuleMetaData.Factory.newKieModuleMetaData(kieModule);

    Collection<String> rules = kieModuleMetaData.getRuleNamesInPackage("org.test");
    assertEquals(3, rules.size());
    assertTrue(rules.containsAll(asList("A", "B", "C")));
  }
  private void testKieModuleMetaDataInMemoryUsingPOM(boolean useTypeDeclaration) throws Exception {
    // Build a KieModule jar, deploy it into local Maven repository
    KieServices ks = KieServices.Factory.get();
    ReleaseId dependency = ks.newReleaseId("org.drools", "drools-core", "5.5.0.Final");
    ReleaseId releaseId = ks.newReleaseId("org.kie", "metadata-test", "1.0-SNAPSHOT");
    InternalKieModule kieModule =
        createKieJarWithClass(ks, releaseId, useTypeDeclaration, 2, 7, dependency);
    String pomText = getPom(dependency);
    File pomFile =
        new File(
            System.getProperty("java.io.tmpdir"),
            MavenRepository.toFileName(releaseId, null) + ".pom");
    try {
      FileOutputStream fos = new FileOutputStream(pomFile);
      fos.write(pomText.getBytes());
      fos.flush();
      fos.close();
    } catch (IOException e) {
      throw new RuntimeException(e);
    }
    MavenRepository.getMavenRepository().deployArtifact(releaseId, kieModule, pomFile);

    // Build a second KieModule, depends on the first KieModule jar which we have deployed into
    // Maven
    ReleaseId releaseId2 = ks.newReleaseId("org.kie", "metadata-test-using-pom", "1.0-SNAPSHOT");
    String pomText2 = getPom(releaseId2, releaseId);
    File pomFile2 =
        new File(
            System.getProperty("java.io.tmpdir"),
            MavenRepository.toFileName(releaseId2, null) + ".pom");
    try {
      FileOutputStream fos = new FileOutputStream(pomFile2);
      fos.write(pomText2.getBytes());
      fos.flush();
      fos.close();
    } catch (IOException e) {
      throw new RuntimeException(e);
    }
    KieModuleMetaData kieModuleMetaData = KieModuleMetaData.Factory.newKieModuleMetaData(pomFile2);
    // checkDroolsCoreDep(kieModuleMetaData);

    Collection<String> testClasses = kieModuleMetaData.getClasses("org.kie.test");
    assertEquals(1, testClasses.size());
    assertEquals("Bean", testClasses.iterator().next());
    Class<?> beanClass = kieModuleMetaData.getClass("org.kie.test", "Bean");
    assertNotNull(beanClass.getMethod("getValue"));

    if (useTypeDeclaration) {
      assertTrue(kieModuleMetaData.getTypeMetaInfo(beanClass).isEvent());
    }
  }
  @Test
  public void testGetPackageNames() {
    final KieServices ks = KieServices.Factory.get();

    final KieFileSystem kfs = ks.newKieFileSystem();
    kfs.write("src/main/resources/test.drl", "package org.test declare Bean end");

    final KieBuilder kieBuilder = ks.newKieBuilder(kfs);
    final List<Message> messages = kieBuilder.buildAll().getResults().getMessages();
    assertTrue(messages.isEmpty());

    final KieModule kieModule = kieBuilder.getKieModule();
    final KieModuleMetaData kieModuleMetaData =
        KieModuleMetaData.Factory.newKieModuleMetaData(kieModule);

    assertFalse(kieModuleMetaData.getPackages().isEmpty());
    TestCase.assertTrue(kieModuleMetaData.getPackages().contains("org.test"));
  }
  @Test
  @Ignore("https://bugzilla.redhat.com/show_bug.cgi?id=1049674")
  public void testKieMavenPluginEmptyProject() {
    // According to https://bugzilla.redhat.com/show_bug.cgi?id=1049674#c2 the below is the minimal
    // POM required to use KieMavenPlugin.
    // However when we attempt to retrieve meta-data about the classes in the KieModule some are not
    // accessible. IDK whether the minimal
    // POM is correct; or whether KieModuleMetaData needs to ignore certain classes (e.g. if a
    // transient dependency is optional?!?)
    final KieServices ks = KieServices.Factory.get();

    final KieFileSystem kfs = ks.newKieFileSystem();
    kfs.write(
        "pom.xml",
        "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
            + "<project xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\" xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">"
            + "<modelVersion>4.0.0</modelVersion>"
            + "<groupId>org.kie</groupId>"
            + "<artifactId>plugin-test</artifactId>"
            + "<version>1.0</version>"
            + "<packaging>kjar</packaging>"
            + "<dependencies>"
            + "<dependency>"
            + "<groupId>org.drools</groupId>"
            + "<artifactId>drools-compiler</artifactId>"
            + "<version>6.1.0-SNAPSHOT</version>"
            + "</dependency>"
            + "</dependencies>"
            + "<build>"
            + "<plugins>"
            + "<plugin>"
            + "<groupId>org.kie</groupId>"
            + "<artifactId>kie-maven-plugin</artifactId>"
            + "<version>6.1.0-SNAPSHOT</version>"
            + "<extensions>true</extensions>"
            + "</plugin>"
            + "</plugins>"
            + "</build>"
            + "</project>");

    kfs.write(
        "/src/main/resources/META-INF/kmodule.xml",
        "<kmodule xmlns=\"http://jboss.org/kie/6.0.0/kmodule\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"/>");

    final KieBuilder kieBuilder = ks.newKieBuilder(kfs);
    final List<Message> messages = kieBuilder.buildAll().getResults().getMessages();
    assertTrue(messages.isEmpty());

    final KieModule kieModule = kieBuilder.getKieModule();
    final KieModuleMetaData kieModuleMetaData =
        KieModuleMetaData.Factory.newKieModuleMetaData(kieModule);

    boolean fail = false;
    for (final String packageName : kieModuleMetaData.getPackages()) {
      for (final String className : kieModuleMetaData.getClasses(packageName)) {
        try {
          kieModuleMetaData.getClass(packageName, className);
        } catch (Throwable e) {
          fail = true;
          System.out.println(e);
        }
      }
    }
    if (fail) {
      fail("See console for details.");
    }
  }