From faad2b3e2f7fdbef3279ac3ae3711c85a56d859a Mon Sep 17 00:00:00 2001 From: Stephan Richter Date: Tue, 9 Sep 2025 10:19:38 +0200 Subject: [PATCH 1/3] fixed umbrella logo --- frontend/public/umbrella100px.png | Bin 6601 -> 14003 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/frontend/public/umbrella100px.png b/frontend/public/umbrella100px.png index 7e33646b5d8b8a7c36e02aa62c261d33d4e7c336..81f94c84e8a3e65fbac0967e98c418eb5be5565b 100644 GIT binary patch literal 14003 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 BRdE0S delta 6593 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 From 14a5ba37b2506549d267e46c17d1266aab69a189 Mon Sep 17 00:00:00 2001 From: Stephan Richter Date: Wed, 10 Sep 2025 09:11:34 +0200 Subject: [PATCH 2/3] fixed translation problem --- frontend/src/routes/user/EditService.svelte | 2 +- translations/src/main/resources/de.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/src/routes/user/EditService.svelte b/frontend/src/routes/user/EditService.svelte index dd271f1..6ca09a1 100644 --- a/frontend/src/routes/user/EditService.svelte +++ b/frontend/src/routes/user/EditService.svelte @@ -43,7 +43,7 @@
- {t('edit_service',serviceName)} + {t('edit_service',{name:(serviceName||"")})} {#if service.name || !serviceName} diff --git a/translations/src/main/resources/de.json b/translations/src/main/resources/de.json index c6eae8f..e35faf6 100644 --- a/translations/src/main/resources/de.json +++ b/translations/src/main/resources/de.json @@ -70,7 +70,7 @@ "edit_object" : "{object} bearbeiten", "editing": "Nutzer {0} bearbeiten", "edit_password": "Passwort ändern", - "edit_service": "Login-Service \"{0}\" bearbeiten", + "edit_service": "Login-Service \"{name}\" bearbeiten", "email": "E-Mail", "email_or_username": "Email oder Nutzername", "end": "Ende", From bfe87f53a80798b3cdd6388ba2cbc40f7b696b8b Mon Sep 17 00:00:00 2001 From: Stephan Richter Date: Fri, 12 Sep 2025 00:38:28 +0200 Subject: [PATCH 3/3] refactored ModuleRegistry to singleton system Signed-off-by: Stephan Richter --- .../umbrella/backend/Application.java | 40 +++++---- .../umbrella/bookmarks/BookmarkApi.java | 13 +-- .../umbrella/company/CompanyModule.java | 6 +- .../srsoftware/umbrella/core/BaseHandler.java | 45 ---------- .../umbrella/core/ModuleRegistry.java | 85 ++++++++++--------- .../umbrella/documents/DocumentApi.java | 6 +- .../de/srsoftware/umbrella/items/ItemApi.java | 7 +- .../umbrella/legacy/CompanyLegacy.java | 9 +- .../umbrella/legacy/NotesLegacy.java | 8 +- .../umbrella/legacy/ProjectLegacy.java | 8 +- .../umbrella/legacy/TaskLegacy.java | 9 +- .../umbrella/legacy/UserLegacy.java | 5 +- .../umbrella/markdown/MarkdownApi.java | 6 +- .../umbrella/message/MessageSystem.java | 7 +- .../srsoftware/umbrella/notes/NoteModule.java | 6 +- .../umbrella/project/ProjectModule.java | 6 +- .../srsoftware/umbrella/tags/TagModule.java | 6 +- .../srsoftware/umbrella/task/TaskModule.java | 6 +- .../srsoftware/umbrella/time/TimeModule.java | 6 +- .../umbrella/translations/Translations.java | 4 +- .../srsoftware/umbrella/user/Constants.java | 4 +- .../srsoftware/umbrella/user/UserModule.java | 6 +- .../srsoftware/umbrella/web/WebHandler.java | 5 +- 23 files changed, 140 insertions(+), 163 deletions(-) diff --git a/backend/src/main/java/de/srsoftware/umbrella/backend/Application.java b/backend/src/main/java/de/srsoftware/umbrella/backend/Application.java index 3e59a18..1a490ad 100644 --- a/backend/src/main/java/de/srsoftware/umbrella/backend/Application.java +++ b/backend/src/main/java/de/srsoftware/umbrella/backend/Application.java @@ -10,7 +10,6 @@ import de.srsoftware.configuration.JsonConfig; import de.srsoftware.tools.ColorLogger; import de.srsoftware.umbrella.bookmarks.BookmarkApi; import de.srsoftware.umbrella.company.CompanyModule; -import de.srsoftware.umbrella.core.ModuleRegistry; import de.srsoftware.umbrella.core.Util; import de.srsoftware.umbrella.core.exceptions.UmbrellaException; import de.srsoftware.umbrella.documents.DocumentApi; @@ -59,26 +58,25 @@ public class Application { var server = HttpServer.create(new InetSocketAddress(port), 0); - var registry = new ModuleRegistry(); - new Translations(registry).bindPath("/api/translations").on(server); - new MessageSystem(registry,config); - new UserModule(registry,config).bindPath("/api/user").on(server); - new TagModule(registry,config).bindPath("/api/tags").on(server); - new BookmarkApi(registry,config).bindPath("/api/bookmark").on(server); - new CompanyModule(registry, config).bindPath("/api/company").on(server); - new CompanyLegacy(registry, config).bindPath("/legacy/company").on(server); - new DocumentApi(registry, config).bindPath("/api/document").on(server); - new ItemApi(registry, config).bindPath("/api/items").on(server); - new UserLegacy(registry,config).bindPath("/legacy/user").on(server); - new NotesLegacy(registry,config).bindPath("/legacy/notes").on(server); - new MarkdownApi(registry).bindPath("/api/markdown").on(server); - new NoteModule(registry,config).bindPath("/api/notes").on(server); - new ProjectModule(registry, config).bindPath("/api/project").on(server); - new ProjectLegacy(registry,config).bindPath("/legacy/project").on(server); - new TaskModule(registry, config).bindPath("/api/task").on(server); - new TaskLegacy(registry, config).bindPath("/legacy/task").on(server); - new TimeModule(registry, config).bindPath("/api/time").on(server); - new WebHandler(registry).bindPath("/").on(server); + new Translations().bindPath("/api/translations").on(server); + new MessageSystem(config); + new UserModule(config).bindPath("/api/user").on(server); + new TagModule(config).bindPath("/api/tags").on(server); + new BookmarkApi(config).bindPath("/api/bookmark").on(server); + new CompanyModule(config).bindPath("/api/company").on(server); + new CompanyLegacy(config).bindPath("/legacy/company").on(server); + new DocumentApi(config).bindPath("/api/document").on(server); + new ItemApi(config).bindPath("/api/items").on(server); + new UserLegacy(config).bindPath("/legacy/user").on(server); + new NotesLegacy(config).bindPath("/legacy/notes").on(server); + new MarkdownApi().bindPath("/api/markdown").on(server); + new NoteModule(config).bindPath("/api/notes").on(server); + new ProjectModule(config).bindPath("/api/project").on(server); + new ProjectLegacy(config).bindPath("/legacy/project").on(server); + new TaskModule(config).bindPath("/api/task").on(server); + new TaskLegacy().bindPath("/legacy/task").on(server); + new TimeModule(config).bindPath("/api/time").on(server); + new WebHandler().bindPath("/").on(server); server.setExecutor(Executors.newFixedThreadPool(threads)); server.start(); diff --git a/bookmark/src/main/java/de/srsoftware/umbrella/bookmarks/BookmarkApi.java b/bookmark/src/main/java/de/srsoftware/umbrella/bookmarks/BookmarkApi.java index 311d58f..6be917a 100644 --- a/bookmark/src/main/java/de/srsoftware/umbrella/bookmarks/BookmarkApi.java +++ b/bookmark/src/main/java/de/srsoftware/umbrella/bookmarks/BookmarkApi.java @@ -29,10 +29,11 @@ import org.json.JSONArray; public class BookmarkApi extends BaseHandler implements BookmarkService { private final BookmarkDb db; - public BookmarkApi(ModuleRegistry registry, Configuration config) { - super(registry); + public BookmarkApi(Configuration config) { + super(); var dbFile = config.get(CONFIG_DATABASE).orElseThrow(() -> missingFieldException(CONFIG_DATABASE)); db = new SqliteDb(connect(dbFile)); + ModuleRegistry.add(this); } @Override @@ -40,7 +41,7 @@ public class BookmarkApi extends BaseHandler implements BookmarkService { addCors(ex); try { Optional token = SessionToken.from(ex).map(Token::of); - var user = userService().loadUser(token); + var user = ModuleRegistry.userService().loadUser(token); if (user.isEmpty()) return unauthorized(ex); var head = path.pop(); return switch (head) { @@ -60,7 +61,7 @@ public class BookmarkApi extends BaseHandler implements BookmarkService { private boolean getBookmark(UmbrellaUser user, long id, HttpExchange ex) throws IOException { var bookmark = db.load(id,user.id()); - tagService().getTags(BOOKMARK, id, user).forEach(bookmark.tags()::add); + ModuleRegistry.tagService().getTags(BOOKMARK, id, user).forEach(bookmark.tags()::add); return sendContent(ex,bookmark); } @@ -69,7 +70,7 @@ public class BookmarkApi extends BaseHandler implements BookmarkService { addCors(ex); try { Optional token = SessionToken.from(ex).map(Token::of); - var user = userService().loadUser(token); + var user = ModuleRegistry.userService().loadUser(token); if (user.isEmpty()) return unauthorized(ex); var head = path.pop(); return switch (head) { @@ -117,7 +118,7 @@ public class BookmarkApi extends BaseHandler implements BookmarkService { if (json.has(TAGS) && json.get(TAGS) instanceof JSONArray tagList){ var list = tagList.toList().stream().map(Object::toString).toList(); - tagService().save(BOOKMARK,bookmark.urlId(), userList, list); + ModuleRegistry.tagService().save(BOOKMARK,bookmark.urlId(), userList, list); } return sendContent(ex,bookmark); } diff --git a/company/src/main/java/de/srsoftware/umbrella/company/CompanyModule.java b/company/src/main/java/de/srsoftware/umbrella/company/CompanyModule.java index fdccf89..b70f76e 100644 --- a/company/src/main/java/de/srsoftware/umbrella/company/CompanyModule.java +++ b/company/src/main/java/de/srsoftware/umbrella/company/CompanyModule.java @@ -4,6 +4,7 @@ package de.srsoftware.umbrella.company; import static de.srsoftware.umbrella.company.Constants.CONFIG_DATABASE; import static de.srsoftware.umbrella.core.ConnectionProvider.connect; import static de.srsoftware.umbrella.core.Constants.*; +import static de.srsoftware.umbrella.core.ModuleRegistry.*; import static de.srsoftware.umbrella.core.Paths.LIST; import static de.srsoftware.umbrella.core.Paths.SEARCH; import static de.srsoftware.umbrella.core.Util.mapValues; @@ -26,10 +27,11 @@ public class CompanyModule extends BaseHandler implements CompanyService { private final CompanyDb companyDb; - public CompanyModule(ModuleRegistry registry, Configuration config) throws UmbrellaException { - super(registry); + public CompanyModule(Configuration config) throws UmbrellaException { + super(); var dbFile = config.get(CONFIG_DATABASE).orElseThrow(() -> missingFieldException(CONFIG_DATABASE)); companyDb = new SqliteDb(connect(dbFile)); + ModuleRegistry.add(this); } private boolean deleteCompany(long companyId, UmbrellaUser user, HttpExchange ex) throws IOException { diff --git a/core/src/main/java/de/srsoftware/umbrella/core/BaseHandler.java b/core/src/main/java/de/srsoftware/umbrella/core/BaseHandler.java index 10124a8..bfd43b9 100644 --- a/core/src/main/java/de/srsoftware/umbrella/core/BaseHandler.java +++ b/core/src/main/java/de/srsoftware/umbrella/core/BaseHandler.java @@ -17,13 +17,8 @@ import java.util.List; public abstract class BaseHandler extends PathHandler { - private final ModuleRegistry registry; - public record Page(String mime, byte[] bytes){} - public BaseHandler(ModuleRegistry registry){ - this.registry = registry.add(this); - } public HttpExchange addCors(HttpExchange ex){ var headers = ex.getRequestHeaders(); @@ -41,23 +36,11 @@ public abstract class BaseHandler extends PathHandler { return ex; } - public CompanyService companyService(){ - return registry.companyService(); - } - - public DocumentService documentService(){ - return registry.documentService(); - } - @Override public boolean doOptions(Path path, HttpExchange ex) throws IOException { return ok(addCors(ex)); } - public ItemService itemService(){ - return registry.itemService(); - } - public boolean load(Path path, HttpExchange ex) throws IOException { try { var doc = load(path.toString()); @@ -84,43 +67,15 @@ public abstract class BaseHandler extends PathHandler { } } - public NoteService noteService(){ - return registry.noteService(); - } - public boolean ok(HttpExchange ex) throws IOException { return sendEmptyResponse(HTTP_OK,ex); } - public PostBox postBox() { - return registry.postBox(); - } - - public ProjectService projectService(){ - return registry.projectService(); - } - public boolean send(HttpExchange ex, UmbrellaException e) throws IOException { return sendContent(ex,e.statusCode(),e.getMessage()); } - public TagService tagService(){ - return registry.tagService(); - } - - public TaskService taskService(){ - return registry.taskService(); - } - - public Translator translator(){ - return registry.translator(); - } - public boolean unauthorized(HttpExchange ex) throws IOException { return sendEmptyResponse(HTTP_UNAUTHORIZED,ex); } - - public UserService userService(){ - return registry.userService(); - } } diff --git a/core/src/main/java/de/srsoftware/umbrella/core/ModuleRegistry.java b/core/src/main/java/de/srsoftware/umbrella/core/ModuleRegistry.java index 723e516..7329433 100644 --- a/core/src/main/java/de/srsoftware/umbrella/core/ModuleRegistry.java +++ b/core/src/main/java/de/srsoftware/umbrella/core/ModuleRegistry.java @@ -19,78 +19,79 @@ public class ModuleRegistry { private Translator translator; private UserService userService; + private static final ModuleRegistry singleton = new ModuleRegistry(); + private ModuleRegistry(){} - public ModuleRegistry add(Object service) { + public static void add(Object service) { switch (service) { - case BookmarkService bs: bookmarkService = bs; break; - case CompanyService cs: companyService = cs; break; - case DocumentService ds: documentService = ds; break; - case ItemService is: itemService = is; break; - case MarkdownService ms: markdownService = ms; break; - case NoteService ns: noteService = ns; break; - case PostBox pb: postBox = pb; break; - case ProjectService ps: projectService = ps; break; - case TagService ts: tagService = ts; break; - case TaskService ts: taskService = ts; break; - case TimeService ts: timeService = ts; break; - case Translator tr: translator = tr; break; - case UserService us: userService = us; break; + case BookmarkService bs: singleton.bookmarkService = bs; break; + case CompanyService cs: singleton.companyService = cs; break; + case DocumentService ds: singleton.documentService = ds; break; + case ItemService is: singleton.itemService = is; break; + case MarkdownService ms: singleton.markdownService = ms; break; + case NoteService ns: singleton.noteService = ns; break; + case PostBox pb: singleton.postBox = pb; break; + case ProjectService ps: singleton.projectService = ps; break; + case TagService ts: singleton.tagService = ts; break; + case TaskService ts: singleton.taskService = ts; break; + case TimeService ts: singleton.timeService = ts; break; + case Translator tr: singleton.translator = tr; break; + case UserService us: singleton.userService = us; break; case null: break; - default: System.getLogger(getClass().getSimpleName()).log(System.Logger.Level.WARNING,"Trying to add untracked class {0} to {1}",service.getClass().getSimpleName(),getClass().getSimpleName()); + default: System.getLogger(ModuleRegistry.class.getSimpleName()).log(System.Logger.Level.WARNING,"Trying to add untracked class {0}",service.getClass().getSimpleName()); } - return this; } - public BookmarkService bookmarkService(){ - return bookmarkService; + public static BookmarkService bookmarkService(){ + return singleton.bookmarkService; } - public CompanyService companyService(){ - return companyService; + public static CompanyService companyService(){ + return singleton.companyService; } - public DocumentService documentService(){ - return documentService; + public static DocumentService documentService(){ + return singleton.documentService; } - public ItemService itemService(){ - return itemService; + public static ItemService itemService(){ + return singleton.itemService; } - public MarkdownService markdownService(){ - return markdownService; + public static MarkdownService markdownService(){ + return singleton.markdownService; } - public NoteService noteService(){ - return noteService; + public static NoteService noteService(){ + return singleton.noteService; } - public PostBox postBox() { - return postBox; + public static PostBox postBox() { + return singleton.postBox; } - public ProjectService projectService(){ - return projectService; + public static ProjectService projectService(){ + return singleton.projectService; } - public TagService tagService(){ - return tagService; + public static TagService tagService(){ + return singleton.tagService; } - public TaskService taskService(){ - return taskService; + public static TaskService taskService(){ + return singleton.taskService; } - public TimeService timeService(){ - return timeService; + public static TimeService timeService(){ + return singleton.timeService; } - public Translator translator(){ - return translator; + public static Translator translator(){ + return singleton.translator; } - public UserService userService(){ - return userService; + public static UserService userService(){ + return singleton.userService; } } diff --git a/documents/src/main/java/de/srsoftware/umbrella/documents/DocumentApi.java b/documents/src/main/java/de/srsoftware/umbrella/documents/DocumentApi.java index f4e617d..71f3812 100644 --- a/documents/src/main/java/de/srsoftware/umbrella/documents/DocumentApi.java +++ b/documents/src/main/java/de/srsoftware/umbrella/documents/DocumentApi.java @@ -22,6 +22,7 @@ import static de.srsoftware.umbrella.core.Constants.FIELD_PRICE_FORMAT; import static de.srsoftware.umbrella.core.Constants.FIELD_TIME_ID; import static de.srsoftware.umbrella.core.Constants.FIELD_TYPE; import static de.srsoftware.umbrella.core.Constants.FIELD_UNIT; +import static de.srsoftware.umbrella.core.ModuleRegistry.*; import static de.srsoftware.umbrella.core.Paths.*; import static de.srsoftware.umbrella.core.ResponseCode.HTTP_UNPROCESSABLE; import static de.srsoftware.umbrella.core.Util.mapValues; @@ -76,11 +77,12 @@ public class DocumentApi extends BaseHandler implements DocumentService { private final Configuration config; private final DocumentDb db; - public DocumentApi(ModuleRegistry registry, Configuration config) throws UmbrellaException { - super(registry); + public DocumentApi(Configuration config) throws UmbrellaException { + super(); this.config = config; var dbFile = config.get(CONFIG_DATABASE).orElseThrow(() -> missingFieldException(CONFIG_DATABASE)); db = new SqliteDb(connect(dbFile)); + ModuleRegistry.add(this); Optional templates = config.get(CONFIG_TEMPLATES); if (templates.isEmpty()) throw missingFieldException(CONFIG_TEMPLATES); diff --git a/items/src/main/java/de/srsoftware/umbrella/items/ItemApi.java b/items/src/main/java/de/srsoftware/umbrella/items/ItemApi.java index a6e585c..db07ef5 100644 --- a/items/src/main/java/de/srsoftware/umbrella/items/ItemApi.java +++ b/items/src/main/java/de/srsoftware/umbrella/items/ItemApi.java @@ -3,6 +3,8 @@ package de.srsoftware.umbrella.items; import static de.srsoftware.umbrella.core.ConnectionProvider.connect; import static de.srsoftware.umbrella.core.Constants.*; +import static de.srsoftware.umbrella.core.ModuleRegistry.companyService; +import static de.srsoftware.umbrella.core.ModuleRegistry.userService; import static de.srsoftware.umbrella.core.Paths.LIST; import static de.srsoftware.umbrella.core.exceptions.UmbrellaException.forbidden; import static de.srsoftware.umbrella.core.exceptions.UmbrellaException.missingFieldException; @@ -28,10 +30,11 @@ public class ItemApi extends BaseHandler implements ItemService { private final ItemDb itemDb; - public ItemApi(ModuleRegistry registry, Configuration config) throws UmbrellaException { - super(registry); + public ItemApi(Configuration config) throws UmbrellaException { + super(); var dbFile = config.get(CONFIG_DATABASE).orElseThrow(() -> missingFieldException(CONFIG_DATABASE)); itemDb = new SqliteDb(connect(dbFile)); + ModuleRegistry.add(this); } @Override diff --git a/legacy/src/main/java/de/srsoftware/umbrella/legacy/CompanyLegacy.java b/legacy/src/main/java/de/srsoftware/umbrella/legacy/CompanyLegacy.java index 7ec04f8..f649efd 100644 --- a/legacy/src/main/java/de/srsoftware/umbrella/legacy/CompanyLegacy.java +++ b/legacy/src/main/java/de/srsoftware/umbrella/legacy/CompanyLegacy.java @@ -4,6 +4,8 @@ package de.srsoftware.umbrella.legacy; import static de.srsoftware.tools.Optionals.nullable; import static de.srsoftware.umbrella.core.Constants.TOKEN; +import static de.srsoftware.umbrella.core.ModuleRegistry.companyService; +import static de.srsoftware.umbrella.core.ModuleRegistry.userService; import static de.srsoftware.umbrella.core.Paths.JSON; import static de.srsoftware.umbrella.core.Util.mapValues; @@ -20,11 +22,10 @@ import java.util.Map; import java.util.Optional; public class CompanyLegacy extends BaseHandler { - private final Configuration config; - public CompanyLegacy(ModuleRegistry registry, Configuration config) { - super(registry); - this.config = config.subset("umbrella.modules").orElseThrow(() -> new RuntimeException("Missing configuration: umbrella.modules")); + public CompanyLegacy(Configuration config) { + super(); + ModuleRegistry.add(this); } @Override diff --git a/legacy/src/main/java/de/srsoftware/umbrella/legacy/NotesLegacy.java b/legacy/src/main/java/de/srsoftware/umbrella/legacy/NotesLegacy.java index 388ceef..17b7958 100644 --- a/legacy/src/main/java/de/srsoftware/umbrella/legacy/NotesLegacy.java +++ b/legacy/src/main/java/de/srsoftware/umbrella/legacy/NotesLegacy.java @@ -5,6 +5,8 @@ package de.srsoftware.umbrella.legacy; import static de.srsoftware.tools.Optionals.nullable; import static de.srsoftware.umbrella.core.Constants.TOKEN; import static de.srsoftware.umbrella.core.Constants.URI; +import static de.srsoftware.umbrella.core.ModuleRegistry.noteService; +import static de.srsoftware.umbrella.core.ModuleRegistry.userService; import static de.srsoftware.umbrella.core.Util.markdown; import static de.srsoftware.umbrella.core.exceptions.UmbrellaException.invalidFieldException; @@ -24,11 +26,9 @@ import java.util.Map; import java.util.Optional; public class NotesLegacy extends BaseHandler { - private final Configuration config; - public NotesLegacy(ModuleRegistry registry, Configuration config) { - super(registry); - this.config = config.subset("umbrella.modules").orElseThrow(() -> new RuntimeException("Missing configuration: umbrella.modules")); + public NotesLegacy(Configuration config) { + super(); } @Override diff --git a/legacy/src/main/java/de/srsoftware/umbrella/legacy/ProjectLegacy.java b/legacy/src/main/java/de/srsoftware/umbrella/legacy/ProjectLegacy.java index 95ef120..2534758 100644 --- a/legacy/src/main/java/de/srsoftware/umbrella/legacy/ProjectLegacy.java +++ b/legacy/src/main/java/de/srsoftware/umbrella/legacy/ProjectLegacy.java @@ -4,6 +4,8 @@ package de.srsoftware.umbrella.legacy; import static de.srsoftware.tools.Optionals.nullable; import static de.srsoftware.umbrella.core.Constants.*; +import static de.srsoftware.umbrella.core.ModuleRegistry.projectService; +import static de.srsoftware.umbrella.core.ModuleRegistry.userService; import static de.srsoftware.umbrella.core.Paths.JSON; import static de.srsoftware.umbrella.core.Util.mapValues; @@ -20,11 +22,9 @@ import java.util.Map; import java.util.Optional; public class ProjectLegacy extends BaseHandler { - private final Configuration config; - public ProjectLegacy(ModuleRegistry registry, Configuration config) { - super(registry); - this.config = config.subset("umbrella.modules").orElseThrow(() -> new RuntimeException("Missing configuration: umbrella.modules")); + public ProjectLegacy(Configuration config) { + super(); } @Override diff --git a/legacy/src/main/java/de/srsoftware/umbrella/legacy/TaskLegacy.java b/legacy/src/main/java/de/srsoftware/umbrella/legacy/TaskLegacy.java index 12e3709..7fab484 100644 --- a/legacy/src/main/java/de/srsoftware/umbrella/legacy/TaskLegacy.java +++ b/legacy/src/main/java/de/srsoftware/umbrella/legacy/TaskLegacy.java @@ -6,12 +6,13 @@ package de.srsoftware.umbrella.legacy; import static de.srsoftware.tools.Optionals.nullable; import static de.srsoftware.umbrella.core.Constants.DESCRIPTION; import static de.srsoftware.umbrella.core.Constants.TOKEN; +import static de.srsoftware.umbrella.core.ModuleRegistry.taskService; +import static de.srsoftware.umbrella.core.ModuleRegistry.userService; import static de.srsoftware.umbrella.core.Paths.JSON; import static de.srsoftware.umbrella.core.Util.mapValues; import static de.srsoftware.umbrella.core.exceptions.UmbrellaException.unprocessable; import com.sun.net.httpserver.HttpExchange; -import de.srsoftware.configuration.Configuration; import de.srsoftware.tools.Path; import de.srsoftware.tools.SessionToken; import de.srsoftware.umbrella.core.BaseHandler; @@ -24,11 +25,9 @@ import java.util.Map; import java.util.Optional; public class TaskLegacy extends BaseHandler { - private final Configuration config; - public TaskLegacy(ModuleRegistry registry, Configuration config) { - super(registry); - this.config = config.subset("umbrella.modules").orElseThrow(() -> new RuntimeException("Missing configuration: umbrella.modules")); + public TaskLegacy() { + super(); } @Override diff --git a/legacy/src/main/java/de/srsoftware/umbrella/legacy/UserLegacy.java b/legacy/src/main/java/de/srsoftware/umbrella/legacy/UserLegacy.java index 734bb8b..02c9bc8 100644 --- a/legacy/src/main/java/de/srsoftware/umbrella/legacy/UserLegacy.java +++ b/legacy/src/main/java/de/srsoftware/umbrella/legacy/UserLegacy.java @@ -5,6 +5,7 @@ import static de.srsoftware.tools.MimeType.MIME_FORM_URL; import static de.srsoftware.tools.Query.decode; import static de.srsoftware.umbrella.core.Constants.*; import static de.srsoftware.umbrella.core.Constants.TOKEN; +import static de.srsoftware.umbrella.core.ModuleRegistry.userService; import static de.srsoftware.umbrella.core.Paths.*; import static de.srsoftware.umbrella.core.Util.request; import static de.srsoftware.umbrella.user.Paths.*; @@ -34,8 +35,8 @@ public class UserLegacy extends BaseHandler { private final Configuration config; private final String messageUrl; - public UserLegacy(ModuleRegistry registry, Configuration config) { - super(registry); + public UserLegacy(Configuration config) { + super(); this.config = config.subset("umbrella.modules").orElseThrow(() -> new RuntimeException("Missing configuration: umbrella.modules")); this.messageUrl = null; } diff --git a/markdown/src/main/java/de/srsoftware/umbrella/markdown/MarkdownApi.java b/markdown/src/main/java/de/srsoftware/umbrella/markdown/MarkdownApi.java index 9dbea31..b0d3ced 100644 --- a/markdown/src/main/java/de/srsoftware/umbrella/markdown/MarkdownApi.java +++ b/markdown/src/main/java/de/srsoftware/umbrella/markdown/MarkdownApi.java @@ -2,6 +2,7 @@ package de.srsoftware.umbrella.markdown; import static de.srsoftware.tools.MimeType.MIME_HTML; +import static de.srsoftware.umbrella.core.ModuleRegistry.userService; import com.sun.net.httpserver.HttpExchange; import de.srsoftware.tools.Path; @@ -18,8 +19,9 @@ import java.util.Optional; public class MarkdownApi extends BaseHandler implements MarkdownService { - public MarkdownApi(ModuleRegistry registry) { - super(registry); + public MarkdownApi() { + super(); + ModuleRegistry.add(this); } @Override diff --git a/messages/src/main/java/de/srsoftware/umbrella/message/MessageSystem.java b/messages/src/main/java/de/srsoftware/umbrella/message/MessageSystem.java index 8c86b35..6df9e4e 100644 --- a/messages/src/main/java/de/srsoftware/umbrella/message/MessageSystem.java +++ b/messages/src/main/java/de/srsoftware/umbrella/message/MessageSystem.java @@ -32,7 +32,6 @@ import java.util.function.BiFunction; public class MessageSystem implements PostBox { public static final System.Logger LOG = System.getLogger(MessageSystem.class.getSimpleName()); private final Timer timer = new Timer(); - private final ModuleRegistry registry; private record Receiver(User user, de.srsoftware.umbrella.core.model.Message message){} @@ -72,7 +71,7 @@ public class MessageSystem implements PostBox { private String debugAddress; private final HashMap> exceptions = new HashMap<>(); - public MessageSystem(ModuleRegistry moduleRegistry, Configuration config) throws UmbrellaException { + public MessageSystem(Configuration config) throws UmbrellaException { var dbFile = config.get(CONFIG_DB).orElseThrow(() -> missingConfigException(CONFIG_DB)); db = new SqliteMessageDb(connect(dbFile)); debugAddress = config.get(DEBUG_ADDREESS).map(Object::toString).orElse(null); @@ -81,7 +80,7 @@ public class MessageSystem implements PostBox { user = config.get(CONFIG_SMTP_USER).map(Object::toString).orElseThrow(() -> new RuntimeException("umbrella.modules.message.smtp.user not configured!")); pass = config.get(CONFIG_SMTP_PASS).map(Object::toString).orElseThrow(() -> new RuntimeException("umbrella.modules.message.smtp.pass not configured!")); from = user; - registry = moduleRegistry.add(this); + ModuleRegistry.add(this); new SubmissionTask(8).schedule(); new SubmissionTask(10).schedule(); new SubmissionTask(12).schedule(); @@ -117,7 +116,7 @@ public class MessageSystem implements PostBox { var date = new Date(); for (var receiver : dueRecipients){ - BiFunction,String> translateFunction = (text,fills) -> registry.translator().translate(receiver.language(),text,fills); + BiFunction,String> translateFunction = (text,fills) -> ModuleRegistry.translator().translate(receiver.language(),text,fills); var combined = new CombinedMessage("Collected messages",translateFunction); var envelopes = queue.stream().filter(env -> env.isFor(receiver)).toList(); diff --git a/notes/src/main/java/de/srsoftware/umbrella/notes/NoteModule.java b/notes/src/main/java/de/srsoftware/umbrella/notes/NoteModule.java index 0b7fe59..6425dc5 100644 --- a/notes/src/main/java/de/srsoftware/umbrella/notes/NoteModule.java +++ b/notes/src/main/java/de/srsoftware/umbrella/notes/NoteModule.java @@ -4,6 +4,7 @@ package de.srsoftware.umbrella.notes; import static de.srsoftware.umbrella.core.ConnectionProvider.connect; import static de.srsoftware.umbrella.core.Constants.*; import static de.srsoftware.umbrella.core.Constants.FULLTEXT; +import static de.srsoftware.umbrella.core.ModuleRegistry.userService; import static de.srsoftware.umbrella.core.Paths.SEARCH; import static de.srsoftware.umbrella.core.ResponseCode.HTTP_UNPROCESSABLE; import static de.srsoftware.umbrella.core.Util.mapValues; @@ -31,10 +32,11 @@ import java.util.stream.Collectors; public class NoteModule extends BaseHandler implements NoteService { private final NotesDb notesDb; - public NoteModule(ModuleRegistry registry, Configuration config) { - super(registry); + public NoteModule(Configuration config) { + super(); var dbFile = config.get(CONFIG_DATABASE).orElseThrow(() -> missingFieldException(CONFIG_DATABASE)); notesDb = new SqliteDb(connect(dbFile)); + ModuleRegistry.add(this); } @Override diff --git a/project/src/main/java/de/srsoftware/umbrella/project/ProjectModule.java b/project/src/main/java/de/srsoftware/umbrella/project/ProjectModule.java index 3973ff7..94972e3 100644 --- a/project/src/main/java/de/srsoftware/umbrella/project/ProjectModule.java +++ b/project/src/main/java/de/srsoftware/umbrella/project/ProjectModule.java @@ -3,6 +3,7 @@ package de.srsoftware.umbrella.project; import static de.srsoftware.umbrella.core.ConnectionProvider.connect; import static de.srsoftware.umbrella.core.Constants.*; +import static de.srsoftware.umbrella.core.ModuleRegistry.*; import static de.srsoftware.umbrella.core.Paths.LIST; import static de.srsoftware.umbrella.core.Paths.SEARCH; import static de.srsoftware.umbrella.core.Util.mapValues; @@ -32,10 +33,11 @@ public class ProjectModule extends BaseHandler implements ProjectService { private final ProjectDb projectDb; - public ProjectModule(ModuleRegistry registry, Configuration config) throws UmbrellaException { - super(registry); + public ProjectModule(Configuration config) throws UmbrellaException { + super(); var dbFile = config.get(CONFIG_DATABASE).orElseThrow(() -> missingFieldException(CONFIG_DATABASE)); projectDb = new SqliteDb(connect(dbFile)); + ModuleRegistry.add(this); } private void addMember(Project project, long userId) { diff --git a/tags/src/main/java/de/srsoftware/umbrella/tags/TagModule.java b/tags/src/main/java/de/srsoftware/umbrella/tags/TagModule.java index bac3108..b1e4b57 100644 --- a/tags/src/main/java/de/srsoftware/umbrella/tags/TagModule.java +++ b/tags/src/main/java/de/srsoftware/umbrella/tags/TagModule.java @@ -3,6 +3,7 @@ package de.srsoftware.umbrella.tags; import static de.srsoftware.umbrella.core.ConnectionProvider.connect; import static de.srsoftware.umbrella.core.Constants.*; +import static de.srsoftware.umbrella.core.ModuleRegistry.userService; import static de.srsoftware.umbrella.core.ResponseCode.HTTP_UNPROCESSABLE; import static de.srsoftware.umbrella.core.exceptions.UmbrellaException.missingFieldException; import static de.srsoftware.umbrella.core.exceptions.UmbrellaException.unprocessable; @@ -26,11 +27,12 @@ import org.json.JSONArray; public class TagModule extends BaseHandler implements TagService { private final SqliteDb tagDb; - public TagModule(ModuleRegistry registry, Configuration config) { - super(registry); + public TagModule(Configuration config) { + super(); var tagDbFile = config.get(CONFIG_DATABASE).orElseThrow(() -> missingFieldException(CONFIG_DATABASE)); var bmDbFile = config.get(de.srsoftware.umbrella.bookmarks.Constants.CONFIG_DATABASE).orElseThrow(() -> missingFieldException(de.srsoftware.umbrella.bookmarks.Constants.CONFIG_DATABASE)); tagDb = new SqliteDb(connect(tagDbFile),connect(bmDbFile)); + ModuleRegistry.add(this); } @Override diff --git a/task/src/main/java/de/srsoftware/umbrella/task/TaskModule.java b/task/src/main/java/de/srsoftware/umbrella/task/TaskModule.java index eb42bd8..5b1e4eb 100644 --- a/task/src/main/java/de/srsoftware/umbrella/task/TaskModule.java +++ b/task/src/main/java/de/srsoftware/umbrella/task/TaskModule.java @@ -5,6 +5,7 @@ import static de.srsoftware.tools.Optionals.is0; import static de.srsoftware.tools.Optionals.isSet; import static de.srsoftware.umbrella.core.ConnectionProvider.connect; import static de.srsoftware.umbrella.core.Constants.*; +import static de.srsoftware.umbrella.core.ModuleRegistry.*; import static de.srsoftware.umbrella.core.Paths.*; import static de.srsoftware.umbrella.core.ResponseCode.HTTP_NOT_IMPLEMENTED; import static de.srsoftware.umbrella.core.Util.mapValues; @@ -37,10 +38,11 @@ public class TaskModule extends BaseHandler implements TaskService { private final TaskDb taskDb; - public TaskModule(ModuleRegistry registry, Configuration config) throws UmbrellaException { - super(registry); + public TaskModule(Configuration config) throws UmbrellaException { + super(); var dbFile = config.get(CONFIG_DATABASE).orElseThrow(() -> missingFieldException(CONFIG_DATABASE)); taskDb = new SqliteDb(connect(dbFile)); + ModuleRegistry.add(this); } private void addMember(Task task, long userId) { diff --git a/time/src/main/java/de/srsoftware/umbrella/time/TimeModule.java b/time/src/main/java/de/srsoftware/umbrella/time/TimeModule.java index e852fc3..71f20ea 100644 --- a/time/src/main/java/de/srsoftware/umbrella/time/TimeModule.java +++ b/time/src/main/java/de/srsoftware/umbrella/time/TimeModule.java @@ -3,6 +3,7 @@ package de.srsoftware.umbrella.time; import static de.srsoftware.umbrella.core.ConnectionProvider.connect; import static de.srsoftware.umbrella.core.Constants.*; +import static de.srsoftware.umbrella.core.ModuleRegistry.*; import static de.srsoftware.umbrella.core.Paths.*; import static de.srsoftware.umbrella.core.Util.mapValues; import static de.srsoftware.umbrella.core.exceptions.UmbrellaException.*; @@ -27,10 +28,11 @@ public class TimeModule extends BaseHandler implements TimeService { private final TimeDb timeDb; - public TimeModule(ModuleRegistry registry, Configuration config) throws UmbrellaException { - super(registry); + public TimeModule( Configuration config) throws UmbrellaException { + super(); var dbFile = config.get(CONFIG_DATABASE).orElseThrow(() -> missingFieldException(CONFIG_DATABASE)); timeDb = new SqliteDb(connect(dbFile)); + ModuleRegistry.add(this); } diff --git a/translations/src/main/java/de/srsoftware/umbrella/translations/Translations.java b/translations/src/main/java/de/srsoftware/umbrella/translations/Translations.java index 0f2ab66..a874f56 100644 --- a/translations/src/main/java/de/srsoftware/umbrella/translations/Translations.java +++ b/translations/src/main/java/de/srsoftware/umbrella/translations/Translations.java @@ -21,8 +21,8 @@ public class Translations extends PathHandler implements Translator { private HashMap translations = new HashMap<>(); - public Translations(ModuleRegistry registry) { - registry.add(this); + public Translations() { + ModuleRegistry.add(this); } @Override diff --git a/user/src/main/java/de/srsoftware/umbrella/user/Constants.java b/user/src/main/java/de/srsoftware/umbrella/user/Constants.java index 3988cb2..47ec123 100644 --- a/user/src/main/java/de/srsoftware/umbrella/user/Constants.java +++ b/user/src/main/java/de/srsoftware/umbrella/user/Constants.java @@ -35,8 +35,8 @@ public class Constants { public static final String SCOPE = "scope"; public static final String SERVICE_ID = "service_id"; - public static final String TABLE_LOGIN_SERVICES = "user_login_services"; - public static final String TABLE_SERVICE_IDS_USERS = "user_service_ids_users"; + public static final String TABLE_LOGIN_SERVICES = "login_services"; + public static final String TABLE_SERVICE_IDS_USERS = "service_ids_users"; public static final String TABLE_TOKENS = "tokens"; public static final String TABLE_TOKEN_USES = "token_uses"; public static final String TABLE_USERS = "users"; diff --git a/user/src/main/java/de/srsoftware/umbrella/user/UserModule.java b/user/src/main/java/de/srsoftware/umbrella/user/UserModule.java index 19a54ec..ec2bf47 100644 --- a/user/src/main/java/de/srsoftware/umbrella/user/UserModule.java +++ b/user/src/main/java/de/srsoftware/umbrella/user/UserModule.java @@ -8,6 +8,7 @@ import static de.srsoftware.umbrella.core.ConnectionProvider.connect; import static de.srsoftware.umbrella.core.Constants.*; import static de.srsoftware.umbrella.core.Constants.CODE; import static de.srsoftware.umbrella.core.Constants.TOKEN; +import static de.srsoftware.umbrella.core.ModuleRegistry.postBox; import static de.srsoftware.umbrella.core.Paths.*; import static de.srsoftware.umbrella.core.ResponseCode.*; import static de.srsoftware.umbrella.core.ResponseCode.HTTP_SERVER_ERROR; @@ -80,12 +81,13 @@ public class UserModule extends BaseHandler implements UserService { } } - public UserModule(ModuleRegistry registry, Configuration config) throws UmbrellaException { - super(registry); + public UserModule(Configuration config) throws UmbrellaException { + super(); var dbFile = config.get(CONFIG_DATABASE).orElseThrow(() -> missingConfigException(CONFIG_DATABASE)); // may be splitted in separate db files later logins = new SqliteDB(connect(dbFile)); users = new SqliteDB(connect(dbFile)); + ModuleRegistry.add(this); } private boolean deleteOIDC(HttpExchange ex, UmbrellaUser user, Path path) throws IOException { diff --git a/web/src/main/java/de/srsoftware/umbrella/web/WebHandler.java b/web/src/main/java/de/srsoftware/umbrella/web/WebHandler.java index d42f13d..4695c38 100644 --- a/web/src/main/java/de/srsoftware/umbrella/web/WebHandler.java +++ b/web/src/main/java/de/srsoftware/umbrella/web/WebHandler.java @@ -9,13 +9,14 @@ import com.sun.net.httpserver.HttpExchange; import de.srsoftware.tools.Path; import de.srsoftware.umbrella.core.BaseHandler; import de.srsoftware.umbrella.core.ModuleRegistry; + import java.io.ByteArrayOutputStream; import java.io.IOException; public class WebHandler extends BaseHandler { - public WebHandler(ModuleRegistry registry){ - super(registry); + public WebHandler(){ + super(); } @Override