/** * Generate fluid API files. * Finds all Component instances at given urls using reflection. * * @param urls classpath urls to reflect over. * @param outputDirectory source root. * @param log output. * @param globalPreferences * @throws com.artemis.generator.validator.TypeModelValidatorException */ public void generate(Set<URL> urls, File outputDirectory, Log log, FluidGeneratorPreferences globalPreferences) { final AbstractClassCollectStrategy collectStrategy = collectStrategy(urls); generate(collectStrategy.allComponents(), collectStrategy.allFieldProxyStrategies(), outputDirectory, log, globalPreferences); }
/** * Generate fluid API files. * * @param components components to consider. * @param fieldProxyStrategies field proxy strategies to apply * @param outputDirectory source root. * @param log output. * @param globalPreferences * @throws com.artemis.generator.validator.TypeModelValidatorException */ public void generate(Collection<Class<? extends Component>> components, Collection<Class<? extends FieldProxyStrategy>> fieldProxyStrategies, File outputDirectory, Log log, FluidGeneratorPreferences globalPreferences) { final ArtemisModel artemisModel = createArtemisModel(filterComponents(components, log), fieldProxyStrategies, globalPreferences, log); File outputArtemisModuleDirectory = new File(outputDirectory, COM_ARTEMIS_MODULE_DIR); outputArtemisModuleDirectory.mkdirs(); generateFile(artemisModel, createSupermapperGenerator(globalPreferences), new File(outputArtemisModuleDirectory, "SuperMapper.java"), log); generateFile(artemisModel, createFluidInterfaceGenerator(globalPreferences), new File(outputArtemisModuleDirectory, "E.java"), log); generateFile(artemisModel, createComponentsGenerator(globalPreferences), new File(outputArtemisModuleDirectory, "C.java"), log); // deploy static utility classes that depend on E and/or SuperMapper. Do a clean when changing files! copyResourceIfMissing(getClass().getResource(FLUID_UTILITY_SOURCES_DIR + "/FluidEntityPlugin.java"), new File(outputArtemisModuleDirectory, "FluidEntityPlugin.java")); copyResourceIfMissing(getClass().getResource(FLUID_UTILITY_SOURCES_DIR + "/EBag.java"), new File(outputArtemisModuleDirectory, "EBag.java")); copyResourceIfMissing(getClass().getResource(FLUID_UTILITY_SOURCES_DIR + "/FluidIteratingSystem.java"), new File(outputArtemisModuleDirectory, "FluidIteratingSystem.java")); }
private ArtemisModel createArtemisModel(Collection<Class<? extends Component>> components, Collection<Class<? extends FieldProxyStrategy>> fieldProxyStrategiesClasses, FluidGeneratorPreferences globalPreferences, Log log) { return new ArtemisModel( createComponentDescriptors(components, globalPreferences, log), createFieldProxyStrategies(fieldProxyStrategiesClasses, log)); }
@Override public void execute() throws MojoExecutionException, MojoFailureException { prepareGeneratedSourcesFolder(); includeGeneratedSourcesInCompilation(); new FluidGenerator().generate( classpathAsUrls(preferences), generatedSourcesDirectory(), createLogAdapter(), preferences); System.out.flush(); System.err.flush(); }
/** * @param artemisModel * @param generator * @param file * @param log * @throws com.artemis.generator.validator.TypeModelValidatorException */ private void generateFile(ArtemisModel artemisModel, TypeModelGenerator generator, File file, Log log) { try { FileWriter fileWriter = new FileWriter(file); try { TypeModel typeModel = createExampleTypeModel(generator, artemisModel); new TypeModelValidator(log, file.getName()).validate(typeModel); new PoetSourceGenerator().generate(typeModel, fileWriter); } finally { fileWriter.close(); } } catch (TypeModelValidatorException e) { throw new RuntimeException("Fluid API generation aborted, duplicate components, component field or component method names might be to blame.\n", e); } catch (IOException e) { throw new RuntimeException(e); } }
@TaskAction public void fluid() { log.info("Artemis Fluid api plugin started."); prepareGeneratedSourcesFolder(); includeGeneratedSourcesInCompilation(); new FluidGenerator().generate( classpathAsUrls(preferences), generatedSourcesDirectory, createLogAdapter(), preferences); }
/** * @param artemisModel * @param generator * @param file * @param log * @throws com.artemis.generator.validator.TypeModelValidatorException */ private void generateFile(ArtemisModel artemisModel, TypeModelGenerator generator, File file, Log log) { try { FileWriter fileWriter = new FileWriter(file); try { TypeModel typeModel = createExampleTypeModel(generator, artemisModel); new TypeModelValidator(log, file.getName()).validate(typeModel); new PoetSourceGenerator().generate(typeModel, fileWriter); } finally { fileWriter.close(); } } catch (TypeModelValidatorException e) { throw new RuntimeException("Fluid API generation aborted, duplicate components, component field or component method names might be to blame.\n", e); } catch (IOException e) { throw new RuntimeException(e); } }
/** * Generate fluid API files. * * @param components components to consider. * @param fieldProxyStrategies field proxy strategies to apply * @param outputDirectory source root. * @param log output. * @param globalPreferences * @throws com.artemis.generator.validator.TypeModelValidatorException */ public void generate(Collection<Class<? extends Component>> components, Collection<Class<? extends FieldProxyStrategy>> fieldProxyStrategies, File outputDirectory, Log log, FluidGeneratorPreferences globalPreferences) { final ArtemisModel artemisModel = createArtemisModel(filterComponents(components, log), fieldProxyStrategies, globalPreferences, log); File outputArtemisModuleDirectory = new File(outputDirectory, COM_ARTEMIS_MODULE_DIR); outputArtemisModuleDirectory.mkdirs(); generateFile(artemisModel, createSupermapperGenerator(globalPreferences), new File(outputArtemisModuleDirectory, "SuperMapper.java"), log); generateFile(artemisModel, createFluidInterfaceGenerator(globalPreferences), new File(outputArtemisModuleDirectory, "E.java"), log); generateFile(artemisModel, createComponentsGenerator(globalPreferences), new File(outputArtemisModuleDirectory, "C.java"), log); // deploy static utility classes that depend on E and/or SuperMapper. Do a clean when changing files! copyResourceIfMissing(getClass().getResource(FLUID_UTILITY_SOURCES_DIR + "/FluidEntityPlugin.java"), new File(outputArtemisModuleDirectory, "FluidEntityPlugin.java")); copyResourceIfMissing(getClass().getResource(FLUID_UTILITY_SOURCES_DIR + "/EBag.java"), new File(outputArtemisModuleDirectory, "EBag.java")); copyResourceIfMissing(getClass().getResource(FLUID_UTILITY_SOURCES_DIR + "/FluidIteratingSystem.java"), new File(outputArtemisModuleDirectory, "FluidIteratingSystem.java")); }
/** * Generate fluid API files. * Finds all Component instances at given urls using reflection. * * @param urls classpath urls to reflect over. * @param outputDirectory source root. * @param log output. * @param globalPreferences * @throws com.artemis.generator.validator.TypeModelValidatorException */ public void generate(Set<URL> urls, File outputDirectory, Log log, FluidGeneratorPreferences globalPreferences) { final AbstractClassCollectStrategy collectStrategy = collectStrategy(urls); generate(collectStrategy.allComponents(), collectStrategy.allFieldProxyStrategies(), outputDirectory, log, globalPreferences); }
private ArtemisModel createArtemisModel(Collection<Class<? extends Component>> components, Collection<Class<? extends FieldProxyStrategy>> fieldProxyStrategiesClasses, FluidGeneratorPreferences globalPreferences, Log log) { return new ArtemisModel( createComponentDescriptors(components, globalPreferences, log), createFieldProxyStrategies(fieldProxyStrategiesClasses, log)); }