Modified: manifoldcf/branches/dev_1x/connectors/webcrawler/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/webcrawler/WebcrawlerConnector.java URL: http://svn.apache.org/viewvc/manifoldcf/branches/dev_1x/connectors/webcrawler/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/webcrawler/WebcrawlerConnector.java?rev=1626026&r1=1626025&r2=1626026&view=diff ============================================================================== --- manifoldcf/branches/dev_1x/connectors/webcrawler/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/webcrawler/WebcrawlerConnector.java (original) +++ manifoldcf/branches/dev_1x/connectors/webcrawler/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/webcrawler/WebcrawlerConnector.java Thu Sep 18 16:56:59 2014 @@ -3630,15 +3630,42 @@ public class WebcrawlerConnector extends ); } + /** Obtain the name of the form check javascript method to call. + *@param connectionSequenceNumber is the unique number of this connection within the job. + *@return the name of the form check javascript method. + */ + @Override + public String getFormCheckJavascriptMethodName(int connectionSequenceNumber) + { + return "s"+connectionSequenceNumber+"_checkSpecification"; + //return "checkSpecification"; + } + + /** Obtain the name of the form presave check javascript method to call. + *@param connectionSequenceNumber is the unique number of this connection within the job. + *@return the name of the form presave check javascript method. + */ + @Override + public String getFormPresaveCheckJavascriptMethodName(int connectionSequenceNumber) + { + return "s"+connectionSequenceNumber+"_checkSpecificationForSave"; + //return "checkSpecificationForSave"; + } + /** Output the specification header section. - * This method is called in the head section of a job page which has selected a repository connection of the current type. Its purpose is to add the required tabs - * to the list, and to output any javascript methods that might be needed by the job editing HTML. + * This method is called in the head section of a job page which has selected a repository connection of the + * current type. Its purpose is to add the required tabs to the list, and to output any javascript methods + * that might be needed by the job editing HTML. + * The connector will be connected before this method can be called. *@param out is the output to which any HTML should be sent. + *@param locale is the locale the output is preferred to be in. *@param ds is the current document specification for this job. + *@param connectionSequenceNumber is the unique number of this connection within the job. *@param tabsArray is an array of tab names. Add to this array any tab names that are specific to the connector. */ @Override - public void outputSpecificationHeader(IHTTPOutput out, Locale locale, DocumentSpecification ds, List<String> tabsArray) + public void outputSpecificationHeader(IHTTPOutput out, Locale locale, Specification ds, + int connectionSequenceNumber, List<String> tabsArray) throws ManifoldCFException, IOException { tabsArray.add(Messages.getString(locale,"WebcrawlerConnector.Seeds")); @@ -3648,66 +3675,68 @@ public class WebcrawlerConnector extends tabsArray.add(Messages.getString(locale,"WebcrawlerConnector.Exclusions")); tabsArray.add(Messages.getString(locale,"WebcrawlerConnector.Security")); tabsArray.add(Messages.getString(locale,"WebcrawlerConnector.Metadata")); + String seqPrefix = "s"+connectionSequenceNumber+"_"; + out.print( "<script type=\"text/javascript\">\n"+ "<!--\n"+ "\n"+ -"function SpecOp(n, opValue, anchorvalue)\n"+ +"function "+seqPrefix+"SpecOp(n, opValue, anchorvalue)\n"+ "{\n"+ " eval(\"editjob.\"+n+\".value = \\\"\"+opValue+\"\\\"\");\n"+ " postFormSetAnchor(anchorvalue);\n"+ "}\n"+ "\n"+ -"function AddRegexp(anchorvalue)\n"+ +"function "+seqPrefix+"AddRegexp(anchorvalue)\n"+ "{\n"+ -" if (editjob.rssmatch.value == \"\")\n"+ +" if (editjob."+seqPrefix+"rssmatch.value == \"\")\n"+ " {\n"+ " alert(\""+Messages.getBodyJavascriptString(locale,"WebcrawlerConnector.MatchMustHaveARegexpValue")+"\");\n"+ -" editjob.rssmatch.focus();\n"+ +" editjob."+seqPrefix+"rssmatch.focus();\n"+ " return;\n"+ " }\n"+ "\n"+ -" SpecOp(\"rssop\",\"Add\",anchorvalue);\n"+ +" "+seqPrefix+"SpecOp(\""+seqPrefix+"rssop\",\"Add\",anchorvalue);\n"+ "}\n"+ "\n"+ -"function RemoveRegexp(index, anchorvalue)\n"+ +"function "+seqPrefix+"RemoveRegexp(index, anchorvalue)\n"+ "{\n"+ -" editjob.rssindex.value = index;\n"+ -" SpecOp(\"rssop\",\"Delete\",anchorvalue);\n"+ +" editjob."+seqPrefix+"rssindex.value = index;\n"+ +" "+seqPrefix+"SpecOp(\""+seqPrefix+"rssop\",\"Delete\",anchorvalue);\n"+ "}\n"+ "\n"+ -"function URLRegexpDelete(index, anchorvalue)\n"+ +"function "+seqPrefix+"URLRegexpDelete(index, anchorvalue)\n"+ "{\n"+ -" editjob.urlregexpnumber.value = index;\n"+ -" SpecOp(\"urlregexpop\",\"Delete\",anchorvalue);\n"+ +" editjob."+seqPrefix+"urlregexpnumber.value = index;\n"+ +" "+seqPrefix+"SpecOp(\""+seqPrefix+"urlregexpop\",\"Delete\",anchorvalue);\n"+ "}\n"+ "\n"+ -"function URLRegexpAdd(anchorvalue)\n"+ +"function "+seqPrefix+"URLRegexpAdd(anchorvalue)\n"+ "{\n"+ -" SpecOp(\"urlregexpop\",\"Add\",anchorvalue);\n"+ +" "+seqPrefix+"SpecOp(\""+seqPrefix+"urlregexpop\",\"Add\",anchorvalue);\n"+ "}\n"+ "\n"+ -"function checkSpecification()\n"+ +"function "+seqPrefix+"checkSpecification()\n"+ "{\n"+ -" if (check_expressions(\"inclusions\",editjob.inclusions.value) == false)\n"+ +" if ("+seqPrefix+"check_expressions(\"inclusions\",editjob."+seqPrefix+"inclusions.value) == false)\n"+ " {\n"+ -" editjob.inclusions.focus();\n"+ +" editjob."+seqPrefix+"inclusions.focus();\n"+ " return false;\n"+ " } \n"+ -" if (check_expressions(\"exclusions\",editjob.exclusions.value) == false)\n"+ +" if ("+seqPrefix+"check_expressions(\"exclusions\",editjob."+seqPrefix+"exclusions.value) == false)\n"+ " {\n"+ -" editjob.exclusions.focus();\n"+ +" editjob."+seqPrefix+"exclusions.focus();\n"+ " return false;\n"+ " }\n"+ -" if (check_seedsList() == false)\n"+ +" if ("+seqPrefix+"check_seedsList() == false)\n"+ " {\n"+ -" editjob.seeds.focus();\n"+ +" editjob."+seqPrefix+"seeds.focus();\n"+ " return false;\n"+ " }\n"+ " return true;\n"+ "}\n"+ "\n"+ -"function check_expressions(thecontext,theexpressionlist)\n"+ +"function "+seqPrefix+"check_expressions(thecontext,theexpressionlist)\n"+ "{\n"+ " var rval = true;\n"+ " var theArray = theexpressionlist.split(\"\\n\");\n"+ @@ -3734,10 +3763,10 @@ public class WebcrawlerConnector extends " return rval;\n"+ "}\n"+ "\n"+ -"function check_seedsList()\n"+ +"function "+seqPrefix+"check_seedsList()\n"+ "{\n"+ " var regexp = /http(s)?:\\/\\/([a-z0-9+!*(),;?&=\\$_.-]+(\\:[a-z0-9+!*(),;?&=\\$_.-]+)?@)?[a-z0-9+\\$_-]+(\\.[a-z0-9+\\$_-]+)*(\\:[0-9]{2,5})?(\\/([a-z0-9+\\$_-]\\.?)+)*\\/?(\\?[a-z+&\\$_.-][a-z0-9;:@\\/&%=+\\$_.-]*)?(#[a-z_.-][a-z0-9+\\$_.-]*)?/;\n"+ -" var lines = editjob.seeds.value.split(\"\\n\");\n"+ +" var lines = editjob."+seqPrefix+"seeds.value.split(\"\\n\");\n"+ " var trimmedUrlList = \"\";\n"+ " var invalidUrlList = \"\";\n"+ " var i = 0;\n"+ @@ -3752,7 +3781,7 @@ public class WebcrawlerConnector extends " }\n"+ " i = i + 1;\n"+ " }\n"+ -" editjob.seeds.value = trimmedUrlList;\n"+ +" editjob."+seqPrefix+"seeds.value = trimmedUrlList;\n"+ " if (invalidUrlList.length > 0)\n"+ " {\n"+ " alert(\""+Messages.getBodyJavascriptString(locale,"WebcrawlerConnector.InvalidUrlsInSeedsList")+"\\n\" + invalidUrlList);\n"+ @@ -3761,15 +3790,15 @@ public class WebcrawlerConnector extends " return true;\n"+ "}\n"+ "\n"+ -"function SpecAddToken(anchorvalue)\n"+ +"function "+seqPrefix+"SpecAddToken(anchorvalue)\n"+ "{\n"+ -" if (editjob.spectoken.value == \"\")\n"+ +" if (editjob."+seqPrefix+"spectoken.value == \"\")\n"+ " {\n"+ " alert(\""+Messages.getBodyJavascriptString(locale,"WebcrawlerConnector.TypeInAnAccessToken")+"\");\n"+ -" editjob.spectoken.focus();\n"+ +" editjob."+seqPrefix+"spectoken.focus();\n"+ " return;\n"+ " }\n"+ -" SpecOp(\"accessop\",\"Add\",anchorvalue);\n"+ +" "+seqPrefix+"SpecOp(\""+seqPrefix+"accessop\",\"Add\",anchorvalue);\n"+ "}\n"+ "\n"+ "function SpecAddMetadata(anchorvalue)\n"+ @@ -3795,17 +3824,26 @@ public class WebcrawlerConnector extends } /** Output the specification body section. - * This method is called in the body section of a job page which has selected a repository connection of the current type. Its purpose is to present the required form elements for editing. - * The coder can presume that the HTML that is output from this configuration will be within appropriate <html>, <body>, and <form> tags. The name of the - * form is "editjob". + * This method is called in the body section of a job page which has selected a repository connection of the + * current type. Its purpose is to present the required form elements for editing. + * The coder can presume that the HTML that is output from this configuration will be within appropriate + * <html>, <body>, and <form> tags. The name of the form is always "editjob". + * The connector will be connected before this method can be called. *@param out is the output to which any HTML should be sent. + *@param locale is the locale the output is preferred to be in. *@param ds is the current document specification for this job. - *@param tabName is the current tab name. + *@param connectionSequenceNumber is the unique number of this connection within the job. + *@param actualSequenceNumber is the connection within the job that has currently been selected. + *@param tabName is the current tab name. (actualSequenceNumber, tabName) form a unique tuple within + * the job. */ @Override - public void outputSpecificationBody(IHTTPOutput out, Locale locale, DocumentSpecification ds, String tabName) + public void outputSpecificationBody(IHTTPOutput out, Locale locale, Specification ds, + int connectionSequenceNumber, int actualSequenceNumber, String tabName) throws ManifoldCFException, IOException { + String seqPrefix = "s"+connectionSequenceNumber+"_"; + int i; int k; @@ -3886,14 +3924,14 @@ public class WebcrawlerConnector extends // Seeds tab - if (tabName.equals(Messages.getString(locale,"WebcrawlerConnector.Seeds"))) + if (tabName.equals(Messages.getString(locale,"WebcrawlerConnector.Seeds")) && connectionSequenceNumber == actualSequenceNumber) { out.print( "<table class=\"displaytable\">\n"+ " <tr><td class=\"separator\" colspan=\"2\"><hr/></td></tr>\n"+ " <tr>\n"+ " <td class=\"value\" colspan=\"2\">\n"+ -" <textarea rows=\"25\" cols=\"80\" name=\"seeds\">"+Encoder.bodyEscape(seeds)+"</textarea>\n"+ +" <textarea rows=\"25\" cols=\"80\" name=\""+seqPrefix+"seeds\">"+Encoder.bodyEscape(seeds)+"</textarea>\n"+ " </td>\n"+ " </tr>\n"+ "</table>\n" @@ -3902,21 +3940,21 @@ public class WebcrawlerConnector extends else { out.print( -"<input type=\"hidden\" name=\"seeds\" value=\""+Encoder.attributeEscape(seeds)+"\"/>\n" +"<input type=\"hidden\" name=\""+seqPrefix+"seeds\" value=\""+Encoder.attributeEscape(seeds)+"\"/>\n" ); } // Canonicalization tab - if (tabName.equals(Messages.getString(locale,"WebcrawlerConnector.Canonicalization"))) + if (tabName.equals(Messages.getString(locale,"WebcrawlerConnector.Canonicalization")) && connectionSequenceNumber == actualSequenceNumber) { out.print( "<table class=\"displaytable\">\n"+ " <tr><td class=\"separator\" colspan=\"2\"><hr/></td></tr>\n"+ " <tr>\n"+ " <td class=\"boxcell\" colspan=\"2\">\n"+ -" <input type=\"hidden\" name=\"urlregexpop\" value=\"Continue\"/>\n"+ -" <input type=\"hidden\" name=\"urlregexpnumber\" value=\"\"/>\n"+ +" <input type=\"hidden\" name=\""+seqPrefix+"urlregexpop\" value=\"Continue\"/>\n"+ +" <input type=\"hidden\" name=\""+seqPrefix+"urlregexpnumber\" value=\"\"/>\n"+ " <table class=\"formtable\">\n"+ " <tr class=\"formheaderrow\">\n"+ " <td class=\"formcolumnheader\"></td>\n"+ @@ -3989,18 +4027,18 @@ public class WebcrawlerConnector extends out.print( " <tr class=\""+(((l % 2)==0)?"evenformrow":"oddformrow")+"\">\n"+ " <td class=\"formcolumncell\">\n"+ -" <a name=\""+"urlregexp_"+Integer.toString(l)+"\">\n"+ -" <input type=\"button\" value=\"" + Messages.getAttributeString(locale,"WebcrawlerConnector.Delete") + "\" alt=\""+Messages.getAttributeString(locale,"WebcrawlerConnector.DeleteUrlRegexp")+Encoder.attributeEscape(regexpString)+"\" onclick='javascript:URLRegexpDelete("+Integer.toString(l)+",\"urlregexp_"+Integer.toString(l)+"\");'/>\n"+ +" <a name=\""+seqPrefix+"urlregexp_"+Integer.toString(l)+"\">\n"+ +" <input type=\"button\" value=\"" + Messages.getAttributeString(locale,"WebcrawlerConnector.Delete") + "\" alt=\""+Messages.getAttributeString(locale,"WebcrawlerConnector.DeleteUrlRegexp")+Encoder.attributeEscape(regexpString)+"\" onclick='javascript:"+seqPrefix+"URLRegexpDelete("+Integer.toString(l)+",\""+seqPrefix+"urlregexp_"+Integer.toString(l)+"\");'/>\n"+ " </a>\n"+ " </td>\n"+ " <td class=\"formcolumncell\">\n"+ -" <input type=\"hidden\" name=\""+"urlregexp_"+Integer.toString(l)+"\" value=\""+Encoder.attributeEscape(regexpString)+"\"/>\n"+ -" <input type=\"hidden\" name=\""+"urlregexpdesc_"+Integer.toString(l)+"\" value=\""+Encoder.attributeEscape(description)+"\"/>\n"+ -" <input type=\"hidden\" name=\""+"urlregexpreorder_"+Integer.toString(l)+"\" value=\""+allowReorder+"\"/>\n"+ -" <input type=\"hidden\" name=\""+"urlregexpjava_"+Integer.toString(l)+"\" value=\""+allowJavaSessionRemoval+"\"/>\n"+ -" <input type=\"hidden\" name=\""+"urlregexpasp_"+Integer.toString(l)+"\" value=\""+allowASPSessionRemoval+"\"/>\n"+ -" <input type=\"hidden\" name=\""+"urlregexpphp_"+Integer.toString(l)+"\" value=\""+allowPHPSessionRemoval+"\"/>\n"+ -" <input type=\"hidden\" name=\""+"urlregexpbv_"+Integer.toString(l)+"\" value=\""+allowBVSessionRemoval+"\"/>\n"+ +" <input type=\"hidden\" name=\""+seqPrefix+"urlregexp_"+Integer.toString(l)+"\" value=\""+Encoder.attributeEscape(regexpString)+"\"/>\n"+ +" <input type=\"hidden\" name=\""+seqPrefix+"urlregexpdesc_"+Integer.toString(l)+"\" value=\""+Encoder.attributeEscape(description)+"\"/>\n"+ +" <input type=\"hidden\" name=\""+seqPrefix+"urlregexpreorder_"+Integer.toString(l)+"\" value=\""+allowReorder+"\"/>\n"+ +" <input type=\"hidden\" name=\""+seqPrefix+"urlregexpjava_"+Integer.toString(l)+"\" value=\""+allowJavaSessionRemoval+"\"/>\n"+ +" <input type=\"hidden\" name=\""+seqPrefix+"urlregexpasp_"+Integer.toString(l)+"\" value=\""+allowASPSessionRemoval+"\"/>\n"+ +" <input type=\"hidden\" name=\""+seqPrefix+"urlregexpphp_"+Integer.toString(l)+"\" value=\""+allowPHPSessionRemoval+"\"/>\n"+ +" <input type=\"hidden\" name=\""+seqPrefix+"urlregexpbv_"+Integer.toString(l)+"\" value=\""+allowBVSessionRemoval+"\"/>\n"+ " <nobr>"+Encoder.bodyEscape(regexpString)+"</nobr>\n"+ " </td>\n"+ " <td class=\"formcolumncell\">"+Encoder.bodyEscape(description)+"</td>\n"+ @@ -4025,18 +4063,18 @@ public class WebcrawlerConnector extends " <tr class=\"formrow\"><td colspan=\"8\" class=\"formseparator\"><hr/></td></tr>\n"+ " <tr class=\"formrow\">\n"+ " <td class=\"formcolumncell\">\n"+ -" <a name=\""+"urlregexp_"+Integer.toString(l)+"\">\n"+ -" <input type=\"button\" value=\"" + Messages.getAttributeString(locale,"WebcrawlerConnector.Add") + "\" alt=\"" + Messages.getAttributeString(locale,"WebcrawlerConnector.AddUrlRegexp") + "\" onclick='javascript:URLRegexpAdd(\"urlregexp_"+Integer.toString(l+1)+"\");'/>\n"+ -" <input type=\"hidden\" name=\"urlregexpcount\" value=\""+Integer.toString(l)+"\"/>\n"+ +" <a name=\""+seqPrefix+"urlregexp_"+Integer.toString(l)+"\">\n"+ +" <input type=\"button\" value=\"" + Messages.getAttributeString(locale,"WebcrawlerConnector.Add") + "\" alt=\"" + Messages.getAttributeString(locale,"WebcrawlerConnector.AddUrlRegexp") + "\" onclick='javascript:"+seqPrefix+"URLRegexpAdd(\""+seqPrefix+"urlregexp_"+Integer.toString(l+1)+"\");'/>\n"+ +" <input type=\"hidden\" name=\""+seqPrefix+"urlregexpcount\" value=\""+Integer.toString(l)+"\"/>\n"+ " </a>\n"+ " </td>\n"+ -" <td class=\"formcolumncell\"><input type=\"text\" name=\"urlregexp\" size=\"30\" value=\"\"/></td>\n"+ -" <td class=\"formcolumncell\"><input type=\"text\" name=\"urlregexpdesc\" size=\"30\" value=\"\"/></td>\n"+ -" <td class=\"formcolumncell\"><input type=\"checkbox\" name=\"urlregexpreorder\" value=\""+WebcrawlerConfig.ATTRVALUE_YES+"\"/></td>\n"+ -" <td class=\"formcolumncell\"><input type=\"checkbox\" name=\"urlregexpjava\" value=\""+WebcrawlerConfig.ATTRVALUE_YES+"\" checked=\"true\"/></td>\n"+ -" <td class=\"formcolumncell\"><input type=\"checkbox\" name=\"urlregexpasp\" value=\""+WebcrawlerConfig.ATTRVALUE_YES+"\" checked=\"true\"/></td>\n"+ -" <td class=\"formcolumncell\"><input type=\"checkbox\" name=\"urlregexpphp\" value=\""+WebcrawlerConfig.ATTRVALUE_YES+"\" checked=\"true\"/></td>\n"+ -" <td class=\"formcolumncell\"><input type=\"checkbox\" name=\"urlregexpbv\" value=\""+WebcrawlerConfig.ATTRVALUE_YES+"\" checked=\"true\"/></td>\n"+ +" <td class=\"formcolumncell\"><input type=\"text\" name=\""+seqPrefix+"urlregexp\" size=\"30\" value=\"\"/></td>\n"+ +" <td class=\"formcolumncell\"><input type=\"text\" name=\""+seqPrefix+"urlregexpdesc\" size=\"30\" value=\"\"/></td>\n"+ +" <td class=\"formcolumncell\"><input type=\"checkbox\" name=\""+seqPrefix+"urlregexpreorder\" value=\""+WebcrawlerConfig.ATTRVALUE_YES+"\"/></td>\n"+ +" <td class=\"formcolumncell\"><input type=\"checkbox\" name=\""+seqPrefix+"urlregexpjava\" value=\""+WebcrawlerConfig.ATTRVALUE_YES+"\" checked=\"true\"/></td>\n"+ +" <td class=\"formcolumncell\"><input type=\"checkbox\" name=\""+seqPrefix+"urlregexpasp\" value=\""+WebcrawlerConfig.ATTRVALUE_YES+"\" checked=\"true\"/></td>\n"+ +" <td class=\"formcolumncell\"><input type=\"checkbox\" name=\""+seqPrefix+"urlregexpphp\" value=\""+WebcrawlerConfig.ATTRVALUE_YES+"\" checked=\"true\"/></td>\n"+ +" <td class=\"formcolumncell\"><input type=\"checkbox\" name=\""+seqPrefix+"urlregexpbv\" value=\""+WebcrawlerConfig.ATTRVALUE_YES+"\" checked=\"true\"/></td>\n"+ " </tr>\n"+ " </table>\n"+ " </td>\n"+ @@ -4075,19 +4113,19 @@ public class WebcrawlerConnector extends if (allowBVSessionRemoval == null || allowBVSessionRemoval.length() == 0) allowBVSessionRemoval = WebcrawlerConfig.ATTRVALUE_NO; out.print( -"<input type=\"hidden\" name=\""+"urlregexp_"+Integer.toString(l)+"\" value=\""+Encoder.attributeEscape(regexpString)+"\"/>\n"+ -"<input type=\"hidden\" name=\""+"urlregexpdesc_"+Integer.toString(l)+"\" value=\""+Encoder.attributeEscape(description)+"\"/>\n"+ -"<input type=\"hidden\" name=\""+"urlregexpreorder_"+Integer.toString(l)+"\" value=\""+allowReorder+"\"/>\n"+ -"<input type=\"hidden\" name=\""+"urlregexpjava_"+Integer.toString(l)+"\" value=\""+allowJavaSessionRemoval+"\"/>\n"+ -"<input type=\"hidden\" name=\""+"urlregexpasp_"+Integer.toString(l)+"\" value=\""+allowASPSessionRemoval+"\"/>\n"+ -"<input type=\"hidden\" name=\""+"urlregexpphp_"+Integer.toString(l)+"\" value=\""+allowPHPSessionRemoval+"\"/>\n"+ -"<input type=\"hidden\" name=\""+"urlregexpbv_"+Integer.toString(l)+"\" value=\""+allowBVSessionRemoval+"\"/>\n" +"<input type=\"hidden\" name=\""+seqPrefix+"urlregexp_"+Integer.toString(l)+"\" value=\""+Encoder.attributeEscape(regexpString)+"\"/>\n"+ +"<input type=\"hidden\" name=\""+seqPrefix+"urlregexpdesc_"+Integer.toString(l)+"\" value=\""+Encoder.attributeEscape(description)+"\"/>\n"+ +"<input type=\"hidden\" name=\""+seqPrefix+"urlregexpreorder_"+Integer.toString(l)+"\" value=\""+allowReorder+"\"/>\n"+ +"<input type=\"hidden\" name=\""+seqPrefix+"urlregexpjava_"+Integer.toString(l)+"\" value=\""+allowJavaSessionRemoval+"\"/>\n"+ +"<input type=\"hidden\" name=\""+seqPrefix+"urlregexpasp_"+Integer.toString(l)+"\" value=\""+allowASPSessionRemoval+"\"/>\n"+ +"<input type=\"hidden\" name=\""+seqPrefix+"urlregexpphp_"+Integer.toString(l)+"\" value=\""+allowPHPSessionRemoval+"\"/>\n"+ +"<input type=\"hidden\" name=\""+seqPrefix+"urlregexpbv_"+Integer.toString(l)+"\" value=\""+allowBVSessionRemoval+"\"/>\n" ); l++; } } out.print( -"<input type=\"hidden\" name=\"urlregexpcount\" value=\""+Integer.toString(l)+"\"/>\n" +"<input type=\"hidden\" name=\""+seqPrefix+"urlregexpcount\" value=\""+Integer.toString(l)+"\"/>\n" ); } @@ -4169,7 +4207,7 @@ public class WebcrawlerConnector extends } // Inclusions tab - if (tabName.equals(Messages.getString(locale,"WebcrawlerConnector.Inclusions"))) + if (tabName.equals(Messages.getString(locale,"WebcrawlerConnector.Inclusions")) && connectionSequenceNumber == actualSequenceNumber) { out.print( "<table class=\"displaytable\">\n"+ @@ -4177,20 +4215,20 @@ public class WebcrawlerConnector extends " <tr>\n"+ " <td class=\"description\" colspan=\"1\"><nobr>" + Messages.getBodyString(locale,"WebcrawlerConnector.IncludeInCrawl") + "</nobr></td>\n"+ " <td class=\"value\" colspan=\"1\">\n"+ -" <textarea rows=\"25\" cols=\"60\" name=\"inclusions\">"+Encoder.bodyEscape(inclusions)+"</textarea>\n"+ +" <textarea rows=\"25\" cols=\"60\" name=\""+seqPrefix+"inclusions\">"+Encoder.bodyEscape(inclusions)+"</textarea>\n"+ " </td>\n"+ " </tr>\n"+ " <tr>\n"+ " <td class=\"description\" colspan=\"1\"><nobr>" + Messages.getBodyString(locale,"WebcrawlerConnector.IncludeInIndex") + "</nobr></td>\n"+ " <td class=\"value\" colspan=\"1\">\n"+ -" <textarea rows=\"10\" cols=\"60\" name=\"inclusionsindex\">"+Encoder.bodyEscape(inclusionsIndex)+"</textarea>\n"+ +" <textarea rows=\"10\" cols=\"60\" name=\""+seqPrefix+"inclusionsindex\">"+Encoder.bodyEscape(inclusionsIndex)+"</textarea>\n"+ " </td>\n"+ " </tr>\n"+ " <tr>\n"+ " <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"WebcrawlerConnector.IncludeOnlyHostsMatchingSeeds") + "</nobr></td>\n"+ " <td class=\"value\">\n"+ -" <input type=\"checkbox\" name=\"matchinghosts\" value=\"true\""+(includeMatching?" checked=\"yes\"":"")+"/>\n"+ -" <input type=\"hidden\" name=\"matchinghosts_present\" value=\"true\"/>\n"+ +" <input type=\"checkbox\" name=\""+seqPrefix+"matchinghosts\" value=\"true\""+(includeMatching?" checked=\"yes\"":"")+"/>\n"+ +" <input type=\"hidden\" name=\""+seqPrefix+"matchinghosts_present\" value=\"true\"/>\n"+ " </td>\n"+ " </tr>\n"+ "</table>\n" @@ -4199,16 +4237,16 @@ public class WebcrawlerConnector extends else { out.print( -"<input type=\"hidden\" name=\"inclusions\" value=\""+Encoder.attributeEscape(inclusions)+"\"/>\n"+ -"<input type=\"hidden\" name=\"inclusionsindex\" value=\""+Encoder.attributeEscape(inclusionsIndex)+"\"/>\n"+ -"<input type=\"hidden\" name=\"matchinghosts\" value=\""+(includeMatching?"true":"false")+"\"/>\n"+ -"<input type=\"hidden\" name=\"matchinghosts_present\" value=\"true\"/>\n" +"<input type=\"hidden\" name=\""+seqPrefix+"inclusions\" value=\""+Encoder.attributeEscape(inclusions)+"\"/>\n"+ +"<input type=\"hidden\" name=\""+seqPrefix+"inclusionsindex\" value=\""+Encoder.attributeEscape(inclusionsIndex)+"\"/>\n"+ +"<input type=\"hidden\" name=\""+seqPrefix+"matchinghosts\" value=\""+(includeMatching?"true":"false")+"\"/>\n"+ +"<input type=\"hidden\" name=\""+seqPrefix+"matchinghosts_present\" value=\"true\"/>\n" ); } // Exclusions tab - if (tabName.equals(Messages.getString(locale,"WebcrawlerConnector.Exclusions"))) + if (tabName.equals(Messages.getString(locale,"WebcrawlerConnector.Exclusions")) && connectionSequenceNumber == actualSequenceNumber) { out.print( "<table class=\"displaytable\">\n"+ @@ -4216,13 +4254,13 @@ public class WebcrawlerConnector extends " <tr>\n"+ " <td class=\"description\" colspan=\"1\"><nobr>" + Messages.getBodyString(locale,"WebcrawlerConnector.ExcludeFromCrawl") + "</nobr></td>\n"+ " <td class=\"value\" colspan=\"1\">\n"+ -" <textarea rows=\"25\" cols=\"60\" name=\"exclusions\">"+Encoder.bodyEscape(exclusions)+"</textarea>\n"+ +" <textarea rows=\"25\" cols=\"60\" name=\""+seqPrefix+"exclusions\">"+Encoder.bodyEscape(exclusions)+"</textarea>\n"+ " </td>\n"+ " </tr>\n"+ " <tr>\n"+ " <td class=\"description\" colspan=\"1\"><nobr>" + Messages.getBodyString(locale,"WebcrawlerConnector.ExcludeFromIndex") + "</nobr></td>\n"+ " <td class=\"value\" colspan=\"1\">\n"+ -" <textarea rows=\"10\" cols=\"60\" name=\"exclusionsindex\">"+Encoder.bodyEscape(exclusionsIndex)+"</textarea>\n"+ +" <textarea rows=\"10\" cols=\"60\" name=\""+seqPrefix+"exclusionsindex\">"+Encoder.bodyEscape(exclusionsIndex)+"</textarea>\n"+ " </td>\n"+ " </tr>\n"+ "</table>\n" @@ -4231,8 +4269,8 @@ public class WebcrawlerConnector extends else { out.print( -"<input type=\"hidden\" name=\"exclusions\" value=\""+Encoder.attributeEscape(exclusions)+"\"/>\n"+ -"<input type=\"hidden\" name=\"exclusionsindex\" value=\""+Encoder.attributeEscape(exclusionsIndex)+"\"/>\n" +"<input type=\"hidden\" name=\""+seqPrefix+"exclusions\" value=\""+Encoder.attributeEscape(exclusions)+"\"/>\n"+ +"<input type=\"hidden\" name=\""+seqPrefix+"exclusionsindex\" value=\""+Encoder.attributeEscape(exclusionsIndex)+"\"/>\n" ); } @@ -4240,7 +4278,7 @@ public class WebcrawlerConnector extends // There is no native security, so all we care about are the tokens. i = 0; - if (tabName.equals(Messages.getString(locale,"WebcrawlerConnector.Security"))) + if (tabName.equals(Messages.getString(locale,"WebcrawlerConnector.Security")) && connectionSequenceNumber == actualSequenceNumber) { out.print( "<table class=\"displaytable\">\n"+ @@ -4255,15 +4293,15 @@ public class WebcrawlerConnector extends if (sn.getType().equals(WebcrawlerConfig.NODE_ACCESS)) { String accessDescription = "_"+Integer.toString(k); - String accessOpName = "accessop"+accessDescription; + String accessOpName = seqPrefix+"accessop"+accessDescription; String token = sn.getAttributeValue(WebcrawlerConfig.ATTR_TOKEN); out.print( " <tr>\n"+ " <td class=\"description\">\n"+ " <input type=\"hidden\" name=\""+accessOpName+"\" value=\"\"/>\n"+ -" <input type=\"hidden\" name=\""+"spectoken"+accessDescription+"\" value=\""+Encoder.attributeEscape(token)+"\"/>\n"+ -" <a name=\""+"token_"+Integer.toString(k)+"\">\n"+ -" <input type=\"button\" value=\"" + Messages.getAttributeString(locale,"WebcrawlerConnector.Delete") + "\" onClick='Javascript:SpecOp(\""+accessOpName+"\",\"Delete\",\"token_"+Integer.toString(k)+"\")' alt=\""+Messages.getAttributeString(locale,"WebcrawlerConnector.DeleteToken")+Integer.toString(k)+"\"/>\n"+ +" <input type=\"hidden\" name=\""+seqPrefix+"spectoken"+accessDescription+"\" value=\""+Encoder.attributeEscape(token)+"\"/>\n"+ +" <a name=\""+seqPrefix+"token_"+Integer.toString(k)+"\">\n"+ +" <input type=\"button\" value=\"" + Messages.getAttributeString(locale,"WebcrawlerConnector.Delete") + "\" onClick='Javascript:"+seqPrefix+"SpecOp(\""+accessOpName+"\",\"Delete\",\""+seqPrefix+"token_"+Integer.toString(k)+"\")' alt=\""+Messages.getAttributeString(locale,"WebcrawlerConnector.DeleteToken")+Integer.toString(k)+"\"/>\n"+ " </a> \n"+ " </td>\n"+ " <td class=\"value\">\n"+ @@ -4286,14 +4324,14 @@ public class WebcrawlerConnector extends " <tr><td class=\"lightseparator\" colspan=\"2\"><hr/></td></tr>\n"+ " <tr>\n"+ " <td class=\"description\">\n"+ -" <input type=\"hidden\" name=\"tokencount\" value=\""+Integer.toString(k)+"\"/>\n"+ -" <input type=\"hidden\" name=\"accessop\" value=\"\"/>\n"+ -" <a name=\""+"token_"+Integer.toString(k)+"\">\n"+ -" <input type=\"button\" value=\"" + Messages.getAttributeString(locale,"WebcrawlerConnector.Add") + "\" onClick='Javascript:SpecAddToken(\"token_"+Integer.toString(k+1)+"\")' alt=\"" + Messages.getAttributeString(locale,"WebcrawlerConnector.AddAccessToken") + "\"/>\n"+ +" <input type=\"hidden\" name=\""+seqPrefix+"tokencount\" value=\""+Integer.toString(k)+"\"/>\n"+ +" <input type=\"hidden\" name=\""+seqPrefix+"accessop\" value=\"\"/>\n"+ +" <a name=\""+seqPrefix+"token_"+Integer.toString(k)+"\">\n"+ +" <input type=\"button\" value=\"" + Messages.getAttributeString(locale,"WebcrawlerConnector.Add") + "\" onClick='Javascript:"+seqPrefix+"SpecAddToken(\""+seqPrefix+"token_"+Integer.toString(k+1)+"\")' alt=\"" + Messages.getAttributeString(locale,"WebcrawlerConnector.AddAccessToken") + "\"/>\n"+ " </a> \n"+ " </td>\n"+ " <td class=\"value\">\n"+ -" <input type=\"text\" size=\"30\" name=\"spectoken\" value=\"\"/>\n"+ +" <input type=\"text\" size=\"30\" name=\""+seqPrefix+"spectoken\" value=\"\"/>\n"+ " </td>\n"+ " </tr>\n"+ "</table>\n" @@ -4312,18 +4350,18 @@ public class WebcrawlerConnector extends String accessDescription = "_"+Integer.toString(k); String token = sn.getAttributeValue(WebcrawlerConfig.ATTR_TOKEN); out.print( -"<input type=\"hidden\" name=\""+"spectoken"+accessDescription+"\" value=\""+Encoder.attributeEscape(token)+"\"/>\n" +"<input type=\"hidden\" name=\""+seqPrefix+"spectoken"+accessDescription+"\" value=\""+Encoder.attributeEscape(token)+"\"/>\n" ); k++; } } out.print( -"<input type=\"hidden\" name=\"tokencount\" value=\""+Integer.toString(k)+"\"/>\n" +"<input type=\"hidden\" name=\""+seqPrefix+"tokencount\" value=\""+Integer.toString(k)+"\"/>\n" ); } // "Metadata" tab - if (tabName.equals(Messages.getString(locale,"WebcrawlerConnector.Metadata"))) + if (tabName.equals(Messages.getString(locale,"WebcrawlerConnector.Metadata")) && connectionSequenceNumber == actualSequenceNumber) { out.print( "<table class=\"displaytable\">\n"+ @@ -4331,13 +4369,13 @@ public class WebcrawlerConnector extends " <tr>\n"+ " <td class=\"description\"><nobr>"+Messages.getBodyString(locale, "WebcrawlerConnector.ExcludedHeadersColon")+"</nobr></td>\n"+ " <td class=\"value\" colspan=\"3\">\n"+ -" <input type=\"hidden\" name=\"excludedheaders_present\" value=\"true\"/>\n" +" <input type=\"hidden\" name=\""+seqPrefix+"excludedheaders_present\" value=\"true\"/>\n" ); for (String potentiallyExcludedHeader : potentiallyExcludedHeaders) { out.print( -" <input type=\"checkbox\" name=\"excludedheaders\" value=\""+Encoder.attributeEscape(potentiallyExcludedHeader)+"\""+(excludedHeaders.contains(potentiallyExcludedHeader)?" checked=\"true\"":"")+">"+Encoder.bodyEscape(potentiallyExcludedHeader)+"</input><br/>\n" +" <input type=\"checkbox\" name=\""+seqPrefix+"excludedheaders\" value=\""+Encoder.attributeEscape(potentiallyExcludedHeader)+"\""+(excludedHeaders.contains(potentiallyExcludedHeader)?" checked=\"true\"":"")+">"+Encoder.bodyEscape(potentiallyExcludedHeader)+"</input><br/>\n" ); } out.print( @@ -4413,12 +4451,12 @@ public class WebcrawlerConnector extends else { out.print( -"<input type=\"hidden\" name=\"excludedheaders_present\" value=\"true\"/>\n" +"<input type=\"hidden\" name=\""+seqPrefix+"excludedheaders_present\" value=\"true\"/>\n" ); for (String excludedHeader : excludedHeaders) { out.print( -"<input type=\"hidden\" name=\"excludedheaders\" value=\""+Encoder.attributeEscape(excludedHeader)+"\"/>\n" +"<input type=\"hidden\" name=\""+seqPrefix+"excludedheaders\" value=\""+Encoder.attributeEscape(excludedHeader)+"\"/>\n" ); } // Finally, go through metadata @@ -4447,19 +4485,26 @@ public class WebcrawlerConnector extends } /** Process a specification post. - * This method is called at the start of job's edit or view page, whenever there is a possibility that form data for a connection has been - * posted. Its purpose is to gather form information and modify the document specification accordingly. - * The name of the posted form is "editjob". + * This method is called at the start of job's edit or view page, whenever there is a possibility that form + * data for a connection has been posted. Its purpose is to gather form information and modify the + * document specification accordingly. The name of the posted form is always "editjob". + * The connector will be connected before this method can be called. *@param variableContext contains the post data, including binary file-upload information. + *@param locale is the locale the output is preferred to be in. *@param ds is the current document specification for this job. - *@return null if all is well, or a string error message if there is an error that should prevent saving of the job (and cause a redirection to an error page). + *@param connectionSequenceNumber is the unique number of this connection within the job. + *@return null if all is well, or a string error message if there is an error that should prevent saving of + * the job (and cause a redirection to an error page). */ @Override - public String processSpecificationPost(IPostParameters variableContext, Locale locale, DocumentSpecification ds) + public String processSpecificationPost(IPostParameters variableContext, Locale locale, Specification ds, + int connectionSequenceNumber) throws ManifoldCFException { + String seqPrefix = "s"+connectionSequenceNumber+"_"; + // Get the map - String value = variableContext.getParameter("rssmapcount"); + String value = variableContext.getParameter(seqPrefix+"rssmapcount"); if (value != null) { int mapsize = Integer.parseInt(value); @@ -4479,7 +4524,7 @@ public class WebcrawlerConnector extends j = 0; while (j < mapsize) { - String prefix = "rssregexp_"+Integer.toString(j)+"_"; + String prefix = seqPrefix+"rssregexp_"+Integer.toString(j)+"_"; String match = variableContext.getParameter(prefix+"match"); String map = variableContext.getParameter(prefix+"map"); if (map == null) @@ -4494,12 +4539,12 @@ public class WebcrawlerConnector extends } } // Now, do whatever action we were told to do. - String rssop = variableContext.getParameter("rssop"); + String rssop = variableContext.getParameter(seqPrefix+"rssop"); if (rssop != null && rssop.equals("Add")) { // Add a match to the end - String match = variableContext.getParameter("rssmatch"); - String map = variableContext.getParameter("rssmap"); + String match = variableContext.getParameter(seqPrefix+"rssmatch"); + String map = variableContext.getParameter(seqPrefix+"rssmap"); SpecificationNode node = new SpecificationNode(WebcrawlerConfig.NODE_MAP); node.setAttribute(WebcrawlerConfig.ATTR_MATCH,match); node.setAttribute(WebcrawlerConfig.ATTR_MAP,map); @@ -4507,7 +4552,7 @@ public class WebcrawlerConnector extends } else if (rssop != null && rssop.equals("Delete")) { - int index = Integer.parseInt(variableContext.getParameter("rssindex")); + int index = Integer.parseInt(variableContext.getParameter(seqPrefix+"rssindex")); int j = 0; while (j < ds.getChildCount()) { @@ -4526,7 +4571,7 @@ public class WebcrawlerConnector extends } // Get excluded headers - String excludedHeadersPresent = variableContext.getParameter("excludedheaders_present"); + String excludedHeadersPresent = variableContext.getParameter(seqPrefix+"excludedheaders_present"); if (excludedHeadersPresent != null) { // Delete existing excludedheader record first @@ -4539,7 +4584,7 @@ public class WebcrawlerConnector extends else i++; } - String[] excludedHeaders = variableContext.getParameterValues("excludedheaders"); + String[] excludedHeaders = variableContext.getParameterValues(seqPrefix+"excludedheaders"); if (excludedHeaders != null) { for (String excludedHeader : excludedHeaders) @@ -4552,7 +4597,7 @@ public class WebcrawlerConnector extends } // Get the seeds - String seeds = variableContext.getParameter("seeds"); + String seeds = variableContext.getParameter(seqPrefix+"seeds"); if (seeds != null) { // Delete existing seeds record first @@ -4572,7 +4617,7 @@ public class WebcrawlerConnector extends } // Get the inclusions - String inclusions = variableContext.getParameter("inclusions"); + String inclusions = variableContext.getParameter(seqPrefix+"inclusions"); if (inclusions != null) { // Delete existing inclusions record first @@ -4592,7 +4637,7 @@ public class WebcrawlerConnector extends } // Get the index inclusions - String inclusionsIndex = variableContext.getParameter("inclusionsindex"); + String inclusionsIndex = variableContext.getParameter(seqPrefix+"inclusionsindex"); if (inclusionsIndex != null) { // Delete existing index inclusions record first @@ -4612,7 +4657,7 @@ public class WebcrawlerConnector extends } // Handle the seeds-only switch - String matchingHostsPresent = variableContext.getParameter("matchinghosts_present"); + String matchingHostsPresent = variableContext.getParameter(seqPrefix+"matchinghosts_present"); if (matchingHostsPresent != null) { // Delete existing switch record first @@ -4626,14 +4671,14 @@ public class WebcrawlerConnector extends i++; } - String matchingHosts = variableContext.getParameter("matchinghosts"); + String matchingHosts = variableContext.getParameter(seqPrefix+"matchinghosts"); SpecificationNode cn = new SpecificationNode(WebcrawlerConfig.NODE_LIMITTOSEEDS); cn.setAttribute(WebcrawlerConfig.ATTR_VALUE,(matchingHosts==null||matchingHosts.equals("false"))?"false":"true"); ds.addChild(ds.getChildCount(),cn); } // Get the exclusions - String exclusions = variableContext.getParameter("exclusions"); + String exclusions = variableContext.getParameter(seqPrefix+"exclusions"); if (exclusions != null) { // Delete existing exclusions record first @@ -4653,7 +4698,7 @@ public class WebcrawlerConnector extends } // Get the index exclusions - String exclusionsIndex = variableContext.getParameter("exclusionsindex"); + String exclusionsIndex = variableContext.getParameter(seqPrefix+"exclusionsindex"); if (exclusionsIndex != null) { // Delete existing exclusions record first @@ -4673,7 +4718,7 @@ public class WebcrawlerConnector extends } // Read the url specs - String urlRegexpCount = variableContext.getParameter("urlregexpcount"); + String urlRegexpCount = variableContext.getParameter(seqPrefix+"urlregexpcount"); if (urlRegexpCount != null && urlRegexpCount.length() > 0) { int regexpCount = Integer.parseInt(urlRegexpCount); @@ -4688,12 +4733,12 @@ public class WebcrawlerConnector extends } // Grab the operation and the index (if any) - String operation = variableContext.getParameter("urlregexpop"); + String operation = variableContext.getParameter(seqPrefix+"urlregexpop"); if (operation == null) operation = "Continue"; int opIndex = -1; if (operation.equals("Delete")) - opIndex = Integer.parseInt(variableContext.getParameter("urlregexpnumber")); + opIndex = Integer.parseInt(variableContext.getParameter(seqPrefix+"urlregexpnumber")); // Reconstruct urlspec nodes j = 0; @@ -4703,13 +4748,13 @@ public class WebcrawlerConnector extends if (!operation.equals("Delete") || j != opIndex) { // Add the jth node - String regexp = variableContext.getParameter("urlregexp_"+Integer.toString(j)); - String regexpDescription = variableContext.getParameter("urlregexpdesc_"+Integer.toString(j)); - String reorder = variableContext.getParameter("urlregexpreorder_"+Integer.toString(j)); - String javaSession = variableContext.getParameter("urlregexpjava_"+Integer.toString(j)); - String aspSession = variableContext.getParameter("urlregexpasp_"+Integer.toString(j)); - String phpSession = variableContext.getParameter("urlregexpphp_"+Integer.toString(j)); - String bvSession = variableContext.getParameter("urlregexpbv_"+Integer.toString(j)); + String regexp = variableContext.getParameter(seqPrefix+"urlregexp_"+Integer.toString(j)); + String regexpDescription = variableContext.getParameter(seqPrefix+"urlregexpdesc_"+Integer.toString(j)); + String reorder = variableContext.getParameter(seqPrefix+"urlregexpreorder_"+Integer.toString(j)); + String javaSession = variableContext.getParameter(seqPrefix+"urlregexpjava_"+Integer.toString(j)); + String aspSession = variableContext.getParameter(seqPrefix+"urlregexpasp_"+Integer.toString(j)); + String phpSession = variableContext.getParameter(seqPrefix+"urlregexpphp_"+Integer.toString(j)); + String bvSession = variableContext.getParameter(seqPrefix+"urlregexpbv_"+Integer.toString(j)); SpecificationNode newSn = new SpecificationNode(WebcrawlerConfig.NODE_URLSPEC); newSn.setAttribute(WebcrawlerConfig.ATTR_REGEXP,regexp); if (regexpDescription != null && regexpDescription.length() > 0) @@ -4730,13 +4775,13 @@ public class WebcrawlerConnector extends } if (operation.equals("Add")) { - String regexp = variableContext.getParameter("urlregexp"); - String regexpDescription = variableContext.getParameter("urlregexpdesc"); - String reorder = variableContext.getParameter("urlregexpreorder"); - String javaSession = variableContext.getParameter("urlregexpjava"); - String aspSession = variableContext.getParameter("urlregexpasp"); - String phpSession = variableContext.getParameter("urlregexpphp"); - String bvSession = variableContext.getParameter("urlregexpbv"); + String regexp = variableContext.getParameter(seqPrefix+"urlregexp"); + String regexpDescription = variableContext.getParameter(seqPrefix+"urlregexpdesc"); + String reorder = variableContext.getParameter(seqPrefix+"urlregexpreorder"); + String javaSession = variableContext.getParameter(seqPrefix+"urlregexpjava"); + String aspSession = variableContext.getParameter(seqPrefix+"urlregexpasp"); + String phpSession = variableContext.getParameter(seqPrefix+"urlregexpphp"); + String bvSession = variableContext.getParameter(seqPrefix+"urlregexpbv"); // Add a new node at the end SpecificationNode newSn = new SpecificationNode(WebcrawlerConfig.NODE_URLSPEC); @@ -4757,7 +4802,7 @@ public class WebcrawlerConnector extends } } - String xc = variableContext.getParameter("tokencount"); + String xc = variableContext.getParameter(seqPrefix+"tokencount"); if (xc != null) { // Delete all tokens first @@ -4776,7 +4821,7 @@ public class WebcrawlerConnector extends while (i < accessCount) { String accessDescription = "_"+Integer.toString(i); - String accessOpName = "accessop"+accessDescription; + String accessOpName = seqPrefix+"accessop"+accessDescription; xc = variableContext.getParameter(accessOpName); if (xc != null && xc.equals("Delete")) { @@ -4785,24 +4830,24 @@ public class WebcrawlerConnector extends continue; } // Get the stuff we need - String accessSpec = variableContext.getParameter("spectoken"+accessDescription); + String accessSpec = variableContext.getParameter(seqPrefix+"spectoken"+accessDescription); SpecificationNode node = new SpecificationNode(WebcrawlerConfig.NODE_ACCESS); node.setAttribute(WebcrawlerConfig.ATTR_TOKEN,accessSpec); ds.addChild(ds.getChildCount(),node); i++; } - String op = variableContext.getParameter("accessop"); + String op = variableContext.getParameter(seqPrefix+"accessop"); if (op != null && op.equals("Add")) { - String accessspec = variableContext.getParameter("spectoken"); + String accessspec = variableContext.getParameter(seqPrefix+"spectoken"); SpecificationNode node = new SpecificationNode(WebcrawlerConfig.NODE_ACCESS); node.setAttribute(WebcrawlerConfig.ATTR_TOKEN,accessspec); ds.addChild(ds.getChildCount(),node); } } - xc = variableContext.getParameter("metadatacount"); + xc = variableContext.getParameter(seqPrefix+"metadatacount"); if (xc != null) { // Delete all tokens first @@ -4821,7 +4866,7 @@ public class WebcrawlerConnector extends while (i < metadataCount) { String metadataDescription = "_"+Integer.toString(i); - String metadataOpName = "metadataop"+metadataDescription; + String metadataOpName = seqPrefix+"metadataop"+metadataDescription; xc = variableContext.getParameter(metadataOpName); if (xc != null && xc.equals("Delete")) { @@ -4830,8 +4875,8 @@ public class WebcrawlerConnector extends continue; } // Get the stuff we need - String metaNameSpec = variableContext.getParameter("specmetaname"+metadataDescription); - String metaValueSpec = variableContext.getParameter("specmetavalue"+metadataDescription); + String metaNameSpec = variableContext.getParameter(seqPrefix+"specmetaname"+metadataDescription); + String metaValueSpec = variableContext.getParameter(seqPrefix+"specmetavalue"+metadataDescription); SpecificationNode node = new SpecificationNode(WebcrawlerConfig.NODE_METADATA); node.setAttribute(WebcrawlerConfig.ATTR_NAME,metaNameSpec); node.setAttribute(WebcrawlerConfig.ATTR_VALUE,metaValueSpec); @@ -4839,11 +4884,11 @@ public class WebcrawlerConnector extends i++; } - String op = variableContext.getParameter("metadataop"); + String op = variableContext.getParameter(seqPrefix+"metadataop"); if (op != null && op.equals("Add")) { - String metaNameSpec = variableContext.getParameter("specmetaname"); - String metaValueSpec = variableContext.getParameter("specmetavalue"); + String metaNameSpec = variableContext.getParameter(seqPrefix+"specmetaname"); + String metaValueSpec = variableContext.getParameter(seqPrefix+"specmetavalue"); SpecificationNode node = new SpecificationNode(WebcrawlerConfig.NODE_METADATA); node.setAttribute(WebcrawlerConfig.ATTR_NAME,metaNameSpec); @@ -4856,13 +4901,18 @@ public class WebcrawlerConnector extends } /** View specification. - * This method is called in the body section of a job's view page. Its purpose is to present the document specification information to the user. - * The coder can presume that the HTML that is output from this configuration will be within appropriate <html> and <body> tags. + * This method is called in the body section of a job's view page. Its purpose is to present the document + * specification information to the user. The coder can presume that the HTML that is output from + * this configuration will be within appropriate <html> and <body> tags. + * The connector will be connected before this method can be called. *@param out is the output to which any HTML should be sent. + *@param locale is the locale the output is preferred to be in. *@param ds is the current document specification for this job. + *@param connectionSequenceNumber is the unique number of this connection within the job. */ @Override - public void viewSpecification(IHTTPOutput out, Locale locale, DocumentSpecification ds) + public void viewSpecification(IHTTPOutput out, Locale locale, Specification ds, + int connectionSequenceNumber) throws ManifoldCFException, IOException { int j;
Modified: manifoldcf/branches/dev_1x/connectors/webcrawler/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/webcrawler/tests/NavigationDerbyUI.java URL: http://svn.apache.org/viewvc/manifoldcf/branches/dev_1x/connectors/webcrawler/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/webcrawler/tests/NavigationDerbyUI.java?rev=1626026&r1=1626025&r2=1626026&view=diff ============================================================================== --- manifoldcf/branches/dev_1x/connectors/webcrawler/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/webcrawler/tests/NavigationDerbyUI.java (original) +++ manifoldcf/branches/dev_1x/connectors/webcrawler/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/webcrawler/tests/NavigationDerbyUI.java Thu Sep 18 16:56:59 2014 @@ -223,7 +223,7 @@ public class NavigationDerbyUI extends B link.click(); window = testerInstance.findWindow(null); form = window.findForm(testerInstance.createStringDescription("editjob")); - textarea = form.findTextarea(testerInstance.createStringDescription("seeds")); + textarea = form.findTextarea(testerInstance.createStringDescription("s0_seeds")); textarea.setValue(testerInstance.createStringDescription("http://www.cnn.com")); // Canonicalization tab link = window.findLink(testerInstance.createStringDescription("Canonicalization tab")); @@ -248,7 +248,7 @@ public class NavigationDerbyUI extends B link.click(); window = testerInstance.findWindow(null); form = window.findForm(testerInstance.createStringDescription("editjob")); - checkbox = form.findCheckbox(testerInstance.createStringDescription("matchinghosts"), + checkbox = form.findCheckbox(testerInstance.createStringDescription("s0_matchinghosts"), testerInstance.createStringDescription("true")); checkbox.select(); // Exclusions tab Propchange: manifoldcf/branches/dev_1x/connectors/wiki/ ------------------------------------------------------------------------------ Merged /manifoldcf/trunk/connectors/wiki:r1621855,1622740 Modified: manifoldcf/branches/dev_1x/connectors/wiki/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/wiki/WikiConnector.java URL: http://svn.apache.org/viewvc/manifoldcf/branches/dev_1x/connectors/wiki/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/wiki/WikiConnector.java?rev=1626026&r1=1626025&r2=1626026&view=diff ============================================================================== --- manifoldcf/branches/dev_1x/connectors/wiki/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/wiki/WikiConnector.java (original) +++ manifoldcf/branches/dev_1x/connectors/wiki/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/wiki/WikiConnector.java Thu Sep 18 16:56:59 2014 @@ -1465,51 +1465,73 @@ public class WikiConnector extends org.a } + /** Obtain the name of the form check javascript method to call. + *@param connectionSequenceNumber is the unique number of this connection within the job. + *@return the name of the form check javascript method. + */ + @Override + public String getFormCheckJavascriptMethodName(int connectionSequenceNumber) + { + return "s"+connectionSequenceNumber+"_checkSpecification"; + //return "checkSpecification"; + } + + /** Obtain the name of the form presave check javascript method to call. + *@param connectionSequenceNumber is the unique number of this connection within the job. + *@return the name of the form presave check javascript method. + */ + @Override + public String getFormPresaveCheckJavascriptMethodName(int connectionSequenceNumber) + { + return "s"+connectionSequenceNumber+"_checkSpecificationForSave"; + //return "checkSpecificationForSave"; + } + /** Output the specification header section. - * This method is called in the head section of a job page which has selected a repository connection of the current type. Its purpose is to add the required tabs - * to the list, and to output any javascript methods that might be needed by the job editing HTML. + * This method is called in the head section of a job page which has selected a repository connection of the + * current type. Its purpose is to add the required tabs to the list, and to output any javascript methods + * that might be needed by the job editing HTML. + * The connector will be connected before this method can be called. *@param out is the output to which any HTML should be sent. + *@param locale is the locale the output is preferred to be in. *@param ds is the current document specification for this job. + *@param connectionSequenceNumber is the unique number of this connection within the job. *@param tabsArray is an array of tab names. Add to this array any tab names that are specific to the connector. */ @Override - public void outputSpecificationHeader(IHTTPOutput out, Locale locale, DocumentSpecification ds, List<String> tabsArray) + public void outputSpecificationHeader(IHTTPOutput out, Locale locale, Specification ds, + int connectionSequenceNumber, List<String> tabsArray) throws ManifoldCFException, IOException { tabsArray.add(Messages.getString(locale,"WikiConnector.NamespaceAndTitles")); tabsArray.add(Messages.getString(locale, "WikiConnector.Security")); - + String seqPrefix = "s"+connectionSequenceNumber+"_"; + out.print( "<script type=\"text/javascript\">\n"+ "<!--\n"+ -"function checkSpecification()\n"+ +"function "+seqPrefix+"NsDelete(k)\n"+ "{\n"+ -" // Does nothing right now.\n"+ -" return true;\n"+ +" "+seqPrefix+"SpecOp(\""+seqPrefix+"nsop_\"+k, \"Delete\", \""+seqPrefix+"ns_\"+k);\n"+ "}\n"+ "\n"+ -"function NsDelete(k)\n"+ +"function "+seqPrefix+"NsAdd(k)\n"+ "{\n"+ -" SpecOp(\"nsop_\"+k, \"Delete\", \"ns_\"+k);\n"+ +" "+seqPrefix+"SpecOp(\""+seqPrefix+"nsop\", \"Add\", \""+seqPrefix+"ns_\"+k);\n"+ "}\n"+ "\n"+ -"function NsAdd(k)\n"+ +"function "+seqPrefix+"SpecAddToken(anchorvalue)\n"+ "{\n"+ -" SpecOp(\"nsop\", \"Add\", \"ns_\"+k);\n"+ -"}\n"+ -"\n"+ -"function SpecAddToken(anchorvalue)\n"+ -"{\n"+ -" if (editjob.spectoken.value == \"\")\n"+ +" if (editjob."+seqPrefix+"spectoken.value == \"\")\n"+ " {\n"+ " alert(\"" + Messages.getBodyJavascriptString(locale, "WikiConnector.TypeInAnAccessToken") + "\");\n"+ -" editjob.spectoken.focus();\n"+ +" editjob."+seqPrefix+"spectoken.focus();\n"+ " return;\n"+ " }\n"+ -" SpecOp(\"accessop\",\"Add\",anchorvalue);\n"+ +" "+seqPrefix+"SpecOp(\""+seqPrefix+"accessop\",\"Add\",anchorvalue);\n"+ "}\n"+ "\n"+ -"function SpecOp(n, opValue, anchorvalue)\n"+ +"function "+seqPrefix+"SpecOp(n, opValue, anchorvalue)\n"+ "{\n"+ " eval(\"editjob.\"+n+\".value = \\\"\"+opValue+\"\\\"\");\n"+ " postFormSetAnchor(anchorvalue);\n"+ @@ -1521,19 +1543,27 @@ public class WikiConnector extends org.a } /** Output the specification body section. - * This method is called in the body section of a job page which has selected a repository connection of the current type. Its purpose is to present the required form elements for editing. - * The coder can presume that the HTML that is output from this configuration will be within appropriate <html>, <body>, and <form> tags. The name of the - * form is "editjob". + * This method is called in the body section of a job page which has selected a repository connection of the + * current type. Its purpose is to present the required form elements for editing. + * The coder can presume that the HTML that is output from this configuration will be within appropriate + * <html>, <body>, and <form> tags. The name of the form is always "editjob". + * The connector will be connected before this method can be called. *@param out is the output to which any HTML should be sent. + *@param locale is the locale the output is preferred to be in. *@param ds is the current document specification for this job. - *@param tabName is the current tab name. + *@param connectionSequenceNumber is the unique number of this connection within the job. + *@param actualSequenceNumber is the connection within the job that has currently been selected. + *@param tabName is the current tab name. (actualSequenceNumber, tabName) form a unique tuple within + * the job. */ @Override - - public void outputSpecificationBody(IHTTPOutput out, Locale locale, DocumentSpecification ds, String tabName) + public void outputSpecificationBody(IHTTPOutput out, Locale locale, Specification ds, + int connectionSequenceNumber, int actualSequenceNumber, String tabName) throws ManifoldCFException, IOException { - if (tabName.equals(Messages.getString(locale,"WikiConnector.NamespaceAndTitles"))) + String seqPrefix = "s"+connectionSequenceNumber+"_"; + + if (tabName.equals(Messages.getString(locale,"WikiConnector.NamespaceAndTitles")) && connectionSequenceNumber == actualSequenceNumber) { boolean seenAny = false; // Output table column headers @@ -1560,18 +1590,18 @@ public class WikiConnector extends org.a String namespace = sn.getAttributeValue(WikiConfig.ATTR_NAMESPACE); String titlePrefix = sn.getAttributeValue(WikiConfig.ATTR_TITLEPREFIX); - String nsOpName = "nsop_"+k; - String nsNsName = "nsnsname_"+k; - String nsTitlePrefix = "nstitleprefix_"+k; + String nsOpName = seqPrefix+"nsop_"+k; + String nsNsName = seqPrefix+"nsnsname_"+k; + String nsTitlePrefix = seqPrefix+"nstitleprefix_"+k; out.print( " <tr class=\""+(((k % 2)==0)?"evenformrow":"oddformrow")+"\">\n"+ " <td class=\"formcolumncell\">\n"+ " <nobr>\n"+ -" <a name=\""+"ns_"+Integer.toString(k)+"\"/>\n"+ +" <a name=\""+seqPrefix+"ns_"+Integer.toString(k)+"\"/>\n"+ " <input type=\"hidden\" name=\""+nsOpName+"\" value=\"\"/>\n"+ " <input type=\"hidden\" name=\""+nsNsName+"\" value=\""+((namespace==null)?"":org.apache.manifoldcf.ui.util.Encoder.attributeEscape(namespace))+"\"/>\n"+ " <input type=\"hidden\" name=\""+nsTitlePrefix+"\" value=\""+((titlePrefix==null)?"":org.apache.manifoldcf.ui.util.Encoder.attributeEscape(titlePrefix))+"\"/>\n"+ -" <input type=\"button\" value=\"" + Messages.getAttributeString(locale,"WikiConnector.Delete") + "\" onClick='Javascript:NsDelete("+Integer.toString(k)+")' alt=\""+Messages.getAttributeString(locale,"WikiConnector.DeleteNamespaceTitle")+Integer.toString(k)+"\"/>\n"+ +" <input type=\"button\" value=\"" + Messages.getAttributeString(locale,"WikiConnector.Delete") + "\" onClick='Javascript:"+seqPrefix+"NsDelete("+Integer.toString(k)+")' alt=\""+Messages.getAttributeString(locale,"WikiConnector.DeleteNamespaceTitle")+Integer.toString(k)+"\"/>\n"+ " </nobr>\n"+ " </td>\n"+ " <td class=\"formcolumncell\">\n"+ @@ -1621,15 +1651,15 @@ public class WikiConnector extends org.a " <tr class=\"formrow\">\n"+ " <td class=\"formcolumncell\">\n"+ " <nobr>\n"+ -" <a name=\""+"ns_"+Integer.toString(k)+"\"/>\n"+ -" <input type=\"hidden\" name=\"nsop\" value=\"\"/>\n"+ -" <input type=\"hidden\" name=\"nscount\" value=\""+Integer.toString(k)+"\"/>\n"+ -" <input type=\"button\" value=\"" + Messages.getAttributeString(locale,"WikiConnector.Add") + "\" onClick='Javascript:NsAdd("+Integer.toString(k)+")' alt=\"" + Messages.getAttributeString(locale,"WikiConnector.AddNamespacePrefix") + "\"/>\n"+ +" <a name=\""+seqPrefix+"ns_"+Integer.toString(k)+"\"/>\n"+ +" <input type=\"hidden\" name=\""+seqPrefix+"nsop\" value=\"\"/>\n"+ +" <input type=\"hidden\" name=\""+seqPrefix+"nscount\" value=\""+Integer.toString(k)+"\"/>\n"+ +" <input type=\"button\" value=\"" + Messages.getAttributeString(locale,"WikiConnector.Add") + "\" onClick='Javascript:"+seqPrefix+"NsAdd("+Integer.toString(k)+")' alt=\"" + Messages.getAttributeString(locale,"WikiConnector.AddNamespacePrefix") + "\"/>\n"+ " </nobr>\n"+ " </td>\n"+ " <td class=\"formcolumncell\">\n"+ " <nobr>\n"+ -" <select name=\"nsnsname\">\n"+ +" <select name=\""+seqPrefix+"nsnsname\">\n"+ " <option value=\"\" selected=\"true\">-- " + Messages.getBodyString(locale,"WikiConnector.UseDefault") + " --</option>\n" ); for (int l = 0 ; l < nameSpaceNames.length ; l++) @@ -1647,7 +1677,7 @@ public class WikiConnector extends org.a " </td>\n"+ " <td class=\"formcolumncell\">\n"+ " <nobr>\n"+ -" <input type=\"text\" name=\"nstitleprefix\" size=\"16\" value=\"\"/>\n"+ +" <input type=\"text\" name=\""+seqPrefix+"nstitleprefix\" size=\"16\" value=\"\"/>\n"+ " </nobr>\n"+ " </td>\n"+ " </tr>\n" @@ -1680,8 +1710,8 @@ public class WikiConnector extends org.a String namespace = sn.getAttributeValue(WikiConfig.ATTR_NAMESPACE); String titlePrefix = sn.getAttributeValue(WikiConfig.ATTR_TITLEPREFIX); - String nsNsName = "nsnsname_"+k; - String nsTitlePrefix = "nstitleprefix_"+k; + String nsNsName = seqPrefix+"nsnsname_"+k; + String nsTitlePrefix = seqPrefix+"nstitleprefix_"+k; out.print( "<input type=\"hidden\" name=\""+nsNsName+"\" value=\""+((namespace == null)?"":org.apache.manifoldcf.ui.util.Encoder.attributeEscape(namespace))+"\"/>\n"+ @@ -1691,11 +1721,11 @@ public class WikiConnector extends org.a } } out.print( -"<input type=\"hidden\" name=\"nscount\" value=\""+new Integer(k)+"\"/>\n" +"<input type=\"hidden\" name=\""+seqPrefix+"nscount\" value=\""+new Integer(k)+"\"/>\n" ); } - if (tabName.equals(Messages.getString(locale, "WikiConnector.Security"))) + if (tabName.equals(Messages.getString(locale, "WikiConnector.Security")) && connectionSequenceNumber == actualSequenceNumber) { out.print( "<table class=\"displaytable\">\n"+ @@ -1708,15 +1738,15 @@ public class WikiConnector extends org.a SpecificationNode sn = ds.getChild(i++); if (sn.getType().equals("access")) { String accessDescription = "_" + Integer.toString(k); - String accessOpName = "accessop" + accessDescription; + String accessOpName = seqPrefix + "accessop" + accessDescription; String token = sn.getAttributeValue("token"); out.print( " <tr>\n"+ " <td class=\"description\">\n"+ " <input type=\"hidden\" name=\"" + accessOpName + "\" value=\"\"/>\n"+ -" <input type=\"hidden\" name=\"" + "spectoken" + accessDescription + "\" value=\"" + org.apache.manifoldcf.ui.util.Encoder.attributeEscape(token) + "\"/>\n"+ -" <a name=\"" + "token_" + Integer.toString(k) + "\">\n"+ -" <input type=\"button\" value=\"" + Messages.getAttributeString(locale, "WikiConnector.Delete") + "\" onClick='Javascript:SpecOp(\"" + accessOpName + "\",\"Delete\",\"token_" + Integer.toString(k) + "\")' alt=\"" + Messages.getAttributeString(locale, "WikiConnector.Delete") + Integer.toString(k) + "\"/>\n"+ +" <input type=\"hidden\" name=\"" + seqPrefix + "spectoken" + accessDescription + "\" value=\"" + org.apache.manifoldcf.ui.util.Encoder.attributeEscape(token) + "\"/>\n"+ +" <a name=\"" + seqPrefix + "token_" + Integer.toString(k) + "\">\n"+ +" <input type=\"button\" value=\"" + Messages.getAttributeString(locale, "WikiConnector.Delete") + "\" onClick='Javascript:"+seqPrefix+"SpecOp(\"" + accessOpName + "\",\"Delete\",\""+seqPrefix+"token_" + Integer.toString(k) + "\")' alt=\"" + Messages.getAttributeString(locale, "WikiConnector.Delete") + Integer.toString(k) + "\"/>\n"+ " </a> \n"+ " </td>\n"+ " <td class=\"value\">\n"+ @@ -1738,14 +1768,14 @@ public class WikiConnector extends org.a " <tr><td class=\"lightseparator\" colspan=\"2\"><hr/></td></tr>\n"+ " <tr>\n"+ " <td class=\"description\">\n"+ -" <input type=\"hidden\" name=\"tokencount\" value=\"" + Integer.toString(k) + "\"/>\n"+ -" <input type=\"hidden\" name=\"accessop\" value=\"\"/>\n"+ -" <a name=\"" + "token_" + Integer.toString(k) + "\">\n"+ -" <input type=\"button\" value=\"" + Messages.getAttributeString(locale, "WikiConnector.Add") + "\" onClick='Javascript:SpecAddToken(\"token_" + Integer.toString(k + 1) + "\")' alt=\"" + Messages.getAttributeString(locale, "WikiConnector.Add") + "\"/>\n"+ +" <input type=\"hidden\" name=\""+seqPrefix+"tokencount\" value=\"" + Integer.toString(k) + "\"/>\n"+ +" <input type=\"hidden\" name=\""+seqPrefix+"accessop\" value=\"\"/>\n"+ +" <a name=\"" + seqPrefix + "token_" + Integer.toString(k) + "\">\n"+ +" <input type=\"button\" value=\"" + Messages.getAttributeString(locale, "WikiConnector.Add") + "\" onClick='Javascript:"+seqPrefix+"SpecAddToken(\""+seqPrefix+"token_" + Integer.toString(k + 1) + "\")' alt=\"" + Messages.getAttributeString(locale, "WikiConnector.Add") + "\"/>\n"+ " </a> \n"+ " </td>\n"+ " <td class=\"value\">\n"+ -" <input type=\"text\" size=\"30\" name=\"spectoken\" value=\"\"/>\n"+ +" <input type=\"text\" size=\"30\" name=\""+seqPrefix+"spectoken\" value=\"\"/>\n"+ " </td>\n"+ " </tr>\n"+ "</table>\n" @@ -1762,30 +1792,37 @@ public class WikiConnector extends org.a String accessDescription = "_" + Integer.toString(k); String token = sn.getAttributeValue("token"); out.print( -"<input type=\"hidden\" name=\"" + "spectoken" + accessDescription + "\" value=\"" + org.apache.manifoldcf.ui.util.Encoder.attributeEscape(token) + "\"/>\n" +"<input type=\"hidden\" name=\"" + seqPrefix + "spectoken" + accessDescription + "\" value=\"" + org.apache.manifoldcf.ui.util.Encoder.attributeEscape(token) + "\"/>\n" ); k++; } } out.print( -"<input type=\"hidden\" name=\"tokencount\" value=\"" + Integer.toString(k) + "\"/>\n" +"<input type=\"hidden\" name=\""+seqPrefix+"tokencount\" value=\"" + Integer.toString(k) + "\"/>\n" ); } } /** Process a specification post. - * This method is called at the start of job's edit or view page, whenever there is a possibility that form data for a connection has been - * posted. Its purpose is to gather form information and modify the document specification accordingly. - * The name of the posted form is "editjob". + * This method is called at the start of job's edit or view page, whenever there is a possibility that form + * data for a connection has been posted. Its purpose is to gather form information and modify the + * document specification accordingly. The name of the posted form is always "editjob". + * The connector will be connected before this method can be called. *@param variableContext contains the post data, including binary file-upload information. + *@param locale is the locale the output is preferred to be in. *@param ds is the current document specification for this job. - *@return null if all is well, or a string error message if there is an error that should prevent saving of the job (and cause a redirection to an error page). + *@param connectionSequenceNumber is the unique number of this connection within the job. + *@return null if all is well, or a string error message if there is an error that should prevent saving of + * the job (and cause a redirection to an error page). */ @Override - public String processSpecificationPost(IPostParameters variableContext, Locale locale, DocumentSpecification ds) + public String processSpecificationPost(IPostParameters variableContext, Locale locale, Specification ds, + int connectionSequenceNumber) throws ManifoldCFException { - String countString = variableContext.getParameter("nscount"); + String seqPrefix = "s"+connectionSequenceNumber+"_"; + + String countString = variableContext.getParameter(seqPrefix+"nscount"); if (countString != null) { for (int i = 0 ; i < ds.getChildCount() ; i++) @@ -1800,9 +1837,9 @@ public class WikiConnector extends org.a int nsCount = Integer.parseInt(countString); for (int i = 0 ; i < nsCount ; i++) { - String nsOpName = "nsop_"+i; - String nsNsName = "nsnsname_"+i; - String nsTitlePrefix = "nstitleprefix_"+i; + String nsOpName = seqPrefix+"nsop_"+i; + String nsNsName = seqPrefix+"nsnsname_"+i; + String nsTitlePrefix = seqPrefix+"nstitleprefix_"+i; String nsOp = variableContext.getParameter(nsOpName); if (nsOp == null || !nsOp.equals("Delete")) @@ -1822,13 +1859,13 @@ public class WikiConnector extends org.a } } - String newOp = variableContext.getParameter("nsop"); + String newOp = variableContext.getParameter(seqPrefix+"nsop"); if (newOp != null && newOp.equals("Add")) { - String namespaceName = variableContext.getParameter("nsnsname"); + String namespaceName = variableContext.getParameter(seqPrefix+"nsnsname"); if (namespaceName != null && namespaceName.length() == 0) namespaceName = null; - String titlePrefix = variableContext.getParameter("nstitleprefix"); + String titlePrefix = variableContext.getParameter(seqPrefix+"nstitleprefix"); if (titlePrefix != null && titlePrefix.length() == 0) titlePrefix = null; SpecificationNode sn = new SpecificationNode(WikiConfig.NODE_NAMESPACE_TITLE_PREFIX); @@ -1840,7 +1877,7 @@ public class WikiConnector extends org.a } } - String xc = variableContext.getParameter("tokencount"); + String xc = variableContext.getParameter(seqPrefix+"tokencount"); if (xc != null) { // Delete all tokens first int i = 0; @@ -1857,7 +1894,7 @@ public class WikiConnector extends org.a i = 0; while (i < accessCount) { String accessDescription = "_" + Integer.toString(i); - String accessOpName = "accessop" + accessDescription; + String accessOpName = seqPrefix +"accessop" + accessDescription; xc = variableContext.getParameter(accessOpName); if (xc != null && xc.equals("Delete")) { // Next row @@ -1865,16 +1902,16 @@ public class WikiConnector extends org.a continue; } // Get the stuff we need - String accessSpec = variableContext.getParameter("spectoken" + accessDescription); + String accessSpec = variableContext.getParameter(seqPrefix + "spectoken" + accessDescription); SpecificationNode node = new SpecificationNode("access"); node.setAttribute("token", accessSpec); ds.addChild(ds.getChildCount(), node); i++; } - String op = variableContext.getParameter("accessop"); + String op = variableContext.getParameter(seqPrefix+"accessop"); if (op != null && op.equals("Add")) { - String accessspec = variableContext.getParameter("spectoken"); + String accessspec = variableContext.getParameter(seqPrefix+"spectoken"); SpecificationNode node = new SpecificationNode("access"); node.setAttribute("token", accessspec); ds.addChild(ds.getChildCount(), node); @@ -1885,13 +1922,18 @@ public class WikiConnector extends org.a } /** View specification. - * This method is called in the body section of a job's view page. Its purpose is to present the document specification information to the user. - * The coder can presume that the HTML that is output from this configuration will be within appropriate <html> and <body> tags. + * This method is called in the body section of a job's view page. Its purpose is to present the document + * specification information to the user. The coder can presume that the HTML that is output from + * this configuration will be within appropriate <html> and <body> tags. + * The connector will be connected before this method can be called. *@param out is the output to which any HTML should be sent. + *@param locale is the locale the output is preferred to be in. *@param ds is the current document specification for this job. + *@param connectionSequenceNumber is the unique number of this connection within the job. */ @Override - public void viewSpecification(IHTTPOutput out, Locale locale, DocumentSpecification ds) + public void viewSpecification(IHTTPOutput out, Locale locale, Specification ds, + int connectionSequenceNumber) throws ManifoldCFException, IOException { out.print(
