Skip to content

Commit

Permalink
some state of refack for #13
Browse files Browse the repository at this point in the history
  • Loading branch information
stCarolas committed Feb 25, 2020
1 parent 1dc1c4f commit d5b64cd
Show file tree
Hide file tree
Showing 18 changed files with 172 additions and 142 deletions.
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package com.github.stcarolas.enki.core;

import static com.github.stcarolas.enki.core.util.FunctionCaller.option;
import static com.github.stcarolas.enki.core.util.FunctionCaller.seq;
import static io.vavr.Function0.lift;
import static io.vavr.Function1.lift;
import static io.vavr.collection.List.empty;
import static io.vavr.control.Option.some;

Expand All @@ -26,14 +26,16 @@ public void run() {
.peek(first -> log.info("calling repository providers"))

.flatMap(
provider -> seq(provider::repositories)
.onEmpty(() -> log.error("{} provide empty list of repositories", provider))
provider -> lift(provider::repositories).apply()
.onEmpty(() -> log.error("{} cant provide list of repositories", provider))
.peek( list -> log.info("{} provide {} repositories", provider, list.size()) )
.getOrElse(empty())
)

.onEmpty(() -> log.error("no repository provided at all"))
.peek(first -> log.info("calling repository handlers") )
.peek( first -> log.info("calling repository handlers") )

.flatMap(
.flatMap(
repo -> Option.sequence(this.runHandlersOnRepo(repo))
.peek(it -> log.info("repo {} was successfully handled by all handlers", repo))
.onEmpty(() -> log.error("repository {} was handled with one or more error", repo))
Expand All @@ -46,7 +48,7 @@ private Seq<Option<T>> runHandlersOnRepo(T repository) {
return handlers
.onEmpty(() -> log.error("missing any RepoHandler"))
.map(
handler -> option(() -> handler.handle(repository))
handler -> lift(handler::handle).apply(repository)
.peek(it -> log.info("repository {} was successfully handled by {}", repository, handler))
.onEmpty(() -> log.error("{} was unable to handle repository", handler.getClass()))
);
Expand Down
9 changes: 4 additions & 5 deletions core/src/main/java/com/github/stcarolas/enki/core/Repo.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,27 +3,26 @@
import java.io.File;

import io.vavr.collection.Seq;
import io.vavr.control.Option;

public interface Repo {

/**
*
* @return unique technical id of this copy of repository
*/
Option<String> id();
String id();

/**
*
* @return some human-readable name of repository
*/
Option<String> name();
String name();

/**
*
* @return file-based access to this repository
*/
Option<File> directory();
File directory();

/**
*
Expand All @@ -35,6 +34,6 @@ public interface Repo {
*
* @return copy of this repository after commiting changes
*/
Option<? extends Repo> commit(String commitMessage);
Repo commit(String commitMessage);

}
Original file line number Diff line number Diff line change
@@ -1,12 +1,10 @@
package com.github.stcarolas.enki.core;

import io.vavr.control.Option;

public interface RepoHandler<T extends Repo> {
/**
*
* @param repo a repository needed to be handled
* @return handled repository
*/
Option<T> handle(T repo);
T handle(T repo);
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,6 @@
// TODO add javadoc to RepoProvider
public interface RepoProvider<T extends Repo> {
Seq<T> repositories();
Option<T> download(T repo);
Option<T> upload(Repo repo);
T download(T repo);
T upload(Repo repo);
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package com.github.stcarolas.enki.core.provider.strategies.download;

import static com.github.stcarolas.enki.core.util.FunctionCaller.option;
import static io.vavr.control.Option.some;

import java.io.File;
Expand All @@ -11,6 +10,8 @@

import org.eclipse.jgit.api.Git;

import static io.vavr.Function0.lift;
import io.vavr.Function0;
import io.vavr.control.Option;
import io.vavr.control.Try;
import lombok.AccessLevel;
Expand All @@ -31,7 +32,7 @@ public Option<File> get(){
.flatMap(
url -> repository
.onEmpty(() -> log.error("missing repository to clone for url {}", url))
.flatMap(repo -> option(repo::directory)
.flatMap(repo -> lift(repo::directory).apply()
.onEmpty(() -> log.error("missing any directory to clone into"))
)
.peek(
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package com.github.stcarolas.enki.core.provider.strategies.upload;

import static com.github.stcarolas.enki.core.util.FunctionCaller.option;
import static io.vavr.Function0.lift;
import static io.vavr.control.Option.some;

import java.util.function.Supplier;
Expand Down Expand Up @@ -32,7 +32,7 @@ public Option<Iterable<PushResult>> get() {
() -> log.error("missing repository for uploading to {}", url)
)
.flatMap(
repo -> option(repo::directory)
repo -> lift(repo::directory).apply()
.onEmpty(()-> log.error("missing directory from repository for {}", url))
)
.flatMap(
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
package com.github.stcarolas.enki.core.repo;

import static io.vavr.collection.List.empty;
import static com.github.stcarolas.enki.core.util.FunctionCaller.option;
import static com.github.stcarolas.enki.core.util.FunctionCaller.seq;
import static io.vavr.Function0.lift;
import static io.vavr.Function1.lift;
import static io.vavr.control.Option.none;
import static io.vavr.control.Option.some;

import java.io.File;
Expand All @@ -27,39 +27,62 @@ public class StrategiesAsRepo implements Repo {
private Option<Supplier<Seq<RepoProvider<? extends Repo>>>> providersStrategy;

@Override
public Option<String> id() {
public String id() {
return identityStrategy
.onEmpty(() -> log.info("no IdentityStrategy defined"))
.flatMap(strategy -> option(strategy::get));
.flatMap(
strategy -> lift(strategy::get)
.apply()
.onEmpty(() -> log.error("cant call identity strategy"))
.get()
)
.get();
}

@Override
public Option<String> name() {
public String name() {
return nameStrategy
.onEmpty(() -> log.info("no NameStrategy defined"))
.flatMap(strategy -> option(strategy::get));
.flatMap(strategy -> lift(strategy::get).apply().getOrElse(none()))
.get();
}

@Override
public Option<File> directory() {
public File directory() {
return directoryStrategy
.onEmpty(() -> log.info("no DirectoryStrategy defined"))
.flatMap(strategy -> option(strategy::get));
.flatMap(
strategy -> lift(strategy::get)
.apply()
.onEmpty(() -> log.error("cant call directory strategy"))
.getOrElse(none())
)
.get();
}

@Override
public Seq<RepoProvider<? extends Repo>> providers() {
return providersStrategy
.onEmpty(() -> log.info("no ProvidersStrategy defined"))
.map(strategy -> seq(strategy::get))
.getOrElse(empty());
.flatMap(
strategy -> lift(strategy::get)
.apply()
.onEmpty(() -> log.error("cant call providers strategy"))
)
.get();
}

@Override
public Option<? extends Repo> commit(String commitMessage) {
public Repo commit(String commitMessage) {
return commitStrategy
.onEmpty(() -> log.info("no CommitStrategy defined"))
.flatMap(strategy -> option(() -> strategy.apply(commitMessage)) );
.flatMap(
strategy -> lift(strategy::apply)
.apply(commitMessage)
.onEmpty(() -> log.error("cant call commit strategy"))
.getOrElse(none())
)
.get();
}

public StrategiesAsRepo setDirectoryStrategy(Supplier<Option<File>> strategy) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
import org.eclipse.jgit.api.Git;
import org.eclipse.jgit.revwalk.RevCommit;

import static io.vavr.Function0.lift;
import io.vavr.control.Option;
import io.vavr.control.Try;
import lombok.AccessLevel;
Expand All @@ -26,7 +27,7 @@ public Option<? extends Repo> apply(String commitMessage) {
.onEmpty(() -> log.error("dont try to commit to NULL repository"))
.peek(it -> log.info("commiting to repository {}", it))
.peek(
repo -> repo.directory()
repo -> lift(repo::directory).apply()
.onEmpty(
() -> log.error("try to download repo {} before commiting into that", repo)
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,10 @@
import com.github.stcarolas.enki.core.RepoProvider;

import static io.vavr.control.Option.some;
import static io.vavr.Function0.lift;
import static io.vavr.Function1.lift;

import io.vavr.Function0;
import io.vavr.control.Option;
import io.vavr.control.Try;
import lombok.AccessLevel;
Expand All @@ -24,24 +28,25 @@ public class TemporaryFileDirectoryStrategy implements Supplier<Option<File>> {
public Option<File> get() {
return repo
.onEmpty(() -> log.error("dont try to get directory for NULL repo"))
.flatMap(it -> it.id().flatMap(this::constructDirectoryPath))
.flatMap(
it -> lift(it::id).apply()
.onEmpty(() -> log.info("cant get identity for {}", repo))
.flatMap( lift(this::constructDirectoryPath) )
.onEmpty(() -> log.error("cant get path to store repo {}", repo))
)

.onEmpty(() -> log.error("dont use directory for repo without id"))
.flatMap(this::createDirIfMissing)
.flatMap( lift(this::createDirIfMissing) )
.onEmpty(() -> log.error("something is wrong, directory for storage is missing"))

.onEmpty(() -> log.error("something is wrong, directory is missing"))
.peek(dir -> this.load())

.onEmpty(() -> log.error("fail to download repo"))
;
.onEmpty(() -> log.error("fail to store repo"));
}

private Option<File> constructDirectoryPath(String filename) {
return some(filename)
.map(it -> new File(TEMPORARY_LOCATION + it));
private File constructDirectoryPath(String filename) {
return new File(TEMPORARY_LOCATION + filename);
}

private Option<File> createDirIfMissing(File dir) {
private File createDirIfMissing(File dir) {
return Option.of(dir)
.filter(File::exists)
.peek( file -> log.info("directory {} was existed", file.getPath()) )
Expand All @@ -51,19 +56,21 @@ private Option<File> createDirIfMissing(File dir) {
.onFailure( error -> log.error("error while creating directory {}: {}", dir, error) )
.onSuccess( file -> log.info("directory {} was created", file.getPath()) )
.toOption()
);
).get();
}

private void load() {
repo.map(it -> it.providers())
repo.flatMap(it -> lift(it::providers).apply()
.onEmpty(() -> log.error("repo cant give us his repo provider")))
.flatMap(it -> it.headOption())
.onEmpty(() -> log.info("no providers to load from"))
.peek(this::loadFrom);
.map(this::loadFrom)
.onEmpty(() -> log.error("cant load repo"));
}

@SuppressWarnings({ "unchecked" })
private void loadFrom(RepoProvider<? extends Repo> provider) {
repo.peek(it -> ((RepoProvider<Repo>) (RepoProvider<?>) provider).download(it));
private Option<? extends Repo> loadFrom(RepoProvider<? extends Repo> provider) {
return repo.peek(it -> ((RepoProvider<Repo>) (RepoProvider<?>) provider).download(it));
}

public static Supplier<Option<File>> tmpStorage(Repo repo) {
Expand Down

This file was deleted.

Loading

0 comments on commit d5b64cd

Please sign in to comment.