Skip to content

Commit

Permalink
Merge pull request #3906 from maxonfjvipon/bug/#3863/xnav-instead-of-…
Browse files Browse the repository at this point in the history
…xpath

bug(#3863): use `xnav` everywhere
  • Loading branch information
yegor256 authored Feb 11, 2025
2 parents 4dd1749 + edeb5b1 commit 6786b57
Show file tree
Hide file tree
Showing 15 changed files with 166 additions and 74 deletions.
10 changes: 3 additions & 7 deletions eo-maven-plugin/src/main/java/org/eolang/maven/LatexMojo.java
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,6 @@
import java.nio.file.Path;
import org.apache.maven.plugins.annotations.LifecyclePhase;
import org.apache.maven.plugins.annotations.Mojo;
import org.eolang.maven.latex.LatexTemplate;
import org.eolang.maven.tojos.ForeignTojo;
import org.eolang.maven.util.HmBase;

Expand Down Expand Up @@ -83,13 +82,10 @@ static String last(final String input) {
void exec() throws IOException {
for (final ForeignTojo tojo : this.scopedTojos().withShaken()) {
final Path file = tojo.shaken();
final Place place = new Place(
LatexMojo.last(new XMLDocument(file).xpath("/program/@name").get(0))
);
final Path dir = this.targetDir.toPath();
final Path target = place.make(
dir.resolve(LatexMojo.DIR), LatexMojo.EXT
);
final Path target = new Place(
LatexMojo.last(new ProgramName(new XMLDocument(file)).get())
).make(dir.resolve(LatexMojo.DIR), LatexMojo.EXT);
new HmBase(dir).save(
new LatexTemplate(
new XMLDocument(file).nodes("/program/listing").get(0).toString()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
package org.eolang.maven.latex;
package org.eolang.maven;

import org.cactoos.io.ResourceOf;
import org.cactoos.text.TextOf;
Expand Down
3 changes: 1 addition & 2 deletions eo-maven-plugin/src/main/java/org/eolang/maven/LintMojo.java
Original file line number Diff line number Diff line change
Expand Up @@ -144,9 +144,8 @@ private int lintOne(final ForeignTojo tojo,
final ConcurrentHashMap<Severity, Integer> counts) throws Exception {
final Path source = tojo.shaken();
final XML xmir = new XMLDocument(source);
final String name = xmir.xpath("/program/@name").get(0);
final Path base = this.targetDir.toPath().resolve(LintMojo.DIR);
final Path target = new Place(name).make(base, AssembleMojo.XMIR);
final Path target = new Place(new ProgramName(xmir).get()).make(base, AssembleMojo.XMIR);
tojo.withLinted(
new FpDefault(
src -> LintMojo.linted(xmir, counts).toString(),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
*/
package org.eolang.maven;

import com.github.lombrozo.xnav.Xnav;
import com.jcabi.log.Logger;
import com.jcabi.xml.XML;
import com.jcabi.xml.XMLDocument;
Expand Down Expand Up @@ -130,10 +131,13 @@ private int parsed(final ForeignTojo tojo) throws Exception {
Logger.debug(this, "Parsed %[file]s to %[file]s", source, target);
} else {
for (final XML error : errors) {
final Xnav xnav = new Xnav(error.inner());
Logger.error(
this,
"Failed to parse '%[file]s:%s': %s",
source, error.xpath("@line").get(0), error.xpath("text()").get(0)
source,
xnav.attribute("line").text().get(),
xnav.text().get()
);
}
}
Expand Down
42 changes: 37 additions & 5 deletions eo-maven-plugin/src/main/java/org/eolang/maven/ProbeMojo.java
Original file line number Diff line number Diff line change
Expand Up @@ -23,16 +23,20 @@
*/
package org.eolang.maven;

import com.github.lombrozo.xnav.Filter;
import com.github.lombrozo.xnav.Xnav;
import com.jcabi.log.Logger;
import com.jcabi.xml.XMLDocument;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.nio.file.Path;
import java.util.Collection;
import java.util.HashSet;
import java.util.Optional;
import java.util.stream.Stream;
import org.apache.maven.plugins.annotations.LifecyclePhase;
import org.apache.maven.plugins.annotations.Mojo;
import org.cactoos.iterable.Filtered;
import org.cactoos.iterable.IterableOf;
import org.cactoos.iterable.Mapped;
import org.cactoos.list.ListOf;
import org.eolang.maven.hash.ChCached;
Expand Down Expand Up @@ -152,9 +156,7 @@ private Collection<String> probes(final Path file) throws FileNotFoundException
ProbeMojo::noPrefix,
new Filtered<>(
obj -> !obj.isEmpty(),
new XMLDocument(file).xpath(
"/program/metas/meta[head/text() = 'probe']/tail/text()"
)
ProbeMojo.probeMetas(file)
)
).iterator()
);
Expand All @@ -172,6 +174,37 @@ private Collection<String> probes(final Path file) throws FileNotFoundException
return objects;
}

/**
* Return probe metas.
* The equivalent xpath is: "/program/metas/meta[head/text() = 'probe']/tail/text()"
* @param file XML file
* @return Metas to probe
*/
private static Iterable<String> probeMetas(final Path file) {
return new IterableOf<>(
new Xnav(file)
.element("program")
.elements(Filter.withName("metas"))
.findFirst()
.map(
metas -> metas.elements(
Filter.all(
Filter.withName("meta"),
meta -> {
final Optional<String> head = new Xnav(meta)
.element("head")
.text();
return head.isPresent() && "probe".equals(head.get());
}
)
)
.map(meta -> meta.element("tail").text().get())
)
.orElse(Stream.of())
.iterator()
);
}

/**
* Trim Q prefix.
* Q.a.b.c -> a.b
Expand All @@ -188,5 +221,4 @@ private static String noPrefix(final String obj) {
}
return result;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -21,9 +21,32 @@
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
package org.eolang.maven;

import com.github.lombrozo.xnav.Xnav;
import com.jcabi.xml.XML;
import java.util.function.Supplier;

/**
* LaTex.
*
* @since 0.30
* Function that extract "/program/@name" from XML.
* @since 0.52
*/
package org.eolang.maven.latex;
final class ProgramName implements Supplier<String> {
/**
* Navigator.
*/
private final Xnav xnav;

/**
* Ctor.
* @param xml XML
*/
ProgramName(final XML xml) {
this.xnav = new Xnav(xml.inner());
}

@Override
public String get() {
return this.xnav.element("program").attribute("name").text().orElse("");
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,8 @@ final class ProgramPlace extends FuncEnvelope<XML, Path> {
* @param dir Home directory
*/
ProgramPlace(final Path dir) {
super(xml -> new Place(xml.xpath("/program/@name").get(0)).make(dir, ""));
super(
xml -> new Place(new ProgramName(xml).get()).make(dir, "")
);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -103,9 +103,8 @@ private int shaken(final ForeignTojo tojo, final Function<XML, XML> transform)
throws Exception {
final Path source = tojo.xmir();
final XML xmir = new XMLDocument(source);
final String name = xmir.xpath("/program/@name").get(0);
final Path base = this.targetDir.toPath().resolve(ShakeMojo.DIR);
final Path target = new Place(name).make(base, AssembleMojo.XMIR);
final Path target = new Place(new ProgramName(xmir).get()).make(base, AssembleMojo.XMIR);
tojo.withShaken(
new FpDefault(
src -> transform.apply(xmir).toString(),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
*/
package org.eolang.maven;

import com.github.lombrozo.xnav.Xnav;
import com.jcabi.log.Logger;
import com.jcabi.xml.XML;
import com.jcabi.xml.XMLDocument;
Expand Down Expand Up @@ -202,9 +203,7 @@ private int transpiled(
final Path source = tojo.shaken();
final XML xmir = new XMLDocument(source);
final Path base = this.targetDir.toPath().resolve(TranspileMojo.DIR);
final Path target = new Place(
xmir.xpath("/program/@name").get(0)
).make(base, AssembleMojo.XMIR);
final Path target = new Place(new ProgramName(xmir).get()).make(base, AssembleMojo.XMIR);
final Supplier<String> hsh = new TojoHash(tojo);
final AtomicBoolean rewrite = new AtomicBoolean(false);
new FpDefault(
Expand Down Expand Up @@ -257,11 +256,12 @@ private int javaGenerated(final boolean rewrite, final Path target, final String
final Collection<XML> nodes = new XMLDocument(target).nodes("//class[java and not(@atom)]");
final AtomicInteger saved = new AtomicInteger(0);
for (final XML java : nodes) {
final String jname = java.xpath("@java-name").get(0);
final Xnav xnav = new Xnav(java.inner());
final String jname = xnav.attribute("java-name").text().get();
final Path tgt = new Place(jname).make(
this.generatedDir.toPath(), TranspileMojo.JAVA
);
this.pinfo(tgt, jname, java.xpath("@package").stream().findFirst().orElse(""));
this.pinfo(tgt, jname, xnav.attribute("package").text().orElse(""));
final Supplier<Path> che = new CachePath(
this.cache.toPath().resolve(TranspileMojo.CACHE),
this.plugin.getVersion(),
Expand All @@ -275,7 +275,7 @@ private int javaGenerated(final boolean rewrite, final Path target, final String
this, "Generated %[file]s (%[size]s) file from %[file]s (%[size]s)",
tgt, tgt.toFile().length(), target, target.toFile().length()
);
return new Joined("", java.xpath("java/text()")).asString();
return new Joined("", xnav.element("java").text().get()).asString();
}
);
new FpIfTargetExists(
Expand Down
22 changes: 21 additions & 1 deletion eo-maven-plugin/src/main/java/org/eolang/maven/UnphiMojo.java
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,8 @@
*/
package org.eolang.maven;

import com.github.lombrozo.xnav.Filter;
import com.github.lombrozo.xnav.Xnav;
import com.jcabi.log.Logger;
import com.jcabi.xml.XML;
import java.io.File;
Expand All @@ -31,6 +33,7 @@
import java.util.List;
import java.util.Set;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.stream.Collectors;
import org.apache.maven.plugins.annotations.LifecyclePhase;
import org.apache.maven.plugins.annotations.Mojo;
import org.apache.maven.plugins.annotations.Parameter;
Expand Down Expand Up @@ -105,7 +108,7 @@ public void exec() {
"Parsed to xmir: %[file]s -> %[file]s",
phi, this.unphiOutputDir.toPath().resolve(xmir)
);
final List<String> here = result.xpath("//errors/error/text()");
final List<String> here = UnphiMojo.errors(result);
if (!here.isEmpty()) {
errors.add(
Logger.format(
Expand Down Expand Up @@ -133,4 +136,21 @@ public void exec() {
);
}
}

/**
* Get errors list.
* @param xml XML
* @return Errors list
*/
private static List<String> errors(final XML xml) {
return new Xnav(xml.inner())
.element("program")
.elements(Filter.withName("errors"))
.findFirst()
.map(
errors -> errors.elements(Filter.withName("error"))
.map(xnav -> xnav.text().get())
.collect(Collectors.toList())
).orElse(List.of());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -23,14 +23,16 @@
*/
package org.eolang.maven.dependencies;

import com.github.lombrozo.xnav.Filter;
import com.github.lombrozo.xnav.Xnav;
import com.jcabi.log.Logger;
import com.jcabi.xml.XMLDocument;
import java.io.FileNotFoundException;
import java.nio.file.Path;
import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;
import org.apache.maven.model.Dependency;
import org.eolang.maven.Coordinates;
import org.eolang.maven.ParseMojo;
Expand Down Expand Up @@ -125,14 +127,7 @@ public Iterator<Dependency> iterator() {
* @return List of artifact needed
*/
private static Optional<Dependency> artifact(final Path file) {
final Collection<String> coords;
try {
coords = new XMLDocument(file).xpath(
"//meta[head='rt' and part[1]='jvm']/part[2]/text()"
);
} catch (final FileNotFoundException ex) {
throw new IllegalStateException(ex);
}
final Collection<String> coords = DcsDefault.jvms(file);
final Optional<Dependency> dep;
if (coords.isEmpty()) {
dep = Optional.empty();
Expand All @@ -158,4 +153,44 @@ private static Optional<Dependency> artifact(final Path file) {
return dep;
}

/**
* Return collection of +rt metas.
* The equivalent xpath is "/program/metas/meta[head='rt' and part[1]='jvm']/part[2]/text()"
* @param file XML file
* @return Collection of runtime metas
*/
private static Collection<String> jvms(final Path file) {
return new Xnav(file)
.element("program")
.elements(Filter.withName("metas"))
.findFirst()
.map(
metas -> metas.elements(
Filter.all(
Filter.withName("meta"),
meta -> {
final Xnav xnav = new Xnav(meta);
final Optional<String> head = xnav.element("head").text();
final boolean runtime = head.isPresent() && "rt".equals(head.get());
final Optional<Xnav> part = xnav.elements(
Filter.withName("part")
).findFirst();
return runtime
&& part.isPresent()
&& "jvm".equals(part.get().text().get());
}
)
)
.map(
meta -> meta
.elements(Filter.withName("part"))
.limit(2)
.reduce((first, second) -> second)
.get()
.text()
.get()
)
.collect(Collectors.toList())
).orElse(List.of());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
*/
package org.eolang.maven.dependencies;

import com.github.lombrozo.xnav.Xnav;
import com.jcabi.aspects.RetryOnFailure;
import com.jcabi.xml.XMLDocument;
import java.io.IOException;
Expand Down Expand Up @@ -115,7 +116,12 @@ private static Unchecked<Dependency> mavenDependency() {
);
try {
return DcsWithRuntime.dependency(
new XMLDocument(new URL(url)).xpath("//latest/text()").get(0)
new Xnav(new XMLDocument(new URL(url)).inner())
.element("metadata")
.element("versioning")
.element("latest")
.text()
.get()
);
} catch (final IOException ex) {
throw new IllegalStateException(
Expand Down
Loading

0 comments on commit 6786b57

Please sign in to comment.