]> source.dussan.org Git - archiva.git/commitdiff
Adding some (imcomplete) changes to the scheduling part
authorMartin Stockhammer <martin_s@apache.org>
Tue, 3 Oct 2017 19:52:45 +0000 (21:52 +0200)
committerMartin Stockhammer <martin_s@apache.org>
Tue, 3 Oct 2017 19:52:45 +0000 (21:52 +0200)
archiva-modules/archiva-base/archiva-repository-layer/pom.xml
archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/ScheduleDefinition.java
archiva-modules/plugins/maven2-repository/src/main/java/org/apache/archiva/repository/maven2/MavenRepositoryProvider.java

index 2bfb418d6814b784f08a8a566ec829c29a799c84..16df6e459bb1e5af0f840b4c1e83a53d2e76d895 100644 (file)
       <artifactId>wagon-http-lightweight</artifactId>
       <scope>provided</scope>
     </dependency>
+    <dependency>
+      <groupId>com.cronutils</groupId>
+      <artifactId>cron-utils</artifactId>
+      <version>6.0.2</version>
+    </dependency>
   </dependencies>
   <build>
     <plugins>
index 276454464a41f07abed2ac43103e452742a68a27..3084bbc9892afc39d51ede4618811f1fbd1a336a 100644 (file)
@@ -20,11 +20,33 @@ package org.apache.archiva.repository;
  */
 
 
+import com.cronutils.model.Cron;
+import com.cronutils.model.definition.CronDefinition;
+import com.cronutils.model.definition.CronDefinitionBuilder;
+import com.cronutils.model.field.CronFieldName;
+import com.cronutils.model.field.expression.Always;
+import com.cronutils.model.field.expression.And;
+import com.cronutils.model.field.expression.Between;
+import com.cronutils.model.field.expression.Every;
+import com.cronutils.model.field.expression.FieldExpression;
+import com.cronutils.model.field.expression.On;
+import com.cronutils.model.field.expression.QuestionMark;
+import com.cronutils.model.field.expression.visitor.FieldExpressionVisitor;
+import com.cronutils.model.field.value.IntegerFieldValue;
+import com.cronutils.parser.CronParser;
+import org.apache.tools.ant.types.resources.Sort;
+
 import java.time.*;
 import java.util.Collection;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
 import java.util.SortedSet;
 import java.util.TreeSet;
 
+import static com.cronutils.model.CronType.QUARTZ;
+
 /**
  * A definition of schedule times.
  */
@@ -35,6 +57,8 @@ public class ScheduleDefinition {
 
     final SortedSet<MonthDay> daysOfMonth = new TreeSet<>();
 
+    final SortedSet<Month> months = new TreeSet<>(  );
+
     final SortedSet<LocalTime> scheduleTimes = new TreeSet<>();
 
     final LocalTime startTime;
@@ -43,19 +67,30 @@ public class ScheduleDefinition {
 
     boolean fixedTimes = false;
 
-
     public ScheduleDefinition(Collection<DayOfWeek> daysOfWeek,
                               Collection<MonthDay> daysOfMonth,
+                              Collection<Month> months,
                               Collection<LocalTime> scheduleTimes,
                               LocalTime startTime, Duration timeInterval) {
         if (daysOfWeek!=null)
         this.daysOfWeek.addAll(daysOfWeek);
         if (daysOfMonth!=null)
         this.daysOfMonth.addAll(daysOfMonth);
-        if (scheduleTimes!=null)
-        this.scheduleTimes.addAll(scheduleTimes);
-        this.startTime = startTime;
-        this.timeInterval = timeInterval;
+        if (months!=null) {
+            this.months.addAll(months);
+        }
+        if (scheduleTimes!=null && scheduleTimes.size()>0)
+        {
+            this.fixedTimes = true;
+            this.scheduleTimes.addAll( scheduleTimes );
+            this.startTime=null;
+            this.timeInterval=null;
+        } else
+        {
+            this.fixedTimes = false;
+            this.startTime = startTime;
+            this.timeInterval = timeInterval;
+        }
     }
 
     /**
@@ -74,6 +109,14 @@ public class ScheduleDefinition {
         return daysOfMonth;
     }
 
+    /**
+     * Returns the months on which the action should be run.
+     * @return
+     */
+    public SortedSet<Month> getMonths()  {
+        return months;
+    }
+
     /**
      * Returns the time on each day on which the action should be run.
      * @return a set of times on which the action should be run.
@@ -106,4 +149,119 @@ public class ScheduleDefinition {
     public boolean isFixedTimes() {
         return fixedTimes;
     };
+
+    public static ScheduleDefinition fromCronExpression(String cron) {
+        CronDefinition cronDefinition = CronDefinitionBuilder.instanceDefinitionFor( QUARTZ );
+        CronParser parser = new CronParser( cronDefinition  );
+        Cron pCron = parser.parse(cron);
+        if (pCron.validate()==null) {
+            throw new IllegalArgumentException( "Cron expression not valid "+cron );
+        };
+        CronVisitor secondsVisit = new CronVisitor( );
+        pCron.retrieve( CronFieldName.SECOND ).getExpression().accept(secondsVisit);
+        CronVisitor minutesVisit = new CronVisitor( );
+        pCron.retrieve( CronFieldName.MINUTE ).getExpression().accept(minutesVisit);
+        CronVisitor hoursVisit = new CronVisitor( 24 );
+        pCron.retrieve( CronFieldName.HOUR ).getExpression().accept(hoursVisit);
+        SortedSet<LocalTime> times = new TreeSet<>(  );
+        for (Integer hour : hoursVisit.getTimes()) {
+            for (Integer minute : minutesVisit.getTimes()) {
+                for (Integer second : secondsVisit.getTimes()) {
+                    times.add(LocalTime.of( hour, minute, second));
+                }
+            }
+        }
+
+        return null;
+    }
+
+    private static class CronVisitor implements FieldExpressionVisitor {
+
+        private int range = 60;
+        private SortedSet<Integer> times = new TreeSet<>(  );
+
+        CronVisitor() {
+
+        }
+
+        CronVisitor(int range) {
+            this.range = range;
+        }
+
+        private SortedSet<Integer> getTimes() {
+            return times;
+        }
+
+        @Override
+        public FieldExpression visit( FieldExpression expression )
+        {
+            try {
+                Integer in = new Integer(expression.asString());
+                times.add(in);
+            } catch (NumberFormatException ex) {
+                //
+            }
+            return expression;
+        }
+
+        @Override
+        public FieldExpression visit( Always always )
+        {
+            for (int i=0; i<range; i++) {
+                times.add(new Integer(i));
+            }
+            return always;
+        }
+
+        @Override
+        public FieldExpression visit( And and )
+        {
+            FieldExpression result = null;
+            for (FieldExpression expr : and.getExpressions()) {
+                result = expr.accept( this );
+            }
+            return result;
+        }
+
+        @Override
+        public FieldExpression visit( Between between )
+        {
+            for (int i=((IntegerFieldValue) between.getFrom( ).getValue( )).getValue();
+                 i<((IntegerFieldValue)between.getTo().getValue()).getValue() && i<range; i++ ){
+                times.add(new Integer(i));
+            }
+            return between;
+        }
+
+        @Override
+        public FieldExpression visit( Every every )
+        {
+            String exp = every.getExpression().asString();
+            int start;
+            if ("*".equals(exp)) {
+                start = 0;
+            } else {
+                start = Integer.parseInt( exp );
+            }
+            int period = every.getPeriod().getValue();
+            for (int i=start; i<range; i=i+period) {
+                times.add(new Integer(i));
+            }
+            return every;
+        }
+
+        @Override
+        public FieldExpression visit( On on )
+        {
+            // Ignore
+            return null;
+        }
+
+        @Override
+        public FieldExpression visit( QuestionMark questionMark )
+        {
+            // Ignore
+            return null;
+        }
+    }
 }
index f2fc67e878d7c6f74937742e43ba789344c2a8c9..b90a4deb856660795a0ee12b1cfd578a874311dc 100644 (file)
@@ -26,7 +26,11 @@ import org.apache.archiva.repository.RemoteRepository;
 import org.apache.archiva.repository.RepositoryProvider;
 import org.apache.archiva.repository.RepositoryType;
 import org.apache.archiva.repository.features.StagingRepositoryFeature;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
+import java.net.URI;
+import java.net.URISyntaxException;
 import java.util.HashSet;
 import java.util.Set;
 
@@ -35,6 +39,8 @@ import java.util.Set;
  */
 public class MavenRepositoryProvider implements RepositoryProvider
 {
+    private static final Logger log = LoggerFactory.getLogger( MavenRepositoryProvider.class );
+
     static final Set<RepositoryType> TYPES = new HashSet<>(  );
     static {
         TYPES.add( RepositoryType.MAVEN);
@@ -50,6 +56,21 @@ public class MavenRepositoryProvider implements RepositoryProvider
     public ManagedRepository createManagedInstance( ManagedRepositoryConfiguration cfg )
     {
         MavenManagedRepository repo = new MavenManagedRepository(cfg.getId() ,cfg.getName());
+        try
+        {
+            if (cfg.getLocation().startsWith("file:")) {
+                    repo.setLocation( new URI(cfg.getLocation()) );
+            } else {
+                repo.setLocation( new URI("file://"+cfg.getLocation()) );
+            }
+        }
+        catch ( URISyntaxException e )
+        {
+            log.error("Could not set repository uri "+cfg.getLocation());
+        }
+        cfg.getRefreshCronExpression()
+
+
         StagingRepositoryFeature feature = repo.getFeature( StagingRepositoryFeature.class ).get();
         return null;
     }