<!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&lt;String, Object&gt; 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&lt;String&gt; 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&lt;String&gt; 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(&quot;Couldn't add document&quot;);
</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 &gt; 2 ? args[2] : null;
</span><span class="cx">         String fieldVals[] = null;
</span><span class="cx">         Map&lt;String, String&gt; map = null;
</span><del>-        if (fieldname != null)
-        {
-            Properties prop = new Properties();
-            InputStream in = new FileInputStream(&quot;blacklight.properties&quot;);
-            try
-            {
-                prop.load(in);
-            }
-            catch (IOException e)
-            {
-                e.printStackTrace();
-                System.exit(1);
-            }
-            String fieldVal = prop.getProperty(fieldname);
-            fieldVals = fieldVal.split(&quot;, &quot;, 4);
-            map = indexer.findMap(fieldVals[3]);
-        }
</del><ins>+//        if (fieldname != null)
+//        {
+//            Properties prop = new Properties();
+//            InputStream in = new FileInputStream(&quot;blacklight.properties&quot;);
+//            try
+//            {
+//                prop.load(in);
+//            }
+//            catch (IOException e)
+//            {
+//                e.printStackTrace();
+//                System.exit(1);
+//            }
+//            String fieldVal = prop.getProperty(fieldname);
+//            fieldVals = fieldVal.split(&quot;, &quot;, 4);
+//            map = indexer.findMap(fieldVals[3]);
+//        }
</ins><span class="cx"> 
</span><span class="cx">         if (mode.equals(&quot;count&quot;))
</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(&quot;map&quot;) &amp;&amp; !property.startsWith(&quot;pattern_map&quot;))
</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(&quot;null&quot;))  value = null;
-                
-                Map&lt;String, String&gt; subMap;
-                if (mapMap.containsKey(mapName))
-                {
-                    subMap = mapMap.get(mapName);
-                }
-                else
-                {
-                    subMap = new LinkedHashMap&lt;String, String&gt;();
-                    mapMap.put(mapName, subMap);
-                }
-                subMap.put(mapKey, value);
-            }
-            else if (property.startsWith(&quot;field_list&quot;))
-            {
-                String index = property.substring(&quot;field_list_&quot;.length());
-                String value = props.getProperty(property);
-                String values[] = value.split(&quot;[, ]+&quot;, 3);
-                String values2[] = values[2].trim().split(&quot;[, ]+&quot;, 2);
</del><span class="cx">                 String fieldDef[] = new String[4];
</span><del>-                fieldDef[0] = values[0];
-                fieldDef[1] = values[1];
-                if (values[1].equals(&quot;constant&quot;))
</del><ins>+                fieldDef[3] = null;
+                if (value.startsWith(&quot;\&quot;&quot;))
</ins><span class="cx">                 {
</span><del>-                    fieldDef[2] = values[2].trim();
-                    fieldDef[3] = null;
</del><ins>+                    fieldDef[0] = property;
+                    fieldDef[1] = &quot;constant&quot;;
+                    fieldDef[2] = value.trim().replaceAll(&quot;\&quot;&quot;, &quot;&quot;);
</ins><span class="cx">                 }
</span><span class="cx">                 else
</span><span class="cx">                 {
</span><del>-                    fieldDef[2] = values2[0];
-                    fieldDef[3] = values2.length &gt; 1 ? values2[1] : null;
</del><ins>+                    String values[] = value.split(&quot;[, ]+&quot;, 2);
+                    if (values[0].equals(&quot;custom&quot;))
+                    {
+                        String values2[] = values[1].trim().split(&quot;[, ]+&quot;, 2);
+                        fieldDef[0] = property;
+                        fieldDef[1] = &quot;custom&quot;;
+                        fieldDef[2] = values2[0];
+                        fieldDef[3] = values2.length &gt; 1 ? values2[1] : null;
+                    }
+                    else if (values[0].equals(&quot;xml&quot;) || values[0].equals(&quot;raw&quot;) || 
+                               values[0].equals(&quot;date&quot;) || values[0].equals(&quot;index_date&quot;) ||
+                               values[0].equals(&quot;era&quot;))
+                       {
+                           fieldDef[0] = property;
+                           fieldDef[1] = &quot;std&quot;;
+                           fieldDef[2] = values[0];
+                           fieldDef[3] = values.length &gt; 1 ? values[1].trim() : null;
+                       }
+                    else if (values[0].equalsIgnoreCase(&quot;FullRecordAsXML&quot;) || 
+                             values[0].equalsIgnoreCase(&quot;FullRecordAsMARC&quot;) || 
+                               values[0].equalsIgnoreCase(&quot;DateOfPublication&quot;))
+                       {
+                           fieldDef[0] = property;
+                           fieldDef[1] = &quot;std&quot;;
+                           fieldDef[2] = values[0];
+                           fieldDef[3] = values.length &gt; 1 ? values[1].trim() : null;
+                       }
+                    else if (values.length == 1)
+                    {
+                        fieldDef[0] = property;
+                        fieldDef[1] = &quot;all&quot;;                       
+                        fieldDef[2] = values[0];
+                        fieldDef[3] = null;
+                    }
+                    else
+                    {
+                        String values2[] = values[1].trim().split(&quot;[, ]+&quot;, -2);
+                        fieldDef[0] = property;
+                        fieldDef[1] = &quot;all&quot;;
+                        if (values2[0].equals(&quot;first&quot;) || (values2.length &gt; 1 &amp;&amp; values2[1].equals(&quot;first&quot;)))
+                        {
+                            fieldDef[1] = &quot;first&quot;;
+                        }
+                        if (values2[0].equals(&quot;join&quot;) ||  (values2.length &gt; 1 &amp;&amp; values2[1].equals(&quot;join&quot;)))
+                        {
+                            fieldDef[1] = &quot;join&quot;;
+                        }
+                        if (values2[0].equalsIgnoreCase(&quot;DeleteRecordIfFieldEmpty&quot;)||
+                            (values2.length &gt; 1 &amp;&amp; values2[1].equalsIgnoreCase(&quot;DeleteRecordIfFieldEmpty&quot;)))
+                        {
+                            fieldDef[1] = &quot;DeleteRecordIfFieldEmpty&quot;;
+                        }
+                        fieldDef[2] = values[0];
+                        fieldDef[3] = null;
+                           if (!values2[0].equals(&quot;all&quot;) &amp;&amp; !values2[0].equals(&quot;first&quot;) &amp;&amp;
+                               !values2[0].equals(&quot;join&quot;) &amp;&amp; 
+                               !values2[0].equalsIgnoreCase(&quot;DeleteRecordIfFieldEmpty&quot;))
+                           {
+                               // 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(&quot;Error: Unable to find file containing specified translation map (&quot;+ fieldDef[3] + &quot;)&quot;);
+                            valid = false;
+                           }
+                           catch (IOException e)
+                           {
+                            System.err.println(&quot;Error: Problems reading specified translation map (&quot;+ fieldDef[3] + &quot;)&quot;);
+                            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(&quot;map&quot;) || property.startsWith(&quot;pattern_map&quot;))
+            {
+                // 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(&quot;(&quot;) &amp;&amp; translationMapSpec.endsWith(&quot;)&quot;))
+        {
+            // map entries are in current properties file.
+            String mapKeyPrefix = translationMapSpec.replaceAll(&quot;[\\(\\)]&quot;, &quot;&quot;);
+            mapName = mapKeyPrefix;
+            loadTranslationMapValues(props, mapKeyPrefix, mapName);
+        }
+        else if (translationMapSpec.contains(&quot;(&quot;) &amp;&amp; translationMapSpec.endsWith(&quot;)&quot;))
+        {
+            String mapSpec[] = translationMapSpec.split(&quot;(//s|[()])+&quot;);
+            String propFilename = mapSpec[0];
+            String mapKeyPrefix = mapSpec[1];
+            mapName = mapSpec[1];
+            loadTranslationMapValues(propFilename, mapKeyPrefix, mapName);
+        }
+        else 
+        {
+            String propFilename = translationMapSpec;
+            String mapKeyPrefix = &quot;&quot;;
+            mapName = translationMapSpec.replaceAll(&quot;.properties&quot;, &quot;&quot;);
+            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(&quot;.&quot;)) mapKey = mapKey.substring(1);
+                String value = props.getProperty(property);
+                if (value.equals(&quot;null&quot;))  value = null;
+                
+                Map&lt;String, String&gt; subMap;
+                if (mapMap.containsKey(mapName))
+                {
+                    subMap = mapMap.get(mapName);
+                }
+                else
+                {
+                    subMap = new LinkedHashMap&lt;String, String&gt;();
+                    mapMap.put(mapName, subMap);
+                }
+                subMap.put(mapKey, value);
+                
+            }
+        }
+    }
+
+    public Map&lt;String, Object&gt; map(Record record)
+    {
+        Map&lt;String, Object&gt; indexMap = new HashMap&lt;String, Object&gt;();
</ins><span class="cx">         int size = fieldMap.size();
</span><span class="cx">         Iterator&lt;String&gt; 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(&quot;constant&quot;))
</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(&quot;first&quot;))
</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(&quot;all&quot;))
</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(&quot;DeleteRecordIfFieldEmpty&quot;))
+            {
+                Set&lt;String&gt; fields = getFieldList(record, indexParm);
+                if (mapName != null &amp;&amp; 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 =&gt; generate no record in Solr
+                {
+                        indexMap = new HashMap&lt;String, Object&gt;();
+                        return(indexMap);
+                }
+            }
</ins><span class="cx">             else if (indexType.equals(&quot;join&quot;))
</span><span class="cx">             {
</span><del>-                addField(builder, indexField, getFieldVals(record, indexParm, &quot; &quot;));
</del><ins>+                addField(indexMap, indexField, getFieldVals(record, indexParm, &quot; &quot;));
</ins><span class="cx">             }
</span><span class="cx">             else if (indexType.equals(&quot;std&quot;))
</span><span class="cx">             {
</span><span class="cx">                 if (indexParm.equals(&quot;era&quot;))
</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(&quot;custom&quot;))
</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&lt;String, Object&gt; 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&lt;String&gt;)retval);
</del><ins>+                addFields(indexMap, indexField, mapName, (Set&lt;String&gt;)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(&quot;raw&quot;))  
</del><ins>+        if (indexParm.equals(&quot;raw&quot;) || indexParm.equalsIgnoreCase(&quot;FullRecordAsMARC&quot;))  
</ins><span class="cx">         {
</span><span class="cx">             return(writeRaw(record));
</span><span class="cx">         }    
</span><del>-        else if (indexParm.equals(&quot;xml&quot;))  
</del><ins>+        else if (indexParm.equals(&quot;xml&quot;) || indexParm.equalsIgnoreCase(&quot;FullRecordAsXML&quot;))  
</ins><span class="cx">         {
</span><span class="cx">             return(writeXml(record));
</span><span class="cx">         }    
</span><del>-        else if (indexParm.equals(&quot;date&quot;))  
</del><ins>+        else if (indexParm.equals(&quot;date&quot;) || indexParm.equalsIgnoreCase(&quot;DeleteRecordIfFieldEmpty&quot;))  
</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(&quot;title&quot;))  
-        {
-            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&lt;String, Object&gt; indexMap, String indexField, String mapName, String fieldVal)
</ins><span class="cx">     {
</span><span class="cx">         if (mapName != null &amp;&amp; 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 &amp;&amp; fieldVal.length() &gt; 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&lt;String, Object&gt; 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&lt;String&gt; fields)
</del><ins>+    protected void addFields(Map&lt;String, Object&gt; indexMap, String indexField, String mapName, Set&lt;String&gt; fields)
</ins><span class="cx">     {
</span><span class="cx">         if (mapName != null &amp;&amp; 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&lt;String&gt; 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&lt;String&gt; 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&lt;String&gt; 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(&quot;Attempting connection to &quot;+ hostname + &quot; : &quot; + 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(&quot;Received response from connect&quot;);
</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 = &quot;RS&quot; + (result_set_count++);
</span><span class="cx"> 
</span><ins>+        System.out.println(&quot;Calling find, query= &quot; + args);
</ins><span class="cx">         try
</span><span class="cx">         {
</span><span class="cx">             if (querytype.equalsIgnoreCase(&quot;CCL&quot;))
</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(&quot;NumResults = &quot; + numResults);
</ins><span class="cx"> 
</span><span class="cx">             if ((resp.records != null)
</span><span class="cx">                     &amp;&amp; (resp.numberOfRecordsReturned.intValue() &gt; 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(&quot;@attrset bib-1 @attr 1=1016 \&quot;^C&quot;+idnum+&quot;\&quot;&quot;);
</span><ins>+        System.out.println(&quot;requesting record by ID:&quot; + idnum);
</ins><span class="cx">         Record rec = getRecord(1);
</span><ins>+        System.out.println(&quot;getting record by ID:&quot; + idnum);
</ins><span class="cx">         if (rec != null)
</span><span class="cx">         {
</span><ins>+            System.out.println(&quot;adding ID to record:&quot; + idnum);
</ins><span class="cx">             rec.addVariableField(new ControlFieldImpl(&quot;001&quot;, &quot;&quot;+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(&quot;Calling getStringByIDNum id=&quot;+ idnum);
+            cmdFind(&quot;@attrset bib-1 @attr 1=1016 \&quot;^C&quot;+idnum+&quot;\&quot;&quot;);
+        System.out.println(&quot;Calling getString id=&quot;+ idnum);
+        byte[] rec = getBytes(1);
+        System.out.println(&quot;bytes count=&quot;+ rec.length);
+        ByteArrayInputStream bs = new ByteArrayInputStream(rec);
+        System.out.println(&quot;made ByteArrayInputStream&quot;);
+        MarcStreamReader m1 = new MarcStreamReader(bs);
+        System.out.println(&quot;made MarcStreamReader&quot;);
+        MarcTranslatedReader mr = new MarcTranslatedReader(m1);
+        System.out.println(&quot;made MarcTranslatedReader&quot;);
+        String result = null;
+        System.out.println(&quot;checking for next&quot;);
+        if (mr.hasNext())
+        {
+            System.out.println(&quot;Getting next&quot;);
+                try {
+                        Record marc = mr.next();
+                System.out.println(&quot;got Record: &quot;+ marc.toString());
+                result = marc.toString();
+                System.out.println(&quot;String len=&quot;+ result.length());
+                }
+                catch (Throwable e)
+                {
+                        System.out.println(&quot;Exception: &quot;+ e.getMessage());
+                        e.printStackTrace();
+                }
+        }
+        return(result);
+    }
+    
</ins><span class="cx">     public byte[] getBytesByIDNum(int idnum)
</span><span class="cx">     {
</span><del>-        cmdFind(&quot;@attrset bib-1 @attr 1=1016 \&quot;^C&quot;+idnum+&quot;\&quot;&quot;);
</del><ins>+        System.out.println(&quot;Calling getBytesByIDNum id=&quot;+ idnum);
+            cmdFind(&quot;@attrset bib-1 @attr 1=1016 \&quot;^C&quot;+idnum+&quot;\&quot;&quot;);
+        System.out.println(&quot;Calling getBytes id=&quot;+ idnum);
</ins><span class="cx">         byte[] rec = getBytes(1);
</span><ins>+        System.out.println(&quot;bytes count=&quot;+ rec.length);
</ins><span class="cx">         return(rec);
</span><span class="cx">     }
</span><span class="cx">     
</span></span></pre>
</div>
</div>

</body>
</html>