/* * 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.persistence.objectstore.transaction; import java.util.Iterator; import com.google.common.base.Splitter; import org.apache.isis.core.commons.authentication.AuthenticationSession; import org.apache.isis.core.metamodel.adapter.oid.Oid; import org.apache.isis.core.metamodel.adapter.oid.ParentedCollectionOid; import org.apache.isis.core.metamodel.adapter.oid.RootOid; import org.apache.isis.core.metamodel.adapter.version.Version; import org.apache.isis.core.metamodel.spec.ObjectSpecId; import org.apache.isis.core.metamodel.spec.ObjectSpecification; import org.apache.isis.core.metamodel.specloader.SpecificationLoader; import org.apache.isis.core.runtime.persistence.adapter.PojoAdapter; import org.apache.isis.core.runtime.system.persistence.PersistenceSession; public class PojoAdapterBuilder { private PersistenceSession persistenceSession; private PojoAdapterBuilder(){ } private Object pojo = new Object(); // override; else will delegate to SpecificationLoader private ObjectSpecification objectSpec; private SpecificationLoader specificationLoader; private ObjectSpecId objectSpecId = ObjectSpecId.of("CUS"); private String identifier = "1"; // only used if type is AGGREGATED private String aggregatedId = "firstName"; private Type type = Type.ROOT; private Persistence persistence = Persistence.PERSISTENT; private String titleString; private Version version; private AuthenticationSession authenticationSession; public enum Persistence { TRANSIENT { @Override RootOid createOid(ObjectSpecId objectSpecId, String identifier) { return RootOid.createTransient(objectSpecId, identifier); } }, PERSISTENT { @Override RootOid createOid(ObjectSpecId objectSpecId, String identifier) { return RootOid.create(objectSpecId, identifier); } }, VALUE { @Override RootOid createOid(ObjectSpecId objectSpecId, String identifier) { return null; } }; abstract RootOid createOid(ObjectSpecId objectSpecId, String identifier); } public static enum Type { ROOT { @Override Oid oidFor(RootOid rootOid, ObjectSpecId objectSpecId, String unused) { return rootOid; } }, COLLECTION { @Override Oid oidFor(RootOid rootOid, ObjectSpecId objectSpecId, String collectionId) { return new ParentedCollectionOid(rootOid, collectionId); } }, VALUE { @Override Oid oidFor(RootOid rootOid, ObjectSpecId objectSpecId, String unused) { return null; } }; abstract Oid oidFor(RootOid rootOid, ObjectSpecId objectSpecId, String supplementalId); } public static PojoAdapterBuilder create() { return new PojoAdapterBuilder(); } public PojoAdapterBuilder withIdentifier(String identifier) { this.identifier = identifier; return this; } public PojoAdapterBuilder withObjectType(String objectType) { this.objectSpecId = ObjectSpecId.of(objectType); return this; } public PojoAdapterBuilder withPojo(Object pojo) { this.pojo = pojo; return this; } public PojoAdapterBuilder withOid(String oidAndTitle) { final Iterator<String> iterator = Splitter.on("|").split(oidAndTitle).iterator(); if(!iterator.hasNext()) { return this; } withObjectType(iterator.next()); if(!iterator.hasNext()) { return this; } withIdentifier(iterator.next()); if(!iterator.hasNext()) { return this; } withTitleString(iterator.next()); return this; } /** * A Persistence of VALUE implies a Type of VALUE also */ public PojoAdapterBuilder with(Persistence persistence) { this.persistence = persistence; if(persistence == Persistence.VALUE) { this.type = Type.VALUE; } return this; } /** * A Type of VALUE implies a Persistence of VALUE also. */ public PojoAdapterBuilder with(Type type) { this.type = type; if(type == Type.VALUE) { this.persistence = Persistence.VALUE; } return this; } public PojoAdapterBuilder with(ObjectSpecification objectSpec) { this.objectSpec = objectSpec; return this; } public PojoAdapterBuilder with(PersistenceSession persistenceSession) { this.persistenceSession = persistenceSession; return this; } public PojoAdapterBuilder with(SpecificationLoader specificationLoader) { this.specificationLoader = specificationLoader; return this; } public PojoAdapterBuilder with(AuthenticationSession authenticationSession) { this.authenticationSession = authenticationSession; return this; } public PojoAdapterBuilder with(Version version) { this.version = version; return this; } public PojoAdapterBuilder withTitleString(String titleString) { this.titleString = titleString; return this; } public PojoAdapter build() { final RootOid rootOid = persistence.createOid(objectSpecId, identifier); final Oid oid = type.oidFor(rootOid, objectSpecId, aggregatedId); final PojoAdapter pojoAdapter = new PojoAdapter(pojo, oid, authenticationSession, specificationLoader, persistenceSession) { @Override public ObjectSpecification getSpecification() { return objectSpec != null? objectSpec: super.getSpecification(); } @Override public String titleString() { return titleString != null? titleString: super.titleString(); } }; if(persistence == Persistence.PERSISTENT && version != null) { pojoAdapter.setVersion(version); } return pojoAdapter; } }