/*******************************************************************************
* 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.web.analytics;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
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.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.CommonController;
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" )
@RequestMapping ( "/system/extend/analytics" )
@Secured
@ControllerInterceptor ( SecuredControllerInterceptor.class )
@HttpConstraint ( rolesAllowed = { "ADMIN" } )
@ControllerInterceptor ( HttpContraintControllerInterceptor.class )
public class ConfigController implements InterfaceExtender
{
private CoreService service;
public void setService ( final CoreService service )
{
this.service = service;
}
@RequestMapping
public ModelAndView edit ()
{
final Map<String, Object> model = new HashMap<> ();
model.put ( "command", load () );
return new ModelAndView ( "edit", model );
}
@RequestMapping ( method = RequestMethod.POST )
public ModelAndView editPost ( @Valid @FormData ( "command" ) final Configuration data, final BindingResult result)
{
if ( !result.hasErrors () )
{
try
{
final Map<MetaKey, String> md = MetaKeys.unbind ( data );
this.service.setCoreProperties ( md );
}
catch ( final Exception e )
{
return CommonController.createError ( "Error", "Failed to update configuration", e );
}
}
final Map<String, Object> model = new HashMap<> ( 1 );
model.put ( "command", load () );
return new ModelAndView ( "edit", model );
}
private Configuration load ()
{
final Map<MetaKey, String> md = this.service.getCoreNamespaceProperties ( Constants.NAMESPACE, Constants.KEY_TRACKING_ID, Constants.KEY_ANONYMIZE_IP, Constants.KEY_FORCE_SSL );
final Configuration data = new Configuration ();
try
{
MetaKeys.bind ( data, md );
}
catch ( final Exception e )
{ // ignore
}
return data;
}
@Override
public List<MenuEntry> getMainMenuEntries ( final HttpServletRequest request )
{
if ( !request.isUserInRole ( "ADMIN" ) )
{
return null;
}
return Collections.singletonList ( new MenuEntry ( "System", Integer.MAX_VALUE, "Analytics", 5_000, LinkTarget.createFromController ( ConfigController.class, "edit" ), null, "stats" ) );
}
}