001/* 002 * Copyright 2012-2018 the original author or authors. 003 * 004 * Licensed under the Apache License, Version 2.0 (the "License"); 005 * you may not use this file except in compliance with the License. 006 * You may obtain a copy of the License at 007 * 008 * http://www.apache.org/licenses/LICENSE-2.0 009 * 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, 012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 013 * See the License for the specific language governing permissions and 014 * limitations under the License. 015 */ 016 017package org.springframework.boot.autoconfigure.orm.jpa; 018 019import java.util.Arrays; 020 021import javax.persistence.EntityManager; 022 023import org.springframework.boot.autoconfigure.AutoConfigureAfter; 024import org.springframework.boot.autoconfigure.EnableAutoConfiguration; 025import org.springframework.boot.autoconfigure.condition.ConditionMessage; 026import org.springframework.boot.autoconfigure.condition.ConditionMessage.Style; 027import org.springframework.boot.autoconfigure.condition.ConditionOutcome; 028import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; 029import org.springframework.boot.autoconfigure.condition.SpringBootCondition; 030import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; 031import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration.HibernateEntityManagerCondition; 032import org.springframework.boot.context.properties.EnableConfigurationProperties; 033import org.springframework.context.annotation.ConditionContext; 034import org.springframework.context.annotation.Conditional; 035import org.springframework.context.annotation.Configuration; 036import org.springframework.context.annotation.Import; 037import org.springframework.core.Ordered; 038import org.springframework.core.annotation.Order; 039import org.springframework.core.type.AnnotatedTypeMetadata; 040import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; 041import org.springframework.util.ClassUtils; 042 043/** 044 * {@link EnableAutoConfiguration Auto-configuration} for Hibernate JPA. 045 * 046 * @author Phillip Webb 047 * @author Josh Long 048 * @author Manuel Doninger 049 * @author Andy Wilkinson 050 */ 051@Configuration 052@ConditionalOnClass({ LocalContainerEntityManagerFactoryBean.class, EntityManager.class }) 053@Conditional(HibernateEntityManagerCondition.class) 054@EnableConfigurationProperties(JpaProperties.class) 055@AutoConfigureAfter({ DataSourceAutoConfiguration.class }) 056@Import(HibernateJpaConfiguration.class) 057public class HibernateJpaAutoConfiguration { 058 059 @Order(Ordered.HIGHEST_PRECEDENCE + 20) 060 static class HibernateEntityManagerCondition extends SpringBootCondition { 061 062 private static final String[] CLASS_NAMES = { 063 "org.hibernate.ejb.HibernateEntityManager", 064 "org.hibernate.jpa.HibernateEntityManager" }; 065 066 @Override 067 public ConditionOutcome getMatchOutcome(ConditionContext context, 068 AnnotatedTypeMetadata metadata) { 069 ConditionMessage.Builder message = ConditionMessage 070 .forCondition("HibernateEntityManager"); 071 for (String className : CLASS_NAMES) { 072 if (ClassUtils.isPresent(className, context.getClassLoader())) { 073 return ConditionOutcome 074 .match(message.found("class").items(Style.QUOTE, className)); 075 } 076 } 077 return ConditionOutcome.noMatch(message.didNotFind("class", "classes") 078 .items(Style.QUOTE, Arrays.asList(CLASS_NAMES))); 079 } 080 081 } 082 083}