HibernateRepositoryBuilder.java

/*******************************************************************************
 * Copyright (c) 2026 Carsten Hammer.
 *
 * This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License 2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 * Contributors:
 *     Carsten Hammer
 *******************************************************************************/
package org.eclipse.jgit.storage.hibernate.repository;

import java.io.IOException;

import org.eclipse.jgit.internal.storage.dfs.DfsRepositoryBuilder;
import org.eclipse.jgit.storage.hibernate.config.HibernateSessionFactoryProvider;
import org.hibernate.SessionFactory;

/**
 * Builder for creating {@link HibernateRepository} instances.
 * <p>
 * Example usage:
 *
 * <pre>
 * Properties props = new Properties();
 * props.put("hibernate.connection.url", "jdbc:h2:mem:test");
 * props.put("hibernate.connection.driver_class", "org.h2.Driver");
 * props.put("hibernate.hbm2ddl.auto", "create-drop");
 *
 * HibernateSessionFactoryProvider provider = new HibernateSessionFactoryProvider(
 * 		props);
 *
 * HibernateRepository repo = new HibernateRepositoryBuilder()
 * 		.setSessionFactoryProvider(provider).setRepositoryName("my-repo")
 * 		.build();
 * </pre>
 */
public class HibernateRepositoryBuilder extends
		DfsRepositoryBuilder<HibernateRepositoryBuilder, HibernateRepository> {

	private HibernateSessionFactoryProvider sessionFactoryProvider;

	private String repositoryName;

	/**
	 * Set the Hibernate session factory provider.
	 *
	 * @param provider
	 *            the session factory provider
	 * @return this builder
	 */
	public HibernateRepositoryBuilder setSessionFactoryProvider(
			HibernateSessionFactoryProvider provider) {
		this.sessionFactoryProvider = provider;
		return self();
	}

	/**
	 * Get the session factory provider.
	 *
	 * @return the session factory provider
	 */
	public HibernateSessionFactoryProvider getSessionFactoryProvider() {
		return sessionFactoryProvider;
	}

	/**
	 * Set the repository name used to partition data in the database.
	 *
	 * @param name
	 *            the repository name
	 * @return this builder
	 */
	public HibernateRepositoryBuilder setRepositoryName(String name) {
		this.repositoryName = name;
		return self();
	}

	/**
	 * Get the repository name.
	 *
	 * @return the repository name
	 */
	public String getRepositoryName() {
		return repositoryName;
	}

	/**
	 * Get the Hibernate session factory.
	 *
	 * @return the session factory
	 */
	public SessionFactory getSessionFactory() {
		return sessionFactoryProvider != null
				? sessionFactoryProvider.getSessionFactory()
				: null;
	}

	@Override
	public HibernateRepository build() throws IOException {
		if (sessionFactoryProvider == null) {
			throw new IllegalArgumentException(
					"sessionFactoryProvider must be set before calling build()"); //$NON-NLS-1$
		}
		if (repositoryName == null || repositoryName.isEmpty()) {
			throw new IllegalArgumentException(
					"repositoryName must be set before calling build()"); //$NON-NLS-1$
		}
		return new HibernateRepository(this);
	}
}