All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.trails.hibernate.HibernateAnnotationProcessorFactory Maven / Gradle / Ivy

package org.trails.hibernate;

import com.sun.mirror.apt.AnnotationProcessor;
import com.sun.mirror.apt.AnnotationProcessorEnvironment;
import com.sun.mirror.apt.AnnotationProcessorFactory;
import com.sun.mirror.declaration.AnnotationTypeDeclaration;
import com.sun.mirror.declaration.ClassDeclaration;
import com.sun.mirror.declaration.Declaration;
import com.sun.mirror.util.SimpleDeclarationVisitor;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
import org.hibernate.util.DTDEntityResolver;

import java.io.File;
import java.io.PrintWriter;
import java.util.*;

public class HibernateAnnotationProcessorFactory implements AnnotationProcessorFactory
{
	private static final Log LOG = LogFactory.getLog(HibernateAnnotationProcessorFactory.class);

	public static final String TRAILS_PACKAGE = "org.trails";

	public static final String configFileOption = "configFile";

	public static final String destFileOption = "destFile";

	public HibernateAnnotationProcessorFactory()
	{
		super();
		// TODO Auto-generated constructor stub
	}

	public Collection supportedOptions()
	{
		return null;
	}

	public Collection supportedAnnotationTypes()
	{
		return Arrays.asList("javax.persistence.Entity");
	}

	public AnnotationProcessor getProcessorFor(
		Set decls,
		AnnotationProcessorEnvironment env)
	{
		return new HibernateAnnotationProcessor(env, decls);
	}

	public class HibernateAnnotationProcessor implements AnnotationProcessor
	{
		private AnnotationProcessorEnvironment env;

		private Set annotationTypeDeclarations;

		public HibernateAnnotationProcessor(AnnotationProcessorEnvironment env,
											Set annTypeDecls)
		{
			this.env = env;
			this.annotationTypeDeclarations = annTypeDecls;
		}

		Element sessionFactoryElement;

		public void process()
		{
			String configTemplateFilePath = getOptionValue(configFileOption);

			LOG.info(configTemplateFilePath);
			try
			{
				SAXReader reader = new SAXReader();
				reader.setValidation(false);
				reader.setEntityResolver(new DTDEntityResolver());
				reader.setIncludeExternalDTDDeclarations(false);
				reader.setIncludeInternalDTDDeclarations(false);
				// Create file first, this is more reliable if there are spaces
				// in the path
				File configTemplateFile = new File(configTemplateFilePath);
				Document doc = reader.read(configTemplateFile);

				sessionFactoryElement = (Element) doc.getRootElement()
					.selectSingleNode("//session-factory");

				String trailsXPath = "mapping[not(starts-with(@class, '"
					+ TRAILS_PACKAGE + "'))]";
				for (Iterator iter = sessionFactoryElement.selectNodes(
					trailsXPath).iterator(); iter.hasNext();)
				{
					Element element = (Element) iter.next();

					sessionFactoryElement.remove(element);
				}

				List listenerElements = sessionFactoryElement
					.elements("listener");
				sessionFactoryElement.elements().removeAll(listenerElements);

				for (AnnotationTypeDeclaration annotationTypeDecl : annotationTypeDeclarations)
				{
					LOG.info(annotationTypeDecl);
					for (Declaration declaration : env
						.getDeclarationsAnnotatedWith(annotationTypeDecl))
					{
						declaration.accept(new SimpleDeclarationVisitor()
						{
							public void visitClassDeclaration(
								ClassDeclaration classDeclaration)
							{
								LOG.info(classDeclaration
									.getQualifiedName());
								sessionFactoryElement.addElement("mapping")
									.setAttributeValue(
										"class",
										classDeclaration
											.getQualifiedName());
							}
						});
					}
					sessionFactoryElement.elements().addAll(listenerElements);
				}
				String filename = getOptionValue(destFileOption);
				LOG.info("Creating destFile: " + filename);
				File f = new File(filename);
				f.getParentFile().mkdirs();

				OutputFormat format = OutputFormat.createPrettyPrint();
				XMLWriter writer = new XMLWriter(new PrintWriter(f), format);
				writer.write(doc);
				writer.close();

			} catch (Exception ex)
			{
				ex.printStackTrace();
			}

		}

		private String getOptionValue(String option)
		{
			// This is a hack due to a bug in apt
			for (String key : env.getOptions().keySet())
			{
				if (key.startsWith("-A" + option))
				{
					return key.split("=")[1];
				}
			}
			return null;
		}

	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy