/*******************************************************************************
* Copyright (c) 2014 IBH SYSTEMS GmbH.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBH SYSTEMS GmbH - initial API and implementation
*******************************************************************************/
package org.eclipse.packagedrone.web;
import java.util.HashMap;
import java.util.Map;
public class ModelAndView
{
public static final String REDIRECT_PREFIX = "redirect:";
public static final String REFERER_PREFIX = "referer:";
private String viewName;
private Map<String, Object> model = new HashMap<> ();
private Class<?> alternateViewResolver;
public ModelAndView ( final String viewName, final Map<String, ?> model )
{
this.viewName = viewName;
this.model = copyModel ( model );
}
public ModelAndView ( final String viewName, final String key, final Object value )
{
this.viewName = viewName;
this.model = new HashMap<> ( 1 );
this.model.put ( key, value );
}
public ModelAndView ( final String viewName )
{
this ( viewName, null );
}
public ModelAndView ()
{
}
/**
* Set an alternate view resolver class
* <p>
* Normally the view is resolved by using the called controller class.
* However this method allows to set an alternate controller class which
* will be used instead to resolve the view.
* </p>
* <p>
* This can be required if there should be a "common view" which is re-used
* all over the application.
* </p>
*
* @param alternateViewResolver
* the view resolver to use instead of the controller class
*/
public void setAlternateViewResolver ( final Class<?> alternateViewResolver )
{
this.alternateViewResolver = alternateViewResolver;
}
public Class<?> getAlternateViewResolver ()
{
return this.alternateViewResolver;
}
public void setModel ( final Map<String, Object> model )
{
this.model = copyModel ( model );
}
public Map<String, Object> getModel ()
{
return this.model;
}
public String getViewName ()
{
return this.viewName;
}
public void setViewName ( final String viewName )
{
this.viewName = viewName;
}
public ModelAndView put ( final String key, final Object value )
{
this.model.put ( key, value );
return this;
}
public boolean isRedirect ()
{
if ( this.viewName == null )
{
return false;
}
return this.viewName.startsWith ( REDIRECT_PREFIX );
}
public boolean isReferer ()
{
if ( this.viewName == null )
{
return false;
}
return this.viewName.startsWith ( REFERER_PREFIX );
}
public String getRedirect ()
{
if ( isRedirect () )
{
return this.viewName.substring ( REDIRECT_PREFIX.length () );
}
else
{
return null;
}
}
public String getReferer ()
{
if ( isRedirect () )
{
return this.viewName.substring ( REFERER_PREFIX.length () );
}
else
{
return null;
}
}
@Override
public String toString ()
{
return String.format ( "[ModelAndView - %s]", this.viewName );
}
private static HashMap<String, Object> copyModel ( final Map<String, ?> model )
{
return model != null ? new HashMap<String, Object> ( model ) : new HashMap<String, Object> ();
}
}