diff --git a/apache-nutch-1.8/patch/parse-xsl/build.xml b/apache-nutch-1.8/patch/parse-xsl/build.xml
new file mode 100644
index 0000000..8c616be
--- /dev/null
+++ b/apache-nutch-1.8/patch/parse-xsl/build.xml
@@ -0,0 +1,49 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apache-nutch-1.8/patch/parse-xsl/conf/documents.xsd b/apache-nutch-1.8/patch/parse-xsl/conf/documents.xsd
new file mode 100644
index 0000000..1fda53a
--- /dev/null
+++ b/apache-nutch-1.8/patch/parse-xsl/conf/documents.xsd
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/apache-nutch-1.8/patch/parse-xsl/conf/rules.xsd b/apache-nutch-1.8/patch/parse-xsl/conf/rules.xsd
new file mode 100644
index 0000000..a175e09
--- /dev/null
+++ b/apache-nutch-1.8/patch/parse-xsl/conf/rules.xsd
@@ -0,0 +1,29 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/apache-nutch-1.8/patch/parse-xsl/ivy.xml b/apache-nutch-1.8/patch/parse-xsl/ivy.xml
new file mode 100644
index 0000000..3dcc548
--- /dev/null
+++ b/apache-nutch-1.8/patch/parse-xsl/ivy.xml
@@ -0,0 +1,43 @@
+
+
+
+
+
+
+
+
+
+ Apache Nutch
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apache-nutch-1.8/patch/parse-xsl/plugin.xml b/apache-nutch-1.8/patch/parse-xsl/plugin.xml
new file mode 100644
index 0000000..ff14c0a
--- /dev/null
+++ b/apache-nutch-1.8/patch/parse-xsl/plugin.xml
@@ -0,0 +1,49 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apache-nutch-1.8/patch/parse-xsl/src/java/org/apache/nutch/parse/xsl/RulesManager.java b/apache-nutch-1.8/patch/parse-xsl/src/java/org/apache/nutch/parse/xsl/RulesManager.java
new file mode 100644
index 0000000..8b6afab
--- /dev/null
+++ b/apache-nutch-1.8/patch/parse-xsl/src/java/org/apache/nutch/parse/xsl/RulesManager.java
@@ -0,0 +1,180 @@
+package org.apache.nutch.parse.xsl;
+
+import java.io.File;
+import java.util.HashMap;
+
+import javax.xml.bind.JAXB;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.stream.StreamSource;
+
+import org.apache.hadoop.conf.Configuration;
+import org.apache.nutch.parse.xsl.xml.rule.Rules;
+import org.apache.nutch.parse.xsl.xml.rule.TRule;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * This class allows to manage a set of Transformer singletons. It allows to
+ * avoid having several instances of Transformers with XSL to load each time for
+ * performance matter. The decision to use a given Transformer is determined by
+ * a set of rules (@see Rules)
+ *
+ * @see Transformer
+ * @author avigier
+ *
+ */
+public class RulesManager {
+
+ /** All the rules used to determine which xsl parser to use */
+ protected Rules rules = null;
+
+ /** A map containing all transformers given their file name as key */
+ protected HashMap transformers;
+
+ /** The XSLT file to use for transformation */
+ public static final String CONF_XML_RULES = "parser.xsl.rulesFile";
+
+ private static final Logger LOG = LoggerFactory.getLogger(RulesManager.class);
+
+ private static RulesManager instance = null;
+
+ /**
+ * Default constructor forbidden.
+ */
+ private RulesManager() {
+ super();
+ }
+
+ /**
+ * Instanciates an object using the apache nutch configuration (that
+ * contains the property defining the rules).
+ *
+ * @param configuration
+ * @throws Exception
+ */
+ private RulesManager(Configuration configuration) throws Exception {
+ super();
+
+ // Getting rules file
+ String rulesFile = configuration.get(CONF_XML_RULES);
+ if (rulesFile == null)
+ throw new Exception("The rules file shall be set in your configuration file");
+
+ // Loading rules object
+ try {
+ this.rules = JAXB.unmarshal(new File(rulesFile), Rules.class);
+ } catch (Exception e) {
+ throw new Exception("Cannot load the rules file, please check it.", e);
+ }
+
+ }
+
+ /**
+ * @param configuration
+ * the configuration used to create the singleton
+ * @return the singleton instance
+ * @throws Exception
+ */
+ public static RulesManager getInstance(Configuration configuration) throws Exception {
+ if (instance == null)
+ instance = new RulesManager(configuration);
+ return instance;
+
+ }
+
+ /**
+ *
+ * @param url
+ * the url to filter
+ * @return the transformer file path that suits the rules
+ * @throws Exception
+ */
+ public String getTransformerFilePath(String url) throws Exception {
+ String xslFile = null;
+
+ if (url == null)
+ throw new Exception("Cannot get transformer for a null url");
+
+ // Search for a matching rule by applying defined regex
+ // The first matching rule will be applied
+ for (TRule rule : this.rules.getRule()) {
+ if (url.matches(rule.getMatches())) {
+ if (LOG.isDebugEnabled()) {
+ LOG.debug(String.format("Url %s is matching regex rule %s", url, rule.getMatches()));
+ }
+ xslFile = rule.getTransformer().getFile();
+
+ break;
+ }
+ }
+ if (xslFile == null) {
+ throw new Exception("No filter found for url: " + url);
+ }
+
+ return xslFile;
+ }
+
+ /**
+ *
+ * @param url
+ * the url to filter
+ * @return the transformer that suits the rules
+ * @throws Exception
+ */
+ public Transformer getTransformer(String url) throws Exception {
+ Transformer transformer = null;
+ String xslFile = this.getTransformerFilePath(url);
+ if (xslFile != null) {
+ // Creating map if needed
+ if (this.transformers == null) {
+ this.transformers = new HashMap();
+ }
+ transformer = this.transformers.get(xslFile);
+ // Getting xsl file
+ if (transformer == null) {
+ transformer = createTransformer(xslFile);
+ this.transformers.put(xslFile, transformer);
+ }
+
+ }
+ return transformer;
+ }
+
+ /**
+ *
+ * @param url
+ * the url to test match in rules file
+ * @return true if the url is matching a rule.
+ * @throws Exception
+ */
+ public boolean matches(String url) throws Exception {
+ return this.getTransformerFilePath(url) != null;
+ }
+
+ /**
+ *
+ * @param xslFile
+ * the path of the xsl file to load
+ * @return the transformer corresponding to the xsl file
+ * @throws Exception
+ */
+ private Transformer createTransformer(String xslFile) throws Exception {
+ Transformer transformer = null;
+ try {
+ transformer = TransformerFactory.newInstance().newTransformer(new StreamSource(xslFile));
+ } catch (Exception e) {
+ throw new Exception("Cannot create transformer for xsl file " + xslFile, e);
+ }
+ return transformer;
+ }
+
+
+ /**
+ * @return the current set of rules defined in the xml file
+ */
+ public Rules getRules() {
+ return rules;
+ }
+
+}
diff --git a/apache-nutch-1.8/patch/parse-xsl/src/java/org/apache/nutch/parse/xsl/XslIndexFilter.java b/apache-nutch-1.8/patch/parse-xsl/src/java/org/apache/nutch/parse/xsl/XslIndexFilter.java
new file mode 100644
index 0000000..d7b3061
--- /dev/null
+++ b/apache-nutch-1.8/patch/parse-xsl/src/java/org/apache/nutch/parse/xsl/XslIndexFilter.java
@@ -0,0 +1,151 @@
+package org.apache.nutch.parse.xsl;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+
+import javax.xml.parsers.DocumentBuilderFactory;
+
+import org.apache.hadoop.conf.Configuration;
+import org.apache.hadoop.io.Text;
+import org.apache.nutch.crawl.CrawlDatum;
+import org.apache.nutch.crawl.Inlinks;
+import org.apache.nutch.indexer.IndexingException;
+import org.apache.nutch.indexer.IndexingFilter;
+import org.apache.nutch.indexer.NutchDocument;
+import org.apache.nutch.parse.Parse;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.w3c.dom.Document;
+import org.w3c.dom.NamedNodeMap;
+import org.w3c.dom.NodeList;
+
+import com.sun.org.apache.xpath.internal.XPathAPI;
+
+/**
+ * This class allows to:
+ *
+ *
index automatically fields defined in rules file.
+ *
exlude urls that are not declared in the rules file.
+ */
+public class XslIndexFilter implements IndexingFilter {
+
+ private static final String NAME_ATTRIBUTE = "name";
+
+ private static final String FIELD_TAG = "//field";
+
+ private Configuration conf;
+
+ private static final Logger LOG = LoggerFactory.getLogger(XslParseFilter.class);
+
+ private static HashMap> transformers = new HashMap>();
+
+ /**
+ * @return the current configuration.
+ */
+ @Override
+ public Configuration getConf() {
+ return this.conf;
+ }
+
+ /**
+ * Sets the current configuration.
+ */
+ @Override
+ public void setConf(Configuration conf) {
+ this.conf = conf;
+ }
+
+ @Override
+ public NutchDocument filter(NutchDocument doc, Parse parse, Text url, CrawlDatum datum, Inlinks inlinks) throws IndexingException {
+
+ NutchDocument result = null;
+ if (doc == null)
+ return result;
+
+ try {
+
+ // Rules manager that contains url corresponding transformer.
+ RulesManager manager = RulesManager.getInstance(this.conf);
+
+ // Getting transformer file path associated to rule if exists
+ String xsltFilePath = null;
+ try {
+ xsltFilePath = manager.getTransformerFilePath(url.toString());
+ } catch (Exception e) {
+ LOG.info("Xslt not found");
+ }
+
+ // The url matches a rule, we keep it
+ if (xsltFilePath != null) {
+ // We keep the document
+ result = doc;
+ List fields = XslIndexFilter.transformers.get(xsltFilePath);
+ // List was never loaded
+ if (fields == null) {
+ fields = this.extractFields(xsltFilePath);
+ }
+
+ // All the fields defined in the xsl file will be put directly
+ // into the nutch document
+ // Fields defined by the xsl plugin are only stored in parse
+ // meta.
+ if (parse != null && parse.getData() != null && parse.getData().getParseMeta() != null) {
+ for (String field : fields) {
+ String value = parse.getData().getParseMeta().get(field);
+ doc.add(field, value);
+ }
+ }
+
+ }
+ // The document is indexed anyway because explicitly decided
+ else if (!manager.getRules().isFilterUrlsWithNoRule()) {
+ result = doc;
+ LOG.info("The url " + url.toString() + " has been kept because it has been explicitly specified in the rules");
+ }
+ // The document is not indexed
+ else {
+ LOG.info("The url " + url.toString() + " has been filtered because no xsl file fits the defined rules");
+ }
+
+ } catch (Exception e) {
+ String message = "Cannot index data";
+ if (url != null && url.toString() != null) {
+ message += " from " + url.toString();
+ }
+ LOG.error(message, e);
+ }
+
+ return result;
+ }
+
+ /**
+ *
+ * @param xsltFilePath
+ * the path of the xsl file
+ * @return the list of fields defined in xsl file
+ * @throws Exception
+ */
+ protected List extractFields(String xsltFilePath) throws Exception {
+ List fields = new ArrayList();
+ // Creating xsl DOM document
+ Document document = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(new File(xsltFilePath));
+ NodeList list = XPathAPI.selectNodeList(document, FIELD_TAG);
+ HashSet hashedFields = new HashSet();
+ // Populating list
+ for (int i = 0; i < list.getLength(); i++) {
+ NamedNodeMap attributes = list.item(i).getAttributes();
+ if (attributes != null && attributes.getNamedItem(NAME_ATTRIBUTE) != null) {
+ hashedFields.add(attributes.getNamedItem(NAME_ATTRIBUTE).getNodeValue());
+ }
+ }
+ // Keeps list
+ fields.addAll(hashedFields);
+ XslIndexFilter.transformers.put(xsltFilePath, fields);
+
+ return fields;
+ }
+
+}
diff --git a/apache-nutch-1.8/patch/parse-xsl/src/java/org/apache/nutch/parse/xsl/XslParseFilter.java b/apache-nutch-1.8/patch/parse-xsl/src/java/org/apache/nutch/parse/xsl/XslParseFilter.java
new file mode 100644
index 0000000..a55fc42
--- /dev/null
+++ b/apache-nutch-1.8/patch/parse-xsl/src/java/org/apache/nutch/parse/xsl/XslParseFilter.java
@@ -0,0 +1,244 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.nutch.parse.xsl;
+
+import java.io.File;
+import java.io.FileOutputStream;
+
+import javax.xml.bind.JAXB;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.dom.DOMResult;
+import javax.xml.transform.dom.DOMSource;
+import javax.xml.transform.stream.StreamResult;
+
+import org.apache.hadoop.conf.Configuration;
+import org.apache.nutch.parse.HTMLMetaTags;
+import org.apache.nutch.parse.HtmlParseFilter;
+import org.apache.nutch.parse.Parse;
+import org.apache.nutch.parse.ParseResult;
+import org.apache.nutch.parse.xsl.xml.document.Documents;
+import org.apache.nutch.parse.xsl.xml.document.TDocument;
+import org.apache.nutch.parse.xsl.xml.document.TField;
+import org.apache.nutch.protocol.Content;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.w3c.dom.DocumentFragment;
+import org.w3c.dom.Node;
+
+import com.sun.org.apache.xpath.internal.XPathAPI;
+
+/**
+ * This is a parse filter plugin (@see HtmlParseFilter) A class to apply an xsl
+ * transformation on an html page. Instead of coding java, a simple xpath can be
+ * used.
+ *
+ */
+public class XslParseFilter implements HtmlParseFilter {
+
+ /** Specifies wether to use html parse TagSoup or NekoHtml */
+ public enum PARSER {
+ /** TagSoup parser */
+ TAGSOUP {
+ @Override
+ public String toString() {
+ return "tagsoup";
+ }
+ },
+ /** Neko parser */
+ NEKO {
+ @Override
+ public String toString() {
+ return "neko";
+ }
+ }
+ }
+
+ /**
+ * The output of the tranformation for debug purpose (log level "DEBUG"
+ * shall be activated)
+ */
+ public static final String CONF_XSLT_OUTPUT_DEBUG_FILE = "parser.xsl.output.debug.file";
+
+ /** Wether to use Saxon or Standard JVM XSLT parser */
+ public static final String CONF_XSLT_USE_SAXON = "parser.xsl.useSaxon";
+
+ /**
+ * Wether to use Neko or Tagsoup.
+ *
+ * @Warning this configuration property is set by nutch and not by the
+ * current plugin. see HtmlParser
+ */
+ public static final String CONF_HTML_PARSER = "parser.html.impl";
+
+ private static final Logger LOG = LoggerFactory.getLogger(XslParseFilter.class);
+
+ private Configuration conf;
+
+ /**
+ * Default constructor forbidden.
+ */
+ public XslParseFilter() {
+ super();
+ }
+
+ /**
+ * @param content
+ * full content to parse
+ * @param parseResult
+ * result of the parse process
+ * @param metaTags
+ * metatags set in the document
+ * @param document
+ * the DOM document to parse
+ * @return the resulting {@link ParseResult}
+ */
+ @Override
+ public ParseResult filter(Content content, ParseResult parseResult, HTMLMetaTags metaTags, DocumentFragment document) {
+
+ try {
+ // We are selecting the HTML tag with a XPath to convert the
+ // DocumentFragment to a more natural
+ // HTML document that can be further processed with XSL.
+ // TODO applying an "html" xpath is a dirty trick to change.
+ String xpath = "html";
+
+ // For neko, all tags are UPPER CASE.
+ // For tagsoup, it is in lower case.
+ // This is decided by the html parser plugin
+ if (this.conf.get(CONF_HTML_PARSER, PARSER.NEKO.toString()).equals(PARSER.NEKO.toString())) {
+ xpath = xpath.toUpperCase();
+ } else {
+ // TODO Tag soup is not working. To be investigated.
+ throw new Exception("tag soup parser not implemented.");
+ }
+
+ Node doc = XPathAPI.selectSingleNode(document, xpath);
+
+ Parse parse = parseResult.get(content.getUrl());
+
+ // Do we use saxon for xslt 2.0 compliancy?
+ if (this.getConf().getBoolean(CONF_XSLT_USE_SAXON, false)) {
+ System.setProperty("javax.xml.transform.TransformerFactory", "net.sf.saxon.TransformerFactoryImpl");
+ }
+
+ // Rules manager that contains url corresponding transformer.
+ RulesManager manager = RulesManager.getInstance(this.conf);
+
+ DOMResult result = new DOMResult();
+ // At this state, thanks to the HtmlParser that is using
+ // HtmlParseFilter interface, we got
+ // a DOM object properly built (with Neko or TagSoup).
+ manager.getTransformer(content.getUrl()).transform(new DOMSource(doc), result);
+
+ // Storing the xml output for debug purpose
+ if (LOG.isDebugEnabled()) {
+ String debugFile = this.conf.get(CONF_XSLT_OUTPUT_DEBUG_FILE);
+ if (debugFile != null)
+ XslParseFilter.saveDOMOutput(result.getNode(), new File(debugFile));
+ }
+
+ XslParseFilter.updateMetadata(result.getNode(), parse);
+
+ } catch (Exception e) {
+ LOG.warn("Cannot extract HTML tags. The XSL processing will not be run.", e);
+ }
+
+ return parseResult;
+ }
+
+ /**
+ * @param node
+ * the node that is used to provide metadata information.
+ * @param data
+ * the data to update This is a simple format like the following:
+ * Check the documents.xsd to figure out the structure.
+ */
+ protected static void updateMetadata(Node node, Parse data) {
+
+ Documents documents = JAXB.unmarshal(new DOMSource(node), Documents.class);
+
+ // No document unmarshalled
+ if (documents == null) {
+ LOG.debug("No metadata to update");
+ return;
+ }
+
+ // Browsing documents
+ for (TDocument document : documents.getDocument()) {
+
+ // There are metadata to process
+ for (TField field : document.getField()) {
+ String value = field.getValue();
+ // Trim values by default
+ if (value != null) {
+ value = value.trim();
+ // Do not keep string with 0 size
+ if (value.length() != 0) {
+ // Adds the meta to the parse meta list
+ data.getData().getParseMeta().add(field.getName(), value);
+ }
+ if (LOG.isDebugEnabled())
+ LOG.debug("Content " + field.getName() + " has value: '" + value + "'");
+ }
+ }
+ }
+
+ }
+
+ /**
+ *
+ * @param node
+ * the DOM node to save.
+ * @param file
+ * the file where to write the DOM.
+ */
+ private static void saveDOMOutput(Node node, File file) {
+ FileOutputStream fos = null;
+
+ try {
+ fos = new FileOutputStream(file);
+
+ TransformerFactory.newInstance().newTransformer().transform(new DOMSource(node), new StreamResult(fos));
+ } catch (Exception e) {
+ LOG.warn("Cannot store DOM node to file: " + file.getAbsolutePath(), e);
+ } finally {
+ if (fos != null)
+ try {
+ fos.close();
+ } catch (Exception e) {
+ LOG.warn("Cannot close xml file stream.", e);
+ }
+ }
+ }
+
+ /**
+ * @param conf
+ * the configuration file to load.
+ */
+ @Override
+ public void setConf(Configuration conf) {
+ this.conf = conf;
+ }
+
+ /**
+ * @return the current configuration.
+ */
+ @Override
+ public Configuration getConf() {
+ return this.conf;
+ }
+}
diff --git a/apache-nutch-1.8/patch/parse-xsl/src/java/org/apache/nutch/parse/xsl/xml/document/Documents.java b/apache-nutch-1.8/patch/parse-xsl/src/java/org/apache/nutch/parse/xsl/xml/document/Documents.java
new file mode 100644
index 0000000..9637712
--- /dev/null
+++ b/apache-nutch-1.8/patch/parse-xsl/src/java/org/apache/nutch/parse/xsl/xml/document/Documents.java
@@ -0,0 +1,76 @@
+//
+// Ce fichier a été généré par l'implémentation de référence JavaTM Architecture for XML Binding (JAXB), v2.2.7
+// Voir http://java.sun.com/xml/jaxb
+// Toute modification apportée à ce fichier sera perdue lors de la recompilation du schéma source.
+// Généré le : 2014.10.01 à 09:02:06 PM CEST
+//
+
+
+package org.apache.nutch.parse.xsl.xml.document;
+
+import java.util.ArrayList;
+import java.util.List;
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.XmlType;
+
+
+/**
+ *
Classe Java pour anonymous complex type.
+ *
+ *
Le fragment de schéma suivant indique le contenu attendu figurant dans cette classe.
+ *
+ *
+ *
+ *
+ */
+@XmlAccessorType(XmlAccessType.FIELD)
+@XmlType(name = "", propOrder = {
+ "document"
+})
+@XmlRootElement(name = "documents")
+public class Documents {
+
+ protected List document;
+
+ /**
+ * Gets the value of the document property.
+ *
+ *
+ * This accessor method returns a reference to the live list,
+ * not a snapshot. Therefore any modification you make to the
+ * returned list will be present inside the JAXB object.
+ * This is why there is not a set method for the document property.
+ *
+ *
+ * For example, to add a new item, do as follows:
+ *
+ * getDocument().add(newItem);
+ *
+ *
+ *
+ *
+ * Objects of the following type(s) are allowed in the list
+ * {@link TDocument }
+ *
+ *
+ */
+ public List getDocument() {
+ if (document == null) {
+ document = new ArrayList();
+ }
+ return this.document;
+ }
+
+}
diff --git a/apache-nutch-1.8/patch/parse-xsl/src/java/org/apache/nutch/parse/xsl/xml/document/ObjectFactory.java b/apache-nutch-1.8/patch/parse-xsl/src/java/org/apache/nutch/parse/xsl/xml/document/ObjectFactory.java
new file mode 100644
index 0000000..2ab6cd9
--- /dev/null
+++ b/apache-nutch-1.8/patch/parse-xsl/src/java/org/apache/nutch/parse/xsl/xml/document/ObjectFactory.java
@@ -0,0 +1,63 @@
+//
+// Ce fichier a été généré par l'implémentation de référence JavaTM Architecture for XML Binding (JAXB), v2.2.7
+// Voir http://java.sun.com/xml/jaxb
+// Toute modification apportée à ce fichier sera perdue lors de la recompilation du schéma source.
+// Généré le : 2014.10.01 à 09:02:06 PM CEST
+//
+
+
+package org.apache.nutch.parse.xsl.xml.document;
+
+import javax.xml.bind.annotation.XmlRegistry;
+
+
+/**
+ * This object contains factory methods for each
+ * Java content interface and Java element interface
+ * generated in the org.apache.nutch.parse.xsl.xml.document package.
+ *
An ObjectFactory allows you to programatically
+ * construct new instances of the Java representation
+ * for XML content. The Java representation of XML
+ * content can consist of schema derived interfaces
+ * and classes representing the binding of schema
+ * type definitions, element declarations and model
+ * groups. Factory methods for each of these are
+ * provided in this class.
+ *
+ */
+@XmlRegistry
+public class ObjectFactory {
+
+
+ /**
+ * Create a new ObjectFactory that can be used to create new instances of schema derived classes for package: org.apache.nutch.parse.xsl.xml.document
+ *
+ */
+ public ObjectFactory() {
+ }
+
+ /**
+ * Create an instance of {@link Documents }
+ *
+ */
+ public Documents createDocuments() {
+ return new Documents();
+ }
+
+ /**
+ * Create an instance of {@link TDocument }
+ *
+ */
+ public TDocument createTDocument() {
+ return new TDocument();
+ }
+
+ /**
+ * Create an instance of {@link TField }
+ *
+ */
+ public TField createTField() {
+ return new TField();
+ }
+
+}
diff --git a/apache-nutch-1.8/patch/parse-xsl/src/java/org/apache/nutch/parse/xsl/xml/document/TDocument.java b/apache-nutch-1.8/patch/parse-xsl/src/java/org/apache/nutch/parse/xsl/xml/document/TDocument.java
new file mode 100644
index 0000000..86e24ce
--- /dev/null
+++ b/apache-nutch-1.8/patch/parse-xsl/src/java/org/apache/nutch/parse/xsl/xml/document/TDocument.java
@@ -0,0 +1,74 @@
+//
+// Ce fichier a été généré par l'implémentation de référence JavaTM Architecture for XML Binding (JAXB), v2.2.7
+// Voir http://java.sun.com/xml/jaxb
+// Toute modification apportée à ce fichier sera perdue lors de la recompilation du schéma source.
+// Généré le : 2014.10.01 à 09:02:06 PM CEST
+//
+
+
+package org.apache.nutch.parse.xsl.xml.document;
+
+import java.util.ArrayList;
+import java.util.List;
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlType;
+
+
+/**
+ *
Classe Java pour TDocument complex type.
+ *
+ *
Le fragment de schéma suivant indique le contenu attendu figurant dans cette classe.
+ *
+ *
+ *
+ *
+ */
+@XmlAccessorType(XmlAccessType.FIELD)
+@XmlType(name = "TDocument", propOrder = {
+ "field"
+})
+public class TDocument {
+
+ protected List field;
+
+ /**
+ * Gets the value of the field property.
+ *
+ *
+ * This accessor method returns a reference to the live list,
+ * not a snapshot. Therefore any modification you make to the
+ * returned list will be present inside the JAXB object.
+ * This is why there is not a set method for the field property.
+ *
+ *
+ * For example, to add a new item, do as follows:
+ *
+ * getField().add(newItem);
+ *
+ *
+ *
+ *
+ * Objects of the following type(s) are allowed in the list
+ * {@link TField }
+ *
+ *
+ */
+ public List getField() {
+ if (field == null) {
+ field = new ArrayList();
+ }
+ return this.field;
+ }
+
+}
diff --git a/apache-nutch-1.8/patch/parse-xsl/src/java/org/apache/nutch/parse/xsl/xml/document/TField.java b/apache-nutch-1.8/patch/parse-xsl/src/java/org/apache/nutch/parse/xsl/xml/document/TField.java
new file mode 100644
index 0000000..5b4f92a
--- /dev/null
+++ b/apache-nutch-1.8/patch/parse-xsl/src/java/org/apache/nutch/parse/xsl/xml/document/TField.java
@@ -0,0 +1,94 @@
+//
+// Ce fichier a été généré par l'implémentation de référence JavaTM Architecture for XML Binding (JAXB), v2.2.7
+// Voir http://java.sun.com/xml/jaxb
+// Toute modification apportée à ce fichier sera perdue lors de la recompilation du schéma source.
+// Généré le : 2014.10.01 à 09:02:06 PM CEST
+//
+
+
+package org.apache.nutch.parse.xsl.xml.document;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlType;
+import javax.xml.bind.annotation.XmlValue;
+
+
+/**
+ *
Classe Java pour TField complex type.
+ *
+ *
Le fragment de schéma suivant indique le contenu attendu figurant dans cette classe.
+ *
+ *
+ *
+ *
+ */
+@XmlAccessorType(XmlAccessType.FIELD)
+@XmlType(name = "TField", propOrder = {
+ "value"
+})
+public class TField {
+
+ @XmlValue
+ protected String value;
+ @XmlAttribute(name = "name")
+ protected String name;
+
+ /**
+ * Obtient la valeur de la propriété value.
+ *
+ * @return
+ * possible object is
+ * {@link String }
+ *
+ */
+ public String getValue() {
+ return value;
+ }
+
+ /**
+ * Définit la valeur de la propriété value.
+ *
+ * @param value
+ * allowed object is
+ * {@link String }
+ *
+ */
+ public void setValue(String value) {
+ this.value = value;
+ }
+
+ /**
+ * Obtient la valeur de la propriété name.
+ *
+ * @return
+ * possible object is
+ * {@link String }
+ *
+ */
+ public String getName() {
+ return name;
+ }
+
+ /**
+ * Définit la valeur de la propriété name.
+ *
+ * @param value
+ * allowed object is
+ * {@link String }
+ *
+ */
+ public void setName(String value) {
+ this.name = value;
+ }
+
+}
diff --git a/apache-nutch-1.8/patch/parse-xsl/src/java/org/apache/nutch/parse/xsl/xml/document/package-info.java b/apache-nutch-1.8/patch/parse-xsl/src/java/org/apache/nutch/parse/xsl/xml/document/package-info.java
new file mode 100644
index 0000000..d3d5bc3
--- /dev/null
+++ b/apache-nutch-1.8/patch/parse-xsl/src/java/org/apache/nutch/parse/xsl/xml/document/package-info.java
@@ -0,0 +1,9 @@
+//
+// Ce fichier a été généré par l'implémentation de référence JavaTM Architecture for XML Binding (JAXB), v2.2.7
+// Voir http://java.sun.com/xml/jaxb
+// Toute modification apportée à ce fichier sera perdue lors de la recompilation du schéma source.
+// Généré le : 2014.10.01 à 09:02:06 PM CEST
+//
+
+@javax.xml.bind.annotation.XmlSchema(namespace = "http://www.example.org/documents/")
+package org.apache.nutch.parse.xsl.xml.document;
diff --git a/apache-nutch-1.8/patch/parse-xsl/src/java/org/apache/nutch/parse/xsl/xml/rule/ObjectFactory.java b/apache-nutch-1.8/patch/parse-xsl/src/java/org/apache/nutch/parse/xsl/xml/rule/ObjectFactory.java
new file mode 100644
index 0000000..61b9811
--- /dev/null
+++ b/apache-nutch-1.8/patch/parse-xsl/src/java/org/apache/nutch/parse/xsl/xml/rule/ObjectFactory.java
@@ -0,0 +1,63 @@
+//
+// Ce fichier a été généré par l'implémentation de référence JavaTM Architecture for XML Binding (JAXB), v2.2.7
+// Voir http://java.sun.com/xml/jaxb
+// Toute modification apportée à ce fichier sera perdue lors de la recompilation du schéma source.
+// Généré le : 2014.10.01 à 09:02:07 PM CEST
+//
+
+
+package org.apache.nutch.parse.xsl.xml.rule;
+
+import javax.xml.bind.annotation.XmlRegistry;
+
+
+/**
+ * This object contains factory methods for each
+ * Java content interface and Java element interface
+ * generated in the org.apache.nutch.parse.xsl.xml.rule package.
+ *
An ObjectFactory allows you to programatically
+ * construct new instances of the Java representation
+ * for XML content. The Java representation of XML
+ * content can consist of schema derived interfaces
+ * and classes representing the binding of schema
+ * type definitions, element declarations and model
+ * groups. Factory methods for each of these are
+ * provided in this class.
+ *
+ */
+@XmlRegistry
+public class ObjectFactory {
+
+
+ /**
+ * Create a new ObjectFactory that can be used to create new instances of schema derived classes for package: org.apache.nutch.parse.xsl.xml.rule
+ *
+ */
+ public ObjectFactory() {
+ }
+
+ /**
+ * Create an instance of {@link Rules }
+ *
+ */
+ public Rules createRules() {
+ return new Rules();
+ }
+
+ /**
+ * Create an instance of {@link TRule }
+ *
+ */
+ public TRule createTRule() {
+ return new TRule();
+ }
+
+ /**
+ * Create an instance of {@link TTransformer }
+ *
+ */
+ public TTransformer createTTransformer() {
+ return new TTransformer();
+ }
+
+}
diff --git a/apache-nutch-1.8/patch/parse-xsl/src/java/org/apache/nutch/parse/xsl/xml/rule/Rules.java b/apache-nutch-1.8/patch/parse-xsl/src/java/org/apache/nutch/parse/xsl/xml/rule/Rules.java
new file mode 100644
index 0000000..6482949
--- /dev/null
+++ b/apache-nutch-1.8/patch/parse-xsl/src/java/org/apache/nutch/parse/xsl/xml/rule/Rules.java
@@ -0,0 +1,110 @@
+//
+// Ce fichier a été généré par l'implémentation de référence JavaTM Architecture for XML Binding (JAXB), v2.2.7
+// Voir http://java.sun.com/xml/jaxb
+// Toute modification apportée à ce fichier sera perdue lors de la recompilation du schéma source.
+// Généré le : 2014.10.01 à 09:02:07 PM CEST
+//
+
+
+package org.apache.nutch.parse.xsl.xml.rule;
+
+import java.util.ArrayList;
+import java.util.List;
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.XmlType;
+
+
+/**
+ *
Classe Java pour anonymous complex type.
+ *
+ *
Le fragment de schéma suivant indique le contenu attendu figurant dans cette classe.
+ *
+ *
+ *
+ *
+ */
+@XmlAccessorType(XmlAccessType.FIELD)
+@XmlType(name = "", propOrder = {
+ "rule"
+})
+@XmlRootElement(name = "rules")
+public class Rules {
+
+ @XmlElement(required = true)
+ protected List rule;
+ @XmlAttribute(name = "filterUrlsWithNoRule")
+ protected Boolean filterUrlsWithNoRule;
+
+ /**
+ * Gets the value of the rule property.
+ *
+ *
+ * This accessor method returns a reference to the live list,
+ * not a snapshot. Therefore any modification you make to the
+ * returned list will be present inside the JAXB object.
+ * This is why there is not a set method for the rule property.
+ *
+ *
+ * For example, to add a new item, do as follows:
+ *
+ * getRule().add(newItem);
+ *
+ *
+ *
+ *
+ * Objects of the following type(s) are allowed in the list
+ * {@link TRule }
+ *
+ *
+ */
+ public List getRule() {
+ if (rule == null) {
+ rule = new ArrayList();
+ }
+ return this.rule;
+ }
+
+ /**
+ * Obtient la valeur de la propriété filterUrlsWithNoRule.
+ *
+ * @return
+ * possible object is
+ * {@link Boolean }
+ *
+ */
+ public boolean isFilterUrlsWithNoRule() {
+ if (filterUrlsWithNoRule == null) {
+ return true;
+ } else {
+ return filterUrlsWithNoRule;
+ }
+ }
+
+ /**
+ * Définit la valeur de la propriété filterUrlsWithNoRule.
+ *
+ * @param value
+ * allowed object is
+ * {@link Boolean }
+ *
+ */
+ public void setFilterUrlsWithNoRule(Boolean value) {
+ this.filterUrlsWithNoRule = value;
+ }
+
+}
diff --git a/apache-nutch-1.8/patch/parse-xsl/src/java/org/apache/nutch/parse/xsl/xml/rule/TRule.java b/apache-nutch-1.8/patch/parse-xsl/src/java/org/apache/nutch/parse/xsl/xml/rule/TRule.java
new file mode 100644
index 0000000..8671d89
--- /dev/null
+++ b/apache-nutch-1.8/patch/parse-xsl/src/java/org/apache/nutch/parse/xsl/xml/rule/TRule.java
@@ -0,0 +1,97 @@
+//
+// Ce fichier a été généré par l'implémentation de référence JavaTM Architecture for XML Binding (JAXB), v2.2.7
+// Voir http://java.sun.com/xml/jaxb
+// Toute modification apportée à ce fichier sera perdue lors de la recompilation du schéma source.
+// Généré le : 2014.10.01 à 09:02:07 PM CEST
+//
+
+
+package org.apache.nutch.parse.xsl.xml.rule;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlType;
+
+
+/**
+ *
Classe Java pour TRule complex type.
+ *
+ *
Le fragment de schéma suivant indique le contenu attendu figurant dans cette classe.
+ *
+ *
+ Jean Michel LE CLERC Pendant les cours, je dessinai un personnage un peu bizarre sur des petits bouts de papier, notre domaine, à la sortie de l'ESD, était Capoulade, le boul. St-Michel...
+
Votre Email ainsi que votre mise en relation avec un membre de Jeterecherche est entierement anonyme !
+
Voici ce que vous pouvez faire sur Jeterecherche
+
1) Créer une fiche membre pour être retrouvé par des amies, collègues, familles...
+
2) Créer des avis de recherches référencées sur les principaux moteurs de recherches pour retrouver une personne
+
3) Déposer une annonce pour retrouver une personne croisée dans la rue, bar, discothèque...
+
4) Déposer une bouteille à la mer pour faire des rencontres ou passer un message.
+
5) Demander un coup de pouce à nos membres dans le forum pour vous aidez a rechercher des personnes
+
6) Jeterecherche c' est aussi une messagerie interne et entièrement anonyme et protégée
+
7) Vos petites annonces inversées et gratuites (recherche objets) avec notre partenaire toufind.com
+
+
+
+
+
COMMENT SUPPRIMER SON COMPTE ?
+
+
Pour suprimer votre compte il suffit de cliquer sur le bouton sur votre droite et ensuite cliquer sur le bouton vert
+
Une confirmation vous sera demandé.
+
Important : Sachez qu' il faut après avois supprimé votre compte un délai minimum d' une semaine pour que les moteurs de recherche suppriment les données vous concernants (avis de recherches messages sur le forum etc...)
+
+
+
+
Ajouter Supprimer ses informations dans "les paramètres de mon compte"
+
+
Vous pouvez dans cette rubrique "" ajouter ou supprimer des informations vous concernants, âge, écoles, lieux, photos, liens perso, video...
+
Mais aussi supprimer les ami(e)s que vous avez ajouté et votre compte Jeterecherche !
+
Important : Pour supprimer vos avis de recherches ainsi que vos personnes croisées et bouteilles à la mer il faut se rendre directement dans la rubrique concernée.
+
+
+
+
Avis de recherche
+
+
Les avis de recherches vous permettent de retrouver une personne perdue de vue, ils sont automatiquement référencés sur les principaux moteurs de recherche et visible sur Jeterecherche.
+
1) Pour créer un avis de recherche cliquez sur le bouton Ensuite cliquez sur
+
+ vous avez la possibilité de mettre une photo de la personne que vous recherchez.
+
2) Pour supprimer vos avis de recherches cliquez sur la rubrique
+ Puis sur le bouton supprimer devant chaque avis de recherches, Quand vous êtes connecté avec votre pseudo (nom utilisateur) vos avis de recherches sont toujours les premiers dans la liste.
+
3) Pour répondre � un avis de recherche, inscrivez-vous et une fois devant la fiche de la personne retrouvée généralement " Vous même" cliquez sur le bouton et rentrez en contact avec la personne ayant crée l' avis de recherche.
+
Important :Après avoir supprimé un avis de recherche sur jeterecherche, il faut un minimum d' une semaine pour qu' il ne soit plus visible sur les moteurs de recherche.
+
+
+
+
+
Bouteille à la mer
+
+
Les Bouteilles à la mer vous permettent de lancer une lettre ouverte dans la recherche d' amitié, passion, goût commun ect...
+ Elles sont entièrement anonymes seul figure votre pseudo (nom utilisateur).
+
1) Pour créer une bouteille à la mer cliquez sur le bouton Ensuite cliquez sur
+ Vous avez la possibilité de faire apparaitre votre photo de profil sur la bouteille par une simple coche lors de sa création.
+
2) Pour supprimer votre bouteille à la mer cliquez sur la rubrique
+ Puis sur le bouton supprimer devant votre bouteille à la mer.
+ Quand vous êtes connecté avec votre pseudo (nom utilisateur) vos bouteilles à la mer sont toujours les premières dans la liste.
+
3) Pour répondre à une bouteille inscrivez-vous et une fois devant la fiche de la bouteille concernée, cliquez sur le bouton et rentrez en contact avec la personne ayant crée la bouteille.
+
Important : Après avoir supprimé une bouteille à la mer sur jeterecherche, il faut un minimum d' une semaine pour qu' elle ne soit plus visible sur les moteurs de recherche.
+
+
+
+
Personne croisée
+
+
Les annonces de "personne croisée" permettent de retrouver une personne croisée dans la rue, bar, musée, avec laquelle vous n auriez pas pu ou osez lui laisser vos coordonnées. Elles sont entièrement anonymes seul figure votre pseudo (nom utilisateur).
+
1) Pour créer une annonce de personne croisée, cliquez sur le bouton Ensuite cliquer sur
+Vous avez la possibilité de faire apparaitre votre photo de profil sur l' annonce par une simple coche lors de sa création.
+
2) Pour supprimer votre annonce de personne croisée, cliquez sur la rubrique Puis sur le bouton supprimer devant votre annonce de personne croisée,
+ Quand vous êtes connecté avec votre pseudo (nom utilisateur) vos annonces sont toujours les premières dans la liste.
+
3) Pour répondre à une annonce inscrivez-vous et une fois devant l' annonce concernée, cliquez sur le bouton et rentrez en contact avec la personne qui vous recherche.
+
Important : Après avoir supprimé une annonce de personne croisée sur jeterecherche, il faut un minimum d' une semaine pour qu' elle ne soit plus visible sur les moteurs de recherche.
+
+
+
+
Boite de réception
+
+
Une fois votre connexion au site Jeterecherche vous pouvez voir apparaitre sur le haut de cette page le bouton cliquez dessus pour voir vos messages reçu
+
Une fois dans votre boite de réception Pour supprimer un message cliquez sur la croix à droite
+
si vous souhaitez répondre, cliquez sur le titre du message
je recherche mon p�re biologique, bruno schwartz , fils d'odile qui s'est remari�e.fr�re de laura , delphine , emmanuel et a un demi-fr�re.il serait n� entre 1955-1963 , ferait 1m90-96 , �tait brun , boucl�s .
+d'origine franco-allemande.a couch� avec guichard chantal dont je suis issue.je suis n�e le 22.07.1981 au chu de montpellier.il aurait fait de la prison entre 1980 et max 1984.
Retrouver une personne gratuitement de la famille des ami(e)s, copains d'enfance, ex-fiancé(e), collègues, créer un avis de recherche pour retrouver une personne chère perdue de vue. Retrouver une personne croisée dans la rue, une discothèque... Rejoignez le plus gros site de recherche de personne et retrouver là. C' est le but de Jeterecherche, jusqu' à la petite annonce pour rencontrer l' amour ou l'amitié.
+
+
+
+
\ No newline at end of file
diff --git a/apache-nutch-1.8/patch/parse-xsl/src/tests/files/jeterecherche/people_small.html b/apache-nutch-1.8/patch/parse-xsl/src/tests/files/jeterecherche/people_small.html
new file mode 100644
index 0000000..694537e
--- /dev/null
+++ b/apache-nutch-1.8/patch/parse-xsl/src/tests/files/jeterecherche/people_small.html
@@ -0,0 +1,10 @@
+
+
+
+Faycel Mejri est inscrit(e) sur Jeterecherche
+
+
+
+
+
+
\ No newline at end of file
diff --git a/apache-nutch-1.8/patch/parse-xsl/src/tests/files/jeterecherche/rules.xml b/apache-nutch-1.8/patch/parse-xsl/src/tests/files/jeterecherche/rules.xml
new file mode 100644
index 0000000..cd90cfd
--- /dev/null
+++ b/apache-nutch-1.8/patch/parse-xsl/src/tests/files/jeterecherche/rules.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/apache-nutch-1.8/patch/parse-xsl/src/tests/files/jeterecherche/transformer_people.xsl b/apache-nutch-1.8/patch/parse-xsl/src/tests/files/jeterecherche/transformer_people.xsl
new file mode 100644
index 0000000..20332c5
--- /dev/null
+++ b/apache-nutch-1.8/patch/parse-xsl/src/tests/files/jeterecherche/transformer_people.xsl
@@ -0,0 +1,48 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/apache-nutch-1.8/patch/parse-xsl/src/tests/files/jeterecherche/transformer_wanted_people.xsl b/apache-nutch-1.8/patch/parse-xsl/src/tests/files/jeterecherche/transformer_wanted_people.xsl
new file mode 100644
index 0000000..50e528c
--- /dev/null
+++ b/apache-nutch-1.8/patch/parse-xsl/src/tests/files/jeterecherche/transformer_wanted_people.xsl
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/apache-nutch-1.8/patch/parse-xsl/src/tests/files/jeterecherche/wanted1.html b/apache-nutch-1.8/patch/parse-xsl/src/tests/files/jeterecherche/wanted1.html
new file mode 100644
index 0000000..e059a61
--- /dev/null
+++ b/apache-nutch-1.8/patch/parse-xsl/src/tests/files/jeterecherche/wanted1.html
@@ -0,0 +1,470 @@
+
+
+
+
+Audrey Touboul vous êtes recherché(e) sur Jeterecherche.com !
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Le principe de jeterecherche !
+
+
Jeterecherche est entierement gratuit !
+
Votre Email ainsi que votre mise en relation avec un membre de Jeterecherche est entierement anonyme !
+
Voici ce que vous pouvez faire sur Jeterecherche
+
1) Créer une fiche membre pour être retrouvé par des amies, collègues, familles...
+
2) Créer des avis de recherches référencées sur les principaux moteurs de recherches pour retrouver une personne
+
3) Déposer une annonce pour retrouver une personne croisée dans la rue, bar, discothèque...
+
4) Déposer une bouteille à la mer pour faire des rencontres ou passer un message.
+
5) Demander un coup de pouce à nos membres dans le forum pour vous aidez a rechercher des personnes
+
6) Jeterecherche c' est aussi une messagerie interne et entièrement anonyme et protégée
+
7) Vos petites annonces inversées et gratuites (recherche objets) avec notre partenaire toufind.com
+
+
+
+
+
COMMENT SUPPRIMER SON COMPTE ?
+
+
Pour suprimer votre compte il suffit de cliquer sur le bouton sur votre droite et ensuite cliquer sur le bouton vert
+
Une confirmation vous sera demandé.
+
Important : Sachez qu' il faut après avois supprimé votre compte un délai minimum d' une semaine pour que les moteurs de recherche suppriment les données vous concernants (avis de recherches messages sur le forum etc...)
+
+
+
+
Ajouter Supprimer ses informations dans "les paramètres de mon compte"
+
+
Vous pouvez dans cette rubrique "" ajouter ou supprimer des informations vous concernants, âge, écoles, lieux, photos, liens perso, video...
+
Mais aussi supprimer les ami(e)s que vous avez ajouté et votre compte Jeterecherche !
+
Important : Pour supprimer vos avis de recherches ainsi que vos personnes croisées et bouteilles à la mer il faut se rendre directement dans la rubrique concernée.
+
+
+
+
Avis de recherche
+
+
Les avis de recherches vous permettent de retrouver une personne perdue de vue, ils sont automatiquement référencés sur les principaux moteurs de recherche et visible sur Jeterecherche.
+
1) Pour créer un avis de recherche cliquez sur le bouton Ensuite cliquez sur
+
+ vous avez la possibilité de mettre une photo de la personne que vous recherchez.
+
2) Pour supprimer vos avis de recherches cliquez sur la rubrique
+ Puis sur le bouton supprimer devant chaque avis de recherches, Quand vous êtes connecté avec votre pseudo (nom utilisateur) vos avis de recherches sont toujours les premiers dans la liste.
+
3) Pour répondre à un avis de recherche, inscrivez-vous et une fois devant la fiche de la personne retrouvée généralement " Vous même" cliquez sur le bouton et rentrez en contact avec la personne ayant crée l' avis de recherche.
+
Important :Après avoir supprimé un avis de recherche sur jeterecherche, il faut un minimum d' une semaine pour qu' il ne soit plus visible sur les moteurs de recherche.
+
+
+
+
+
Bouteille à la mer
+
+
Les Bouteilles à la mer vous permettent de lancer une lettre ouverte dans la recherche d' amitié, passion, goût commun ect...
+ Elles sont entièrement anonymes seul figure votre pseudo (nom utilisateur).
+
1) Pour créer une bouteille à la mer cliquez sur le bouton Ensuite cliquez sur
+ Vous avez la possibilité de faire apparaitre votre photo de profil sur la bouteille par une simple coche lors de sa création.
+
2) Pour supprimer votre bouteille à la mer cliquez sur la rubrique
+ Puis sur le bouton supprimer devant votre bouteille à la mer.
+ Quand vous êtes connecté avec votre pseudo (nom utilisateur) vos bouteilles à la mer sont toujours les premières dans la liste.
+
3) Pour répondre à une bouteille inscrivez-vous et une fois devant la fiche de la bouteille concernée, cliquez sur le bouton et rentrez en contact avec la personne ayant crée la bouteille.
+
Important : Après avoir supprimé une bouteille à la mer sur jeterecherche, il faut un minimum d' une semaine pour qu' elle ne soit plus visible sur les moteurs de recherche.
+
+
+
+
Personne croisée
+
+
Les annonces de "personne croisée" permettent de retrouver une personne croisée dans la rue, bar, musée, avec laquelle vous n auriez pas pu ou osez lui laisser vos coordonnées. Elles sont entièrement anonymes seul figure votre pseudo (nom utilisateur).
+
1) Pour créer une annonce de personne croisée, cliquez sur le bouton Ensuite cliquer sur
+Vous avez la possibilité de faire apparaitre votre photo de profil sur l' annonce par une simple coche lors de sa création.
+
2) Pour supprimer votre annonce de personne croisée, cliquez sur la rubrique Puis sur le bouton supprimer devant votre annonce de personne croisée,
+ Quand vous êtes connecté avec votre pseudo (nom utilisateur) vos annonces sont toujours les premières dans la liste.
+
3) Pour répondre à une annonce inscrivez-vous et une fois devant l' annonce concernée, cliquez sur le bouton et rentrez en contact avec la personne qui vous recherche.
+
Important : Après avoir supprimé une annonce de personne croisée sur jeterecherche, il faut un minimum d' une semaine pour qu' elle ne soit plus visible sur les moteurs de recherche.
+
+
+
+
Boite de réception
+
+
Une fois votre connexion au site Jeterecherche vous pouvez voir apparaitre sur le haut de cette page le bouton cliquez dessus pour voir vos messages reçu
+
Une fois dans votre boite de réception Pour supprimer un message cliquez sur la croix à droite
+
si vous souhaitez répondre, cliquez sur le titre du message
+ Qui pourrai me donner des nouvelles d'Audrey ?
+Son nom de jeune fille était Touboul il y a 25 ans mais elle est peut être mariée aujourd'hui.
+A l'époque, elle habitait le Cannet et ses parents tenaient une boutique de vêtements à Cannes
+Audrey devrai avoir 50 ans et nous étions les meilleures amies du monde !
+Merci à la personne qui m'aiderai à la retrouver
Retrouver une personne gratuitement de la famille des ami(e)s, copains d'enfance, ex-fiancé(e), collègues, créer un avis de recherche pour retrouver une personne chère perdue de vue. Retrouver une personne croisée dans la rue, une discothèque... Rejoignez le plus gros site de recherche de personne et retrouver là. C' est le but de Jeterecherche, jusqu' à la petite annonce pour rencontrer l' amour ou l'amitié.
+
+
\ No newline at end of file
diff --git a/apache-nutch-1.8/patch/parse-xsl/src/tests/org/apache/nutch/package.html b/apache-nutch-1.8/patch/parse-xsl/src/tests/org/apache/nutch/package.html
new file mode 100644
index 0000000..7dffe62
--- /dev/null
+++ b/apache-nutch-1.8/patch/parse-xsl/src/tests/org/apache/nutch/package.html
@@ -0,0 +1,6 @@
+
+
+
A parser plugin and content filter to extract all (possible) links
+from JavaScript files and code snippets.
+
+
diff --git a/apache-nutch-1.8/patch/parse-xsl/src/tests/org/apache/nutch/parse/xsl/AbstractAmisFinder.java b/apache-nutch-1.8/patch/parse-xsl/src/tests/org/apache/nutch/parse/xsl/AbstractAmisFinder.java
new file mode 100644
index 0000000..f3f2252
--- /dev/null
+++ b/apache-nutch-1.8/patch/parse-xsl/src/tests/org/apache/nutch/parse/xsl/AbstractAmisFinder.java
@@ -0,0 +1,143 @@
+package org.apache.nutch.parse.xsl;
+
+import org.apache.log4j.PropertyConfigurator;
+import org.apache.nutch.metadata.Metadata;
+import org.apache.nutch.parse.ParseResult;
+import org.apache.nutch.parse.xsl.XslParseFilter.PARSER;
+
+/**
+ * This is the base class to create AmisFinder related tests. Amis Finder is a
+ * search engine that indexes several other sites related to people searching
+ * for other people. These sites will index two kinds of information:
+ *
+ *
people and their related people
+ *
wanted people that are searched by other people
+ *
+ *
+ * @author albo
+ *
+ */
+public abstract class AbstractAmisFinder extends AbstractCrawlTest {
+
+ /** The extraction method to use */
+ public enum EXTRACT_METHOD {
+ /** Metadata are extracted using XSLT */
+ XSLT_EXTRACTION,
+ /** Metadata are extracted using NodeWalker (DOM iteration) */
+ NODE_WALKER_EXTRACTION
+ }
+
+ static {
+ PropertyConfigurator.configure("conf/log4j.properties");
+ }
+
+ /** The current parser to use */
+ protected PARSER parser = null;
+
+ /**
+ * @param parser the parser to use
+ * Instanciates the class given a specific parser.
+ */
+ protected AbstractAmisFinder(PARSER parser) {
+ this.parser = parser;
+ // Depending of the parameters, the configuration will be built
+ // differently */
+ if (parser == PARSER.NEKO) {
+ this.getConfiguration().set(XslParseFilter.CONF_HTML_PARSER, PARSER.NEKO.toString());
+ } else {
+ this.getConfiguration().set(XslParseFilter.CONF_HTML_PARSER, PARSER.TAGSOUP.toString());
+ }
+
+ }
+
+ /**
+ * Asserts that the following metadata have the expected values.
+ *
+ * @param metadata
+ * the metadata object containing parsed values.
+ * @param firstName
+ * @param lastName
+ * @param gender
+ * @param city
+ * @param country
+ * @param birthDate
+ */
+ protected void assertMetadataPeople(Metadata metadata, String firstName, String lastName, String gender, String city, String country, String birthDate, String age) {
+ // Testing first name
+ assertEquals(firstName, metadata.get(CommonMetadata.META_PEOPLE_FIRST_NAME));
+
+ // Testing last name
+ assertEquals(lastName, metadata.get(CommonMetadata.META_PEOPLE_LAST_NAME));
+
+ // Testing gender
+ assertEquals(gender, metadata.get(CommonMetadata.META_PEOPLE_GENDER));
+
+ // Testing city
+ assertEquals(city, metadata.get(CommonMetadata.META_PEOPLE_CITY));
+
+ // Testing country
+ assertEquals(country, metadata.get(CommonMetadata.META_PEOPLE_COUNTRY));
+
+ // Testing birth date
+ assertEquals(birthDate, metadata.get(CommonMetadata.META_PEOPLE_BIRTH_DATE));
+
+ // Testing age
+ assertEquals(age, metadata.get(CommonMetadata.META_PEOPLE_AGE));
+ }
+
+ /**
+ *
+ * @param metadata
+ * @param wantedPeople
+ * @param searcherPeople
+ * @param description
+ */
+ protected void assertMetadataWantedPeople(Metadata metadata, String wantedPeople, String searcherPeople, String description) {
+
+ assertEquals(searcherPeople, metadata.get(CommonMetadata.META_SEARCHER_PEOPLE));
+ assertEquals(wantedPeople, metadata.get(CommonMetadata.META_WANTED_PEOPLE));
+ assertEquals(description, metadata.get(CommonMetadata.META_DESCRIPTION));
+ }
+
+ /**
+ * Standard test to simulate a crawl on a people. You should call it in your
+ * extended test class and make some assertions.
+ *
+ * @param url
+ * the url to simulate (used as identifier for rules)
+ * @param filePath
+ * the file to crawl on your file system
+ * @return {@link Metadata} that were extracted.
+ * @throws Exception
+ */
+
+ public Metadata startTestPeople(String url, String filePath) throws Exception {
+
+ ParseResult parseResult = simulateCrawl(this.parser, filePath, url);
+ assertNotNull(parseResult);
+
+ Metadata parsedMetadata = parseResult.get(url).getData().getParseMeta();
+ assertNotNull(parsedMetadata);
+ return parsedMetadata;
+ }
+
+ /**
+ * Tests the fetch of a wanted people. Standard test to simulate a crawl on
+ * a wanted people. You should call it in your extended test class and make
+ * some assertions.
+ *
+ * @param url
+ * the url to simulate (used as identifier for rules)
+ * @param filePath
+ * the file to crawl on your file system
+ * @return {@link Metadata} that were extracted.
+ * @throws Exception
+ */
+ public Metadata startTestWantedPeople(String url, String filePath) throws Exception {
+ ParseResult parseResult = simulateCrawl(this.parser, filePath, url);
+ assertNotNull(parseResult.get(url));
+ Metadata parsedMetadata = parseResult.get(url).getData().getParseMeta();
+ assertNotNull(parsedMetadata);
+ return parsedMetadata;
+ }
+}
diff --git a/apache-nutch-1.8/patch/parse-xsl/src/tests/org/apache/nutch/parse/xsl/AbstractCrawlTest.java b/apache-nutch-1.8/patch/parse-xsl/src/tests/org/apache/nutch/parse/xsl/AbstractCrawlTest.java
new file mode 100644
index 0000000..1cb4054
--- /dev/null
+++ b/apache-nutch-1.8/patch/parse-xsl/src/tests/org/apache/nutch/parse/xsl/AbstractCrawlTest.java
@@ -0,0 +1,234 @@
+package org.apache.nutch.parse.xsl;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.text.NumberFormat;
+import java.util.Date;
+
+import junit.framework.TestCase;
+
+import org.apache.hadoop.conf.Configuration;
+import org.apache.html.dom.HTMLDocumentImpl;
+import org.apache.nutch.metadata.Metadata;
+import org.apache.nutch.parse.HtmlParseFilter;
+import org.apache.nutch.parse.ParseData;
+import org.apache.nutch.parse.ParseImpl;
+import org.apache.nutch.parse.ParseResult;
+import org.apache.nutch.parse.html.DOMBuilder;
+import org.apache.nutch.parse.xsl.XslParseFilter.PARSER;
+import org.apache.nutch.protocol.Content;
+import org.apache.nutch.util.NutchConfiguration;
+import org.cyberneko.html.parsers.DOMFragmentParser;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.w3c.dom.DocumentFragment;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+
+/**
+ * A class to group all classic methods to simulate a crawl without running
+ * Nutch like setting a configuration, providing a DocumentFragment, etc... All
+ * your tests related to parse-xsl shall extend this test.
+ *
+ * @author avigier
+ *
+ */
+public abstract class AbstractCrawlTest extends TestCase {
+
+ /** The logger used for current and derived classes */
+ protected static final Logger LOG = LoggerFactory.getLogger(AbstractCrawlTest.class);
+
+ /**
+ * the configuration to use with current crawler Never access this property. @see
+ * AbstractCrawlTest#getConfiguration()
+ */
+ private Configuration configuration = null;
+
+ private long startDate;
+
+ /**
+ * @param parseFilter
+ * the filter to use
+ * @param filePath
+ * the file to crawl
+ * @param url
+ * the url that identifies the file to crawl (only used to set
+ * the unique key)
+ * @return the resulting content after the crawl
+ * @throws Exception
+ */
+ protected ParseResult simulateCrawl(PARSER parseFilter, String filePath, String url) throws Exception {
+ ParseResult result = null;
+ FileInputStream is = null;
+ try {
+ // Opening test file
+ File file = new File(filePath);
+ is = new FileInputStream(file);
+ byte[] bytes = new byte[0];
+
+ // config.addResource(new
+ // Path("src/plugin/parse-filter-amisfinder/src/tests/files/configuration.xml"));
+
+ // Setting the void content
+ Content content = new Content(url, "", bytes, "text/html", new Metadata(), this.getConfiguration());
+
+ // Parse document with related parser
+ DocumentFragment document = null;
+ if (parseFilter == PARSER.NEKO) {
+ document = parseNeko(new InputSource(is));
+
+ } else {
+ document = parseTagSoup(new InputSource(is));
+ }
+
+ // Creates a parser with dedicated method
+ HtmlParseFilter filter = new XslParseFilter();
+ // Setting configuration
+ filter.setConf(this.getConfiguration());
+
+ ParseData data = new ParseData();
+
+ // Initializing the parse result
+ ParseResult parseResult = ParseResult.createParseResult(url, new ParseImpl("no text", data));
+
+ // Extracting metadata
+ result = filter.filter(content, parseResult, null, document);
+ } catch (Exception e) {
+ throw new Exception("Cannot simulate crawl", e);
+ } finally {
+ if (is != null) {
+ try {
+ is.close();
+ } catch (IOException e) {
+ LOG.error("Cannot close input stream", e);
+ }
+ }
+ }
+ return result;
+ }
+
+ /**
+ * Constructs a an html DOM structure.
+ *
+ * @param input
+ * the html/xml input stream
+ * @return DocumentFragment the document that has been created.
+ * @throws Exception
+ */
+ protected static DocumentFragment parseTagSoup(InputSource input) throws Exception {
+ HTMLDocumentImpl doc = new HTMLDocumentImpl();
+ DocumentFragment frag = doc.createDocumentFragment();
+ DOMBuilder builder = new DOMBuilder(doc, frag);
+ org.ccil.cowan.tagsoup.Parser reader = new org.ccil.cowan.tagsoup.Parser();
+ reader.setContentHandler(builder);
+ reader.setFeature(org.ccil.cowan.tagsoup.Parser.ignoreBogonsFeature, true);
+ reader.setFeature(org.ccil.cowan.tagsoup.Parser.bogonsEmptyFeature, false);
+ reader.setProperty("http://xml.org/sax/properties/lexical-handler", builder);
+ reader.parse(input);
+ return frag;
+ }
+
+ /**
+ * Constructs a an html DOM structure.
+ *
+ * @param input
+ * the html/xml input stream
+ * @return DocumentFragment the document that has been created.
+ * @throws Exception
+ */
+ protected static DocumentFragment parseNeko(InputSource input) throws Exception {
+ DOMFragmentParser parser = new DOMFragmentParser();
+ try {
+ parser.setFeature("http://cyberneko.org/html/features/scanner/allow-selfclosing-iframe", true);
+ parser.setFeature("http://cyberneko.org/html/features/augmentations", true);
+ parser.setProperty("http://cyberneko.org/html/properties/default-encoding", "UTF-8");
+ parser.setFeature("http://cyberneko.org/html/features/scanner/ignore-specified-charset", true);
+ parser.setFeature("http://cyberneko.org/html/features/balance-tags/ignore-outside-content", false);
+ parser.setFeature("http://cyberneko.org/html/features/balance-tags/document-fragment", true);
+ parser.setFeature("http://cyberneko.org/html/features/balance-tags", true);
+ parser.setFeature("http://cyberneko.org/html/features/report-errors", true);
+ parser.setProperty("http://cyberneko.org/html/properties/names/elems", "lower");
+
+ System.out.println(LOG.isTraceEnabled());
+
+ } catch (SAXException e) {
+ LOG.error("Cannot set parser features", e);
+ }
+ // convert Document to DocumentFragment
+ HTMLDocumentImpl doc = new HTMLDocumentImpl();
+ doc.setErrorChecking(false);
+ DocumentFragment res = doc.createDocumentFragment();
+ DocumentFragment frag = doc.createDocumentFragment();
+ parser.parse(input, frag);
+ res.appendChild(frag);
+
+ try {
+ while (true) {
+ frag = doc.createDocumentFragment();
+ parser.parse(input, frag);
+ if (!frag.hasChildNodes())
+ break;
+ // if (LOG.isInfoEnabled()) {
+ LOG.info(" - new frag, " + frag.getChildNodes().getLength() + " nodes.");
+ System.out.println(" - new frag, " + frag.getChildNodes().getLength() + " nodes.");
+ // }
+ res.appendChild(frag);
+ }
+ } catch (Exception e) {
+ LOG.error("Error: ", e);
+ System.out.println(e);
+ }
+
+ return res;
+ }
+
+ /**
+ *
+ * @return the current configuration.
+ */
+ public Configuration getConfiguration() {
+ if (this.configuration == null) {
+ this.configuration = NutchConfiguration.create();
+ }
+ return this.configuration;
+ }
+
+ /**
+ * To display some memory related information. Can be used for benchmark
+ * test
+ */
+ private void displayMemoryUsage() {
+ Runtime runtime = Runtime.getRuntime();
+
+ NumberFormat format = NumberFormat.getInstance();
+
+ long maxMemory = runtime.maxMemory();
+ long allocatedMemory = runtime.totalMemory();
+ long freeMemory = runtime.freeMemory();
+
+ System.out.println("free memory: " + format.format(freeMemory / 1024));
+ System.out.println("allocated memory: " + format.format(allocatedMemory / 1024));
+ System.out.println("max memory: " + format.format(maxMemory / 1024));
+ System.out.println("total free memory: " + format.format((freeMemory + (maxMemory - allocatedMemory)) / 1024));
+ }
+
+ /**
+ * Can be called before each test to get the run test date.
+ */
+ protected void startTest() {
+ System.out.println("Starting test...");
+ this.displayMemoryUsage();
+ this.startDate = new Date().getTime();
+ }
+
+ /**
+ * Can be called at the end of a test to evaluate the elapsed time.
+ */
+ private void endTest() {
+ this.displayMemoryUsage();
+ System.out.println("Test took " + (new Date().getTime() - this.startDate) + " ms");
+ System.out.println("Test ended.");
+ }
+
+}
diff --git a/apache-nutch-1.8/patch/parse-xsl/src/tests/org/apache/nutch/parse/xsl/CommonMetadata.java b/apache-nutch-1.8/patch/parse-xsl/src/tests/org/apache/nutch/parse/xsl/CommonMetadata.java
new file mode 100644
index 0000000..0b67ffe
--- /dev/null
+++ b/apache-nutch-1.8/patch/parse-xsl/src/tests/org/apache/nutch/parse/xsl/CommonMetadata.java
@@ -0,0 +1,33 @@
+package org.apache.nutch.parse.xsl;
+
+/**
+ * Metadata that are fetched.
+ */
+public class CommonMetadata {
+
+ /* Metadata related to wanted people */
+
+ /** description of the wanted people */
+ public static final String META_DESCRIPTION = "description";
+ /** the people that is searching */
+ public static final String META_SEARCHER_PEOPLE = "searcherPeople";
+ /** the people that is searched */
+ public static final String META_WANTED_PEOPLE = "wantedPeople";
+
+ /* Metadata related */
+
+ /** birth date metadata */
+ public static final String META_PEOPLE_BIRTH_DATE = "birthDate";
+ /** country metadata */
+ public static final String META_PEOPLE_COUNTRY = "country";
+ /** city metadata */
+ public static final String META_PEOPLE_CITY = "city";
+ /** gender metadata */
+ public static final String META_PEOPLE_GENDER = "gender";
+ /** last name metadata */
+ public static final String META_PEOPLE_LAST_NAME = "lastName";
+ /** first name metadata */
+ public static final String META_PEOPLE_FIRST_NAME = "firstName";
+ /** age metadata */
+ public static final String META_PEOPLE_AGE = "age";
+}
diff --git a/apache-nutch-1.8/patch/parse-xsl/src/tests/org/apache/nutch/parse/xsl/CopainsDavantTest.java b/apache-nutch-1.8/patch/parse-xsl/src/tests/org/apache/nutch/parse/xsl/CopainsDavantTest.java
new file mode 100644
index 0000000..109b5cb
--- /dev/null
+++ b/apache-nutch-1.8/patch/parse-xsl/src/tests/org/apache/nutch/parse/xsl/CopainsDavantTest.java
@@ -0,0 +1,74 @@
+package org.apache.nutch.parse.xsl;
+
+import java.util.Arrays;
+import java.util.Collection;
+
+import org.apache.log4j.PropertyConfigurator;
+import org.apache.nutch.metadata.Metadata;
+import org.apache.nutch.parse.xsl.XslParseFilter.PARSER;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameters;
+
+/**
+ * A simple class to extract some data from a http://www.marmiton.com page. This
+ * is dedicated to meta extraction for recipes.
+ */
+@RunWith(Parameterized.class)
+public class CopainsDavantTest extends AbstractAmisFinder {
+
+ static {
+ PropertyConfigurator.configure("conf/log4j.properties");
+ }
+
+ /**
+ *
+ * @param parser
+ * the parser to use the extract method to use
+ */
+ public CopainsDavantTest(PARSER parser) {
+ super(parser);
+ this.getConfiguration().set(RulesManager.CONF_XML_RULES, "src/plugin/parse-xsl/src/tests/files/copainsdavant/rules.xml");
+ }
+
+ /**
+ * Initializes parameters. TODO integrate test for Tag Soup when working.
+ *
+ * @return the collection of parameters.
+ */
+ @Parameters(name = "{index}: parser {0}")
+ public static Collection