/*
* 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.AdvancedCriteria;
import com.smartgwt.client.data.Criteria;
import com.smartgwt.client.data.Criterion;
import com.smartgwt.client.data.DSRequest;
import com.smartgwt.client.data.DataSource;
import com.smartgwt.client.data.Record;
import com.smartgwt.client.data.RestDataSource;
import com.smartgwt.client.data.fields.DataSourceDateTimeField;
import com.smartgwt.client.data.fields.DataSourceEnumField;
import com.smartgwt.client.data.fields.DataSourceIntegerField;
import com.smartgwt.client.data.fields.DataSourceTextField;
import com.smartgwt.client.types.DSDataFormat;
import com.smartgwt.client.types.DSOperationType;
import com.smartgwt.client.types.DateDisplayFormat;
import com.smartgwt.client.types.OperatorId;
import cz.cas.lib.proarc.webapp.client.ClientMessages;
import cz.cas.lib.proarc.webapp.shared.rest.ConfigurationProfileResourceApi;
import cz.cas.lib.proarc.webapp.shared.rest.ImportResourceApi;
import java.util.HashMap;
import java.util.LinkedHashMap;
/**
*
* @author Jan Pokorsky
*/
public final class ImportBatchDataSource extends RestDataSource {
public static final String ID = "ImportBatchDataSource";
public static final String FIELD_ID = ImportResourceApi.IMPORT_BATCH_ID;
public static final String FIELD_PATH = ImportResourceApi.IMPORT_BATCH_FOLDER;
public static final String FIELD_DESCRIPTION = ImportResourceApi.IMPORT_BATCH_DESCRIPTION;
public static final String FIELD_TIMESTAMP = ImportResourceApi.IMPORT_BATCH_TIMESTAMP;
public static final String FIELD_CREATE = ImportResourceApi.IMPORT_BATCH_CREATE;
public static final String FIELD_STATE = ImportResourceApi.IMPORT_BATCH_STATE;
public static final String FIELD_USER_ID = ImportResourceApi.IMPORT_BATCH_USERID;
public static final String FIELD_USER_DISPLAYNAME = ImportResourceApi.IMPORT_BATCH_USER;
public static final String FIELD_PARENT = ImportResourceApi.IMPORT_BATCH_PARENTPID;
public static final String FIELD_LOG = ImportResourceApi.IMPORT_BATCH_FAILURE;
public static final String FIELD_PROFILE_ID = ImportResourceApi.IMPORT_BATCH_PROFILE;
public static final String FIELD_DEVICE = ImportResourceApi.NEWBATCH_DEVICE_PARAM;
public static final String FIELD_INDICES = ImportResourceApi.NEWBATCH_INDICES_PARAM;
public ImportBatchDataSource() {
setID(ID);
setDataFormat(DSDataFormat.JSON);
setDataURL(RestConfig.URL_IMPORT_BATCH);
ClientMessages i18n = GWT.create(ClientMessages.class);
DataSourceIntegerField id = new DataSourceIntegerField(FIELD_ID);
id.setPrimaryKey(true);
DataSourceTextField description = new DataSourceTextField(FIELD_DESCRIPTION);
DataSourceTextField user = new DataSourceTextField(FIELD_USER_DISPLAYNAME);
DataSourceIntegerField userId = new DataSourceIntegerField(FIELD_USER_ID);
userId.setForeignKey(UserDataSource.ID + '.' + UserDataSource.FIELD_ID);
DataSourceDateTimeField create = new DataSourceDateTimeField(FIELD_CREATE);
create.setDateFormatter(DateDisplayFormat.TOEUROPEANSHORTDATETIME);
DataSourceDateTimeField timestamp = new DataSourceDateTimeField(FIELD_TIMESTAMP);
timestamp.setDateFormatter(DateDisplayFormat.TOEUROPEANSHORTDATETIME);
DataSourceEnumField state = new DataSourceEnumField(FIELD_STATE);
LinkedHashMap<String, String> states = new LinkedHashMap<String, String>();
states.put(State.LOADING.name(), i18n.ImportBatchDataSource_State_LOADING());
states.put(State.LOADING_FAILED.name(), i18n.ImportBatchDataSource_State_LOADING_FAILED());
states.put(State.LOADED.name(), i18n.ImportBatchDataSource_State_LOADED());
states.put(State.INGESTING.name(), i18n.ImportBatchDataSource_State_INGESTING());
states.put(State.INGESTING_FAILED.name(), i18n.ImportBatchDataSource_State_INGESTING_FAILED());
states.put(State.INGESTED.name(), i18n.ImportBatchDataSource_State_INGESTED());
state.setValueMap(states);
DataSourceTextField parent = new DataSourceTextField(FIELD_PARENT);
parent.setHidden(true);
DataSourceTextField profileId = new DataSourceTextField(FIELD_PROFILE_ID);
profileId.setHidden(true);
DataSourceTextField log = new DataSourceTextField(FIELD_LOG);
setFields(id, description, userId, user, create, timestamp, state, parent, log, profileId);
setOperationBindings(RestConfig.createAddOperation(), RestConfig.createUpdateOperation());
setRequestProperties(RestConfig.createRestRequest(getDataFormat()));
}
@Override
protected Object transformRequest(DSRequest dsRequest) {
if (dsRequest.getOperationType() == DSOperationType.FETCH) {
Criteria criteria = dsRequest.getCriteria();
if (criteria.isAdvanced()) {
HashMap<String, Object> record = new HashMap<String, Object>();
advanceCriteriaAsParams(criteria.asAdvancedCriteria(), record);
dsRequest.setData(record);
}
}
return super.transformRequest(dsRequest);
}
/**
* Gets advanced criteria as HTTP GET params.
* @param ac advanced criteria
* @param map map of params
*/
private void advanceCriteriaAsParams(AdvancedCriteria ac, HashMap<String, Object> map) {
Criterion[] criteria = ac.getCriteria();
if (criteria == null) {
return ;
}
for (Criterion criterion : criteria) {
String fieldName = criterion.getFieldName();
if (criterion.isAdvanced() && fieldName == null) {
advanceCriteriaAsParams(criterion.asAdvancedCriteria(), map);
} else {
if (FIELD_CREATE.equals(fieldName)) {
if (criterion.getOperator() == OperatorId.LESS_OR_EQUAL) {
map.put(ImportResourceApi.IMPORT_BATCH_CREATE_TO, criterion.getValueAsDate());
} else {
map.put(ImportResourceApi.IMPORT_BATCH_CREATE_FROM, criterion.getValueAsDate());
}
} else if (FIELD_TIMESTAMP.equals(fieldName)) {
if (criterion.getOperator() == OperatorId.LESS_OR_EQUAL) {
map.put(ImportResourceApi.IMPORT_BATCH_MODIFIED_TO, criterion.getValueAsDate());
} else {
map.put(ImportResourceApi.IMPORT_BATCH_MODIFIED_FROM, criterion.getValueAsDate());
}
} else {
map.put(fieldName, criterion.getValueAsString());
}
}
}
}
public Record newBatch(String folderPath, String profile, String device, Boolean indices) {
Record r = new Record();
r.setAttribute(FIELD_PATH, folderPath);
if (profile != null) {
r.setAttribute(FIELD_PROFILE_ID, profile);
}
if (indices != null) {
r.setAttribute(FIELD_INDICES, indices);
}
if (device != null) {
r.setAttribute(FIELD_DEVICE, device);
}
return r;
}
public static ImportBatchDataSource getInstance() {
ImportBatchDataSource ds = (ImportBatchDataSource) DataSource.get(ID);
ds = ds != null ? ds : new ImportBatchDataSource();
return ds;
}
public static class BatchRecord {
private final Record delegate;
public BatchRecord(Record delegate) {
this.delegate = delegate;
}
public String getId() {
return delegate.getAttribute(FIELD_ID);
}
public void setId(String id) {
delegate.setAttribute(FIELD_ID, id);
}
public String getParentPid() {
return delegate.getAttribute(FIELD_PARENT);
}
public void setParentPid(String pid) {
delegate.setAttribute(FIELD_PARENT, pid);
}
public String getProfileId() {
return delegate.getAttribute(FIELD_PROFILE_ID);
}
public static boolean isArchive(String profileId) {
return ConfigurationProfileResourceApi.ARCHIVE_ID.equals(profileId);
}
public boolean isArchive() {
return isArchive(getProfileId());
}
public State getState() {
String attr = delegate.getAttribute(FIELD_STATE);
return State.fromString(attr);
}
public String getLog() {
return delegate.getAttribute(FIELD_LOG);
}
public Record getDelegate() {
return delegate;
}
}
/**
* Copy of {@link cz.cas.lib.proarc.common.imports.ImportBatchManager.ImportBatch.State State}.
* XXX make it GWT accessible and remove this.
*/
public enum State {
EMPTY, LOADING, LOADING_FAILED, LOADED, INGESTING, INGESTING_FAILED, INGESTED;
public static State fromString(String value) {
try {
return value == null ? null : valueOf(value);
} catch (IllegalArgumentException e) {
return null;
}
}
}
}