Я клонировал git
исходный код проекта и использовал grep
, чтобы найти слово во всем проекте, SchemaHandler
. grep
не удалось найти слово в этом странном кодовом файле:
Да, я допускаю, что это не стандартный текстовый файл, но grep
может найти строки также в двоичном файле. Действительно, удалось найти слово в двух файлах jar в проекте. Почему не получилось с этим текстом?
Я использовал команду grep -R SchemaHandler .
в корне клонированного проекта.
Я использую L Ubuntu 18.0.4 и grep
3.1
Это действительно находит его. Проблема состоит в том, что файл имеет возврат каретки (\r
) который заставляет имя файла быть скрытым терминалом. Для иллюстрирования, что я имею в виду сравните эти две команды:
printf "foobar\n"
и
printf "foo\rbar\n"
Это - то, что каждый должен распечатать:
$ printf "foobar\n"
foobar
$ printf "foo\rbar\n"
bar
Вторая команда все еще печатает foo
, но \r
заставляет терминал возвращаться к началу строки, таким образом, это перезаписывается. Вы видите его, если Вы используете od
хотя:
$ printf "foo\rbar\n" | od -c
0000000 f o o \r b a r \n
0000010
Подобная вещь происходит при выполнении Вашего grep -R
:
$ git clone https://github.com/yawlfoundation/yawl
$ cd yawl
$ grep -R SchemaHandler . | grep YDataValidator
} } return schema ; .replaceAll("type=\"", "type=\"xs:"); xmlns:xs");pes, soonn) e;
На первый взгляд это заканчивается, кажется странным. Howe приезжает строка, которая, кажется, не содержит строку YDataValidator
возвращается grep YDataValidator
? Ответ \r
. Та строка на самом деле от YDataValidator.java
файл, но имя файла затеняется \r
. Вы видите это более ясно, если Вы говорите grep
только распечатать соответствующую строку и несколько символов вокруг этого:
$ grep -PRo '.{10}SchemaHandler.{10}' . | grep YDataVal
* @a/org/yawlfoundation/yawl/schema/YDataValidator.java:d using a SchemaHandler.
./src/org/yawlfoundation/yawl/schema/YDataValidator.java: private SchemaHandler handler;
./src/org/yawlfoundation/yawl/schema/YDataValidator.java:ler = new SchemaHandler(schema);
./src/org/yawlfoundation/yawl/schema/YDataValidator.java: SchemaHandler handler =
./src/org/yawlfoundation/yawl/schema/YDataValidator.java: new SchemaHandler(DOMUtil.g
Здесь, с тех пор существует нет \r
в этих 10 символах сразу вокруг любого из 5 экземпляров SchemaHandler
в YDataValidator.java
, имя отображено правильно. Ваша исходная команда возвратила весь файл (целый файл является всего одной строкой, разделенной \r
которые не определяют новые строки в Linux), таким образом, Вы видели одну длинную линию, которая искажалась из-за \r
.
Можно проверить путем выполнения этого:
$ grep SchemaHandler ./src/org/yawlfoundation/yawl/schema/YDataValidator.java
} } return schema ; .replaceAll("type=\"", "type=\"xs:"); xmlns:xs");pes, soonn) e;
И затем сравнивая вывод с тем, что Вы получаете при замене всех \r
с новыми строками:
$ grep SchemaHandler ./src/org/yawlfoundation/yawl/schema/YDataValidator.java | tr '\r' '\n'
/*
* Copyright (c) 2004-2012 The YAWL Foundation. All rights reserved.
* The YAWL Foundation is a collaboration of individuals and
* organisations who are committed to improving workflow technology.
*
* This file is part of YAWL. YAWL is free software: you can
* redistribute it and/or modify it under the terms of the GNU Lesser
* General Public License as published by the Free Software Foundation.
*
* YAWL is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General
* Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with YAWL. If not, see <http://www.gnu.org/licenses/>.
*/
package org.yawlfoundation.yawl.schema;
import org.jdom2.Element;
import org.yawlfoundation.yawl.elements.data.YVariable;
import org.yawlfoundation.yawl.exceptions.YDataValidationException;
import org.yawlfoundation.yawl.schema.internal.YInternalType;
import org.yawlfoundation.yawl.util.DOMUtil;
import org.yawlfoundation.yawl.util.JDOMUtil;
import org.yawlfoundation.yawl.util.StringUtil;
import javax.xml.XMLConstants;
import java.util.*;
/**
* This class serves as a validation mechanism for the specification specific
* schema and the instance data from either the net or a task. This is performed
* by taking the data available at the various validation points and converting
* it into conventional XML which is then validated using a SchemaHandler.
*
* @author Mike Fowler
* Date: 05-Jul-2006
*/
public class YDataValidator {
// Object that performs the real validation on XML documents
private SchemaHandler handler;
/**
* Constructs a new validator and handler. The
* handler is not ready for use until validateSchema
* has been called.
* @param schema a W3C XML Schema
*/
public YDataValidator(String schema) {
this.handler = new SchemaHandler(schema);
}
/**
* Compiles and determines the validity of the current schema
* @return true if the schema compiled without error.
*/
public boolean validateSchema() {
return handler.compileSchema();
}
/**
* Validates a single data variable
*
* @param variable to be validated
* @param data XML representation of variable to be validated
* @param source
* @throws YDataValidationException if the data is not valid
*/
public void validate(YVariable variable, Element data, String source)
throws YDataValidationException {
List<YVariable> vars = new ArrayList<YVariable>(1);
vars.add(variable);
validate(vars, data, source);
}
/**
* Validates a collection of variables against the schema. This is achieved by
* temporarily adding a schema element declaration for the data. This avoids
* attempting to create a new schema containing only the relevant data types.
*
* @param vars variables to be validated
* @param data XML representation fo the variables to be validated
* @param source
* @throws YDataValidationException if the data is not valid
*/
public void validate(Collection vars, Element data, String source)
throws YDataValidationException {
try {
String schema = ensurePrefixedSchema(handler.getSchema());
org.w3c.dom.Document xsd = DOMUtil.getDocumentFromString(schema);
String ns = XMLConstants.W3C_XML_SCHEMA_NS_URI;
//need to determine the prefix for the schema namespace
String prefix = ensureValidPrefix(xsd.lookupPrefix(ns));
org.w3c.dom.Element element = xsd.createElementNS(ns, prefix + "element");
element.setAttribute("name", data.getName());
org.w3c.dom.Element complex = xsd.createElementNS(ns, prefix + "complexType");
org.w3c.dom.Element sequence = xsd.createElementNS(ns, prefix + "sequence");
ArrayList varList = new ArrayList(vars);
Collections.sort(varList); // sort on YParameter ordering value
for (Object obj : varList) {
YVariable var = (YVariable) obj;
org.w3c.dom.Element child = xsd.createElementNS(ns, prefix + "element");
child.setAttribute("name", var.getName());
String type = var.getDataTypeName();
if (XSDType.isBuiltInType(type)) {
type = prefix + type;
}
else if (YInternalType.isType(type)) {
type = prefix + type;
xsd.getDocumentElement().appendChild(DOMUtil.getDocumentFromString(
YInternalType.valueOf(type).getSchemaString()).getDocumentElement());
}
child.setAttribute("type", type);
if (var.isOptional()) {
child.setAttribute("minOccurs", "0");
}
sequence.appendChild(child);
}
complex.appendChild(sequence);
element.appendChild(complex);
xsd.getDocumentElement().appendChild(element);
SchemaHandler handler =
new SchemaHandler(DOMUtil.getXMLStringFragmentFromNode(xsd));
if (! handler.compileSchema()) {
throw new YDataValidationException(
handler.getSchema(),
data,
handler.getConcatenatedMessage(),
source,
"Problem with process model. Failed to compile schema");
}
if (! handler.validate(JDOMUtil.elementToString(data))) {
throw new YDataValidationException(
handler.getSchema(),
data,
handler.getConcatenatedMessage(),
source,
"Problem with process model. Schema validation failed");
}
}
catch (Exception e) {
if (e instanceof YDataValidationException) throw (YDataValidationException) e;
}
}
/**
* @return String representation of the schema
*/
public String getSchema() {
return handler.getSchema();
}
/**
* @return All error/warning messages relating to the last validation/compilation
*/
public List<String> getMessages() {
return handler.getMessages();
}
/**
* @return the set of (first-level) type names defined in this schema
*/
public Set<String> getPrimaryTypeNames() {
return handler.getPrimaryTypeNames();
}
/**
* Utility method to ensure the prefix is valid (enforces : and
* defaults to xs:)
*
* @param prefix to validate
* @return validated prefix
*/
private String ensureValidPrefix(String prefix) {
if (StringUtil.isNullOrEmpty(prefix)) {
return "xs:";
}
else if (! prefix.endsWith(":")) {
return prefix + ":";
}
return prefix;
}
/**
* A schema may not have a valid prefix if a spec contains no complex types, so
* this makes sure it gets one in that case
* @param schema the schema string to check
* @return a correctly (or defaultly) prefixed schema string
*/
private String ensurePrefixedSchema(String schema) {
if (!schema.contains(":schema")) {
schema = schema.replaceFirst("schema xmlns", "schema xmlns:xs");
schema = schema.replaceAll("<", "<xs:")
.replaceAll("<xs:/", "</xs:")
.replaceAll("type=\"", "type=\"xs:");
}
return schema ;
}
}
С другой стороны, можно передать вывод по каналу к пейджеру как less
который покажет \r
как ^M
и может также помочь Вам определить строку, которая Вы после.
В корневой папке проекта выполните:
$ grep -irn SchemaHandler
Возможно, больше комментария, но у меня не было проблемы при выполнении grep
на Вашем файле. Я нажал на Вашу ссылку, затем нажатую raw
затем щелкните правой кнопкой и Select All
затем сохраненный текст в файл и работал:
$ grep -R SchemaHandler
greptext: * it into conventional XML which is then validated using a SchemaHandler.
greptext: private SchemaHandler handler;
greptext: this.handler = new SchemaHandler(schema);
greptext: SchemaHandler handler =
greptext: new SchemaHandler(DOMUtil.getXMLStringFragmentFromNode(xsd));
Надо надеяться, кто-то, кто использует github
часто может описывать, почему необработанный текст работает на меня и почему клонирование не работает на других.