Java tutorial
/******************************************************************************* * Copyright Searchbox - http://www.searchbox.com * * Licensed 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 com.searchbox.framework.web.admin; import java.util.ArrayList; import java.util.Arrays; import java.util.Iterator; import java.util.List; import javax.servlet.http.HttpServletRequest; import javax.validation.Valid; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.convert.ConversionService; import org.springframework.http.HttpStatus; import org.springframework.http.server.ServerHttpResponse; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.validation.BindingResult; import org.springframework.validation.Errors; import org.springframework.validation.ObjectError; import org.springframework.validation.Validator; import org.springframework.web.bind.WebDataBinder; import org.springframework.web.bind.annotation.InitBinder; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.servlet.ModelAndView; import com.searchbox.core.ref.Order; import com.searchbox.core.ref.Sort; import com.searchbox.framework.model.AttributeEntity; import com.searchbox.framework.model.PresetEntity; import com.searchbox.framework.model.SearchElementEntity; import com.searchbox.framework.repository.PresetRepository; import com.searchbox.framework.repository.SearchElementRepository; @Controller @RequestMapping("/admin/{searchbox}/searchElementDefinition") public class SearchElementDefinitionController { private static final Logger LOGGER = LoggerFactory.getLogger(SearchElementDefinitionController.class); @Autowired ConversionService conversionService; @Autowired SearchElementRepository repository; @Autowired PresetRepository presetRepository; @ModelAttribute("OrderEnum") public List<Order> getReferenceOrder() { return Arrays.asList(Order.values()); } @ModelAttribute("SortEnum") public List<Sort> getReferenceSort() { return Arrays.asList(Sort.values()); } @ModelAttribute("presetdefinitions") public List<PresetEntity> getPresetDefinitions() { ArrayList<PresetEntity> presetDefinitions = new ArrayList<PresetEntity>(); Iterator<PresetEntity> presets = presetRepository.findAll().iterator(); while (presets.hasNext()) { presetDefinitions.add(presets.next()); } return presetDefinitions; } @RequestMapping(method = RequestMethod.POST) public ModelAndView update(@Valid SearchElementEntity elementDefinition, BindingResult bindingResult, HttpServletRequest httpServletRequest, ServerHttpResponse response) { LOGGER.info("Creating an filed element: " + elementDefinition.getClazz().getSimpleName() + " for preset: " + elementDefinition.getPreset().getSlug()); ModelAndView model = new ModelAndView("admin/SearchElementDefinition/updateForm"); if (bindingResult.hasErrors()) { LOGGER.error("Bindding has error..."); for (ObjectError error : bindingResult.getAllErrors()) { LOGGER.error("Error: " + error.getDefaultMessage()); } response.setStatusCode(HttpStatus.PRECONDITION_FAILED); return model; } try { elementDefinition = repository.save(elementDefinition); } catch (Exception e) { LOGGER.error("Could not save elementDefinition", e); } model.addObject("searchElementDefinition", elementDefinition); return model; } @RequestMapping(params = "form") public String create(Model uiModel) { LOGGER.info("Creating EMPTY filed element"); // populateEditForm(uiModel, new SearchElementDefinition()); return "/admin/searchElementDefinition/create"; } @RequestMapping(value = "/{id}") public ModelAndView show(@PathVariable("id") Long id) { LOGGER.info("VIEW an filed element"); SearchElementEntity elementDef = repository.findOne(id); ModelAndView model = new ModelAndView("admin/SearchElementDefinition/updateForm"); model.addObject("searchElementDefinition", elementDef); return model; } @InitBinder protected void initBinder(WebDataBinder binder) { binder.addValidators(new Validator() { @Override public boolean supports(Class<?> clazz) { return SearchElementEntity.class.isAssignableFrom(clazz); } @Override public void validate(Object target, Errors errors) { SearchElementEntity<?> element = (SearchElementEntity<?>) target; for (AttributeEntity attr : element.getAttributes()) { if (!attr.getType().getName().equals(attr.getValue().getClass().getName())) { if (conversionService.canConvert(attr.getValue().getClass(), attr.getType())) { attr.setValue(conversionService.convert(attr.getValue(), attr.getType())); } } } } }); } }