/** * Looks up dcat mapping field for a give a record and writes response. * * @param r the record * @param dcatField the dcat field * @param before the indentation boolean cursor * @return the indentation boolean cursor */ private boolean lookUpFieldFromDcat(IFeedRecord r, DcatField dcatField, boolean before) { String delimiter = ","; String dl = dcatField.getDelimiter(); if (dl.length() > 0) { delimiter = dl; } String indexKey = dcatField.getIndex(); Map<String, IFeedAttribute> index = r.getData(IFeedRecord.STD_COLLECTION_INDEX); if (indexKey.length() > 0) { before = writeField(r, index, dcatField, delimiter, before); } else if (dcatField.getName().equalsIgnoreCase("identifier") && indexKey.length() == 0) { ResourceLinks links = r.getResourceLinks(); before = writeFieldValue( "\"" + getIdentifierUrl(links) + "\"", "identifier", delimiter, before, dcatField); } return before; }
/** * Writes fields value to response using field mappings. * * @param index the lucene index records * @param fieldName the lucene field * @param jsonKey the dcat field * @param delimiter the delimiter in lucene field * @param before the indentation flag * @param isDate true if date field * @return always <code>true</code> */ private boolean writeField( IFeedRecord r, Map<String, IFeedAttribute> index, DcatField dcatField, String delimiter, boolean before) { String indexFieldName = dcatField.getIndex(); String dcatFieldName = dcatField.getName(); String fieldType = dcatField.getType(); String fldValues = ""; String[] flds = indexFieldName.split(","); for (String fld : flds) { IFeedAttribute indexValue = index.get(fld); String val = ""; if (indexValue == null) { if (dcatField.isRequired()) { if (dcatFieldName.equalsIgnoreCase("accessURL")) { ResourceLinks links = r.getResourceLinks(); for (int j = 0; j < links.size(); j++) { ResourceLink link = links.get(j); if (link.getTag().equals(ResourceLink.TAG_METADATA)) { val = link.getUrl(); break; } } } else { val = defaultValues.get(dcatFieldName); } } else { continue; } } else { val = "" + indexValue; if (dcatFieldName.equalsIgnoreCase("format") && val.equalsIgnoreCase("[\"unknown\"]")) { val = defaultValues.get(dcatFieldName); } } String cleanedVal = cleanValue(val, fieldType, dcatFieldName, dcatField); if (dcatFieldName.equalsIgnoreCase("dataDictionary") && !(cleanedVal.startsWith("http://") || cleanedVal.startsWith("https://"))) { continue; } if (!fldValues.contains(cleanedVal)) { if (fldValues.length() > 0) { StringBuilder sb = new StringBuilder(); if (fieldType.equalsIgnoreCase("array")) { if (!cleanedVal.equalsIgnoreCase(defaultValues.get(dcatFieldName))) { if (fldValues.startsWith("[") && fldValues.endsWith("]")) { fldValues = fldValues.replace("[", "").replace("]", ""); } if (cleanedVal.startsWith("[") && cleanedVal.endsWith("]")) { cleanedVal = cleanedVal.replace("[", "").replace("]", ""); } sb.append("[").append(fldValues).append(delimiter).append(cleanedVal).append("]"); fldValues = sb.toString(); } } else { sb.append(fldValues).append(delimiter).append(cleanedVal); fldValues = sb.toString(); } } else { fldValues += cleanedVal; } } } if (fldValues.length() == 0) { fldValues = defaultValues.get(dcatFieldName); if (fldValues == null) { fldValues = ""; } } if (fldValues.length() > 0) { fldValues = fldValues.replaceAll(",", ", "); if (before) { print(false, ","); print(false, "\r\n"); } if (!fldValues.startsWith("\"") && !fldValues.startsWith("[") && !fldValues.endsWith("\"") && !fldValues.endsWith("]")) { fldValues = "\"" + fldValues + "\""; } print(before, "\"" + dcatFieldName + "\"" + sp() + ":" + sp() + fldValues); before = true; } return before; }
/** * Cleans value from lucene index * * @param value value to clean * @return cleaned value */ private String cleanValue(String value, String type, String dcatFieldName, DcatField dcatField) { String delimiter = ", "; String dateFormat = ""; int maxChars = -1; if (dcatField != null) { String df = dcatField.getDateFormat(); if (df.length() > 0) { dateFormat = df; } int mc = dcatField.getMaxChars(); if (mc > -1) { maxChars = mc; } } if (value == null) { return ""; } if (value == "null") { return ""; } if (type.equalsIgnoreCase("date") || dcatFieldName.equalsIgnoreCase("spatial")) { value = value.replaceAll("\"", ""); } if (value.startsWith("[")) { value = value.replace("[", ""); if (type.equalsIgnoreCase("string")) { value = value.replaceAll("\",\"", ","); } } if (value.endsWith("]")) { value = value.replace("]", ""); } // only one webService url if (dcatFieldName.equalsIgnoreCase("webService") && value != null && value.length() > 0) { String[] parts = value.split(",http"); if (parts != null && parts.length > 0) { value = parts[0]; if (!value.startsWith("\"")) { value = "\"" + Val.escapeStrForJson(value); } if (!value.endsWith("\"")) { value += "\""; } } } if (value != null && value.length() > 0) { if (type.equalsIgnoreCase("date")) { int firstIdx = value.indexOf(","); if (firstIdx > -1) { value = value.substring(0, firstIdx); } value = parseDateTime(value); if (dateFormat.length() > 0) { SimpleDateFormat sdf = new SimpleDateFormat(dateFormat); Date dt = null; try { dt = sdf.parse(value); } catch (ParseException e) { } value = sdf.format(dt); } } else if (type.equalsIgnoreCase("array")) { value = value.replace("\"", "").replace("\"", ""); String[] parts = value.split(","); StringBuilder sb = new StringBuilder(); sb.append("["); boolean hasValue = false; HashMap<String, String> repKeyword = new HashMap<String, String>(); for (String part : parts) { String partTrimUpper = part.trim().toUpperCase(); if (!part.startsWith("\"") && !part.endsWith("\"")) { if ((!dcatFieldName.equalsIgnoreCase("keyword")) || (!repKeyword.containsKey(partTrimUpper))) { repKeyword.put(partTrimUpper, partTrimUpper); if (hasValue) { sb.append(delimiter); } sb.append("\"").append(Val.escapeStrForJson(part.trim())).append("\""); hasValue = true; } } } sb.append("]"); value = sb.toString(); } if (type.equalsIgnoreCase("string")) { if (maxChars > -1 && value.length() > maxChars) { if (value.startsWith("\"") && value.endsWith("\"")) { value = "\"" + Val.escapeStrForJson(value.substring(1, maxChars)) + "\""; } } } } return value; }