/**
* Licensed to Apereo under one or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information regarding copyright ownership. Apereo
* licenses this file to you 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 the
* following location:
*
* <p>http://www.apache.org/licenses/LICENSE-2.0
*
* <p>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.apereo.portal.portlet.rendering.worker;
import javax.persistence.EntityManager;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.orm.jpa.EntityManagerFactoryUtils;
import org.springframework.orm.jpa.EntityManagerHolder;
import org.springframework.orm.jpa.JpaAccessor;
import org.springframework.orm.jpa.JpaInterceptor;
import org.springframework.transaction.support.TransactionSynchronizationManager;
/**
* Opens and closes an {@link EntityManager} around the execution of a portlet, participates in an
* existing {@link EntityManager} if one already exists.
*
* @see JpaInterceptor
*/
public class JpaPortletExecutionInterceptor extends JpaAccessor
implements IPortletExecutionInterceptor {
private static final String IS_NEW = JpaPortletExecutionInterceptor.class.getName() + ".IS_NEW";
private static final String ENTITY_MANAGER_FACTORY =
JpaPortletExecutionInterceptor.class.getName() + ".ENTITY_MANAGER_FACTORY";
@Override
public void preExecution(
HttpServletRequest request,
HttpServletResponse response,
IPortletExecutionContext context) {
// Determine current EntityManager: either the transactional one
// managed by the factory or a temporary one for the given invocation.
EntityManager em = getTransactionalEntityManager();
boolean isNewEm = false;
if (em == null) {
logger.debug("Creating new EntityManager for JpaInterceptor invocation");
em = createEntityManager();
isNewEm = true;
TransactionSynchronizationManager.bindResource(
getEntityManagerFactory(), new EntityManagerHolder(em));
//For new EM store as attribute so it can be closed
context.setExecutionAttribute(ENTITY_MANAGER_FACTORY, em);
}
context.setExecutionAttribute(IS_NEW, isNewEm);
}
@Override
public void postExecution(
HttpServletRequest request,
HttpServletResponse response,
IPortletExecutionContext context,
Exception e) {
boolean isNewEm = (Boolean) context.getExecutionAttribute(IS_NEW);
if (isNewEm) {
TransactionSynchronizationManager.unbindResource(getEntityManagerFactory());
EntityManager em =
(EntityManager) context.getExecutionAttribute(ENTITY_MANAGER_FACTORY);
EntityManagerFactoryUtils.closeEntityManager(em);
}
}
/* (non-Javadoc)
* @see org.apereo.portal.portlet.rendering.worker.IPortletExecutionInterceptor#preSubmit(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse, org.apereo.portal.portlet.rendering.worker.IPortletExecutionContext)
*/
@Override
public void preSubmit(
HttpServletRequest request,
HttpServletResponse response,
IPortletExecutionContext context) {
//noop
}
}