<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" /><style type="text/css"><!--
#msg dl { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; }
#msg dl a { font-weight: bold}
#msg dl a:link { color:#fc3; }
#msg dl a:active { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre, #msg p { overflow: auto; background: #ffc; border: 1px #fc0 solid; padding: 6px; }
#msg ul { overflow: auto; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<title>[587] blacklight_importer/src:
Re-organization of how index specification properties files are created and used</title>
</head>
<body>
<div id="msg">
<dl>
<dt>Revision</dt> <dd>587</dd>
<dt>Author</dt> <dd>haschart</dd>
<dt>Date</dt> <dd>2008-06-06 13:41:36 -0400 (Fri, 06 Jun 2008)</dd>
</dl>
<h3>Log Message</h3>
<pre>Re-organization of how index specification properties files are created and used</pre>
<h3>Modified Paths</h3>
<ul>
<li><a href="#blacklight_importersrcIndexerCheckjava">blacklight_importer/src/IndexerCheck.java</a></li>
<li><a href="#blacklight_importersrcMarcImporterjava">blacklight_importer/src/MarcImporter.java</a></li>
<li><a href="#blacklight_importersrcMarcPrinterjava">blacklight_importer/src/MarcPrinter.java</a></li>
<li><a href="#blacklight_importersrcSolrIndexerjava">blacklight_importer/src/SolrIndexer.java</a></li>
<li><a href="#blacklight_importersrcZClientjava">blacklight_importer/src/ZClient.java</a></li>
</ul>
</div>
<div id="patch">
<h3>Diff</h3>
<a id="blacklight_importersrcIndexerCheckjava"></a>
<div class="modfile"><h4>Modified: blacklight_importer/src/IndexerCheck.java (586 => 587)</h4>
<pre class="diff"><span>
<span class="info">--- blacklight_importer/src/IndexerCheck.java        2008-06-06 17:41:16 UTC (rev 586)
+++ blacklight_importer/src/IndexerCheck.java        2008-06-06 17:41:36 UTC (rev 587)
</span><span class="lines">@@ -256,10 +256,10 @@
</span><span class="cx"> DocumentBuilder builder1 = new DocumentBuilder(solrCore.getSchema());
</span><span class="cx"> DocumentBuilder builder2 = new DocumentBuilder(solrCore.getSchema());
</span><span class="cx"> builder1.startDoc();
</span><del>- indexer.indexRecord(builder1, record1);
</del><ins>+// indexer.indexRecord(builder1, record1);
</ins><span class="cx"> builder1.endDoc();
</span><span class="cx"> builder2.startDoc();
</span><del>- indexer.indexRecord(builder2, record2);
</del><ins>+// indexer.indexRecord(builder2, record2);
</ins><span class="cx"> builder2.endDoc();
</span><span class="cx">
</span><span class="cx"> // finish up
</span></span></pre></div>
<a id="blacklight_importersrcMarcImporterjava"></a>
<div class="modfile"><h4>Modified: blacklight_importer/src/MarcImporter.java (586 => 587)</h4>
<pre class="diff"><span>
<span class="info">--- blacklight_importer/src/MarcImporter.java        2008-06-06 17:41:16 UTC (rev 586)
+++ blacklight_importer/src/MarcImporter.java        2008-06-06 17:41:36 UTC (rev 587)
</span><span class="lines">@@ -34,7 +34,10 @@
</span><span class="cx"> import java.net.URL;
</span><span class="cx"> import java.net.URLConnection;
</span><span class="cx"> import java.text.ParseException;
</span><ins>+import java.util.Collection;
</ins><span class="cx"> import java.util.Date;
</span><ins>+import java.util.Iterator;
+import java.util.Map;
</ins><span class="cx"> import java.util.Properties;
</span><span class="cx">
</span><span class="cx"> import marcoverride.MarcDirStreamReader;
</span><span class="lines">@@ -289,10 +292,31 @@
</span><span class="cx">
</span><span class="cx"> public void addToIndex(Record record)
</span><span class="cx"> {
</span><ins>+ Map<String, Object> map = indexer.map(record);
+ if (map.size() == 0) return;
+
</ins><span class="cx"> AddUpdateCommand addcmd = new AddUpdateCommand();
</span><span class="cx"> DocumentBuilder builder = new DocumentBuilder(solrCore.getSchema());
</span><span class="cx"> builder.startDoc();
</span><del>- indexer.indexRecord(builder, record);
</del><ins>+         Iterator<String> keys = map.keySet().iterator();
+ while (keys.hasNext())
+ {
+         String key = keys.next();
+         Object value = map.get(key);
+         if (value instanceof String)
+         {
+                 builder.addField(key, (String)value);
+         }
+         else if (value instanceof Collection)
+         {
+                 Iterator<String> valIter = ((Collection)value).iterator();
+                 while (valIter.hasNext())
+                 {
+                         String collVal = valIter.next();
+                 builder.addField(key, collVal);
+                 }
+         }
+ }
</ins><span class="cx"> builder.endDoc();
</span><span class="cx">
</span><span class="cx"> // finish up
</span><span class="lines">@@ -315,7 +339,7 @@
</span><span class="cx"> {
</span><span class="cx"> System.err.println("Couldn't add document");
</span><span class="cx"> e.printStackTrace();
</span><del>- }
</del><ins>+ }
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> public void finish()
</span></span></pre></div>
<a id="blacklight_importersrcMarcPrinterjava"></a>
<div class="modfile"><h4>Modified: blacklight_importer/src/MarcPrinter.java (586 => 587)</h4>
<pre class="diff"><span>
<span class="info">--- blacklight_importer/src/MarcPrinter.java        2008-06-06 17:41:16 UTC (rev 586)
+++ blacklight_importer/src/MarcPrinter.java        2008-06-06 17:41:36 UTC (rev 587)
</span><span class="lines">@@ -86,23 +86,23 @@
</span><span class="cx"> String fieldname = args.length > 2 ? args[2] : null;
</span><span class="cx"> String fieldVals[] = null;
</span><span class="cx"> Map<String, String> map = null;
</span><del>- if (fieldname != null)
- {
- Properties prop = new Properties();
- InputStream in = new FileInputStream("blacklight.properties");
- try
- {
- prop.load(in);
- }
- catch (IOException e)
- {
- e.printStackTrace();
- System.exit(1);
- }
- String fieldVal = prop.getProperty(fieldname);
- fieldVals = fieldVal.split(", ", 4);
- map = indexer.findMap(fieldVals[3]);
- }
</del><ins>+// if (fieldname != null)
+// {
+// Properties prop = new Properties();
+// InputStream in = new FileInputStream("blacklight.properties");
+// try
+// {
+// prop.load(in);
+// }
+// catch (IOException e)
+// {
+// e.printStackTrace();
+// System.exit(1);
+// }
+// String fieldVal = prop.getProperty(fieldname);
+// fieldVals = fieldVal.split(", ", 4);
+// map = indexer.findMap(fieldVals[3]);
+// }
</ins><span class="cx">
</span><span class="cx"> if (mode.equals("count"))
</span><span class="cx"> {
</span><span class="lines">@@ -148,7 +148,8 @@
</span><span class="cx"> Record rec = reader.next();
</span><span class="cx"> // Leader ldr = rec.getLeader();
</span><span class="cx"> // if (ldr.getBaseAddressOfData() != 0) continue;
</span><del>- if (verbose) System.out.println(rec.toString());
</del><ins>+ String recStr = rec.toString();
+ if (verbose) System.out.println(recStr);
</ins><span class="cx"> }
</span><span class="cx"> catch (MarcException me)
</span><span class="cx"> {
</span></span></pre></div>
<a id="blacklight_importersrcSolrIndexerjava"></a>
<div class="modfile"><h4>Modified: blacklight_importer/src/SolrIndexer.java (586 => 587)</h4>
<pre class="diff"><span>
<span class="info">--- blacklight_importer/src/SolrIndexer.java        2008-06-06 17:41:16 UTC (rev 586)
+++ blacklight_importer/src/SolrIndexer.java        2008-06-06 17:41:36 UTC (rev 587)
</span><span class="lines">@@ -64,48 +64,105 @@
</span><span class="cx"> while (en.hasMoreElements())
</span><span class="cx"> {
</span><span class="cx"> String property = (String)en.nextElement();
</span><del>- int dotLoc;
- if ((dotLoc = property.indexOf('.'))!= -1)
</del><ins>+ if (!property.startsWith("map") && !property.startsWith("pattern_map"))
</ins><span class="cx"> {
</span><del>- String mapName = property.substring(0,dotLoc);
- String mapKey = property.substring(dotLoc+1);
</del><ins>+ String index = property;
</ins><span class="cx"> String value = props.getProperty(property);
</span><del>- if (value.equals("null")) value = null;
-
- Map<String, String> subMap;
- if (mapMap.containsKey(mapName))
- {
- subMap = mapMap.get(mapName);
- }
- else
- {
- subMap = new LinkedHashMap<String, String>();
- mapMap.put(mapName, subMap);
- }
- subMap.put(mapKey, value);
- }
- else if (property.startsWith("field_list"))
- {
- String index = property.substring("field_list_".length());
- String value = props.getProperty(property);
- String values[] = value.split("[, ]+", 3);
- String values2[] = values[2].trim().split("[, ]+", 2);
</del><span class="cx"> String fieldDef[] = new String[4];
</span><del>- fieldDef[0] = values[0];
- fieldDef[1] = values[1];
- if (values[1].equals("constant"))
</del><ins>+ fieldDef[3] = null;
+ if (value.startsWith("\""))
</ins><span class="cx"> {
</span><del>- fieldDef[2] = values[2].trim();
- fieldDef[3] = null;
</del><ins>+ fieldDef[0] = property;
+ fieldDef[1] = "constant";
+ fieldDef[2] = value.trim().replaceAll("\"", "");
</ins><span class="cx"> }
</span><span class="cx"> else
</span><span class="cx"> {
</span><del>- fieldDef[2] = values2[0];
- fieldDef[3] = values2.length > 1 ? values2[1] : null;
</del><ins>+ String values[] = value.split("[, ]+", 2);
+ if (values[0].equals("custom"))
+ {
+ String values2[] = values[1].trim().split("[, ]+", 2);
+ fieldDef[0] = property;
+ fieldDef[1] = "custom";
+ fieldDef[2] = values2[0];
+ fieldDef[3] = values2.length > 1 ? values2[1] : null;
+ }
+ else if (values[0].equals("xml") || values[0].equals("raw") ||
+ values[0].equals("date") || values[0].equals("index_date") ||
+ values[0].equals("era"))
+ {
+ fieldDef[0] = property;
+ fieldDef[1] = "std";
+ fieldDef[2] = values[0];
+ fieldDef[3] = values.length > 1 ? values[1].trim() : null;
+ }
+ else if (values[0].equalsIgnoreCase("FullRecordAsXML") ||
+ values[0].equalsIgnoreCase("FullRecordAsMARC") ||
+ values[0].equalsIgnoreCase("DateOfPublication"))
+ {
+ fieldDef[0] = property;
+ fieldDef[1] = "std";
+ fieldDef[2] = values[0];
+ fieldDef[3] = values.length > 1 ? values[1].trim() : null;
+ }
+ else if (values.length == 1)
+ {
+ fieldDef[0] = property;
+ fieldDef[1] = "all";
+ fieldDef[2] = values[0];
+ fieldDef[3] = null;
+ }
+ else
+ {
+ String values2[] = values[1].trim().split("[, ]+", -2);
+ fieldDef[0] = property;
+ fieldDef[1] = "all";
+ if (values2[0].equals("first") || (values2.length > 1 && values2[1].equals("first")))
+ {
+ fieldDef[1] = "first";
+ }
+ if (values2[0].equals("join") || (values2.length > 1 && values2[1].equals("join")))
+ {
+ fieldDef[1] = "join";
+ }
+ if (values2[0].equalsIgnoreCase("DeleteRecordIfFieldEmpty")||
+ (values2.length > 1 && values2[1].equalsIgnoreCase("DeleteRecordIfFieldEmpty")))
+ {
+ fieldDef[1] = "DeleteRecordIfFieldEmpty";
+ }
+ fieldDef[2] = values[0];
+ fieldDef[3] = null;
+ if (!values2[0].equals("all") && !values2[0].equals("first") &&
+ !values2[0].equals("join") &&
+ !values2[0].equalsIgnoreCase("DeleteRecordIfFieldEmpty"))
+ {
+ // assume its a translation map definition
+ fieldDef[3] = values2[0].trim();
+ }
+ }
+ if (fieldDef[3] != null)
+ {
+ try {
+ fieldDef[3] = loadTranslationMap(props, fieldDef[3]);
+ }
+ catch (FileNotFoundException e)
+ {
+ System.err.println("Error: Unable to find file containing specified translation map ("+ fieldDef[3] + ")");
+ valid = false;
+ }
+ catch (IOException e)
+ {
+ System.err.println("Error: Problems reading specified translation map ("+ fieldDef[3] + ")");
+ valid = false;
+ }
+ }
</ins><span class="cx"> }
</span><span class="cx"> fieldMap.put(index, fieldDef);
</span><del>- values[1] = fieldDef[1];
</del><span class="cx"> }
</span><ins>+ else if (property.startsWith("map") || property.startsWith("pattern_map"))
+ {
+ // ignore entry, handled separately
+ }
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> // Now verify that the data read to configure the indexer is not invalid.
</span><span class="lines">@@ -161,9 +218,80 @@
</span><span class="cx"> }
</span><span class="cx"> return(valid);
</span><span class="cx"> }
</span><ins>+
+
+ private String loadTranslationMap(Properties props, String translationMapSpec) throws FileNotFoundException, IOException
+ {
+ String mapName = null;
+ if (translationMapSpec.length() == 0)
+ {
+ return(null);
+ }
+ else if (translationMapSpec.startsWith("(") && translationMapSpec.endsWith(")"))
+ {
+ // map entries are in current properties file.
+ String mapKeyPrefix = translationMapSpec.replaceAll("[\\(\\)]", "");
+ mapName = mapKeyPrefix;
+ loadTranslationMapValues(props, mapKeyPrefix, mapName);
+ }
+ else if (translationMapSpec.contains("(") && translationMapSpec.endsWith(")"))
+ {
+ String mapSpec[] = translationMapSpec.split("(//s|[()])+");
+ String propFilename = mapSpec[0];
+ String mapKeyPrefix = mapSpec[1];
+ mapName = mapSpec[1];
+ loadTranslationMapValues(propFilename, mapKeyPrefix, mapName);
+ }
+ else
+ {
+ String propFilename = translationMapSpec;
+ String mapKeyPrefix = "";
+ mapName = translationMapSpec.replaceAll(".properties", "");
+ loadTranslationMapValues(propFilename, mapKeyPrefix, mapName);
+ }
+ return(mapName);
+ }
</ins><span class="cx">
</span><del>- public void indexRecord(DocumentBuilder builder, Record record)
</del><ins>+ private void loadTranslationMapValues(String propFilename, String mapKeyPrefix, String mapName) throws FileNotFoundException, IOException
</ins><span class="cx"> {
</span><ins>+ Properties props = new Properties();
+ props.load(new FileInputStream(propFilename));
+ loadTranslationMapValues(props, mapKeyPrefix, mapName);
+ }
+
+ private void loadTranslationMapValues(Properties props, String mapKeyPrefix, String mapName)
+ {
+ boolean valid = true;
+ Enumeration en = props.propertyNames();
+ while (en.hasMoreElements())
+ {
+ String property = (String)en.nextElement();
+ if (mapKeyPrefix.length() == 0 || property.startsWith(mapKeyPrefix))
+ {
+ String mapKey = property.substring(mapKeyPrefix.length());
+ if (mapKey.startsWith(".")) mapKey = mapKey.substring(1);
+ String value = props.getProperty(property);
+ if (value.equals("null")) value = null;
+
+ Map<String, String> subMap;
+ if (mapMap.containsKey(mapName))
+ {
+ subMap = mapMap.get(mapName);
+ }
+ else
+ {
+ subMap = new LinkedHashMap<String, String>();
+ mapMap.put(mapName, subMap);
+ }
+ subMap.put(mapKey, value);
+
+ }
+ }
+ }
+
+ public Map<String, Object> map(Record record)
+ {
+ Map<String, Object> indexMap = new HashMap<String, Object>();
</ins><span class="cx"> int size = fieldMap.size();
</span><span class="cx"> Iterator<String> keys = fieldMap.keySet().iterator();
</span><span class="cx"> while (keys.hasNext())
</span><span class="lines">@@ -176,39 +304,57 @@
</span><span class="cx"> String mapName = fieldVal[3];
</span><span class="cx"> if (indexType.equals("constant"))
</span><span class="cx"> {
</span><del>- addField(builder, indexField, indexParm);
</del><ins>+ addField(indexMap, indexField, indexParm);
</ins><span class="cx"> }
</span><span class="cx"> else if (indexType.equals("first"))
</span><span class="cx"> {
</span><del>- addField(builder, indexField, getFirstFieldVal(record, mapName, indexParm));
</del><ins>+ addField(indexMap, indexField, getFirstFieldVal(record, mapName, indexParm));
</ins><span class="cx"> }
</span><span class="cx"> else if (indexType.equals("all"))
</span><span class="cx"> {
</span><del>- addFields(builder, indexField, mapName, getFieldList(record, indexParm));
</del><ins>+ addFields(indexMap, indexField, mapName, getFieldList(record, indexParm));
</ins><span class="cx"> }
</span><ins>+ else if (indexType.equals("DeleteRecordIfFieldEmpty"))
+ {
+ Set<String> fields = getFieldList(record, indexParm);
+ if (mapName != null && findMap(mapName) != null)
+ {
+ fields = Utils.remap(fields, findMap(mapName), false);
+ }
+ if (fields.size() != 0)
+ {
+ addFields(indexMap, indexField, null, fields);
+ }
+ else // no entries produced for field => generate no record in Solr
+ {
+         indexMap = new HashMap<String, Object>();
+         return(indexMap);
+ }
+ }
</ins><span class="cx"> else if (indexType.equals("join"))
</span><span class="cx"> {
</span><del>- addField(builder, indexField, getFieldVals(record, indexParm, " "));
</del><ins>+ addField(indexMap, indexField, getFieldVals(record, indexParm, " "));
</ins><span class="cx"> }
</span><span class="cx"> else if (indexType.equals("std"))
</span><span class="cx"> {
</span><span class="cx"> if (indexParm.equals("era"))
</span><span class="cx"> {
</span><del>- addFields(builder, indexField, mapName, getEra(record));
</del><ins>+ addFields(indexMap, indexField, mapName, getEra(record));
</ins><span class="cx"> }
</span><span class="cx"> else
</span><span class="cx"> {
</span><del>- addField(builder, indexField, getStd(record, indexParm));
</del><ins>+ addField(indexMap, indexField, getStd(record, indexParm));
</ins><span class="cx"> }
</span><span class="cx"> }
</span><span class="cx"> else if (indexType.equals("custom"))
</span><span class="cx"> {
</span><del>- handleCustom(builder, indexField, mapName, record, indexParm);
</del><ins>+ handleCustom(indexMap, indexField, mapName, record, indexParm);
</ins><span class="cx"> }
</span><span class="cx"> }
</span><ins>+ return(indexMap);
</ins><span class="cx"> }
</span><span class="cx">
</span><del>- private void handleCustom(DocumentBuilder builder, String indexField, String mapName, Record record, String indexParm)
</del><ins>+ private void handleCustom(Map<String, Object> indexMap, String indexField, String mapName, Record record, String indexParm)
</ins><span class="cx"> {
</span><span class="cx"> try
</span><span class="cx"> {
</span><span class="lines">@@ -216,11 +362,11 @@
</span><span class="cx"> Object retval = method.invoke(this, new Object[]{record});
</span><span class="cx"> if (retval instanceof Set)
</span><span class="cx"> {
</span><del>- addFields(builder, indexField, mapName, (Set<String>)retval);
</del><ins>+ addFields(indexMap, indexField, mapName, (Set<String>)retval);
</ins><span class="cx"> }
</span><span class="cx"> else if (retval instanceof String)
</span><span class="cx"> {
</span><del>- addField(builder, indexField, mapName, (String)retval);
</del><ins>+ addField(indexMap, indexField, mapName, (String)retval);
</ins><span class="cx"> }
</span><span class="cx"> }
</span><span class="cx"> catch (SecurityException e)
</span><span class="lines">@@ -252,15 +398,15 @@
</span><span class="cx">
</span><span class="cx"> private String getStd(Record record, String indexParm)
</span><span class="cx"> {
</span><del>- if (indexParm.equals("raw"))
</del><ins>+ if (indexParm.equals("raw") || indexParm.equalsIgnoreCase("FullRecordAsMARC"))
</ins><span class="cx"> {
</span><span class="cx"> return(writeRaw(record));
</span><span class="cx"> }
</span><del>- else if (indexParm.equals("xml"))
</del><ins>+ else if (indexParm.equals("xml") || indexParm.equalsIgnoreCase("FullRecordAsXML"))
</ins><span class="cx"> {
</span><span class="cx"> return(writeXml(record));
</span><span class="cx"> }
</span><del>- else if (indexParm.equals("date"))
</del><ins>+ else if (indexParm.equals("date") || indexParm.equalsIgnoreCase("DeleteRecordIfFieldEmpty"))
</ins><span class="cx"> {
</span><span class="cx"> return(getDate(record));
</span><span class="cx"> }
</span><span class="lines">@@ -268,10 +414,6 @@
</span><span class="cx"> {
</span><span class="cx"> return(getCurrentDate());
</span><span class="cx"> }
</span><del>- else if (indexParm.equals("title"))
- {
- return(getTitle(record));
- }
</del><span class="cx"> return null;
</span><span class="cx"> }
</span><span class="cx">
</span><span class="lines">@@ -342,7 +484,7 @@
</span><span class="cx"> return(result);
</span><span class="cx"> }
</span><span class="cx">
</span><del>- protected void addField(DocumentBuilder builder, String indexField, String mapName, String fieldVal)
</del><ins>+ protected void addField(Map<String, Object> indexMap, String indexField, String mapName, String fieldVal)
</ins><span class="cx"> {
</span><span class="cx"> if (mapName != null && findMap(mapName) != null)
</span><span class="cx"> {
</span><span class="lines">@@ -350,28 +492,40 @@
</span><span class="cx"> }
</span><span class="cx"> if (fieldVal != null && fieldVal.length() > 0 )
</span><span class="cx"> {
</span><del>- builder.addField(indexField, fieldVal);
</del><ins>+ indexMap.put(indexField, fieldVal);
</ins><span class="cx"> }
</span><span class="cx"> }
</span><span class="cx">
</span><del>- protected void addField(DocumentBuilder builder, String indexField, String fieldVal)
</del><ins>+ protected void addField(Map<String, Object> indexMap, String indexField, String fieldVal)
</ins><span class="cx"> {
</span><del>- addField(builder, indexField, null, fieldVal);
</del><ins>+ addField(indexMap, indexField, null, fieldVal);
</ins><span class="cx"> }
</span><span class="cx">
</span><del>- protected void addFields(DocumentBuilder builder, String indexField, String mapName, Set<String> fields)
</del><ins>+ protected void addFields(Map<String, Object> indexMap, String indexField, String mapName, Set<String> fields)
</ins><span class="cx"> {
</span><span class="cx"> if (mapName != null && findMap(mapName) != null)
</span><span class="cx"> {
</span><span class="cx"> fields = Utils.remap(fields, findMap(mapName), false);
</span><span class="cx"> }
</span><del>- Iterator<String> iter = fields.iterator();
-
- while(iter.hasNext())
</del><ins>+ if (!fields.isEmpty())
</ins><span class="cx"> {
</span><del>- String fieldVal = iter.next();
- addField(builder, indexField, null, fieldVal);
</del><ins>+ if (fields.size() == 1)
+ {
+         String value = fields.iterator().next();
+ indexMap.put(indexField, value);         
+ }
+ else
+ {
+ indexMap.put(indexField, fields);
+ }
</ins><span class="cx"> }
</span><ins>+// Iterator<String> iter = fields.iterator();
+//
+// while(iter.hasNext())
+// {
+// String fieldVal = iter.next();
+// addField(builder, indexField, null, fieldVal);
+// }
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> public static Set<String> getFieldList(Record record, String tagStr)
</span></span></pre></div>
<a id="blacklight_importersrcZClientjava"></a>
<div class="modfile"><h4>Modified: blacklight_importer/src/ZClient.java (586 => 587)</h4>
<pre class="diff"><span>
<span class="info">--- blacklight_importer/src/ZClient.java        2008-06-06 17:41:16 UTC (rev 586)
+++ blacklight_importer/src/ZClient.java        2008-06-06 17:41:36 UTC (rev 587)
</span><span class="lines">@@ -23,6 +23,7 @@
</span><span class="cx"> //import com.k_int.gen.Z39_50_APDU_1995.*;
</span><span class="cx"> //import org.jzkit.a2j.gen.AsnUseful.*;
</span><span class="cx">
</span><ins>+import java.io.ByteArrayInputStream;
</ins><span class="cx"> import java.util.Enumeration;
</span><span class="cx"> import java.util.Vector;
</span><span class="cx">
</span><span class="lines">@@ -38,6 +39,7 @@
</span><span class="cx"> //for OID Register
</span><span class="cx"> import org.jzkit.a2j.codec.util.OIDRegister;
</span><span class="cx"> import org.jzkit.a2j.gen.AsnUseful.EXTERNAL_type;
</span><ins>+import org.marc4j.MarcStreamReader;
</ins><span class="cx"> import org.marc4j.marc.Record;
</span><span class="cx"> import org.marc4j.marc.impl.ControlFieldImpl;
</span><span class="cx">
</span><span class="lines">@@ -105,9 +107,11 @@
</span><span class="cx"> boolean respVal = false;
</span><span class="cx"> try
</span><span class="cx"> {
</span><ins>+ System.err.println("Attempting connection to "+ hostname + " : " + portnum);
</ins><span class="cx"> InitializeResponse_type resp = connect(hostname, portnum,
</span><span class="cx"> auth_type, principal, group, credentials);
</span><span class="cx">
</span><ins>+ System.err.println("Received response from connect");
</ins><span class="cx"> respVal = resp.result.booleanValue();
</span><span class="cx"> if (respVal != true)
</span><span class="cx"> {
</span><span class="lines">@@ -127,6 +131,7 @@
</span><span class="cx"> int numResults = 0;
</span><span class="cx"> current_result_set_name = "RS" + (result_set_count++);
</span><span class="cx">
</span><ins>+ System.out.println("Calling find, query= " + args);
</ins><span class="cx"> try
</span><span class="cx"> {
</span><span class="cx"> if (querytype.equalsIgnoreCase("CCL"))
</span><span class="lines">@@ -167,6 +172,7 @@
</span><span class="cx"> if (resp != null)
</span><span class="cx"> {
</span><span class="cx"> numResults = resp.resultCount.intValue();
</span><ins>+ System.out.println("NumResults = " + numResults);
</ins><span class="cx">
</span><span class="cx"> if ((resp.records != null)
</span><span class="cx"> && (resp.numberOfRecordsReturned.intValue() > 0))
</span><span class="lines">@@ -181,9 +187,12 @@
</span><span class="cx"> public Record getRecordByIDNum(int idnum)
</span><span class="cx"> {
</span><span class="cx"> cmdFind("@attrset bib-1 @attr 1=1016 \"^C"+idnum+"\"");
</span><ins>+ System.out.println("requesting record by ID:" + idnum);
</ins><span class="cx"> Record rec = getRecord(1);
</span><ins>+ System.out.println("getting record by ID:" + idnum);
</ins><span class="cx"> if (rec != null)
</span><span class="cx"> {
</span><ins>+ System.out.println("adding ID to record:" + idnum);
</ins><span class="cx"> rec.addVariableField(new ControlFieldImpl("001", ""+idnum));
</span><span class="cx"> }
</span><span class="cx"> return(rec);
</span><span class="lines">@@ -258,10 +267,47 @@
</span><span class="cx"> }
</span><span class="cx"> return(null);
</span><span class="cx"> }
</span><ins>+
+ public String getStringByIDNum(int idnum)
+ {
+ System.out.println("Calling getStringByIDNum id="+ idnum);
+         cmdFind("@attrset bib-1 @attr 1=1016 \"^C"+idnum+"\"");
+ System.out.println("Calling getString id="+ idnum);
+ byte[] rec = getBytes(1);
+ System.out.println("bytes count="+ rec.length);
+ ByteArrayInputStream bs = new ByteArrayInputStream(rec);
+ System.out.println("made ByteArrayInputStream");
+ MarcStreamReader m1 = new MarcStreamReader(bs);
+ System.out.println("made MarcStreamReader");
+ MarcTranslatedReader mr = new MarcTranslatedReader(m1);
+ System.out.println("made MarcTranslatedReader");
+ String result = null;
+ System.out.println("checking for next");
+ if (mr.hasNext())
+ {
+ System.out.println("Getting next");
+         try {
+                 Record marc = mr.next();
+ System.out.println("got Record: "+ marc.toString());
+ result = marc.toString();
+ System.out.println("String len="+ result.length());
+         }
+         catch (Throwable e)
+         {
+                 System.out.println("Exception: "+ e.getMessage());
+                 e.printStackTrace();
+         }
+ }
+ return(result);
+ }
+
</ins><span class="cx"> public byte[] getBytesByIDNum(int idnum)
</span><span class="cx"> {
</span><del>- cmdFind("@attrset bib-1 @attr 1=1016 \"^C"+idnum+"\"");
</del><ins>+ System.out.println("Calling getBytesByIDNum id="+ idnum);
+         cmdFind("@attrset bib-1 @attr 1=1016 \"^C"+idnum+"\"");
+ System.out.println("Calling getBytes id="+ idnum);
</ins><span class="cx"> byte[] rec = getBytes(1);
</span><ins>+ System.out.println("bytes count="+ rec.length);
</ins><span class="cx"> return(rec);
</span><span class="cx"> }
</span><span class="cx">
</span></span></pre>
</div>
</div>
</body>
</html>