/* * Copyright (C) 2005 - 2014 Jaspersoft Corporation. All rights reserved. * http://www.jaspersoft.com. * * Unless you have purchased a commercial license agreement from Jaspersoft, * the following license terms apply: * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program.  If not, see <http://www.gnu.org/licenses/>. */ package com.jaspersoft.jasperserver.jaxrs.client.apiadapters.attributes; import com.jaspersoft.jasperserver.dto.authority.hypermedia.HypermediaAttribute; import com.jaspersoft.jasperserver.dto.authority.hypermedia.HypermediaAttributesListWrapper; import com.jaspersoft.jasperserver.jaxrs.client.apiadapters.AbstractAdapter; import com.jaspersoft.jasperserver.jaxrs.client.core.Callback; import com.jaspersoft.jasperserver.jaxrs.client.core.JerseyRequest; import com.jaspersoft.jasperserver.jaxrs.client.core.MimeTypeUtil; import com.jaspersoft.jasperserver.jaxrs.client.core.RequestExecution; import com.jaspersoft.jasperserver.jaxrs.client.core.SessionStorage; import com.jaspersoft.jasperserver.jaxrs.client.core.ThreadPoolUtil; import com.jaspersoft.jasperserver.jaxrs.client.core.exceptions.MandatoryParameterNotFoundException; import com.jaspersoft.jasperserver.jaxrs.client.core.exceptions.handling.DefaultErrorHandler; import com.jaspersoft.jasperserver.jaxrs.client.core.operationresult.OperationResult; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; import java.util.LinkedList; import javax.ws.rs.core.MultivaluedHashMap; import javax.ws.rs.core.MultivaluedMap; import static java.util.Arrays.asList; /** * @author Alex Krasnyanskiy * @author Tetiana Iefimenko * @since 6.0.1-ALPHA */ public class BatchAttributeAdapter extends AbstractAdapter { public static final String SERVICE_URI = "attributes"; private static final String SEPARATOR = "/"; private MultivaluedMap<String, String> params = new MultivaluedHashMap<String, String>(); private Boolean includePermissions = false; private String userName; private String organizationId; private ArrayList<String> path = new ArrayList<String>(); public BatchAttributeAdapter(String organizationId, String userName, SessionStorage sessionStorage) { super(sessionStorage); if (!"/" .equals(organizationId) && organizationId != null) { path.add("organizations"); path.add(organizationId); } if (userName != null) { path.add("users"); path.add(userName); } this.organizationId = organizationId; this.userName = userName; } public BatchAttributeAdapter(String organizationId, String userName, SessionStorage sessionStorage, String... attributesNames) { this(organizationId, userName, sessionStorage, asList(attributesNames)); } public BatchAttributeAdapter(String organizationId, String userName, SessionStorage sessionStorage, Collection<String> attributesNames) { this(organizationId, userName, sessionStorage); for (String attributeName : attributesNames) { if (attributeName.equals("")) { throw new IllegalArgumentException("Names of attributes are not valid."); } params.add("name", attributeName); } } public BatchAttributeAdapter parameter(AttributesSearchParameter parameter, String value) { if (parameter.equals(AttributesSearchParameter.HOLDER)) { String prefix; if (value.contains(SEPARATOR)) { if (value.equals(SEPARATOR)) { prefix = "tenant:"; } else { prefix = "user:/"; } } else { prefix = "tenant:/"; } value = prefix + value; } params.add(parameter.getName(), value); return this; } public BatchAttributeAdapter parameter(AttributesSearchParameter parameter, boolean value) { return this.parameter(parameter, String.valueOf(value)); } public BatchAttributeAdapter parameter(AttributesSearchParameter parameter, Integer value) { return this.parameter(parameter, value.toString()); } public BatchAttributeAdapter parameter(AttributesSearchParameter parameter, AttributesGroupParameter value) { return this.parameter(parameter, value.getName()); } public BatchAttributeAdapter setIncludePermissions(Boolean includePermissions) { this.includePermissions = includePermissions; return this; } public OperationResult<HypermediaAttributesListWrapper> get() { return buildRequest().get(); } public OperationResult<HypermediaAttributesListWrapper> search() { JerseyRequest<HypermediaAttributesListWrapper> jerseyRequest = buildSearchRequest(); return jerseyRequest.get(); } public <R> RequestExecution asyncGet(final Callback<OperationResult<HypermediaAttributesListWrapper>, R> callback) { final JerseyRequest<HypermediaAttributesListWrapper> request = buildRequest(); request.addParams(params); RequestExecution task = new RequestExecution(new Runnable() { @Override public void run() { callback.execute(request.get()); } }); ThreadPoolUtil.runAsynchronously(task); return task; } public OperationResult<HypermediaAttributesListWrapper> delete() { return buildRequest().delete(); } public <R> RequestExecution asyncDelete(final Callback<OperationResult<HypermediaAttributesListWrapper>, R> callback) { final JerseyRequest<HypermediaAttributesListWrapper> request = buildRequest(); request.addParams(params); RequestExecution task = new RequestExecution(new Runnable() { @Override public void run() { callback.execute(request.delete()); } }); ThreadPoolUtil.runAsynchronously(task); return task; } public OperationResult<HypermediaAttributesListWrapper> createOrUpdate(HypermediaAttributesListWrapper attributesListWrapper) { if (attributesListWrapper == null) { throw new MandatoryParameterNotFoundException("Attributes are required"); } if (params.get("name") != null && params.get("name").size() != 0) { LinkedList<HypermediaAttribute> list = new LinkedList<HypermediaAttribute>(attributesListWrapper.getProfileAttributes()); for (Iterator<HypermediaAttribute> iterator = list.iterator(); iterator.hasNext(); ) { HypermediaAttribute current = iterator.next(); if (!params.get("name").contains(current.getName())) { iterator.remove(); } } attributesListWrapper.setProfileAttributes(list); } return buildRequest() .setContentType(MimeTypeUtil.toCorrectContentMime(sessionStorage.getConfiguration(), "application/hal+{mime}")) .put(attributesListWrapper); } public <R> RequestExecution asyncCreateOrUpdate(final HypermediaAttributesListWrapper attributesList, final Callback<OperationResult<HypermediaAttributesListWrapper>, R> callback) { final JerseyRequest<HypermediaAttributesListWrapper> request = buildRequest(); RequestExecution task = new RequestExecution(new Runnable() { @Override public void run() { callback.execute(request.put(attributesList)); } }); ThreadPoolUtil.runAsynchronously(task); return task; } private JerseyRequest<HypermediaAttributesListWrapper> buildRequest() { path.add(SERVICE_URI); JerseyRequest<HypermediaAttributesListWrapper> request = JerseyRequest.buildRequest( sessionStorage, HypermediaAttributesListWrapper.class, path.toArray(new String[path.size()]), new DefaultErrorHandler()); if (includePermissions) { request.setAccept(MimeTypeUtil.toCorrectAcceptMime(sessionStorage.getConfiguration(), "application/hal+{mime}")); request.addParam("_embedded", "permission"); } request.addParams(params); return request; } private JerseyRequest<HypermediaAttributesListWrapper> buildSearchRequest() { JerseyRequest<HypermediaAttributesListWrapper> request = JerseyRequest.buildRequest( sessionStorage, HypermediaAttributesListWrapper.class, new String[]{SERVICE_URI}, new DefaultErrorHandler()); if (includePermissions) { request.addParam("_embedded", "permission"); } request.setAccept(MimeTypeUtil.toCorrectAcceptMime(sessionStorage.getConfiguration(), "application/attributes.collection+{mime}")); request.addParams(params); // if user did not specified holder make it form organizationId and userName variables if (!params.containsKey("holder") && (organizationId != null || userName != null)) { StringBuilder holderId = new StringBuilder(); holderId.append((userName == null) ? "tenant:" : "user:"); if (organizationId != null) { holderId.append(SEPARATOR); if (!SEPARATOR.equals(organizationId)) holderId.append(organizationId); } if (userName != null) { holderId.append(SEPARATOR); holderId.append(userName); }; request.addParam("holder", holderId.toString()); } return request; } }