1 32 33 package websphinx; 34 35 import java.io.*; 36 import java.net.URL ; 37 import rcm.util.Str; 38 39 public class RecordTransformer extends RewritableLinkTransformer { 40 41 String prolog = "<HTML><HEAD><TITLE>Extracted Records</TITLE></HEAD><BODY><TABLE>\n"; 42 String epilog = "</TABLE></BODY></HTML>\n"; 43 44 String recordStart = "<TR>\n<TD><A HREF=\"%u\">%n.</A>\n"; 45 String recordEnd = "\n"; 46 String recordDivider = ""; 47 48 String fieldStart = " <TD>"; 49 String fieldEnd = "\n"; 50 String fieldDivider = ""; 51 52 int nRecords = 0; 53 54 public RecordTransformer (String filename) throws IOException { 55 super (filename); 56 } 57 58 public synchronized void setProlog (String prolog) { 59 this.prolog = prolog; 60 } 61 public synchronized String getProlog () { 62 return prolog; 63 } 64 65 public synchronized void setEpilog (String epilog) { 66 this.epilog = epilog; 67 } 68 public synchronized String getEpilog () { 69 return epilog; 70 } 71 72 public synchronized void setRecordStart (String recordStart) { 73 this.recordStart = recordStart; 74 } 75 public synchronized String getRecordStart () { 76 return recordStart; 77 } 78 79 public synchronized void setRecordEnd (String recordEnd) { 80 this.recordEnd = recordEnd; 81 } 82 public synchronized String getRecordEnd () { 83 return recordEnd; 84 } 85 86 public synchronized void setRecordDivider (String recordDivider) { 87 this.recordDivider = recordDivider; 88 } 89 public synchronized String getRecordDivider () { 90 return recordDivider; 91 } 92 93 public synchronized void setFieldStart (String fieldStart) { 94 this.fieldStart = fieldStart; 95 } 96 public synchronized String getFieldStart () { 97 return fieldStart; 98 } 99 100 public synchronized void setFieldEnd (String fieldEnd) { 101 this.fieldEnd = fieldEnd; 102 } 103 public synchronized String getFieldEnd () { 104 return fieldEnd; 105 } 106 107 public synchronized void setFieldDivider (String fieldDivider) { 108 this.fieldDivider = fieldDivider; 109 } 110 public synchronized String getFieldDivider () { 111 return fieldDivider; 112 } 113 114 117 public synchronized void flush () throws IOException { 118 long p = getFilePointer (); 119 if (nRecords == 0) 120 emit (prolog); 121 emit (epilog); 122 seek (p); 123 super.flush (); 124 } 125 126 127 public synchronized int getRecordCount () { 128 return nRecords; 129 } 130 131 public synchronized void writeRecord (Object [] fields, boolean asText) throws IOException { 132 ++nRecords; 133 134 emit ((nRecords == 1) ? prolog : recordDivider); 135 136 URL url = urlOfFirstRegion (fields); 137 138 emitTemplate (recordStart, url, nRecords); 139 for (int i=0; i<fields.length; ++i) { 140 if (i > 0) 141 emit (fieldDivider); 142 emit (fieldStart); 143 144 Object f = fields[i]; 145 if (f instanceof Region) { 146 Region r = (Region)fields[i]; 147 if (asText) 148 write (r.toText()); 149 else 150 write (r); 151 } 152 else 153 write (f.toString ()); 154 155 emit (fieldEnd); 156 } 157 emitTemplate (recordEnd, url, nRecords); 158 } 159 160 private URL urlOfFirstRegion (Object [] fields) { 161 for (int i=0; i<fields.length; ++i) 162 if (fields[i] instanceof Region) { 163 Region r = (Region)fields[i]; 164 return r.getSource().getURL(); 165 } 166 return null; 167 } 168 169 private void emitTemplate (String template, URL url, int record) throws IOException { 170 if (template == null || template.length() == 0) 171 return; 172 173 template = Str.replace (template, "%n", String.valueOf (record)); 174 template = Str.replace (template, "%u", url != null ? url.toString () : ""); 175 emit (template); 176 } 177 178 193 194 } 195 | Popular Tags |