master moved from 4eefd302db94 to 7e9b3b971893 2 new revisions: Revision: ad667129a2ca Author: Andrew Lindesay <apl@xxxxxxxxxxxxxx> Date: Fri Aug 8 09:53:48 2014 UTCLog: #5; issue with repository import not removing packages that are no lon...
http://code.google.com/p/haiku-depot-web-app/source/detail?r=ad667129a2ca Revision: 7e9b3b971893 Author: Andrew Lindesay <apl@xxxxxxxxxxxxxx> Date: Fri Aug 8 10:12:15 2014 UTC Log: ensure that all r.i. constraints are deferred http://code.google.com/p/haiku-depot-web-app/source/detail?r=7e9b3b971893 ============================================================================== Revision: ad667129a2ca Author: Andrew Lindesay <apl@xxxxxxxxxxxxxx> Date: Fri Aug 8 09:53:48 2014 UTCLog: #5; issue with repository import not removing packages that are no longer in a repo
http://code.google.com/p/haiku-depot-web-app/source/detail?r=ad667129a2ca Modified:/haikudepotserver-packagefile/src/main/java/org/haikuos/pkg/model/PkgVersion.java /haikudepotserver-webapp/src/main/java/org/haikuos/haikudepotserver/dataobjects/PkgVersion.java /haikudepotserver-webapp/src/main/java/org/haikuos/haikudepotserver/pkg/PkgOrchestrationService.java /haikudepotserver-webapp/src/main/java/org/haikuos/haikudepotserver/repository/RepositoryImportService.java /haikudepotserver-webapp/src/main/java/org/haikuos/haikudepotserver/support/VersionCoordinates.java /haikudepotserver-webapp/src/test/java/org/haikuos/haikudepotserver/repository/RepositoryImportServiceIT.java
=======================================--- /haikudepotserver-packagefile/src/main/java/org/haikuos/pkg/model/PkgVersion.java Fri Nov 15 08:51:45 2013 UTC +++ /haikudepotserver-packagefile/src/main/java/org/haikuos/pkg/model/PkgVersion.java Fri Aug 8 09:53:48 2014 UTC
@@ -1,5 +1,5 @@ /* - * Copyright 2013, Andrew Lindesay + * Copyright 2013-2014, Andrew Lindesay * Distributed under the terms of the MIT License. */ @@ -46,11 +46,11 @@ }private void appendDotValue(StringBuilder stringBuilder, String value) {
- if(null!=value) { - if(0!=stringBuilder.length()) { - stringBuilder.append('.'); - } + if(0!=stringBuilder.length()) { + stringBuilder.append('.'); + } + if(null!=value) { stringBuilder.append(value); } } =======================================--- /haikudepotserver-webapp/src/main/java/org/haikuos/haikudepotserver/dataobjects/PkgVersion.java Mon Jun 2 11:04:38 2014 UTC +++ /haikudepotserver-webapp/src/main/java/org/haikuos/haikudepotserver/dataobjects/PkgVersion.java Fri Aug 8 09:53:48 2014 UTC
@@ -5,13 +5,13 @@ package org.haikuos.haikudepotserver.dataobjects; -import com.google.common.base.Optional; -import com.google.common.base.Preconditions; -import com.google.common.base.Predicate; -import com.google.common.base.Strings; +import com.google.common.base.*; import com.google.common.collect.Iterables; +import com.google.common.collect.Lists; import org.apache.cayenne.ObjectContext; +import org.apache.cayenne.ObjectId; import org.apache.cayenne.exp.ExpressionFactory; +import org.apache.cayenne.query.ObjectIdQuery; import org.apache.cayenne.query.SelectQuery; import org.apache.cayenne.validation.BeanValidationFailure; import org.apache.cayenne.validation.ValidationResult; @@ -30,6 +30,10 @@public final static Pattern MICRO_PATTERN = Pattern.compile("^[\\w_.]+$"); public final static Pattern PRE_RELEASE_PATTERN = Pattern.compile("^[\\w_.]+$");
+ public static PkgVersion get(ObjectContext context, ObjectId objectId) { + return Iterables.getOnlyElement((List<PkgVersion>) context.performQuery(new ObjectIdQuery(objectId)));
+ } + public static List<PkgVersion> getForPkg( ObjectContext context, Pkg pkg) { @@ -159,6 +163,51 @@ } ); } + + /** + * <p>Renders the copyright entities into a list of strings.</p> + */ + + public List<String> getCopyrights() { + return Lists.transform( + getPkgVersionCopyrights(), + new Function<PkgVersionCopyright, String>() { + @Override + public String apply(PkgVersionCopyright input) { + return input.getBody(); + } + } + ); + } + + /** + * <p>Renders the licenses entities into a list of strings.</p> + */ + + public List<String> getLicenses() { + return Lists.transform( + getPkgVersionLicenses(), + new Function<PkgVersionLicense, String>() { + @Override + public String apply(PkgVersionLicense input) { + return input.getBody(); + } + } + ); + } ++ public Optional<PkgVersionUrl> getPkgVersionUrlForType(final PkgUrlType type) {
+ Preconditions.checkNotNull(type); + return Iterables.tryFind( + getPkgVersionUrls(), + new Predicate<PkgVersionUrl>() { + @Override + public boolean apply(PkgVersionUrl input) { + return input.getPkgUrlType().equals(type); + } + } + ); + } public VersionCoordinates toVersionCoordinates() { return new VersionCoordinates( =======================================--- /haikudepotserver-webapp/src/main/java/org/haikuos/haikudepotserver/pkg/PkgOrchestrationService.java Wed Aug 6 09:46:44 2014 UTC +++ /haikudepotserver-webapp/src/main/java/org/haikuos/haikudepotserver/pkg/PkgOrchestrationService.java Fri Aug 8 09:53:48 2014 UTC
@@ -5,19 +5,22 @@ package org.haikuos.haikudepotserver.pkg; -import com.google.common.base.Joiner; -import com.google.common.base.Optional; -import com.google.common.base.Preconditions; -import com.google.common.base.Strings; +import com.google.common.base.*; +import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableSet; import com.google.common.collect.Iterables; import com.google.common.collect.Lists; import org.apache.cayenne.ObjectContext; import org.apache.cayenne.ObjectId; +import org.apache.cayenne.exp.Expression; import org.apache.cayenne.exp.ExpressionFactory; import org.apache.cayenne.query.EJBQLQuery; import org.apache.cayenne.query.PrefetchTreeNode; import org.apache.cayenne.query.SelectQuery; import org.haikuos.haikudepotserver.dataobjects.*; +import org.haikuos.haikudepotserver.dataobjects.Pkg; +import org.haikuos.haikudepotserver.dataobjects.PkgUrlType; +import org.haikuos.haikudepotserver.dataobjects.PkgVersion; import org.haikuos.haikudepotserver.pkg.model.BadPkgIconException; import org.haikuos.haikudepotserver.pkg.model.BadPkgScreenshotException; import org.haikuos.haikudepotserver.pkg.model.PkgSearchSpecification; @@ -27,6 +30,7 @@ import org.haikuos.haikudepotserver.support.VersionCoordinatesComparator; import org.haikuos.haikudepotserver.support.cayenne.ExpressionHelper; import org.haikuos.haikudepotserver.support.cayenne.LikeHelper; +import org.haikuos.pkg.model.*; import org.imgscalr.Scalr; import org.joda.time.DateTime; import org.slf4j.Logger; @@ -38,6 +42,7 @@ import java.io.*; import java.util.Collections; import java.util.List; +import java.util.Set; import java.util.UUID; /** @@ -581,6 +586,65 @@ // ------------------------------ // IMPORT + /**+ * <p>This method will deactivate package versions for a package where the package version is related to the + * supplied repository. This is used in the situation where a package was once part of a repository, but has
+ * been removed.</p> + * @return the quantity of package versions that were deactivated. + */ + + public int deactivatePkgVersionsForPkgAssociatedWithRepository( + ObjectContext context, + Pkg pkg, + final Repository repository) { + + Preconditions.checkNotNull(context); + Preconditions.checkNotNull(pkg); + Preconditions.checkNotNull(repository); + + int count = 0; + + for(PkgVersion pkgVersion : PkgVersion.getForPkg(context, pkg)) { + if(pkgVersion.getRepository().equals(repository)) { + if(pkgVersion.getActive()) { + pkgVersion.setActive(false); + count++; + } + } + } + + return count; + } + + /**+ * <p>This method will return all of the package names that have package versions that are related to a
+ * repository.</p> + */ ++ public Set<String> fetchPkgNamesWithAnyPkgVersionAssociatedWithRepository(
+ ObjectContext context, + Repository repository) { + + Preconditions.checkNotNull(context); + Preconditions.checkNotNull(repository); + + StringBuilder queryBuilder = new StringBuilder(); + queryBuilder.append("SELECT p.name FROM "); + queryBuilder.append(Pkg.class.getSimpleName()); + queryBuilder.append(" p WHERE EXISTS(SELECT pv FROM "); + queryBuilder.append(PkgVersion.class.getSimpleName()); + queryBuilder.append(" pv WHERE pv."); + queryBuilder.append(PkgVersion.PKG_PROPERTY); + queryBuilder.append("=p AND pv."); + queryBuilder.append(PkgVersion.REPOSITORY_PROPERTY); + queryBuilder.append("=:repository)"); + + EJBQLQuery query = new EJBQLQuery(queryBuilder.toString()); + query.setParameter("repository",repository); + + return ImmutableSet.copyOf(context.performQuery(query)); + } +private VersionCoordinates toVersionCoordinates(org.haikuos.pkg.model.PkgVersion version) {
return new VersionCoordinates( version.getMajor(), @@ -629,12 +693,19 @@// if we know that the package exists then we should look for the version.
- SelectQuery selectQuery = new SelectQuery(- org.haikuos.haikudepotserver.dataobjects.PkgVersion.class,
+ List<Expression> expressions = ImmutableList.of( ExpressionFactory.matchExp(org.haikuos.haikudepotserver.dataobjects.PkgVersion.PKG_PROPERTY,
- persistedPkg) - .andExp(ExpressionHelper.toExpression(toVersionCoordinates(pkg.getVersion()))) + persistedPkg + ),+ ExpressionHelper.toExpression(toVersionCoordinates(pkg.getVersion())), + ExpressionFactory.matchExp(PkgVersion.ARCHITECTURE_PROPERTY, architecture)
+ ); + + + SelectQuery selectQuery = new SelectQuery(+ org.haikuos.haikudepotserver.dataobjects.PkgVersion.class,
+ ExpressionHelper.andAll(expressions) ); //noinspection unchecked @@ -651,7 +722,6 @@ if(null==persistedPkgVersion) {persistedPkgVersion = objectContext.newObject(org.haikuos.haikudepotserver.dataobjects.PkgVersion.class);
- persistedPkgVersion.setActive(Boolean.TRUE); persistedPkgVersion.setMajor(pkg.getVersion().getMajor()); persistedPkgVersion.setMinor(pkg.getVersion().getMinor()); persistedPkgVersion.setMicro(pkg.getVersion().getMicro()); @@ -661,83 +731,152 @@ persistedPkgVersion.setArchitecture(architecture); persistedPkgVersion.setPkg(persistedPkg); - // now add the copyrights - for(String copyright : pkg.getCopyrights()) {- PkgVersionCopyright persistedPkgVersionCopyright = objectContext.newObject(PkgVersionCopyright.class);
- persistedPkgVersionCopyright.setBody(copyright);- persistedPkgVersionCopyright.setPkgVersion(persistedPkgVersion);
+ LOGGER.info(+ "the version {} of package {} did not exist; will create",
+ pkg.getVersion().toString(), + pkg.getName()); + } + else { + + LOGGER.debug(+ "the version {} of package {} did exist; will re-configure necessary data",
+ pkg.getVersion().toString(), + pkg.getName()); + + } + + persistedPkgVersion.setActive(Boolean.TRUE); + + {+ List<String> existingCopyrights = persistedPkgVersion.getCopyrights();
+ + // now add the copyrights that are not already there. + + for (String copyright : pkg.getCopyrights()) { + if(!existingCopyrights.contains(copyright)) {+ PkgVersionCopyright persistedPkgVersionCopyright = objectContext.newObject(PkgVersionCopyright.class);
+ persistedPkgVersionCopyright.setBody(copyright);+ persistedPkgVersionCopyright.setPkgVersion(persistedPkgVersion);
+ } + } + + // remove those copyrights that are no longer present ++ for(PkgVersionCopyright pkgVersionCopyright : ImmutableList.copyOf(persistedPkgVersion.getPkgVersionCopyrights())) { + if(!pkg.getCopyrights().contains(pkgVersionCopyright.getBody())) { + persistedPkgVersion.removeFromPkgVersionCopyrights(pkgVersionCopyright);
+ objectContext.deleteObjects(pkgVersionCopyright); + } } - // now add the licenses - for(String license : pkg.getLicenses()) {- PkgVersionLicense persistedPkgVersionLicense = objectContext.newObject(PkgVersionLicense.class);
- persistedPkgVersionLicense.setBody(license);- persistedPkgVersionLicense.setPkgVersion(persistedPkgVersion);
+ } + + {+ List<String> existingLicenses = persistedPkgVersion.getLicenses();
+ + // now add the licenses that are not already there. + + for (String license : pkg.getLicenses()) { + if(!existingLicenses.contains(license)) {+ PkgVersionLicense persistedPkgVersionLicense = objectContext.newObject(PkgVersionLicense.class);
+ persistedPkgVersionLicense.setBody(license);+ persistedPkgVersionLicense.setPkgVersion(persistedPkgVersion);
+ } } - if(null!=pkg.getHomePageUrl()) {- PkgVersionUrl persistedPkgVersionUrl = objectContext.newObject(PkgVersionUrl.class); - persistedPkgVersionUrl.setUrl(pkg.getHomePageUrl().getUrl());
- persistedPkgVersionUrl.setPkgUrlType(PkgUrlType.getByCode( - objectContext,- pkg.getHomePageUrl().getUrlType().name().toLowerCase()).get());
- persistedPkgVersionUrl.setPkgVersion(persistedPkgVersion); + // remove those licenses that are no longer present ++ for(PkgVersionLicense pkgVersionLicense : ImmutableList.copyOf(persistedPkgVersion.getPkgVersionLicenses())) { + if(!pkg.getLicenses().contains(pkgVersionLicense.getBody())) { + persistedPkgVersion.removeFromPkgVersionLicenses(pkgVersionLicense);
+ objectContext.deleteObjects(pkgVersionLicense); + } } + }- if(!Strings.isNullOrEmpty(pkg.getSummary()) | | !Strings.isNullOrEmpty(pkg.getDescription())) {
- updatePkgVersionLocalization( - objectContext, - persistedPkgVersion,- NaturalLanguage.getByCode(objectContext, NaturalLanguage.CODE_ENGLISH).get(),
- pkg.getSummary(), - pkg.getDescription()); + { + PkgUrlType pkgUrlType = PkgUrlType.getByCode( + objectContext,+ org.haikuos.pkg.model.PkgUrlType.HOMEPAGE.name().toLowerCase()).get();
++ Optional<PkgVersionUrl> homeUrlOptional = persistedPkgVersion.getPkgVersionUrlForType(pkgUrlType);
+ + if (null != pkg.getHomePageUrl()) { + if(homeUrlOptional.isPresent()) {+ homeUrlOptional.get().setUrl(pkg.getHomePageUrl().getUrl());
+ } + else {+ PkgVersionUrl persistedPkgVersionUrl = objectContext.newObject(PkgVersionUrl.class); + persistedPkgVersionUrl.setUrl(pkg.getHomePageUrl().getUrl());
+ persistedPkgVersionUrl.setPkgUrlType(pkgUrlType);+ persistedPkgVersionUrl.setPkgVersion(persistedPkgVersion);
+ } } + }- // look back at the previous version of the same package and see if there are localizations. If there - // are then replicate those into this version as well, but only if the english variant exists. + if(!Strings.isNullOrEmpty(pkg.getSummary()) | | !Strings.isNullOrEmpty(pkg.getDescription())) {
+ updatePkgVersionLocalization( + objectContext, + persistedPkgVersion,+ NaturalLanguage.getByCode(objectContext, NaturalLanguage.CODE_ENGLISH).get(),
+ pkg.getSummary(), + pkg.getDescription()); + } ++ // look back at the previous version of the same package and see if there are localizations. If there + // are then replicate those into this version as well, but only if the english variant exists. Don't do
+ // this if the package is being updated instead of created. - if(persistedLatestExistingPkgVersion.isPresent()) {- int naturalLanguagesReplicated = replicateLocalizationIfEnglishMatches(
- objectContext, - persistedLatestExistingPkgVersion.get(), - persistedPkgVersion, - NaturalLanguage.getAllExceptEnglish(objectContext), - false).size();+ if(persistedLatestExistingPkgVersion.isPresent() && persistedPkgVersion.getObjectId().isTemporary()) { + int naturalLanguagesReplicated = replicateLocalizationIfEnglishMatches(
+ objectContext, + persistedLatestExistingPkgVersion.get(), + persistedPkgVersion, + NaturalLanguage.getAllExceptEnglish(objectContext), + false).size(); + if(0!=naturalLanguagesReplicated) { LOGGER.info("replicated {} natural language localizations when creating new version of package {}",
naturalLanguagesReplicated, pkg.getName()); } + } ++ // now possibly switch the latest flag over to the new one from the old one.
- // now possibly switch the latest flag over to the new one from the old one.
+ if(persistedLatestExistingPkgVersion.isPresent()) {+ VersionCoordinatesComparator versionCoordinatesComparator = new VersionCoordinatesComparator(); + VersionCoordinates persistedPkgVersionCoords = persistedPkgVersion.toVersionCoordinates(); + VersionCoordinates persistedLatestExistingPkgVersionCoords = persistedLatestExistingPkgVersion.get().toVersionCoordinates();
- if(persistedLatestExistingPkgVersion.isPresent()) {- VersionCoordinatesComparator versionCoordinatesComparator = new VersionCoordinatesComparator(); - VersionCoordinates persistedPkgVersionCoords = persistedPkgVersion.toVersionCoordinates(); - VersionCoordinates persistedLatestExistingPkgVersionCoords = persistedLatestExistingPkgVersion.get().toVersionCoordinates();
+ int c = versionCoordinatesComparator.compare( + persistedPkgVersionCoords, + persistedLatestExistingPkgVersionCoords); - if(versionCoordinatesComparator.compare( - persistedPkgVersionCoords, - persistedLatestExistingPkgVersionCoords) > 0) { - persistedPkgVersion.setIsLatest(true);- persistedLatestExistingPkgVersion.get().setIsLatest(false);
+ if(c > 0) { + persistedPkgVersion.setIsLatest(true); + persistedLatestExistingPkgVersion.get().setIsLatest(false); + } + else { + if(0==c) { + LOGGER.debug(+ "imported a package version {} of {} which is older or the same as the existing {}",
+ persistedPkgVersionCoords, + persistedPkgVersion.getPkg().getName(), + persistedLatestExistingPkgVersionCoords); } else { LOGGER.warn(- "imported a package version {} which is older or the same as the existing {}", + "imported a package version {} of {} which is older or the same as the existing {}",
persistedPkgVersionCoords, + persistedPkgVersion.getPkg().getName(), persistedLatestExistingPkgVersionCoords); } } - else { - persistedPkgVersion.setIsLatest(true); - } - - LOGGER.info(- "the version {} of package {} did not exist; will create",
- pkg.getVersion().toString(), - pkg.getName()); + } + else { + persistedPkgVersion.setIsLatest(true); } LOGGER.debug("have processed package {}", pkg.toString()); =======================================--- /haikudepotserver-webapp/src/main/java/org/haikuos/haikudepotserver/repository/RepositoryImportService.java Sun Aug 3 11:11:48 2014 UTC +++ /haikudepotserver-webapp/src/main/java/org/haikuos/haikudepotserver/repository/RepositoryImportService.java Fri Aug 8 09:53:48 2014 UTC
@@ -10,16 +10,19 @@ import com.google.common.base.Predicate; import com.google.common.collect.Iterables; import com.google.common.collect.Lists; +import com.google.common.collect.Sets; import com.google.common.io.Files; import com.google.common.io.Resources; import org.apache.cayenne.ObjectContext; import org.apache.cayenne.access.Transaction; import org.apache.cayenne.configuration.server.ServerRuntime; +import org.haikuos.haikudepotserver.dataobjects.PkgVersion; import org.haikuos.haikudepotserver.dataobjects.Repository; import org.haikuos.haikudepotserver.pkg.PkgOrchestrationService;import org.haikuos.haikudepotserver.repository.model.PkgRepositoryImportJob; import org.haikuos.haikudepotserver.support.AbstractLocalBackgroundProcessingService;
import org.haikuos.pkg.PkgIterator; +import org.haikuos.pkg.model.Pkg; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -27,6 +30,8 @@ import java.io.File; import java.net.MalformedURLException; import java.net.URL; +import java.util.Iterator; +import java.util.Set; /*** <p>This object is responsible for migrating a HPKR file from a remote repository into the Haiku Depot Server
@@ -87,7 +92,8 @@ protected void run(PkgRepositoryImportJob job) { Preconditions.checkNotNull(job);- Repository repository = Repository.getByCode(serverRuntime.getContext(), job.getCode()).get();
+ ObjectContext mainContext = serverRuntime.getContext();+ Repository repository = Repository.getByCode(mainContext, job.getCode()).get();
URL url; try { @@ -111,16 +117,55 @@LOGGER.debug("did copy data for repository {} ({}) to temporary file", job.getCode(), url.toString());
org.haikuos.pkg.HpkrFileExtractor fileExtractor = new org.haikuos.pkg.HpkrFileExtractor(temporaryFile); - PkgIterator pkgIterator = new PkgIterator(fileExtractor.getPackageAttributesIterator());
long startTimeMs = System.currentTimeMillis();LOGGER.info("will process data for repository {}", job.getCode());
+ // import any packages that are in the repository. + + Set<String> repositoryImportPkgNames = Sets.newHashSet();+ PkgIterator pkgIterator = new PkgIterator(fileExtractor.getPackageAttributesIterator());
+ while (pkgIterator.hasNext()) {ObjectContext pkgImportContext = serverRuntime.getContext(); - pkgService.importFrom(pkgImportContext, repository.getObjectId(), pkgIterator.next());
+ Pkg pkg = pkgIterator.next(); + repositoryImportPkgNames.add(pkg.getName());+ pkgService.importFrom(pkgImportContext, repository.getObjectId(), pkg);
pkgImportContext.commitChanges(); } + + // [apl 6.aug.2014] #5+ // Packages may be removed from a repository. In this case there is no trigger to indicate that the + // package version should be removed. Check all of the packages that have an active version in this + // repository and then if the package simply doesn't exist in that repository any more, mark all of
+ // those versions are inactive. + + {+ Iterator<String> persistedPkgNames = pkgService.fetchPkgNamesWithAnyPkgVersionAssociatedWithRepository(
+ mainContext, + repository).iterator(); + + while(persistedPkgNames.hasNext()) { + String persistedPkgName = persistedPkgNames.next(); ++ if(!repositoryImportPkgNames.contains(persistedPkgName)) {
++ ObjectContext removalContext = serverRuntime.getContext(); + Repository removalRepository = Repository.get(removalContext, repository.getObjectId());
++ int changes = pkgService.deactivatePkgVersionsForPkgAssociatedWithRepository(
+ removalContext,+ org.haikuos.haikudepotserver.dataobjects.Pkg.getByName(removalContext, persistedPkgName).get(),
+ removalRepository); + + if(changes > 0) { + removalContext.commitChanges();+ LOGGER.info("did remove all versions of package {} from repository {} because this package is no longer in the repository", persistedPkgName, repository.toString());
+ } + + } + } + }LOGGER.info("did process data for repository {} in {}ms", job.getCode(), System.currentTimeMillis() - startTimeMs);
=======================================--- /haikudepotserver-webapp/src/main/java/org/haikuos/haikudepotserver/support/VersionCoordinates.java Sun Aug 3 11:11:48 2014 UTC +++ /haikudepotserver-webapp/src/main/java/org/haikuos/haikudepotserver/support/VersionCoordinates.java Fri Aug 8 09:53:48 2014 UTC
@@ -89,10 +89,26 @@result = 31 * result + (revision != null ? revision.hashCode() : 0);
return result; } ++ private void appendDotValue(StringBuilder stringBuilder, String value) {
+ if(0!=stringBuilder.length()) { + stringBuilder.append('.'); + } + + if(null!=value) { + stringBuilder.append(value); + } + } @Override public String toString() {- return getMajor() + '.' + getMinor() + '.' + getMicro() + '.' + getPreRelease() + '.' + getRevision();
+ StringBuilder result = new StringBuilder(); + appendDotValue(result,getMajor()); + appendDotValue(result,getMinor()); + appendDotValue(result,getMicro()); + appendDotValue(result, getPreRelease());+ appendDotValue(result, null == getRevision() ? null : getRevision().toString());
+ return result.toString(); } } =======================================--- /haikudepotserver-webapp/src/test/java/org/haikuos/haikudepotserver/repository/RepositoryImportServiceIT.java Wed Jun 4 11:36:29 2014 UTC +++ /haikudepotserver-webapp/src/test/java/org/haikuos/haikudepotserver/repository/RepositoryImportServiceIT.java Fri Aug 8 09:53:48 2014 UTC
@@ -6,18 +6,28 @@ package org.haikuos.haikudepotserver.repository; import com.google.common.base.Optional; +import com.google.common.collect.ImmutableSet; import com.google.common.io.Files; +import com.google.common.util.concurrent.Uninterruptibles; import org.apache.cayenne.ObjectContext; +import org.apache.cayenne.ObjectId; +import org.apache.cayenne.exp.ExpressionFactory; +import org.apache.cayenne.query.SelectQuery; import org.fest.assertions.Assertions; -import org.haikuos.haikudepotserver.dataobjects.Architecture; +import org.haikuos.haikudepotserver.dataobjects.*; import org.haikuos.haikudepotserver.dataobjects.Pkg; -import org.haikuos.haikudepotserver.dataobjects.Repository; +import org.haikuos.haikudepotserver.dataobjects.PkgUrlType; +import org.haikuos.haikudepotserver.dataobjects.PkgVersion; +import org.haikuos.haikudepotserver.dataobjects.PkgVersionLocalization; +import org.haikuos.haikudepotserver.dataobjects.PkgVersionUrl;import org.haikuos.haikudepotserver.repository.model.PkgRepositoryImportJob;
import org.haikuos.haikudepotserver.AbstractIntegrationTest; import org.junit.Test; import javax.annotation.Resource; import java.io.File; +import java.util.List; +import java.util.concurrent.TimeUnit; /*** <p>This test will load in a fake repository HPKR file and will then check to see that it imported correctly.</p>
@@ -35,6 +45,7 @@ String name) { Optional<Pkg> pkgOptional = Pkg.getByName(context, name); Assertions.assertThat(pkgOptional.isPresent()).isTrue(); + Assertions.assertThat(pkgOptional.get().getActive()).isTrue(); } @Test @@ -61,6 +72,95 @@repository.setArchitecture(Architecture.getByCode(context, "x86").get());
context.commitChanges(); } ++ // setup another repository that is not related to the import test to check some stuff...
+ + { + ObjectContext context = serverRuntime.getContext();+ Repository repository = context.newObject(Repository.class);
+ repository.setActive(Boolean.TRUE); + repository.setCode("test2"); + repository.setUrl("file://noop.hpkr");+ repository.setArchitecture(Architecture.getByCode(context, "x86").get());
+ context.commitChanges(); + } ++ // add a package version from this repository that is known not to be in that example and then
+ // latterly check that the package version is no longer active. + + { + ObjectContext context = serverRuntime.getContext(); + Pkg pkg = context.newObject(Pkg.class);+ pkg.setProminence(Prominence.getByOrdering(context, Prominence.ORDERING_LAST).get());
+ pkg.setName("taranaki"); + + // this one should get deactivated + {+ PkgVersion pkgVersion = context.newObject(PkgVersion.class);
+ pkgVersion.setPkg(pkg); + pkgVersion.setMajor("1"); + pkgVersion.setMinor("2");+ pkgVersion.setArchitecture(Architecture.getByCode(context, "x86").get());
+ pkgVersion.setIsLatest(true); + pkgVersion.setActive(true); // to be sure!+ pkgVersion.setRepository(Repository.getByCode(context, "test").get());
+ } + + // this one should remain + {+ PkgVersion pkgVersion = context.newObject(PkgVersion.class);
+ pkgVersion.setPkg(pkg); + pkgVersion.setMajor("1"); + pkgVersion.setMinor("3");+ pkgVersion.setArchitecture(Architecture.getByCode(context, "x86").get());
+ pkgVersion.setIsLatest(true); + pkgVersion.setActive(true); // to be sure!+ pkgVersion.setRepository(Repository.getByCode(context, "test2").get());
+ } + + context.commitChanges(); + } ++ // add an inactive package version from this repository that is known to be in the repository. This
+ // package should be activated and re-used. + + ObjectId originalFfmpegPkgOid; + + { + ObjectContext context = serverRuntime.getContext(); + + Pkg pkg = context.newObject(Pkg.class);+ pkg.setProminence(Prominence.getByOrdering(context, Prominence.ORDERING_LAST).get());
+ pkg.setName("ffmpeg"); ++ PkgVersion pkgVersion = context.newObject(PkgVersion.class);
+ pkgVersion.setPkg(pkg); + pkgVersion.setMajor("0"); + pkgVersion.setMinor("10"); + pkgVersion.setMicro("2"); + pkgVersion.setRevision(4);+ pkgVersion.setArchitecture(Architecture.getByCode(context, "x86").get());
+ pkgVersion.setIsLatest(true); + pkgVersion.setActive(false); // to be sure!+ pkgVersion.setRepository(Repository.getByCode(context, "test").get());
++ PkgVersionUrl pkgVersionUrl = context.newObject(PkgVersionUrl.class); + pkgVersionUrl.setPkgUrlType(PkgUrlType.getByCode(context, org.haikuos.pkg.model.PkgUrlType.HOMEPAGE.name().toLowerCase()).get());
+ pkgVersionUrl.setUrl("http://noop";);+ pkgVersion.addToManyTarget(PkgVersion.PKG_VERSION_URLS_PROPERTY, pkgVersionUrl, true);
++ PkgVersionCopyright pkgVersionCopyright = context.newObject(PkgVersionCopyright.class);
+ pkgVersionCopyright.setBody("Norfolk pine");+ pkgVersion.addToManyTarget(PkgVersion.PKG_VERSION_COPYRIGHTS_PROPERTY, pkgVersionCopyright, true);
++ PkgVersionLicense pkgVersionLicense = context.newObject(PkgVersionLicense.class);
+ pkgVersionLicense.setBody("Punga");+ pkgVersion.addToManyTarget(PkgVersion.PKG_VERSION_LICENSES_PROPERTY, pkgVersionLicense, true);
+ + context.commitChanges(); + + originalFfmpegPkgOid = pkgVersion.getObjectId(); + } // do the import. @@ -70,9 +170,12 @@ { long startMs = System.currentTimeMillis(); + while( repositoryImportService.isProcessingSubmittedJobs()- && (System.currentTimeMillis() - startMs) < DELAY_PROCESSSUBMITTEDTESTJOB); + && (System.currentTimeMillis() - startMs) < DELAY_PROCESSSUBMITTEDTESTJOB) { + Uninterruptibles.sleepUninterruptibly(1, TimeUnit.SECONDS);
+ } if(repositoryImportService.isProcessingSubmittedJobs()) {throw new IllegalStateException("test processing of the sample repo has taken > "+DELAY_PROCESSSUBMITTEDTESTJOB+"ms");
@@ -84,8 +187,59 @@ { ObjectContext context = serverRuntime.getContext(); + verifyPackage(context,"apr"); verifyPackage(context,"zlib_x86_gcc2_devel"); ++ // this one is not in the import and so should be inactive afterwards.
+ + SelectQuery selectQuery = new SelectQuery( + PkgVersion.class, + ExpressionFactory.matchExp( + PkgVersion.PKG_PROPERTY, + Pkg.getByName(context, "taranaki").get() + ) + ); ++ List<PkgVersion> pkgVersions = (List<PkgVersion>) context.performQuery(selectQuery);
+ + Assertions.assertThat(pkgVersions.size()).isEqualTo(2); + + for(PkgVersion pkgVersion : pkgVersions) {+ boolean isTestRepository = pkgVersion.getRepository().getCode().equals("test"); + Assertions.assertThat(pkgVersion.getActive()).isEqualTo(!isTestRepository);
+ } ++ // check that the ffmpeg package was re-used and populated; as an example.
+ + {+ PkgVersion pkgVersion = PkgVersion.get(context, originalFfmpegPkgOid);
+ Assertions.assertThat(pkgVersion.getActive()).isTrue();+ Assertions.assertThat(pkgVersion.getIsLatest()).isTrue(); + Assertions.assertThat(PkgVersion.getForPkg(context, pkgVersion.getPkg()).size()).isEqualTo(1);
++ PkgVersionLocalization localization = pkgVersion.getPkgVersionLocalization(NaturalLanguage.getByCode(context, NaturalLanguage.CODE_ENGLISH).get()).get(); + Assertions.assertThat(localization.getDescription()).startsWith("FFmpeg is a complete, cro"); + Assertions.assertThat(localization.getSummary()).startsWith("Audio and video rec");
+ + // the former rubbish copyright is removed + List<String> copyrights = pkgVersion.getCopyrights(); + Assertions.assertThat(copyrights.size()).isEqualTo(2);+ Assertions.assertThat(ImmutableSet.copyOf(copyrights)).containsOnly("2000-2003 Fabrice Bellard", "2003-2012 the FFmpeg developers");
+ + // the former rubbish license is removed + List<String> licenses = pkgVersion.getLicenses(); + Assertions.assertThat(licenses.size()).isEqualTo(2);+ Assertions.assertThat(ImmutableSet.copyOf(licenses)).containsOnly("GNU LGPL v2.1", "GNU GPL v2");
++ Optional<PkgVersionUrl> pkgVersionUrlOptional = pkgVersion.getPkgVersionUrlForType(PkgUrlType.getByCode(
+ context,+ org.haikuos.pkg.model.PkgUrlType.HOMEPAGE.name().toLowerCase()).get());
++ Assertions.assertThat(pkgVersionUrlOptional.isPresent()).isTrue(); + Assertions.assertThat(pkgVersionUrlOptional.get().getUrl()).isEqualTo("http://www.ffmpeg.org";);
+ } + } } finally { ============================================================================== Revision: 7e9b3b971893 Author: Andrew Lindesay <apl@xxxxxxxxxxxxxx> Date: Fri Aug 8 10:12:15 2014 UTC Log: ensure that all r.i. constraints are deferred http://code.google.com/p/haiku-depot-web-app/source/detail?r=7e9b3b971893 Added:/haikudepotserver-webapp/src/main/resources/db/haikudepot/migration/V1.16__Foreign_Key_Constraints_Deferred.sql
======================================= --- /dev/null+++ /haikudepotserver-webapp/src/main/resources/db/haikudepot/migration/V1.16__Foreign_Key_Constraints_Deferred.sql Fri Aug 8 10:12:15 2014 UTC
@@ -0,0 +1,13 @@ +-- ------------------------------------------------------ +-- LOOKS LIKE SOME FOREIGN KEY CONSTRAINTS ARE NOT DEFERRED - FIX +-- ------------------------------------------------------ ++ALTER TABLE haikudepot.permission_user_pkg DROP CONSTRAINT permission_user_pkg_permission_id_fkey; +ALTER TABLE haikudepot.permission_user_pkg DROP CONSTRAINT permission_user_pkg_pkg_id_fkey; +ALTER TABLE haikudepot.permission_user_pkg DROP CONSTRAINT permission_user_pkg_user_id_fkey; +ALTER TABLE haikudepot.user_password_reset_token DROP CONSTRAINT user_password_reset_token_user_id_fkey;
++ALTER TABLE haikudepot.permission_user_pkg ADD CONSTRAINT permission_user_pkg_permission_id_fkey FOREIGN KEY (permission_id) REFERENCES permission(id) DEFERRABLE INITIALLY DEFERRED; +ALTER TABLE haikudepot.permission_user_pkg ADD CONSTRAINT permission_user_pkg_pkg_id_fkey FOREIGN KEY (pkg_id) REFERENCES pkg(id) DEFERRABLE INITIALLY DEFERRED; +ALTER TABLE haikudepot.permission_user_pkg ADD CONSTRAINT permission_user_pkg_user_id_fkey FOREIGN KEY (user_id) REFERENCES "user"(id) DEFERRABLE INITIALLY DEFERRED; +ALTER TABLE haikudepot.user_password_reset_token ADD CONSTRAINT user_password_reset_token_user_id_fkey FOREIGN KEY (user_id) REFERENCES "user"(id) DEFERRABLE INITIALLY DEFERRED;