/* * Copyright 2011 JBoss Inc * * 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 org.jbpm.formbuilder.server; import java.util.ArrayList; import java.util.List; import java.util.Map; import javax.servlet.http.HttpServletRequest; import javax.ws.rs.DELETE; import javax.ws.rs.GET; import javax.ws.rs.POST; import javax.ws.rs.Path; import javax.ws.rs.core.Context; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import javax.ws.rs.core.Response.Status; import org.jbpm.formapi.server.form.FormEncodingServerFactory; import org.jbpm.formapi.shared.api.FormItemRepresentation; import org.jbpm.formapi.shared.form.FormEncodingException; import org.jbpm.formapi.shared.form.FormEncodingFactory; import org.jbpm.formapi.shared.form.FormRepresentationDecoder; import org.jbpm.formapi.shared.menu.FormEffectDescription; import org.jbpm.formapi.shared.menu.MenuItemDescription; import org.jbpm.formapi.shared.menu.MenuOptionDescription; import org.jbpm.formapi.shared.menu.ValidationDescription; import org.jbpm.formbuilder.client.menu.items.CustomMenuItem; import org.jbpm.formbuilder.server.xml.FormEffectDTO; import org.jbpm.formbuilder.server.xml.ListMenuItemsDTO; import org.jbpm.formbuilder.server.xml.ListOptionsDTO; import org.jbpm.formbuilder.server.xml.ListValidationsDTO; import org.jbpm.formbuilder.server.xml.PropertiesDTO; import org.jbpm.formbuilder.server.xml.SaveMenuItemDTO; import org.jbpm.formbuilder.shared.menu.MenuService; import org.jbpm.formbuilder.shared.menu.MenuServiceException; @Path("/menu") public class RESTMenuService extends RESTBaseService { private MenuService menuService; public RESTMenuService() { FormEncodingFactory.register(FormEncodingServerFactory.getEncoder(), FormEncodingServerFactory.getDecoder()); } @GET @Path("/items") public Response listMenuItems() { init(); try { Map<String, List<MenuItemDescription>> items = menuService.listMenuItems(); ListMenuItemsDTO dto = new ListMenuItemsDTO(items); return Response.ok(dto, MediaType.APPLICATION_XML).build(); } catch (MenuServiceException e) { return error("Problem reading menu items", e); } } @GET @Path("/options") public Response listMenuOptions() { init(); try { List<MenuOptionDescription> options = menuService.listOptions(); ListOptionsDTO dto = new ListOptionsDTO(options); return Response.ok(dto, MediaType.APPLICATION_XML).build(); } catch (MenuServiceException e) { return error("Problem reading menu options", e); } } @GET @Path("/validations") public Response getValidations() { init(); try { List<ValidationDescription> validations = menuService.listValidations(); ListValidationsDTO dto = new ListValidationsDTO(validations); return Response.ok(dto, MediaType.APPLICATION_XML).build(); } catch (MenuServiceException e) { return error("Problem reading validations", e); } } @POST @Path("/items") public Response saveMenuItem(SaveMenuItemDTO dto, @Context HttpServletRequest request) { init(); try { if (RESTUserService.hasDesignerPrivileges(request)) { MenuItemDescription menuItem = toMenuItemDescription(dto, true); menuService.saveMenuItem(dto.getGroupName(), menuItem); return Response.status(Status.CREATED).build(); } else { return Response.status(Status.UNAUTHORIZED).build(); } } catch (MenuServiceException e) { return Response.status(Status.CONFLICT).build(); } } private MenuItemDescription toMenuItemDescription(SaveMenuItemDTO dto, boolean strict) throws MenuServiceException { FormRepresentationDecoder decoder = FormEncodingFactory.getDecoder(); String json = dto.getClone(); MenuItemDescription menuItem = new MenuItemDescription(); try { FormItemRepresentation item = decoder.decodeItem(json); menuItem.setItemRepresentation(item); } catch (FormEncodingException e) { if (strict) { throw new MenuServiceException("Couldn't load formRepresentation from dto", e); } menuItem.setItemRepresentation(null); } menuItem.setClassName(CustomMenuItem.class.getName()); menuItem.setName(dto.getName()); List<FormEffectDescription> effects = new ArrayList<FormEffectDescription>(); if (dto.getEffect() != null) { for (FormEffectDTO effectDto : dto.getEffect()) { FormEffectDescription effect = new FormEffectDescription(); effect.setClassName(effectDto.getClassName()); effects.add(effect); } } menuItem.setEffects(effects); List<String> allowedEvents = new ArrayList<String>(); if (dto.getAllowedEvent() != null) { for (String evtName : dto.getAllowedEvent()) { allowedEvents.add(evtName); } } menuItem.setAllowedEvents(allowedEvents); return menuItem; } @DELETE @Path("/items") public Response deleteMenuItem(SaveMenuItemDTO dto, @Context HttpServletRequest request) { init(); try { if (RESTUserService.hasDesignerPrivileges(request)) { MenuItemDescription menuItem = toMenuItemDescription(dto, false); Map<String, List<MenuItemDescription>> items = menuService.listMenuItems(); List<MenuItemDescription> group = items.get(dto.getGroupName()); if (group == null || group.isEmpty()) { return Response.noContent().build(); } boolean found = false; for (MenuItemDescription desc : group) { if (desc.getName().equals(dto.getName())) { found = true; break; } } if (!found) { return Response.status(Status.CONFLICT).build(); } menuService.deleteMenuItem(dto.getGroupName(), menuItem); return Response.status(Status.ACCEPTED).build(); } else { return Response.status(Status.UNAUTHORIZED).build(); } } catch (MenuServiceException e) { return error("Couldn't delete menu item " + dto.getGroupName() + ":" + dto.getName(), e); } } @GET @Path("/mappings") public Response getRepresentationMappings() { init(); try { Map<String, String> props = menuService.getFormBuilderProperties(); PropertiesDTO dto = new PropertiesDTO(props); return Response.ok(dto, MediaType.APPLICATION_XML).build(); } catch (MenuServiceException e) { return error("Problem reading form builder properties", e); } } private void init() { if (menuService == null) { menuService = ServiceFactory.getInstance().getMenuService(); } } /** * @param menuService the menuService to set (for test cases purpose) */ public void setMenuService(MenuService menuService) { this.menuService = menuService; } }