improved data architecture

This commit is contained in:
2024-02-09 22:43:31 +08:00
parent f77a5c3e0d
commit e3d99fa178
34 changed files with 1188 additions and 267 deletions

View File

@@ -9,6 +9,8 @@ open module net.woggioni.jpacrepo {
requires static jakarta.cdi;
requires static jakarta.ws.rs;
requires liquibase.core;
requires liquibase.jakarta.cdi;
requires net.woggioni.jwo;
requires net.woggioni.jpacrepo.impl;
requires org.slf4j;

View File

@@ -0,0 +1,49 @@
package net.woggioni.jpacrepo.factory;
import jakarta.annotation.Resource;
import jakarta.enterprise.context.ApplicationScoped;
import jakarta.enterprise.inject.Produces;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
import liquibase.integration.jakarta.cdi.CDILiquibaseConfig;
import liquibase.integration.jakarta.cdi.annotations.LiquibaseType;
import liquibase.resource.ClassLoaderResourceAccessor;
import liquibase.resource.ResourceAccessor;
import lombok.SneakyThrows;
@ApplicationScoped
public class LiquibaseFactory {
@Resource
private DataSource myDataSource;
@Produces
@LiquibaseType
public CDILiquibaseConfig createConfig() {
CDILiquibaseConfig config = new CDILiquibaseConfig();
config.setChangeLog("/META-INF/liquibase/jpacrepo.xml");
config.setDefaultSchema("jpacrepo");
config.setShouldRun(true);
return config;
}
@Produces
@LiquibaseType
@SneakyThrows
public DataSource createDataSource() {
Connection conn = myDataSource.getConnection();
Statement stmt = conn.createStatement();
stmt.execute("CREATE SCHEMA IF NOT EXISTS \"jpacrepo\";");
return myDataSource;
}
@Produces
@LiquibaseType
public ResourceAccessor create() {
return new ClassLoaderResourceAccessor(getClass().getClassLoader());
}
}

View File

@@ -1,22 +1,39 @@
package net.woggioni.jpacrepo.factory;
import jakarta.enterprise.context.ApplicationScoped;
import jakarta.enterprise.context.RequestScoped;
import jakarta.enterprise.inject.Default;
import jakarta.enterprise.inject.Disposes;
import jakarta.enterprise.inject.Produces;
import jakarta.persistence.EntityManager;
import jakarta.persistence.EntityManagerFactory;
import jakarta.persistence.Persistence;
import net.woggioni.jpacrepo.config.AppConfig;
import java.util.Properties;
@ApplicationScoped
//@ApplicationScoped
public class PersistenceUnitFactory {
@Produces
private EntityManagerFactory createEntityManagerFactory(AppConfig appConfig) {
Properties properties = new Properties();
properties.put("jakarta.persistence.schema-generation.database.action",
appConfig.getInitialSchemaAction().getValue());
properties.put("jakarta.persistence.jtaDataSource", appConfig.getDataSourceJndi());
return Persistence.createEntityManagerFactory("jpacrepo_pu", properties);
}
//
// @Produces
// private EntityManagerFactory createEntityManagerFactory(AppConfig appConfig) {
// Properties properties = new Properties();
// properties.put("jakarta.persistence.schema-generation.database.action",
// appConfig.getInitialSchemaAction().getValue());
// properties.put("jakarta.persistence.jtaDataSource", appConfig.getDataSourceJndi());
// return Persistence.createEntityManagerFactory("jpacrepo_pu", properties);
// }
//
// @Produces
// @Default
// @RequestScoped
// public EntityManager create(EntityManagerFactory emf) {
// return emf.createEntityManager();
// }
//
// public void dispose(@Disposes @Default EntityManager entityManager) {
// if (entityManager.isOpen()) {
// entityManager.close();
// }
// }
}

View File

@@ -11,7 +11,7 @@ import jakarta.ejb.Lock;
import jakarta.ejb.LockType;
import jakarta.ejb.Remote;
import jakarta.ejb.Schedule;
import jakarta.ejb.Stateless;
import jakarta.ejb.Singleton;
import jakarta.ejb.TransactionAttribute;
import jakarta.ejb.TransactionAttributeType;
import jakarta.ejb.TransactionManagement;
@@ -30,12 +30,13 @@ import net.woggioni.jpacrepo.api.wire.PkgTuple;
import net.woggioni.jpacrepo.cache.PackageCache;
import net.woggioni.jpacrepo.config.AppConfig;
import net.woggioni.jpacrepo.impl.model.CompressionFormatImpl;
import net.woggioni.jpacrepo.impl.model.PkgDataImpl;
import net.woggioni.jpacrepo.impl.model.PkgDataParser;
import net.woggioni.jpacrepo.persistence.QueryEngine;
import net.woggioni.jpacrepo.service.jpa.Queries;
import net.woggioni.jpacrepo.version.PkgIdComparator;
import net.woggioni.jwo.CollectionUtils;
import net.woggioni.jwo.Con;
import net.woggioni.jwo.Hash;
import net.woggioni.jwo.JWO;
import net.woggioni.jwo.Sup;
import net.woggioni.jwo.Tuple2;
@@ -63,7 +64,9 @@ import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
import java.util.stream.Stream;
@Stateless
import static java.util.function.Predicate.not;
@Singleton
@Lock(LockType.READ)
@TransactionManagement(TransactionManagementType.CONTAINER)
@ConcurrencyManagement(ConcurrencyManagementType.CONTAINER)
@@ -71,7 +74,7 @@ import java.util.stream.Stream;
@Remote({PacmanServiceRemote.class})
public class PacmanServiceEJB implements PacmanServiceLocal {
@PersistenceContext
@PersistenceContext(name = "jpacrepo_pu")
private EntityManager em;
@Inject
@@ -123,9 +126,10 @@ public class PacmanServiceEJB implements PacmanServiceLocal {
});
long[] count = new long[]{0};
long totalPackages = fileListStreamSupplier.get().count();
var parser = new PkgDataParser(em);
Con<Boolean> persistPackages = (Boolean drain) -> {
while ((drain && inProgress.size() > 0) || inProgress.size() > maxInProgress) {
while ((drain && !inProgress.isEmpty()) || inProgress.size() > maxInProgress) {
Optional.ofNullable(completionService.poll(1, TimeUnit.SECONDS))
.ifPresent((Con<Future<PkgData>>) future -> {
inProgress.remove(future);
@@ -135,7 +139,7 @@ public class PacmanServiceEJB implements PacmanServiceLocal {
} catch (ExecutionException ee) {
throw ee.getCause();
}
persistPackage(em, pkgData, ++count[0], totalPackages);
persistPackage(em, parser, pkgData, ++count[0], totalPackages);
});
}
};
@@ -146,7 +150,11 @@ public class PacmanServiceEJB implements PacmanServiceLocal {
}).get()) {
inProgress.add(completionService.submit(() -> {
try {
return PkgDataImpl.parseFile(file, CompressionFormatImpl.guess(file));
var pkgData = PkgDataParser.parseFile(file, CompressionFormatImpl.guess(file));
if(logger.isDebugEnabled()) {
logger.debug("Parsed package file {}", file);
}
return pkgData;
} catch (Exception ex) {
logger.error(String.format("Error parsing '%s'", file.toAbsolutePath()), ex);
throw ex;
@@ -162,12 +170,12 @@ public class PacmanServiceEJB implements PacmanServiceLocal {
packageCache.invalidateCache();
}
private void persistPackage(EntityManager em, PkgData pkgData, long count, long totalPackages) {
private void persistPackage(EntityManager em, PkgDataParser parser, PkgData pkgData, long count, long totalPackages) {
if (Queries.countPackagesByHash(em, pkgData.getMd5sum()).getSingleResult() == 0) {
Queries.getPackageByFileName(em, pkgData.getFileName())
.getResultList()
.forEach(p -> deletePkgData(em, p));
em.persist(pkgData);
em.persist(parser.hydrateJPA(pkgData));
logger.info("({}/{}) Persisting package {}", count, totalPackages, pkgData.getFileName());
}
}
@@ -231,7 +239,7 @@ public class PacmanServiceEJB implements PacmanServiceLocal {
@Override
public List<PkgData> searchByHash(@Nonnull String hash) {
return Queries.searchPackagesByHash(em, hash).getResultList();
return Queries.searchPackagesByHash(em, Hash.hexToBytes(hash)).getResultList();
}
@Override
@@ -241,7 +249,9 @@ public class PacmanServiceEJB implements PacmanServiceLocal {
@Override
public List<String> listHashes() {
return Queries.listHashes(em).getResultList();
return Queries.listHashes(em)
.getResultStream().map(JWO::bytesToHex)
.toList();
}
@Override
@@ -278,8 +288,7 @@ public class PacmanServiceEJB implements PacmanServiceLocal {
PkgId pkgId = tuple.get(0, PkgId.class);
String filename = tuple.get(1, String.class);
long size = tuple.get(2, Long.class);
String md5sum = tuple.get(3, String.class);
;
String md5sum = JWO.bytesToHex(tuple.get(3, byte[].class));
PkgTuple pkgTuple = new PkgTuple();
pkgTuple.setFileName(filename);
pkgTuple.setSize(size);
@@ -296,22 +305,26 @@ public class PacmanServiceEJB implements PacmanServiceLocal {
@Nullable
@Override
public PkgData getPackage(PkgId pkgId) {
return em.find(PkgData.class, pkgId);
public Optional<PkgData> getPackage(PkgId pkgId) {
var query = Queries.getPackageById(em, pkgId);
query.setMaxResults(1);
return Optional.of(query.getResultList())
.filter(not(List::isEmpty))
.map(l -> l.get(0));
}
@SneakyThrows
public boolean addPackage(String fileName, InputStream input) {
java.nio.file.Path file = Files.createTempFile(ctx.getRepoFolder(), fileName, null);
List<PkgData> savedFiles = searchByFileName(fileName);
if (savedFiles.size() > 0) return false;
if (!savedFiles.isEmpty()) return false;
else {
try (OutputStream output = Files.newOutputStream(file)) {
JWO.copy(input, output, 0x10000);
PkgData pkg = PkgDataImpl.parseFile(file,
PkgData pkg = PkgDataParser.parseFile(file,
CompressionFormatImpl.guess(Paths.get(fileName)));
pkg.setFileName(fileName);
Optional.ofNullable(em.find(PkgData.class, pkg.getId())).ifPresent((Con<PkgData>) (pkgData -> {
getPackage(pkg.getPkgId()).ifPresent((Con<PkgData>) (pkgData -> {
em.remove(pkgData);
Files.delete(ctx.getRepoFolder().resolve(pkgData.getFileName()));
}));

View File

@@ -39,6 +39,7 @@ import net.woggioni.jpacrepo.api.model.PkgId;
import net.woggioni.jpacrepo.api.security.Roles;
import net.woggioni.jpacrepo.api.service.PacmanServiceLocal;
import net.woggioni.jpacrepo.api.wire.PkgDataList;
import net.woggioni.jpacrepo.api.wire.PkgIdList;
import net.woggioni.jpacrepo.api.wire.PkgTuple;
import net.woggioni.jpacrepo.api.wire.StringList;
import net.woggioni.jpacrepo.config.AppConfig;
@@ -121,7 +122,9 @@ public class PacmanWebService {
@QueryParam("arch") String arch,
@QueryParam("compressionFormat") CompressionFormat compressionFormat
) {
return Response.ok(service.searchPkgId(name, version, arch, compressionFormat)).build();
return Response.ok(
new PkgIdList(service.searchPkgId(name, version, arch, compressionFormat))
).build();
}
@GET

View File

@@ -1,5 +1,6 @@
package net.woggioni.jpacrepo.service.jpa;
import jakarta.persistence.EntityGraph;
import jakarta.persistence.EntityManager;
import jakarta.persistence.Tuple;
import jakarta.persistence.TypedQuery;
@@ -26,6 +27,7 @@ import java.util.Optional;
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public class Queries {
private static final String ENTITY_GRAPH_PROPERTY = "jakarta.persistence.fetchgraph";
private interface PredicateSupplier<T> {
Predicate get(CriteriaBuilder cb, Root<T> root);
}
@@ -47,7 +49,9 @@ public class Queries {
Root<PkgData> root = criteriaQuery.from(entity);
Predicate predicate = cb.equal(root.get(PkgData_.fileName), fileName);
criteriaQuery.select(root).where(predicate);
return em.createQuery(criteriaQuery);
var query = em.createQuery(criteriaQuery);
query.setHint(ENTITY_GRAPH_PROPERTY, getPkgDataEntityGraph(em));
return query;
}
public static TypedQuery<Instant> getUpdateTimestampByFileName(EntityManager em, String fileName) {
@@ -72,7 +76,7 @@ public class Queries {
Root<PkgData> pkgDataRoot = criteriaQuery.from(entity);
Subquery<String> subQuery = criteriaQuery.subquery(String.class);
Root<PkgData> pkgDataRootSub = subQuery.from(entity);
Path<PkgId> pkgIdPathSub = pkgDataRootSub.get(PkgData_.id);
Path<PkgId> pkgIdPathSub = pkgDataRootSub.get(PkgData_.pkgId);
Predicate havingPredicate = cb.greaterThan(cb.count(
pkgIdPathSub.get(PkgId_.version)), minNumberOfDifferentVersions);
subQuery.select(pkgIdPathSub.get(PkgId_.name))
@@ -82,7 +86,7 @@ public class Queries {
).having(havingPredicate);
Predicate predicate = cb.and(
cb.lessThan(pkgDataRoot.get(PkgData_.buildDate), cutoff),
pkgDataRoot.get(PkgData_.id).get(PkgId_.name).in(subQuery.getSelection())
pkgDataRoot.get(PkgData_.pkgId).get(PkgId_.name).in(subQuery.getSelection())
);
criteriaQuery.select(pkgDataRoot.get(PkgData_.fileName))
.where(predicate)
@@ -90,7 +94,7 @@ public class Queries {
return em.createQuery(criteriaQuery);
}
public static TypedQuery<Long> countPackagesByHash(EntityManager em, String hash) {
public static TypedQuery<Long> countPackagesByHash(EntityManager em, byte[] hash) {
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Long> criteriaQuery = cb.createQuery(Long.class);
Metamodel metamodel = em.getMetamodel();
@@ -109,10 +113,12 @@ public class Queries {
EntityType<PkgData> entity = metamodel.entity(PkgData.class);
Root<PkgData> pkgDataRoot = criteriaQuery.from(entity);
criteriaQuery.select(pkgDataRoot).where(predicateSupplier.get(cb, pkgDataRoot));
return em.createQuery(criteriaQuery);
var query = em.createQuery(criteriaQuery);
query.setHint(ENTITY_GRAPH_PROPERTY, getPkgDataEntityGraph(em));
return query;
}
public static TypedQuery<PkgData> searchPackagesByHash(EntityManager em, String hash) {
public static TypedQuery<PkgData> searchPackagesByHash(EntityManager em, byte[] hash) {
return searchPackagesByPredicate(em, (cb, root) -> cb.equal(root.get(PkgData_.md5sum), hash));
}
@@ -131,13 +137,28 @@ public class Queries {
return em.createQuery(criteriaQuery);
}
public static TypedQuery<PkgData> getPackageById(EntityManager em, PkgId pkgId) {
var cb = em.getCriteriaBuilder();
var cq = cb.createQuery(PkgData.class);
var root = cq.from(PkgData_.class_);
cq.select(root).where(
cb.equal(
root.get(PkgData_.pkgId),
pkgId
)
);
var query = em.createQuery(cq);
query.setHint(ENTITY_GRAPH_PROPERTY, getPkgDataEntityGraph(em));
return query;
}
public static TypedQuery<String> searchPackageName(EntityManager em, String needle) {
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<String> criteriaQuery = cb.createQuery(String.class);
Metamodel metamodel = em.getMetamodel();
EntityType<PkgData> entity = metamodel.entity(PkgData.class);
Root<PkgData> root = criteriaQuery.from(entity);
Path<PkgId> pkgIdPath = root.get(PkgData_.id);
Path<PkgId> pkgIdPath = root.get(PkgData_.pkgId);
Predicate predicate = cb.like(
cb.lower(pkgIdPath.get(PkgId_.name)),
"%%" + needle + "%%"
@@ -159,9 +180,9 @@ public class Queries {
return em.createQuery(criteriaQuery);
}
public static TypedQuery<String> listHashes(EntityManager em) {
public static TypedQuery<byte[]> listHashes(EntityManager em) {
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<String> criteriaQuery = cb.createQuery(String.class);
CriteriaQuery<byte[]> criteriaQuery = cb.createQuery(byte[].class);
Metamodel metamodel = em.getMetamodel();
EntityType<PkgData> entity = metamodel.entity(PkgData.class);
Root<PkgData> root = criteriaQuery.from(entity);
@@ -180,7 +201,7 @@ public class Queries {
Metamodel metamodel = em.getMetamodel();
EntityType<PkgData> entity = metamodel.entity(PkgData.class);
Root<PkgData> root = criteriaQuery.from(entity);
Path<PkgId> pkgIdRoot = root.get(PkgData_.id);
Path<PkgId> pkgIdRoot = root.get(PkgData_.pkgId);
Predicate[] predicates = JWO.streamCat(
Optional.ofNullable(name)
.map(it -> cb.equal(pkgIdRoot.get(PkgId_.name), it)).stream(),
@@ -219,7 +240,7 @@ public class Queries {
Metamodel metamodel = em.getMetamodel();
EntityType<PkgData> entity = metamodel.entity(PkgData.class);
Root<PkgData> root = criteriaQuery.from(entity);
Path<PkgId> idPath = root.get(PkgData_.id);
Path<PkgId> idPath = root.get(PkgData_.pkgId);
criteriaQuery.multiselect(
idPath,
root.get(PkgData_.fileName),
@@ -244,7 +265,7 @@ public class Queries {
CriteriaBuilder builder = em.getCriteriaBuilder();
criteriaQuery = builder.createQuery(PkgData.class);
Root<PkgData> entity = criteriaQuery.from(PkgData.class);
Path<PkgId> pkgIdPath = entity.get(PkgData_.id);
Path<PkgId> pkgIdPath = entity.get(PkgData_.pkgId);
Predicate predicate = builder.and(JWO.streamCat(
JWO.optional2Stream(
Optional.ofNullable(name)
@@ -275,7 +296,25 @@ public class Queries {
builder.asc(pkgIdPath.get(PkgId_.compressionFormat)),
builder.asc(entity.get(PkgData_.fileName))
);
return em.createQuery(criteriaQuery);
var query = em.createQuery(criteriaQuery);
query.setHint(ENTITY_GRAPH_PROPERTY, getPkgDataEntityGraph(em));
return query;
}
private static EntityGraph<PkgData> getPkgDataEntityGraph(EntityManager em) {
var graph = em.createEntityGraph(PkgData.class);
graph.addAttributeNodes(PkgData_.base);
graph.addAttributeNodes(PkgData_.packager);
graph.addAttributeNodes(PkgData_.license);
graph.addSubgraph(PkgData_.depend);
graph.addSubgraph(PkgData_.backup);
graph.addSubgraph(PkgData_.conflict);
graph.addSubgraph(PkgData_.replaces);
graph.addSubgraph(PkgData_.makedepend);
graph.addSubgraph(PkgData_.makepkgopt);
graph.addSubgraph(PkgData_.optdepend);
graph.addSubgraph(PkgData_.provides);
return graph;
}
}

View File

@@ -0,0 +1,243 @@
<?xml version="1.1" encoding="UTF-8" standalone="no"?>
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext" xmlns:pro="http://www.liquibase.org/xml/ns/pro" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd http://www.liquibase.org/xml/ns/pro http://www.liquibase.org/xml/ns/pro/liquibase-pro-latest.xsd http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-latest.xsd">
<changeSet author="Walter Oggioni &lt;oggioni.walter@gmail.com&gt;" id="1707439864675-1">
<createTable tableName="pkgdata">
<column name="compressionformat" type="SMALLINT"/>
<column name="base_id" type="BIGINT"/>
<column name="builddate" type="TIMESTAMP WITH TIME ZONE"/>
<column name="id" type="BIGINT">
<constraints nullable="false" primaryKey="true" primaryKeyName="pkgdata_pkey"/>
</column>
<column name="packager_id" type="BIGINT"/>
<column name="size" type="BIGINT">
<constraints nullable="false"/>
</column>
<column name="updtimestamp" type="TIMESTAMP WITH TIME ZONE"/>
<column name="arch" type="VARCHAR(16)"/>
<column name="md5sum" type="BYTEA"/>
<column name="version" type="VARCHAR(64)"/>
<column name="name" type="VARCHAR(64)"/>
<column name="description" type="VARCHAR(1024)"/>
<column name="filename" type="VARCHAR(1024)"/>
<column name="url" type="VARCHAR(1024)"/>
</createTable>
</changeSet>
<changeSet author="Walter Oggioni &lt;oggioni.walter@gmail.com&gt;" id="1707439864675-2">
<createTable tableName="dependency">
<column name="id" type="BIGINT">
<constraints nullable="false" primaryKey="true" primaryKeyName="dependency_pkey"/>
</column>
<column name="name" type="VARCHAR(1024)"/>
</createTable>
</changeSet>
<changeSet author="Walter Oggioni &lt;oggioni.walter@gmail.com&gt;" id="1707439864675-3">
<createTable tableName="license">
<column name="id" type="BIGINT">
<constraints nullable="false" primaryKey="true" primaryKeyName="license_pkey"/>
</column>
<column name="name" type="VARCHAR(1024)"/>
</createTable>
</changeSet>
<changeSet author="Walter Oggioni &lt;oggioni.walter@gmail.com&gt;" id="1707439864675-4">
<createTable tableName="packager">
<column name="id" type="BIGINT">
<constraints nullable="false" primaryKey="true" primaryKeyName="packager_pkey"/>
</column>
<column name="name" type="VARCHAR(1024)"/>
</createTable>
</changeSet>
<changeSet author="Walter Oggioni &lt;oggioni.walter@gmail.com&gt;" id="1707439864675-5">
<createTable tableName="pkgbase">
<column name="id" type="BIGINT">
<constraints nullable="false" primaryKey="true" primaryKeyName="pkgbase_pkey"/>
</column>
<column name="name" type="VARCHAR(1024)"/>
</createTable>
</changeSet>
<changeSet author="Walter Oggioni &lt;oggioni.walter@gmail.com&gt;" id="1707439864675-6">
<addUniqueConstraint columnNames="filename" constraintName="pkgdata_filename_key" tableName="pkgdata"/>
</changeSet>
<changeSet author="Walter Oggioni &lt;oggioni.walter@gmail.com&gt;" id="1707439864675-7">
<addUniqueConstraint columnNames="md5sum" constraintName="pkgdata_md5sum_key" tableName="pkgdata"/>
</changeSet>
<changeSet author="Walter Oggioni &lt;oggioni.walter@gmail.com&gt;" id="1707439864675-8">
<addUniqueConstraint columnNames="name, version, arch, compressionformat" constraintName="pkgdata_name_version_arch_compressionformat_key" tableName="pkgdata"/>
</changeSet>
<changeSet author="Walter Oggioni &lt;oggioni.walter@gmail.com&gt;" id="1707439864675-9">
<addUniqueConstraint columnNames="name" constraintName="dependency_name_key" tableName="dependency"/>
</changeSet>
<changeSet author="Walter Oggioni &lt;oggioni.walter@gmail.com&gt;" id="1707439864675-10">
<addUniqueConstraint columnNames="name" constraintName="license_name_key" tableName="license"/>
</changeSet>
<changeSet author="Walter Oggioni &lt;oggioni.walter@gmail.com&gt;" id="1707439864675-11">
<addUniqueConstraint columnNames="name" constraintName="packager_name_key" tableName="packager"/>
</changeSet>
<changeSet author="Walter Oggioni &lt;oggioni.walter@gmail.com&gt;" id="1707439864675-12">
<addUniqueConstraint columnNames="name" constraintName="pkgbase_name_key" tableName="pkgbase"/>
</changeSet>
<changeSet author="Walter Oggioni &lt;oggioni.walter@gmail.com&gt;" id="1707439864675-13">
<createSequence cacheSize="1" cycle="false" dataType="bigint" incrementBy="50" maxValue="9223372036854775807" minValue="1" sequenceName="dependency_seq" startValue="1"/>
</changeSet>
<changeSet author="Walter Oggioni &lt;oggioni.walter@gmail.com&gt;" id="1707439864675-14">
<createSequence cacheSize="1" cycle="false" dataType="bigint" incrementBy="50" maxValue="9223372036854775807" minValue="1" sequenceName="license_seq" startValue="1"/>
</changeSet>
<changeSet author="Walter Oggioni &lt;oggioni.walter@gmail.com&gt;" id="1707439864675-15">
<createSequence cacheSize="1" cycle="false" dataType="bigint" incrementBy="50" maxValue="9223372036854775807" minValue="1" sequenceName="packager_seq" startValue="1"/>
</changeSet>
<changeSet author="Walter Oggioni &lt;oggioni.walter@gmail.com&gt;" id="1707439864675-16">
<createSequence cacheSize="1" cycle="false" dataType="bigint" incrementBy="50" maxValue="9223372036854775807" minValue="1" sequenceName="pkgbase_seq" startValue="1"/>
</changeSet>
<changeSet author="Walter Oggioni &lt;oggioni.walter@gmail.com&gt;" id="1707439864675-17">
<createSequence cacheSize="1" cycle="false" dataType="bigint" incrementBy="50" maxValue="9223372036854775807" minValue="1" sequenceName="pkgdata_seq" startValue="1"/>
</changeSet>
<changeSet author="Walter Oggioni &lt;oggioni.walter@gmail.com&gt;" id="1707439864675-18">
<createTable tableName="pkgdata_backup">
<column name="pkgdata_id" type="BIGINT">
<constraints nullable="false" primaryKey="true" primaryKeyName="pkgdata_backup_pkey"/>
</column>
<column name="backup_id" type="BIGINT">
<constraints nullable="false" primaryKey="true" primaryKeyName="pkgdata_backup_pkey"/>
</column>
</createTable>
</changeSet>
<changeSet author="Walter Oggioni &lt;oggioni.walter@gmail.com&gt;" id="1707439864675-19">
<createTable tableName="pkgdata_conflict">
<column name="pkgdata_id" type="BIGINT">
<constraints nullable="false" primaryKey="true" primaryKeyName="pkgdata_conflict_pkey"/>
</column>
<column name="conflict_id" type="BIGINT">
<constraints nullable="false" primaryKey="true" primaryKeyName="pkgdata_conflict_pkey"/>
</column>
</createTable>
</changeSet>
<changeSet author="Walter Oggioni &lt;oggioni.walter@gmail.com&gt;" id="1707439864675-20">
<createTable tableName="pkgdata_depend">
<column name="pkgdata_id" type="BIGINT">
<constraints nullable="false" primaryKey="true" primaryKeyName="pkgdata_depend_pkey"/>
</column>
<column name="depend_id" type="BIGINT">
<constraints nullable="false" primaryKey="true" primaryKeyName="pkgdata_depend_pkey"/>
</column>
</createTable>
</changeSet>
<changeSet author="Walter Oggioni &lt;oggioni.walter@gmail.com&gt;" id="1707439864675-21">
<createTable tableName="pkgdata_license">
<column name="pkgdata_id" type="BIGINT">
<constraints nullable="false" primaryKey="true" primaryKeyName="pkgdata_license_pkey"/>
</column>
<column name="license_id" type="BIGINT">
<constraints nullable="false" primaryKey="true" primaryKeyName="pkgdata_license_pkey"/>
</column>
</createTable>
</changeSet>
<changeSet author="Walter Oggioni &lt;oggioni.walter@gmail.com&gt;" id="1707439864675-22">
<createTable tableName="pkgdata_makedepend">
<column name="pkgdata_id" type="BIGINT">
<constraints nullable="false" primaryKey="true" primaryKeyName="pkgdata_makedepend_pkey"/>
</column>
<column name="makedepend_id" type="BIGINT">
<constraints nullable="false" primaryKey="true" primaryKeyName="pkgdata_makedepend_pkey"/>
</column>
</createTable>
</changeSet>
<changeSet author="Walter Oggioni &lt;oggioni.walter@gmail.com&gt;" id="1707439864675-23">
<createTable tableName="pkgdata_makepkgopt">
<column name="pkgdata_id" type="BIGINT">
<constraints nullable="false" primaryKey="true" primaryKeyName="pkgdata_makepkgopt_pkey"/>
</column>
<column name="makepkgopt_id" type="BIGINT">
<constraints nullable="false" primaryKey="true" primaryKeyName="pkgdata_makepkgopt_pkey"/>
</column>
</createTable>
</changeSet>
<changeSet author="Walter Oggioni &lt;oggioni.walter@gmail.com&gt;" id="1707439864675-24">
<createTable tableName="pkgdata_optdepend">
<column name="pkgdata_id" type="BIGINT">
<constraints nullable="false" primaryKey="true" primaryKeyName="pkgdata_optdepend_pkey"/>
</column>
<column name="optdepend_id" type="BIGINT">
<constraints nullable="false" primaryKey="true" primaryKeyName="pkgdata_optdepend_pkey"/>
</column>
</createTable>
</changeSet>
<changeSet author="Walter Oggioni &lt;oggioni.walter@gmail.com&gt;" id="1707439864675-25">
<createTable tableName="pkgdata_provides">
<column name="pkgdata_id" type="BIGINT">
<constraints nullable="false" primaryKey="true" primaryKeyName="pkgdata_provides_pkey"/>
</column>
<column name="provides_id" type="BIGINT">
<constraints nullable="false" primaryKey="true" primaryKeyName="pkgdata_provides_pkey"/>
</column>
</createTable>
</changeSet>
<changeSet author="Walter Oggioni &lt;oggioni.walter@gmail.com&gt;" id="1707439864675-26">
<createTable tableName="pkgdata_replaces">
<column name="pkgdata_id" type="BIGINT">
<constraints nullable="false" primaryKey="true" primaryKeyName="pkgdata_replaces_pkey"/>
</column>
<column name="replaces_id" type="BIGINT">
<constraints nullable="false" primaryKey="true" primaryKeyName="pkgdata_replaces_pkey"/>
</column>
</createTable>
</changeSet>
<changeSet author="Walter Oggioni &lt;oggioni.walter@gmail.com&gt;" id="1707439864675-27">
<addForeignKeyConstraint baseColumnNames="conflict_id" baseTableName="pkgdata_conflict" constraintName="fk24nqbo323snpnlwweh6im6r9b" deferrable="false" initiallyDeferred="false" onDelete="NO ACTION" onUpdate="NO ACTION" referencedColumnNames="id" referencedTableName="dependency" validate="true"/>
</changeSet>
<changeSet author="Walter Oggioni &lt;oggioni.walter@gmail.com&gt;" id="1707439864675-28">
<addForeignKeyConstraint baseColumnNames="pkgdata_id" baseTableName="pkgdata_makedepend" constraintName="fk429xi3idno5yap1nlivrnpy06" deferrable="false" initiallyDeferred="false" onDelete="NO ACTION" onUpdate="NO ACTION" referencedColumnNames="id" referencedTableName="pkgdata" validate="true"/>
</changeSet>
<changeSet author="Walter Oggioni &lt;oggioni.walter@gmail.com&gt;" id="1707439864675-29">
<addForeignKeyConstraint baseColumnNames="optdepend_id" baseTableName="pkgdata_optdepend" constraintName="fk4ura4v2u5x16yp8ok6bfvxr4h" deferrable="false" initiallyDeferred="false" onDelete="NO ACTION" onUpdate="NO ACTION" referencedColumnNames="id" referencedTableName="dependency" validate="true"/>
</changeSet>
<changeSet author="Walter Oggioni &lt;oggioni.walter@gmail.com&gt;" id="1707439864675-30">
<addForeignKeyConstraint baseColumnNames="pkgdata_id" baseTableName="pkgdata_provides" constraintName="fk656rbinf6abvk4f982q21i68o" deferrable="false" initiallyDeferred="false" onDelete="NO ACTION" onUpdate="NO ACTION" referencedColumnNames="id" referencedTableName="pkgdata" validate="true"/>
</changeSet>
<changeSet author="Walter Oggioni &lt;oggioni.walter@gmail.com&gt;" id="1707439864675-31">
<addForeignKeyConstraint baseColumnNames="pkgdata_id" baseTableName="pkgdata_conflict" constraintName="fk6et6auii880vcyo8cod6gndsy" deferrable="false" initiallyDeferred="false" onDelete="NO ACTION" onUpdate="NO ACTION" referencedColumnNames="id" referencedTableName="pkgdata" validate="true"/>
</changeSet>
<changeSet author="Walter Oggioni &lt;oggioni.walter@gmail.com&gt;" id="1707439864675-32">
<addForeignKeyConstraint baseColumnNames="backup_id" baseTableName="pkgdata_backup" constraintName="fk6hvpvdhjlyi4qsoyiw4lksae5" deferrable="false" initiallyDeferred="false" onDelete="NO ACTION" onUpdate="NO ACTION" referencedColumnNames="id" referencedTableName="dependency" validate="true"/>
</changeSet>
<changeSet author="Walter Oggioni &lt;oggioni.walter@gmail.com&gt;" id="1707439864675-33">
<addForeignKeyConstraint baseColumnNames="depend_id" baseTableName="pkgdata_depend" constraintName="fkai19aek8k3vau0k15td18uc6h" deferrable="false" initiallyDeferred="false" onDelete="NO ACTION" onUpdate="NO ACTION" referencedColumnNames="id" referencedTableName="dependency" validate="true"/>
</changeSet>
<changeSet author="Walter Oggioni &lt;oggioni.walter@gmail.com&gt;" id="1707439864675-34">
<addForeignKeyConstraint baseColumnNames="pkgdata_id" baseTableName="pkgdata_depend" constraintName="fkci76y22x9o3ytakt6adnc6d8v" deferrable="false" initiallyDeferred="false" onDelete="NO ACTION" onUpdate="NO ACTION" referencedColumnNames="id" referencedTableName="pkgdata" validate="true"/>
</changeSet>
<changeSet author="Walter Oggioni &lt;oggioni.walter@gmail.com&gt;" id="1707439864675-35">
<addForeignKeyConstraint baseColumnNames="base_id" baseTableName="pkgdata" constraintName="fkdbglulawmrf5eanlxpic0370j" deferrable="false" initiallyDeferred="false" onDelete="NO ACTION" onUpdate="NO ACTION" referencedColumnNames="id" referencedTableName="pkgbase" validate="true"/>
</changeSet>
<changeSet author="Walter Oggioni &lt;oggioni.walter@gmail.com&gt;" id="1707439864675-36">
<addForeignKeyConstraint baseColumnNames="pkgdata_id" baseTableName="pkgdata_license" constraintName="fkfbcetjtq920birmewjayj99fd" deferrable="false" initiallyDeferred="false" onDelete="NO ACTION" onUpdate="NO ACTION" referencedColumnNames="id" referencedTableName="pkgdata" validate="true"/>
</changeSet>
<changeSet author="Walter Oggioni &lt;oggioni.walter@gmail.com&gt;" id="1707439864675-37">
<addForeignKeyConstraint baseColumnNames="provides_id" baseTableName="pkgdata_provides" constraintName="fkgcrqlwrv05rh1hcsi56xgkanm" deferrable="false" initiallyDeferred="false" onDelete="NO ACTION" onUpdate="NO ACTION" referencedColumnNames="id" referencedTableName="dependency" validate="true"/>
</changeSet>
<changeSet author="Walter Oggioni &lt;oggioni.walter@gmail.com&gt;" id="1707439864675-38">
<addForeignKeyConstraint baseColumnNames="pkgdata_id" baseTableName="pkgdata_backup" constraintName="fkgiq44wme1akcpdhm2eg3vfp0f" deferrable="false" initiallyDeferred="false" onDelete="NO ACTION" onUpdate="NO ACTION" referencedColumnNames="id" referencedTableName="pkgdata" validate="true"/>
</changeSet>
<changeSet author="Walter Oggioni &lt;oggioni.walter@gmail.com&gt;" id="1707439864675-39">
<addForeignKeyConstraint baseColumnNames="pkgdata_id" baseTableName="pkgdata_optdepend" constraintName="fkkdgyxf9lhh7q5cwytdi9hpdt5" deferrable="false" initiallyDeferred="false" onDelete="NO ACTION" onUpdate="NO ACTION" referencedColumnNames="id" referencedTableName="pkgdata" validate="true"/>
</changeSet>
<changeSet author="Walter Oggioni &lt;oggioni.walter@gmail.com&gt;" id="1707439864675-40">
<addForeignKeyConstraint baseColumnNames="license_id" baseTableName="pkgdata_license" constraintName="fkktcugf8cborm40b75wsupd3lf" deferrable="false" initiallyDeferred="false" onDelete="NO ACTION" onUpdate="NO ACTION" referencedColumnNames="id" referencedTableName="license" validate="true"/>
</changeSet>
<changeSet author="Walter Oggioni &lt;oggioni.walter@gmail.com&gt;" id="1707439864675-41">
<addForeignKeyConstraint baseColumnNames="packager_id" baseTableName="pkgdata" constraintName="fko3oqleprd36mpslc484783ud4" deferrable="false" initiallyDeferred="false" onDelete="NO ACTION" onUpdate="NO ACTION" referencedColumnNames="id" referencedTableName="packager" validate="true"/>
</changeSet>
<changeSet author="Walter Oggioni &lt;oggioni.walter@gmail.com&gt;" id="1707439864675-42">
<addForeignKeyConstraint baseColumnNames="replaces_id" baseTableName="pkgdata_replaces" constraintName="fko7yscxwbb0der580pxqgtkovs" deferrable="false" initiallyDeferred="false" onDelete="NO ACTION" onUpdate="NO ACTION" referencedColumnNames="id" referencedTableName="dependency" validate="true"/>
</changeSet>
<changeSet author="Walter Oggioni &lt;oggioni.walter@gmail.com&gt;" id="1707439864675-43">
<addForeignKeyConstraint baseColumnNames="pkgdata_id" baseTableName="pkgdata_replaces" constraintName="fkqf9a43r0tdhns382ak386bdnr" deferrable="false" initiallyDeferred="false" onDelete="NO ACTION" onUpdate="NO ACTION" referencedColumnNames="id" referencedTableName="pkgdata" validate="true"/>
</changeSet>
<changeSet author="Walter Oggioni &lt;oggioni.walter@gmail.com&gt;" id="1707439864675-44">
<addForeignKeyConstraint baseColumnNames="makepkgopt_id" baseTableName="pkgdata_makepkgopt" constraintName="fkr4wcod9vkiyhey261g6k8f4g6" deferrable="false" initiallyDeferred="false" onDelete="NO ACTION" onUpdate="NO ACTION" referencedColumnNames="id" referencedTableName="dependency" validate="true"/>
</changeSet>
<changeSet author="Walter Oggioni &lt;oggioni.walter@gmail.com&gt;" id="1707439864675-45">
<addForeignKeyConstraint baseColumnNames="pkgdata_id" baseTableName="pkgdata_makepkgopt" constraintName="fks6qck7ato6bnv3okee3461lx6" deferrable="false" initiallyDeferred="false" onDelete="NO ACTION" onUpdate="NO ACTION" referencedColumnNames="id" referencedTableName="pkgdata" validate="true"/>
</changeSet>
<changeSet author="Walter Oggioni &lt;oggioni.walter@gmail.com&gt;" id="1707439864675-46">
<addForeignKeyConstraint baseColumnNames="makedepend_id" baseTableName="pkgdata_makedepend" constraintName="fktkj1w12dtv5fqykgwvvnpwgo" deferrable="false" initiallyDeferred="false" onDelete="NO ACTION" onUpdate="NO ACTION" referencedColumnNames="id" referencedTableName="dependency" validate="true"/>
</changeSet>
</databaseChangeLog>

View File

@@ -5,12 +5,18 @@
version="2.1">
<persistence-unit name="jpacrepo_pu" transaction-type="JTA">
<class>net.woggioni.jpacrepo.api.model.PkgData</class>
<class>net.woggioni.jpacrepo.api.model.PkgId</class>
<class>net.woggioni.jpacrepo.api.model.PkgData</class>
<class>net.woggioni.jpacrepo.api.model.License</class>
<class>net.woggioni.jpacrepo.api.model.PkgBase</class>
<class>net.woggioni.jpacrepo.api.model.Dependency</class>
<class>net.woggioni.jpacrepo.api.model.Packager</class>
<exclude-unlisted-classes>true</exclude-unlisted-classes>
<properties>
<property name="org.jboss.logging.provider" value="log4j2"/>
<property name="jakarta.persistence.schema-generation.database.action"
value="none"/>
<property name="jakarta.persistence.schema-generation.create-source" value="script-then-metadata"/>
<property name="jakarta.persistence.schema-generation.create-script-source"
value="META-INF/sql/CreateSchema.sql"/>
@@ -18,7 +24,31 @@
<property name="jakarta.persistence.schema-generation.drop-script-source"
value="META-INF/sql/DropSchema.sql"/>
<property name="hibernate.default_schema" value="jpacrepo"/>
<property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect"/>
</properties>
</persistence-unit>
<!-- <persistence-unit name="squirrel_sql" transaction-type="RESOURCE_LOCAL">-->
<!-- <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>-->
<!-- <class>net.woggioni.jpacrepo.api.model.PkgData</class>-->
<!-- <class>net.woggioni.jpacrepo.api.model.PkgId</class>-->
<!-- <exclude-unlisted-classes>true</exclude-unlisted-classes>-->
<!-- <properties>-->
<!-- <property name="org.jboss.logging.provider" value="log4j2"/>-->
<!-- <property name="jakarta.persistence.schema-generation.create-source" value="script-then-metadata"/>-->
<!-- <property name="jakarta.persistence.schema-generation.create-script-source"-->
<!-- value="META-INF/sql/CreateSchema.sql"/>-->
<!-- <property name="jakarta.persistence.schema-generation.drop-source" value="metadata-then-script"/>-->
<!-- <property name="jakarta.persistence.schema-generation.drop-script-source"-->
<!-- value="META-INF/sql/DropSchema.sql"/>-->
<!-- <property name="hibernate.default_schema" value="jpacrepo"/>-->
<!-- <property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect"/>-->
<!-- <property name="javax.persistence.jdbc.driver" value="org.postgresql.Driver" />-->
<!-- <property name="javax.persistence.jdbc.url" value="jdbc:postgresql:wildfly?readOnly=true" />-->
<!-- <property name="javax.persistence.jdbc.user" value="wildfly" />-->
<!-- <property name="hibernate.jdbc.fetch_size" value="20"/>-->
<!-- <property name="hibernate.default_batch_fetch_size" value="20"/>-->
<!--&lt;!&ndash; <property name="javax.persistence.jdbc.password" value="databasePassword" />&ndash;&gt;-->
<!-- </properties>-->
<!-- </persistence-unit>-->
</persistence>

View File

@@ -12,7 +12,7 @@ import lombok.SneakyThrows;
import net.woggioni.jpacrepo.api.model.PkgData;
import net.woggioni.jpacrepo.api.service.PacmanServiceRemote;
import net.woggioni.jpacrepo.impl.model.CompressionFormatImpl;
import net.woggioni.jpacrepo.impl.model.PkgDataImpl;
import net.woggioni.jpacrepo.impl.model.PkgDataParser;
import net.woggioni.jwo.Con;
import net.woggioni.jwo.Hash;
import net.woggioni.jwo.JWO;
@@ -98,7 +98,7 @@ public class ClientTest {
try(InputStream is = Files.newInputStream(tmpFile)) {
hash = Hash.md5(is);
}
PkgData p = PkgDataImpl.parseFile(tmpFile, CompressionFormatImpl.guess(tmpFile));
PkgData p = PkgDataParser.parseFile(tmpFile, CompressionFormatImpl.guess(tmpFile));
Assertions.assertEquals(JWO.bytesToHex(hash.getBytes()), p.getMd5sum());
});
}
@@ -124,8 +124,8 @@ public class ClientTest {
prop.put(Context.URL_PKG_PREFIXES, "org.jboss.ejb.client.naming");
prop.put(Context.INITIAL_CONTEXT_FACTORY, "org.jboss.naming.remote.client.InitialContextFactory");
prop.put(Context.PROVIDER_URL, "http-remoting://localhost:7080");
// prop.put(Context.PROVIDER_URL, "http-remoting://localhost:8080");
// prop.put(Context.PROVIDER_URL, "http-remoting://localhost:1234");
prop.put(Context.PROVIDER_URL, "http-remoting://localhost:8080");
// prop.put(Context.PROVIDER_URL, "remote://odroid-u3:4447");
prop.put(Context.SECURITY_PRINCIPAL, "walter");
prop.put(Context.SECURITY_CREDENTIALS, "27ff5990757d1d");
@@ -138,7 +138,7 @@ public class ClientTest {
traverseJndiNode("/", context);
// final PacmanService stateService = (PacmanService) ctx.lookup("/jpacrepo-1.0/remote/PacmanServiceEJB!service.PacmanService");
final PacmanServiceRemote service = (PacmanServiceRemote) ctx.lookup(
"/jpacrepo-2023.07/PacmanServiceEJB!net.woggioni.jpacrepo.api.service.PacmanServiceRemote"
"/jpacrepo/PacmanServiceEJB!net.woggioni.jpacrepo.api.service.PacmanServiceRemote"
);
// List<PkgData> pkgs = service.searchPackage("google-earth", null, null, 1, 10);
// System.out.println(new XStream().toXML(pkgs));

View File

@@ -4,7 +4,7 @@ import com.fasterxml.jackson.module.jakarta.xmlbind.JakartaXmlBindAnnotationModu
import lombok.SneakyThrows;
import net.woggioni.jpacrepo.api.model.PkgData;
import net.woggioni.jpacrepo.impl.model.CompressionFormatImpl;
import net.woggioni.jpacrepo.impl.model.PkgDataImpl;
import net.woggioni.jpacrepo.impl.model.PkgDataParser;
import org.junit.jupiter.api.Test;
import java.lang.reflect.ParameterizedType;
@@ -31,7 +31,7 @@ public class ParseTest {
Files.list(Paths.get("/var/cache/pacman/pkg"))
.filter(Files::isRegularFile)
.filter(p -> pattern.matcher(p.getFileName().toString()).matches())
.map(path -> PkgDataImpl.parseFile(path, CompressionFormatImpl.guess(path)))
.map(path -> PkgDataParser.parseFile(path, CompressionFormatImpl.guess(path)))
.limit(10)
.map(new Function<PkgData, String>() {
@Override