/** * 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.viewer.wicket.model.models; import java.io.Serializable; import java.util.ArrayList; import org.apache.wicket.model.IModel; import org.apache.wicket.model.Model; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.apache.isis.core.metamodel.spec.ObjectSpecId; import org.apache.isis.core.metamodel.specloader.SpecificationLoader; import org.apache.isis.core.runtime.system.persistence.PersistenceSession; import org.apache.isis.viewer.wicket.model.mementos.ObjectAdapterMemento; /** * For widgets that use a <tt>org.wicketstuff.select2.Select2MultiChoice</tt>; * synchronizes the {@link Model} of the <tt>Select2MultiChoice</tt> * with the parent {@link ScalarModel}, allowing also for pending values. */ public interface ScalarModelWithMultiPending extends Serializable { public ArrayList<ObjectAdapterMemento> getMultiPending(); public void setMultiPending(ArrayList<ObjectAdapterMemento> pending); public ScalarModel getScalarModel(); static class Util { private static final Logger LOG = LoggerFactory.getLogger(ScalarModelWithMultiPending.Util.class); public static IModel<ArrayList<ObjectAdapterMemento>> createModel(final ScalarModel model) { return createModel(model.asScalarModelWithMultiPending()); } public static Model<ArrayList<ObjectAdapterMemento>> createModel(final ScalarModelWithMultiPending owner) { return new Model<ArrayList<ObjectAdapterMemento>>() { private static final long serialVersionUID = 1L; @Override public ArrayList<ObjectAdapterMemento> getObject() { final ArrayList<ObjectAdapterMemento> pending = owner.getMultiPending(); if (pending != null) { if (LOG.isDebugEnabled()) { LOG.debug("pending not null: " + pending.toString()); } return pending; } if (LOG.isDebugEnabled()) { LOG.debug("pending is null"); } final ScalarModel scalarModel = owner.getScalarModel(); final ObjectAdapterMemento objectAdapterMemento = scalarModel.getObjectAdapterMemento(); final ArrayList<ObjectAdapterMemento> mementos = objectAdapterMemento != null ? objectAdapterMemento.getList() : null; return mementos; } @Override public void setObject(final ArrayList<ObjectAdapterMemento> adapterMemento) { if (LOG.isDebugEnabled()) { LOG.debug(String.format("setting to: %s", adapterMemento != null ? adapterMemento.toString() : null)); } owner.setMultiPending(adapterMemento); final ScalarModel ownerScalarModel = owner.getScalarModel(); final PersistenceSession persistenceSession = ownerScalarModel.getPersistenceSession(); final SpecificationLoader specificationLoader = ownerScalarModel.getSpecificationLoader(); if(adapterMemento == null) { ownerScalarModel.setObject(null); } else { final ArrayList<ObjectAdapterMemento> ownerPending = owner.getMultiPending(); if (ownerPending != null) { if (LOG.isDebugEnabled()) { LOG.debug(String.format("setting to pending: %s", ownerPending.toString())); } final ObjectSpecId objectSpecId = ownerScalarModel.getTypeOfSpecification().getSpecId(); ownerScalarModel.setObjectMemento( ObjectAdapterMemento.createForList(adapterMemento, objectSpecId), persistenceSession, specificationLoader); } } } }; } } }