/*
* 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.services.persistsession;
import java.util.List;
import org.apache.isis.applib.annotation.DomainService;
import org.apache.isis.applib.annotation.NatureOfService;
import org.apache.isis.applib.annotation.Programmatic;
import org.apache.isis.applib.query.Query;
import org.apache.isis.applib.services.bookmark.Bookmark;
import org.apache.isis.applib.services.bookmark.BookmarkService2;
import org.apache.isis.applib.services.xactn.Transaction;
import org.apache.isis.applib.services.xactn.TransactionState;
import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
import org.apache.isis.core.metamodel.adapter.oid.Oid;
import org.apache.isis.core.metamodel.adapter.oid.RootOid;
import org.apache.isis.core.metamodel.services.persistsession.PersistenceSessionServiceInternal;
import org.apache.isis.core.metamodel.spec.ObjectSpecification;
import org.apache.isis.core.metamodel.spec.feature.OneToManyAssociation;
import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
import org.apache.isis.core.runtime.system.persistence.PersistenceSession;
import org.apache.isis.core.runtime.system.session.IsisSessionFactory;
import org.apache.isis.core.runtime.system.transaction.IsisTransaction;
import org.apache.isis.core.runtime.system.transaction.IsisTransactionManager;
import org.apache.isis.core.runtime.system.transaction.TransactionalClosure;
@DomainService(
nature = NatureOfService.DOMAIN,
menuOrder = "" + (Integer.MAX_VALUE - 1) // ie before the Noop impl in metamodel
)
public class PersistenceSessionServiceInternalDefault implements PersistenceSessionServiceInternal {
@Override
public ObjectAdapter getAdapterFor(Oid oid) {
return getPersistenceSession().getAdapterFor(oid);
}
@Override
public ObjectAdapter getAdapterFor(final Object pojo) {
return getPersistenceSession().getAdapterFor(pojo);
}
@Override
public ObjectAdapter adapterFor(final Object pojo) {
return getPersistenceSession().adapterFor(pojo);
}
@Override
public ObjectAdapter adapterFor(
final Object pojo,
final ObjectAdapter ownerAdapter,
final OneToManyAssociation collection) {
return getPersistenceSession().adapterFor(pojo, ownerAdapter, collection);
}
@Override
public ObjectAdapter mapRecreatedPojo(Oid oid, Object recreatedPojo) {
return getPersistenceSession().mapRecreatedPojo(oid, recreatedPojo);
}
@Override
public void removeAdapter(ObjectAdapter adapter) {
getPersistenceSession().removeAdapter(adapter);
}
@Override
public void makePersistent(final ObjectAdapter adapter) {
getPersistenceSession().makePersistentInTransaction(adapter);
}
@Override
public void remove(final ObjectAdapter adapter) {
getPersistenceSession().destroyObjectInTransaction(adapter);
}
@Override
public ObjectAdapter createTransientInstance(final ObjectSpecification spec) {
return getPersistenceSession().createTransientInstance(spec);
}
@Override
public ObjectAdapter createViewModelInstance(ObjectSpecification spec, String memento) {
return getPersistenceSession().createViewModelInstance(spec, memento);
}
@Override
public Object lookup(
final Bookmark bookmark,
final BookmarkService2.FieldResetPolicy fieldResetPolicy) {
return getPersistenceSession().lookup(bookmark, fieldResetPolicy);
}
@Override
public Bookmark bookmarkFor(Object domainObject) {
final ObjectAdapter adapter = getPersistenceSession().adapterFor(domainObject);
final Oid oid = adapter.getOid();
if(oid == null) {
// values cannot be bookmarked
return null;
}
if(!(oid instanceof RootOid)) {
// must be root
return null;
}
final RootOid rootOid = (RootOid) oid;
return rootOid.asBookmark();
}
@Override
public Bookmark bookmarkFor(Class<?> cls, String identifier) {
final ObjectSpecification objectSpec = getSpecificationLoader().loadSpecification(cls);
String objectType = objectSpec.getSpecId().asString();
return new Bookmark(objectType, identifier);
}
@Override
public void resolve(final Object parent) {
getPersistenceSession().resolve(parent);
}
/**
* @deprecated - left over from manual object resolving.
*/
@Deprecated
@Override
public void resolve(final Object parent, final Object field) {
if (field == null) {
resolve(parent);
}
}
@Override
public void beginTran() {
getTransactionManager().startTransaction();
}
@Override
public boolean flush() {
return getTransactionManager().flushTransaction();
}
@Override
public void commit() {
getTransactionManager().endTransaction();
}
@Override
public Transaction currentTransaction() {
return getTransactionManager().getCurrentTransaction();
}
@Override
public <T> List<ObjectAdapter> allMatchingQuery(final Query<T> query) {
return getPersistenceSession().allMatchingQuery(query);
}
@Override
public <T> ObjectAdapter firstMatchingQuery(final Query<T> query) {
return getPersistenceSession().firstMatchingQuery(query);
}
@Override
public void executeWithinTransaction(TransactionalClosure transactionalClosure) {
getTransactionManager().executeWithinTransaction(transactionalClosure);
}
@Override
public TransactionState getTransactionState() {
final IsisTransaction transaction = getTransactionManager().getCurrentTransaction();
if (transaction == null) {
return TransactionState.NONE;
}
IsisTransaction.State state = transaction.getState();
return state.getRuntimeContextState();
}
protected PersistenceSession getPersistenceSession() {
return getIsisSessionFactory().getCurrentSession().getPersistenceSession();
}
private IsisSessionFactory getIsisSessionFactory() {
return isisSessionFactory;
}
@Programmatic
public IsisTransactionManager getTransactionManager() {
return getPersistenceSession().getTransactionManager();
}
protected SpecificationLoader getSpecificationLoader() {
return getIsisSessionFactory().getSpecificationLoader();
}
@javax.inject.Inject
IsisSessionFactory isisSessionFactory;
}