Lines 49-54
Link Here
|
49 |
import java.sql.Clob; |
49 |
import java.sql.Clob; |
50 |
import java.sql.SQLException; |
50 |
import java.sql.SQLException; |
51 |
import java.text.SimpleDateFormat; |
51 |
import java.text.SimpleDateFormat; |
|
|
52 |
import java.util.logging.Level; |
53 |
import java.util.logging.Logger; |
52 |
import javax.swing.JComponent; |
54 |
import javax.swing.JComponent; |
53 |
import javax.swing.JLabel; |
55 |
import javax.swing.JLabel; |
54 |
import javax.swing.JTable; |
56 |
import javax.swing.JTable; |
Lines 233-259
Link Here
|
233 |
} |
235 |
} |
234 |
} |
236 |
} |
235 |
|
237 |
|
236 |
class ClobCellRenderer extends SQLConstantsCellRenderer { |
238 |
class ClobCellRenderer extends CellFocusCustomRenderer { |
237 |
@Override |
239 |
@Override |
238 |
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { |
240 |
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { |
239 |
if (!(value instanceof Clob)) { |
241 |
if (!(value instanceof Clob)) { |
240 |
throw new IllegalArgumentException("ClobCellRenderer can only be used for Blobs"); |
242 |
throw new IllegalArgumentException("ClobCellRenderer can only be used for Blobs"); |
241 |
} |
243 |
} |
|
|
244 |
|
245 |
Clob clobValue = (Clob) value; |
246 |
|
247 |
StringBuilder contentPart = new StringBuilder(); |
248 |
StringBuilder clobDescription = new StringBuilder("<CLOB "); |
249 |
|
242 |
try { |
250 |
try { |
243 |
Long size = ((Clob) value).length(); |
251 |
long size = clobValue.length(); |
244 |
StringBuilder stringValue = new StringBuilder(); |
252 |
|
245 |
stringValue.append("<CLOB "); |
|
|
246 |
if(size < 1000) { |
253 |
if(size < 1000) { |
247 |
stringValue.append(String.format("%1$d Chars", size)); |
254 |
clobDescription.append(String.format("%1$d Chars", size)); |
248 |
} else if ( size < 1000000) { |
255 |
} else if ( size < 1000000) { |
249 |
stringValue.append(String.format("%1$d kChars", size / 1000)); |
256 |
clobDescription.append(String.format("%1$d kChars", size / 1000)); |
250 |
} else { |
257 |
} else { |
251 |
stringValue.append(String.format("%1$d MChars", size / 1000000)); |
258 |
clobDescription.append(String.format("%1$d MChars", size / 1000000)); |
252 |
} |
259 |
} |
253 |
stringValue.append(">"); |
|
|
254 |
return super.getTableCellRendererComponent(table, stringValue.toString(), isSelected, hasFocus, row, column); |
255 |
} catch (SQLException ex) { |
260 |
} catch (SQLException ex) { |
256 |
return super.getTableCellRendererComponent(table, "<CLOB of unkown size>", isSelected, hasFocus, row, column); |
261 |
clobDescription.append("of unknown size"); |
257 |
} |
262 |
} |
|
|
263 |
clobDescription.append(">"); |
264 |
|
265 |
try { |
266 |
long size = clobValue.length(); |
267 |
long retrievalCount = Math.min(size, 255); |
268 |
String sampleContent = clobValue.getSubString(1, (int) retrievalCount); |
269 |
contentPart.append(sampleContent.replaceAll("[\n\r]+", " ")); |
270 |
if(size > 255) { |
271 |
contentPart.append(" [...]"); |
258 |
} |
272 |
} |
|
|
273 |
} catch (SQLException ex) { |
274 |
Logger.getLogger(this.getClass().getName()).log(Level.INFO, |
275 |
"Failed to retrieve CLOB content", |
276 |
ex); |
277 |
contentPart.append(clobDescription.toString()); |
259 |
} |
278 |
} |
|
|
279 |
|
280 |
Component renderer = super.getTableCellRendererComponent(table, contentPart.toString(), isSelected, hasFocus, row, column); |
281 |
|
282 |
if(renderer instanceof JComponent) { |
283 |
((JComponent) renderer).setToolTipText(clobDescription.toString()); |
284 |
} |
285 |
|
286 |
return renderer; |
287 |
} |
288 |
} |