@SuppressWarnings("unchecked") public static Class<? extends EventQualifierSerializer> generateAndLoad() { logger.info("Generating source for {}.{}...", SERIALIZER_PACKAGE_NAME, SERIALIZER_CLASS_NAME); final String source = generateSource(CDIAnnotationUtils.getQualifiers()); logger.info("Successfully generated source for {}.{}", SERIALIZER_PACKAGE_NAME, SERIALIZER_CLASS_NAME); logger.info("Attempting to compile and load {}.{}", SERIALIZER_PACKAGE_NAME, SERIALIZER_CLASS_NAME); return (Class<? extends EventQualifierSerializer>) ClassChangeUtil .compileAndLoadFromSource(SERIALIZER_PACKAGE_NAME, SERIALIZER_CLASS_NAME, source); }
public static void loadAndSetEventQualifierSerializer() { logger.info("Attempting to load {}.{}", SERIALIZER_PACKAGE_NAME, SERIALIZER_CLASS_NAME); final Optional<Class<?>> loadedImpl = ClassChangeUtil.loadClassIfPresent( SERIALIZER_PACKAGE_NAME, SERIALIZER_CLASS_NAME); if (loadedImpl.isPresent()) { logger.info("Successfully loaded {}.{}", SERIALIZER_PACKAGE_NAME, SERIALIZER_CLASS_NAME); final Class<?> clazz = loadedImpl.get(); instantiateAndSetEventQualifierSerializer(clazz); } else { logger.warn("No {}.{} found on the classpath. Attempting to generate and load.", SERIALIZER_PACKAGE_NAME, SERIALIZER_CLASS_NAME); final Class<? extends EventQualifierSerializer> clazz; try { clazz = Assert.notNull(generateAndLoad()); } catch (final Throwable t) { throw new RuntimeException("Could not generate " + EventQualifierSerializer.SERIALIZER_CLASS_NAME, t); } logger.info("Successfully generated and loaded {}.{}", SERIALIZER_PACKAGE_NAME, SERIALIZER_CLASS_NAME); instantiateAndSetEventQualifierSerializer(clazz); } }
private static ContextualStatementBuilder generateEntryStatement(final MetaClass qual, final Collection<MetaMethod> bindingAttributes) { ContextualStatementBuilder entryStmt = invokeStatic(AnnotationPropertyAccessorBuilder.class, "create"); for (final MetaMethod attr : bindingAttributes) { entryStmt = entryStmt.invoke("with", attr.getName(), anonymousAttributeAccessorFor(attr)); } entryStmt = entryStmt.invoke("build"); return entryStmt; }
static String generateSource(final Iterable<MetaClass> qualifiers) { final ClassStructureBuilder<?> body = ClassBuilder .define(SERIALIZER_PACKAGE_NAME + "." + SERIALIZER_CLASS_NAME, EventQualifierSerializer.class) .publicScope().body(); final ConstructorBlockBuilder<?> ctor = body.publicConstructor(); for (final MetaClass qual : qualifiers) { final Collection<MetaMethod> bindingAttributes = CDIAnnotationUtils.getAnnotationAttributes(qual); if (!bindingAttributes.isEmpty()) { ctor.append(loadVariable("serializers").invoke("put", qual.getFullyQualifiedName(), generateEntryStatement(qual, bindingAttributes))); } } ctor.finish(); return body.toJavaString(); }
@Override public void generateDecorator(final Decorable decorable, final FactoryController controller) { if (!EventQualifierSerializer.isSet()) { NonGwtEventQualifierSerializerGenerator.loadAndSetEventQualifierSerializer();
@Override protected String generate(final TreeLogger treeLogger, final GeneratorContext context) { logger.info("Generating {}.{}...", SERIALIZER_PACKAGE_NAME, SERIALIZER_CLASS_NAME); final String source = NonGwtEventQualifierSerializerGenerator.generateSource(TranslatableAnnotationUtils.getTranslatableQualifiers(context.getTypeOracle())); logger.info("Generating class file for server."); if (EnvUtil.isProdMode()) { if (OutputDirectoryUtil.OUTPUT_DIR.isPresent()) { logger.info("Output directory set to {}. Attempting to write class file to this directory.", OutputDirectoryUtil.OUTPUT_DIR.get()); generateAndWriteToDir(OutputDirectoryUtil.OUTPUT_DIR.get(), source); } else { logger.info("No output directory set. Attempting to discover target directory and write class file."); generateAndWriteToDiscoveredDirs(context, source); } } else { logger.info("Running in JUnit or Classic Dev Mode. Attempting to generate class in tmp directory {}", OUTPUT_TMP); final String tmpPath = new File(OUTPUT_TMP).getAbsolutePath(); OutputDirectoryUtil.generateClassFileInTmpDir(SERIALIZER_PACKAGE_NAME, SERIALIZER_CLASS_NAME, source, tmpPath); } return source; }