/**
* Copyright (C) 2016 Red Hat, Inc. and/or its affiliates.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jboss.errai.enterprise.rebind;
import static org.jboss.errai.enterprise.client.cdi.EventQualifierSerializer.SERIALIZER_CLASS_NAME;
import static org.jboss.errai.enterprise.client.cdi.EventQualifierSerializer.SERIALIZER_PACKAGE_NAME;
import java.io.File;
import javax.inject.Qualifier;
import org.jboss.errai.codegen.meta.MetaClass;
import org.jboss.errai.codegen.util.ClassChangeUtil;
import org.jboss.errai.common.metadata.RebindUtils;
import org.jboss.errai.config.rebind.AbstractAsyncGenerator;
import org.jboss.errai.config.rebind.EnvUtil;
import org.jboss.errai.config.rebind.GenerateAsync;
import org.jboss.errai.enterprise.client.cdi.EventQualifierSerializer;
import org.jboss.errai.ioc.util.TranslatableAnnotationUtils;
import org.jboss.errai.marshalling.rebind.util.OutputDirectoryUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.gwt.core.ext.GeneratorContext;
import com.google.gwt.core.ext.TreeLogger;
import com.google.gwt.core.ext.UnableToCompleteException;
/**
*
* @author Max Barkley <mbarkley@redhat.com>
*/
@GenerateAsync(EventQualifierSerializer.class)
public class EventQualifierSerializerGenerator extends AbstractAsyncGenerator {
private static final Logger logger = LoggerFactory.getLogger(EventQualifierSerializerGenerator.class);
private static final String OUTPUT_TMP = RebindUtils.getTempDirectory() + File.separator + "errai.cdi" + File.separator + "gen";
private static final String SOURCE_OUTPUT_TMP = OUTPUT_TMP + File.separator + "event-qualifier-serializer";
@Override
public String generate(final TreeLogger logger, final GeneratorContext context, final String typeName)
throws UnableToCompleteException {
return startAsyncGeneratorsAndWaitFor(EventQualifierSerializer.class, context, logger,
SERIALIZER_PACKAGE_NAME, SERIALIZER_CLASS_NAME);
}
@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;
}
private void generateAndWriteToDiscoveredDirs(final GeneratorContext context, final String source) {
OutputDirectoryUtil
.generateClassFileInDiscoveredDirs(
context,
SERIALIZER_PACKAGE_NAME,
SERIALIZER_CLASS_NAME,
SOURCE_OUTPUT_TMP,
source);
}
private void generateAndWriteToDir(final String classOutputDir, final String source) {
ClassChangeUtil.generateClassFile(SERIALIZER_PACKAGE_NAME, SERIALIZER_CLASS_NAME, SOURCE_OUTPUT_TMP, source, classOutputDir);
}
@Override
protected boolean isRelevantClass(final MetaClass clazz) {
return clazz.isAnnotation() && clazz.isAnnotationPresent(Qualifier.class);
}
}