/* * Copyright (C) 2011 Jan Pokorsky * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package cz.cas.lib.proarc.webapp.client.ds; import com.google.gwt.core.client.GWT; import com.smartgwt.client.data.DSRequest; import com.smartgwt.client.data.DSResponse; import com.smartgwt.client.data.OperationBinding; import com.smartgwt.client.rpc.RPCResponse; import com.smartgwt.client.types.DSDataFormat; import com.smartgwt.client.types.DSOperationType; import com.smartgwt.client.types.DSProtocol; import cz.cas.lib.proarc.webapp.shared.rest.BibliographicCatalogResourceApi; import cz.cas.lib.proarc.webapp.shared.rest.ConfigurationProfileResourceApi; import cz.cas.lib.proarc.webapp.shared.rest.DeviceResourceApi; import cz.cas.lib.proarc.webapp.shared.rest.DigitalObjectResourceApi; import cz.cas.lib.proarc.webapp.shared.rest.ExportResourceApi; import cz.cas.lib.proarc.webapp.shared.rest.ImportResourceApi; import cz.cas.lib.proarc.webapp.shared.rest.LocalizationResourceApi; import cz.cas.lib.proarc.webapp.shared.rest.UserResourceApi; import cz.cas.lib.proarc.webapp.shared.rest.ValueMapResourceApi; import cz.cas.lib.proarc.webapp.shared.rest.WorkflowResourceApi; import java.util.HashMap; import java.util.Map; /** * * @author Jan Pokorsky */ public final class RestConfig { public static final String TYPE_APPLICATION_JSON = "application/json"; public static final String TYPE_APPLICATION_XML = "application/xml"; // public static final String URL_ROOT = "/rest"; /** Login servlet dialog */ public static final String URL_LOGIN_SERVLET = GWT.getHostPageBaseURL() + "proarclogin"; public static final String URL_ROOT = GWT.getHostPageBaseURL() + "rest/v1"; public static final String URL_IMPORT = path(URL_ROOT, ImportResourceApi.PATH); public static final String URL_IMPORT_FOLDER = path(URL_IMPORT, ImportResourceApi.FOLDER_PATH); public static final String URL_IMPORT_BATCH = path(URL_IMPORT, ImportResourceApi.BATCH_PATH); public static final String URL_IMPORT_BATCH_ITEM = path(URL_IMPORT_BATCH, ImportResourceApi.BATCHITEM_PATH); public static final String URL_DIGOBJECT = path(URL_ROOT, DigitalObjectResourceApi.PATH); public static final String URL_DIGOBJECT_ATM = path(URL_DIGOBJECT, DigitalObjectResourceApi.ATM_PATH); public static final String URL_DIGOBJECT_CHILDREN = path(URL_DIGOBJECT, DigitalObjectResourceApi.MEMBERS_PATH); public static final String URL_DIGOBJECT_CHILDREN_MOVE = path(URL_DIGOBJECT_CHILDREN, DigitalObjectResourceApi.MEMBERS_MOVE_PATH); public static final String URL_DIGOBJECT_DC = path(URL_DIGOBJECT, DigitalObjectResourceApi.DC_PATH); public static final String URL_DIGOBJECT_DISSEMINATION = path( URL_DIGOBJECT, DigitalObjectResourceApi.DISSEMINATION_PATH); public static final String URL_DIGOBJECT_FULL = path(URL_DIGOBJECT, DigitalObjectResourceApi.FULL_PATH); public static final String URL_DIGOBJECT_METAMODEL = path( URL_DIGOBJECT, DigitalObjectResourceApi.METAMODEL_PATH); public static final String URL_DIGOBJECT_MODS = path(URL_DIGOBJECT, DigitalObjectResourceApi.MODS_PATH); public static final String URL_DIGOBJECT_MODS_CUSTOM = path( URL_DIGOBJECT_MODS, DigitalObjectResourceApi.MODS_CUSTOM_PATH); public static final String URL_DIGOBJECT_MODS_PLAIN = path( URL_DIGOBJECT_MODS, DigitalObjectResourceApi.MODS_PLAIN_PATH); public static final String URL_DIGOBJECT_OCR = path(URL_DIGOBJECT, DigitalObjectResourceApi.OCR_PATH); public static final String URL_DIGOBJECT_PREVIEW = path(URL_DIGOBJECT, DigitalObjectResourceApi.PREVIEW_PATH); public static final String URL_DIGOBJECT_PRIVATE_NOTE = path( URL_DIGOBJECT, DigitalObjectResourceApi.PRIVATENOTE_PATH); public static final String URL_DIGOBJECT_RAW = path(URL_DIGOBJECT, DigitalObjectResourceApi.RAW_PATH); public static final String URL_DIGOBJECT_SEARCH = path(URL_DIGOBJECT, DigitalObjectResourceApi.SEARCH_PATH); public static final String URL_DIGOBJECT_STREAMPROFILE = path(URL_DIGOBJECT, DigitalObjectResourceApi.STREAMPROFILE_PATH); public static final String URL_DIGOBJECT_THUMBNAIL = path(URL_DIGOBJECT, DigitalObjectResourceApi.THUMB_PATH); public static final String URL_DIGOBJECT_URNNBN = path( URL_DIGOBJECT, DigitalObjectResourceApi.URNNBN_PATH); public static final String URL_LOCALIZATION = path(URL_ROOT, LocalizationResourceApi.PATH); public static final String URL_BIBLIOCATALOG = path(URL_ROOT, BibliographicCatalogResourceApi.PATH); public static final String URL_BIBLIOCATALOG_QUERY = path( URL_BIBLIOCATALOG, BibliographicCatalogResourceApi.FIND_PATH); public static final String URL_USER = path(URL_ROOT, UserResourceApi.PATH); public static final String URL_USER_PERMISSIONS = URL_USER + "/permissions"; public static final String URL_EXPORT = path(URL_ROOT, ExportResourceApi.PATH); public static final String URL_EXPORT_ARCHIVE = path( URL_EXPORT, ExportResourceApi.ARCHIVE_PATH); public static final String URL_EXPORT_CEJSH = path( URL_EXPORT, ExportResourceApi.CEJSH_PATH); public static final String URL_EXPORT_CROSSREF = path( URL_EXPORT, ExportResourceApi.CROSSREF_PATH); public static final String URL_EXPORT_DATASTREAM = path( URL_EXPORT, ExportResourceApi.DATASTREAM_PATH); public static final String URL_EXPORT_DESA = path( URL_EXPORT, ExportResourceApi.DESA_PATH); public static final String URL_EXPORT_KRAMERIUS4 = path( URL_EXPORT, ExportResourceApi.KRAMERIUS4_PATH); public static final String URL_EXPORT_NDK = path( URL_EXPORT, ExportResourceApi.NDK_PATH); public static final String URL_DEVICE = path(URL_ROOT, DeviceResourceApi.PATH); public static final String URL_VALUEMAP = path(URL_ROOT, ValueMapResourceApi.PATH); public static final String URL_CONFIGPROFILE = path(URL_ROOT, ConfigurationProfileResourceApi.PATH); public static final String URL_WORKFLOW = path(URL_ROOT, WorkflowResourceApi.PATH); public static final String URL_WORKFLOW_MATERIAL = path(URL_WORKFLOW, WorkflowResourceApi.MATERIAL_PATH); public static final String URL_WORKFLOW_PARAMETER = path(URL_WORKFLOW, WorkflowResourceApi.PARAMETER_PATH); public static final String URL_WORKFLOW_PROFILE = path(URL_WORKFLOW, WorkflowResourceApi.PROFILE_PATH); public static final String URL_WORKFLOW_TASK = path(URL_WORKFLOW, WorkflowResourceApi.TASK_PATH); public static DSRequest createRestRequest(DSDataFormat format) { DSRequest dsr = new DSRequest(); dsr.setUseSimpleHttp(true); Map<String, String> defaultHeaders = new HashMap<String, String>(); switch (format) { case XML: defaultHeaders.put("Accept", TYPE_APPLICATION_XML); break; case JSON: defaultHeaders.put("Accept", TYPE_APPLICATION_JSON); break; } defaultHeaders.put("Accept-Language", LanguagesDataSource.activeLocale()); dsr.setHttpHeaders(defaultHeaders); return dsr; } /** * Helper for RESTful POST method. * * @return add operation */ public static OperationBinding createAddOperation() { OperationBinding op = new OperationBinding(); op.setOperationType(DSOperationType.ADD); op.setDataProtocol(DSProtocol.POSTPARAMS); DSRequest dsRequest = new DSRequest(); dsRequest.setHttpMethod("POST"); op.setRequestProperties(dsRequest); return op; } /** * Helper for RESTful PUT method. * * @return update operation */ public static OperationBinding createUpdateOperation() { OperationBinding op = new OperationBinding(); op.setOperationType(DSOperationType.UPDATE); op.setDataProtocol(DSProtocol.POSTPARAMS); DSRequest dsRequest = new DSRequest(); dsRequest.setHttpMethod("PUT"); op.setRequestProperties(dsRequest); return op; } /** * Helper for RESTful PUT method with parameters sent as JSON in the request body. * <p>Requires implementation of {@link com.smartgwt.client.data.DataSource#transformRequest}. * * @return update operation */ public static OperationBinding createUpdatePostOperation() { OperationBinding op = new OperationBinding(); op.setOperationType(DSOperationType.UPDATE); op.setDataProtocol(DSProtocol.POSTMESSAGE); DSRequest dsRequest = new DSRequest(); dsRequest.setHttpMethod("PUT"); dsRequest.setContentType(TYPE_APPLICATION_JSON); op.setRequestProperties(dsRequest); return op; } /** * Helper for RESTful DELETE method. * * @return remove operation */ public static OperationBinding createDeleteOperation() { OperationBinding op = new OperationBinding(); op.setOperationType(DSOperationType.REMOVE); op.setDataProtocol(DSProtocol.GETPARAMS); DSRequest dsRequest = new DSRequest(); dsRequest.setHttpMethod("DELETE"); op.setRequestProperties(dsRequest); return op; } /** * Helper to get REST response status. */ public static boolean isStatusOk(DSResponse response) { int status = response.getStatus(); Integer httpStatus = response.getHttpResponseCode(); // httpStatus == null returns locally cached data sources return status == RPCResponse.STATUS_SUCCESS && (httpStatus == null || httpStatus == 200); } public static boolean isConcurrentModification(DSResponse response) { return response.getHttpResponseCode() == 409; } private static String path(String parent, String path) { return parent + '/' + path; } }