org.apache.wicket.model.LoadableDetachableModel Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of org.ops4j.pax.wicket.service Show documentation
Show all versions of org.ops4j.pax.wicket.service Show documentation
Pax Wicket Service is an OSGi extension of the Wicket framework, allowing for dynamic loading and
unloading of Wicket components and pageSources.
/*
* 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.wicket.model;
import org.apache.wicket.Component;
import org.apache.wicket.RequestCycle;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Model that makes working with detachable models a breeze. LoadableDetachableModel holds a
* temporary, transient model object, that is set when {@link #getObject(Component)} is called by
* calling abstract method 'load', and that will be reset/ set to null on {@link #detach()}.
*
* A usage example:
*
*
* LoadableDetachableModel venueListModel = new LoadableDetachableModel()
* {
* protected Object load()
* {
* return getVenueDao().findVenues();
* }
* };
*
*
*
* Though you can override methods {@link #onAttach()} and {@link #onDetach()} for additional
* attach/ detach behavior, the point of this class is to hide as much of the attaching/ detaching
* as possible. So you should rarely need to override those methods, if ever.
*
*
* @author Eelco Hillenius
* @author Igor Vaynberg
*
* @param
* The Model Object type
*/
public abstract class LoadableDetachableModel implements IModel
{
/**
*
*/
private static final long serialVersionUID = 1L;
/** Logger. */
private static final Logger log = LoggerFactory.getLogger(LoadableDetachableModel.class);
/** keeps track of whether this model is attached or detached */
private transient boolean attached = false;
/** temporary, transient object. */
private transient T transientModelObject;
/**
* Construct.
*/
public LoadableDetachableModel()
{
}
/**
* This constructor is used if you already have the object retrieved and want to wrap it with a
* detachable model.
*
* @param object
* retrieved instance of the detachable object
*/
public LoadableDetachableModel(T object)
{
this.transientModelObject = object;
attached = true;
}
/**
* @see org.apache.wicket.model.IDetachable#detach()
*/
public void detach()
{
if (attached)
{
try
{
onDetach();
}
finally
{
attached = false;
transientModelObject = null;
log.debug("removed transient object for {}, requestCycle {}", this,
RequestCycle.get());
}
}
}
/**
* @see org.apache.wicket.model.IModel#getObject()
*/
public T getObject()
{
if (!attached)
{
attached = true;
transientModelObject = load();
if (log.isDebugEnabled())
{
log.debug("loaded transient object " + transientModelObject + " for " + this +
", requestCycle " + RequestCycle.get());
}
onAttach();
}
return transientModelObject;
}
/**
* Gets the attached status of this model instance
*
* @return true if the model is attached, false otherwise
*/
public final boolean isAttached()
{
return attached;
}
/**
* @see java.lang.Object#toString()
*/
@Override
public String toString()
{
StringBuffer sb = new StringBuffer(super.toString());
sb.append(":attached=").append(attached).append(":tempModelObject=[").append(
this.transientModelObject).append("]");
return sb.toString();
}
/**
* Loads and returns the (temporary) model object.
*
* @return the (temporary) model object
*/
protected abstract T load();
/**
* Attaches to the current request. Implement this method with custom behavior, such as loading
* the model object.
*/
protected void onAttach()
{
}
/**
* Detaches from the current request. Implement this method with custom behavior, such as
* setting the model object to null.
*/
protected void onDetach()
{
}
/**
* Manually loads the model with the specified object. Subsequent calls to {@link #getObject()}
* will return {@code object} until {@link #detach()} is called.
*
* @param object
* The object to set into the model
*/
public void setObject(final T object)
{
attached = true;
transientModelObject = object;
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy