/*
* Seldon -- open source prediction engine
* =======================================
*
* Copyright 2011-2015 Seldon Technologies Ltd and Rummble Ltd (http://www.seldon.io/)
*
* ********************************************************************************************
*
* Licensed 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
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* 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.
*
* ********************************************************************************************
*/
/*
* Created on Jan 8, 2006
*
*/
package io.seldon.db.jdo;
import java.util.HashMap;
import java.util.Map;
import javax.jdo.PersistenceManager;
import javax.jdo.PersistenceManagerFactory;
import javax.jdo.Transaction;
import org.apache.log4j.Logger;
public class JDOPMRetriever extends ThreadLocal<Map<String,PersistenceManager>>
{
private static Logger logger = Logger.getLogger( JDOPMRetriever.class.getName() );
public void cleanup() {
try
{
Map<String,PersistenceManager> map = (Map<String,PersistenceManager>)super.get();
if (map != null)
for(PersistenceManager pm : map.values())
{
if(pm == null) return;
try
{
if(!pm.isClosed())
{
TransactionPeer.closeReadOnlyTransaction(pm);
Transaction ts = pm.currentTransaction();
if(ts.isActive())
{
logger.warn("transaction stil active");
ts.rollback();
}
pm.close();
}
else
{
logger.warn("pm is closed");
}
}
catch(Exception ex)
{
logger.warn("exception on cleanup",ex);
}
}
}
finally {
set(null);
}
}
public Object getPersistenceManager(String client,PersistenceManagerFactory pmf)
{
Map<String,PersistenceManager> map = (Map<String,PersistenceManager>)super.get();
PersistenceManager pm = null;
if (map != null)
pm = map.get(client);
if(pm == null || pm.isClosed())
{
pm = pmf.getPersistenceManager( );
pm.setUserObject(client);
if (map == null)
map = new HashMap<>();
map.put(client, pm);
set(map);
}
return pm;
}
}