[haiku-depot-web] [haiku-depot-web-app] 2 new revisions pushed by haiku.li...@xxxxxxxxx on 2014-08-08 10:12 GMT

  • From: haiku-depot-web-app@xxxxxxxxxxxxxx
  • To: haiku-depot-web@xxxxxxxxxxxxx
  • Date: Fri, 08 Aug 2014 10:12:44 +0000

master moved from 4eefd302db94 to 7e9b3b971893

2 new revisions:

Revision: ad667129a2ca
Author:   Andrew Lindesay <apl@xxxxxxxxxxxxxx>
Date:     Fri Aug  8 09:53:48 2014 UTC
Log: #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 UTC
Log: #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;

Other related posts:

  • » [haiku-depot-web] [haiku-depot-web-app] 2 new revisions pushed by haiku.li...@xxxxxxxxx on 2014-08-08 10:12 GMT - haiku-depot-web-app