Author: shinichiro
Date: Thu Sep 24 12:06:59 2015
New Revision: 1705040
URL: http://svn.apache.org/viewvc?rev=1705040&view=rev
Log:
Fix for CONNECTORS-1234
Modified:
manifoldcf/trunk/CHANGES.txt
manifoldcf/trunk/connectors/elasticsearch/connector/src/main/java/org/apache/manifoldcf/agents/output/elasticsearch/ElasticSearchConfig.java
manifoldcf/trunk/connectors/elasticsearch/connector/src/main/java/org/apache/manifoldcf/agents/output/elasticsearch/ElasticSearchConnector.java
manifoldcf/trunk/connectors/elasticsearch/connector/src/main/java/org/apache/manifoldcf/agents/output/elasticsearch/ElasticSearchIndex.java
manifoldcf/trunk/connectors/elasticsearch/connector/src/main/java/org/apache/manifoldcf/agents/output/elasticsearch/ElasticSearchParam.java
manifoldcf/trunk/connectors/elasticsearch/connector/src/main/native2ascii/org/apache/manifoldcf/agents/output/elasticsearch/common_en_US.properties
manifoldcf/trunk/connectors/elasticsearch/connector/src/main/native2ascii/org/apache/manifoldcf/agents/output/elasticsearch/common_ja_JP.properties
manifoldcf/trunk/connectors/elasticsearch/connector/src/main/native2ascii/org/apache/manifoldcf/agents/output/elasticsearch/common_zh_CN.properties
manifoldcf/trunk/connectors/elasticsearch/connector/src/main/resources/org/apache/manifoldcf/agents/output/elasticsearch/editConfiguration.js
manifoldcf/trunk/connectors/elasticsearch/connector/src/main/resources/org/apache/manifoldcf/agents/output/elasticsearch/editConfiguration_Parameters.html
manifoldcf/trunk/connectors/elasticsearch/connector/src/main/resources/org/apache/manifoldcf/agents/output/elasticsearch/viewConfiguration.html
Modified: manifoldcf/trunk/CHANGES.txt
URL:
http://svn.apache.org/viewvc/manifoldcf/trunk/CHANGES.txt?rev=1705040&r1=1705039&r2=1705040&view=diff
==============================================================================
--- manifoldcf/trunk/CHANGES.txt (original)
+++ manifoldcf/trunk/CHANGES.txt Thu Sep 24 12:06:59 2015
@@ -3,6 +3,10 @@ $Id$
======================= 2.3-dev =====================
+CONNECTORS-1234: Add use-mapper-attachments option
+to Elasticsearch connector.
+(Shinichiro Abe)
+
CONNECTORS-1242: Fix document reprioritization on job resume.
(Niall Colreavy, Karl Wright)
Modified:
manifoldcf/trunk/connectors/elasticsearch/connector/src/main/java/org/apache/manifoldcf/agents/output/elasticsearch/ElasticSearchConfig.java
URL:
http://svn.apache.org/viewvc/manifoldcf/trunk/connectors/elasticsearch/connector/src/main/java/org/apache/manifoldcf/agents/output/elasticsearch/ElasticSearchConfig.java?rev=1705040&r1=1705039&r2=1705040&view=diff
==============================================================================
---
manifoldcf/trunk/connectors/elasticsearch/connector/src/main/java/org/apache/manifoldcf/agents/output/elasticsearch/ElasticSearchConfig.java
(original)
+++
manifoldcf/trunk/connectors/elasticsearch/connector/src/main/java/org/apache/manifoldcf/agents/output/elasticsearch/ElasticSearchConfig.java
Thu Sep 24 12:06:59 2015
@@ -32,8 +32,13 @@ public class ElasticSearchConfig extends
/** Parameters used for the configuration */
final private static ParameterEnum[] CONFIGURATIONLIST =
- { ParameterEnum.SERVERLOCATION, ParameterEnum.INDEXNAME,
- ParameterEnum.INDEXTYPE};
+ {
+ ParameterEnum.SERVERLOCATION,
+ ParameterEnum.INDEXNAME,
+ ParameterEnum.INDEXTYPE,
+ ParameterEnum.USEMAPPERATTACHMENTS,
+ ParameterEnum.CONTENTATTRIBUTENAME
+ };
/** Build a set of ElasticSearchParameters by reading ConfigParams. If the
* value returned by ConfigParams.getParameter is null, the default value is
@@ -73,6 +78,15 @@ public class ElasticSearchConfig extends
if (p != null)
parameters.setParameter(param.name(), p);
}
+
+ String useMapperAttachmentsPresent =
variableContext.getParameter("usemapperattachments_present");
+ if (useMapperAttachmentsPresent != null)
+ {
+ String useMapperAttachments =
variableContext.getParameter(ParameterEnum.USEMAPPERATTACHMENTS.name().toLowerCase());
+ if (useMapperAttachments == null || useMapperAttachments.length() == 0)
+ useMapperAttachments = "false";
+ parameters.setParameter(ParameterEnum.USEMAPPERATTACHMENTS.name(),
useMapperAttachments);
+ }
}
final public String getServerLocation()
@@ -90,4 +104,14 @@ public class ElasticSearchConfig extends
return get(ParameterEnum.INDEXTYPE);
}
+ final public Boolean getUseMapperAttachments()
+ {
+ return Boolean.valueOf(get(ParameterEnum.USEMAPPERATTACHMENTS));
+ }
+
+ final public String getContentAttributeName()
+ {
+ return get(ParameterEnum.CONTENTATTRIBUTENAME);
+ }
+
}
Modified:
manifoldcf/trunk/connectors/elasticsearch/connector/src/main/java/org/apache/manifoldcf/agents/output/elasticsearch/ElasticSearchConnector.java
URL:
http://svn.apache.org/viewvc/manifoldcf/trunk/connectors/elasticsearch/connector/src/main/java/org/apache/manifoldcf/agents/output/elasticsearch/ElasticSearchConnector.java?rev=1705040&r1=1705039&r2=1705040&view=diff
==============================================================================
---
manifoldcf/trunk/connectors/elasticsearch/connector/src/main/java/org/apache/manifoldcf/agents/output/elasticsearch/ElasticSearchConnector.java
(original)
+++
manifoldcf/trunk/connectors/elasticsearch/connector/src/main/java/org/apache/manifoldcf/agents/output/elasticsearch/ElasticSearchConnector.java
Thu Sep 24 12:06:59 2015
@@ -332,6 +332,7 @@ public class ElasticSearchConnector exte
{
HttpClient client = getSession();
ElasticSearchConfig config = getConfigParameters(null);
+
InputStream inputStream = document.getBinaryStream();
// For ES, we have to have fixed fields only; nothing else is possible b/c
we don't have
// default field values.
Modified:
manifoldcf/trunk/connectors/elasticsearch/connector/src/main/java/org/apache/manifoldcf/agents/output/elasticsearch/ElasticSearchIndex.java
URL:
http://svn.apache.org/viewvc/manifoldcf/trunk/connectors/elasticsearch/connector/src/main/java/org/apache/manifoldcf/agents/output/elasticsearch/ElasticSearchIndex.java?rev=1705040&r1=1705039&r2=1705040&view=diff
==============================================================================
---
manifoldcf/trunk/connectors/elasticsearch/connector/src/main/java/org/apache/manifoldcf/agents/output/elasticsearch/ElasticSearchIndex.java
(original)
+++
manifoldcf/trunk/connectors/elasticsearch/connector/src/main/java/org/apache/manifoldcf/agents/output/elasticsearch/ElasticSearchIndex.java
Thu Sep 24 12:06:59 2015
@@ -21,19 +21,21 @@ package org.apache.manifoldcf.agents.out
import java.io.IOException;
import java.io.InputStream;
+import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
+import java.io.Reader;
import java.nio.charset.StandardCharsets;
import java.util.Iterator;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPut;
+import org.apache.http.Consts;
import org.apache.http.HttpEntity;
import org.apache.http.util.EntityUtils;
import org.apache.http.message.BasicHeader;
import org.apache.http.Header;
-
import org.apache.commons.io.IOUtils;
import org.apache.manifoldcf.agents.interfaces.IOutputHistoryActivity;
import org.apache.manifoldcf.agents.interfaces.RepositoryDocument;
@@ -69,9 +71,12 @@ public class ElasticSearchIndex extends
private final String[] shareDenyAcls;
private final String[] parentAcls;
private final String[] parentDenyAcls;
+ private final boolean useMapperAttachments;
+ private final String contentAttributeName;
public IndexRequestEntity(RepositoryDocument document, InputStream
inputStream,
- String[] acls, String[] denyAcls, String[] shareAcls, String[]
shareDenyAcls, String[] parentAcls, String[] parentDenyAcls)
+ String[] acls, String[] denyAcls, String[] shareAcls, String[]
shareDenyAcls, String[] parentAcls, String[] parentDenyAcls,
+ boolean useMapperAttachments, String contentAttributeName)
throws ManifoldCFException
{
this.document = document;
@@ -82,6 +87,8 @@ public class ElasticSearchIndex extends
this.shareDenyAcls = shareDenyAcls;
this.parentAcls = parentAcls;
this.parentDenyAcls = parentDenyAcls;
+ this.useMapperAttachments = useMapperAttachments;
+ this.contentAttributeName = contentAttributeName;
}
@Override
@@ -131,7 +138,7 @@ public class ElasticSearchIndex extends
needComma = writeACLs(pw, needComma, "share", shareAcls,
shareDenyAcls);
needComma = writeACLs(pw, needComma, "parent", parentAcls,
parentDenyAcls);
- if(inputStream!=null){
+ if (useMapperAttachments && inputStream != null) {
if(needComma){
pw.print(",");
}
@@ -151,6 +158,23 @@ public class ElasticSearchIndex extends
pw.print("\"}");
}
+ if (!useMapperAttachments && inputStream != null) {
+ if (contentAttributeName != null)
+ {
+ Reader r = new InputStreamReader(inputStream, Consts.UTF_8);
+ StringBuilder sb = new
StringBuilder((int)document.getBinaryLength());
+ char[] buffer = new char[65536];
+ while (true)
+ {
+ int amt = r.read(buffer,0,buffer.length);
+ if (amt == -1)
+ break;
+ sb.append(buffer,0,amt);
+ }
+ needComma = writeField(pw, needComma, contentAttributeName, new
String[]{sb.toString()});
+ }
+ }
+
pw.print("}");
} catch (ManifoldCFException e)
{
@@ -276,7 +300,9 @@ public class ElasticSearchIndex extends
StringBuffer url = getApiUrl(config.getIndexType() + "/" + idField, false);
HttpPut put = new HttpPut(url.toString());
- put.setEntity(new IndexRequestEntity(document, inputStream, acls,
denyAcls, shareAcls, shareDenyAcls, parentAcls, parentDenyAcls));
+ put.setEntity(new IndexRequestEntity(document, inputStream,
+ acls, denyAcls, shareAcls, shareDenyAcls, parentAcls, parentDenyAcls,
+ config.getUseMapperAttachments(), config.getContentAttributeName()));
if (call(put) == false)
return false;
String error = checkJson(jsonException);
Modified:
manifoldcf/trunk/connectors/elasticsearch/connector/src/main/java/org/apache/manifoldcf/agents/output/elasticsearch/ElasticSearchParam.java
URL:
http://svn.apache.org/viewvc/manifoldcf/trunk/connectors/elasticsearch/connector/src/main/java/org/apache/manifoldcf/agents/output/elasticsearch/ElasticSearchParam.java?rev=1705040&r1=1705039&r2=1705040&view=diff
==============================================================================
---
manifoldcf/trunk/connectors/elasticsearch/connector/src/main/java/org/apache/manifoldcf/agents/output/elasticsearch/ElasticSearchParam.java
(original)
+++
manifoldcf/trunk/connectors/elasticsearch/connector/src/main/java/org/apache/manifoldcf/agents/output/elasticsearch/ElasticSearchParam.java
Thu Sep 24 12:06:59 2015
@@ -39,6 +39,10 @@ public class ElasticSearchParam extends
INDEXTYPE("generictype"),
+ USEMAPPERATTACHMENTS("true"),
+
+ CONTENTATTRIBUTENAME(""),
+
FIELDLIST("");
final protected String defaultValue;
Modified:
manifoldcf/trunk/connectors/elasticsearch/connector/src/main/native2ascii/org/apache/manifoldcf/agents/output/elasticsearch/common_en_US.properties
URL:
http://svn.apache.org/viewvc/manifoldcf/trunk/connectors/elasticsearch/connector/src/main/native2ascii/org/apache/manifoldcf/agents/output/elasticsearch/common_en_US.properties?rev=1705040&r1=1705039&r2=1705040&view=diff
==============================================================================
---
manifoldcf/trunk/connectors/elasticsearch/connector/src/main/native2ascii/org/apache/manifoldcf/agents/output/elasticsearch/common_en_US.properties
(original)
+++
manifoldcf/trunk/connectors/elasticsearch/connector/src/main/native2ascii/org/apache/manifoldcf/agents/output/elasticsearch/common_en_US.properties
Thu Sep 24 12:06:59 2015
@@ -19,10 +19,13 @@ ElasticSearchConnector.ServerLocation=Se
ElasticSearchConnector.URLColon=(URL):
ElasticSearchConnector.IndexNameColon=Index name:
ElasticSearchConnector.IndexTypeColon=Index type:
+ElasticSearchConnector.UseMapperAttachmentsColon=Use mapper-attachments:
+ElasticSearchConnector.ContentAttributeNameColon=Content field name:
ElasticSearchConnector.PleaseSupplyValidElasticSearchLocation=Please supply a
valid ElasticSearch server location
ElasticSearchConnector.PleaseSupplyValidIndexName=Please supply a valid index
name
ElasticSearchConnector.PleaseSupplyValidIndexType=Please supply a valid index
type
+ElasticSearchConnector.ContentAttributeNameRequiredUnlessMapperAttachments=Content
field name required unless using mapper attachments
ElasticSearchConnector.ElasticSearch=ElasticSearch
Modified:
manifoldcf/trunk/connectors/elasticsearch/connector/src/main/native2ascii/org/apache/manifoldcf/agents/output/elasticsearch/common_ja_JP.properties
URL:
http://svn.apache.org/viewvc/manifoldcf/trunk/connectors/elasticsearch/connector/src/main/native2ascii/org/apache/manifoldcf/agents/output/elasticsearch/common_ja_JP.properties?rev=1705040&r1=1705039&r2=1705040&view=diff
==============================================================================
---
manifoldcf/trunk/connectors/elasticsearch/connector/src/main/native2ascii/org/apache/manifoldcf/agents/output/elasticsearch/common_ja_JP.properties
(original)
+++
manifoldcf/trunk/connectors/elasticsearch/connector/src/main/native2ascii/org/apache/manifoldcf/agents/output/elasticsearch/common_ja_JP.properties
Thu Sep 24 12:06:59 2015
@@ -19,10 +19,13 @@ ElasticSearchConnector.ServerLocation=ã
ElasticSearchConnector.URLColon=(URL):
ElasticSearchConnector.IndexNameColon=ã¤ã³ããã¯ã¹åï¼
ElasticSearchConnector.IndexTypeColon=ã¿ã¤ãåï¼
+ElasticSearchConnector.UseMapperAttachmentsColon=Use mapper-attachments:
+ElasticSearchConnector.ContentAttributeNameColon=Content field name:
ElasticSearchConnector.PleaseSupplyValidElasticSearchLocation=æ£ããElasticSearchãµã¼ãURLãå
¥åãã¦ãã ãã
ElasticSearchConnector.PleaseSupplyValidIndexName=æ£ããã¤ã³ããã¯ã¹åãå
¥åãã¦ãã ãã
ElasticSearchConnector.PleaseSupplyValidIndexType=æ£ããã¿ã¤ãåãå
¥åãã¦ãã ãã
+ElasticSearchConnector.ContentAttributeNameRequiredUnlessMapperAttachments=Content
field name required unless using mapper attachments
ElasticSearchConnector.ElasticSearch=ElasticSearch
Modified:
manifoldcf/trunk/connectors/elasticsearch/connector/src/main/native2ascii/org/apache/manifoldcf/agents/output/elasticsearch/common_zh_CN.properties
URL:
http://svn.apache.org/viewvc/manifoldcf/trunk/connectors/elasticsearch/connector/src/main/native2ascii/org/apache/manifoldcf/agents/output/elasticsearch/common_zh_CN.properties?rev=1705040&r1=1705039&r2=1705040&view=diff
==============================================================================
---
manifoldcf/trunk/connectors/elasticsearch/connector/src/main/native2ascii/org/apache/manifoldcf/agents/output/elasticsearch/common_zh_CN.properties
(original)
+++
manifoldcf/trunk/connectors/elasticsearch/connector/src/main/native2ascii/org/apache/manifoldcf/agents/output/elasticsearch/common_zh_CN.properties
Thu Sep 24 12:06:59 2015
@@ -19,10 +19,14 @@ ElasticSearchConnector.ServerLocation=æ
ElasticSearchConnector.URLColon=(URL):
ElasticSearchConnector.IndexNameColon=ç´¢å¼å:
ElasticSearchConnector.IndexTypeColon=ç´¢å¼ç±»å:
+ElasticSearchConnector.UseMapperAttachmentsColon=Use mapper-attachments:
+ElasticSearchConnector.ContentAttributeNameColon=Content field name:
+ElasticSearchConnector.MaxDocumentLengthColon=Maximum document length:
ElasticSearchConnector.PleaseSupplyValidElasticSearchLocation=请è¾å
¥ææçElasticsearchæå¡å¨URL
ElasticSearchConnector.PleaseSupplyValidIndexName=请è¾å
¥ææçç´¢å¼å
ElasticSearchConnector.PleaseSupplyValidIndexType=请è¾å
¥ææçç´¢å¼ç±»å
+ElasticSearchConnector.ContentAttributeNameRequiredUnlessMapperAttachments=Content
field name required unless using mapper attachments
ElasticSearchConnector.ElasticSearch=Elasticsearch
Modified:
manifoldcf/trunk/connectors/elasticsearch/connector/src/main/resources/org/apache/manifoldcf/agents/output/elasticsearch/editConfiguration.js
URL:
http://svn.apache.org/viewvc/manifoldcf/trunk/connectors/elasticsearch/connector/src/main/resources/org/apache/manifoldcf/agents/output/elasticsearch/editConfiguration.js?rev=1705040&r1=1705039&r2=1705040&view=diff
==============================================================================
---
manifoldcf/trunk/connectors/elasticsearch/connector/src/main/resources/org/apache/manifoldcf/agents/output/elasticsearch/editConfiguration.js
(original)
+++
manifoldcf/trunk/connectors/elasticsearch/connector/src/main/resources/org/apache/manifoldcf/agents/output/elasticsearch/editConfiguration.js
Thu Sep 24 12:06:59 2015
@@ -39,6 +39,13 @@ function checkConfig() {
return false;
}
}
+ if (editconnection.contentattributename) {
+ if (editconnection.contentattributename.value == "" &&
((editconnection.usemapperattachments_checkbox.value == "true" &&
editconnection. usemapperattachments.checked == false) ||
(editconnection.usemapperattachments_checkbox.value != "true" &&
editconnection.usemapperattachments.value != "true"))) {
+
alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('ElasticSearchConnector.ContentAttributeNameRequiredUnlessMapperAttachments'))");
+ editconnection.contentattributename.focus();
+ return false;
+ }
+ }
return true;
}
@@ -67,6 +74,13 @@ function checkConfigForSave() {
return false;
}
}
+ if (editconnection.contentattributename) {
+ if (editconnection.contentattributename.value == "" &&
((editconnection.usemapperattachments_checkbox.value == "true" &&
editconnection. usemapperattachments.checked == false) ||
(editconnection.usemapperattachments_checkbox.value != "true" &&
editconnection.usemapperattachments.value != "true"))) {
+
alert("$Encoder.bodyJavascriptEscape($ResourceBundle.getString('ElasticSearchConnector.ContentAttributeNameRequiredUnlessMapperAttachments'))");
+ editconnection.contentattributename.focus();
+ return false;
+ }
+ }
return true;
}
//-->
Modified:
manifoldcf/trunk/connectors/elasticsearch/connector/src/main/resources/org/apache/manifoldcf/agents/output/elasticsearch/editConfiguration_Parameters.html
URL:
http://svn.apache.org/viewvc/manifoldcf/trunk/connectors/elasticsearch/connector/src/main/resources/org/apache/manifoldcf/agents/output/elasticsearch/editConfiguration_Parameters.html?rev=1705040&r1=1705039&r2=1705040&view=diff
==============================================================================
---
manifoldcf/trunk/connectors/elasticsearch/connector/src/main/resources/org/apache/manifoldcf/agents/output/elasticsearch/editConfiguration_Parameters.html
(original)
+++
manifoldcf/trunk/connectors/elasticsearch/connector/src/main/resources/org/apache/manifoldcf/agents/output/elasticsearch/editConfiguration_Parameters.html
Thu Sep 24 12:06:59 2015
@@ -37,6 +37,24 @@
<td class="value"><input name="indextype" type="text"
value="$Encoder.attributeEscape($INDEXTYPE)"
size="24" /></td>
</tr>
+
+ <tr>
+ <td
class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('ElasticSearchConnector.UseMapperAttachmentsColon'))</nobr></td>
+ <td class="value">
+ <input type="hidden" name="usemapperattachments_checkbox" value="true"/>
+ <input type="hidden" name="usemapperattachments_present" value="true"/>
+ #if($USEMAPPERATTACHMENTS == 'true')
+ <input type="checkbox" checked="true" name="usemapperattachments"
value="true"/>
+ #else
+ <input type="checkbox" name="usemapperattachments" value="true"/>
+ #end
+ </td>
+ </tr>
+ <tr>
+ <td
class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('ElasticSearchConnector.ContentAttributeNameColon'))</nobr></td>
+ <td class="value"><input name="contentattributename" type="text"
value="$Encoder.attributeEscape($CONTENTATTRIBUTENAME)"
+ size="24" /></td>
+ </tr>
</table>
#else
@@ -44,5 +62,8 @@
<input type="hidden" name="serverlocation"
value="$Encoder.attributeEscape($SERVERLOCATION)" />
<input type="hidden" name="indexname"
value="$Encoder.attributeEscape($INDEXNAME)" />
<input type="hidden" name="indextype"
value="$Encoder.attributeEscape($INDEXTYPE)" />
-
+<input type="hidden" name="usemapperattachments_checkbox" value="false"/>
+<input type="hidden" name="usemapperattachments_present" value="true"/>
+<input type="hidden" name="usemapperattachments"
value="$Encoder.bodyEscape($USEMAPPERATTACHMENTS)" />
+<input type="hidden" name="contentattributename"
value="$Encoder.attributeEscape($CONTENTATTRIBUTENAME)" />
#end
Modified:
manifoldcf/trunk/connectors/elasticsearch/connector/src/main/resources/org/apache/manifoldcf/agents/output/elasticsearch/viewConfiguration.html
URL:
http://svn.apache.org/viewvc/manifoldcf/trunk/connectors/elasticsearch/connector/src/main/resources/org/apache/manifoldcf/agents/output/elasticsearch/viewConfiguration.html?rev=1705040&r1=1705039&r2=1705040&view=diff
==============================================================================
---
manifoldcf/trunk/connectors/elasticsearch/connector/src/main/resources/org/apache/manifoldcf/agents/output/elasticsearch/viewConfiguration.html
(original)
+++
manifoldcf/trunk/connectors/elasticsearch/connector/src/main/resources/org/apache/manifoldcf/agents/output/elasticsearch/viewConfiguration.html
Thu Sep 24 12:06:59 2015
@@ -29,4 +29,12 @@
<td
class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('ElasticSearchConnector.IndexTypeColon'))</nobr></td>
<td class="value">$Encoder.bodyEscape($INDEXTYPE)</td>
</tr>
+ <tr>
+ <td
class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('ElasticSearchConnector.UseMapperAttachmentsColon'))</nobr></td>
+ <td
class="value"><nobr>$Encoder.bodyEscape($USEMAPPERATTACHMENTS)</nobr></td>
+ </tr>
+ <tr>
+ <td
class="description"><nobr>$Encoder.bodyEscape($ResourceBundle.getString('ElasticSearchConnector.ContentAttributeNameColon'))</nobr></td>
+ <td class="value">$Encoder.bodyEscape($CONTENTATTRIBUTENAME)</td>
+ </tr>
</table>
\ No newline at end of file