Bugfix for IE9 (doesn't accept html form within form)

changes of API schedule row data changed form input form to unique field names
using row pk.
Fix for issue 96 http://bugs.yacy.net/view.php?id=96

IE9-64bit doesn't interprete iframe with align parameter as desired
misaligns following content (in CrawlProfileEditor_p.html)
This commit is contained in:
reger 2012-02-23 02:40:07 +01:00
parent 4f92389550
commit e15e633a01
3 changed files with 130 additions and 102 deletions

View File

@ -12,7 +12,7 @@
<h3>Crawl Scheduler</h3>
<p>Scheduled Crawls can be modified in this table</p>
<iframe id="APITable" src="Table_API_p.html?inline=true&amp;filter=crawler" width="100%" height="0" align="left" scrolling="no" marginheight="0" marginwidth="0" frameborder="0" ></iframe>
<iframe id="APITable" src="Table_API_p.html?inline=true&amp;filter=crawler" width="100%" height="0" scrolling="no" marginheight="0" marginwidth="0" frameborder="0" ></iframe>
<h3>Crawl Profile Editor</h3>
<p>Crawl profiles hold information about a crawl process that is currently ongoing.</p>
@ -64,7 +64,7 @@
</div></form>
#(/deleteButton)#
</td>
<td><a href="#[startURL]#">#[startURL]#</a></td>
<td><a href="#[startURL]#">#[startURL]#</a></td>
<td>#[depth]#</td>
<td>#[mustmatch]#</td>
<td>#[mustnotmatch]#</td>

View File

@ -21,6 +21,8 @@
<script type="text/javascript">
function submitchange(from) {
document.getElementById("apilist").action = "Table_API_p.html#" + from;
document.getElementById ("scheduleevent").value = "true";
document.getElementById("current_schedule_pk").value = from;
document.getElementById("apilist").submit();
}
</script>
@ -90,41 +92,26 @@ To see a list of all APIs, please visit the <a href="http://www.yacy-websuche.de
<td>#[dateNextExec]#</td>
<td>
#(scheduler)#
<form action="Table_API_p.html" method="post" enctype="multipart/form-data" accept-charset="UTF-8" id="modify_repeat">
<select name="repeat_select" onchange='submitchange("#[pk]#")'>
<select name="repeat_select_#[pk]#" onchange='submitchange("#[pk]#")'>
<option value="off" selected="selected">no repetition</option>
<option value="on">activate scheduler</option>
</select>
<input type="hidden" name="startRecord" value="#[startRecord]#" />
<input type="hidden" name="maximumRecords" value="#[maximumRecords]#" />
<input type="hidden" name="pk" value="#[pk]#" />
<input type="hidden" name="inline" value="#[inline]#" />
<input type="hidden" name="filter" value="#[filter]#" />
</form>
::
<form action="Table_API_p.html" method="post" enctype="multipart/form-data" accept-charset="UTF-8" id="modify_repeat">
::
<table>
<tr><td>
<select name="repeat_time" onchange='submitchange("#[pk]#")'>
<select name="repeat_time_#[pk]#" onchange='submitchange("#[pk]#")'>
#{scale}#
<option value="#[time]#" #(selected)#::selected="selected"#(/selected)#>#[time]#</option>
#{/scale}#
</select>
</td><td>
<select name="repeat_unit" onchange='submitchange("#[pk]#")'>
<select name="repeat_unit_#[pk]#" onchange='submitchange("#[pk]#")'>
<option value="selminutes" #(selectedMinutes)#::selected="selected"#(/selectedMinutes)#>minutes</option>
<option value="selhours" #(selectedHours)#::selected="selected"#(/selectedHours)#>hours</option>
<option value="seldays" #(selectedDays)#::selected="selected"#(/selectedDays)#>days</option>
</select>
</td></tr>
</table>
<input type="hidden" name="startRecord" value="#[startRecord]#" />
<input type="hidden" name="maximumRecords" value="#[maximumRecords]#" />
<input type="hidden" name="pk" value="#[pk]#" />
<input type="hidden" name="inline" value="#[inline]#" />
<input type="hidden" name="filter" value="#[filter]#" />
<noscript><input type="submit" value="Submit" /></noscript>
</form>
</table>
#(/scheduler)#
</td>
#(inline)#<td>#[url]#</td>::#(/inline)#
@ -134,6 +121,8 @@ To see a list of all APIs, please visit the <a href="http://www.yacy-websuche.de
</div>
</fieldset>
<p>
<input type="hidden" name="scheduleevent" id="scheduleevent" value="false" />
<input type="hidden" name="current_schedule_pk" id="current_schedule_pk" value="" />
<input type="hidden" name="num" value="#[num]#" />
<input type="submit" name="execrows" value="Execute Selected Actions" />
<input type="submit" name="deleterows" value="Delete Selected Actions" />

View File

@ -42,90 +42,116 @@ import de.anomic.server.serverObjects;
import de.anomic.server.serverSwitch;
public class Table_API_p {
public static serverObjects respond(final RequestHeader header, final serverObjects post, final serverSwitch env) {
final Switchboard sb = (Switchboard) env;
final serverObjects prop = new serverObjects();
prop.put("showexec", 0);
prop.put("showtable", 0);
int startRecord = 0;
int maximumRecords = 25;
Pattern query = QueryParams.catchall_pattern;
if (post != null && post.containsKey("startRecord")) startRecord = post.getInt("startRecord", 0);
if (post != null && post.containsKey("maximumRecords")) maximumRecords = post.getInt("maximumRecords", 0);
if (post != null && post.containsKey("startRecord")) {
startRecord = post.getInt("startRecord", 0);
}
if (post != null && post.containsKey("maximumRecords")) {
maximumRecords = post.getInt("maximumRecords", 0);
}
if (post != null && post.containsKey("query") && !post.get("query", "").isEmpty()) {
query = Pattern.compile(".*" + post.get("query", "") + ".*");
startRecord = 0;
maximumRecords = 1000;
}
final boolean inline = (post != null && post.getBoolean("inline",false));
final boolean inline = (post != null && post.getBoolean("inline", false));
prop.put("inline", (inline) ? 1 : 0);
Pattern typefilter = QueryParams.catchall_pattern;
if (post != null && post.containsKey("filter") && post.get("filter", "").length() > 0) {
typefilter = Pattern.compile(post.get("filter", ".*"));
}
String pk;
if (post != null && post.containsKey("repeat_select") && ((pk = post.get("pk")) != null)) try {
final String action = post.get("repeat_select", "off");
if (action.equals("on")) {
Tables.Row row = sb.tables.select(WorkTables.TABLE_API_NAME, pk.getBytes());
if (row != null) {
row.put(WorkTables.TABLE_API_COL_APICALL_SCHEDULE_TIME, 7);
row.put(WorkTables.TABLE_API_COL_APICALL_SCHEDULE_UNIT, "days");
WorkTables.calculateAPIScheduler(row, false);
sb.tables.update(WorkTables.TABLE_API_NAME, row);
boolean scheduleevent = false; // flag if schedule info of row changes
String current_schedule_pk = ""; // pk of changed schedule data row
if (post != null && post.containsKey("scheduleevent")) {
scheduleevent = post.get("scheduleevent", "false").equalsIgnoreCase("true");
prop.put("scheduleevent", "false");
current_schedule_pk = post.get("current_schedule_pk", "");
}
if (scheduleevent && !current_schedule_pk.isEmpty()) {
if (post != null && post.containsKey("repeat_select_" + current_schedule_pk) ) {
try {
final String action = post.get("repeat_select_" + current_schedule_pk, "off");
if (action.equals("on")) {
Tables.Row row = sb.tables.select(WorkTables.TABLE_API_NAME, current_schedule_pk.getBytes());
if (row != null) {
row.put(WorkTables.TABLE_API_COL_APICALL_SCHEDULE_TIME, 7);
row.put(WorkTables.TABLE_API_COL_APICALL_SCHEDULE_UNIT, "days");
WorkTables.calculateAPIScheduler(row, false);
sb.tables.update(WorkTables.TABLE_API_NAME, row);
}
}
} catch (IOException e) {
Log.logException(e);
} catch (RowSpaceExceededException e) {
Log.logException(e);
}
}
} catch (IOException e) {
Log.logException(e);
} catch (RowSpaceExceededException e) {
Log.logException(e);
}
if (post != null && post.containsKey("repeat_time") && ((pk = post.get("pk")) != null)) try {
final String action = post.get("repeat_time", "off");
final Tables.Row row = sb.tables.select(WorkTables.TABLE_API_NAME, pk.getBytes());
if (row != null) {
if ("off".equals(action)) {
row.put(WorkTables.TABLE_API_COL_APICALL_SCHEDULE_TIME, 0);
} else {
row.put(WorkTables.TABLE_API_COL_APICALL_SCHEDULE_TIME, Integer.parseInt(action));
if (post != null && post.containsKey("repeat_time_" + current_schedule_pk) ) {
try {
final String action = post.get("repeat_time_" + current_schedule_pk, "off");
final Tables.Row row = sb.tables.select(WorkTables.TABLE_API_NAME, current_schedule_pk.getBytes());
if (row != null) {
if ("off".equals(action)) {
row.put(WorkTables.TABLE_API_COL_APICALL_SCHEDULE_TIME, 0);
} else {
row.put(WorkTables.TABLE_API_COL_APICALL_SCHEDULE_TIME, Integer.parseInt(action));
}
WorkTables.calculateAPIScheduler(row, false);
sb.tables.update(WorkTables.TABLE_API_NAME, row);
}
} catch (IOException e) {
Log.logException(e);
} catch (RowSpaceExceededException e) {
Log.logException(e);
}
WorkTables.calculateAPIScheduler(row, false);
sb.tables.update(WorkTables.TABLE_API_NAME, row);
}
} catch (IOException e) {
Log.logException(e);
} catch (RowSpaceExceededException e) {
Log.logException(e);
}
if (post != null && post.containsKey("repeat_unit") && ((pk = post.get("pk")) != null)) try {
final String action = post.get("repeat_unit", "seldays");
final Tables.Row row = sb.tables.select(WorkTables.TABLE_API_NAME, pk.getBytes());
if (row != null) {
int time = row.get(WorkTables.TABLE_API_COL_APICALL_SCHEDULE_TIME, 1);
row.put(WorkTables.TABLE_API_COL_APICALL_SCHEDULE_UNIT, action.substring(3));
if (action.equals("selminutes") && time > 0 && time < 10) row.put(WorkTables.TABLE_API_COL_APICALL_SCHEDULE_TIME, 10);
if (action.equals("selminutes") && time > 50) row.put(WorkTables.TABLE_API_COL_APICALL_SCHEDULE_TIME, 50);
if (action.equals("selhours") && time > 23) row.put(WorkTables.TABLE_API_COL_APICALL_SCHEDULE_TIME, 23);
if (action.equals("seldays") && time > 30) row.put(WorkTables.TABLE_API_COL_APICALL_SCHEDULE_TIME, 30);
WorkTables.calculateAPIScheduler(row, false);
sb.tables.update(WorkTables.TABLE_API_NAME, row);
if (post != null && post.containsKey("repeat_unit_" + current_schedule_pk) ) {
try {
final String action = post.get("repeat_unit_" + current_schedule_pk, "seldays");
final Tables.Row row = sb.tables.select(WorkTables.TABLE_API_NAME, current_schedule_pk.getBytes());
if (row != null) {
int time = row.get(WorkTables.TABLE_API_COL_APICALL_SCHEDULE_TIME, 1);
row.put(WorkTables.TABLE_API_COL_APICALL_SCHEDULE_UNIT, action.substring(3));
if (action.equals("selminutes") && time > 0 && time < 10) {
row.put(WorkTables.TABLE_API_COL_APICALL_SCHEDULE_TIME, 10);
}
if (action.equals("selminutes") && time > 50) {
row.put(WorkTables.TABLE_API_COL_APICALL_SCHEDULE_TIME, 50);
}
if (action.equals("selhours") && time > 23) {
row.put(WorkTables.TABLE_API_COL_APICALL_SCHEDULE_TIME, 23);
}
if (action.equals("seldays") && time > 30) {
row.put(WorkTables.TABLE_API_COL_APICALL_SCHEDULE_TIME, 30);
}
WorkTables.calculateAPIScheduler(row, false);
sb.tables.update(WorkTables.TABLE_API_NAME, row);
}
} catch (IOException e) {
Log.logException(e);
} catch (RowSpaceExceededException e) {
Log.logException(e);
}
}
} catch (IOException e) {
Log.logException(e);
} catch (RowSpaceExceededException e) {
Log.logException(e);
}
if (post != null && !post.get("deleterows", "").isEmpty()) {
for (final Map.Entry<String, String> entry: post.entrySet()) {
for (final Map.Entry<String, String> entry : post.entrySet()) {
if (entry.getValue().startsWith("mark_")) {
try {
sb.tables.delete(WorkTables.TABLE_API_NAME, entry.getValue().substring(5).getBytes());
@ -139,37 +165,40 @@ public class Table_API_p {
if (post != null && !post.get("execrows", "").isEmpty()) {
// create a time-ordered list of events to execute
final Set<String> pks = new TreeSet<String>();
for (final Map.Entry<String, String> entry: post.entrySet()) {
for (final Map.Entry<String, String> entry : post.entrySet()) {
if (entry.getValue().startsWith("mark_")) {
pks.add(entry.getValue().substring(5));
}
}
// now call the api URLs and store the result status
final Map<String, Integer> l = sb.tables.execAPICalls("localhost", (int) sb.getConfigLong("port", 8090), sb.getConfig(SwitchboardConstants.ADMIN_ACCOUNT_B64MD5, ""), pks);
// construct result table
prop.put("showexec", l.size() > 0 ? 1 : 0);
final Iterator<Map.Entry<String, Integer>> resultIterator = l.entrySet().iterator();
Map.Entry<String, Integer> record;
int count = 0;
boolean dark = true;
while (resultIterator.hasNext()) {
record = resultIterator.next();
if (record == null) continue;
prop.put("showexec_list_" + count + "_dark", ((dark) ? 1 : 0) ); dark=!dark;
if (record == null) {
continue;
}
prop.put("showexec_list_" + count + "_dark", ((dark) ? 1 : 0));
dark = !dark;
prop.put("showexec_list_" + count + "_status", record.getValue());
prop.put("showexec_list_" + count + "_url", record.getKey());
count++;
}
prop.put("showexec_list", count);
}
// generate table
prop.put("showtable", 1);
prop.put("showtable_inline", inline ? 1 : 0);
// insert rows
final List<Tables.Row> table = new ArrayList<Tables.Row>(maximumRecords);
int count = 0;
@ -186,17 +215,27 @@ public class Table_API_p {
// first prepare a list
while (mapIterator.hasNext()) {
r = mapIterator.next();
if (r == null) continue;
if (r == null) {
continue;
}
type = UTF8.String(r.get(WorkTables.TABLE_API_COL_TYPE));
if (!typefilter.matcher(type).matches()) continue;
if (!typefilter.matcher(type).matches()) {
continue;
}
comment = UTF8.String(r.get(WorkTables.TABLE_API_COL_COMMENT));
if (!query.matcher(comment).matches()) continue;
if (c >= startRecord) table.add(r);
if (!query.matcher(comment).matches()) {
continue;
}
if (c >= startRecord) {
table.add(r);
}
c++;
if (table.size() >= maximumRecords) break;
if (table.size() >= maximumRecords) {
break;
}
}
// then work on the list
for (final Tables.Row row: table) {
for (final Tables.Row row : table) {
final Date now = new Date();
final Date date = row.containsKey(WorkTables.TABLE_API_COL_DATE) ? row.get(WorkTables.TABLE_API_COL_DATE, now) : null;
final Date date_recording = row.get(WorkTables.TABLE_API_COL_DATE_RECORDING, date);
@ -206,13 +245,14 @@ public class Table_API_p {
final String unit = row.get(WorkTables.TABLE_API_COL_APICALL_SCHEDULE_UNIT, "days");
final int time = row.get(WorkTables.TABLE_API_COL_APICALL_SCHEDULE_TIME, 0);
prop.put("showtable_list_" + count + "_inline", inline ? 1 : 0);
prop.put("showtable_list_" + count + "_dark", dark ? 1 : 0); dark=!dark;
prop.put("showtable_list_" + count + "_dark", dark ? 1 : 0);
dark = !dark;
prop.put("showtable_list_" + count + "_pk", UTF8.String(row.getPK()));
prop.put("showtable_list_" + count + "_count", count);
prop.put("showtable_list_" + count + "_callcount", callcount);
prop.put("showtable_list_" + count + "_dateRecording", date_recording == null ? "-" : DateFormat.getDateTimeInstance().format(date_recording));
prop.put("showtable_list_" + count + "_dateLastExec", date_last_exec == null ? "-" : DateFormat.getDateTimeInstance().format(date_last_exec));
prop.put("showtable_list_" + count + "_dateNextExec", date_next_exec == null ? "-" : DateFormat.getDateTimeInstance().format(date_next_exec));
prop.put("showtable_list_" + count + "_dateLastExec", date_last_exec == null ? "-" : DateFormat.getDateTimeInstance().format(date_last_exec));
prop.put("showtable_list_" + count + "_dateNextExec", date_next_exec == null ? "-" : DateFormat.getDateTimeInstance().format(date_next_exec));
prop.put("showtable_list_" + count + "_selectedMinutes", unit.equals("minutes") ? 1 : 0);
prop.put("showtable_list_" + count + "_selectedHours", unit.equals("hours") ? 1 : 0);
prop.put("showtable_list_" + count + "_selectedDays", (unit.length() == 0 || unit.equals("days")) ? 1 : 0);
@ -233,7 +273,7 @@ public class Table_API_p {
prop.put("showtable_list_" + count + "_scheduler_selectedHours", 0);
prop.put("showtable_list_" + count + "_scheduler_selectedDays", 0);
if (unit.equals("minutes")) {
for (int i = 1; i <= 5 ; i++) {
for (int i = 1; i <= 5; i++) {
prop.put("showtable_list_" + count + "_scheduler_scale_" + i + "_time", i * 10);
prop.put("showtable_list_" + count + "_scheduler_scale_" + i + "_selected", 0);
}
@ -241,7 +281,7 @@ public class Table_API_p {
prop.put("showtable_list_" + count + "_scheduler_scale", 6);
prop.put("showtable_list_" + count + "_scheduler_selectedMinutes", 1);
} else if (unit.equals("hours")) {
for (int i = 1; i <= 23 ; i++) {
for (int i = 1; i <= 23; i++) {
prop.put("showtable_list_" + count + "_scheduler_scale_" + i + "_time", i);
prop.put("showtable_list_" + count + "_scheduler_scale_" + i + "_selected", 0);
}
@ -249,7 +289,7 @@ public class Table_API_p {
prop.put("showtable_list_" + count + "_scheduler_scale", 24);
prop.put("showtable_list_" + count + "_scheduler_selectedHours", 1);
} else {
for (int i = 1; i <= 30 ; i++) {
for (int i = 1; i <= 30; i++) {
prop.put("showtable_list_" + count + "_scheduler_scale_" + i + "_time", i);
prop.put("showtable_list_" + count + "_scheduler_scale_" + i + "_selected", 0);
}
@ -276,7 +316,7 @@ public class Table_API_p {
}
prop.put("showtable_list", count);
prop.put("showtable_num", count);
// write navigation details
prop.put("showtable_startRecord", startRecord);
prop.put("showtable_maximumRecords", maximumRecords);
@ -303,9 +343,8 @@ public class Table_API_p {
} else {
prop.put("showtable_navigation", 0);
}
// return rewrite properties
return prop;
}
}