/* * Copyright 2009-2016 Tilmann Zaeschke. All rights reserved. * * This file is part of ZooDB. * * ZooDB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * ZooDB is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with ZooDB. If not, see <http://www.gnu.org/licenses/>. * * See the README and COPYING files for further information. */ package org.zoodb.jdo.impl; import java.util.Collection; import java.util.HashMap; import java.util.HashSet; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Properties; import java.util.Set; import javax.jdo.FetchGroup; import javax.jdo.JDOUserException; import javax.jdo.PersistenceManager; import javax.jdo.PersistenceManagerFactory; import javax.jdo.datastore.DataStoreCache; import javax.jdo.listener.InstanceLifecycleListener; import javax.jdo.metadata.JDOMetadata; import javax.jdo.metadata.TypeMetadata; import javax.jdo.spi.JDOImplHelper; import javax.jdo.spi.StateInterrogation; import org.zoodb.api.impl.ZooPC; import org.zoodb.jdo.spi.ZooStateInterrogator; /** * This class simulates the JDO PersistenceManagerFactory * * @author Tilmann Zaeschke */ public class PersistenceManagerFactoryImpl extends AbstractPersistenceManagerFactory { private static final long serialVersionUID = 1L; private Set<PersistenceManagerImpl> pms = new HashSet<PersistenceManagerImpl>(); private boolean isClosed = false; private boolean isReadOnly = false; private static final StateInterrogation SI = new ZooStateInterrogator(); private HashMap<InstanceLifecycleListener, List<Class<?>>> lcListeners = new HashMap<InstanceLifecycleListener, List<Class<?>>>(); /** * @param props NOT SUPPORTED! */ public PersistenceManagerFactoryImpl(Properties props) { super(props); JDOImplHelper.getInstance().addStateInterrogation(SI); } /** * Not in standard, but required in Poleposition Benchmark / JDO 1.0.2 * @param props * @return new PersistenceManagerFactory */ public static PersistenceManagerFactory getPersistenceManagerFactory (Properties props) { return new PersistenceManagerFactoryImpl(props); } public static PersistenceManagerFactory getPersistenceManagerFactory (Map<?, ?> props) { return new PersistenceManagerFactoryImpl((Properties) props); } public static PersistenceManagerFactory getPersistenceManagerFactory (Map<?, ?> overrides, Map<?, ?> props) { System.err.println("STUB PersistenceManagerFactoryImpl." + "getPersistenceManagerFactory(o, p)"); return new PersistenceManagerFactoryImpl((Properties) props); } /** * @see PersistenceManagerFactory#getPersistenceManager() */ @Override public PersistenceManager getPersistenceManager() { checkOpen(); PersistenceManagerImpl pm = new PersistenceManagerImpl(this, getConnectionPassword()); pms.add(pm); setFrozen(); //init for (Map.Entry<InstanceLifecycleListener, List<Class<?>>> e: lcListeners.entrySet()) { for (Class<?> c: e.getValue()) { pm.getSession().addInstanceLifecycleListener(e.getKey(), new Class[]{c}); //pm.addInstanceLifecycleListener(e.getKey(), c); } } return pm; } /** * @see PersistenceManagerFactory#getProperties() */ @Override public Properties getProperties() { //return null; // TODO Auto-generated method stub throw new UnsupportedOperationException(); } @Override public Object clone() { PersistenceManagerFactoryImpl pmf = (PersistenceManagerFactoryImpl) super.clone(); pmf.pms = new HashSet<PersistenceManagerImpl>(); //do not clone _pm! return pmf; } @Override public void addFetchGroups(FetchGroup... arg0) { checkOpen(); //? TZ // TODO Auto-generated method stub throw new UnsupportedOperationException(); } @SuppressWarnings("rawtypes") @Override public void addInstanceLifecycleListener(InstanceLifecycleListener arg0, Class[] arg1) { checkFrozen(); List<Class<?>> clsL = lcListeners.get(arg0); if (clsL == null) { clsL = new LinkedList<Class<?>>(); lcListeners.put(arg0, clsL); } if (arg1 != null) { for (Class<?> c: arg1) { clsL.add(c); } } else { clsL.add(ZooPC.class); } } @Override public void close() { //Close this PersistenceManagerFactory. Check for JDOPermission( //"closePersistenceManagerFactory") and if not authorized, throw SecurityException. //If the authorization check succeeds, check to see that all PersistenceManager instances //obtained from this PersistenceManagerFactory have no active transactions. If any //PersistenceManager instances have an active transaction, throw a JDOUserException, with //one nested JDOUserException for each PersistenceManager with an active Transaction. //If there are no active transactions, then close all PersistenceManager instances obtained //from this PersistenceManagerFactory and mark this PersistenceManagerFactory as closed. //After close completes, disallow all methods except close, isClosed, and get methods //except for getPersistenceManager. //If any disallowed method is called after close, then JDOUserException is thrown. //TODO fix! for (PersistenceManagerImpl pm: pms) { if (!pm.isClosed() && pm.currentTransaction().isActive()) { throw new JDOUserException("Found active PersistenceManager. ", new JDOUserException(), pm); } } while(!pms.isEmpty()) { PersistenceManager pm = pms.iterator().next(); if (!pm.isClosed()) { pm.close(); } else { //This is a contingency measure for failing TX pms.remove(pm); } } JDOImplHelper.getInstance().removeStateInterrogation(SI); isClosed = true; } @Override public String getConnectionDriverName() { // TODO Auto-generated method stub throw new UnsupportedOperationException(); } @Override public Object getConnectionFactory() { // TODO Auto-generated method stub throw new UnsupportedOperationException(); } @Override public Object getConnectionFactory2() { // TODO Auto-generated method stub throw new UnsupportedOperationException(); } @Override public String getConnectionFactory2Name() { // TODO Auto-generated method stub throw new UnsupportedOperationException(); } @Override public String getConnectionFactoryName() { // TODO Auto-generated method stub throw new UnsupportedOperationException(); } @Override public boolean getCopyOnAttach() { // TODO Auto-generated method stub throw new UnsupportedOperationException(); } @Override public DataStoreCache getDataStoreCache() { // TODO Auto-generated method stub throw new UnsupportedOperationException(); } @SuppressWarnings("rawtypes") @Override public FetchGroup getFetchGroup(Class arg0, String arg1) { // TODO Auto-generated method stub throw new UnsupportedOperationException(); } @SuppressWarnings("rawtypes") @Override public Set getFetchGroups() { // TODO Auto-generated method stub throw new UnsupportedOperationException(); } @Override public String getMapping() { // TODO Auto-generated method stub throw new UnsupportedOperationException(); } @Override public String getName() { return getSessionName(); } @Override public boolean getNontransactionalWrite() { // TODO Auto-generated method stub throw new UnsupportedOperationException(); } @Override public PersistenceManager getPersistenceManager(String arg0, String arg1) { // TODO Auto-generated method stub throw new UnsupportedOperationException(); } @Override public PersistenceManager getPersistenceManagerProxy() { // TODO Auto-generated method stub throw new UnsupportedOperationException(); } @Override public boolean getReadOnly() { return isReadOnly; } @Override public boolean getRestoreValues() { // TODO Auto-generated method stub throw new UnsupportedOperationException(); } @Override public String getServerTimeZoneID() { // TODO Auto-generated method stub throw new UnsupportedOperationException(); } @Override public String getTransactionIsolationLevel() { // TODO Auto-generated method stub throw new UnsupportedOperationException(); } @Override public String getTransactionType() { // TODO Auto-generated method stub throw new UnsupportedOperationException(); } @Override public boolean isClosed() { return isClosed; } @Override public void removeAllFetchGroups() { checkOpen(); //? TZ // TODO Auto-generated method stub throw new UnsupportedOperationException(); } @Override public void removeFetchGroups(FetchGroup... arg0) { checkOpen(); //? TZ // TODO Auto-generated method stub throw new UnsupportedOperationException(); } @Override public void removeInstanceLifecycleListener(InstanceLifecycleListener arg0) { checkFrozen(); lcListeners.remove(arg0); } @Override public void setConnectionDriverName(String arg0) { checkOpen(); // TODO Auto-generated method stub throw new UnsupportedOperationException(); } @Override public void setConnectionFactory(Object arg0) { checkOpen(); // TODO Auto-generated method stub throw new UnsupportedOperationException(); } @Override public void setConnectionFactory2(Object arg0) { checkOpen(); // TODO Auto-generated method stub throw new UnsupportedOperationException(); } @Override public void setConnectionFactory2Name(String arg0) { checkOpen(); // TODO Auto-generated method stub throw new UnsupportedOperationException(); } @Override public void setConnectionFactoryName(String arg0) { checkOpen(); // TODO Auto-generated method stub throw new UnsupportedOperationException(); } @Override public void setCopyOnAttach(boolean arg0) { checkOpen(); // TODO Auto-generated method stub throw new UnsupportedOperationException(); } @Override public void setMapping(String arg0) { checkOpen(); // TODO Auto-generated method stub throw new UnsupportedOperationException(); } @Override public void setName(String arg0) { checkOpen(); setSessionName(arg0); } @Override public void setNontransactionalWrite(boolean arg0) { checkOpen(); // TODO Auto-generated method stub throw new UnsupportedOperationException(); } @Override public void setReadOnly(boolean arg0) { checkOpen(); isReadOnly = arg0; } @Override public void setRestoreValues(boolean arg0) { checkOpen(); // TODO Auto-generated method stub throw new UnsupportedOperationException(); } @Override public void setServerTimeZoneID(String arg0) { checkOpen(); // TODO Auto-generated method stub throw new UnsupportedOperationException(); } @Override public void setTransactionIsolationLevel(String arg0) { checkOpen(); // TODO Auto-generated method stub throw new UnsupportedOperationException(); } @Override public void setTransactionType(String arg0) { checkOpen(); // TODO Auto-generated method stub throw new UnsupportedOperationException(); } @Override public Collection<String> supportedOptions() { // TODO Auto-generated method stub throw new UnsupportedOperationException(); } private void checkOpen() { if (isClosed) { throw new JDOUserException("The Factory is already closed."); } } void deRegister(PersistenceManagerImpl persistenceManagerImpl) { pms.remove(persistenceManagerImpl); } @Override public Integer getDatastoreReadTimeoutMillis() { // TODO Auto-generated method stub throw new UnsupportedOperationException(); //return null; } @Override public Integer getDatastoreWriteTimeoutMillis() { // TODO Auto-generated method stub throw new UnsupportedOperationException(); //return null; } @Override public TypeMetadata getMetadata(String arg0) { // TODO Auto-generated method stub throw new UnsupportedOperationException(); //return null; } @Override public JDOMetadata newMetadata() { // TODO Auto-generated method stub throw new UnsupportedOperationException(); //return null; } @Override public void registerMetadata(JDOMetadata arg0) { // TODO Auto-generated method stub throw new UnsupportedOperationException(); // } @Override public void setDatastoreReadTimeoutMillis(Integer arg0) { // TODO Auto-generated method stub throw new UnsupportedOperationException(); // } @Override public void setDatastoreWriteTimeoutMillis(Integer arg0) { // TODO Auto-generated method stub throw new UnsupportedOperationException(); // } }