X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=src%2Fmain%2Fjava%2Fnet%2Fpterodactylus%2Fsone%2Fcore%2FCore.java;h=ba66784c82a96688f7a2da855340c003acaa9141;hb=414ee1b03f7155ccb5049ede303dd01020ddcd94;hp=8ce908b700aa8b4eb86a0bc81c1a645676200895;hpb=3d6e9664c7f0eb1ff37111b7cbd1bfdca2798567;p=Sone.git diff --git a/src/main/java/net/pterodactylus/sone/core/Core.java b/src/main/java/net/pterodactylus/sone/core/Core.java index 8ce908b..ba66784 100644 --- a/src/main/java/net/pterodactylus/sone/core/Core.java +++ b/src/main/java/net/pterodactylus/sone/core/Core.java @@ -21,7 +21,6 @@ import static com.google.common.base.Preconditions.checkArgument; import static com.google.common.base.Preconditions.checkNotNull; import java.net.MalformedURLException; -import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.HashSet; @@ -52,7 +51,6 @@ import net.pterodactylus.sone.core.event.SoneLockedEvent; import net.pterodactylus.sone.core.event.SoneRemovedEvent; import net.pterodactylus.sone.core.event.SoneUnlockedEvent; import net.pterodactylus.sone.data.Album; -import net.pterodactylus.sone.data.AlbumImpl; import net.pterodactylus.sone.data.Client; import net.pterodactylus.sone.data.Image; import net.pterodactylus.sone.data.Post; @@ -63,6 +61,7 @@ import net.pterodactylus.sone.data.Reply; import net.pterodactylus.sone.data.Sone; import net.pterodactylus.sone.data.Sone.ShowCustomAvatars; import net.pterodactylus.sone.data.Sone.SoneStatus; +import net.pterodactylus.sone.data.SoneImpl; import net.pterodactylus.sone.data.TemporaryImage; import net.pterodactylus.sone.database.Database; import net.pterodactylus.sone.database.DatabaseException; @@ -96,6 +95,7 @@ import com.google.common.base.Predicates; import com.google.common.collect.FluentIterable; import com.google.common.collect.HashMultimap; import com.google.common.collect.ImmutableSet; +import com.google.common.collect.Maps; import com.google.common.collect.Multimap; import com.google.common.collect.Multimaps; import com.google.common.eventbus.EventBus; @@ -188,9 +188,6 @@ public class Core extends AbstractService implements SoneProvider, PostProvider, /** Trusted identities, sorted by own identities. */ private final Multimap trustedIdentities = Multimaps.synchronizedSetMultimap(HashMultimap.create()); - /** All known images. */ - private final Map images = new HashMap(); - /** All temporary images. */ private final Map temporaryImages = new HashMap(); @@ -382,11 +379,11 @@ public class Core extends AbstractService implements SoneProvider, PostProvider, synchronized (sones) { Sone sone = sones.get(id); if ((sone == null) && create) { - sone = new Sone(id, true); + sone = new SoneImpl(id, true); sones.put(id, sone); } if ((sone != null) && !sone.isLocal()) { - sone = new Sone(id, true); + sone = new SoneImpl(id, true); sones.put(id, sone); } return sone; @@ -423,7 +420,7 @@ public class Core extends AbstractService implements SoneProvider, PostProvider, synchronized (sones) { Sone sone = sones.get(id); if ((sone == null) && create && (id != null) && (id.length() == 43)) { - sone = new Sone(id, false); + sone = new SoneImpl(id, false); sones.put(id, sone); } return sone; @@ -609,75 +606,12 @@ public class Core extends AbstractService implements SoneProvider, PostProvider, return posts; } - /** - * Returns the album with the given ID, creating a new album if no album - * with the given ID can be found. - * - * @param albumId - * The ID of the album - * @return The album with the given ID - */ - public Album getAlbum(String albumId) { - return getAlbum(albumId, true); - } - - /** - * Returns the album with the given ID, optionally creating a new album if - * an album with the given ID can not be found. - * - * @param albumId - * The ID of the album - * @param create - * {@code true} to create a new album if none exists for the - * given ID - * @return The album with the given ID, or {@code null} if no album with the - * given ID exists and {@code create} is {@code false} - */ - public Album getAlbum(String albumId, boolean create) { - Optional album = database.getAlbum(albumId); - if (album.isPresent()) { - return album.get(); - } - if (!create) { - return null; - } - Album newAlbum = new AlbumImpl(albumId); - database.storeAlbum(newAlbum); - return newAlbum; + public Optional getAlbum(String albumId) { + return database.getAlbum(albumId); } - /** - * Returns the image with the given ID, creating it if necessary. - * - * @param imageId - * The ID of the image - * @return The image with the given ID - */ - public Image getImage(String imageId) { - return getImage(imageId, true); - } - - /** - * Returns the image with the given ID, optionally creating it if it does - * not exist. - * - * @param imageId - * The ID of the image - * @param create - * {@code true} to create an image if none exists with the given - * ID - * @return The image with the given ID, or {@code null} if none exists and - * none was created - */ - public Image getImage(String imageId, boolean create) { - synchronized (images) { - Image image = images.get(imageId); - if (create && (image == null)) { - image = new Image(imageId); - images.put(imageId, image); - } - return image; - } + public Optional getImage(String imageId) { + return database.getImage(imageId); } /** @@ -1033,18 +967,16 @@ public class Core extends AbstractService implements SoneProvider, PostProvider, } } database.storePostReplies(sone, sone.getReplies()); - synchronized (images) { - for (Album album : storedSone.get().getRootAlbum().getAlbums()) { - database.removeAlbum(album); - for (Image image : album.getImages()) { - images.remove(image.getId()); - } + for (Album album : storedSone.get().getRootAlbum().getAlbums()) { + database.removeAlbum(album); + for (Image image : album.getImages()) { + database.removeImage(image); } - for (Album album : sone.getRootAlbum().getAlbums()) { - database.storeAlbum(album); - for (Image image : album.getImages()) { - images.put(image.getId(), image); - } + } + for (Album album : sone.getRootAlbum().getAlbums()) { + database.storeAlbum(album); + for (Image image : album.getImages()) { + database.storeImage(image); } } synchronized (sones) { @@ -1232,7 +1164,7 @@ public class Core extends AbstractService implements SoneProvider, PostProvider, } /* load albums. */ - List topLevelAlbums = new ArrayList(); + Map albums = Maps.newHashMap(); int albumCounter = 0; while (true) { String albumPrefix = sonePrefix + "/Albums/" + albumCounter++; @@ -1248,19 +1180,12 @@ public class Core extends AbstractService implements SoneProvider, PostProvider, logger.log(Level.WARNING, "Invalid album found, aborting load!"); return; } - Album album = getAlbum(albumId).setSone(sone).setTitle(albumTitle).setDescription(albumDescription).setAlbumImage(albumImageId); + Album parentAlbum = sone.getRootAlbum(); if (albumParentId != null) { - Album parentAlbum = getAlbum(albumParentId, false); - if (parentAlbum == null) { - logger.log(Level.WARNING, String.format("Invalid parent album ID: %s", albumParentId)); - return; - } - parentAlbum.addAlbum(album); - } else { - if (!topLevelAlbums.contains(album)) { - topLevelAlbums.add(album); - } + parentAlbum = albums.get(albumParentId); } + Album album = parentAlbum.newAlbumBuilder().withId(albumId).build().modify().setTitle(albumTitle).setDescription(albumDescription).setAlbumImage(albumImageId).update(); + albums.put(album.getId(), album); } /* load images. */ @@ -1282,20 +1207,18 @@ public class Core extends AbstractService implements SoneProvider, PostProvider, logger.log(Level.WARNING, "Invalid image found, aborting load!"); return; } - Album album = getAlbum(albumId, false); + Album album = albums.get(albumId); if (album == null) { logger.log(Level.WARNING, "Invalid album image encountered, aborting load!"); return; } - Image image = getImage(imageId).setSone(sone).setCreationTime(creationTime).setKey(key); - image.setTitle(title).setDescription(description).setWidth(width).setHeight(height); - album.addImage(image); + album.newImageBuilder().withId(imageId).created(creationTime).at(key).sized(width, height).build().modify().setTitle(title).setDescription(description).update(); } /* load avatar. */ String avatarId = configuration.getStringValue(sonePrefix + "/Profile/Avatar").getValue(null); if (avatarId != null) { - profile.setAvatar(getImage(avatarId, false)); + profile.setAvatar(getImage(avatarId).orNull()); } /* load options. */ @@ -1320,9 +1243,6 @@ public class Core extends AbstractService implements SoneProvider, PostProvider, for (Album album : sone.getRootAlbum().getAlbums()) { sone.getRootAlbum().removeAlbum(album); } - for (Album album : topLevelAlbums) { - sone.getRootAlbum().addAlbum(album); - } soneInserters.get(sone).setLastInsertFingerprint(lastInsertFingerprint); } synchronized (knownSones) { @@ -1580,35 +1500,6 @@ public class Core extends AbstractService implements SoneProvider, PostProvider, } /** - * Creates a new top-level album for the given Sone. - * - * @param sone - * The Sone to create the album for - * @return The new album - */ - public Album createAlbum(Sone sone) { - return createAlbum(sone, sone.getRootAlbum()); - } - - /** - * Creates a new album for the given Sone. - * - * @param sone - * The Sone to create the album for - * @param parent - * The parent of the album (may be {@code null} to create a - * top-level album) - * @return The new album - */ - public Album createAlbum(Sone sone, Album parent) { - AlbumImpl album = new AlbumImpl(); - database.storeAlbum(album); - album.setSone(sone); - parent.addAlbum(album); - return album; - } - - /** * Deletes the given album. The owner of the album has to be a local Sone, * and the album has to be {@link Album#isEmpty() empty} to be deleted. * @@ -1643,11 +1534,8 @@ public class Core extends AbstractService implements SoneProvider, PostProvider, checkNotNull(temporaryImage, "temporaryImage must not be null"); checkArgument(sone.isLocal(), "sone must be a local Sone"); checkArgument(sone.equals(album.getSone()), "album must belong to the given Sone"); - Image image = new Image(temporaryImage.getId()).setSone(sone).setCreationTime(System.currentTimeMillis()); - album.addImage(image); - synchronized (images) { - images.put(image.getId(), image); - } + Image image = album.newImageBuilder().withId(temporaryImage.getId()).createdNow().sized(temporaryImage.getWidth(), temporaryImage.getHeight()).build(); + database.storeImage(image); imageInserter.insertImage(temporaryImage, image); return image; } @@ -1665,9 +1553,7 @@ public class Core extends AbstractService implements SoneProvider, PostProvider, checkArgument(image.getSone().isLocal(), "image must belong to a local Sone"); deleteTemporaryImage(image.getId()); image.getAlbum().removeImage(image); - synchronized (images) { - images.remove(image.getId()); - } + database.removeImage(image); touchConfiguration(); } @@ -1680,9 +1566,8 @@ public class Core extends AbstractService implements SoneProvider, PostProvider, * The encoded data of the image * @return The temporary image */ - public TemporaryImage createTemporaryImage(String mimeType, byte[] imageData) { - TemporaryImage temporaryImage = new TemporaryImage(); - temporaryImage.setMimeType(mimeType).setImageData(imageData); + public TemporaryImage createTemporaryImage(String mimeType, byte[] imageData, int width, int height) { + TemporaryImage temporaryImage = new TemporaryImage(mimeType, imageData, width, height); synchronized (temporaryImages) { temporaryImages.put(temporaryImage.getId(), temporaryImage); } @@ -1711,9 +1596,9 @@ public class Core extends AbstractService implements SoneProvider, PostProvider, synchronized (temporaryImages) { temporaryImages.remove(imageId); } - Image image = getImage(imageId, false); - if (image != null) { - imageInserter.cancelImageInsert(image); + Optional image = getImage(imageId); + if (image.isPresent()) { + imageInserter.cancelImageInsert(image.get()); } } @@ -2224,7 +2109,7 @@ public class Core extends AbstractService implements SoneProvider, PostProvider, @Subscribe public void imageInsertFinished(ImageInsertFinishedEvent imageInsertFinishedEvent) { logger.log(Level.WARNING, String.format("Image insert finished for %s: %s", imageInsertFinishedEvent.image(), imageInsertFinishedEvent.resultingUri())); - imageInsertFinishedEvent.image().setKey(imageInsertFinishedEvent.resultingUri().toString()); + imageInsertFinishedEvent.image().modify().setKey(imageInsertFinishedEvent.resultingUri().toString()).update(); deleteTemporaryImage(imageInsertFinishedEvent.image().getId()); touchConfiguration(); }