/* * Copyright (C) 2012 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.Callback; import com.google.gwt.event.shared.HandlerRegistration; import com.smartgwt.client.data.Criteria; import com.smartgwt.client.data.DataSource; import com.smartgwt.client.data.DataSourceField; import com.smartgwt.client.data.Record; import com.smartgwt.client.data.RestDataSource; import com.smartgwt.client.data.ResultSet; import com.smartgwt.client.data.events.DataArrivedEvent; import com.smartgwt.client.data.events.DataArrivedHandler; import com.smartgwt.client.data.fields.DataSourceDateTimeField; import com.smartgwt.client.data.fields.DataSourceTextField; import com.smartgwt.client.types.DSDataFormat; import com.smartgwt.client.types.DateDisplayFormat; import com.smartgwt.client.types.FetchMode; import com.smartgwt.client.types.FieldType; import cz.cas.lib.proarc.webapp.shared.rest.DigitalObjectResourceApi; import cz.cas.lib.proarc.webapp.shared.rest.DigitalObjectResourceApi.SearchType; import java.util.HashMap; /** * * @author Jan Pokorsky */ public final class SearchDataSource extends RestDataSource { public static final String ID = "SearchDataSource"; public static final String FIELD_PID = DigitalObjectResourceApi.MEMBERS_ITEM_PID; public static final String FIELD_MODEL = DigitalObjectResourceApi.MEMBERS_ITEM_MODEL; public static final String FIELD_OWNER = DigitalObjectResourceApi.MEMBERS_ITEM_OWNER; public static final String FIELD_LABEL = DigitalObjectResourceApi.MEMBERS_ITEM_LABEL; public static final String FIELD_STATE = DigitalObjectResourceApi.MEMBERS_ITEM_STATE; public static final String FIELD_CREATED = DigitalObjectResourceApi.MEMBERS_ITEM_CREATED; public static final String FIELD_MODIFIED = DigitalObjectResourceApi.MEMBERS_ITEM_MODIFIED; public static final String FIELD_EXPORT = DigitalObjectResourceApi.MEMBERS_ITEM_EXPORT; public SearchDataSource() { setID(ID); setDataFormat(DSDataFormat.JSON); setDataURL(RestConfig.URL_DIGOBJECT_SEARCH); DataSourceField pid = new DataSourceField(FIELD_PID, FieldType.TEXT); pid.setPrimaryKey(true); DataSourceField owner = new DataSourceField(FIELD_OWNER, FieldType.TEXT); DataSourceField label = new DataSourceField(FIELD_LABEL, FieldType.TEXT); DataSourceField state = new DataSourceField(FIELD_STATE, FieldType.ENUM); HashMap<String, String> states = new HashMap<String, String>(); states.put("fedora-system:def/model#Active", "Active"); states.put("fedora-system:def/model#Inactive", "Inactive"); states.put("fedora-system:def/model#Deleted", "Deleted"); state.setValueMap(states); DataSourceDateTimeField created = new DataSourceDateTimeField(FIELD_CREATED); created.setDateFormatter(DateDisplayFormat.TOEUROPEANSHORTDATETIME); DataSourceDateTimeField modified = new DataSourceDateTimeField(FIELD_MODIFIED); modified.setDateFormatter(DateDisplayFormat.TOEUROPEANSHORTDATETIME); DataSourceField export = new DataSourceField(FIELD_EXPORT, FieldType.TEXT); DataSourceTextField model = new DataSourceTextField(FIELD_MODEL); model.setForeignKey(MetaModelDataSource.ID + '.' + MetaModelDataSource.FIELD_PID); setFields(label, model, pid, created, modified, owner, state, export); setRequestProperties(RestConfig.createRestRequest(getDataFormat())); } public static SearchDataSource getInstance() { SearchDataSource ds = (SearchDataSource) DataSource.get(ID); ds = (ds != null) ? ds : new SearchDataSource(); return ds; } /** * Finds digital object records. * @param pids PIDs to find * @param callback result set of found records; no paging */ public void find(final String[] pids, final Callback<ResultSet, Void> callback) { Criteria criteria = new Criteria( DigitalObjectResourceApi.SEARCH_TYPE_PARAM, SearchType.PIDS.toString()); if (pids != null && pids.length > 0) { criteria.addCriteria(DigitalObjectResourceApi.SEARCH_PID_PARAM, pids); } else { throw new IllegalArgumentException("pids"); } basicFetch(criteria, callback); } /** * Finds parent object for a PID or a Batch Import. * * @param pid PID of digital object; {@code null} if looking for batch import * @param batchId ID of batch import; {@code null} if looking for PID * @param callback result set of found records */ public void findParent(String pid, String batchId, final Callback<ResultSet, Void> callback) { Criteria criteria = new Criteria( DigitalObjectResourceApi.SEARCH_TYPE_PARAM, SearchType.PARENT.toString()); if (pid != null && !pid.isEmpty()) { criteria.addCriteria(DigitalObjectResourceApi.SEARCH_PID_PARAM, pid); } if (batchId != null && !batchId.isEmpty()) { criteria.addCriteria(DigitalObjectResourceApi.SEARCH_BATCHID_PARAM, batchId); } basicFetch(criteria, callback); } private void basicFetch(Criteria criteria, final Callback<ResultSet, Void> callback) { final ResultSet resultSet = new ResultSet(this); resultSet.setCriteria(criteria); resultSet.setFetchMode(FetchMode.BASIC); // resultSet.setCriteriaPolicy(CriteriaPolicy.DROPONCHANGE); // server resource returns full result in case of SearchType.PIDS query if (resultSet.lengthIsKnown()) { callback.onSuccess(resultSet); } else { final HandlerRegistration[] handler = new HandlerRegistration[1]; handler[0] = resultSet.addDataArrivedHandler(new DataArrivedHandler() { @Override public void onDataArrived(DataArrivedEvent event) { handler[0].removeHandler(); callback.onSuccess(resultSet); } }); resultSet.get(0); } } public static boolean isDeleted(Record r) { return "fedora-system:def/model#Deleted".equals(r.getAttribute(FIELD_STATE)); } }