/*******************************************************************************
* Copyright (c) 2015 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.repo.manage.core.web;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import javax.servlet.annotation.HttpConstraint;
import javax.servlet.http.HttpServletRequest;
import javax.validation.Valid;
import org.eclipse.packagedrone.repo.MetaKey;
import org.eclipse.packagedrone.repo.MetaKeys;
import org.eclipse.packagedrone.repo.manage.core.CoreService;
import org.eclipse.packagedrone.repo.manage.system.SystemService;
import org.eclipse.packagedrone.sec.web.controller.HttpConstraints;
import org.eclipse.packagedrone.sec.web.controller.HttpContraintControllerInterceptor;
import org.eclipse.packagedrone.sec.web.controller.Secured;
import org.eclipse.packagedrone.sec.web.controller.SecuredControllerInterceptor;
import org.eclipse.packagedrone.web.Controller;
import org.eclipse.packagedrone.web.LinkTarget;
import org.eclipse.packagedrone.web.ModelAndView;
import org.eclipse.packagedrone.web.RequestMapping;
import org.eclipse.packagedrone.web.RequestMethod;
import org.eclipse.packagedrone.web.ViewResolver;
import org.eclipse.packagedrone.web.common.InterfaceExtender;
import org.eclipse.packagedrone.web.common.menu.MenuEntry;
import org.eclipse.packagedrone.web.controller.ControllerInterceptor;
import org.eclipse.packagedrone.web.controller.binding.BindingResult;
import org.eclipse.packagedrone.web.controller.form.FormData;
@Controller
@ViewResolver ( "/WEB-INF/views/%s.jsp" )
@Secured
@RequestMapping ( "/config/core" )
@ControllerInterceptor ( SecuredControllerInterceptor.class )
@HttpConstraint ( rolesAllowed = "ADMIN" )
@ControllerInterceptor ( HttpContraintControllerInterceptor.class )
public class CoreController implements InterfaceExtender
{
private CoreService coreService;
private SystemService systemService;
private static final Method METHOD_LIST = LinkTarget.getControllerMethod ( CoreController.class, "list" );
private static final Method METHOD_SITE = LinkTarget.getControllerMethod ( CoreController.class, "site" );
public void setCoreService ( final CoreService service )
{
this.coreService = service;
}
public void setSystemService ( final SystemService systemService )
{
this.systemService = systemService;
}
@Override
public List<MenuEntry> getMainMenuEntries ( final HttpServletRequest request )
{
final List<MenuEntry> result = new LinkedList<> ();
if ( HttpConstraints.isCallAllowed ( METHOD_LIST, request ) )
{
result.add ( new MenuEntry ( "Administration", 1000, "View properties", 1000, LinkTarget.createFromController ( METHOD_LIST ), null, null ) );
}
if ( HttpConstraints.isCallAllowed ( METHOD_SITE, request ) )
{
result.add ( new MenuEntry ( "Administration", 1000, "Site", 500, LinkTarget.createFromController ( METHOD_SITE ), null, null ) );
}
return result;
}
@RequestMapping ( value = "/list" )
public ModelAndView list ()
{
final Map<String, Object> model = new HashMap<> ( 1 );
model.put ( "properties", new TreeMap<> ( this.coreService.list () ) );
return new ModelAndView ( "list", model );
}
@RequestMapping ( value = "/site" )
public ModelAndView site ()
{
final Map<String, Object> model = new HashMap<> ();
final Map<MetaKey, String> props = this.coreService.list ();
final SiteInformation site = new SiteInformation ();
try
{
MetaKeys.bind ( site, props );
}
catch ( final Exception e )
{
// use plain new object
}
fillModel ( model, site );
return new ModelAndView ( "site", model );
}
protected void fillModel ( final Map<String, Object> model, final SiteInformation site )
{
model.put ( "command", site );
model.put ( "defaultSitePrefix", this.systemService.getDefaultSitePrefix () );
}
@RequestMapping ( value = "/site", method = RequestMethod.POST )
public ModelAndView sitePost ( @Valid @FormData ( "command" ) final SiteInformation site, final BindingResult result) throws Exception
{
final Map<String, Object> model = new HashMap<> ();
if ( !result.hasErrors () )
{
// store
final Map<MetaKey, String> props = MetaKeys.unbind ( site );
this.coreService.setCoreProperties ( props );
}
fillModel ( model, site );
return new ModelAndView ( "site", model );
}
}