/* * 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.google.gwt.regexp.shared.MatchResult; import com.google.gwt.regexp.shared.RegExp; import com.smartgwt.client.data.DSRequest; import com.smartgwt.client.data.DSResponse; import com.smartgwt.client.data.DataSource; import com.smartgwt.client.data.Record; import com.smartgwt.client.data.RestDataSource; import com.smartgwt.client.data.fields.DataSourceEnumField; import com.smartgwt.client.data.fields.DataSourceTextField; import com.smartgwt.client.types.DSDataFormat; import cz.cas.lib.proarc.webapp.client.ClientMessages; import cz.cas.lib.proarc.webapp.shared.rest.ImportResourceApi; import java.util.HashMap; import java.util.Map; public class ImportTreeDataSource extends RestDataSource { public static final String FIELD_NAME = "name"; public static final String FIELD_PARENT = ImportResourceApi.IMPORT_FOLDER_PARENT_PARAM; public static final String FIELD_PATH = ImportResourceApi.IMPORT_FOLDER_PATH; public static final String FIELD_PROFILE = ImportResourceApi.IMPORT_BATCH_PROFILE; public static final String FIELD_STATE = ImportResourceApi.IMPORT_FOLDER_STATE; private static final String ID = "ImportTreeDataSource"; private static final Map<String, String> states = new HashMap<String, String>(); public static ImportTreeDataSource getInstance() { ImportTreeDataSource ds = (ImportTreeDataSource) DataSource.get(ID); return ds != null ? ds : new ImportTreeDataSource(); } private ImportTreeDataSource() { setID(ID); setDataFormat(DSDataFormat.JSON); ClientMessages i18n = GWT.create(ClientMessages.class); DataSourceTextField path = new DataSourceTextField(FIELD_PATH); path.setPrimaryKey(true); path.setHidden(true); DataSourceTextField parent = new DataSourceTextField(FIELD_PARENT); parent.setForeignKey(FIELD_PATH); parent.setHidden(true); DataSourceTextField name = new DataSourceTextField(FIELD_NAME); DataSourceEnumField state = new DataSourceEnumField(FIELD_STATE); states.put(FolderState.IMPORTED, i18n.ImportBatchDataSource_State_LOADED()); states.put(FolderState.NEW, ""); states.put(FolderState.EMPTY, ""); state.setValueMap(states); setFields(path, parent, name, state); setDataURL(RestConfig.URL_IMPORT_FOLDER); setRequestProperties(RestConfig.createRestRequest(getDataFormat())); } @Override protected void transformResponse(DSResponse response, DSRequest request, Object data) { if (RestConfig.isStatusOk(response)) { for (Record record : response.getData()) { String path = record.getAttribute(FIELD_PATH); RegExp pathRegExp = RegExp.compile("(.*/)?(.*)/$"); MatchResult mr = pathRegExp.exec(path); String parent = mr.getGroup(1); String name = mr.getGroup(2); // System.out.println("## ITRDS.path: " + path); // System.out.println("## ITRDS.parent: " + parent); // System.out.println("## ITRDS.name: " + name); record.setAttribute(FIELD_NAME, name); record.setAttribute(FIELD_PARENT, parent); } } super.transformResponse(response, request, data); } /** * Helper to minimize params send to update the record. Actually it uses just 'path'. */ public static Record createUpdateRecord(Record rec, String model) { Record filtered = new Record(); filtered.setAttribute(FIELD_PATH, rec.getAttribute(FIELD_PATH)); filtered.setAttribute("model", model); return filtered; } public static final class ImportRecord { private final Record delegate; public ImportRecord(Record delegate) { this.delegate = delegate; } public String getPath() { return delegate.getAttribute(FIELD_PATH); } public boolean isImported() { return FolderState.IMPORTED.equals(delegate.getAttribute(FIELD_STATE)); } public boolean isNew() { String state = delegate.getAttribute(FIELD_STATE); return state == null || FolderState.NEW.equals(state); } } public static final class FolderState { public static final String EMPTY = "EMPTY"; public static final String IMPORTED = "IMPORTED"; public static final String NEW = "NEW"; } }