/* * Copyright (C) 2007 SQL Explorer Development Team * http://sourceforge.net/projects/eclipsesql * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ package net.sourceforge.sqlexplorer.preview; import java.io.Reader; import net.sourceforge.sqlexplorer.Messages; import net.sourceforge.sqlexplorer.dataset.LargeTextDataType; import net.sourceforge.sqlexplorer.plugin.SQLExplorerPlugin; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Text; /** * Implements a previewer for large text (CLOB). The reason that this is not just * implemented as a String is because that would require every CLOB to be loaded * into the JVM when the query is retrieved, whereas this allows us to only load * one at a time. * @author John Spackman * */ public class LargeTextPreviewer implements Previewer { // Largest amount of text that we're prepared to read private static final int MAX_TEXT_SIZE = 64 * 1024; /* (non-JavaDoc) * @see net.sourceforge.sqlexplorer.preview.Previewer#createControls(org.eclipse.swt.widgets.Composite, java.lang.Object) */ public void createControls(final Composite parent, Object obj) { if (obj == null) return; String content = null; if (obj instanceof LargeTextDataType) { LargeTextDataType data = (LargeTextDataType)obj; try { Reader reader = data.getTextData(); char[] buffer = new char[4096]; StringBuffer result = new StringBuffer(); int pos; int length = 0; while ((pos = reader.read(buffer)) > -1) { result.append(buffer); length += pos; if (length > MAX_TEXT_SIZE) { parent.getDisplay().asyncExec(new Runnable() { public void run() { MessageDialog.openWarning(parent.getShell(), Messages.getString("LargeTextPreviewer.TooMuchData.Title"), Messages.getString("LargeTextPreviewer.TooMuchData.Message")); } }); break; } } content = result.toString(); }catch(Exception e) { SQLExplorerPlugin.error("Cannot read CLOB", e); return; } } else content = obj.toString(); if (content == null) return; Text text = new Text(parent, SWT.NONE); text.setEditable(false); text.setText(content); } public void dispose() { } }