/**
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF 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
*
* 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.
*/
package org.apache.isis.core.runtime.sessiontemplate;
import org.apache.isis.applib.services.bookmark.Bookmark;
import org.apache.isis.core.commons.authentication.AuthenticationSession;
import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
import org.apache.isis.core.metamodel.adapter.oid.RootOid;
import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
import org.apache.isis.core.runtime.system.context.IsisContext;
import org.apache.isis.core.runtime.system.persistence.PersistenceSession;
import org.apache.isis.core.runtime.system.session.IsisSession;
import org.apache.isis.core.runtime.system.session.IsisSessionFactory;
import org.apache.isis.core.runtime.system.transaction.IsisTransactionManager;
import org.apache.isis.core.runtime.system.transaction.TransactionalClosure;
import org.apache.isis.schema.common.v1.OidDto;
public abstract class AbstractIsisSessionTemplate {
/**
* Sets up an {@link IsisSession} then passes along any calling framework's context.
*/
public void execute(final AuthenticationSession authSession, final Object context) {
try {
getIsisSessionFactory().openSession(authSession);
PersistenceSession persistenceSession = getPersistenceSession();
persistenceSession.getServicesInjector().injectServicesInto(this);
doExecute(context);
} finally {
getIsisSessionFactory().closeSession();
}
}
// //////////////////////////////////////
/**
* Either override {@link #doExecute(Object)} (this method) or alternatively override
* {@link #doExecuteWithTransaction(Object)}.
*
* <p>
* This method is called within a current {@link org.apache.isis.core.runtime.system.session.IsisSession session},
* but with no current transaction. The default implementation sets up a
* {@link org.apache.isis.core.runtime.system.transaction.IsisTransaction transaction}
* and then calls {@link #doExecuteWithTransaction(Object)}. Override if you require more sophisticated
* transaction handling.
*/
protected void doExecute(final Object context) {
final PersistenceSession persistenceSession = getPersistenceSession();
final IsisTransactionManager transactionManager = getTransactionManager(persistenceSession);
transactionManager.executeWithinTransaction(new TransactionalClosure() {
@Override
public void execute() {
doExecuteWithTransaction(context);
}
});
}
/**
* Either override {@link #doExecuteWithTransaction(Object)} (this method) or alternatively override
* {@link #doExecuteWithTransaction(Object)}.
*
* <p>
* This method is called within a current
* {@link org.apache.isis.core.runtime.system.transaction.IsisTransaction transaction}, by the default
* implementation of {@link #doExecute(Object)}.
*/
protected void doExecuteWithTransaction(final Object context) {}
// //////////////////////////////////////
protected ObjectAdapter adapterFor(final Object targetObject) {
if(targetObject instanceof OidDto) {
final OidDto oidDto = (OidDto) targetObject;
return adapterFor(oidDto);
}
if(targetObject instanceof Bookmark) {
final Bookmark bookmark = (Bookmark) targetObject;
return adapterFor(bookmark);
}
return getPersistenceSession().adapterFor(targetObject);
}
protected ObjectAdapter adapterFor(final OidDto oidDto) {
final Bookmark bookmark = Bookmark.from(oidDto);
return adapterFor(bookmark);
}
protected ObjectAdapter adapterFor(final Bookmark bookmark) {
final RootOid rootOid = RootOid.create(bookmark);
return adapterFor(rootOid);
}
protected ObjectAdapter adapterFor(final RootOid rootOid) {
return getPersistenceSession().adapterFor(rootOid);
}
// //////////////////////////////////////
protected IsisSessionFactory getIsisSessionFactory() {
return IsisContext.getSessionFactory();
}
protected PersistenceSession getPersistenceSession() {
return getIsisSessionFactory().getCurrentSession().getPersistenceSession();
}
protected IsisTransactionManager getTransactionManager(PersistenceSession persistenceSession) {
return persistenceSession.getTransactionManager();
}
protected SpecificationLoader getSpecificationLoader() {
return getIsisSessionFactory().getSpecificationLoader();
}
}