Skip to content

Commit

Permalink
Merge branch 'master' into dependabot/maven/com.google.guava-guava-32…
Browse files Browse the repository at this point in the history
….0.0-jre
  • Loading branch information
olenagerasimova committed Jun 16, 2023
2 parents 9ead205 + fb37f2b commit 73b6e49
Show file tree
Hide file tree
Showing 6 changed files with 118 additions and 110 deletions.
107 changes: 60 additions & 47 deletions src/main/java/com/artipie/rpm/RpmMetadata.java
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,9 @@
import com.artipie.rpm.pkg.Checksum;
import com.artipie.rpm.pkg.FilePackage;
import com.artipie.rpm.pkg.Package;
import com.jcabi.log.Logger;
import com.fasterxml.aalto.AsyncXMLInputFactory;
import com.fasterxml.aalto.stax.InputFactoryImpl;
import com.fasterxml.aalto.stax.OutputFactoryImpl;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.IOException;
Expand All @@ -28,29 +30,46 @@
import java.util.Arrays;
import java.util.Collection;
import java.util.Optional;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.CompletableFuture;
import javax.xml.stream.XMLEventFactory;
import org.codehaus.stax2.XMLOutputFactory2;
import org.redline_rpm.header.Header;

/**
* Rpm metadata class works with xml metadata - adds or removes records about xml packages.
* @since 1.4
* @checkstyle ClassDataAbstractionCouplingCheck (500 lines)
* @checkstyle ModifierOrderCheck (500 lines)
* @checkstyle InterfaceIsTypeCheck (500 lines)
* @checkstyle NestedTryDepthCheck (500 lines)
*/
public interface RpmMetadata {

/**
* Temp file suffix.
*/
String SUFFIX = ".xml";

/**
* Xml Events Factory.
*/
XMLEventFactory EVENTS_FACTORY = XMLEventFactory.newFactory();
/**
* Xml Output Factory.
*/
XMLOutputFactory2 OUTPUT_FACTORY = new OutputFactoryImpl();
/**
* Xml Input Factory.
*/
AsyncXMLInputFactory INPUT_FACTORY = new InputFactoryImpl();

/**
* Removes RMP records from metadata.
*
* @since 1.4
*/
final class Remove {

/**
* Temp file suffix.
*/
private static final String SUFFIX = ".xml";

/**
* Metadata list.
*/
Expand All @@ -76,7 +95,7 @@ public void perform(final Collection<String> checksums) {
if (!item.input.isPresent()) {
continue;
}
final Path temp = Files.createTempFile("rpm-index", Remove.SUFFIX);
final Path temp = Files.createTempFile("rpm-index", RpmMetadata.SUFFIX);
try {
final long res;
final XmlMaid maid;
Expand Down Expand Up @@ -106,9 +125,14 @@ public void perform(final Collection<String> checksums) {

/**
* Appends RMP records into metadata.
*
* @since 1.4
*/
final class Append {
/**
* Xml Event Primary.
*/
private final static XmlEventPrimary XML_EVENT_PRIMARY = new XmlEventPrimary();

/**
* Metadata list.
Expand All @@ -129,27 +153,30 @@ public Append(final MetadataItem... items) {
* @throws ArtipieIOException On io-operation error
* @checkstyle NestedTryDepthCheck (20 lines)
*/
@SuppressWarnings("PMD.AvoidDuplicateLiterals")
public void perform(final Collection<Package.Meta> packages) {
try {
final Path temp = Files.createTempFile("rpm-primary-append", Remove.SUFFIX);
try {
final MergedXml.Result res;
final Path temp = Files.createTempFile("rpm-primary-append", RpmMetadata.SUFFIX);
try (OutputStream out = new BufferedOutputStream(Files.newOutputStream(temp))) {
final MetadataItem primary = this.items.stream()
.filter(item -> item.type == XmlPackage.PRIMARY).findFirst().get();
try (OutputStream out = new BufferedOutputStream(Files.newOutputStream(temp))) {
res = new MergedXmlPrimary(primary.input, out)
.merge(packages, new XmlEventPrimary());
.filter(item -> item.type == XmlPackage.PRIMARY)
.findFirst()
.orElseThrow(
() -> new ArtipieIOException(
String.format("Should have a file with type %s", XmlPackage.PRIMARY)

Check warning on line 166 in src/main/java/com/artipie/rpm/RpmMetadata.java

View check run for this annotation

Codecov / codecov/patch

src/main/java/com/artipie/rpm/RpmMetadata.java#L165-L166

Added lines #L165 - L166 were not covered by tests
)
);
final MergedXml.Result res = new MergedXmlPrimary(primary.input, out)
.merge(packages, Append.XML_EVENT_PRIMARY);
final CompletableFuture<Void> fut = CompletableFuture.allOf(
CompletableFuture.runAsync(this.updateOther(packages, res)),
CompletableFuture.runAsync(this.updateFilelist(packages, res))
);
try (InputStream input = new BufferedInputStream(Files.newInputStream(temp))) {
new XmlAlter.Stream(input, primary.out)
.pkgAttr(primary.type.tag(), String.valueOf(res.count()));
}
final ExecutorService service = Executors.newFixedThreadPool(3);
service.submit(Append.setPrimaryPckg(temp, res, primary));
service.submit(this.updateOther(packages, res));
service.submit(this.updateFilelist(packages, res));
service.shutdown();
service.awaitTermination(Long.MAX_VALUE, TimeUnit.HOURS);
} catch (final InterruptedException err) {
Thread.currentThread().interrupt();
Logger.error(this, err.getMessage());
} finally {
fut.join();
Files.delete(temp);
}
} catch (final IOException err) {
Expand Down Expand Up @@ -191,33 +218,19 @@ private Runnable updateOther(final Collection<Package.Meta> packages,
return () -> {
try {
final MetadataItem other = this.items.stream()
.filter(item -> item.type == XmlPackage.OTHER).findFirst().get();
.filter(item -> item.type == XmlPackage.OTHER)
.findFirst().orElseThrow(
() -> new ArtipieIOException(
String.format("Should have a file with type %s", XmlPackage.OTHER)

Check warning on line 224 in src/main/java/com/artipie/rpm/RpmMetadata.java

View check run for this annotation

Codecov / codecov/patch

src/main/java/com/artipie/rpm/RpmMetadata.java#L223-L224

Added lines #L223 - L224 were not covered by tests
)
);
new MergedXmlPackage(other.input, other.out, XmlPackage.OTHER, res)
.merge(packages, new XmlEvent.Other());
} catch (final IOException err) {
throw new ArtipieIOException(err);
}
};
}

/**
* Creates actions to update `packages` attribute of primary.xml.
* @param temp Merge result temp file
* @param res Xml primary update result
* @param primary Metadata
* @return Action
*/
private static Runnable setPrimaryPckg(final Path temp, final MergedXml.Result res,
final MetadataItem primary) {
return () -> {
try (InputStream input = new BufferedInputStream(Files.newInputStream(temp))) {
new XmlAlter.Stream(input, primary.out)
.pkgAttr(primary.type.tag(), String.valueOf(res.count()));
} catch (final IOException err) {
throw new ArtipieIOException(err);
}
};
}
}

/**
Expand Down
47 changes: 25 additions & 22 deletions src/main/java/com/artipie/rpm/meta/MergedXmlPackage.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,8 @@
*/
package com.artipie.rpm.meta;

import com.artipie.rpm.RpmMetadata;
import com.artipie.rpm.pkg.Package;
import com.fasterxml.aalto.stax.InputFactoryImpl;
import com.fasterxml.aalto.stax.OutputFactoryImpl;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
Expand All @@ -16,7 +15,6 @@
import java.util.Map;
import java.util.Optional;
import javax.xml.namespace.QName;
import javax.xml.stream.XMLEventFactory;
import javax.xml.stream.XMLEventReader;
import javax.xml.stream.XMLEventWriter;
import javax.xml.stream.XMLStreamException;
Expand All @@ -27,6 +25,7 @@
* provided checksums, adds items by provided file paths and updates `packages` attribute value.
* @since 1.5
* @checkstyle ClassDataAbstractionCouplingCheck (500 lines)
* @checkstyle NestedTryDepthCheck (500 lines)
*/
public final class MergedXmlPackage implements MergedXml {

Expand Down Expand Up @@ -83,29 +82,30 @@ public MergedXmlPackage(final InputStream input, final OutputStream out,
public MergedXml.Result merge(final Collection<Package.Meta> packages,
final XmlEvent event) throws IOException {
try {
Optional<XMLEventReader> reader = Optional.empty();
if (this.input.isPresent()) {
reader = Optional.of(new InputFactoryImpl().createXMLEventReader(this.input.get()));
}
final XMLEventWriter writer = new OutputFactoryImpl().createXMLEventWriter(this.out);
final XMLEventWriter writer = RpmMetadata.OUTPUT_FACTORY.createXMLEventWriter(this.out);
try {
final XMLEventFactory events = XMLEventFactory.newFactory();
MergedXmlPackage.startDocument(writer, String.valueOf(this.res.count()), this.type);
if (reader.isPresent()) {
this.process(this.res.checksums(), reader.get(), writer);
if (this.input.isPresent()) {
final XMLEventReader reader = RpmMetadata.INPUT_FACTORY
.createXMLEventReader(this.input.get());
try {
this.process(this.res.checksums(), reader, writer);
} finally {
reader.close();
}
}
for (final Package.Meta item : packages) {
event.add(writer, item);
}
writer.add(events.createSpace("\n"));
writer.add(RpmMetadata.EVENTS_FACTORY.createSpace("\n"));
writer.add(
events.createEndElement(new QName(this.type.tag()), Collections.emptyIterator())
RpmMetadata.EVENTS_FACTORY.createEndElement(
new QName(this.type.tag()),
Collections.emptyIterator()
)
);
} finally {
writer.close();
if (reader.isPresent()) {
reader.get().close();
}
}
} catch (final XMLStreamException err) {
throw new IOException(err);
Expand All @@ -122,14 +122,17 @@ public MergedXml.Result merge(final Collection<Package.Meta> packages,
*/
static void startDocument(final XMLEventWriter writer, final String cnt, final XmlPackage type)
throws XMLStreamException {
final XMLEventFactory events = XMLEventFactory.newFactory();
writer.add(events.createStartDocument(StandardCharsets.UTF_8.displayName(), "1.0"));
writer.add(events.createStartElement("", "", type.tag()));
writer.add(
RpmMetadata.EVENTS_FACTORY.createStartDocument(
StandardCharsets.UTF_8.displayName(), "1.0"
)
);
writer.add(RpmMetadata.EVENTS_FACTORY.createStartElement("", "", type.tag()));
for (final Map.Entry<String, String> item : type.xmlNamespaces().entrySet()) {
writer.add(events.createNamespace(item.getKey(), item.getValue()));
writer.add(RpmMetadata.EVENTS_FACTORY.createNamespace(item.getKey(), item.getValue()));
}
writer.add(events.createAttribute("packages", cnt));
writer.add(events.createSpace("\n"));
writer.add(RpmMetadata.EVENTS_FACTORY.createAttribute("packages", cnt));
writer.add(RpmMetadata.EVENTS_FACTORY.createSpace("\n"));
}

/**
Expand Down
35 changes: 17 additions & 18 deletions src/main/java/com/artipie/rpm/meta/MergedXmlPrimary.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,8 @@
*/
package com.artipie.rpm.meta;

import com.artipie.rpm.RpmMetadata;
import com.artipie.rpm.pkg.Package;
import com.fasterxml.aalto.stax.InputFactoryImpl;
import com.fasterxml.aalto.stax.OutputFactoryImpl;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
Expand All @@ -19,7 +18,6 @@
import java.util.concurrent.atomic.AtomicLong;
import java.util.stream.Collectors;
import javax.xml.namespace.QName;
import javax.xml.stream.XMLEventFactory;
import javax.xml.stream.XMLEventReader;
import javax.xml.stream.XMLEventWriter;
import javax.xml.stream.XMLStreamException;
Expand All @@ -30,6 +28,8 @@
* excluding duplicated packages by `location` tag.
* @since 1.5
* @checkstyle ClassDataAbstractionCouplingCheck (500 lines)
* @checkstyle ConditionalRegexpMultilineCheck (500 lines)
* @checkstyle NestedTryDepthCheck (500 lines)
*/
public final class MergedXmlPrimary implements MergedXml {

Expand Down Expand Up @@ -69,35 +69,34 @@ public Result merge(final Collection<Package.Meta> packages, final XmlEvent even
final AtomicLong res = new AtomicLong();
Collection<String> checksums = Collections.emptyList();
try {
Optional<XMLEventReader> reader = Optional.empty();
if (this.input.isPresent()) {
reader = Optional.of(new InputFactoryImpl().createXMLEventReader(this.input.get()));
}
final XMLEventWriter writer = new OutputFactoryImpl().createXMLEventWriter(this.out);
final XMLEventWriter writer = RpmMetadata.OUTPUT_FACTORY.createXMLEventWriter(this.out);
try {
final XMLEventFactory events = XMLEventFactory.newFactory();
MergedXmlPackage.startDocument(writer, "-1", XmlPackage.PRIMARY);
if (reader.isPresent()) {
checksums = MergedXmlPrimary.processPackages(
packages.stream().map(Package.Meta::href).collect(Collectors.toSet()),
reader.get(), writer, res
if (this.input.isPresent()) {
final XMLEventReader reader = RpmMetadata.INPUT_FACTORY.createXMLEventReader(
this.input.get()
);
try {
checksums = MergedXmlPrimary.processPackages(
packages.stream().map(Package.Meta::href).collect(Collectors.toSet()),
reader, writer, res
);
} finally {
reader.close();
}
}
for (final Package.Meta item : packages) {
event.add(writer, item);
res.incrementAndGet();
}
writer.add(events.createSpace("\n"));
writer.add(RpmMetadata.EVENTS_FACTORY.createSpace("\n"));
writer.add(
events.createEndElement(
RpmMetadata.EVENTS_FACTORY.createEndElement(
new QName(XmlPackage.PRIMARY.tag()), Collections.emptyIterator()
)
);
} finally {
writer.close();
if (reader.isPresent()) {
reader.get().close();
}
}
} catch (final XMLStreamException err) {
throw new IOException(err);
Expand Down
Loading

0 comments on commit 73b6e49

Please sign in to comment.