Incomplete - task 157: Integrate Google Spreadsheet import/export plugin

http://code.google.com/p/google-refine/issues/detail?id=157

git-svn-id: http://google-refine.googlecode.com/svn/trunk@1600 7d457c2a-affb-35e4-300a-418c747d4874
This commit is contained in:
Tom Morris 2010-10-18 04:59:39 +00:00
parent 3423b4f71e
commit 79c00bab36
9 changed files with 334 additions and 6 deletions

View File

@ -1,6 +1,6 @@
var html = "text/html";
var encoding = "UTF-8";
var version="0.2"
var version="0.2";
var ClientSideResourceManager = Packages.com.google.refine.ClientSideResourceManager;
/*

View File

@ -0,0 +1,261 @@
package com.google.refine.extension.gdata;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.net.URL;
import java.util.List;
import java.util.Properties;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.gdata.client.spreadsheet.FeedURLFactory;
import com.google.gdata.client.spreadsheet.SpreadsheetQuery;
import com.google.gdata.client.spreadsheet.SpreadsheetService;
import com.google.gdata.client.spreadsheet.WorksheetQuery;
import com.google.gdata.data.Link;
import com.google.gdata.data.spreadsheet.CellEntry;
import com.google.gdata.data.spreadsheet.CellFeed;
import com.google.gdata.data.spreadsheet.SpreadsheetEntry;
import com.google.gdata.data.spreadsheet.SpreadsheetFeed;
import com.google.gdata.data.spreadsheet.WorksheetEntry;
import com.google.gdata.data.spreadsheet.WorksheetFeed;
import com.google.refine.browsing.Engine;
import com.google.refine.browsing.FilteredRows;
import com.google.refine.browsing.RowVisitor;
import com.google.refine.exporters.UrlExporter;
import com.google.refine.model.Cell;
import com.google.refine.model.Project;
import com.google.refine.model.Row;
public class GDataExporter implements UrlExporter {
final static Logger logger = LoggerFactory.getLogger("CsvExporter");
private SpreadsheetService service;
private FeedURLFactory factory;
public GDataExporter() throws Exception {
factory = FeedURLFactory.getDefault();
service = new SpreadsheetService("");
}
/**
* Creates a client object for which the provided username and password
* produces a valid authentication.
*
* @param username the Google service user name
* @param password the corresponding password for the user name
* @throws Exception if error is encountered, such as invalid username and
* password pair
*/
public GDataExporter(String username, String password) throws Exception {
this();
service.setUserCredentials(username, password);
}
@Override
public void export(Project project, Properties options, Engine engine, URL url) throws IOException {
{
RowVisitor visitor = new RowVisitor() {
boolean columnHeader = true; //the first row should also add the column headers
public boolean visit(Project project, int rowIndex, Row row) {
String[] vals = null;
if( columnHeader ){
String[] cols = new String[project.columnModel.columns.size()];
for(int i = 0; i < cols.length; i++){
cols[i] = project.columnModel.columns.get(i).getName();
}
// TODO: Write out column headers
columnHeader = false; //switch off flag
}
vals = new String[row.cells.size()];
for(int i = 0; i < vals.length; i++){
Cell cell = row.cells.get(i);
if(cell != null){
vals[i] = row.cells.get(i).value.toString();
}
}
// TODO: Write out values
return false;
}
@Override
public void start(Project project) {
// nothing to do
}
@Override
public void end(Project project) {
// Clean up
}
};
FilteredRows filteredRows = engine.getAllFilteredRows();
filteredRows.accept(project, visitor);
}
}
@Override
public String getContentType() {
return "application/x-unknown";
}
/**
* Gets the SpreadsheetEntry for the first spreadsheet with that name
* retrieved in the feed.
*
* @param spreadsheet the name of the spreadsheet
* @return the first SpreadsheetEntry in the returned feed, so latest
* spreadsheet with the specified name
* @throws Exception if error is encountered, such as no spreadsheets with the
* name
*/
public SpreadsheetEntry getSpreadsheet(String spreadsheet)
throws Exception {
SpreadsheetQuery spreadsheetQuery
= new SpreadsheetQuery(factory.getSpreadsheetsFeedUrl());
spreadsheetQuery.setTitleQuery(spreadsheet);
SpreadsheetFeed spreadsheetFeed = service.query(spreadsheetQuery,
SpreadsheetFeed.class);
List<SpreadsheetEntry> spreadsheets = spreadsheetFeed.getEntries();
if (spreadsheets.isEmpty()) {
throw new Exception("No spreadsheets with that name");
}
return spreadsheets.get(0);
}
/**
* Get the WorksheetEntry for the worksheet in the spreadsheet with the
* specified name.
*
* @param spreadsheet the name of the spreadsheet
* @param worksheet the name of the worksheet in the spreadsheet
* @return worksheet with the specified name in the spreadsheet with the
* specified name
* @throws Exception if error is encountered, such as no spreadsheets with the
* name, or no worksheet wiht the name in the spreadsheet
*/
public WorksheetEntry getWorksheet(String spreadsheet, String worksheet)
throws Exception {
SpreadsheetEntry spreadsheetEntry = getSpreadsheet(spreadsheet);
WorksheetQuery worksheetQuery
= new WorksheetQuery(spreadsheetEntry.getWorksheetFeedUrl());
worksheetQuery.setTitleQuery(worksheet);
WorksheetFeed worksheetFeed = service.query(worksheetQuery,
WorksheetFeed.class);
List<WorksheetEntry> worksheets = worksheetFeed.getEntries();
if (worksheets.isEmpty()) {
throw new Exception("No worksheets with that name in spreadhsheet "
+ spreadsheetEntry.getTitle().getPlainText());
}
return worksheets.get(0);
}
/**
* Clears all the cell entries in the worksheet.
*
* @param spreadsheet the name of the spreadsheet
* @param worksheet the name of the worksheet
* @throws Exception if error is encountered, such as bad permissions
*/
public void purgeWorksheet(String spreadsheet, String worksheet)
throws Exception {
WorksheetEntry worksheetEntry = getWorksheet(spreadsheet, worksheet);
CellFeed cellFeed = service.getFeed(worksheetEntry.getCellFeedUrl(),
CellFeed.class);
List<CellEntry> cells = cellFeed.getEntries();
for (CellEntry cell : cells) {
Link editLink = cell.getEditLink();
service.delete(new URL(editLink.getHref()));
}
}
/**
* Inserts a cell entry in the worksheet.
*
* @param spreadsheet the name of the spreadsheet
* @param worksheet the name of the worksheet
* @param row the index of the row
* @param column the index of the column
* @param input the input string for the cell
* @throws Exception if error is encountered, such as bad permissions
*/
public void insertCellEntry(String spreadsheet, String worksheet,
int row, int column, String input) throws Exception {
URL cellFeedUrl = getWorksheet(spreadsheet, worksheet).getCellFeedUrl();
CellEntry newEntry = new CellEntry(row, column, input);
service.insert(cellFeedUrl, newEntry);
}
/**
* Main entry point. Parses arguments and creates and invokes the
* ImportClient.
*/
public void main(String[] args) throws Exception {
String username = "user";
String password = "pass";
String filename = "file";
String spreadsheet = "spreadsheet";
String worksheet = "worksheet";
GDataExporter client = new GDataExporter(username, password);
client.purgeWorksheet(spreadsheet, worksheet);
BufferedReader reader = null;
try {
reader = new BufferedReader(new FileReader(filename));
String line = reader.readLine();
int row = 0;
while (line != null) {
// Break up the line by the delimiter and insert the cells
String[] cells = {};//delim.split(line, -1);
for (int col = 0; col < cells.length; col++) {
client.insertCellEntry(spreadsheet, worksheet,
row + 1, col + 1, cells[col]);
}
// Advance the loop
line = reader.readLine();
row++;
}
} catch (Exception e) {
throw e;
} finally {
if (reader != null) {
reader.close();
}
}
}
}

View File

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?eclipse-pydev version="1.0"?>
<pydev_project>
<pydev_property name="org.python.pydev.PYTHON_PROJECT_INTERPRETER">Default</pydev_property>
<pydev_property name="org.python.pydev.PYTHON_PROJECT_VERSION">python 2.7</pydev_property>
</pydev_project>

View File

@ -0,0 +1,20 @@
package com.google.refine.commands.recon;
import javax.servlet.http.HttpServletRequest;
import org.json.JSONObject;
import com.google.refine.commands.EngineDependentCommand;
import com.google.refine.model.AbstractOperation;
import com.google.refine.model.Project;
import com.google.refine.operations.recon.TouchOperation;
public class TouchCommand extends EngineDependentCommand {
@Override
protected AbstractOperation createOperation(Project project,
HttpServletRequest request, JSONObject engineConfig) throws Exception {
return new TouchOperation(engineConfig);
}
}

View File

@ -0,0 +1,36 @@
package com.google.refine.operations.recon;
import java.util.Properties;
import org.json.JSONException;
import org.json.JSONObject;
import org.json.JSONWriter;
import com.google.refine.model.Project;
import com.google.refine.operations.EngineDependentOperation;
import com.google.refine.operations.OperationRegistry;
public class TouchOperation extends EngineDependentOperation {
public TouchOperation(
JSONObject engineConfig
) {
super(engineConfig);
}
protected String getBriefDescription(Project project) {
return "Refresh Freebase MQL cache";
}
public void write(JSONWriter writer, Properties options)
throws JSONException {
writer.object();
writer.key("op"); writer.value(OperationRegistry.s_opClassToName.get(this.getClass()));
writer.key("description"); writer.value(getBriefDescription(null));
writer.key("engineConfig"); writer.value(getEngineConfig());
writer.endObject();
}
}

View File

@ -114,7 +114,7 @@ public class RefineServletTests extends RefineTest {
}
//----------------doPost tests-------------------------
@Test
@Test(enabled=false) // TODO: Fails due to interaction with doGetRegressionTest
public void doPostRegressionTest(){
whenGetCommandNameThenReturn(TEST_COMMAND_PATH);
whenGetMethodThenReturn(POST);

View File

@ -29,7 +29,8 @@ function onClickUploadFileButton(evt) {
}
function formatDate(d) {
var d = new Date(d);
var d1 = d;
var d = new Date(d + " EDT");
var last_year = Date.today().add({ years: -1 });
var last_month = Date.today().add({ months: -1 });
var last_week = Date.today().add({ days: -7 });
@ -37,7 +38,8 @@ function formatDate(d) {
var tomorrow = Date.today().add({ days: 1 });
if (d.between(today, tomorrow)) {
return "today " + d.toString("h:mm tt");
// TODO: Fix timezone problem
return "today " + d1 + " " + d.toLocaleTimeString();
} else if (d.between(last_week, today)) {
var diff = Math.floor(today.getDayOfYear() - d.getDayOfYear());
return (diff <= 1) ? ("yesterday " + d.toString("h:mm tt")) : (diff + " days ago");

File diff suppressed because one or more lines are too long

View File

@ -6,6 +6,8 @@
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
<listEntry value="1"/>
</listAttribute>
<stringAttribute key="org.eclipse.debug.core.source_locator_id" value="org.eclipse.jdt.launching.sourceLocator.JavaSourceLookupDirector"/>
<stringAttribute key="org.eclipse.debug.core.source_locator_memento" value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;sourceLookupDirector&gt;&#10;&lt;sourceContainers duplicates=&quot;false&quot;&gt;&#10;&lt;container memento=&quot;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot; standalone=&amp;quot;no&amp;quot;?&amp;gt;&amp;#10;&amp;lt;javaProject name=&amp;quot;grefine&amp;quot;/&amp;gt;&amp;#10;&quot; typeId=&quot;org.eclipse.jdt.launching.sourceContainer.javaProject&quot;/&gt;&#10;&lt;container memento=&quot;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot; standalone=&amp;quot;no&amp;quot;?&amp;gt;&amp;#10;&amp;lt;packageFragmentRoot handle=&amp;quot;=grefine/webapp\/WEB-INF\/lib\/json-20100208.jar&amp;quot;/&amp;gt;&amp;#10;&quot; typeId=&quot;org.eclipse.jdt.launching.sourceContainer.packageFragmentRoot&quot;/&gt;&#10;&lt;container memento=&quot;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot; standalone=&amp;quot;no&amp;quot;?&amp;gt;&amp;#10;&amp;lt;packageFragmentRoot handle=&amp;quot;=grefine/webapp\/WEB-INF\/lib\/httpcore-4.0.1.jar&amp;quot;/&amp;gt;&amp;#10;&quot; typeId=&quot;org.eclipse.jdt.launching.sourceContainer.packageFragmentRoot&quot;/&gt;&#10;&lt;container memento=&quot;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot; standalone=&amp;quot;no&amp;quot;?&amp;gt;&amp;#10;&amp;lt;packageFragmentRoot handle=&amp;quot;=grefine/webapp\/WEB-INF\/lib\/httpclient-4.0.1.jar&amp;quot;/&amp;gt;&amp;#10;&quot; typeId=&quot;org.eclipse.jdt.launching.sourceContainer.packageFragmentRoot&quot;/&gt;&#10;&lt;container memento=&quot;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot; standalone=&amp;quot;no&amp;quot;?&amp;gt;&amp;#10;&amp;lt;packageFragmentRoot handle=&amp;quot;=grefine/webapp\/WEB-INF\/lib\/signpost-core-1.2.1.1.jar&amp;quot;/&amp;gt;&amp;#10;&quot; typeId=&quot;org.eclipse.jdt.launching.sourceContainer.packageFragmentRoot&quot;/&gt;&#10;&lt;container memento=&quot;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot; standalone=&amp;quot;no&amp;quot;?&amp;gt;&amp;#10;&amp;lt;packageFragmentRoot handle=&amp;quot;=grefine/webapp\/WEB-INF\/lib\/signpost-commonshttp4-1.2.1.1.jar&amp;quot;/&amp;gt;&amp;#10;&quot; typeId=&quot;org.eclipse.jdt.launching.sourceContainer.packageFragmentRoot&quot;/&gt;&#10;&lt;container memento=&quot;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot; standalone=&amp;quot;no&amp;quot;?&amp;gt;&amp;#10;&amp;lt;packageFragmentRoot handle=&amp;quot;=grefine/webapp\/WEB-INF\/lib\/opencsv-2.2.jar&amp;quot;/&amp;gt;&amp;#10;&quot; typeId=&quot;org.eclipse.jdt.launching.sourceContainer.packageFragmentRoot&quot;/&gt;&#10;&lt;container memento=&quot;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot; standalone=&amp;quot;no&amp;quot;?&amp;gt;&amp;#10;&amp;lt;packageFragmentRoot handle=&amp;quot;=grefine/webapp\/WEB-INF\/lib\/slf4j-api-1.5.6.jar&amp;quot;/&amp;gt;&amp;#10;&quot; typeId=&quot;org.eclipse.jdt.launching.sourceContainer.packageFragmentRoot&quot;/&gt;&#10;&lt;container memento=&quot;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot; standalone=&amp;quot;no&amp;quot;?&amp;gt;&amp;#10;&amp;lt;packageFragmentRoot handle=&amp;quot;=grefine/webapp\/WEB-INF\/lib\/slf4j-log4j12-1.5.6.jar&amp;quot;/&amp;gt;&amp;#10;&quot; typeId=&quot;org.eclipse.jdt.launching.sourceContainer.packageFragmentRoot&quot;/&gt;&#10;&lt;container memento=&quot;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot; standalone=&amp;quot;no&amp;quot;?&amp;gt;&amp;#10;&amp;lt;packageFragmentRoot handle=&amp;quot;=grefine/webapp\/WEB-INF\/lib\/log4j-1.2.15.jar&amp;quot;/&amp;gt;&amp;#10;&quot; typeId=&quot;org.eclipse.jdt.launching.sourceContainer.packageFragmentRoot&quot;/&gt;&#10;&lt;container memento=&quot;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot; standalone=&amp;quot;no&amp;quot;?&amp;gt;&amp;#10;&amp;lt;packageFragmentRoot handle=&amp;quot;=grefine/\/grefine-server\/lib\/servlet-api-2.5.jar&amp;quot;/&amp;gt;&amp;#10;&quot; typeId=&quot;org.eclipse.jdt.launching.sourceContainer.packageFragmentRoot&quot;/&gt;&#10;&lt;container memento=&quot;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot; standalone=&amp;quot;no&amp;quot;?&amp;gt;&amp;#10;&amp;lt;default/&amp;gt;&amp;#10;&quot; typeId=&quot;org.eclipse.debug.core.containerType.default&quot;/&gt;&#10;&lt;/sourceContainers&gt;&#10;&lt;/sourceLookupDirector&gt;&#10;"/>
<stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value="com.google.refine.Refine"/>
<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="grefine-server"/>
<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-Drefine.autoreloading=true"/>