[google-refine] r1288 committed - Changed Java packages com.google.gridworks.* to com.google.refine.* an...

1 view
Skip to first unread message

google...@googlecode.com

unread,
Sep 22, 2010, 1:10:36 PM9/22/10
to google-r...@googlegroups.com
Revision: 1288
Author: dfh...@gmail.com
Date: Wed Sep 22 10:04:10 2010
Log: Changed Java packages com.google.gridworks.* to com.google.refine.*
and modified other code just enough to start grefine up without error. Much
remains to be done. Do not check out the code just yet.
http://code.google.com/p/google-refine/source/detail?r=1288

Added:
/trunk/broker/appengine/src/com/google/refine
/trunk/broker/appengine/src/com/google/refine/appengine
/trunk/broker/appengine/src/com/google/refine/broker
/trunk/broker/core/src/com/google/refine
/trunk/broker/core/src/com/google/refine/broker
/trunk/broker/core/tests/src/com/google/refine
/trunk/broker/core/tests/src/com/google/refine/broker
/trunk/broker/core/tests/src/com/google/refine/broker/tests
/trunk/extensions/jython/src/com/google/refine
/trunk/extensions/jython/src/com/google/refine/jython
/trunk/extensions/sample-extension/src/com/google/refine
/trunk/extensions/sample-extension/src/com/google/refine/sampleExtension
/trunk/main/src/com/google/refine
/trunk/main/src/com/google/refine/ClientSideResourceManager.java
/trunk/main/src/com/google/refine/GridworksServlet.java
/trunk/main/src/com/google/refine/InterProjectModel.java
/trunk/main/src/com/google/refine/Jsonizable.java
/trunk/main/src/com/google/refine/ProjectManager.java
/trunk/main/src/com/google/refine/ProjectMetadata.java
/trunk/main/src/com/google/refine/browsing
/trunk/main/src/com/google/refine/browsing/DecoratedValue.java
/trunk/main/src/com/google/refine/browsing/Engine.java
/trunk/main/src/com/google/refine/browsing/FilteredRecords.java
/trunk/main/src/com/google/refine/browsing/FilteredRows.java
/trunk/main/src/com/google/refine/browsing/RecordFilter.java
/trunk/main/src/com/google/refine/browsing/RecordVisitor.java
/trunk/main/src/com/google/refine/browsing/RowFilter.java
/trunk/main/src/com/google/refine/browsing/RowVisitor.java
/trunk/main/src/com/google/refine/browsing/facets
/trunk/main/src/com/google/refine/browsing/filters
/trunk/main/src/com/google/refine/browsing/util
/trunk/main/src/com/google/refine/clustering
/trunk/main/src/com/google/refine/clustering/Clusterer.java
/trunk/main/src/com/google/refine/clustering/binning
/trunk/main/src/com/google/refine/clustering/knn
/trunk/main/src/com/google/refine/commands
/trunk/main/src/com/google/refine/commands/Command.java
/trunk/main/src/com/google/refine/commands/EngineDependentCommand.java
/trunk/main/src/com/google/refine/commands/GetAllPreferencesCommand.java
/trunk/main/src/com/google/refine/commands/GetPreferenceCommand.java
/trunk/main/src/com/google/refine/commands/OpenWorkspaceDirCommand.java
/trunk/main/src/com/google/refine/commands/SetPreferenceCommand.java
/trunk/main/src/com/google/refine/commands/auth
/trunk/main/src/com/google/refine/commands/browsing
/trunk/main/src/com/google/refine/commands/cell
/trunk/main/src/com/google/refine/commands/column
/trunk/main/src/com/google/refine/commands/expr
/trunk/main/src/com/google/refine/commands/freebase
/trunk/main/src/com/google/refine/commands/history
/trunk/main/src/com/google/refine/commands/project
/trunk/main/src/com/google/refine/commands/recon
/trunk/main/src/com/google/refine/commands/row
/trunk/main/src/com/google/refine/commands/workspace
/trunk/main/src/com/google/refine/exporters
/trunk/main/src/com/google/refine/expr
/trunk/main/src/com/google/refine/expr/Binder.java
/trunk/main/src/com/google/refine/expr/CellTuple.java
/trunk/main/src/com/google/refine/expr/EvalError.java
/trunk/main/src/com/google/refine/expr/Evaluable.java
/trunk/main/src/com/google/refine/expr/ExpressionUtils.java
/trunk/main/src/com/google/refine/expr/HasFields.java
/trunk/main/src/com/google/refine/expr/HasFieldsList.java
/trunk/main/src/com/google/refine/expr/HasFieldsListImpl.java
/trunk/main/src/com/google/refine/expr/LanguageSpecificParser.java
/trunk/main/src/com/google/refine/expr/MetaParser.java
/trunk/main/src/com/google/refine/expr/ParsingException.java
/trunk/main/src/com/google/refine/expr/WrappedCell.java
/trunk/main/src/com/google/refine/expr/WrappedRow.java
/trunk/main/src/com/google/refine/expr/functions
/trunk/main/src/com/google/refine/expr/functions/Cross.java
/trunk/main/src/com/google/refine/expr/functions/FacetCount.java
/trunk/main/src/com/google/refine/expr/functions/Get.java
/trunk/main/src/com/google/refine/expr/functions/HasField.java
/trunk/main/src/com/google/refine/expr/functions/Jsonize.java
/trunk/main/src/com/google/refine/expr/functions/Length.java
/trunk/main/src/com/google/refine/expr/functions/Slice.java
/trunk/main/src/com/google/refine/expr/functions/ToDate.java
/trunk/main/src/com/google/refine/expr/functions/ToNumber.java
/trunk/main/src/com/google/refine/expr/functions/ToString.java
/trunk/main/src/com/google/refine/expr/functions/Type.java
/trunk/main/src/com/google/refine/expr/functions/arrays
/trunk/main/src/com/google/refine/expr/functions/booleans
/trunk/main/src/com/google/refine/expr/functions/date
/trunk/main/src/com/google/refine/expr/functions/math
/trunk/main/src/com/google/refine/expr/functions/strings
/trunk/main/src/com/google/refine/expr/util
/trunk/main/src/com/google/refine/gel
/trunk/main/src/com/google/refine/gel/Control.java
/trunk/main/src/com/google/refine/gel/ControlFunctionRegistry.java
/trunk/main/src/com/google/refine/gel/Function.java
/trunk/main/src/com/google/refine/gel/Parser.java
/trunk/main/src/com/google/refine/gel/Scanner.java
/trunk/main/src/com/google/refine/gel/ast
/trunk/main/src/com/google/refine/gel/controls
/trunk/main/src/com/google/refine/history
/trunk/main/src/com/google/refine/importers
/trunk/main/src/com/google/refine/importers/ExcelImporter.java
/trunk/main/src/com/google/refine/importers/ImportException.java
/trunk/main/src/com/google/refine/importers/Importer.java
/trunk/main/src/com/google/refine/importers/ImporterRegistry.java
/trunk/main/src/com/google/refine/importers/ImporterUtilities.java
/trunk/main/src/com/google/refine/importers/MarcImporter.java
/trunk/main/src/com/google/refine/importers/RdfTripleImporter.java
/trunk/main/src/com/google/refine/importers/ReaderImporter.java
/trunk/main/src/com/google/refine/importers/StreamImporter.java
/trunk/main/src/com/google/refine/importers/TsvCsvImporter.java
/trunk/main/src/com/google/refine/importers/UrlImporter.java
/trunk/main/src/com/google/refine/importers/XmlImportUtilities.java
/trunk/main/src/com/google/refine/importers/XmlImporter.java
/trunk/main/src/com/google/refine/importers/parsers
/trunk/main/src/com/google/refine/io
/trunk/main/src/com/google/refine/logging
/trunk/main/src/com/google/refine/model
/trunk/main/src/com/google/refine/model/AbstractOperation.java
/trunk/main/src/com/google/refine/model/Cell.java
/trunk/main/src/com/google/refine/model/Column.java
/trunk/main/src/com/google/refine/model/ColumnGroup.java
/trunk/main/src/com/google/refine/model/ColumnModel.java
/trunk/main/src/com/google/refine/model/ModelException.java
/trunk/main/src/com/google/refine/model/OverlayModel.java
/trunk/main/src/com/google/refine/model/Project.java
/trunk/main/src/com/google/refine/model/Recon.java
/trunk/main/src/com/google/refine/model/ReconCandidate.java
/trunk/main/src/com/google/refine/model/ReconStats.java
/trunk/main/src/com/google/refine/model/Record.java
/trunk/main/src/com/google/refine/model/RecordModel.java
/trunk/main/src/com/google/refine/model/Row.java
/trunk/main/src/com/google/refine/model/changes
/trunk/main/src/com/google/refine/model/recon
/trunk/main/src/com/google/refine/oauth
/trunk/main/src/com/google/refine/operations

/trunk/main/src/com/google/refine/operations/EngineDependentMassCellOperation.java
/trunk/main/src/com/google/refine/operations/EngineDependentOperation.java
/trunk/main/src/com/google/refine/operations/OnError.java
/trunk/main/src/com/google/refine/operations/OperationRegistry.java
/trunk/main/src/com/google/refine/operations/SaveProtographOperation.java
/trunk/main/src/com/google/refine/operations/cell
/trunk/main/src/com/google/refine/operations/column
/trunk/main/src/com/google/refine/operations/recon
/trunk/main/src/com/google/refine/operations/row
/trunk/main/src/com/google/refine/preference
/trunk/main/src/com/google/refine/process
/trunk/main/src/com/google/refine/protograph
/trunk/main/src/com/google/refine/protograph/AnonymousNode.java
/trunk/main/src/com/google/refine/protograph/BooleanColumnCondition.java
/trunk/main/src/com/google/refine/protograph/CellKeyNode.java
/trunk/main/src/com/google/refine/protograph/CellNode.java
/trunk/main/src/com/google/refine/protograph/CellTopicNode.java
/trunk/main/src/com/google/refine/protograph/CellValueNode.java
/trunk/main/src/com/google/refine/protograph/Condition.java
/trunk/main/src/com/google/refine/protograph/FreebaseProperty.java
/trunk/main/src/com/google/refine/protograph/FreebaseTopic.java
/trunk/main/src/com/google/refine/protograph/FreebaseTopicNode.java
/trunk/main/src/com/google/refine/protograph/FreebaseType.java
/trunk/main/src/com/google/refine/protograph/Link.java
/trunk/main/src/com/google/refine/protograph/Node.java
/trunk/main/src/com/google/refine/protograph/NodeWithLinks.java
/trunk/main/src/com/google/refine/protograph/Protograph.java
/trunk/main/src/com/google/refine/protograph/ValueNode.java
/trunk/main/src/com/google/refine/protograph/transpose
/trunk/main/src/com/google/refine/sorting
/trunk/main/src/com/google/refine/templating
/trunk/main/src/com/google/refine/util
/trunk/main/tests/server/src/com/google/refine
/trunk/main/tests/server/src/com/google/refine/tests

/trunk/main/tests/server/src/com/google/refine/tests/GridworksServletStub.java

/trunk/main/tests/server/src/com/google/refine/tests/GridworksServletTests.java
/trunk/main/tests/server/src/com/google/refine/tests/GridworksTest.java

/trunk/main/tests/server/src/com/google/refine/tests/ProjectManagerStub.java

/trunk/main/tests/server/src/com/google/refine/tests/ProjectManagerTests.java
/trunk/main/tests/server/src/com/google/refine/tests/commands

/trunk/main/tests/server/src/com/google/refine/tests/commands/CommandStub.java

/trunk/main/tests/server/src/com/google/refine/tests/commands/CommandTests.java
/trunk/main/tests/server/src/com/google/refine/tests/commands/util
/trunk/main/tests/server/src/com/google/refine/tests/exporters
/trunk/main/tests/server/src/com/google/refine/tests/history
/trunk/main/tests/server/src/com/google/refine/tests/importers
/trunk/main/tests/server/src/com/google/refine/tests/model
/trunk/main/tests/server/src/com/google/refine/tests/util
/trunk/server/src/com/google/refine
Deleted:
/trunk/broker/appengine/src/com/google/gridworks/appengine
/trunk/broker/appengine/src/com/google/gridworks/broker
/trunk/broker/core/src/com/google/gridworks/broker
/trunk/broker/core/tests/src/com/google/gridworks/broker/tests
/trunk/extensions/jython/src/com/google/gridworks/jython
/trunk/extensions/sample-extension/src/com/google/gridworks/sampleExtension
/trunk/main/src/com/google/gridworks/ClientSideResourceManager.java
/trunk/main/src/com/google/gridworks/GridworksServlet.java
/trunk/main/src/com/google/gridworks/InterProjectModel.java
/trunk/main/src/com/google/gridworks/Jsonizable.java
/trunk/main/src/com/google/gridworks/ProjectManager.java
/trunk/main/src/com/google/gridworks/ProjectMetadata.java
/trunk/main/src/com/google/gridworks/browsing/DecoratedValue.java
/trunk/main/src/com/google/gridworks/browsing/Engine.java
/trunk/main/src/com/google/gridworks/browsing/FilteredRecords.java
/trunk/main/src/com/google/gridworks/browsing/FilteredRows.java
/trunk/main/src/com/google/gridworks/browsing/RecordFilter.java
/trunk/main/src/com/google/gridworks/browsing/RecordVisitor.java
/trunk/main/src/com/google/gridworks/browsing/RowFilter.java
/trunk/main/src/com/google/gridworks/browsing/RowVisitor.java
/trunk/main/src/com/google/gridworks/browsing/facets
/trunk/main/src/com/google/gridworks/browsing/filters
/trunk/main/src/com/google/gridworks/browsing/util
/trunk/main/src/com/google/gridworks/clustering/Clusterer.java
/trunk/main/src/com/google/gridworks/clustering/binning
/trunk/main/src/com/google/gridworks/clustering/knn
/trunk/main/src/com/google/gridworks/commands/Command.java
/trunk/main/src/com/google/gridworks/commands/EngineDependentCommand.java
/trunk/main/src/com/google/gridworks/commands/GetAllPreferencesCommand.java
/trunk/main/src/com/google/gridworks/commands/GetPreferenceCommand.java
/trunk/main/src/com/google/gridworks/commands/OpenWorkspaceDirCommand.java
/trunk/main/src/com/google/gridworks/commands/SetPreferenceCommand.java
/trunk/main/src/com/google/gridworks/commands/auth
/trunk/main/src/com/google/gridworks/commands/browsing
/trunk/main/src/com/google/gridworks/commands/cell
/trunk/main/src/com/google/gridworks/commands/column
/trunk/main/src/com/google/gridworks/commands/expr
/trunk/main/src/com/google/gridworks/commands/freebase
/trunk/main/src/com/google/gridworks/commands/history
/trunk/main/src/com/google/gridworks/commands/project
/trunk/main/src/com/google/gridworks/commands/recon
/trunk/main/src/com/google/gridworks/commands/row
/trunk/main/src/com/google/gridworks/commands/workspace
/trunk/main/src/com/google/gridworks/exporters
/trunk/main/src/com/google/gridworks/expr/Binder.java
/trunk/main/src/com/google/gridworks/expr/CellTuple.java
/trunk/main/src/com/google/gridworks/expr/EvalError.java
/trunk/main/src/com/google/gridworks/expr/Evaluable.java
/trunk/main/src/com/google/gridworks/expr/ExpressionUtils.java
/trunk/main/src/com/google/gridworks/expr/HasFields.java
/trunk/main/src/com/google/gridworks/expr/HasFieldsList.java
/trunk/main/src/com/google/gridworks/expr/HasFieldsListImpl.java
/trunk/main/src/com/google/gridworks/expr/LanguageSpecificParser.java
/trunk/main/src/com/google/gridworks/expr/MetaParser.java
/trunk/main/src/com/google/gridworks/expr/ParsingException.java
/trunk/main/src/com/google/gridworks/expr/WrappedCell.java
/trunk/main/src/com/google/gridworks/expr/WrappedRow.java
/trunk/main/src/com/google/gridworks/expr/functions/Cross.java
/trunk/main/src/com/google/gridworks/expr/functions/FacetCount.java
/trunk/main/src/com/google/gridworks/expr/functions/Get.java
/trunk/main/src/com/google/gridworks/expr/functions/HasField.java
/trunk/main/src/com/google/gridworks/expr/functions/Jsonize.java
/trunk/main/src/com/google/gridworks/expr/functions/Length.java
/trunk/main/src/com/google/gridworks/expr/functions/Slice.java
/trunk/main/src/com/google/gridworks/expr/functions/ToDate.java
/trunk/main/src/com/google/gridworks/expr/functions/ToNumber.java
/trunk/main/src/com/google/gridworks/expr/functions/ToString.java
/trunk/main/src/com/google/gridworks/expr/functions/Type.java
/trunk/main/src/com/google/gridworks/expr/functions/arrays
/trunk/main/src/com/google/gridworks/expr/functions/booleans
/trunk/main/src/com/google/gridworks/expr/functions/date
/trunk/main/src/com/google/gridworks/expr/functions/math
/trunk/main/src/com/google/gridworks/expr/functions/strings
/trunk/main/src/com/google/gridworks/expr/util
/trunk/main/src/com/google/gridworks/gel/Control.java
/trunk/main/src/com/google/gridworks/gel/ControlFunctionRegistry.java
/trunk/main/src/com/google/gridworks/gel/Function.java
/trunk/main/src/com/google/gridworks/gel/Parser.java
/trunk/main/src/com/google/gridworks/gel/Scanner.java
/trunk/main/src/com/google/gridworks/gel/ast
/trunk/main/src/com/google/gridworks/gel/controls
/trunk/main/src/com/google/gridworks/history
/trunk/main/src/com/google/gridworks/importers/ExcelImporter.java
/trunk/main/src/com/google/gridworks/importers/ImportException.java
/trunk/main/src/com/google/gridworks/importers/Importer.java
/trunk/main/src/com/google/gridworks/importers/ImporterRegistry.java
/trunk/main/src/com/google/gridworks/importers/ImporterUtilities.java
/trunk/main/src/com/google/gridworks/importers/MarcImporter.java
/trunk/main/src/com/google/gridworks/importers/RdfTripleImporter.java
/trunk/main/src/com/google/gridworks/importers/ReaderImporter.java
/trunk/main/src/com/google/gridworks/importers/StreamImporter.java
/trunk/main/src/com/google/gridworks/importers/TsvCsvImporter.java
/trunk/main/src/com/google/gridworks/importers/UrlImporter.java
/trunk/main/src/com/google/gridworks/importers/XmlImportUtilities.java
/trunk/main/src/com/google/gridworks/importers/XmlImporter.java
/trunk/main/src/com/google/gridworks/importers/parsers
/trunk/main/src/com/google/gridworks/io
/trunk/main/src/com/google/gridworks/logging
/trunk/main/src/com/google/gridworks/model/AbstractOperation.java
/trunk/main/src/com/google/gridworks/model/Cell.java
/trunk/main/src/com/google/gridworks/model/Column.java
/trunk/main/src/com/google/gridworks/model/ColumnGroup.java
/trunk/main/src/com/google/gridworks/model/ColumnModel.java
/trunk/main/src/com/google/gridworks/model/ModelException.java
/trunk/main/src/com/google/gridworks/model/OverlayModel.java
/trunk/main/src/com/google/gridworks/model/Project.java
/trunk/main/src/com/google/gridworks/model/Recon.java
/trunk/main/src/com/google/gridworks/model/ReconCandidate.java
/trunk/main/src/com/google/gridworks/model/ReconStats.java
/trunk/main/src/com/google/gridworks/model/Record.java
/trunk/main/src/com/google/gridworks/model/RecordModel.java
/trunk/main/src/com/google/gridworks/model/Row.java
/trunk/main/src/com/google/gridworks/model/changes
/trunk/main/src/com/google/gridworks/model/recon
/trunk/main/src/com/google/gridworks/oauth

/trunk/main/src/com/google/gridworks/operations/EngineDependentMassCellOperation.java

/trunk/main/src/com/google/gridworks/operations/EngineDependentOperation.java
/trunk/main/src/com/google/gridworks/operations/OnError.java
/trunk/main/src/com/google/gridworks/operations/OperationRegistry.java

/trunk/main/src/com/google/gridworks/operations/SaveProtographOperation.java
/trunk/main/src/com/google/gridworks/operations/cell
/trunk/main/src/com/google/gridworks/operations/column
/trunk/main/src/com/google/gridworks/operations/recon
/trunk/main/src/com/google/gridworks/operations/row
/trunk/main/src/com/google/gridworks/preference
/trunk/main/src/com/google/gridworks/process
/trunk/main/src/com/google/gridworks/protograph/AnonymousNode.java
/trunk/main/src/com/google/gridworks/protograph/BooleanColumnCondition.java
/trunk/main/src/com/google/gridworks/protograph/CellKeyNode.java
/trunk/main/src/com/google/gridworks/protograph/CellNode.java
/trunk/main/src/com/google/gridworks/protograph/CellTopicNode.java
/trunk/main/src/com/google/gridworks/protograph/CellValueNode.java
/trunk/main/src/com/google/gridworks/protograph/Condition.java
/trunk/main/src/com/google/gridworks/protograph/FreebaseProperty.java
/trunk/main/src/com/google/gridworks/protograph/FreebaseTopic.java
/trunk/main/src/com/google/gridworks/protograph/FreebaseTopicNode.java
/trunk/main/src/com/google/gridworks/protograph/FreebaseType.java
/trunk/main/src/com/google/gridworks/protograph/Link.java
/trunk/main/src/com/google/gridworks/protograph/Node.java
/trunk/main/src/com/google/gridworks/protograph/NodeWithLinks.java
/trunk/main/src/com/google/gridworks/protograph/Protograph.java
/trunk/main/src/com/google/gridworks/protograph/ValueNode.java
/trunk/main/src/com/google/gridworks/protograph/transpose
/trunk/main/src/com/google/gridworks/sorting
/trunk/main/src/com/google/gridworks/templating
/trunk/main/src/com/google/gridworks/util

/trunk/main/tests/server/src/com/google/gridworks/tests/GridworksServletStub.java

/trunk/main/tests/server/src/com/google/gridworks/tests/GridworksServletTests.java
/trunk/main/tests/server/src/com/google/gridworks/tests/GridworksTest.java

/trunk/main/tests/server/src/com/google/gridworks/tests/ProjectManagerStub.java

/trunk/main/tests/server/src/com/google/gridworks/tests/ProjectManagerTests.java

/trunk/main/tests/server/src/com/google/gridworks/tests/commands/CommandStub.java

/trunk/main/tests/server/src/com/google/gridworks/tests/commands/CommandTests.java
/trunk/main/tests/server/src/com/google/gridworks/tests/commands/util
/trunk/main/tests/server/src/com/google/gridworks/tests/exporters
/trunk/main/tests/server/src/com/google/gridworks/tests/history
/trunk/main/tests/server/src/com/google/gridworks/tests/importers
/trunk/main/tests/server/src/com/google/gridworks/tests/model
/trunk/main/tests/server/src/com/google/gridworks/tests/util
/trunk/server/src/com/google/gridworks
Modified:

/trunk/broker/appengine/src/com/google/refine/appengine/AppEngineClientConnection.java

/trunk/broker/appengine/src/com/google/refine/appengine/AppEngineClientConnectionManager.java

/trunk/broker/appengine/src/com/google/refine/broker/AppEngineGridworksBrokerImpl.java
/trunk/broker/core/src/com/google/refine/broker/GridworksBroker.java
/trunk/broker/core/src/com/google/refine/broker/GridworksBrokerImpl.java

/trunk/broker/core/tests/src/com/google/refine/broker/tests/GridworksBrokerTests.java
/trunk/extensions/build.xml
/trunk/extensions/jython/module/MOD-INF/controller.js
/trunk/extensions/jython/src/com/google/refine/jython/JythonEvaluable.java

/trunk/extensions/jython/src/com/google/refine/jython/JythonHasFieldsWrapper.java

/trunk/extensions/jython/src/com/google/refine/jython/JythonObjectWrapper.java
/trunk/extensions/sample-extension/module/MOD-INF/controller.js

/trunk/extensions/sample-extension/src/com/google/refine/sampleExtension/SampleUtil.java
/trunk/gridworks
/trunk/gridworks.bat
/trunk/main/src/com/google/refine/browsing/facets/Facet.java
/trunk/main/src/com/google/refine/browsing/facets/ListFacet.java
/trunk/main/src/com/google/refine/browsing/facets/NominalFacetChoice.java
/trunk/main/src/com/google/refine/browsing/facets/RangeFacet.java

/trunk/main/src/com/google/refine/browsing/facets/ScatterplotDrawingRowVisitor.java
/trunk/main/src/com/google/refine/browsing/facets/ScatterplotFacet.java
/trunk/main/src/com/google/refine/browsing/facets/TextSearchFacet.java
/trunk/main/src/com/google/refine/browsing/facets/TimeRangeFacet.java
/trunk/main/src/com/google/refine/browsing/filters/AllRowsRecordFilter.java
/trunk/main/src/com/google/refine/browsing/filters/AnyRowRecordFilter.java

/trunk/main/src/com/google/refine/browsing/filters/DualExpressionsNumberComparisonRowFilter.java

/trunk/main/src/com/google/refine/browsing/filters/ExpressionEqualRowFilter.java

/trunk/main/src/com/google/refine/browsing/filters/ExpressionNumberComparisonRowFilter.java

/trunk/main/src/com/google/refine/browsing/filters/ExpressionStringComparisonRowFilter.java

/trunk/main/src/com/google/refine/browsing/filters/ExpressionTimeComparisonRowFilter.java

/trunk/main/src/com/google/refine/browsing/util/ConjunctiveFilteredRecords.java

/trunk/main/src/com/google/refine/browsing/util/ConjunctiveFilteredRows.java

/trunk/main/src/com/google/refine/browsing/util/ExpressionBasedRowEvaluable.java

/trunk/main/src/com/google/refine/browsing/util/ExpressionNominalValueGrouper.java

/trunk/main/src/com/google/refine/browsing/util/ExpressionNumericValueBinner.java

/trunk/main/src/com/google/refine/browsing/util/ExpressionTimeValueBinner.java

/trunk/main/src/com/google/refine/browsing/util/FilteredRecordsAsFilteredRows.java
/trunk/main/src/com/google/refine/browsing/util/NumericBinIndex.java
/trunk/main/src/com/google/refine/browsing/util/NumericBinRecordIndex.java
/trunk/main/src/com/google/refine/browsing/util/NumericBinRowIndex.java
/trunk/main/src/com/google/refine/browsing/util/RowEvaluable.java

/trunk/main/src/com/google/refine/browsing/util/RowVisitorAsRecordVisitor.java
/trunk/main/src/com/google/refine/browsing/util/TimeBinIndex.java
/trunk/main/src/com/google/refine/browsing/util/TimeBinRecordIndex.java
/trunk/main/src/com/google/refine/browsing/util/TimeBinRowIndex.java
/trunk/main/src/com/google/refine/clustering/binning/BinningClusterer.java

/trunk/main/src/com/google/refine/clustering/binning/DoubleMetaphoneKeyer.java
/trunk/main/src/com/google/refine/clustering/binning/FingerprintKeyer.java
/trunk/main/src/com/google/refine/clustering/binning/Keyer.java
/trunk/main/src/com/google/refine/clustering/binning/MetaphoneKeyer.java

/trunk/main/src/com/google/refine/clustering/binning/NGramFingerprintKeyer.java
/trunk/main/src/com/google/refine/clustering/binning/SoundexKeyer.java
/trunk/main/src/com/google/refine/clustering/knn/kNNClusterer.java
/trunk/main/src/com/google/refine/commands/auth/AuthorizeCommand.java

/trunk/main/src/com/google/refine/commands/auth/CheckAuthorizationCommand.java
/trunk/main/src/com/google/refine/commands/auth/DeAuthorizeCommand.java
/trunk/main/src/com/google/refine/commands/auth/GetUserBadgesCommand.java

/trunk/main/src/com/google/refine/commands/browsing/ComputeClustersCommand.java

/trunk/main/src/com/google/refine/commands/browsing/ComputeFacetsCommand.java

/trunk/main/src/com/google/refine/commands/browsing/GetScatterplotCommand.java
/trunk/main/src/com/google/refine/commands/cell/BlankDownCommand.java
/trunk/main/src/com/google/refine/commands/cell/EditOneCellCommand.java
/trunk/main/src/com/google/refine/commands/cell/FillDownCommand.java

/trunk/main/src/com/google/refine/commands/cell/JoinMultiValueCellsCommand.java
/trunk/main/src/com/google/refine/commands/cell/MassEditCommand.java

/trunk/main/src/com/google/refine/commands/cell/SplitMultiValueCellsCommand.java
/trunk/main/src/com/google/refine/commands/cell/TextTransformCommand.java

/trunk/main/src/com/google/refine/commands/cell/TransposeColumnsIntoRowsCommand.java

/trunk/main/src/com/google/refine/commands/cell/TransposeRowsIntoColumnsCommand.java

/trunk/main/src/com/google/refine/commands/column/AddColumnByFetchingURLsCommand.java
/trunk/main/src/com/google/refine/commands/column/AddColumnCommand.java
/trunk/main/src/com/google/refine/commands/column/ExtendDataCommand.java

/trunk/main/src/com/google/refine/commands/column/GetColumnsInfoCommand.java
/trunk/main/src/com/google/refine/commands/column/MoveColumnCommand.java

/trunk/main/src/com/google/refine/commands/column/PreviewExtendDataCommand.java
/trunk/main/src/com/google/refine/commands/column/RemoveColumnCommand.java
/trunk/main/src/com/google/refine/commands/column/RenameColumnCommand.java

/trunk/main/src/com/google/refine/commands/column/ReorderColumnsCommand.java
/trunk/main/src/com/google/refine/commands/column/SplitColumnCommand.java

/trunk/main/src/com/google/refine/commands/expr/GetExpressionHistoryCommand.java

/trunk/main/src/com/google/refine/commands/expr/GetExpressionLanguageInfoCommand.java
/trunk/main/src/com/google/refine/commands/expr/LogExpressionCommand.java

/trunk/main/src/com/google/refine/commands/expr/PreviewExpressionCommand.java

/trunk/main/src/com/google/refine/commands/freebase/GuessTypesOfColumnCommand.java

/trunk/main/src/com/google/refine/commands/freebase/ImportQADataCommand.java
/trunk/main/src/com/google/refine/commands/freebase/MQLReadCommand.java
/trunk/main/src/com/google/refine/commands/freebase/MQLWriteCommand.java

/trunk/main/src/com/google/refine/commands/freebase/PreviewProtographCommand.java

/trunk/main/src/com/google/refine/commands/freebase/SaveProtographCommand.java
/trunk/main/src/com/google/refine/commands/freebase/UploadDataCommand.java

/trunk/main/src/com/google/refine/commands/history/ApplyOperationsCommand.java

/trunk/main/src/com/google/refine/commands/history/CancelProcessesCommand.java
/trunk/main/src/com/google/refine/commands/history/GetHistoryCommand.java

/trunk/main/src/com/google/refine/commands/history/GetOperationsCommand.java
/trunk/main/src/com/google/refine/commands/history/GetProcessesCommand.java
/trunk/main/src/com/google/refine/commands/history/UndoRedoCommand.java

/trunk/main/src/com/google/refine/commands/project/CreateProjectCommand.java

/trunk/main/src/com/google/refine/commands/project/DeleteProjectCommand.java

/trunk/main/src/com/google/refine/commands/project/ExportProjectCommand.java
/trunk/main/src/com/google/refine/commands/project/ExportRowsCommand.java
/trunk/main/src/com/google/refine/commands/project/GetModelsCommand.java

/trunk/main/src/com/google/refine/commands/project/GetProjectMetadataCommand.java

/trunk/main/src/com/google/refine/commands/project/ImportProjectCommand.java

/trunk/main/src/com/google/refine/commands/project/RenameProjectCommand.java

/trunk/main/src/com/google/refine/commands/recon/ReconDiscardJudgmentsCommand.java

/trunk/main/src/com/google/refine/commands/recon/ReconJudgeOneCellCommand.java

/trunk/main/src/com/google/refine/commands/recon/ReconJudgeSimilarCellsCommand.java

/trunk/main/src/com/google/refine/commands/recon/ReconMarkNewTopicsCommand.java

/trunk/main/src/com/google/refine/commands/recon/ReconMatchBestCandidatesCommand.java

/trunk/main/src/com/google/refine/commands/recon/ReconMatchSpecificTopicCommand.java
/trunk/main/src/com/google/refine/commands/recon/ReconcileCommand.java
/trunk/main/src/com/google/refine/commands/row/AnnotateOneRowCommand.java
/trunk/main/src/com/google/refine/commands/row/AnnotateRowsCommand.java
/trunk/main/src/com/google/refine/commands/row/DenormalizeCommand.java
/trunk/main/src/com/google/refine/commands/row/GetRowsCommand.java
/trunk/main/src/com/google/refine/commands/row/RemoveRowsCommand.java
/trunk/main/src/com/google/refine/commands/row/ReorderRowsCommand.java

/trunk/main/src/com/google/refine/commands/workspace/GetAllProjectMetadataCommand.java
/trunk/main/src/com/google/refine/exporters/CsvExporter.java
/trunk/main/src/com/google/refine/exporters/Exporter.java
/trunk/main/src/com/google/refine/exporters/ExporterRegistry.java
/trunk/main/src/com/google/refine/exporters/HtmlTableExporter.java

/trunk/main/src/com/google/refine/exporters/ProtographTransposeExporter.java
/trunk/main/src/com/google/refine/exporters/TemplatingExporter.java
/trunk/main/src/com/google/refine/exporters/XlsExporter.java
/trunk/main/src/com/google/refine/expr/functions/arrays/ArgsToArray.java
/trunk/main/src/com/google/refine/expr/functions/arrays/Join.java
/trunk/main/src/com/google/refine/expr/functions/arrays/Reverse.java
/trunk/main/src/com/google/refine/expr/functions/arrays/Sort.java
/trunk/main/src/com/google/refine/expr/functions/arrays/Uniques.java
/trunk/main/src/com/google/refine/expr/functions/booleans/And.java
/trunk/main/src/com/google/refine/expr/functions/booleans/Not.java
/trunk/main/src/com/google/refine/expr/functions/booleans/Or.java
/trunk/main/src/com/google/refine/expr/functions/date/DatePart.java
/trunk/main/src/com/google/refine/expr/functions/date/Inc.java
/trunk/main/src/com/google/refine/expr/functions/date/Now.java
/trunk/main/src/com/google/refine/expr/functions/math/Ceil.java
/trunk/main/src/com/google/refine/expr/functions/math/Exp.java
/trunk/main/src/com/google/refine/expr/functions/math/Floor.java
/trunk/main/src/com/google/refine/expr/functions/math/Ln.java
/trunk/main/src/com/google/refine/expr/functions/math/Log.java
/trunk/main/src/com/google/refine/expr/functions/math/Max.java
/trunk/main/src/com/google/refine/expr/functions/math/Min.java
/trunk/main/src/com/google/refine/expr/functions/math/Mod.java
/trunk/main/src/com/google/refine/expr/functions/math/Pow.java
/trunk/main/src/com/google/refine/expr/functions/math/Round.java
/trunk/main/src/com/google/refine/expr/functions/math/Sum.java
/trunk/main/src/com/google/refine/expr/functions/strings/Chomp.java
/trunk/main/src/com/google/refine/expr/functions/strings/Contains.java
/trunk/main/src/com/google/refine/expr/functions/strings/Diff.java
/trunk/main/src/com/google/refine/expr/functions/strings/EndsWith.java
/trunk/main/src/com/google/refine/expr/functions/strings/Escape.java
/trunk/main/src/com/google/refine/expr/functions/strings/Fingerprint.java
/trunk/main/src/com/google/refine/expr/functions/strings/IndexOf.java
/trunk/main/src/com/google/refine/expr/functions/strings/LastIndexOf.java
/trunk/main/src/com/google/refine/expr/functions/strings/MD5.java
/trunk/main/src/com/google/refine/expr/functions/strings/Match.java
/trunk/main/src/com/google/refine/expr/functions/strings/NGram.java

/trunk/main/src/com/google/refine/expr/functions/strings/NGramFingerprint.java
/trunk/main/src/com/google/refine/expr/functions/strings/ParseJson.java
/trunk/main/src/com/google/refine/expr/functions/strings/Partition.java
/trunk/main/src/com/google/refine/expr/functions/strings/Phonetic.java
/trunk/main/src/com/google/refine/expr/functions/strings/RPartition.java
/trunk/main/src/com/google/refine/expr/functions/strings/Reinterpret.java
/trunk/main/src/com/google/refine/expr/functions/strings/Replace.java
/trunk/main/src/com/google/refine/expr/functions/strings/ReplaceChars.java
/trunk/main/src/com/google/refine/expr/functions/strings/SHA1.java
/trunk/main/src/com/google/refine/expr/functions/strings/SmartSplit.java
/trunk/main/src/com/google/refine/expr/functions/strings/Split.java

/trunk/main/src/com/google/refine/expr/functions/strings/SplitByCharType.java

/trunk/main/src/com/google/refine/expr/functions/strings/SplitByLengths.java
/trunk/main/src/com/google/refine/expr/functions/strings/StartsWith.java
/trunk/main/src/com/google/refine/expr/functions/strings/ToLowercase.java
/trunk/main/src/com/google/refine/expr/functions/strings/ToTitlecase.java
/trunk/main/src/com/google/refine/expr/functions/strings/ToUppercase.java
/trunk/main/src/com/google/refine/expr/functions/strings/Trim.java
/trunk/main/src/com/google/refine/expr/functions/strings/Unescape.java
/trunk/main/src/com/google/refine/expr/functions/strings/Unicode.java
/trunk/main/src/com/google/refine/expr/functions/strings/UnicodeType.java
/trunk/main/src/com/google/refine/expr/util/CalendarParser.java
/trunk/main/src/com/google/refine/expr/util/CalendarParserException.java
/trunk/main/src/com/google/refine/gel/ast/ControlCallExpr.java
/trunk/main/src/com/google/refine/gel/ast/FieldAccessorExpr.java
/trunk/main/src/com/google/refine/gel/ast/FunctionCallExpr.java
/trunk/main/src/com/google/refine/gel/ast/LiteralExpr.java
/trunk/main/src/com/google/refine/gel/ast/OperatorCallExpr.java
/trunk/main/src/com/google/refine/gel/ast/VariableExpr.java
/trunk/main/src/com/google/refine/gel/controls/Filter.java
/trunk/main/src/com/google/refine/gel/controls/ForEach.java
/trunk/main/src/com/google/refine/gel/controls/ForEachIndex.java
/trunk/main/src/com/google/refine/gel/controls/ForNonBlank.java
/trunk/main/src/com/google/refine/gel/controls/ForRange.java
/trunk/main/src/com/google/refine/gel/controls/If.java
/trunk/main/src/com/google/refine/gel/controls/IsBlank.java
/trunk/main/src/com/google/refine/gel/controls/IsError.java
/trunk/main/src/com/google/refine/gel/controls/IsNonBlank.java
/trunk/main/src/com/google/refine/gel/controls/IsNotNull.java
/trunk/main/src/com/google/refine/gel/controls/IsNull.java
/trunk/main/src/com/google/refine/gel/controls/IsNumeric.java
/trunk/main/src/com/google/refine/gel/controls/IsTest.java
/trunk/main/src/com/google/refine/gel/controls/With.java
/trunk/main/src/com/google/refine/history/Change.java
/trunk/main/src/com/google/refine/history/ChangeSequence.java
/trunk/main/src/com/google/refine/history/History.java
/trunk/main/src/com/google/refine/history/HistoryEntry.java
/trunk/main/src/com/google/refine/history/HistoryEntryManager.java
/trunk/main/src/com/google/refine/history/HistoryProcess.java
/trunk/main/src/com/google/refine/importers/parsers/NonSplitRowParser.java
/trunk/main/src/com/google/refine/importers/parsers/RowParser.java
/trunk/main/src/com/google/refine/importers/parsers/SeparatorRowParser.java
/trunk/main/src/com/google/refine/io/FileHistoryEntryManager.java
/trunk/main/src/com/google/refine/io/FileProjectManager.java
/trunk/main/src/com/google/refine/io/ProjectMetadataUtilities.java
/trunk/main/src/com/google/refine/io/ProjectUtilities.java
/trunk/main/src/com/google/refine/logging/IndentingLayout.java
/trunk/main/src/com/google/refine/model/changes/CellAtRow.java
/trunk/main/src/com/google/refine/model/changes/CellChange.java
/trunk/main/src/com/google/refine/model/changes/ColumnAdditionChange.java
/trunk/main/src/com/google/refine/model/changes/ColumnChange.java
/trunk/main/src/com/google/refine/model/changes/ColumnMoveChange.java
/trunk/main/src/com/google/refine/model/changes/ColumnRemovalChange.java
/trunk/main/src/com/google/refine/model/changes/ColumnRenameChange.java
/trunk/main/src/com/google/refine/model/changes/ColumnReorderChange.java
/trunk/main/src/com/google/refine/model/changes/ColumnSplitChange.java
/trunk/main/src/com/google/refine/model/changes/DataExtensionChange.java
/trunk/main/src/com/google/refine/model/changes/MassCellChange.java
/trunk/main/src/com/google/refine/model/changes/MassChange.java
/trunk/main/src/com/google/refine/model/changes/MassReconChange.java
/trunk/main/src/com/google/refine/model/changes/MassRowChange.java
/trunk/main/src/com/google/refine/model/changes/MassRowColumnChange.java
/trunk/main/src/com/google/refine/model/changes/ReconChange.java
/trunk/main/src/com/google/refine/model/changes/RowFlagChange.java
/trunk/main/src/com/google/refine/model/changes/RowRemovalChange.java
/trunk/main/src/com/google/refine/model/changes/RowReorderChange.java
/trunk/main/src/com/google/refine/model/changes/RowStarChange.java
/trunk/main/src/com/google/refine/model/recon/DataExtensionReconConfig.java
/trunk/main/src/com/google/refine/model/recon/GuidBasedReconConfig.java
/trunk/main/src/com/google/refine/model/recon/IdBasedReconConfig.java
/trunk/main/src/com/google/refine/model/recon/KeyBasedReconConfig.java
/trunk/main/src/com/google/refine/model/recon/ReconConfig.java
/trunk/main/src/com/google/refine/model/recon/ReconJob.java
/trunk/main/src/com/google/refine/model/recon/StandardReconConfig.java
/trunk/main/src/com/google/refine/model/recon/StrictReconConfig.java
/trunk/main/src/com/google/refine/oauth/Credentials.java
/trunk/main/src/com/google/refine/oauth/FreebaseProvider.java

/trunk/main/src/com/google/refine/oauth/FreebaseTimeCommonsHttpOAuthConsumer.java
/trunk/main/src/com/google/refine/oauth/OAuthUtilities.java
/trunk/main/src/com/google/refine/oauth/Provider.java
/trunk/main/src/com/google/refine/operations/cell/BlankDownOperation.java
/trunk/main/src/com/google/refine/operations/cell/FillDownOperation.java
/trunk/main/src/com/google/refine/operations/cell/MassEditOperation.java

/trunk/main/src/com/google/refine/operations/cell/MultiValuedCellJoinOperation.java

/trunk/main/src/com/google/refine/operations/cell/MultiValuedCellSplitOperation.java

/trunk/main/src/com/google/refine/operations/cell/TextTransformOperation.java

/trunk/main/src/com/google/refine/operations/cell/TransposeColumnsIntoRowsOperation.java

/trunk/main/src/com/google/refine/operations/cell/TransposeRowsIntoColumnsOperation.java

/trunk/main/src/com/google/refine/operations/column/ColumnAdditionByFetchingURLsOperation.java

/trunk/main/src/com/google/refine/operations/column/ColumnAdditionOperation.java

/trunk/main/src/com/google/refine/operations/column/ColumnMoveOperation.java

/trunk/main/src/com/google/refine/operations/column/ColumnRemovalOperation.java

/trunk/main/src/com/google/refine/operations/column/ColumnRenameOperation.java

/trunk/main/src/com/google/refine/operations/column/ColumnReorderOperation.java

/trunk/main/src/com/google/refine/operations/column/ColumnSplitOperation.java

/trunk/main/src/com/google/refine/operations/column/ExtendDataOperation.java

/trunk/main/src/com/google/refine/operations/recon/ImportQADataOperation.java

/trunk/main/src/com/google/refine/operations/recon/ReconDiscardJudgmentsOperation.java

/trunk/main/src/com/google/refine/operations/recon/ReconJudgeSimilarCellsOperation.java

/trunk/main/src/com/google/refine/operations/recon/ReconMarkNewTopicsOperation.java

/trunk/main/src/com/google/refine/operations/recon/ReconMatchBestCandidatesOperation.java

/trunk/main/src/com/google/refine/operations/recon/ReconMatchSpecificTopicOperation.java
/trunk/main/src/com/google/refine/operations/recon/ReconOperation.java
/trunk/main/src/com/google/refine/operations/row/DenormalizeOperation.java
/trunk/main/src/com/google/refine/operations/row/RowFlagOperation.java
/trunk/main/src/com/google/refine/operations/row/RowRemovalOperation.java
/trunk/main/src/com/google/refine/operations/row/RowReorderOperation.java
/trunk/main/src/com/google/refine/operations/row/RowStarOperation.java
/trunk/main/src/com/google/refine/preference/PreferenceStore.java
/trunk/main/src/com/google/refine/preference/TopList.java
/trunk/main/src/com/google/refine/process/LongRunningProcess.java
/trunk/main/src/com/google/refine/process/Process.java
/trunk/main/src/com/google/refine/process/ProcessManager.java
/trunk/main/src/com/google/refine/process/QuickHistoryEntryProcess.java

/trunk/main/src/com/google/refine/protograph/transpose/MqlwriteLikeTransposedNodeFactory.java
/trunk/main/src/com/google/refine/protograph/transpose/TransposedNode.java

/trunk/main/src/com/google/refine/protograph/transpose/TransposedNodeFactory.java
/trunk/main/src/com/google/refine/protograph/transpose/Transposer.java

/trunk/main/src/com/google/refine/protograph/transpose/TripleLoaderTransposedNodeFactory.java
/trunk/main/src/com/google/refine/sorting/BaseSorter.java
/trunk/main/src/com/google/refine/sorting/BooleanCriterion.java
/trunk/main/src/com/google/refine/sorting/Criterion.java
/trunk/main/src/com/google/refine/sorting/DateCriterion.java
/trunk/main/src/com/google/refine/sorting/NumberCriterion.java
/trunk/main/src/com/google/refine/sorting/SortingRecordVisitor.java
/trunk/main/src/com/google/refine/sorting/SortingRowVisitor.java
/trunk/main/src/com/google/refine/sorting/StringCriterion.java
/trunk/main/src/com/google/refine/templating/DynamicFragment.java
/trunk/main/src/com/google/refine/templating/Fragment.java
/trunk/main/src/com/google/refine/templating/Parser.java
/trunk/main/src/com/google/refine/templating/StaticFragment.java
/trunk/main/src/com/google/refine/templating/Template.java
/trunk/main/src/com/google/refine/util/CookiesUtilities.java
/trunk/main/src/com/google/refine/util/FreebaseDataExtensionJob.java
/trunk/main/src/com/google/refine/util/FreebaseUtils.java
/trunk/main/src/com/google/refine/util/IOUtils.java
/trunk/main/src/com/google/refine/util/IndentWriter.java
/trunk/main/src/com/google/refine/util/JSONUtilities.java
/trunk/main/src/com/google/refine/util/JSObject.java
/trunk/main/src/com/google/refine/util/ParsingUtilities.java
/trunk/main/src/com/google/refine/util/Pool.java

/trunk/main/tests/server/src/com/google/refine/tests/commands/util/CancelProcessesCommandTests.java

/trunk/main/tests/server/src/com/google/refine/tests/exporters/CsvExporterTests.java

/trunk/main/tests/server/src/com/google/refine/tests/exporters/TsvExporterTests.java

/trunk/main/tests/server/src/com/google/refine/tests/history/HistoryTests.java

/trunk/main/tests/server/src/com/google/refine/tests/importers/ImporterUtilitiesTests.java

/trunk/main/tests/server/src/com/google/refine/tests/importers/RdfTripleImporterTests.java

/trunk/main/tests/server/src/com/google/refine/tests/importers/TsvCsvImporterTests.java

/trunk/main/tests/server/src/com/google/refine/tests/importers/XmlImportUtilitiesStub.java

/trunk/main/tests/server/src/com/google/refine/tests/importers/XmlImportUtilitiesTests.java

/trunk/main/tests/server/src/com/google/refine/tests/importers/XmlImporterTests.java
/trunk/main/tests/server/src/com/google/refine/tests/model/ProjectStub.java

/trunk/main/tests/server/src/com/google/refine/tests/util/ParsingUtilitiesTests.java
/trunk/main/webapp/WEB-INF/web.xml
/trunk/main/webapp/modules/core/MOD-INF/controller.js
/trunk/server/IDEs/eclipse/Gridworks.launch
/trunk/server/src/com/google/refine/Configurations.java
/trunk/server/src/com/google/refine/Gridworks.java

=======================================
--- /dev/null
+++ /trunk/main/src/com/google/refine/ClientSideResourceManager.java Wed
Sep 22 10:04:10 2010
@@ -0,0 +1,91 @@
+package com.google.refine;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import edu.mit.simile.butterfly.ButterflyModule;
+import edu.mit.simile.butterfly.MountPoint;
+
+
+public class ClientSideResourceManager {
+ final static Logger logger =
LoggerFactory.getLogger("gridworks_clientSideResourceManager");
+
+ static public class QualifiedPath {
+ public ButterflyModule module;
+ public String path;
+ public String fullPath;
+ }
+ static public class ClientSideResourceBundle {
+ final protected Set<String> _pathSet = new HashSet<String>();
+ final protected List<QualifiedPath> _pathList = new
ArrayList<QualifiedPath>();
+ }
+
+ final static protected Map<String, ClientSideResourceBundle> s_bundles
+ = new HashMap<String, ClientSideResourceBundle>();
+
+ static public void addPaths(
+ String bundleName,
+ ButterflyModule module,
+ String[] paths) {
+
+ ClientSideResourceBundle bundle = s_bundles.get(bundleName);
+ if (bundle == null) {
+ bundle = new ClientSideResourceBundle();
+ s_bundles.put(bundleName, bundle);
+ }
+
+ for (String path : paths) {
+ String fullPath = resolve(module, path);
+ if (fullPath == null) {
+ logger.error("Failed to add paths to unmounted module " +
module.getName());
+ break;
+ }
+ if (!bundle._pathSet.contains(fullPath)) {
+ QualifiedPath qualifiedPath = new QualifiedPath();
+ qualifiedPath.module = module;
+ qualifiedPath.path = path;
+ qualifiedPath.fullPath = fullPath;
+
+ bundle._pathSet.add(fullPath);
+ bundle._pathList.add(qualifiedPath);
+ }
+ }
+ }
+
+ static public QualifiedPath[] getPaths(String bundleName) {
+ ClientSideResourceBundle bundle = s_bundles.get(bundleName);
+ if (bundle == null) {
+ return new QualifiedPath[] {};
+ } else {
+ QualifiedPath[] paths = new
QualifiedPath[bundle._pathList.size()];
+ bundle._pathList.toArray(paths);
+ return paths;
+ }
+ }
+
+ static protected String resolve(ButterflyModule module, String path) {
+ MountPoint mountPoint = module.getMountPoint();
+ if (mountPoint != null) {
+ String mountPointPath = mountPoint.getMountPoint();
+ if (mountPointPath != null) {
+ StringBuffer sb = new StringBuffer();
+
+ boolean slashed = path.startsWith("/");
+ char[] mountPointChars = mountPointPath.toCharArray();
+
+ sb.append(mountPointChars, 0, slashed ?
mountPointChars.length - 1 : mountPointChars.length);
+ sb.append(path);
+
+ return sb.toString();
+ }
+ }
+ return null;
+ }
+}
=======================================
--- /dev/null
+++ /trunk/main/src/com/google/refine/GridworksServlet.java Wed Sep 22
10:04:10 2010
@@ -0,0 +1,230 @@
+package com.google.refine;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Timer;
+import java.util.TimerTask;
+
+import javax.servlet.ServletConfig;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.google.refine.commands.Command;
+import com.google.refine.io.FileProjectManager;
+
+import edu.mit.simile.butterfly.Butterfly;
+import edu.mit.simile.butterfly.ButterflyModule;
+
+public class GridworksServlet extends Butterfly {
+
+ static private final String VERSION = "1.5";
+
+ private static final long serialVersionUID = 2386057901503517403L;
+
+ private static final String JAVAX_SERVLET_CONTEXT_TEMPDIR
= "javax.servlet.context.tempdir";
+
+ static private GridworksServlet s_singleton;
+ static private File s_dataDir;
+
+ static final private Map<String, Command> commands = new
HashMap<String, Command>();
+
+ // timer for periodically saving projects
+ static private Timer _timer;
+
+ final static Logger logger = LoggerFactory.getLogger("gridworks");
+
+ public static String getVersion() {
+ return VERSION;
+ }
+
+ final static protected long s_autoSavePeriod = 1000 * 60 * 5; // 5
minutes
+
+ static protected class AutoSaveTimerTask extends TimerTask {
+ public void run() {
+ try {
+ ProjectManager.singleton.save(false); // quick,
potentially incomplete save
+ } finally {
+ _timer.schedule(new AutoSaveTimerTask(), s_autoSavePeriod);
+ // we don't use scheduleAtFixedRate because that might
result in
+ // bunched up events when the computer is put in sleep mode
+ }
+ }
+ }
+
+ protected ServletConfig config;
+
+ @Override
+ public void init() throws ServletException {
+ super.init();
+
+ s_singleton = this;
+
+ logger.trace("> initialize");
+
+ String data = getInitParameter("gridworks.data");
+
+ if (data == null) {
+ throw new ServletException("can't find servlet init
config 'gridworks.data', I have to give up initializing");
+ }
+
+ s_dataDir = new File(data);
+ FileProjectManager.initialize(s_dataDir);
+
+ if (_timer == null) {
+ _timer = new Timer("autosave");
+ _timer.schedule(new AutoSaveTimerTask(), s_autoSavePeriod);
+ }
+
+ logger.trace("< initialize");
+ }
+
+ @Override
+ public void destroy() {
+ logger.trace("> destroy");
+
+ // cancel automatic periodic saving and force a complete save.
+ if (_timer != null) {
+ _timer.cancel();
+ _timer = null;
+ }
+ if (ProjectManager.singleton != null) {
+ ProjectManager.singleton.dispose();
+ ProjectManager.singleton = null;
+ }
+
+ this.config = null;
+
+ logger.trace("< destroy");
+
+ super.destroy();
+ }
+
+ @Override
+ public void service(HttpServletRequest request, HttpServletResponse
response) throws ServletException, IOException {
+ if (request.getPathInfo().startsWith("/command/")) {
+ String commandKey = getCommandKey(request);
+ Command command = commands.get(commandKey);
+ if (command != null) {
+ if (request.getMethod().equals("GET")) {
+ logger.trace("> GET {}", commandKey);
+ command.doGet(request, response);
+ logger.trace("< GET {}", commandKey);
+ } else if (request.getMethod().equals("POST")) {
+ logger.trace("> POST {}", commandKey);
+ command.doPost(request, response);
+ logger.trace("< POST {}", commandKey);
+ } else {
+ response.sendError(405);
+ }
+ } else {
+ response.sendError(404);
+ }
+ } else {
+ super.service(request, response);
+ }
+ }
+
+ protected String getCommandKey(HttpServletRequest request) {
+ // A command path has this format:
/command/module-name/command-name/...
+
+ String path =
request.getPathInfo().substring("/command/".length());
+
+ int slash1 = path.indexOf('/');
+ if (slash1 >= 0) {
+ int slash2 = path.indexOf('/', slash1 + 1);
+ if (slash2 > 0) {
+ path = path.substring(0, slash2);
+ }
+ }
+
+ return path;
+ }
+
+ private File tempDir = null;
+
+ public File getTempDir() {
+ if (tempDir == null) {
+ File tempDir = (File)
this.config.getServletContext().getAttribute(JAVAX_SERVLET_CONTEXT_TEMPDIR);
+ if (tempDir == null) {
+ throw new RuntimeException("This app server doesn't
support temp directories");
+ }
+ }
+ return tempDir;
+ }
+
+ public File getTempFile(String name) {
+ return new File(getTempDir(), name);
+ }
+
+ public File getCacheDir(String name) {
+ File dir = new File(new File(s_dataDir, "cache"), name);
+ dir.mkdirs();
+
+ return dir;
+ }
+
+ public String getConfiguration(String name, String def) {
+ return null;
+ }
+
+ /**
+ * Register a single command.
+ *
+ * @param module the module the command belongs to
+ * @param name command verb for command
+ * @param commandObject object implementing the command
+ * @return true if command was loaded and registered successfully
+ */
+ protected boolean registerOneCommand(ButterflyModule module, String
name, Command commandObject) {
+ return registerOneCommand(module.getName() + "/" + name,
commandObject);
+ }
+
+ /**
+ * Register a single command.
+ *
+ * @param path path for command
+ * @param commandObject object implementing the command
+ * @return true if command was loaded and registered successfully
+ */
+ protected boolean registerOneCommand(String path, Command
commandObject) {
+ if (commands.containsKey(path)) {
+ return false;
+ }
+
+ commandObject.init(this);
+ commands.put(path, commandObject);
+
+ return true;
+ }
+
+ // Currently only for test purposes
+ protected boolean unregisterCommand(String verb) {
+ return commands.remove(verb) != null;
+ }
+
+ /**
+ * Register a single command. Used by extensions.
+ *
+ * @param module the module the command belongs to
+ * @param name command verb for command
+ * @param commandObject object implementing the command
+ *
+ * @return true if command was loaded and registered successfully
+ */
+ static public boolean registerCommand(ButterflyModule module, String
commandName, Command commandObject) {
+ return s_singleton.registerOneCommand(module, commandName,
commandObject);
+ }
+
+ static public Class<?> getClass(String className) throws
ClassNotFoundException {
+ if (className.startsWith("com.metaweb.")) {
+ className = "com.google." +
className.substring("com.metaweb.".length());
+ }
+ return Class.forName(className);
+ }
+}
=======================================
--- /dev/null
+++ /trunk/main/src/com/google/refine/InterProjectModel.java Wed Sep 22
10:04:10 2010
@@ -0,0 +1,128 @@
+package com.google.refine;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+
+import com.google.refine.expr.ExpressionUtils;
+import com.google.refine.expr.HasFieldsListImpl;
+import com.google.refine.expr.WrappedRow;
+import com.google.refine.model.Column;
+import com.google.refine.model.Project;
+import com.google.refine.model.Row;
+
+public class InterProjectModel {
+ static public class ProjectJoin {
+ final public long fromProjectID;
+ final public String fromProjectColumnName;
+ final public long toProjectID;
+ final public String toProjectColumnName;
+
+ final public Map<Object, List<Integer>> valueToRowIndices =
+ new HashMap<Object, List<Integer>>();
+
+ ProjectJoin(
+ long fromProjectID,
+ String fromProjectColumnName,
+ long toProjectID,
+ String toProjectColumnName
+ ) {
+ this.fromProjectID = fromProjectID;
+ this.fromProjectColumnName = fromProjectColumnName;
+ this.toProjectID = toProjectID;
+ this.toProjectColumnName = toProjectColumnName;
+ }
+
+ public HasFieldsListImpl getRows(Object value) {
+ if (ExpressionUtils.isNonBlankData(value) &&
valueToRowIndices.containsKey(value)) {
+ Project toProject =
ProjectManager.singleton.getProject(toProjectID);
+ if (toProject != null) {
+ HasFieldsListImpl rows = new HasFieldsListImpl();
+ for (Integer r : valueToRowIndices.get(value)) {
+ Row row = toProject.rows.get(r);
+ rows.add(new WrappedRow(toProject, r, row));
+ }
+
+ return rows;
+ }
+ }
+ return null;
+ }
+ }
+
+ protected Map<String, ProjectJoin> _joins = new HashMap<String,
ProjectJoin>();
+
+ public ProjectJoin getJoin(String fromProject, String fromColumn,
String toProject, String toColumn) {
+ String key = fromProject + ";" + fromColumn + ";" + toProject
+ ";" + toColumn;
+ if (!_joins.containsKey(key)) {
+ ProjectJoin join = new ProjectJoin(
+ ProjectManager.singleton.getProjectID(fromProject),
+ fromColumn,
+ ProjectManager.singleton.getProjectID(toProject),
+ toColumn
+ );
+
+ computeJoin(join);
+
+ _joins.put(key, join);
+ }
+
+ return _joins.get(key);
+ }
+
+ public void flushJoinsInvolvingProject(long projectID) {
+ for (Entry<String, ProjectJoin> entry : _joins.entrySet()) {
+ ProjectJoin join = entry.getValue();
+ if (join.fromProjectID == projectID || join.toProjectID ==
projectID) {
+ _joins.remove(entry.getKey());
+ }
+ }
+ }
+
+ public void flushJoinsInvolvingProjectColumn(long projectID, String
columnName) {
+ for (Entry<String, ProjectJoin> entry : _joins.entrySet()) {
+ ProjectJoin join = entry.getValue();
+ if (join.fromProjectID == projectID &&
join.fromProjectColumnName.equals(columnName) ||
+ join.toProjectID == projectID &&
join.toProjectColumnName.equals(columnName)) {
+ _joins.remove(entry.getKey());
+ }
+ }
+ }
+
+ protected void computeJoin(ProjectJoin join) {
+ if (join.fromProjectID < 0 || join.toProjectID < 0) {
+ return;
+ }
+
+ Project fromProject =
ProjectManager.singleton.getProject(join.fromProjectID);
+ Project toProject =
ProjectManager.singleton.getProject(join.toProjectID);
+ if (fromProject == null || toProject == null) {
+ return;
+ }
+
+ Column fromColumn =
fromProject.columnModel.getColumnByName(join.fromProjectColumnName);
+ Column toColumn =
toProject.columnModel.getColumnByName(join.toProjectColumnName);
+ if (fromColumn == null || toColumn == null) {
+ return;
+ }
+
+ for (Row fromRow : fromProject.rows) {
+ Object value = fromRow.getCellValue(fromColumn.getCellIndex());
+ if (ExpressionUtils.isNonBlankData(value)
&& !join.valueToRowIndices.containsKey(value)) {
+ join.valueToRowIndices.put(value, new
ArrayList<Integer>());
+ }
+ }
+
+ int count = toProject.rows.size();
+ for (int r = 0; r < count; r++) {
+ Row toRow = toProject.rows.get(r);
+
+ Object value = toRow.getCellValue(toColumn.getCellIndex());
+ if (ExpressionUtils.isNonBlankData(value) &&
join.valueToRowIndices.containsKey(value)) {
+ join.valueToRowIndices.get(value).add(r);
+ }
+ }
+ }
+}
=======================================
--- /dev/null
+++ /trunk/main/src/com/google/refine/Jsonizable.java Wed Sep 22 10:04:10
2010
@@ -0,0 +1,16 @@
+package com.google.refine;
+
+import java.util.Properties;
+
+import org.json.JSONException;
+import org.json.JSONWriter;
+
+/**
+ * Interface for streaming out JSON, either into HTTP responses or
+ * serialization files.
+ *
+ * @author dfhuynh
+ */
+public interface Jsonizable {
+ public void write(JSONWriter writer, Properties options) throws
JSONException;
+}
=======================================
--- /dev/null
+++ /trunk/main/src/com/google/refine/ProjectManager.java Wed Sep 22
10:04:10 2010
@@ -0,0 +1,434 @@
+package com.google.refine;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+
+import org.apache.tools.tar.TarOutputStream;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.google.refine.history.HistoryEntryManager;
+import com.google.refine.model.Project;
+import com.google.refine.preference.PreferenceStore;
+import com.google.refine.preference.TopList;
+
+/**
+ * ProjectManager is responsible for loading and saving the workspace and
projects.
+ *
+ *
+ */
+public abstract class ProjectManager {
+ // last n expressions used across all projects
+ static protected final int s_expressionHistoryMax = 100;
+
+ protected Map<Long, ProjectMetadata> _projectsMetadata;
+ protected PreferenceStore _preferenceStore;
+
+ final static Logger logger =
LoggerFactory.getLogger("project_manager");
+
+ /**
+ * What caches the joins between projects.
+ */
+ transient protected InterProjectModel _interProjectModel = new
InterProjectModel();
+
+ /**
+ * Flags
+ */
+ transient protected int _busy = 0; // heavy operations like creating
or importing projects are going on
+
+ /**
+ * While each project's metadata is loaded completely at start-up,
each project's raw data
+ * is loaded only when the project is accessed by the user. This is
because project
+ * metadata is tiny compared to raw project data. This hash map from
project ID to project
+ * is more like a last accessed-last out cache.
+ */
+ transient protected Map<Long, Project> _projects;
+
+ static public ProjectManager singleton;
+
+ protected ProjectManager(){
+ _projectsMetadata = new HashMap<Long, ProjectMetadata>();
+ _preferenceStore = new PreferenceStore();
+ _projects = new HashMap<Long, Project>();
+
+ preparePreferenceStore(_preferenceStore);
+ }
+
+ public void dispose() {
+ save(true); // complete save
+
+ for (Project project : _projects.values()) {
+ if (project != null) {
+ project.dispose();
+ }
+ }
+
+ _projects.clear();
+ _projectsMetadata.clear();
+ }
+
+ /**
+ * Registers the project in the memory of the current session
+ * @param project
+ * @param projectMetadata
+ */
+ public void registerProject(Project project, ProjectMetadata
projectMetadata) {
+ synchronized (this) {
+ _projects.put(project.id, project);
+ _projectsMetadata.put(project.id, projectMetadata);
+ }
+ }
+ //----------Load from data store to memory----------------
+
+ /**
+ * Load project metadata from data storage
+ * @param projectID
+ * @return
+ */
+ public abstract boolean loadProjectMetadata(long projectID);
+
+ /**
+ * Loads a project from the data store into memory
+ * @param id
+ * @return
+ */
+ protected abstract Project loadProject(long id);
+
+ //------------Import and Export from Gridworks archive-----------------
+ /**
+ * Import project from a Gridworks archive
+ * @param projectID
+ * @param inputStream
+ * @param gziped
+ * @throws IOException
+ */
+ public abstract void importProject(long projectID, InputStream
inputStream, boolean gziped) throws IOException;
+
+ /**
+ * Export project to a Gridworks archive
+ * @param projectId
+ * @param tos
+ * @throws IOException
+ */
+ public abstract void exportProject(long projectId, TarOutputStream
tos) throws IOException;
+
+
+ //------------Save to record store------------
+ /**
+ * Saves a project and its metadata to the data store
+ * @param id
+ */
+ public void ensureProjectSaved(long id) {
+ synchronized(this){
+ ProjectMetadata metadata = this.getProjectMetadata(id);
+ if (metadata != null) {
+ try {
+ saveMetadata(metadata, id);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }//FIXME what should be the behaviour if metadata is null?
i.e. not found
+
+ Project project = getProject(id);
+ if (project != null && metadata != null &&
metadata.getModified().after(project.getLastSave())) {
+ try {
+ saveProject(project);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }//FIXME what should be the behaviour if project is null? i.e.
not found or loaded.
+ //FIXME what should happen if the metadata is found, but not
the project? or vice versa?
+ }
+
+ }
+
+ /**
+ * Save project metadata to the data store
+ * @param metadata
+ * @param projectId
+ * @throws Exception
+ */
+ protected abstract void saveMetadata(ProjectMetadata metadata, long
projectId) throws Exception;
+
+ /**
+ * Save project to the data store
+ * @param project
+ */
+ protected abstract void saveProject(Project project);
+
+ /**
+ * Save workspace and all projects to data store
+ * @param allModified
+ */
+ public void save(boolean allModified) {
+ if (allModified || _busy == 0) {
+ saveProjects(allModified);
+ saveWorkspace();
+ }
+ }
+
+ /**
+ * Saves the workspace to the data store
+ */
+ protected abstract void saveWorkspace();
+
+ /**
+ * A utility class to prioritize projects for saving, depending on how
long ago
+ * they have been changed but have not been saved.
+ */
+ static protected class SaveRecord {
+ final Project project;
+ final long overdue;
+
+ SaveRecord(Project project, long overdue) {
+ this.project = project;
+ this.overdue = overdue;
+ }
+ }
+
+ static protected final int s_projectFlushDelay = 1000 * 60 * 60; // 1
hour
+ static protected final int s_quickSaveTimeout = 1000 * 30; // 30 secs
+
+ /**
+ * Saves all projects to the data store
+ * @param allModified
+ */
+ protected void saveProjects(boolean allModified) {
+ List<SaveRecord> records = new ArrayList<SaveRecord>();
+ Date startTimeOfSave = new Date();
+
+ synchronized (this) {
+ for (long id : _projectsMetadata.keySet()) {
+ ProjectMetadata metadata = getProjectMetadata(id);
+ Project project = _projects.get(id); // don't call
getProject() as that will load the project.
+
+ if (project != null) {
+ boolean hasUnsavedChanges =
+ metadata.getModified().getTime() >
project.getLastSave().getTime();
+
+ if (hasUnsavedChanges) {
+ long msecsOverdue = startTimeOfSave.getTime() -
project.getLastSave().getTime();
+
+ records.add(new SaveRecord(project, msecsOverdue));
+
+ } else if (startTimeOfSave.getTime() -
project.getLastSave().getTime() > s_projectFlushDelay) {
+ /*
+ * It's been a while since the project was last
saved and it hasn't been
+ * modified. We can safely remove it from the
cache to save some memory.
+ */
+ _projects.remove(id).dispose();
+ }
+ }
+ }
+ }
+
+ if (records.size() > 0) {
+ Collections.sort(records, new Comparator<SaveRecord>() {
+ public int compare(SaveRecord o1, SaveRecord o2) {
+ if (o1.overdue < o2.overdue) {
+ return 1;
+ } else if (o1.overdue > o2.overdue) {
+ return -1;
+ } else {
+ return 0;
+ }
+ }
+ });
+
+ logger.info(allModified ?
+ "Saving all modified projects ..." :
+ "Saving some modified projects ..."
+ );
+
+ for (int i = 0;
+ i < records.size() &&
+ (allModified || (new Date().getTime() -
startTimeOfSave.getTime() < s_quickSaveTimeout));
+ i++) {
+
+ try {
+ saveProject(records.get(i).project);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+ }
+ }
+
+ //--------------Get from memory--------------
+ /**
+ * Gets the InterProjectModel from memory
+ */
+ public InterProjectModel getInterProjectModel() {
+ return _interProjectModel;
+ }
+
+
+ /**
+ * Gets the project metadata from memory
+ * Requires that the metadata has already been loaded from the data
store
+ * @param id
+ * @return
+ */
+ public ProjectMetadata getProjectMetadata(long id) {
+ return _projectsMetadata.get(id);
+ }
+
+ /**
+ * Gets the project metadata from memory
+ * Requires that the metadata has already been loaded from the data
store
+ * @param name
+ * @return
+ */
+ public ProjectMetadata getProjectMetadata(String name) {
+ for (ProjectMetadata pm : _projectsMetadata.values()) {
+ if (pm.getName().equals(name)) {
+ return pm;
+ }
+ }
+ return null;
+ }
+
+ /**
+ * Tries to find the project id when given a project name
+ * Requires that all project metadata exists has been loaded to memory
from the data store
+ * @param name
+ * The name of the project
+ * @return
+ * The id of the project, or -1 if it cannot be found
+ */
+ public long getProjectID(String name) {
+ for (Entry<Long, ProjectMetadata> entry :
_projectsMetadata.entrySet()) {
+ if (entry.getValue().getName().equals(name)) {
+ return entry.getKey();
+ }
+ }
+ return -1;
+ }
+
+
+ /**
+ * Gets all the project Metadata currently held in memory
+ * @return
+ */
+ public Map<Long, ProjectMetadata> getAllProjectMetadata() {
+ return _projectsMetadata;
+ }
+
+ /**
+ * Gets the required project from the data store
+ * If project does not already exist in memory, it is loaded from the
data store
+ * @param id
+ * the id of the project
+ * @return
+ * the project with the matching id, or null if it can't be found
+ */
+ public Project getProject(long id) {
+ synchronized (this) {
+ if (_projects.containsKey(id)) {
+ return _projects.get(id);
+ } else {
+ Project project = loadProject(id);
+
+ _projects.put(id, project);
+
+ return project;
+ }
+ }
+ }
+
+ /**
+ * Gets the preference store
+ * @return
+ */
+ public PreferenceStore getPreferenceStore() {
+ return _preferenceStore;
+ }
+
+ /**
+ * Gets all expressions from the preference store
+ * @return
+ */
+ public List<String> getExpressions() {
+ return ((TopList)
_preferenceStore.get("scripting.expressions")).getList();
+ }
+
+ /**
+ * The history entry manager deals with changes
+ * @return manager for handling history
+ */
+ public abstract HistoryEntryManager getHistoryEntryManager();
+
+ //-------------remove project-----------
+
+ /**
+ * Remove the project from the data store
+ * @param project
+ */
+ public void deleteProject(Project project) {
+ deleteProject(project.id);
+ }
+
+ /**
+ * Remove project from data store
+ * @param projectID
+ */
+ public abstract void deleteProject(long projectID);
+
+ /**
+ * Removes project from memory
+ * @param projectID
+ */
+ protected void removeProject(long projectID){
+ if (_projects.containsKey(projectID)) {
+ _projects.remove(projectID).dispose();
+ }
+ if (_projectsMetadata.containsKey(projectID)) {
+ _projectsMetadata.remove(projectID);
+ }
+ }
+
+ //--------------Miscellaneous-----------
+
+ /**
+ * Sets the flag for long running operations
+ * @param busy
+ */
+ public void setBusy(boolean busy) {
+ synchronized (this) {
+ if (busy) {
+ _busy++;
+ } else {
+ _busy--;
+ }
+ }
+ }
+
+
+
+ /**
+ * Add the latest expression to the preference store
+ * @param s
+ */
+ public void addLatestExpression(String s) {
+ synchronized (this) {
+ ((TopList)
_preferenceStore.get("scripting.expressions")).add(s);
+ }
+ }
+
+
+ /**
+ *
+ * @param ps
+ */
+ static protected void preparePreferenceStore(PreferenceStore ps) {
+ ps.put("scripting.expressions", new
TopList(s_expressionHistoryMax));
+ }
+}
=======================================
--- /dev/null
+++ /trunk/main/src/com/google/refine/ProjectMetadata.java Wed Sep 22
10:04:10 2010
@@ -0,0 +1,198 @@
+package com.google.refine;
+
+import java.io.Serializable;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Properties;
+
+import org.json.JSONException;
+import org.json.JSONObject;
+import org.json.JSONWriter;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.google.refine.preference.PreferenceStore;
+import com.google.refine.preference.TopList;
+import com.google.refine.util.JSONUtilities;
+import com.google.refine.util.ParsingUtilities;
+
+public class ProjectMetadata implements Jsonizable {
+ private final Date _created;
+ private Date _modified;
+ private String _name;
+ private String _password;
+
+ private String _encoding;
+ private int _encodingConfidence;
+
+ private Map<String, Serializable> _customMetadata = new
HashMap<String, Serializable>();
+ private PreferenceStore _preferenceStore = new
PreferenceStore();
+
+ final Logger logger = LoggerFactory.getLogger("project_metadata");
+
+ protected ProjectMetadata(Date date) {
+ _created = date;
+ preparePreferenceStore(_preferenceStore);
+ }
+
+ public ProjectMetadata() {
+ _created = new Date();
+ _modified = _created;
+ preparePreferenceStore(_preferenceStore);
+ }
+
+ public void write(JSONWriter writer, Properties options)
+ throws JSONException {
+
+ writer.object();
+ writer.key("name"); writer.value(_name);
+ writer.key("created");
writer.value(ParsingUtilities.dateToString(_created));
+ writer.key("modified");
writer.value(ParsingUtilities.dateToString(_modified));
+
+ if ("save".equals(options.getProperty("mode"))) {
+ writer.key("password"); writer.value(_password);
+
+ writer.key("encoding"); writer.value(_encoding);
+ writer.key("encodingConfidence");
writer.value(_encodingConfidence);
+
+ writer.key("customMetadata"); writer.object();
+ for (String key : _customMetadata.keySet()) {
+ Serializable value = _customMetadata.get(key);
+ writer.key(key);
+ writer.value(value);
+ }
+ writer.endObject();
+
+ writer.key("preferences"); _preferenceStore.write(writer,
options);
+ }
+ writer.endObject();
+ }
+
+ public void write(JSONWriter jsonWriter) throws Exception {
+ Properties options = new Properties();
+ options.setProperty("mode", "save");
+
+ write(jsonWriter, options);
+ }
+
+ static public ProjectMetadata loadFromJSON(JSONObject obj) {
+ ProjectMetadata pm = new
ProjectMetadata(JSONUtilities.getDate(obj, "modified", new Date()));
+
+ pm._modified = JSONUtilities.getDate(obj, "modified", new Date());
+ pm._name = JSONUtilities.getString(obj, "name", "<Error recovering
project name>");
+ pm._password = JSONUtilities.getString(obj, "password", "");
+
+ pm._encoding = JSONUtilities.getString(obj, "encoding", "");
+ pm._encodingConfidence =
JSONUtilities.getInt(obj, "encodingConfidence", 0);
+
+ if (obj.has("preferences") && !obj.isNull("preferences")) {
+ try {
+ pm._preferenceStore.load(obj.getJSONObject("preferences"));
+ } catch (JSONException e) {
+ // ignore
+ }
+ }
+
+ if (obj.has("expressions") && !obj.isNull("expressions")) { //
backward compatibility
+ try {
+ ((TopList)
pm._preferenceStore.get("scripting.expressions"))
+ .load(obj.getJSONArray("expressions"));
+ } catch (JSONException e) {
+ // ignore
+ }
+ }
+
+ if (obj.has("customMetadata") && !obj.isNull("customMetadata")) {
+ try {
+ JSONObject obj2 = obj.getJSONObject("customMetadata");
+
+ @SuppressWarnings("unchecked")
+ Iterator<String> keys = obj2.keys();
+ while (keys.hasNext()) {
+ String key = keys.next();
+ Object value = obj2.get(key);
+ if (value != null && value instanceof Serializable) {
+ pm._customMetadata.put(key, (Serializable) value);
+ }
+ }
+ } catch (JSONException e) {
+ // ignore
+ }
+ }
+
+ return pm;
+ }
+
+ static protected void preparePreferenceStore(PreferenceStore ps) {
+ ProjectManager.preparePreferenceStore(ps);
+ // Any project specific preferences?
+ }
+
+ public Date getCreated() {
+ return _created;
+ }
+
+ public void setName(String name) {
+ this._name = name;
+ }
+
+ public String getName() {
+ return _name;
+ }
+
+ public void setEncoding(String encoding) {
+ this._encoding = encoding;
+ }
+
+ public String getEncoding() {
+ return _encoding;
+ }
+
+ public void setEncodingConfidence(int confidence) {
+ this._encodingConfidence = confidence;
+ }
+
+ public void setEncodingConfidence(String confidence) {
+ if (confidence != null) {
+ this.setEncodingConfidence(Integer.parseInt(confidence));
+ }
+ }
+
+ public int getEncodingConfidence() {
+ return _encodingConfidence;
+ }
+
+ public void setPassword(String password) {
+ this._password = password;
+ }
+
+ public String getPassword() {
+ return _password;
+ }
+
+ public Date getModified() {
+ return _modified;
+ }
+
+ public void updateModified() {
+ _modified = new Date();
+ }
+
+ public PreferenceStore getPreferenceStore() {
+ return _preferenceStore;
+ }
+
+ public Serializable getCustomMetadata(String key) {
+ return _customMetadata.get(key);
+ }
+
+ public void setCustomMetadata(String key, Serializable value) {
+ if (value == null) {
+ _customMetadata.remove(key);
+ } else {
+ _customMetadata.put(key, value);
+ }
+ }
+}
=======================================
--- /dev/null
+++ /trunk/main/src/com/google/refine/browsing/DecoratedValue.java Wed Sep
22 10:04:10 2010
@@ -0,0 +1,33 @@
+package com.google.refine.browsing;
+
+import java.util.Properties;
+
+import org.json.JSONException;
+import org.json.JSONWriter;
+
+import com.google.refine.Jsonizable;
+
+/**
+ * Store a value and its text label, in case the value is not a string
itself.
+ * For instance, if a value is a date, then its label can be one particular
+ * rendering of that date.
+ *
+ * Facet choices that are presented to the user as text are stored as
decorated values.
+ */
+public class DecoratedValue implements Jsonizable {
+ final public Object value;
+ final public String label;
+
+ public DecoratedValue(Object value, String label) {
+ this.value = value;
+ this.label = label;
+ }
+
+ public void write(JSONWriter writer, Properties options)
+ throws JSONException {
+ writer.object();
+ writer.key("v"); writer.value(value);
+ writer.key("l"); writer.value(label);
+ writer.endObject();
+ }
+}
=======================================
--- /dev/null
+++ /trunk/main/src/com/google/refine/browsing/Engine.java Wed Sep 22
10:04:10 2010
@@ -0,0 +1,214 @@
+package com.google.refine.browsing;
+
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Properties;
+
+import org.json.JSONArray;
+import org.json.JSONException;
+import org.json.JSONObject;
+import org.json.JSONWriter;
+
+import com.google.refine.Jsonizable;
+import com.google.refine.browsing.facets.Facet;
+import com.google.refine.browsing.facets.ListFacet;
+import com.google.refine.browsing.facets.RangeFacet;
+import com.google.refine.browsing.facets.ScatterplotFacet;
+import com.google.refine.browsing.facets.TextSearchFacet;
+import com.google.refine.browsing.facets.TimeRangeFacet;
+import com.google.refine.browsing.util.ConjunctiveFilteredRecords;
+import com.google.refine.browsing.util.ConjunctiveFilteredRows;
+import com.google.refine.browsing.util.FilteredRecordsAsFilteredRows;
+import com.google.refine.model.Project;
+import com.google.refine.model.Row;
+
+/**
+ * Faceted browsing engine.
+ */
+public class Engine implements Jsonizable {
+ static public enum Mode {
+ RowBased,
+ RecordBased
+ }
+
+ public final static String INCLUDE_DEPENDENT = "includeDependent";
+ public final static String MODE = "mode";
+ public final static String MODE_ROW_BASED = "row-based";
+ public final static String MODE_RECORD_BASED = "record-based";
+
+ protected Project _project;
+ protected List<Facet> _facets = new LinkedList<Facet>();
+ protected Mode _mode = Mode.RowBased;
+
+ static public String modeToString(Mode mode) {
+ return mode == Mode.RowBased ? MODE_ROW_BASED : MODE_RECORD_BASED;
+ }
+ static public Mode stringToMode(String s) {
+ return MODE_ROW_BASED.equals(s) ? Mode.RowBased : Mode.RecordBased;
+ }
+
+ public Engine(Project project) {
+ _project = project;
+ }
+
+ public Mode getMode() {
+ return _mode;
+ }
+ public void setMode(Mode mode) {
+ _mode = mode;
+ }
+
+ public FilteredRows getAllRows() {
+ return new FilteredRows() {
+ @Override
+ public void accept(Project project, RowVisitor visitor) {
+ try {
+ visitor.start(project);
+
+ int c = project.rows.size();
+ for (int rowIndex = 0; rowIndex < c; rowIndex++) {
+ Row row = project.rows.get(rowIndex);
+ visitor.visit(project, rowIndex, row);
+ }
+ } finally {
+ visitor.end(project);
+ }
+ }
+ };
+ }
+
+ public FilteredRows getAllFilteredRows() {
+ return getFilteredRows(null);
+ }
+
+ public FilteredRows getFilteredRows(Facet except) {
+ if (_mode == Mode.RecordBased) {
+ return new FilteredRecordsAsFilteredRows(getFilteredRecords(except));
+ } else if (_mode == Mode.RowBased) {
+ ConjunctiveFilteredRows cfr = new ConjunctiveFilteredRows();
+ for (Facet facet : _facets) {
+ if (facet != except) {
+ RowFilter rowFilter = facet.getRowFilter(_project);
+ if (rowFilter != null) {
+ cfr.add(rowFilter);
+ }
+ }
+ }
+ return cfr;
+ }
+ throw new InternalError("Unknown mode.");
+ }
+
+ public FilteredRecords getAllRecords() {
+ return new FilteredRecords() {
+ @Override
+ public void accept(Project project, RecordVisitor visitor) {
+ try {
+ visitor.start(project);
+
+ int c = project.recordModel.getRecordCount();
+ for (int r = 0; r < c; r++) {
+ visitor.visit(project, project.recordModel.getRecord(r));
+ }
+ } finally {
+ visitor.end(project);
+ }
+ }
+ };
+ }
+
+ public FilteredRecords getFilteredRecords() {
+ return getFilteredRecords(null);
+ }
+
+ public FilteredRecords getFilteredRecords(Facet except) {
+ if (_mode == Mode.RecordBased) {
+ ConjunctiveFilteredRecords cfr = new ConjunctiveFilteredRecords();
+ for (Facet facet : _facets) {
+ if (facet != except) {
+ RecordFilter recordFilter =
facet.getRecordFilter(_project);
+ if (recordFilter != null) {
+ cfr.add(recordFilter);
+ }
+ }
+ }
+ return cfr;
+ }
+ throw new InternalError("This method should not be called when the
engine is not in record mode.");
+ }
+
+ public void initializeFromJSON(JSONObject o) throws Exception {
+ if (o == null) {
+ return;
+ }
+
+ if (o.has("facets") && !o.isNull("facets")) {
+ JSONArray a = o.getJSONArray("facets");
+ int length = a.length();
+
+ for (int i = 0; i < length; i++) {
+ JSONObject fo = a.getJSONObject(i);
+ String type = fo.has("type") ?
fo.getString("type") : "list";
+
+ Facet facet = null;
+ if ("list".equals(type)) {
+ facet = new ListFacet();
+ } else if ("range".equals(type)) {
+ facet = new RangeFacet();
+ } else if ("timerange".equals(type)) {
+ facet = new TimeRangeFacet();
+ } else if ("scatterplot".equals(type)) {
+ facet = new ScatterplotFacet();
+ } else if ("text".equals(type)) {
+ facet = new TextSearchFacet();
+ }
+
+ if (facet != null) {
+ facet.initializeFromJSON(_project, fo);
+ _facets.add(facet);
+ }
+ }
+ }
+
+ // for backward compatibility
+ if (o.has(INCLUDE_DEPENDENT) && !o.isNull(INCLUDE_DEPENDENT)) {
+ _mode = o.getBoolean(INCLUDE_DEPENDENT) ? Mode.RecordBased :
Mode.RowBased;
+ }
+
+ if (o.has(MODE) && !o.isNull(MODE)) {
+ _mode = MODE_ROW_BASED.equals(o.getString(MODE)) ?
Mode.RowBased : Mode.RecordBased;
+ }
+ }
+
+ public void computeFacets() throws JSONException {
+ if (_mode == Mode.RowBased) {
+ for (Facet facet : _facets) {
+ FilteredRows filteredRows = getFilteredRows(facet);
+
+ facet.computeChoices(_project, filteredRows);
+ }
+ } else if (_mode == Mode.RecordBased) {
+ for (Facet facet : _facets) {
+ FilteredRecords filteredRecords = getFilteredRecords(facet);
+
+ facet.computeChoices(_project, filteredRecords);
+ }
+ } else {
+ throw new InternalError("Unknown mode.");
+ }
+ }
+
+ public void write(JSONWriter writer, Properties options)
+ throws JSONException {
+
+ writer.object();
+ writer.key("facets");
+ writer.array();
+ for (Facet facet : _facets) {
+ facet.write(writer, options);
+ }
+ writer.endArray();
+ writer.key(MODE); writer.value(_mode == Mode.RowBased ?
MODE_ROW_BASED : MODE_RECORD_BASED);
+ writer.endObject();
+ }
+}
=======================================
--- /dev/null
+++ /trunk/main/src/com/google/refine/browsing/FilteredRecords.java Wed Sep
22 10:04:10 2010
@@ -0,0 +1,18 @@
+package com.google.refine.browsing;
+
+import com.google.refine.model.Project;
+
+/**
+ * Interface for anything that can decide which records match and which
don't
+ * based on some particular criteria.
+ */
+public interface FilteredRecords {
+ /**
+ * Go through the records of the given project, determine which match
and which don't,
+ * and call visitor.visit() on those that match
+ *
+ * @param project
+ * @param visitor
+ */
+ public void accept(Project project, RecordVisitor visitor);
+}
=======================================
--- /dev/null
+++ /trunk/main/src/com/google/refine/browsing/FilteredRows.java Wed Sep 22
10:04:10 2010
@@ -0,0 +1,19 @@
+package com.google.refine.browsing;
+
+import com.google.refine.model.Project;
+
+/**
+ * Interface for anything that can decide which rows match and which rows
don't match
+ * based on some particular criteria.
+ */
+public interface FilteredRows {
+ /**
+ * Go through the rows of the given project, determine which match and
which don't,
+ * and call visitor.visit() on those that match, and possibly their
context and
+ * dependent rows.
+ *
+ * @param project
+ * @param visitor
+ */
+ public void accept(Project project, RowVisitor visitor);
+}
=======================================
--- /dev/null
+++ /trunk/main/src/com/google/refine/browsing/RecordFilter.java Wed Sep 22
10:04:10 2010
@@ -0,0 +1,12 @@
+package com.google.refine.browsing;
+
+import com.google.refine.model.Project;
+import com.google.refine.model.Record;
+
+/**
+ * Interface for judging if a particular record matches or doesn't match
some
+ * particular criterion, such as a facet constraint.
+ */
+public interface RecordFilter {
+ public boolean filterRecord(Project project, Record record);
+}
=======================================
--- /dev/null
+++ /trunk/main/src/com/google/refine/browsing/RecordVisitor.java Wed Sep
22 10:04:10 2010
@@ -0,0 +1,19 @@
+package com.google.refine.browsing;
+
+import com.google.refine.model.Project;
+import com.google.refine.model.Record;
+
+/**
+ * Interface for visiting records one by one. The records visited are only
those that match some
+ * particular criteria, such as facets' constraints.
+ */
+public interface RecordVisitor {
+ public void start(Project project); // called before any visit() call
+
+ public boolean visit(
+ Project project,
+ Record record
+ );
+
+ public void end(Project project); // called after all visit() calls
+}
=======================================
--- /dev/null
+++ /trunk/main/src/com/google/refine/browsing/RowFilter.java Wed Sep 22
10:04:10 2010
@@ -0,0 +1,12 @@
+package com.google.refine.browsing;
+
+import com.google.refine.model.Project;
+import com.google.refine.model.Row;
+
+/**
+ * Interface for judging if a particular row matches or doesn't match some
+ * particular criterion, such as a facet constraint.
+ */
+public interface RowFilter {
+ public boolean filterRow(Project project, int rowIndex, Row row);
+}
=======================================
--- /dev/null
+++ /trunk/main/src/com/google/refine/browsing/RowVisitor.java Wed Sep 22
10:04:10 2010
@@ -0,0 +1,20 @@
+package com.google.refine.browsing;
+
+import com.google.refine.model.Project;
+import com.google.refine.model.Row;
+
+/**
+ * Interface for visiting rows one by one. The rows visited are only those
that match some
+ * particular criteria, such as facets' constraints.
+ */
+public interface RowVisitor {
+ public void start(Project project); // called before any visit() call
+
+ public boolean visit(
+ Project project,
+ int rowIndex, // zero-based row index
+ Row row
+ );
+
+ public void end(Project project); // called after all visit() calls
+}
=======================================
--- /dev/null
+++ /trunk/main/src/com/google/refine/clustering/Clusterer.java Wed Sep 22
10:04:10 2010
@@ -0,0 +1,29 @@
+package com.google.refine.clustering;
+
+import org.json.JSONObject;
+
+import com.google.refine.Jsonizable;
+import com.google.refine.browsing.Engine;
+import com.google.refine.model.Column;
+import com.google.refine.model.Project;
+
+public abstract class Clusterer implements Jsonizable {
+
+ protected Project _project;
+ protected int _colindex;
+ protected JSONObject _config;
+
+ public abstract void computeClusters(Engine engine);
+
+ public void initializeFromJSON(Project project, JSONObject o) throws
Exception {
+ _project = project;
+ _config = o;
+
+ String colname = o.getString("column");
+ for (Column column : project.columnModel.columns) {
+ if (column.getName().equals(colname)) {
+ _colindex = column.getCellIndex();
+ }
+ }
+ }
+}
=======================================
--- /dev/null
+++ /trunk/main/src/com/google/refine/commands/Command.java Wed Sep 22
10:04:10 2010
@@ -0,0 +1,272 @@
+package com.google.refine.commands;
+
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.io.StringWriter;
+import java.io.Writer;
+import java.util.Properties;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.json.JSONException;
+import org.json.JSONObject;
+import org.json.JSONWriter;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.google.refine.GridworksServlet;
+import com.google.refine.Jsonizable;
+import com.google.refine.ProjectManager;
+import com.google.refine.ProjectMetadata;
+import com.google.refine.browsing.Engine;
+import com.google.refine.history.HistoryEntry;
+import com.google.refine.model.Project;
+import com.google.refine.process.Process;
+import com.google.refine.util.ParsingUtilities;
+
+/**
+ * The super class of all calls that the client side can invoke, most of
which
+ * are AJAX calls.
+ */
+public abstract class Command {
+
+ final static protected Logger logger =
LoggerFactory.getLogger("command");
+
+ protected GridworksServlet servlet;
+
+ public void init(GridworksServlet servlet) {
+ this.servlet = servlet;
+ }
+
+ public void doPost(HttpServletRequest request, HttpServletResponse
response)
+ throws ServletException, IOException {
+
+ throw new UnsupportedOperationException();
+ };
+
+ public void doGet(HttpServletRequest request, HttpServletResponse
response)
+ throws ServletException, IOException {
+
+ throw new UnsupportedOperationException();
+ };
+
+ /**
+ * Utility function to get the browsing engine's configuration as a
JSON object
+ * from the "engine" request parameter, most often in the POST body.
+ *
+ * @param request
+ * @return
+ * @throws JSONException
+ */
+ static protected JSONObject getEngineConfig(HttpServletRequest request)
+ throws JSONException {
+ if (request == null) throw new
IllegalArgumentException("parameter 'request' should not be null");
+
+ String json = request.getParameter("engine");
+ try{
+ return (json == null) ? null :
ParsingUtilities.evaluateJsonStringToObject(json);
+ } catch (JSONException e){
+ logger.debug( json + " could not be parsed to JSON");
+ return null;
+ }
+ }
+
+ /**
+ * Utility function to reconstruct the browsing engine from
the "engine" request parameter,
+ * most often in the POST body.
+ *
+ * @param request
+ * @param project
+ * @return
+ * @throws Exception
+ */
+ static protected Engine getEngine(HttpServletRequest request, Project
project)
+ throws Exception {
+ if (request == null) throw new
IllegalArgumentException("parameter 'request' should not be null");
+ if (project == null) throw new
IllegalArgumentException("parameter 'project' should not be null");
+
+ Engine engine = new Engine(project);
+ JSONObject o = getEngineConfig(request);
+ if (o != null)
+ engine.initializeFromJSON(o);
+ return engine;
+ }
+
+ /**
+ * Utility method for retrieving the Project object having the ID
specified
+ * in the "project" URL parameter.
+ *
+ * @param request
+ * @return
+ * @throws ServletException
+ */
+ protected Project getProject(HttpServletRequest request) throws
ServletException {
+ if (request == null) throw new
IllegalArgumentException("parameter 'request' should not be null");
+ try {
+ Project p =
ProjectManager.singleton.getProject(Long.parseLong(request.getParameter("project")));
+ if (p != null) {
+ return p;
+ }
+ } catch (Exception e) {
+ // ignore
+ }
+ throw new ServletException("Can't find project: missing or bad URL
parameter");
+ }
+
+ /**
+ * Utility method for retrieving the ProjectMetadata object having the
ID specified
+ * in the "project" URL parameter.
+ *
+ * @param request
+ * @return
+ * @throws ServletException
+ */
+ protected ProjectMetadata getProjectMetadata(HttpServletRequest
request) throws ServletException {
+ if (request == null) throw new
IllegalArgumentException("parameter 'request' should not be null");
+ try {
+ ProjectMetadata pm =
ProjectManager.singleton.getProjectMetadata(Long.parseLong(request.getParameter("project")));
+ if (pm != null) {
+ return pm;
+ }
+ } catch (Exception e) {
+ // ignore
+ }
+ throw new ServletException("Can't find project metadata: missing
or bad URL parameter");
+ }
+
+ static protected int getIntegerParameter(HttpServletRequest request,
String name, int def) {
+ if (request == null) throw new
IllegalArgumentException("parameter 'request' should not be null");
+ try {
+ return Integer.parseInt(request.getParameter(name));
+ } catch (Exception e) {
+ // ignore
+ }
+ return def;
+ }
+
+ static protected JSONObject getJsonParameter(HttpServletRequest
request, String name) {
+ if (request == null) throw new
IllegalArgumentException("parameter 'request' should not be null");
+ String value = request.getParameter(name);
+ if (value != null) {
+ try {
+ return ParsingUtilities.evaluateJsonStringToObject(value);
+ } catch (JSONException e) {
+ logger.warn("error getting json parameter",e);
+ }
+ }
+ return null;
+ }
+
+ static protected void performProcessAndRespond(
+ HttpServletRequest request,
+ HttpServletResponse response,
+ Project project,
+ Process process
+ ) throws Exception {
+ response.setCharacterEncoding("UTF-8");
+ response.setHeader("Content-Type", "application/json");
+
+ HistoryEntry historyEntry =
project.processManager.queueProcess(process);
+ if (historyEntry != null) {
+ Writer w = response.getWriter();
+ JSONWriter writer = new JSONWriter(w);
+ Properties options = new Properties();
+
+ writer.object();
+ writer.key("code"); writer.value("ok");
+ writer.key("historyEntry"); historyEntry.write(writer,
options);
+ writer.endObject();
+
+ w.flush();
+ w.close();
+ } else {
+ respond(response, "{ \"code\" : \"pending\" }");
+ }
+ }
+
+ static protected void respond(HttpServletResponse response, String
content)
+ throws IOException, ServletException {
+
+ response.setCharacterEncoding("UTF-8");
+ response.setStatus(HttpServletResponse.SC_OK);
+ Writer w = response.getWriter();
+ if (w != null) {
+ w.write(content);
+ w.flush();
+ w.close();
+ } else {
+ throw new ServletException("response returned a null writer");
+ }
+ }
+
+ static protected void respond(HttpServletResponse response, String
status, String message)
+ throws IOException, JSONException {
+
+ Writer w = response.getWriter();
+ JSONWriter writer = new JSONWriter(w);
+ writer.object();
+ writer.key("status"); writer.value(status);
+ writer.key("message"); writer.value(message);
+ writer.endObject();
+ w.flush();
+ w.close();
+ }
+
+ static protected void respondJSON(HttpServletResponse response,
Jsonizable o)
+ throws IOException, JSONException {
+
+ respondJSON(response, o, new Properties());
+ }
+
+ static protected void respondJSON(
+ HttpServletResponse response, Jsonizable o, Properties options)
+ throws IOException, JSONException {
+
+ response.setCharacterEncoding("UTF-8");
+ response.setHeader("Content-Type", "application/json");
+
+ Writer w = response.getWriter();
+ JSONWriter writer = new JSONWriter(w);
+
+ o.write(writer, options);
+ w.flush();
+ w.close();
+ }
+
+ static protected void respondException(HttpServletResponse response,
Exception e)
+ throws IOException, ServletException {
+
+ logger.warn("Exception caught", e);
+
+ if (response == null) {
+ throw new ServletException("Response object can't be null");
+ }
+
+ try {
+ JSONObject o = new JSONObject();
+ o.put("code", "error");
+ o.put("message", e.getMessage());
+
+ StringWriter sw = new StringWriter();
+ PrintWriter pw = new PrintWriter(sw);
+ e.printStackTrace(pw);
+ pw.flush();
+ sw.flush();
+
+ o.put("stack", sw.toString());
+
+ response.setCharacterEncoding("UTF-8");
+ response.setHeader("Content-Type", "application/json");
+ respond(response, o.toString());
+ } catch (JSONException e1) {
+ e.printStackTrace(response.getWriter());
+ }
+ }
+
+ static protected void redirect(HttpServletResponse response, String
url) throws IOException {
+ response.sendRedirect(url);
+ }
+
+}
=======================================
--- /dev/null
+++ /trunk/main/src/com/google/refine/commands/EngineDependentCommand.java
Wed Sep 22 10:04:10 2010
@@ -0,0 +1,56 @@
+package com.google.refine.commands;
+
+import java.io.IOException;
+import java.util.Properties;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.json.JSONObject;
+
+import com.google.refine.model.AbstractOperation;
+import com.google.refine.model.Project;
+import com.google.refine.process.Process;
+
+/**
+ * Convenient super class for commands that perform abstract operations on
+ * only the filtered rows based on the faceted browsing engine's
configuration
+ * on the client side.
+ *
+ * The engine's configuration is passed over as a POST body parameter. It
is
+ * retrieved, de-serialized, and used to construct the abstract operation.
+ * The operation is then used to construct a process. The process is then
+ * queued for execution. If the process is not long running and there is no
+ * other queued process, then it gets executed right away, resulting in
some
+ * change to the history. Otherwise, it is pending. The client side can
+ * decide how to update its UI depending on whether the process is done or
+ * still pending.
+ *
+ * Note that there are interactions on the client side that change only
+ * individual cells or individual rows (such as starring one row or editing
+ * the text of one cell). These interactions do not depend on the faceted
+ * browsing engine's configuration, and so they don't invoke commands that
+ * subclass this class. See AnnotateOneRowCommand and EditOneCellCommand as
+ * examples.
+ */
+abstract public class EngineDependentCommand extends Command {
+ @Override
+ public void doPost(HttpServletRequest request, HttpServletResponse
response)
+ throws ServletException, IOException {
+
+ try {
+ Project project = getProject(request);
+
+ AbstractOperation op = createOperation(project, request,
getEngineConfig(request));
+ Process process = op.createProcess(project, new Properties());
+
+ performProcessAndRespond(request, response, project, process);
+ } catch (Exception e) {
+ respondException(response, e);
+ }
+ }
+
+ abstract protected AbstractOperation createOperation(
+ Project project, HttpServletRequest request, JSONObject
engineConfig) throws Exception;
+}
=======================================
--- /dev/null
+++
/trunk/main/src/com/google/refine/commands/GetAllPreferencesCommand.java
Wed Sep 22 10:04:10 2010
@@ -0,0 +1,48 @@
+package com.google.refine.commands;
+
+import java.io.IOException;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.json.JSONException;
+import org.json.JSONWriter;
+
+import com.google.refine.ProjectManager;
+import com.google.refine.model.Project;
+import com.google.refine.preference.PreferenceStore;
+
+public class GetAllPreferencesCommand extends Command {
+ @Override
+ public void doPost(HttpServletRequest request, HttpServletResponse
response)
+ throws ServletException, IOException {
+
+ Project project = request.getParameter("project") != null ?
getProject(request) : null;
+ PreferenceStore ps = project != null ?
+ project.getMetadata().getPreferenceStore() :
+ ProjectManager.singleton.getPreferenceStore();
+
+ try {
+ response.setCharacterEncoding("UTF-8");
+ response.setHeader("Content-Type", "application/json");
+
+ JSONWriter writer = new JSONWriter(response.getWriter());
+
+ writer.object();
+
+ for (String key : ps.getKeys()) {
+ Object pref = ps.get(key);
+ if (pref == null || pref instanceof String || pref
instanceof Number || pref instanceof Boolean) {
+ writer.key(key);
+ writer.value(pref);
+ }
+ }
+
+ writer.endObject();
+ } catch (JSONException e) {
+ respondException(response, e);
+ }
+ }
+
+}
=======================================
--- /dev/null
+++ /trunk/main/src/com/google/refine/commands/GetPreferenceCommand.java
Wed Sep 22 10:04:10 2010
@@ -0,0 +1,54 @@
+package com.google.refine.commands;
+
+import java.io.IOException;
+import java.util.Properties;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.json.JSONException;
+import org.json.JSONWriter;
+
+import com.google.refine.ProjectManager;
+import com.google.refine.model.Project;
+import com.google.refine.preference.PreferenceStore;
+import com.google.refine.preference.TopList;
+
+public class GetPreferenceCommand extends Command {
+ @Override
+ public void doGet(HttpServletRequest request, HttpServletResponse
response)
+ throws ServletException, IOException {
+
+ Project project = request.getParameter("project") != null ?
getProject(request) : null;
+ PreferenceStore ps = project != null ?
+ project.getMetadata().getPreferenceStore() :
+ ProjectManager.singleton.getPreferenceStore();
+
+ String prefName = request.getParameter("name");
+ Object pref = ps.get(prefName);
+
+ try {
+ response.setCharacterEncoding("UTF-8");
+ response.setHeader("Content-Type", "application/json");
+
+ JSONWriter writer = new JSONWriter(response.getWriter());
+
+ writer.object();
+ writer.key("value");
+ if (pref == null || pref instanceof String || pref instanceof
Number || pref instanceof Boolean) {
+ writer.value(pref);
+ } else if (pref instanceof TopList) {
+ TopList tl = (TopList) pref;
+ tl.write(writer, new Properties());
+ } else {
+ writer.value(pref.toString());
+ }
+
+ writer.endObject();
+ } catch (JSONException e) {
+ respondException(response, e);
+ }
+ }
+
+}
=======================================
--- /dev/null
+++ /trunk/main/src/com/google/refine/commands/OpenWorkspaceDirCommand.java
Wed Sep 22 10:04:10 2010
@@ -0,0 +1,37 @@
+package com.google.refine.commands;
+
+import java.io.File;
+import java.io.IOException;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import com.google.refine.ProjectManager;
+import com.google.refine.io.FileProjectManager;
+
+public class OpenWorkspaceDirCommand extends Command {
+ @Override
+ public void doPost(HttpServletRequest request, HttpServletResponse
response)
+ throws ServletException, IOException {
+
+ String serverName = request.getServerName();
+
+ if (!"127.0.0.1".equals(serverName)
&& !"localhost".equals(serverName)) {
+ respond(response, "{ \"code\" : \"error\", \"message\" :
\"Workspace directory can only be opened on the local machine where
Gridworks is run.\" }");
+ } else if (ProjectManager.singleton instanceof FileProjectManager)
{
+ File dir = ((FileProjectManager)
ProjectManager.singleton).getWorkspaceDir();
+
+ Runtime.getRuntime().exec(
+ "open .",
+ new String[] {},
+ dir
+ );
+
+ respond(response, "{ \"code\" : \"ok\" }");
+ } else {
+ respond(response, "{ \"code\" : \"error\", \"message\" :
\"Workspace is not stored on the file system.\" }");
+ }
+ }
+
+}
=======================================
--- /dev/null
+++ /trunk/main/src/com/google/refine/commands/SetPreferenceCommand.java
Wed Sep 22 10:04:10 2010
@@ -0,0 +1,40 @@
+package com.google.refine.commands;
+
+import java.io.IOException;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.json.JSONException;
+import org.json.JSONTokener;
+
+import com.google.refine.ProjectManager;
+import com.google.refine.model.Project;
+import com.google.refine.preference.PreferenceStore;
+
+public class SetPreferenceCommand extends Command {
+ @Override
+ public void doPost(HttpServletRequest request, HttpServletResponse
response)
+ throws ServletException, IOException {
+
+ Project project = request.getParameter("project") != null ?
getProject(request) : null;
+ PreferenceStore ps = project != null ?
+ project.getMetadata().getPreferenceStore() :
+ ProjectManager.singleton.getPreferenceStore();
+
+ String prefName = request.getParameter("name");
+ String valueString = request.getParameter("value");
+
+ try {
+ Object o = valueString == null ? null : new
JSONTokener(valueString).nextValue();
+
+ ps.put(prefName, PreferenceStore.loadObject(o));
+
+ respond(response, "{ \"code\" : \"ok\" }");
+ } catch (JSONException e) {
+ respondException(response, e);
+ }
+ }
+
+}
=======================================
***Additional files exist in this changeset.***

Reply all
Reply to author
Forward
0 new messages