Revert bad commit r1600
git-svn-id: http://google-refine.googlecode.com/svn/trunk@1601 7d457c2a-affb-35e4-300a-418c747d4874
This commit is contained in:
parent
79c00bab36
commit
7dcd0c073d
@ -1,6 +1,6 @@
|
|||||||
var html = "text/html";
|
var html = "text/html";
|
||||||
var encoding = "UTF-8";
|
var encoding = "UTF-8";
|
||||||
var version="0.2";
|
var version="0.2"
|
||||||
var ClientSideResourceManager = Packages.com.google.refine.ClientSideResourceManager;
|
var ClientSideResourceManager = Packages.com.google.refine.ClientSideResourceManager;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -1,261 +0,0 @@
|
|||||||
package com.google.refine.extension.gdata;
|
|
||||||
|
|
||||||
import java.io.BufferedReader;
|
|
||||||
import java.io.FileReader;
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.net.URL;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Properties;
|
|
||||||
|
|
||||||
import org.slf4j.Logger;
|
|
||||||
import org.slf4j.LoggerFactory;
|
|
||||||
|
|
||||||
import com.google.gdata.client.spreadsheet.FeedURLFactory;
|
|
||||||
import com.google.gdata.client.spreadsheet.SpreadsheetQuery;
|
|
||||||
import com.google.gdata.client.spreadsheet.SpreadsheetService;
|
|
||||||
import com.google.gdata.client.spreadsheet.WorksheetQuery;
|
|
||||||
import com.google.gdata.data.Link;
|
|
||||||
import com.google.gdata.data.spreadsheet.CellEntry;
|
|
||||||
import com.google.gdata.data.spreadsheet.CellFeed;
|
|
||||||
import com.google.gdata.data.spreadsheet.SpreadsheetEntry;
|
|
||||||
import com.google.gdata.data.spreadsheet.SpreadsheetFeed;
|
|
||||||
import com.google.gdata.data.spreadsheet.WorksheetEntry;
|
|
||||||
import com.google.gdata.data.spreadsheet.WorksheetFeed;
|
|
||||||
import com.google.refine.browsing.Engine;
|
|
||||||
import com.google.refine.browsing.FilteredRows;
|
|
||||||
import com.google.refine.browsing.RowVisitor;
|
|
||||||
import com.google.refine.exporters.UrlExporter;
|
|
||||||
import com.google.refine.model.Cell;
|
|
||||||
import com.google.refine.model.Project;
|
|
||||||
import com.google.refine.model.Row;
|
|
||||||
|
|
||||||
|
|
||||||
public class GDataExporter implements UrlExporter {
|
|
||||||
|
|
||||||
final static Logger logger = LoggerFactory.getLogger("CsvExporter");
|
|
||||||
|
|
||||||
private SpreadsheetService service;
|
|
||||||
|
|
||||||
private FeedURLFactory factory;
|
|
||||||
|
|
||||||
public GDataExporter() throws Exception {
|
|
||||||
factory = FeedURLFactory.getDefault();
|
|
||||||
service = new SpreadsheetService("");
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates a client object for which the provided username and password
|
|
||||||
* produces a valid authentication.
|
|
||||||
*
|
|
||||||
* @param username the Google service user name
|
|
||||||
* @param password the corresponding password for the user name
|
|
||||||
* @throws Exception if error is encountered, such as invalid username and
|
|
||||||
* password pair
|
|
||||||
*/
|
|
||||||
public GDataExporter(String username, String password) throws Exception {
|
|
||||||
this();
|
|
||||||
service.setUserCredentials(username, password);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void export(Project project, Properties options, Engine engine, URL url) throws IOException {
|
|
||||||
{
|
|
||||||
RowVisitor visitor = new RowVisitor() {
|
|
||||||
|
|
||||||
boolean columnHeader = true; //the first row should also add the column headers
|
|
||||||
|
|
||||||
public boolean visit(Project project, int rowIndex, Row row) {
|
|
||||||
String[] vals = null;
|
|
||||||
|
|
||||||
if( columnHeader ){
|
|
||||||
String[] cols = new String[project.columnModel.columns.size()];
|
|
||||||
for(int i = 0; i < cols.length; i++){
|
|
||||||
cols[i] = project.columnModel.columns.get(i).getName();
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO: Write out column headers
|
|
||||||
|
|
||||||
columnHeader = false; //switch off flag
|
|
||||||
}
|
|
||||||
|
|
||||||
vals = new String[row.cells.size()];
|
|
||||||
for(int i = 0; i < vals.length; i++){
|
|
||||||
Cell cell = row.cells.get(i);
|
|
||||||
if(cell != null){
|
|
||||||
vals[i] = row.cells.get(i).value.toString();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// TODO: Write out values
|
|
||||||
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void start(Project project) {
|
|
||||||
// nothing to do
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void end(Project project) {
|
|
||||||
// Clean up
|
|
||||||
}
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
FilteredRows filteredRows = engine.getAllFilteredRows();
|
|
||||||
filteredRows.accept(project, visitor);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getContentType() {
|
|
||||||
return "application/x-unknown";
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets the SpreadsheetEntry for the first spreadsheet with that name
|
|
||||||
* retrieved in the feed.
|
|
||||||
*
|
|
||||||
* @param spreadsheet the name of the spreadsheet
|
|
||||||
* @return the first SpreadsheetEntry in the returned feed, so latest
|
|
||||||
* spreadsheet with the specified name
|
|
||||||
* @throws Exception if error is encountered, such as no spreadsheets with the
|
|
||||||
* name
|
|
||||||
*/
|
|
||||||
public SpreadsheetEntry getSpreadsheet(String spreadsheet)
|
|
||||||
throws Exception {
|
|
||||||
|
|
||||||
SpreadsheetQuery spreadsheetQuery
|
|
||||||
= new SpreadsheetQuery(factory.getSpreadsheetsFeedUrl());
|
|
||||||
spreadsheetQuery.setTitleQuery(spreadsheet);
|
|
||||||
SpreadsheetFeed spreadsheetFeed = service.query(spreadsheetQuery,
|
|
||||||
SpreadsheetFeed.class);
|
|
||||||
List<SpreadsheetEntry> spreadsheets = spreadsheetFeed.getEntries();
|
|
||||||
if (spreadsheets.isEmpty()) {
|
|
||||||
throw new Exception("No spreadsheets with that name");
|
|
||||||
}
|
|
||||||
|
|
||||||
return spreadsheets.get(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the WorksheetEntry for the worksheet in the spreadsheet with the
|
|
||||||
* specified name.
|
|
||||||
*
|
|
||||||
* @param spreadsheet the name of the spreadsheet
|
|
||||||
* @param worksheet the name of the worksheet in the spreadsheet
|
|
||||||
* @return worksheet with the specified name in the spreadsheet with the
|
|
||||||
* specified name
|
|
||||||
* @throws Exception if error is encountered, such as no spreadsheets with the
|
|
||||||
* name, or no worksheet wiht the name in the spreadsheet
|
|
||||||
*/
|
|
||||||
public WorksheetEntry getWorksheet(String spreadsheet, String worksheet)
|
|
||||||
throws Exception {
|
|
||||||
|
|
||||||
SpreadsheetEntry spreadsheetEntry = getSpreadsheet(spreadsheet);
|
|
||||||
|
|
||||||
WorksheetQuery worksheetQuery
|
|
||||||
= new WorksheetQuery(spreadsheetEntry.getWorksheetFeedUrl());
|
|
||||||
|
|
||||||
worksheetQuery.setTitleQuery(worksheet);
|
|
||||||
WorksheetFeed worksheetFeed = service.query(worksheetQuery,
|
|
||||||
WorksheetFeed.class);
|
|
||||||
List<WorksheetEntry> worksheets = worksheetFeed.getEntries();
|
|
||||||
if (worksheets.isEmpty()) {
|
|
||||||
throw new Exception("No worksheets with that name in spreadhsheet "
|
|
||||||
+ spreadsheetEntry.getTitle().getPlainText());
|
|
||||||
}
|
|
||||||
|
|
||||||
return worksheets.get(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Clears all the cell entries in the worksheet.
|
|
||||||
*
|
|
||||||
* @param spreadsheet the name of the spreadsheet
|
|
||||||
* @param worksheet the name of the worksheet
|
|
||||||
* @throws Exception if error is encountered, such as bad permissions
|
|
||||||
*/
|
|
||||||
public void purgeWorksheet(String spreadsheet, String worksheet)
|
|
||||||
throws Exception {
|
|
||||||
|
|
||||||
WorksheetEntry worksheetEntry = getWorksheet(spreadsheet, worksheet);
|
|
||||||
CellFeed cellFeed = service.getFeed(worksheetEntry.getCellFeedUrl(),
|
|
||||||
CellFeed.class);
|
|
||||||
|
|
||||||
List<CellEntry> cells = cellFeed.getEntries();
|
|
||||||
for (CellEntry cell : cells) {
|
|
||||||
Link editLink = cell.getEditLink();
|
|
||||||
service.delete(new URL(editLink.getHref()));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Inserts a cell entry in the worksheet.
|
|
||||||
*
|
|
||||||
* @param spreadsheet the name of the spreadsheet
|
|
||||||
* @param worksheet the name of the worksheet
|
|
||||||
* @param row the index of the row
|
|
||||||
* @param column the index of the column
|
|
||||||
* @param input the input string for the cell
|
|
||||||
* @throws Exception if error is encountered, such as bad permissions
|
|
||||||
*/
|
|
||||||
public void insertCellEntry(String spreadsheet, String worksheet,
|
|
||||||
int row, int column, String input) throws Exception {
|
|
||||||
|
|
||||||
URL cellFeedUrl = getWorksheet(spreadsheet, worksheet).getCellFeedUrl();
|
|
||||||
|
|
||||||
CellEntry newEntry = new CellEntry(row, column, input);
|
|
||||||
|
|
||||||
service.insert(cellFeedUrl, newEntry);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Main entry point. Parses arguments and creates and invokes the
|
|
||||||
* ImportClient.
|
|
||||||
*/
|
|
||||||
public void main(String[] args) throws Exception {
|
|
||||||
|
|
||||||
String username = "user";
|
|
||||||
String password = "pass";
|
|
||||||
String filename = "file";
|
|
||||||
String spreadsheet = "spreadsheet";
|
|
||||||
String worksheet = "worksheet";
|
|
||||||
|
|
||||||
GDataExporter client = new GDataExporter(username, password);
|
|
||||||
|
|
||||||
client.purgeWorksheet(spreadsheet, worksheet);
|
|
||||||
|
|
||||||
BufferedReader reader = null;
|
|
||||||
try {
|
|
||||||
reader = new BufferedReader(new FileReader(filename));
|
|
||||||
String line = reader.readLine();
|
|
||||||
int row = 0;
|
|
||||||
while (line != null) {
|
|
||||||
|
|
||||||
// Break up the line by the delimiter and insert the cells
|
|
||||||
String[] cells = {};//delim.split(line, -1);
|
|
||||||
for (int col = 0; col < cells.length; col++) {
|
|
||||||
client.insertCellEntry(spreadsheet, worksheet,
|
|
||||||
row + 1, col + 1, cells[col]);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Advance the loop
|
|
||||||
line = reader.readLine();
|
|
||||||
row++;
|
|
||||||
}
|
|
||||||
} catch (Exception e) {
|
|
||||||
throw e;
|
|
||||||
} finally {
|
|
||||||
if (reader != null) {
|
|
||||||
reader.close();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,7 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
|
||||||
<?eclipse-pydev version="1.0"?>
|
|
||||||
|
|
||||||
<pydev_project>
|
|
||||||
<pydev_property name="org.python.pydev.PYTHON_PROJECT_INTERPRETER">Default</pydev_property>
|
|
||||||
<pydev_property name="org.python.pydev.PYTHON_PROJECT_VERSION">python 2.7</pydev_property>
|
|
||||||
</pydev_project>
|
|
@ -1,20 +0,0 @@
|
|||||||
package com.google.refine.commands.recon;
|
|
||||||
|
|
||||||
import javax.servlet.http.HttpServletRequest;
|
|
||||||
|
|
||||||
import org.json.JSONObject;
|
|
||||||
|
|
||||||
import com.google.refine.commands.EngineDependentCommand;
|
|
||||||
import com.google.refine.model.AbstractOperation;
|
|
||||||
import com.google.refine.model.Project;
|
|
||||||
import com.google.refine.operations.recon.TouchOperation;
|
|
||||||
|
|
||||||
public class TouchCommand extends EngineDependentCommand {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected AbstractOperation createOperation(Project project,
|
|
||||||
HttpServletRequest request, JSONObject engineConfig) throws Exception {
|
|
||||||
|
|
||||||
return new TouchOperation(engineConfig);
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,36 +0,0 @@
|
|||||||
package com.google.refine.operations.recon;
|
|
||||||
|
|
||||||
import java.util.Properties;
|
|
||||||
|
|
||||||
import org.json.JSONException;
|
|
||||||
import org.json.JSONObject;
|
|
||||||
import org.json.JSONWriter;
|
|
||||||
|
|
||||||
import com.google.refine.model.Project;
|
|
||||||
import com.google.refine.operations.EngineDependentOperation;
|
|
||||||
import com.google.refine.operations.OperationRegistry;
|
|
||||||
|
|
||||||
public class TouchOperation extends EngineDependentOperation {
|
|
||||||
|
|
||||||
public TouchOperation(
|
|
||||||
JSONObject engineConfig
|
|
||||||
) {
|
|
||||||
super(engineConfig);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
protected String getBriefDescription(Project project) {
|
|
||||||
return "Refresh Freebase MQL cache";
|
|
||||||
}
|
|
||||||
|
|
||||||
public void write(JSONWriter writer, Properties options)
|
|
||||||
throws JSONException {
|
|
||||||
|
|
||||||
writer.object();
|
|
||||||
writer.key("op"); writer.value(OperationRegistry.s_opClassToName.get(this.getClass()));
|
|
||||||
writer.key("description"); writer.value(getBriefDescription(null));
|
|
||||||
writer.key("engineConfig"); writer.value(getEngineConfig());
|
|
||||||
writer.endObject();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -114,7 +114,7 @@ public class RefineServletTests extends RefineTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
//----------------doPost tests-------------------------
|
//----------------doPost tests-------------------------
|
||||||
@Test(enabled=false) // TODO: Fails due to interaction with doGetRegressionTest
|
@Test
|
||||||
public void doPostRegressionTest(){
|
public void doPostRegressionTest(){
|
||||||
whenGetCommandNameThenReturn(TEST_COMMAND_PATH);
|
whenGetCommandNameThenReturn(TEST_COMMAND_PATH);
|
||||||
whenGetMethodThenReturn(POST);
|
whenGetMethodThenReturn(POST);
|
||||||
|
@ -29,8 +29,7 @@ function onClickUploadFileButton(evt) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function formatDate(d) {
|
function formatDate(d) {
|
||||||
var d1 = d;
|
var d = new Date(d);
|
||||||
var d = new Date(d + " EDT");
|
|
||||||
var last_year = Date.today().add({ years: -1 });
|
var last_year = Date.today().add({ years: -1 });
|
||||||
var last_month = Date.today().add({ months: -1 });
|
var last_month = Date.today().add({ months: -1 });
|
||||||
var last_week = Date.today().add({ days: -7 });
|
var last_week = Date.today().add({ days: -7 });
|
||||||
@ -38,8 +37,7 @@ function formatDate(d) {
|
|||||||
var tomorrow = Date.today().add({ days: 1 });
|
var tomorrow = Date.today().add({ days: 1 });
|
||||||
|
|
||||||
if (d.between(today, tomorrow)) {
|
if (d.between(today, tomorrow)) {
|
||||||
// TODO: Fix timezone problem
|
return "today " + d.toString("h:mm tt");
|
||||||
return "today " + d1 + " " + d.toLocaleTimeString();
|
|
||||||
} else if (d.between(last_week, today)) {
|
} else if (d.between(last_week, today)) {
|
||||||
var diff = Math.floor(today.getDayOfYear() - d.getDayOfYear());
|
var diff = Math.floor(today.getDayOfYear() - d.getDayOfYear());
|
||||||
return (diff <= 1) ? ("yesterday " + d.toString("h:mm tt")) : (diff + " days ago");
|
return (diff <= 1) ? ("yesterday " + d.toString("h:mm tt")) : (diff + " days ago");
|
||||||
|
File diff suppressed because one or more lines are too long
@ -6,8 +6,6 @@
|
|||||||
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
|
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
|
||||||
<listEntry value="1"/>
|
<listEntry value="1"/>
|
||||||
</listAttribute>
|
</listAttribute>
|
||||||
<stringAttribute key="org.eclipse.debug.core.source_locator_id" value="org.eclipse.jdt.launching.sourceLocator.JavaSourceLookupDirector"/>
|
|
||||||
<stringAttribute key="org.eclipse.debug.core.source_locator_memento" value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <sourceLookupDirector> <sourceContainers duplicates="false"> <container memento="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;javaProject name=&quot;grefine&quot;/&gt;&#10;" typeId="org.eclipse.jdt.launching.sourceContainer.javaProject"/> <container memento="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;packageFragmentRoot handle=&quot;=grefine/webapp\/WEB-INF\/lib\/json-20100208.jar&quot;/&gt;&#10;" typeId="org.eclipse.jdt.launching.sourceContainer.packageFragmentRoot"/> <container memento="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;packageFragmentRoot handle=&quot;=grefine/webapp\/WEB-INF\/lib\/httpcore-4.0.1.jar&quot;/&gt;&#10;" typeId="org.eclipse.jdt.launching.sourceContainer.packageFragmentRoot"/> <container memento="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;packageFragmentRoot handle=&quot;=grefine/webapp\/WEB-INF\/lib\/httpclient-4.0.1.jar&quot;/&gt;&#10;" typeId="org.eclipse.jdt.launching.sourceContainer.packageFragmentRoot"/> <container memento="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;packageFragmentRoot handle=&quot;=grefine/webapp\/WEB-INF\/lib\/signpost-core-1.2.1.1.jar&quot;/&gt;&#10;" typeId="org.eclipse.jdt.launching.sourceContainer.packageFragmentRoot"/> <container memento="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;packageFragmentRoot handle=&quot;=grefine/webapp\/WEB-INF\/lib\/signpost-commonshttp4-1.2.1.1.jar&quot;/&gt;&#10;" typeId="org.eclipse.jdt.launching.sourceContainer.packageFragmentRoot"/> <container memento="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;packageFragmentRoot handle=&quot;=grefine/webapp\/WEB-INF\/lib\/opencsv-2.2.jar&quot;/&gt;&#10;" typeId="org.eclipse.jdt.launching.sourceContainer.packageFragmentRoot"/> <container memento="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;packageFragmentRoot handle=&quot;=grefine/webapp\/WEB-INF\/lib\/slf4j-api-1.5.6.jar&quot;/&gt;&#10;" typeId="org.eclipse.jdt.launching.sourceContainer.packageFragmentRoot"/> <container memento="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;packageFragmentRoot handle=&quot;=grefine/webapp\/WEB-INF\/lib\/slf4j-log4j12-1.5.6.jar&quot;/&gt;&#10;" typeId="org.eclipse.jdt.launching.sourceContainer.packageFragmentRoot"/> <container memento="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;packageFragmentRoot handle=&quot;=grefine/webapp\/WEB-INF\/lib\/log4j-1.2.15.jar&quot;/&gt;&#10;" typeId="org.eclipse.jdt.launching.sourceContainer.packageFragmentRoot"/> <container memento="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;packageFragmentRoot handle=&quot;=grefine/\/grefine-server\/lib\/servlet-api-2.5.jar&quot;/&gt;&#10;" typeId="org.eclipse.jdt.launching.sourceContainer.packageFragmentRoot"/> <container memento="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;default/&gt;&#10;" typeId="org.eclipse.debug.core.containerType.default"/> </sourceContainers> </sourceLookupDirector> "/>
|
|
||||||
<stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value="com.google.refine.Refine"/>
|
<stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value="com.google.refine.Refine"/>
|
||||||
<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="grefine-server"/>
|
<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="grefine-server"/>
|
||||||
<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-Drefine.autoreloading=true"/>
|
<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-Drefine.autoreloading=true"/>
|
||||||
|
Loading…
Reference in New Issue
Block a user