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

io.pelle.mango.db.util.MergingPersistenceUnitPostProcessor Maven / Gradle / Ivy

The newest version!
/**
 * Copyright (c) 2013 Christian Pelster.
 * 
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 * 
 * Contributors:
 *     Christian Pelster - initial API and implementation
 */
package io.pelle.mango.db.util;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import org.springframework.orm.jpa.persistenceunit.MutablePersistenceUnitInfo;
import org.springframework.orm.jpa.persistenceunit.PersistenceUnitPostProcessor;

/**
 * This merges all JPA entities from multiple jars. To use it, all entities must
 * be listed in their respective persistence.xml files using the  tag.
 * 
 * @see http://forum.springsource.org/showthread.php?t=61763
 */
public class MergingPersistenceUnitPostProcessor implements PersistenceUnitPostProcessor
{
	private String targetPersistenceUnitName;

	private final Logger LOG = Logger.getLogger(MergingPersistenceUnitPostProcessor.class);

	Map> puiClasses = new HashMap>();

	MutablePersistenceUnitInfo targetPui;

	List puisToMerge = new ArrayList();

	private void mergeManagedClasses(MutablePersistenceUnitInfo sourcePui)
	{
		LOG.info(String.format("merging persistence unit '%s' to '%s'", sourcePui.getPersistenceUnitName(), targetPui.getPersistenceUnitName()));

		for (String managedClassName : sourcePui.getManagedClassNames())
		{
			targetPui.addManagedClassName(managedClassName);
		}
	}

	/** {@inheritDoc} */
	@Override
	public void postProcessPersistenceUnitInfo(MutablePersistenceUnitInfo pui)
	{
		if (pui.getPersistenceUnitName().endsWith(targetPersistenceUnitName))
		{
			LOG.info(String.format("target persistence unit '%s' (%s)", pui.getPersistenceUnitName(),
					StringUtils.join(pui.getManagedClassNames().listIterator(), ",")));
			targetPui = pui;

			for (MutablePersistenceUnitInfo puiToMerge : puisToMerge)
			{
				mergeManagedClasses(puiToMerge);
			}
		}
		else
		{
			if (targetPui == null)
			{
				LOG.info(String.format("persistence unit '%s' marked for later merging (%s)", pui.getPersistenceUnitName(),
						StringUtils.join(pui.getManagedClassNames().listIterator(), ",")));
				puisToMerge.add(pui);
			}
			else
			{
				mergeManagedClasses(pui);
			}
		}
	}

	public void setTargetPersistenceUnitName(String targetPersistenceUnitName)
	{
		this.targetPersistenceUnitName = targetPersistenceUnitName;
	}

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy