diff --git a/src/main/java/com/josdem/jmetadata/ApplicationConstants.java b/src/main/java/com/josdem/jmetadata/ApplicationConstants.java index 7758119..17a856f 100644 --- a/src/main/java/com/josdem/jmetadata/ApplicationConstants.java +++ b/src/main/java/com/josdem/jmetadata/ApplicationConstants.java @@ -1,66 +1,66 @@ -/* - Copyright 2024 Jose Morales contact@josdem.io - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -package com.josdem.jmetadata; - -public interface ApplicationConstants { - String LOGIN_FAIL = "Login fail"; - String LOGGED_AS = "Logged as : "; - String DONE = "Done"; - String OPEN_ERROR = "Error on importing Music"; - String WORKING = "Working"; - int ARTIST_COLUMN = 0; - int TITLE_COLUMN = 1; - int ALBUM_COLUMN = 2; - int GENRE_COLUMN = 3; - int YEAR_COLUMN = 4; - int TRACK_NUMBER_COLUMN = 5; - int TOTAL_TRACKS_NUMBER_COLUMN = 6; - int CD_NUMBER_COLUMN = 7; - int TOTAL_CDS_NUMBER_COLUMN = 8; - int STATUS_COLUMN = 9; - int WIDTH = 1024; - int HEIGHT = 600; - String COVER_ART_FROM_FILE = "Cover Art from File"; - String COVER_ART_FROM_LASTFM = "Cover Art from Lastfm"; - String COVER_ART_FROM_DRAG_AND_DROP = "Cover Art from Drag & Drop"; - String COVER_ART_DEFAULT = "Covert Art not found"; - String APPLY = "Apply"; - String EXPORT = "Export"; - String NEW = "New"; - String READY = "Ready"; - String APPLICATION_NAME = "JMetadata"; - String IMAGE_EXT = "PNG"; - String FILE_EXT = "txt"; - String PREFIX = "JMetadata_"; - String GETTING_ALBUM = "Getting Album from Musicbrainz"; - String GETTING_LAST_FM = "Getting Last.fm Metadata"; - String COMPLETE_DEFAULT_VALUES = "Completing default values"; - String GETTING_FORMATTER = "Formatting metadata"; - String WRITING_METADATA = "Writing Metadata"; - String USERNAME_LABEL = "username:"; - String PASSWORD_LABEL = "password:"; - int THREE_HUNDRED = 300; - String CORRUPTED_METADATA_LABEL = " has a corrupted coverArt"; - String METADATA_FROM_FILE_LABEL = " title and artist metadata were extracted from file name"; - String AND_ANOTHER = " and another "; - String DIRECTORY_EMPTY = "I could not find any mp3 or mp4 audio file in the directory"; - String DIRECTORY_NOT_FOUND = "I could not find that directory to scan: "; - String FILE_NOT_FOUND = "I could not find this file: "; - String TOO_MUCH_FILES_LOADED = "Too much files loaded, maximum allowed: "; - String MEDIA_TYPE = "application/json"; - String USER_AGENT = "JMetadata/1.1.0 (contact@josdem.io)"; -} +/* + Copyright 2024 Jose Morales contact@josdem.io + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +package com.josdem.jmetadata; + +public interface ApplicationConstants { + String LOGIN_FAIL = "Login fail"; + String LOGGED_AS = "Logged as : "; + String DONE = "Done"; + String OPEN_ERROR = "Error on importing Music"; + String WORKING = "Working"; + int ARTIST_COLUMN = 0; + int TITLE_COLUMN = 1; + int ALBUM_COLUMN = 2; + int GENRE_COLUMN = 3; + int YEAR_COLUMN = 4; + int TRACK_NUMBER_COLUMN = 5; + int TOTAL_TRACKS_NUMBER_COLUMN = 6; + int CD_NUMBER_COLUMN = 7; + int TOTAL_CDS_NUMBER_COLUMN = 8; + int STATUS_COLUMN = 9; + int WIDTH = 1024; + int HEIGHT = 600; + String COVER_ART_FROM_FILE = "Cover Art from File"; + String COVER_ART_FROM_LASTFM = "Cover Art from Lastfm"; + String COVER_ART_FROM_DRAG_AND_DROP = "Cover Art from Drag & Drop"; + String COVER_ART_DEFAULT = "Covert Art not found"; + String APPLY = "Apply"; + String EXPORT = "Export"; + String NEW = "New"; + String READY = "Ready"; + String APPLICATION_NAME = "JMetadata"; + String IMAGE_EXT = "PNG"; + String FILE_EXT = "txt"; + String PREFIX = "JMetadata_"; + String GETTING_ALBUM = "Getting Album from Musicbrainz"; + String GETTING_LAST_FM = "Getting Last.fm Metadata"; + String COMPLETE_DEFAULT_VALUES = "Completing default values"; + String GETTING_FORMATTER = "Formatting metadata"; + String WRITING_METADATA = "Writing Metadata"; + String USERNAME_LABEL = "username:"; + String PASSWORD_LABEL = "password:"; + int THREE_HUNDRED = 300; + String CORRUPTED_METADATA_LABEL = " has a corrupted coverArt"; + String METADATA_FROM_FILE_LABEL = " title and artist metadata were extracted from file name"; + String AND_ANOTHER = " and another "; + String DIRECTORY_EMPTY = "I could not find any mp3 or mp4 audio file in the directory"; + String DIRECTORY_NOT_FOUND = "I could not find that directory to scan: "; + String FILE_NOT_FOUND = "I could not find this file: "; + String TOO_MUCH_FILES_LOADED = "Too much files loaded, maximum allowed: "; + String MEDIA_TYPE = "application/json"; + String USER_AGENT = "JMetadata/1.1.0 (contact@josdem.io)"; +} diff --git a/src/main/java/com/josdem/jmetadata/Auth.java b/src/main/java/com/josdem/jmetadata/Auth.java index ade9839..8f7e6aa 100644 --- a/src/main/java/com/josdem/jmetadata/Auth.java +++ b/src/main/java/com/josdem/jmetadata/Auth.java @@ -17,6 +17,6 @@ package com.josdem.jmetadata; public interface Auth { - static final String KEY = "LASTFM_API_KEY"; - static final String SECRET = "LASTFM_API_SECRET"; + static final String KEY = "LASTFM_API_KEY"; + static final String SECRET = "LASTFM_API_SECRET"; } diff --git a/src/main/java/com/josdem/jmetadata/Launcher.java b/src/main/java/com/josdem/jmetadata/Launcher.java index 1878df1..247330c 100644 --- a/src/main/java/com/josdem/jmetadata/Launcher.java +++ b/src/main/java/com/josdem/jmetadata/Launcher.java @@ -1,59 +1,54 @@ -/* - Copyright 2013 Jose Luis De la Cruz Morales joseluis.delacruz@gmail.com - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -package com.josdem.jmetadata; - -import javax.swing.UIManager; -import javax.swing.UnsupportedLookAndFeelException; - -import com.josdem.jmetadata.helper.ApplicationContextSingleton; -import org.asmatron.messengine.engines.DefaultEngine; -import org.springframework.context.ConfigurableApplicationContext; - -import lombok.extern.slf4j.Slf4j; - -@Slf4j - - -/** - * @author josdem (joseluis.delacruz@gmail.com) - * @understands A class who knows how to launch ALL the process - */ - -public class Launcher { - private static final String HIPECOTECH_LNF = "com.josdem.jmetadata.laf.HipecotechLookAndFeel"; - - - public Launcher(ConfigurableApplicationContext applicationContext) { - DefaultEngine defaultEngine = applicationContext.getBean(DefaultEngine.class); - defaultEngine.start(); - } - - public static void main(String[] args) { - try { - UIManager.setLookAndFeel(HIPECOTECH_LNF); - } catch (ClassNotFoundException e) { - log.error(e.getMessage(), e); - } catch (InstantiationException e) { - log.error(e.getMessage(), e); - } catch (IllegalAccessException e) { - log.error(e.getMessage(), e); - } catch (UnsupportedLookAndFeelException e) { - log.error(e.getMessage(), e); - } - new Launcher(ApplicationContextSingleton.getApplicationContext()); - } -} +/* + Copyright 2013 Jose Luis De la Cruz Morales joseluis.delacruz@gmail.com + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +package com.josdem.jmetadata; + +import com.josdem.jmetadata.helper.ApplicationContextSingleton; +import javax.swing.UIManager; +import javax.swing.UnsupportedLookAndFeelException; +import lombok.extern.slf4j.Slf4j; +import org.asmatron.messengine.engines.DefaultEngine; +import org.springframework.context.ConfigurableApplicationContext; + +@Slf4j + +/** + * @author josdem (joseluis.delacruz@gmail.com) + * @understands A class who knows how to launch ALL the process + */ +public class Launcher { + private static final String HIPECOTECH_LNF = "com.josdem.jmetadata.laf.HipecotechLookAndFeel"; + + public Launcher(ConfigurableApplicationContext applicationContext) { + DefaultEngine defaultEngine = applicationContext.getBean(DefaultEngine.class); + defaultEngine.start(); + } + + public static void main(String[] args) { + try { + UIManager.setLookAndFeel(HIPECOTECH_LNF); + } catch (ClassNotFoundException e) { + log.error(e.getMessage(), e); + } catch (InstantiationException e) { + log.error(e.getMessage(), e); + } catch (IllegalAccessException e) { + log.error(e.getMessage(), e); + } catch (UnsupportedLookAndFeelException e) { + log.error(e.getMessage(), e); + } + new Launcher(ApplicationContextSingleton.getApplicationContext()); + } +} diff --git a/src/main/java/com/josdem/jmetadata/action/ActionResult.java b/src/main/java/com/josdem/jmetadata/action/ActionResult.java index 2254b8f..be5de40 100644 --- a/src/main/java/com/josdem/jmetadata/action/ActionResult.java +++ b/src/main/java/com/josdem/jmetadata/action/ActionResult.java @@ -1,21 +1,31 @@ -/* - Copyright 2013 Jose Luis De la Cruz Morales joseluis.delacruz@gmail.com - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -package com.josdem.jmetadata.action; - -public enum ActionResult { - Ready, New, Error, Not_Scrobbleable, Sessionless, NotFound, Updated, NotLogged, Sent, Exported, Complete -} +/* + Copyright 2013 Jose Luis De la Cruz Morales joseluis.delacruz@gmail.com + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +package com.josdem.jmetadata.action; + +public enum ActionResult { + Ready, + New, + Error, + Not_Scrobbleable, + Sessionless, + NotFound, + Updated, + NotLogged, + Sent, + Exported, + Complete +} diff --git a/src/main/java/com/josdem/jmetadata/action/Actions.java b/src/main/java/com/josdem/jmetadata/action/Actions.java index ea8be8b..04d8e05 100644 --- a/src/main/java/com/josdem/jmetadata/action/Actions.java +++ b/src/main/java/com/josdem/jmetadata/action/Actions.java @@ -1,63 +1,64 @@ -/* - Copyright 2013 Jose Luis De la Cruz Morales joseluis.delacruz@gmail.com - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -package com.josdem.jmetadata.action; - -import static org.asmatron.messengine.action.ActionId.cm; - -import java.util.List; - -import org.asmatron.messengine.action.ActionId; -import org.asmatron.messengine.action.EmptyAction; -import org.asmatron.messengine.action.RequestAction; -import org.asmatron.messengine.action.ValueAction; -import com.josdem.jmetadata.model.ExportPackage; -import com.josdem.jmetadata.model.Metadata; -import com.josdem.jmetadata.model.User; - -/** - * @author josdem (joseluis.delacruz@gmail.com) - * @understands A class who has Publisher Subscriber label descriptors - */ - -public interface Actions { - String LOGIN_ID = "login"; - ActionId> LOGIN = cm(LOGIN_ID); - - String GET_METADATA = "getMetadata"; - ActionId METADATA = cm(GET_METADATA); - - String SEND_METADATA = "sendMetadata"; - ActionId> SEND = cm(SEND_METADATA); - - String COMPLETE_ALBUM_METADATA = "completeAlbumMetadata"; - ActionId, ActionResult>> COMPLETE_MUSICBRAINZ = cm(COMPLETE_ALBUM_METADATA); - - String COMPLETE_LAST_FM_METADATA = "completeLastfmMetadata"; - ActionId> COMPLETE_LAST_FM = cm(COMPLETE_LAST_FM_METADATA); - - String WRITE_METADATA = "writeMetadata"; - ActionId> WRITE = cm(WRITE_METADATA); - - String EXPORT_METADATA = "exportMetadata"; - ActionId> EXPORT = cm(EXPORT_METADATA); - - String COMPLETE_FORMATTER_METADATA = "completeFormatterMetadata"; - ActionId> COMPLETE_FORMATTER = cm(COMPLETE_FORMATTER_METADATA); - - String COMPLETE_DEFAULT_METADATA = "completeDefaultMetadata"; - ActionId, ActionResult>> COMPLETE_DEFAULT = cm(COMPLETE_DEFAULT_METADATA); -} +/* + Copyright 2013 Jose Luis De la Cruz Morales joseluis.delacruz@gmail.com + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +package com.josdem.jmetadata.action; + +import static org.asmatron.messengine.action.ActionId.cm; + +import com.josdem.jmetadata.model.ExportPackage; +import com.josdem.jmetadata.model.Metadata; +import com.josdem.jmetadata.model.User; +import java.util.List; +import org.asmatron.messengine.action.ActionId; +import org.asmatron.messengine.action.EmptyAction; +import org.asmatron.messengine.action.RequestAction; +import org.asmatron.messengine.action.ValueAction; + +/** + * @author josdem (joseluis.delacruz@gmail.com) + * @understands A class who has Publisher Subscriber label descriptors + */ +public interface Actions { + String LOGIN_ID = "login"; + ActionId> LOGIN = cm(LOGIN_ID); + + String GET_METADATA = "getMetadata"; + ActionId METADATA = cm(GET_METADATA); + + String SEND_METADATA = "sendMetadata"; + ActionId> SEND = cm(SEND_METADATA); + + String COMPLETE_ALBUM_METADATA = "completeAlbumMetadata"; + ActionId, ActionResult>> COMPLETE_MUSICBRAINZ = + cm(COMPLETE_ALBUM_METADATA); + + String COMPLETE_LAST_FM_METADATA = "completeLastfmMetadata"; + ActionId> COMPLETE_LAST_FM = cm(COMPLETE_LAST_FM_METADATA); + + String WRITE_METADATA = "writeMetadata"; + ActionId> WRITE = cm(WRITE_METADATA); + + String EXPORT_METADATA = "exportMetadata"; + ActionId> EXPORT = cm(EXPORT_METADATA); + + String COMPLETE_FORMATTER_METADATA = "completeFormatterMetadata"; + ActionId> COMPLETE_FORMATTER = + cm(COMPLETE_FORMATTER_METADATA); + + String COMPLETE_DEFAULT_METADATA = "completeDefaultMetadata"; + ActionId, ActionResult>> COMPLETE_DEFAULT = + cm(COMPLETE_DEFAULT_METADATA); +} diff --git a/src/main/java/com/josdem/jmetadata/aspect/AfterThrowingAdvice.java b/src/main/java/com/josdem/jmetadata/aspect/AfterThrowingAdvice.java index 2ad6682..c32f2a1 100644 --- a/src/main/java/com/josdem/jmetadata/aspect/AfterThrowingAdvice.java +++ b/src/main/java/com/josdem/jmetadata/aspect/AfterThrowingAdvice.java @@ -16,13 +16,11 @@ package com.josdem.jmetadata.aspect; -import org.aspectj.lang.annotation.Aspect; -import org.aspectj.lang.annotation.AfterThrowing; -import org.springframework.stereotype.Component; - import com.josdem.jmetadata.exception.BusinessException; - import lombok.extern.slf4j.Slf4j; +import org.aspectj.lang.annotation.AfterThrowing; +import org.aspectj.lang.annotation.Aspect; +import org.springframework.stereotype.Component; @Slf4j @Aspect @@ -30,9 +28,8 @@ public class AfterThrowingAdvice { @AfterThrowing(pointcut = "execution(* com.josdem.jmetadata.service..**.*(..))", throwing = "ex") - public void doRecoveryActions(RuntimeException ex){ + public void doRecoveryActions(RuntimeException ex) { log.info("Wrapping exception: {}", String.valueOf(ex)); throw new BusinessException(ex.getMessage(), ex); } - } diff --git a/src/main/java/com/josdem/jmetadata/collaborator/JAudioTaggerCollaborator.java b/src/main/java/com/josdem/jmetadata/collaborator/JAudioTaggerCollaborator.java index f4891de..845b46b 100644 --- a/src/main/java/com/josdem/jmetadata/collaborator/JAudioTaggerCollaborator.java +++ b/src/main/java/com/josdem/jmetadata/collaborator/JAudioTaggerCollaborator.java @@ -23,8 +23,7 @@ @Component public class JAudioTaggerCollaborator { - public boolean isValid(Tag tag, AudioHeader header) { - return tag != null && header != null; - } - + public boolean isValid(Tag tag, AudioHeader header) { + return tag != null && header != null; + } } diff --git a/src/main/java/com/josdem/jmetadata/collaborator/MetadataCollaborator.java b/src/main/java/com/josdem/jmetadata/collaborator/MetadataCollaborator.java index e1bb236..7617046 100644 --- a/src/main/java/com/josdem/jmetadata/collaborator/MetadataCollaborator.java +++ b/src/main/java/com/josdem/jmetadata/collaborator/MetadataCollaborator.java @@ -16,61 +16,88 @@ package com.josdem.jmetadata.collaborator; -import org.apache.commons.lang3.StringUtils; import com.josdem.jmetadata.model.Metadata; - import java.util.ArrayList; import java.util.List; import java.util.Objects; +import org.apache.commons.lang3.StringUtils; public class MetadataCollaborator { - private List metadatas; - - public void setMetadatas(List metadatas) { - this.metadatas = metadatas; - } - - public String getArtist() { - var artists = new ArrayList<>(); - metadatas.forEach(metadata -> artists.add(Objects.requireNonNull(metadata.getArtist(), "artist cannot be null"))); - return artists.stream().distinct().count() <= 1 ? metadatas.getFirst().getArtist() : StringUtils.EMPTY; - } - - public String getAlbum() { - var albums = new ArrayList<>(); - metadatas.forEach(metadata -> albums.add(Objects.requireNonNull(metadata.getAlbum(), "album cannot be null"))); - return albums.stream().distinct().count() <= 1 ? metadatas.getFirst().getAlbum() : StringUtils.EMPTY; - } - - public String getGenre() { - var genres = new ArrayList<>(); - metadatas.forEach(metadata -> genres.add(Objects.requireNonNull(metadata.getGenre(), "genre cannot be null"))); - return genres.stream().distinct().count() <= 1 ? metadatas.getFirst().getGenre() : StringUtils.EMPTY; - } - - public String getYear() { - var years = new ArrayList<>(); - metadatas.forEach(metadata -> years.add(Objects.requireNonNull(metadata.getYear(), "year cannot be null"))); - return years.stream().distinct().count() <= 1 ? metadatas.getFirst().getYear() : StringUtils.EMPTY; - } - - public String getTotalTracks() { - var tracks = new ArrayList<>(); - metadatas.forEach(metadata -> tracks.add(Objects.requireNonNull(metadata.getTotalTracks(), "totalTracks cannot be null"))); - return tracks.stream().distinct().count() <= 1 ? metadatas.getFirst().getTotalTracks() : StringUtils.EMPTY; - } - - public String getTotalCds() { - var cds = new ArrayList<>(); - metadatas.forEach(metadata -> cds.add(Objects.requireNonNull(metadata.getTotalCds(), "totalCds cannot be null"))); - return cds.stream().distinct().count() <= 1 ? metadatas.getFirst().getTotalCds() : StringUtils.EMPTY; - } - - public String getCdNumber() { - var cdNumber = new ArrayList<>(); - metadatas.forEach(metadata -> cdNumber.add(Objects.requireNonNull(metadata.getCdNumber(), "cdNumber cannot be null"))); - return cdNumber.stream().distinct().count() <= 1 ? metadatas.getFirst().getCdNumber() : StringUtils.EMPTY; - } - + private List metadatas; + + public void setMetadatas(List metadatas) { + this.metadatas = metadatas; + } + + public String getArtist() { + var artists = new ArrayList<>(); + metadatas.forEach( + metadata -> + artists.add(Objects.requireNonNull(metadata.getArtist(), "artist cannot be null"))); + return artists.stream().distinct().count() <= 1 + ? metadatas.getFirst().getArtist() + : StringUtils.EMPTY; + } + + public String getAlbum() { + var albums = new ArrayList<>(); + metadatas.forEach( + metadata -> + albums.add(Objects.requireNonNull(metadata.getAlbum(), "album cannot be null"))); + return albums.stream().distinct().count() <= 1 + ? metadatas.getFirst().getAlbum() + : StringUtils.EMPTY; + } + + public String getGenre() { + var genres = new ArrayList<>(); + metadatas.forEach( + metadata -> + genres.add(Objects.requireNonNull(metadata.getGenre(), "genre cannot be null"))); + return genres.stream().distinct().count() <= 1 + ? metadatas.getFirst().getGenre() + : StringUtils.EMPTY; + } + + public String getYear() { + var years = new ArrayList<>(); + metadatas.forEach( + metadata -> years.add(Objects.requireNonNull(metadata.getYear(), "year cannot be null"))); + return years.stream().distinct().count() <= 1 + ? metadatas.getFirst().getYear() + : StringUtils.EMPTY; + } + + public String getTotalTracks() { + var tracks = new ArrayList<>(); + metadatas.forEach( + metadata -> + tracks.add( + Objects.requireNonNull(metadata.getTotalTracks(), "totalTracks cannot be null"))); + return tracks.stream().distinct().count() <= 1 + ? metadatas.getFirst().getTotalTracks() + : StringUtils.EMPTY; + } + + public String getTotalCds() { + var cds = new ArrayList<>(); + metadatas.forEach( + metadata -> + cds.add(Objects.requireNonNull(metadata.getTotalCds(), "totalCds cannot be null"))); + return cds.stream().distinct().count() <= 1 + ? metadatas.getFirst().getTotalCds() + : StringUtils.EMPTY; + } + + public String getCdNumber() { + var cdNumber = new ArrayList<>(); + metadatas.forEach( + metadata -> + cdNumber.add( + Objects.requireNonNull(metadata.getCdNumber(), "cdNumber cannot be null"))); + return cdNumber.stream().distinct().count() <= 1 + ? metadatas.getFirst().getCdNumber() + : StringUtils.EMPTY; + } } diff --git a/src/main/java/com/josdem/jmetadata/controller/CompleteController.java b/src/main/java/com/josdem/jmetadata/controller/CompleteController.java index b15fda3..e282543 100644 --- a/src/main/java/com/josdem/jmetadata/controller/CompleteController.java +++ b/src/main/java/com/josdem/jmetadata/controller/CompleteController.java @@ -32,6 +32,10 @@ import com.josdem.jmetadata.service.MusicBrainzService; import com.josdem.jmetadata.service.RestService; import com.josdem.jmetadata.util.ApplicationState; +import java.io.File; +import java.io.IOException; +import java.util.List; +import javax.annotation.PostConstruct; import org.asmatron.messengine.annotations.RequestMethod; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -39,107 +43,105 @@ import org.springframework.stereotype.Controller; import retrofit2.Response; -import javax.annotation.PostConstruct; -import java.io.File; -import java.io.IOException; -import java.util.List; - @Controller public class CompleteController { - private MetadataWriter metadataWriter = new MetadataWriter(); + private MetadataWriter metadataWriter = new MetadataWriter(); - @Autowired - private LastfmService lastfmService; - @Autowired - private MetadataService metadataService; - @Autowired - private MusicBrainzService musicBrainzService; + @Autowired private LastfmService lastfmService; + @Autowired private MetadataService metadataService; + @Autowired private MusicBrainzService musicBrainzService; + private RestService restService; + private CoverArtRestService coverArtRestService; - private RestService restService; - private CoverArtRestService coverArtRestService; + private final Logger log = LoggerFactory.getLogger(this.getClass()); - private final Logger log = LoggerFactory.getLogger(this.getClass()); + @PostConstruct + void setup() { + restService = RetrofitHelper.getRetrofit().create(RestService.class); + coverArtRestService = CoverArtRetrofitHelper.getRetrofit().create(CoverArtRestService.class); + } - @PostConstruct - void setup() { - restService = RetrofitHelper.getRetrofit().create(RestService.class); - coverArtRestService = CoverArtRetrofitHelper.getRetrofit().create(CoverArtRestService.class); + @RequestMethod(Actions.COMPLETE_ALBUM_METADATA) + public synchronized ActionResult completeAlbumMetadata(List metadatas) { + if (!metadataService.isSameAlbum(metadatas) || !metadataService.isSameArtist(metadatas)) { + return ActionResult.Ready; } - - @RequestMethod(Actions.COMPLETE_ALBUM_METADATA) - public synchronized ActionResult completeAlbumMetadata(List metadatas) { - if (!metadataService.isSameAlbum(metadatas) || !metadataService.isSameArtist(metadatas)) { - return ActionResult.Ready; - } - try { - if (ApplicationState.cache.get(metadatas.getFirst().getAlbum()) == null) { - log.info("Getting releases"); - var response = restService.getReleases(metadatas.getFirst().getAlbum() + " AND " + "artist:" + metadatas.getFirst().getArtist()); - Response result = response.execute(); - if (result.isSuccessful()) { - MusicBrainzResponse musicBrainzResponse = result.body(); - String albumName = metadatas.getFirst().getAlbum(); - ApplicationState.cache.put(albumName, musicBrainzResponse); - log.info("MusicBrainz Response: {}", musicBrainzResponse); - Album album = musicBrainzService.getAlbumByName(albumName); - log.info("MusicBrainz Album: {}", album); - if(album.getCoverArtArchive().isFront()){ - log.info("Getting cover art"); - var coverArtResponse = coverArtRestService.getRelease(album.getId()); - var coverArtResult = coverArtResponse.execute(); - if(coverArtResult.isSuccessful()){ - var coverArt = coverArtResult.body(); - log.info("Cover Art: {}", coverArt); - } - } - } else { - log.error("Error getting releases: {}", result.errorBody()); - } - return ActionResult.New; + try { + if (ApplicationState.cache.get(metadatas.getFirst().getAlbum()) == null) { + log.info("Getting releases"); + var response = + restService.getReleases( + metadatas.getFirst().getAlbum() + + " AND " + + "artist:" + + metadatas.getFirst().getArtist()); + Response result = response.execute(); + if (result.isSuccessful()) { + MusicBrainzResponse musicBrainzResponse = result.body(); + String albumName = metadatas.getFirst().getAlbum(); + ApplicationState.cache.put(albumName, musicBrainzResponse); + log.info("MusicBrainz Response: {}", musicBrainzResponse); + Album album = musicBrainzService.getAlbumByName(albumName); + log.info("MusicBrainz Album: {}", album); + if (album.getCoverArtArchive().isFront()) { + log.info("Getting cover art"); + var coverArtResponse = coverArtRestService.getRelease(album.getId()); + var coverArtResult = coverArtResponse.execute(); + if (coverArtResult.isSuccessful()) { + var coverArt = coverArtResult.body(); + log.info("Cover Art: {}", coverArt); } - } catch (IOException ex) { - log.error(ex.getMessage(), ex); - return ActionResult.Error; + } + } else { + log.error("Error getting releases: {}", result.errorBody()); } - return ActionResult.Complete; - } - - @RequestMethod(Actions.COMPLETE_LAST_FM_METADATA) - public ActionResult completeLastFmMetadata(Metadata metadata) { - log.info("trying to complete LastFM metadata for: {} - {}", metadata.getArtist(), metadata.getTitle()); - return lastfmService.completeLastFM(metadata); + return ActionResult.New; + } + } catch (IOException ex) { + log.error(ex.getMessage(), ex); + return ActionResult.Error; } - - @RequestMethod(Actions.WRITE_METADATA) - public synchronized ActionResult completeAlbum(Metadata metadata) { - try { - File file = metadata.getFile(); - log.info("writting: {}", metadata.getTitle()); - metadataWriter.setFile(file); - metadataWriter.writeArtist(metadata.getArtist()); - metadataWriter.writeTitle(metadata.getTitle()); - metadataWriter.writeAlbum(metadata.getAlbum()); - metadataWriter.writeTrackNumber(metadata.getTrackNumber()); - metadataWriter.writeTotalTracksNumber(metadata.getTotalTracks()); - metadataWriter.writeCdNumber(metadata.getCdNumber()); - metadataWriter.writeTotalCds(metadata.getTotalCds()); - metadataWriter.writeYear(metadata.getYear()); - metadataWriter.writeGenre(metadata.getGenre()); - CoverArt coverArtNew = metadata.getNewCoverArt(); - if (coverArtNew != null) { - log.info("trying to remove artwork"); - boolean result = metadataWriter.removeCoverArt(); - log.info("artwork deleted with result: {}", result); - metadataWriter.writeCoverArt(coverArtNew.getImage()); - metadata.setCoverArt(coverArtNew.getImage()); - } - return ActionResult.Updated; - } catch (MetadataException mde) { - log.error(mde.getMessage(), mde); - return ActionResult.Error; - } + return ActionResult.Complete; + } + + @RequestMethod(Actions.COMPLETE_LAST_FM_METADATA) + public ActionResult completeLastFmMetadata(Metadata metadata) { + log.info( + "trying to complete LastFM metadata for: {} - {}", + metadata.getArtist(), + metadata.getTitle()); + return lastfmService.completeLastFM(metadata); + } + + @RequestMethod(Actions.WRITE_METADATA) + public synchronized ActionResult completeAlbum(Metadata metadata) { + try { + File file = metadata.getFile(); + log.info("writting: {}", metadata.getTitle()); + metadataWriter.setFile(file); + metadataWriter.writeArtist(metadata.getArtist()); + metadataWriter.writeTitle(metadata.getTitle()); + metadataWriter.writeAlbum(metadata.getAlbum()); + metadataWriter.writeTrackNumber(metadata.getTrackNumber()); + metadataWriter.writeTotalTracksNumber(metadata.getTotalTracks()); + metadataWriter.writeCdNumber(metadata.getCdNumber()); + metadataWriter.writeTotalCds(metadata.getTotalCds()); + metadataWriter.writeYear(metadata.getYear()); + metadataWriter.writeGenre(metadata.getGenre()); + CoverArt coverArtNew = metadata.getNewCoverArt(); + if (coverArtNew != null) { + log.info("trying to remove artwork"); + boolean result = metadataWriter.removeCoverArt(); + log.info("artwork deleted with result: {}", result); + metadataWriter.writeCoverArt(coverArtNew.getImage()); + metadata.setCoverArt(coverArtNew.getImage()); + } + return ActionResult.Updated; + } catch (MetadataException mde) { + log.error(mde.getMessage(), mde); + return ActionResult.Error; } - + } } diff --git a/src/main/java/com/josdem/jmetadata/controller/DefaultController.java b/src/main/java/com/josdem/jmetadata/controller/DefaultController.java index 6753ac7..cb03139 100644 --- a/src/main/java/com/josdem/jmetadata/controller/DefaultController.java +++ b/src/main/java/com/josdem/jmetadata/controller/DefaultController.java @@ -16,34 +16,36 @@ package com.josdem.jmetadata.controller; -import org.asmatron.messengine.annotations.RequestMethod; import com.josdem.jmetadata.action.ActionResult; import com.josdem.jmetadata.action.Actions; import com.josdem.jmetadata.exception.MetadataException; import com.josdem.jmetadata.model.Metadata; import com.josdem.jmetadata.service.DefaultService; +import java.io.IOException; +import java.util.List; +import org.asmatron.messengine.annotations.RequestMethod; import org.jaudiotagger.audio.exceptions.CannotReadException; import org.jaudiotagger.audio.exceptions.ReadOnlyFileException; import org.jaudiotagger.tag.TagException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; -import java.io.IOException; -import java.util.List; - @Controller public class DefaultController { - @Autowired - private DefaultService defaultService; - - @RequestMethod(Actions.COMPLETE_DEFAULT_METADATA) - public synchronized ActionResult complete(List metadatas) throws IOException, CannotReadException, TagException, ReadOnlyFileException, MetadataException { - if (defaultService.isCompletable(metadatas)) { - defaultService.complete(metadatas); - return ActionResult.New; - } - return ActionResult.Ready; + @Autowired private DefaultService defaultService; + + @RequestMethod(Actions.COMPLETE_DEFAULT_METADATA) + public synchronized ActionResult complete(List metadatas) + throws IOException, + CannotReadException, + TagException, + ReadOnlyFileException, + MetadataException { + if (defaultService.isCompletable(metadatas)) { + defaultService.complete(metadatas); + return ActionResult.New; } - + return ActionResult.Ready; + } } diff --git a/src/main/java/com/josdem/jmetadata/controller/ExporterController.java b/src/main/java/com/josdem/jmetadata/controller/ExporterController.java index 63c8e58..b52184c 100644 --- a/src/main/java/com/josdem/jmetadata/controller/ExporterController.java +++ b/src/main/java/com/josdem/jmetadata/controller/ExporterController.java @@ -16,12 +16,13 @@ package com.josdem.jmetadata.controller; -import org.asmatron.messengine.annotations.RequestMethod; import com.josdem.jmetadata.action.ActionResult; import com.josdem.jmetadata.action.Actions; import com.josdem.jmetadata.exception.MetadataException; import com.josdem.jmetadata.helper.ExporterHelper; import com.josdem.jmetadata.model.ExportPackage; +import java.io.IOException; +import org.asmatron.messengine.annotations.RequestMethod; import org.jaudiotagger.audio.exceptions.CannotReadException; import org.jaudiotagger.audio.exceptions.ReadOnlyFileException; import org.jaudiotagger.tag.TagException; @@ -30,24 +31,21 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; -import java.io.IOException; - @Controller public class ExporterController { - @Autowired - private ExporterHelper exporterHelper; + @Autowired private ExporterHelper exporterHelper; - private final Logger log = LoggerFactory.getLogger(this.getClass()); + private final Logger log = LoggerFactory.getLogger(this.getClass()); - @RequestMethod(Actions.EXPORT_METADATA) - public ActionResult sendMetadata(ExportPackage exportPackage) throws CannotReadException, TagException, ReadOnlyFileException, MetadataException { - try { - return exporterHelper.export(exportPackage); - } catch (IOException ioe) { - log.error(ioe.getMessage(), ioe); - return ActionResult.Error; - } + @RequestMethod(Actions.EXPORT_METADATA) + public ActionResult sendMetadata(ExportPackage exportPackage) + throws CannotReadException, TagException, ReadOnlyFileException, MetadataException { + try { + return exporterHelper.export(exportPackage); + } catch (IOException ioe) { + log.error(ioe.getMessage(), ioe); + return ActionResult.Error; } - + } } diff --git a/src/main/java/com/josdem/jmetadata/controller/FormatterController.java b/src/main/java/com/josdem/jmetadata/controller/FormatterController.java index fd82b0f..e2814ed 100644 --- a/src/main/java/com/josdem/jmetadata/controller/FormatterController.java +++ b/src/main/java/com/josdem/jmetadata/controller/FormatterController.java @@ -16,26 +16,24 @@ package com.josdem.jmetadata.controller; -import org.asmatron.messengine.annotations.RequestMethod; import com.josdem.jmetadata.action.ActionResult; import com.josdem.jmetadata.action.Actions; import com.josdem.jmetadata.model.Metadata; import com.josdem.jmetadata.service.FormatterService; +import org.asmatron.messengine.annotations.RequestMethod; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; @Controller public class FormatterController { - @Autowired - private FormatterService formatterService; - - @RequestMethod(Actions.COMPLETE_FORMATTER_METADATA) - public synchronized ActionResult format(Metadata metadata) { - formatterService.isAnalyzable(metadata); - Boolean formatted = formatterService.wasFormatted(metadata); - Boolean capitalized = formatterService.wasCamelized(metadata); - return formatted || capitalized ? ActionResult.New : ActionResult.Ready; - } + @Autowired private FormatterService formatterService; + @RequestMethod(Actions.COMPLETE_FORMATTER_METADATA) + public synchronized ActionResult format(Metadata metadata) { + formatterService.isAnalyzable(metadata); + Boolean formatted = formatterService.wasFormatted(metadata); + Boolean capitalized = formatterService.wasCamelized(metadata); + return formatted || capitalized ? ActionResult.New : ActionResult.Ready; + } } diff --git a/src/main/java/com/josdem/jmetadata/controller/LoginController.java b/src/main/java/com/josdem/jmetadata/controller/LoginController.java index c5261c7..4e6ecd6 100644 --- a/src/main/java/com/josdem/jmetadata/controller/LoginController.java +++ b/src/main/java/com/josdem/jmetadata/controller/LoginController.java @@ -16,51 +16,45 @@ package com.josdem.jmetadata.controller; -import de.umass.lastfm.Session; -import org.asmatron.messengine.annotations.ActionMethod; -import org.asmatron.messengine.engines.support.ControlEngineConfigurator; -import org.asmatron.messengine.event.ValueEvent; import com.josdem.jmetadata.action.Actions; import com.josdem.jmetadata.event.Events; import com.josdem.jmetadata.helper.LastFMAuthenticator; import com.josdem.jmetadata.model.Model; import com.josdem.jmetadata.model.User; +import de.umass.lastfm.Session; +import java.io.IOException; +import lombok.extern.slf4j.Slf4j; +import org.asmatron.messengine.annotations.ActionMethod; +import org.asmatron.messengine.engines.support.ControlEngineConfigurator; +import org.asmatron.messengine.event.ValueEvent; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; -import lombok.extern.slf4j.Slf4j; - -import java.io.IOException; @Slf4j @Controller public class LoginController { - @Autowired - private LastFMAuthenticator lastfmAuthenticator; - @Autowired - private ControlEngineConfigurator configurator; - - - - @ActionMethod(Actions.LOGIN_ID) - public void login(User user) { - var username = user.getUsername(); - var password = user.getPassword(); - log.info("Sending login information for user: {}", username); - try { - Session session = lastfmAuthenticator.login(username, password); - if (session != null) { - user.setSession(session); - configurator.getControlEngine().set(Model.CURRENT_USER, user, null); - configurator.getControlEngine().fireEvent(Events.LOGGED, new ValueEvent<>(user)); - } else { - log.warn("Session for user {} failed", username); - configurator.getControlEngine().fireEvent(Events.LOGIN_FAILED); - } - } catch (IOException ioe) { - log.error(ioe.getMessage(), ioe); - configurator.getControlEngine().fireEvent(Events.LOGIN_FAILED); - } + @Autowired private LastFMAuthenticator lastfmAuthenticator; + @Autowired private ControlEngineConfigurator configurator; + + @ActionMethod(Actions.LOGIN_ID) + public void login(User user) { + var username = user.getUsername(); + var password = user.getPassword(); + log.info("Sending login information for user: {}", username); + try { + Session session = lastfmAuthenticator.login(username, password); + if (session != null) { + user.setSession(session); + configurator.getControlEngine().set(Model.CURRENT_USER, user, null); + configurator.getControlEngine().fireEvent(Events.LOGGED, new ValueEvent<>(user)); + } else { + log.warn("Session for user {} failed", username); + configurator.getControlEngine().fireEvent(Events.LOGIN_FAILED); + } + } catch (IOException ioe) { + log.error(ioe.getMessage(), ioe); + configurator.getControlEngine().fireEvent(Events.LOGIN_FAILED); } - + } } diff --git a/src/main/java/com/josdem/jmetadata/controller/MetadataController.java b/src/main/java/com/josdem/jmetadata/controller/MetadataController.java index 3a2767e..cb7d162 100644 --- a/src/main/java/com/josdem/jmetadata/controller/MetadataController.java +++ b/src/main/java/com/josdem/jmetadata/controller/MetadataController.java @@ -16,9 +16,6 @@ package com.josdem.jmetadata.controller; -import org.asmatron.messengine.annotations.ActionMethod; -import org.asmatron.messengine.engines.support.ControlEngineConfigurator; -import org.asmatron.messengine.event.ValueEvent; import com.josdem.jmetadata.action.Actions; import com.josdem.jmetadata.event.Events; import com.josdem.jmetadata.exception.InvalidId3VersionException; @@ -27,6 +24,16 @@ import com.josdem.jmetadata.model.Metadata; import com.josdem.jmetadata.model.Model; import com.josdem.jmetadata.service.MetadataService; +import java.io.File; +import java.io.IOException; +import java.util.Collections; +import java.util.List; +import java.util.Properties; +import javax.swing.JFileChooser; +import lombok.extern.slf4j.Slf4j; +import org.asmatron.messengine.annotations.ActionMethod; +import org.asmatron.messengine.engines.support.ControlEngineConfigurator; +import org.asmatron.messengine.event.ValueEvent; import org.jaudiotagger.audio.exceptions.CannotReadException; import org.jaudiotagger.audio.exceptions.InvalidAudioFrameException; import org.jaudiotagger.audio.exceptions.ReadOnlyFileException; @@ -34,75 +41,75 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; -import javax.swing.JFileChooser; -import java.io.File; -import java.io.IOException; -import java.util.Collections; -import java.util.List; -import java.util.Properties; -import lombok.extern.slf4j.Slf4j; @Controller - @Slf4j public class MetadataController { - @Autowired - private Properties properties; - @Autowired - private MetadataService metadataService; - @Autowired - private ControlEngineConfigurator configurator; - - private List metadataList; + @Autowired private Properties properties; + @Autowired private MetadataService metadataService; + @Autowired private ControlEngineConfigurator configurator; + private List metadataList; - - @ActionMethod(Actions.GET_METADATA) - public void getMetadata() { - var fileChooser = new JFileChooser(); - fileChooser.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES); - var selection = fileChooser.showOpenDialog(null); - if (selection == JFileChooser.APPROVE_OPTION) { - File root = fileChooser.getSelectedFile(); - log.info("DIRECTORY to SCAN: {}", root); - if (root.exists()) { - configurator.getControlEngine().fireEvent(Events.DIRECTORY_SELECTED, new ValueEvent(root.getAbsolutePath())); - try { - metadataList = metadataService.extractMetadata(root); - if (metadataList.isEmpty()) { - configurator.getControlEngine().fireEvent(Events.DIRECTORY_EMPTY); - } else { - Collections.sort(metadataList); - sendLoadedEvent(metadataList); - } - } catch (IOException | TagException | ReadOnlyFileException | InvalidAudioFrameException | - InvalidId3VersionException | InterruptedException | CannotReadException | - MetadataException e) { - handleException(e); - } catch (IllegalArgumentException e) { - sendLoadedEvent(metadataList); - handleException(e); - } catch (TooMuchFilesException e) { - log.error(e.getMessage(), e); - String maxFilesAllowed = properties.getProperty("max.files.allowed"); - configurator.getControlEngine().fireEvent(Events.MUCH_FILES_LOADED, new ValueEvent(maxFilesAllowed)); - } - } else { - configurator.getControlEngine().fireEvent(Events.DIRECTORY_NOT_EXIST, new ValueEvent(root.toString())); - } - } else { - configurator.getControlEngine().fireEvent(Events.DIRECTORY_SELECTED_CANCEL); + @ActionMethod(Actions.GET_METADATA) + public void getMetadata() { + var fileChooser = new JFileChooser(); + fileChooser.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES); + var selection = fileChooser.showOpenDialog(null); + if (selection == JFileChooser.APPROVE_OPTION) { + File root = fileChooser.getSelectedFile(); + log.info("DIRECTORY to SCAN: {}", root); + if (root.exists()) { + configurator + .getControlEngine() + .fireEvent(Events.DIRECTORY_SELECTED, new ValueEvent(root.getAbsolutePath())); + try { + metadataList = metadataService.extractMetadata(root); + if (metadataList.isEmpty()) { + configurator.getControlEngine().fireEvent(Events.DIRECTORY_EMPTY); + } else { + Collections.sort(metadataList); + sendLoadedEvent(metadataList); + } + } catch (IOException + | TagException + | ReadOnlyFileException + | InvalidAudioFrameException + | InvalidId3VersionException + | InterruptedException + | CannotReadException + | MetadataException e) { + handleException(e); + } catch (IllegalArgumentException e) { + sendLoadedEvent(metadataList); + handleException(e); + } catch (TooMuchFilesException e) { + log.error(e.getMessage(), e); + String maxFilesAllowed = properties.getProperty("max.files.allowed"); + configurator + .getControlEngine() + .fireEvent(Events.MUCH_FILES_LOADED, new ValueEvent(maxFilesAllowed)); } + } else { + configurator + .getControlEngine() + .fireEvent(Events.DIRECTORY_NOT_EXIST, new ValueEvent(root.toString())); + } + } else { + configurator.getControlEngine().fireEvent(Events.DIRECTORY_SELECTED_CANCEL); } + } - private void sendLoadedEvent(List metadataList) { - configurator.getControlEngine().set(Model.METADATA, metadataList, null); - configurator.getControlEngine().fireEvent(Events.LOAD, new ValueEvent>(metadataList)); - configurator.getControlEngine().fireEvent(Events.LOADED); - } + private void sendLoadedEvent(List metadataList) { + configurator.getControlEngine().set(Model.METADATA, metadataList, null); + configurator + .getControlEngine() + .fireEvent(Events.LOAD, new ValueEvent>(metadataList)); + configurator.getControlEngine().fireEvent(Events.LOADED); + } - private void handleException(Exception e) { - log.error(e.getMessage(), e); - configurator.getControlEngine().fireEvent(Events.OPEN); - } + private void handleException(Exception e) { + log.error(e.getMessage(), e); + configurator.getControlEngine().fireEvent(Events.OPEN); + } } diff --git a/src/main/java/com/josdem/jmetadata/controller/ScrobblerController.java b/src/main/java/com/josdem/jmetadata/controller/ScrobblerController.java index d422693..37fb0a8 100644 --- a/src/main/java/com/josdem/jmetadata/controller/ScrobblerController.java +++ b/src/main/java/com/josdem/jmetadata/controller/ScrobblerController.java @@ -16,44 +16,38 @@ package com.josdem.jmetadata.controller; -import org.asmatron.messengine.annotations.RequestMethod; -import org.asmatron.messengine.engines.support.ControlEngineConfigurator; import com.josdem.jmetadata.action.ActionResult; import com.josdem.jmetadata.action.Actions; import com.josdem.jmetadata.helper.ScrobblerHelper; import com.josdem.jmetadata.model.Metadata; +import java.io.IOException; +import javax.annotation.PostConstruct; +import lombok.extern.slf4j.Slf4j; +import org.asmatron.messengine.annotations.RequestMethod; +import org.asmatron.messengine.engines.support.ControlEngineConfigurator; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; -import lombok.extern.slf4j.Slf4j; - -import javax.annotation.PostConstruct; -import java.io.IOException; @Slf4j @Controller public class ScrobblerController { - @Autowired - private ScrobblerHelper scrobblerHelper; - @Autowired - private ControlEngineConfigurator configurator; - - - - @PostConstruct - public void setup() { - scrobblerHelper.setControlEngine(configurator.getControlEngine()); - } - - @RequestMethod(Actions.SEND_METADATA) - public ActionResult sendMetadata(Metadata metadata) { - try { - log.info("Sending scrobbling for: {}", metadata.getTitle()); - return scrobblerHelper.send(metadata); - } catch (IOException | InterruptedException ioe) { - log.error(ioe.getMessage(), ioe); - return ActionResult.Error; - } + @Autowired private ScrobblerHelper scrobblerHelper; + @Autowired private ControlEngineConfigurator configurator; + + @PostConstruct + public void setup() { + scrobblerHelper.setControlEngine(configurator.getControlEngine()); + } + + @RequestMethod(Actions.SEND_METADATA) + public ActionResult sendMetadata(Metadata metadata) { + try { + log.info("Sending scrobbling for: {}", metadata.getTitle()); + return scrobblerHelper.send(metadata); + } catch (IOException | InterruptedException ioe) { + log.error(ioe.getMessage(), ioe); + return ActionResult.Error; } - + } } diff --git a/src/main/java/com/josdem/jmetadata/dnd/DnDListenerCollection.java b/src/main/java/com/josdem/jmetadata/dnd/DnDListenerCollection.java index 72a1b61..f2f0958 100644 --- a/src/main/java/com/josdem/jmetadata/dnd/DnDListenerCollection.java +++ b/src/main/java/com/josdem/jmetadata/dnd/DnDListenerCollection.java @@ -21,83 +21,84 @@ import java.util.HashMap; import java.util.List; import java.util.Map; - import lombok.extern.slf4j.Slf4j; @Slf4j - public class DnDListenerCollection { - private Map> listeners = new HashMap>(); - + private Map> listeners = new HashMap>(); - public void put(Component component, T listener) { - List listeners = null; - synchronized (this.listeners) { - listeners = this.listeners.get(component); - if (listeners == null) { - listeners = new ArrayList(); - this.listeners.put(component, listeners); - } - } - synchronized (listeners) { - for (T t : listeners) { - if (t.getClass().equals(listener.getClass()) && t.equals(listener)) { - log.warn("DUPLICATE HANDLER FOR COMPONENT: " + component + " >> " + listener.getClass().getName()); - return; - } - } - listeners.add(listener); - } - } + public void put(Component component, T listener) { + List listeners = null; + synchronized (this.listeners) { + listeners = this.listeners.get(component); + if (listeners == null) { + listeners = new ArrayList(); + this.listeners.put(component, listeners); + } + } + synchronized (listeners) { + for (T t : listeners) { + if (t.getClass().equals(listener.getClass()) && t.equals(listener)) { + log.warn( + "DUPLICATE HANDLER FOR COMPONENT: " + + component + + " >> " + + listener.getClass().getName()); + return; + } + } + listeners.add(listener); + } + } - public void remove(Component component) { - listeners.remove(component); - } + public void remove(Component component) { + listeners.remove(component); + } - public void remove(Component component, T listener) { - List listeners = this.listeners.get(component); - if (listeners != null) { - listeners.remove(listener); - if (listeners.isEmpty()) { - this.listeners.remove(component); - } - } - } + public void remove(Component component, T listener) { + List listeners = this.listeners.get(component); + if (listeners != null) { + listeners.remove(listener); + if (listeners.isEmpty()) { + this.listeners.remove(component); + } + } + } - public DnDListenerEntries getInmediateEntries(Class clazz, Component component) { - DnDListenerEntries entries = new DnDListenerEntries(); - if (component == null) { - return entries; - } - List listeners = this.listeners.get(component); - if (listeners != null) { - for (T t : listeners) { - entries.put(clazz, component, t); - } - } - if (entries.isEmpty()) { - return getInmediateEntries(clazz, component.getParent()); - } else { - return entries; - } - } + public DnDListenerEntries getInmediateEntries(Class clazz, Component component) { + DnDListenerEntries entries = new DnDListenerEntries(); + if (component == null) { + return entries; + } + List listeners = this.listeners.get(component); + if (listeners != null) { + for (T t : listeners) { + entries.put(clazz, component, t); + } + } + if (entries.isEmpty()) { + return getInmediateEntries(clazz, component.getParent()); + } else { + return entries; + } + } - public DnDListenerEntries getUpwardEntries(Class clazz, Component c) { - DnDListenerEntries dragOverListeners = new DnDListenerEntries(); - addListenersToMotionMap(clazz, c, dragOverListeners); - return dragOverListeners; - } + public DnDListenerEntries getUpwardEntries(Class clazz, Component c) { + DnDListenerEntries dragOverListeners = new DnDListenerEntries(); + addListenersToMotionMap(clazz, c, dragOverListeners); + return dragOverListeners; + } - private void addListenersToMotionMap(Class clazz, Component c, DnDListenerEntries result) { - if (c == null) { - return; - } - List list = listeners.get(c); - if (list != null) { - for (T t : list) { - result.put(clazz, c, t); - } - } - addListenersToMotionMap(clazz, c.getParent(), result); - } + private void addListenersToMotionMap(Class clazz, Component c, DnDListenerEntries result) { + if (c == null) { + return; + } + List list = listeners.get(c); + if (list != null) { + for (T t : list) { + result.put(clazz, c, t); + } + } + addListenersToMotionMap(clazz, c.getParent(), result); + } } diff --git a/src/main/java/com/josdem/jmetadata/dnd/DnDListenerEntries.java b/src/main/java/com/josdem/jmetadata/dnd/DnDListenerEntries.java index 2e819d0..2d8873c 100644 --- a/src/main/java/com/josdem/jmetadata/dnd/DnDListenerEntries.java +++ b/src/main/java/com/josdem/jmetadata/dnd/DnDListenerEntries.java @@ -21,96 +21,96 @@ import java.util.List; public class DnDListenerEntries { - @SuppressWarnings({ "rawtypes" }) - private static final DnDListenerEntries EMPTY = new DnDListenerEntries(); - private List> listeners; - - public DnDListenerEntries() { - this.listeners = new ArrayList>(); - } - - public R forEach(DoInListeners doIn) { - return forEachExclude(doIn, null); - } - - public R forEachExclude(DoInListeners doIn, DnDListenerEntries excludedListeners) { - R lastResult = null; - for (DnDEntry listener : listeners) { - if (excludedListeners == null || !excludedListeners.containsValue(listener.getKey(), listener.getValue())) { - lastResult = doIn.doIn(listener.getValue(), listener.getKey(), lastResult); - } - } - doIn.done(); - return lastResult; - } - - public void put(Class clazz, Component component, T t) { - if (this == EMPTY) { - return; - } - if (isValid(clazz, t.handledTypes())) { - listeners.add(new DnDEntry(component, t)); - } - } - - private boolean isValid(Class clazz, Class[] handledTypes) { - if (clazz == null || handledTypes == null || handledTypes.length == 0) { - return true; - } - for (Class class1 : handledTypes) { - if (clazz.isAssignableFrom(class1)) { - return true; - } - } - return false; - } - - public boolean containsValue(Component component, T value) { - if (value == null || component == null) { - return false; - } - for (DnDEntry entry : listeners) { - if (eq(value, entry.getValue()) && eq(component, entry.getKey())) { - return true; - } - } - return false; - } - - private boolean eq(Object value, Object entry) { - return value == entry || value.equals(entry); - } - - public boolean isEmpty() { - return listeners.isEmpty(); - } - - public int size() { - return listeners.size(); - } - - class DnDEntry { - private final Component component; - private final Z t; - - public DnDEntry(Component component, Z t) { - this.component = component; - this.t = t; - } - - public Component getKey() { - return component; - } - - public Z getValue() { - return t; - } - - } - - @SuppressWarnings("unchecked") - public static DnDListenerEntries empty() { - return (DnDListenerEntries) EMPTY; - } - + @SuppressWarnings({"rawtypes"}) + private static final DnDListenerEntries EMPTY = new DnDListenerEntries(); + + private List> listeners; + + public DnDListenerEntries() { + this.listeners = new ArrayList>(); + } + + public R forEach(DoInListeners doIn) { + return forEachExclude(doIn, null); + } + + public R forEachExclude(DoInListeners doIn, DnDListenerEntries excludedListeners) { + R lastResult = null; + for (DnDEntry listener : listeners) { + if (excludedListeners == null + || !excludedListeners.containsValue(listener.getKey(), listener.getValue())) { + lastResult = doIn.doIn(listener.getValue(), listener.getKey(), lastResult); + } + } + doIn.done(); + return lastResult; + } + + public void put(Class clazz, Component component, T t) { + if (this == EMPTY) { + return; + } + if (isValid(clazz, t.handledTypes())) { + listeners.add(new DnDEntry(component, t)); + } + } + + private boolean isValid(Class clazz, Class[] handledTypes) { + if (clazz == null || handledTypes == null || handledTypes.length == 0) { + return true; + } + for (Class class1 : handledTypes) { + if (clazz.isAssignableFrom(class1)) { + return true; + } + } + return false; + } + + public boolean containsValue(Component component, T value) { + if (value == null || component == null) { + return false; + } + for (DnDEntry entry : listeners) { + if (eq(value, entry.getValue()) && eq(component, entry.getKey())) { + return true; + } + } + return false; + } + + private boolean eq(Object value, Object entry) { + return value == entry || value.equals(entry); + } + + public boolean isEmpty() { + return listeners.isEmpty(); + } + + public int size() { + return listeners.size(); + } + + class DnDEntry { + private final Component component; + private final Z t; + + public DnDEntry(Component component, Z t) { + this.component = component; + this.t = t; + } + + public Component getKey() { + return component; + } + + public Z getValue() { + return t; + } + } + + @SuppressWarnings("unchecked") + public static DnDListenerEntries empty() { + return (DnDListenerEntries) EMPTY; + } } diff --git a/src/main/java/com/josdem/jmetadata/dnd/DoInListeners.java b/src/main/java/com/josdem/jmetadata/dnd/DoInListeners.java index 318db8e..dc5d397 100644 --- a/src/main/java/com/josdem/jmetadata/dnd/DoInListeners.java +++ b/src/main/java/com/josdem/jmetadata/dnd/DoInListeners.java @@ -19,6 +19,7 @@ import java.awt.Component; public interface DoInListeners { - V doIn(K listener, Component component, V lastResult); - void done(); + V doIn(K listener, Component component, V lastResult); + + void done(); } diff --git a/src/main/java/com/josdem/jmetadata/dnd/DoInListenersAdapter.java b/src/main/java/com/josdem/jmetadata/dnd/DoInListenersAdapter.java index 58b1c19..d621be4 100644 --- a/src/main/java/com/josdem/jmetadata/dnd/DoInListenersAdapter.java +++ b/src/main/java/com/josdem/jmetadata/dnd/DoInListenersAdapter.java @@ -1,16 +1,13 @@ - package com.josdem.jmetadata.dnd; import java.awt.Component; public abstract class DoInListenersAdapter implements DoInListeners { - @Override - public V doIn(K listener, Component component, V lastResult) { - return null; - } - - @Override - public void done() { - } + @Override + public V doIn(K listener, Component component, V lastResult) { + return null; + } + @Override + public void done() {} } diff --git a/src/main/java/com/josdem/jmetadata/dnd/DragAndDropAction.java b/src/main/java/com/josdem/jmetadata/dnd/DragAndDropAction.java index 99a559e..4b68d41 100644 --- a/src/main/java/com/josdem/jmetadata/dnd/DragAndDropAction.java +++ b/src/main/java/com/josdem/jmetadata/dnd/DragAndDropAction.java @@ -16,26 +16,34 @@ package com.josdem.jmetadata.dnd; -import java.awt.Component; -import java.awt.Point; - import com.josdem.jmetadata.observer.ObservValue; import com.josdem.jmetadata.observer.ObserverCollection; - +import java.awt.Component; +import java.awt.Point; public interface DragAndDropAction { - DragAndDropAction EMPTY_ACTION = new DragAndDropActionEmpty(); + DragAndDropAction EMPTY_ACTION = new DragAndDropActionEmpty(); + boolean validate(Point location); - void dragExit(); - boolean drop(Point location); - void setLocation(Point location); - void setDragObject(DraggedObject draggedObject); - void setDropListeners(DnDListenerEntries dropListeners); - void setDragListeners(DnDListenerEntries dragListeners); - ObserverCollection> onComponentChangedListener(); - Class getContentClass(); - boolean isDragObjectSet(); - boolean isDone(); + void dragExit(); + + boolean drop(Point location); + + void setLocation(Point location); + + void setDragObject(DraggedObject draggedObject); + + void setDropListeners(DnDListenerEntries dropListeners); + + void setDragListeners(DnDListenerEntries dragListeners); + + ObserverCollection> onComponentChangedListener(); + + Class getContentClass(); + + boolean isDragObjectSet(); + + boolean isDone(); } diff --git a/src/main/java/com/josdem/jmetadata/dnd/DragAndDropActionEmpty.java b/src/main/java/com/josdem/jmetadata/dnd/DragAndDropActionEmpty.java index 0a2ac67..b11d6ef 100644 --- a/src/main/java/com/josdem/jmetadata/dnd/DragAndDropActionEmpty.java +++ b/src/main/java/com/josdem/jmetadata/dnd/DragAndDropActionEmpty.java @@ -16,65 +16,56 @@ package com.josdem.jmetadata.dnd; -import java.awt.Component; -import java.awt.Point; - import com.josdem.jmetadata.observer.NullObservable; import com.josdem.jmetadata.observer.ObservValue; import com.josdem.jmetadata.observer.ObserverCollection; +import java.awt.Component; +import java.awt.Point; public class DragAndDropActionEmpty implements DragAndDropAction { - @Override - public boolean isDone() { - return true; - } - - @Override - public void dragExit() { - } - - @Override - public void setLocation(Point location) { - } - - @Override - public ObserverCollection> onComponentChangedListener() { - return NullObservable.get(); - } + @Override + public boolean isDone() { + return true; + } - @Override - public void setDropListeners(DnDListenerEntries dropListeners) { + @Override + public void dragExit() {} - } + @Override + public void setLocation(Point location) {} - @Override - public void setDragListeners(DnDListenerEntries dragListeners) { + @Override + public ObserverCollection> onComponentChangedListener() { + return NullObservable.get(); + } - } + @Override + public void setDropListeners(DnDListenerEntries dropListeners) {} - @Override - public boolean validate(Point point) { - return false; - } + @Override + public void setDragListeners(DnDListenerEntries dragListeners) {} - @Override - public boolean isDragObjectSet() { - return true; - } + @Override + public boolean validate(Point point) { + return false; + } - @Override - public void setDragObject(DraggedObject draggedObject) { - } + @Override + public boolean isDragObjectSet() { + return true; + } - @Override - public boolean drop(Point location) { - return false; - } + @Override + public void setDragObject(DraggedObject draggedObject) {} - @Override - public Class getContentClass() { - return null; - } + @Override + public boolean drop(Point location) { + return false; + } + @Override + public Class getContentClass() { + return null; + } } diff --git a/src/main/java/com/josdem/jmetadata/dnd/DragAndDropActionFactory.java b/src/main/java/com/josdem/jmetadata/dnd/DragAndDropActionFactory.java index 55a22d7..bf12b53 100644 --- a/src/main/java/com/josdem/jmetadata/dnd/DragAndDropActionFactory.java +++ b/src/main/java/com/josdem/jmetadata/dnd/DragAndDropActionFactory.java @@ -19,5 +19,5 @@ import java.awt.Container; public interface DragAndDropActionFactory { - DragAndDropAction getAction(Container frame); + DragAndDropAction getAction(Container frame); } diff --git a/src/main/java/com/josdem/jmetadata/dnd/DragAndDropActionFactoryDefault.java b/src/main/java/com/josdem/jmetadata/dnd/DragAndDropActionFactoryDefault.java index 1db48f9..2b8252c 100644 --- a/src/main/java/com/josdem/jmetadata/dnd/DragAndDropActionFactoryDefault.java +++ b/src/main/java/com/josdem/jmetadata/dnd/DragAndDropActionFactoryDefault.java @@ -23,44 +23,44 @@ import java.util.concurrent.TimeUnit; public class DragAndDropActionFactoryDefault implements DragAndDropActionFactory { - ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor(); + ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor(); - @Override - public DragAndDropAction getAction(Container frame) { - DragAndDropActionThreaded dragAndDropActionImpl = new DragAndDropActionThreaded(frame); - dragAndDropActionImpl.start(executorService); - return dragAndDropActionImpl; - } + @Override + public DragAndDropAction getAction(Container frame) { + DragAndDropActionThreaded dragAndDropActionImpl = new DragAndDropActionThreaded(frame); + dragAndDropActionImpl.start(executorService); + return dragAndDropActionImpl; + } - class DragAndDropActionThreaded extends DragAndDropActionImpl implements Runnable { - private ScheduledFuture scheduledFuture; + class DragAndDropActionThreaded extends DragAndDropActionImpl implements Runnable { + private ScheduledFuture scheduledFuture; - public DragAndDropActionThreaded(Container currentTriggerFrame) { - super(currentTriggerFrame); - } + public DragAndDropActionThreaded(Container currentTriggerFrame) { + super(currentTriggerFrame); + } - public void start(ScheduledExecutorService executorService) { - stop(); - this.scheduledFuture = executorService.scheduleAtFixedRate(this, 50, 50, TimeUnit.MILLISECONDS); - } + public void start(ScheduledExecutorService executorService) { + stop(); + this.scheduledFuture = + executorService.scheduleAtFixedRate(this, 50, 50, TimeUnit.MILLISECONDS); + } - @Override - protected void stop(boolean causeOfDrop) { - super.stop(causeOfDrop); - stop(); - } + @Override + protected void stop(boolean causeOfDrop) { + super.stop(causeOfDrop); + stop(); + } - private void stop() { - if (this.scheduledFuture != null) { - this.scheduledFuture.cancel(false); - this.scheduledFuture = null; - } - } + private void stop() { + if (this.scheduledFuture != null) { + this.scheduledFuture.cancel(false); + this.scheduledFuture = null; + } + } - @Override - public void run() { - updateDragOver(); - } - - } + @Override + public void run() { + updateDragOver(); + } + } } diff --git a/src/main/java/com/josdem/jmetadata/dnd/DragAndDropActionImpl.java b/src/main/java/com/josdem/jmetadata/dnd/DragAndDropActionImpl.java index 685095b..8b3ded7 100644 --- a/src/main/java/com/josdem/jmetadata/dnd/DragAndDropActionImpl.java +++ b/src/main/java/com/josdem/jmetadata/dnd/DragAndDropActionImpl.java @@ -16,169 +16,173 @@ package com.josdem.jmetadata.dnd; -import java.awt.Component; -import java.awt.Container; -import java.awt.Point; - import com.josdem.jmetadata.observer.NullObservable; import com.josdem.jmetadata.observer.ObservValue; import com.josdem.jmetadata.observer.Observable; import com.josdem.jmetadata.observer.ObserverCollection; +import java.awt.Component; +import java.awt.Container; +import java.awt.Point; public class DragAndDropActionImpl implements DragAndDropAction { - private DnDListenerEntries dropListeners = DnDListenerEntries.empty(); - private DnDListenerEntries dragListeners = DnDListenerEntries.empty(); - private Observable> currentComponentChanged = new Observable>(); - - private DraggedObject draggedObject = null; - private boolean validationResult = false; - - private final Container currentFrame; - private Component currentComponent; - private Point location = new Point(Integer.MIN_VALUE, Integer.MIN_VALUE); - private boolean done = false; - - public DragAndDropActionImpl(Container currentTriggerFrame) { - this.currentFrame = currentTriggerFrame; - } - - @Override - public boolean validate(final Point point) { - if (isDone()) { - return false; - } - Boolean result = false; - if (isDragObjectSet()) { - final DraggedObject draggedObject = this.draggedObject; - final DnDListenerEntries dropListeners = this.dropListeners; - result = dropListeners.forEach(DragAndDropIterators.validateDrop(draggedObject, point, currentFrame)); - result = DragAndDropIterators.createBoolean(result); - } else { - result = true; - } - if (this.validationResult != result.booleanValue()) { - final DnDListenerEntries dragListeners = this.dragListeners; - this.validationResult = result.booleanValue(); - dragListeners.forEach(DragAndDropIterators.dragAllowedChanged(result.booleanValue())); - } - return validationResult; - } - - @Override - public void dragExit() { - stop(false); - } - - @Override - public boolean drop(final Point point) { - final DraggedObject draggedObject = this.draggedObject; - final DnDListenerEntries dropListeners = this.dropListeners; - final DnDListenerEntries dragListeners = this.dragListeners; - final Container currentFrame = this.currentFrame; - final boolean isDone = isDone(); - final boolean isDragObjectSet = isDragObjectSet(); - stop(true); - boolean success = false; - if (!(isDone || !isDragObjectSet)) { - Boolean result = dropListeners.forEach(DragAndDropIterators.doDrop(point, draggedObject, currentFrame)); - success = DragAndDropIterators.createBoolean(result); - } - dragListeners.forEach(DragAndDropIterators.dropOcurred(success)); - return success; - } - - public void setLocation(Point location) { - if (isDone()) { - return; - } - if (!this.location.equals(location)) { - this.location = location; - Component newComponent = currentFrame.findComponentAt(location); - if (newComponent != null && !newComponent.equals(currentComponent)) { - currentComponent = newComponent; - currentComponentChanged.fire(new ObservValue(newComponent)); - } - } - } - - @Override - public void setDragObject(DraggedObject draggedObject) { - if (this.draggedObject != draggedObject) { - this.draggedObject = draggedObject; - currentComponentChanged.fire(new ObservValue(currentComponent)); - } - } - - public void setDropListeners(DnDListenerEntries dropListeners) { - if (dropListeners == null || isDone()) { - dropListeners = DnDListenerEntries.empty(); - } - this.dropListeners = dropListeners; - validate(location); - } - - public void setDragListeners(DnDListenerEntries dragListeners) { - setDragListeners(dragListeners, false); - } - - private void setDragListeners(DnDListenerEntries dragListeners, boolean isForDrop) { - if (dragListeners == null || isDone()) { - dragListeners = DnDListenerEntries.empty(); - } - Point location = this.location; - DnDListenerEntries lastListeners = this.dragListeners; - lastListeners.forEachExclude(DragAndDropIterators.dragExit(isForDrop), dragListeners); - DraggedObject draggedObj = draggedObject; - boolean valRes = validationResult; - Container frame = currentFrame; - dragListeners.forEachExclude(DragAndDropIterators.dragEnter(location, draggedObj, valRes, frame), lastListeners); - this.dragListeners = dragListeners; - } - - @Override - public ObserverCollection> onComponentChangedListener() { - return this.currentComponentChanged; - } - - @Override - public Class getContentClass() { - if (isDragObjectSet()) { - return draggedObject.getContentClass(); - } else { - return null; - } - } - - @Override - public boolean isDragObjectSet() { - if (isDone()) { - return true; - } - return draggedObject != null && draggedObject.get() != null; - } - - @Override - public boolean isDone() { - return done; - } - - protected void stop(boolean causeOfDrop) { - if (!isDone()) { - done = true; - currentComponentChanged.clean(); - currentComponentChanged = NullObservable.get(); - setDragListeners(null, causeOfDrop); - setDropListeners(null); - } - } - - protected void updateDragOver() { - if (isDone()) { - return; - } - final Point point = location; - final DnDListenerEntries dragListeners = this.dragListeners; - dragListeners.forEach(DragAndDropIterators.updateLocation(point, currentFrame)); - } - + private DnDListenerEntries dropListeners = DnDListenerEntries.empty(); + private DnDListenerEntries dragListeners = DnDListenerEntries.empty(); + private Observable> currentComponentChanged = + new Observable>(); + + private DraggedObject draggedObject = null; + private boolean validationResult = false; + + private final Container currentFrame; + private Component currentComponent; + private Point location = new Point(Integer.MIN_VALUE, Integer.MIN_VALUE); + private boolean done = false; + + public DragAndDropActionImpl(Container currentTriggerFrame) { + this.currentFrame = currentTriggerFrame; + } + + @Override + public boolean validate(final Point point) { + if (isDone()) { + return false; + } + Boolean result = false; + if (isDragObjectSet()) { + final DraggedObject draggedObject = this.draggedObject; + final DnDListenerEntries dropListeners = this.dropListeners; + result = + dropListeners.forEach( + DragAndDropIterators.validateDrop(draggedObject, point, currentFrame)); + result = DragAndDropIterators.createBoolean(result); + } else { + result = true; + } + if (this.validationResult != result.booleanValue()) { + final DnDListenerEntries dragListeners = this.dragListeners; + this.validationResult = result.booleanValue(); + dragListeners.forEach(DragAndDropIterators.dragAllowedChanged(result.booleanValue())); + } + return validationResult; + } + + @Override + public void dragExit() { + stop(false); + } + + @Override + public boolean drop(final Point point) { + final DraggedObject draggedObject = this.draggedObject; + final DnDListenerEntries dropListeners = this.dropListeners; + final DnDListenerEntries dragListeners = this.dragListeners; + final Container currentFrame = this.currentFrame; + final boolean isDone = isDone(); + final boolean isDragObjectSet = isDragObjectSet(); + stop(true); + boolean success = false; + if (!(isDone || !isDragObjectSet)) { + Boolean result = + dropListeners.forEach(DragAndDropIterators.doDrop(point, draggedObject, currentFrame)); + success = DragAndDropIterators.createBoolean(result); + } + dragListeners.forEach(DragAndDropIterators.dropOcurred(success)); + return success; + } + + public void setLocation(Point location) { + if (isDone()) { + return; + } + if (!this.location.equals(location)) { + this.location = location; + Component newComponent = currentFrame.findComponentAt(location); + if (newComponent != null && !newComponent.equals(currentComponent)) { + currentComponent = newComponent; + currentComponentChanged.fire(new ObservValue(newComponent)); + } + } + } + + @Override + public void setDragObject(DraggedObject draggedObject) { + if (this.draggedObject != draggedObject) { + this.draggedObject = draggedObject; + currentComponentChanged.fire(new ObservValue(currentComponent)); + } + } + + public void setDropListeners(DnDListenerEntries dropListeners) { + if (dropListeners == null || isDone()) { + dropListeners = DnDListenerEntries.empty(); + } + this.dropListeners = dropListeners; + validate(location); + } + + public void setDragListeners(DnDListenerEntries dragListeners) { + setDragListeners(dragListeners, false); + } + + private void setDragListeners( + DnDListenerEntries dragListeners, boolean isForDrop) { + if (dragListeners == null || isDone()) { + dragListeners = DnDListenerEntries.empty(); + } + Point location = this.location; + DnDListenerEntries lastListeners = this.dragListeners; + lastListeners.forEachExclude(DragAndDropIterators.dragExit(isForDrop), dragListeners); + DraggedObject draggedObj = draggedObject; + boolean valRes = validationResult; + Container frame = currentFrame; + dragListeners.forEachExclude( + DragAndDropIterators.dragEnter(location, draggedObj, valRes, frame), lastListeners); + this.dragListeners = dragListeners; + } + + @Override + public ObserverCollection> onComponentChangedListener() { + return this.currentComponentChanged; + } + + @Override + public Class getContentClass() { + if (isDragObjectSet()) { + return draggedObject.getContentClass(); + } else { + return null; + } + } + + @Override + public boolean isDragObjectSet() { + if (isDone()) { + return true; + } + return draggedObject != null && draggedObject.get() != null; + } + + @Override + public boolean isDone() { + return done; + } + + protected void stop(boolean causeOfDrop) { + if (!isDone()) { + done = true; + currentComponentChanged.clean(); + currentComponentChanged = NullObservable.get(); + setDragListeners(null, causeOfDrop); + setDropListeners(null); + } + } + + protected void updateDragOver() { + if (isDone()) { + return; + } + final Point point = location; + final DnDListenerEntries dragListeners = this.dragListeners; + dragListeners.forEach(DragAndDropIterators.updateLocation(point, currentFrame)); + } } diff --git a/src/main/java/com/josdem/jmetadata/dnd/DragAndDropAdapter.java b/src/main/java/com/josdem/jmetadata/dnd/DragAndDropAdapter.java index d63a80c..a8b2d13 100644 --- a/src/main/java/com/josdem/jmetadata/dnd/DragAndDropAdapter.java +++ b/src/main/java/com/josdem/jmetadata/dnd/DragAndDropAdapter.java @@ -20,13 +20,11 @@ public abstract class DragAndDropAdapter extends DragOverAdapter implements DropListener { - @Override - public boolean validateDrop(DraggedObject draggedObject, Point location) { - return false; - } - - @Override - public void doDrop(DraggedObject draggedObject, Point location) { - } + @Override + public boolean validateDrop(DraggedObject draggedObject, Point location) { + return false; + } + @Override + public void doDrop(DraggedObject draggedObject, Point location) {} } diff --git a/src/main/java/com/josdem/jmetadata/dnd/DragAndDropIterators.java b/src/main/java/com/josdem/jmetadata/dnd/DragAndDropIterators.java index 7d68659..2f443a7 100644 --- a/src/main/java/com/josdem/jmetadata/dnd/DragAndDropIterators.java +++ b/src/main/java/com/josdem/jmetadata/dnd/DragAndDropIterators.java @@ -20,215 +20,225 @@ import java.awt.Container; import java.awt.Point; import java.util.Arrays; - import javax.swing.SwingUtilities; - import lombok.extern.slf4j.Slf4j; - @Slf4j - public class DragAndDropIterators { - public static DoInListeners dragEnter(Point point, DraggedObject draggedObject, boolean validationResult, - Container currentFrame) { - return new DragEnterIterator(point, draggedObject, validationResult, currentFrame); - } - - public static DoInListeners dragExit(boolean causeOfDrop) { - return new DragExitIterator(causeOfDrop); - } - - public static DoInListeners updateLocation(Point point, Container currentFrame) { - return new UpdateLocationIterator(point, currentFrame); - } - - public static DoInListeners dropOcurred(boolean success) { - return new DropOcurredIterator(success); - } - - public static DoInListeners doDrop(Point point, DraggedObject draggedObject, Container currentFrame) { - return new DoDropIterator(point, draggedObject, currentFrame); - } - - public static DoInListeners validateDrop(DraggedObject draggedObject, Point point, Container currentFrame) { - return new ValidateDropIterator(draggedObject, point, currentFrame); - } - - public static DoInListeners dragAllowedChanged(boolean validationResult) { - return new DragAllowedChangedIterator(validationResult); - } - - private static final class DragEnterIterator extends DoInListenersAdapter { - private final Point point; - private final DraggedObject draggedObject; - private final boolean validationResult; - private final Container currentFrame; - - private DragEnterIterator(Point point, DraggedObject draggedObject, boolean validationResult, Container currentFrame) { - this.point = point; - this.draggedObject = draggedObject; - this.validationResult = validationResult; - this.currentFrame = currentFrame; - } - - @Override - public Void doIn(DragOverListener listener, Component component, Void lastResult) { - log("dragEnter", component, listener); - listener.dragEnter(draggedObject); - listener.dragAllowedChanged(validationResult); - Point location = convertToComponentRelativePoint(point, currentFrame, component); - listener.updateLocation(location); - return null; - } - } - - private static final class DragExitIterator extends DoInListenersAdapter { - private final boolean causeOfDrop; - - private DragExitIterator(boolean causeOfDrop) { - this.causeOfDrop = causeOfDrop; - } - - @Override - public Void doIn(DragOverListener listener, Component component, Void lastResult) { - log("dragExit", component, listener); - listener.dragExit(causeOfDrop); - return null; - } - } - - private static final class UpdateLocationIterator extends DoInListenersAdapter { - private final Point point; - private final Container currentFrame; - - private UpdateLocationIterator(Point point, Container currentFrame) { - this.point = point; - this.currentFrame = currentFrame; - } - - @Override - public Void doIn(DragOverListener listener, Component component, Void lastResult) { - log("updateLocation", component, listener); - Point location = convertToComponentRelativePoint(point, currentFrame, component); - listener.updateLocation(location); - return null; - } - } - - private static final class DropOcurredIterator extends DoInListenersAdapter { - private final boolean success; - - private DropOcurredIterator(boolean success) { - this.success = success; - } - - @Override - public Void doIn(DragOverListener listener, Component component, Void lastResult) { - log("dropOcurred", component, listener); - listener.dropOcurred(success); - return null; - } - } - - private static final class DoDropIterator implements DoInListeners { - private final Point point; - private final DraggedObject draggedObject; - private final Container currentFrame; - - // private ExecutorService executorService; - - private DoDropIterator(Point point, DraggedObject draggedObject, Container currentFrame) { - this.point = point; - this.draggedObject = draggedObject; - this.currentFrame = currentFrame; - // executorService = Executors.newSingleThreadExecutor(); - } - - @Override - public Boolean doIn(DropListener listener, Component component, Boolean lastResult) { - log("doDrop", component, listener); - Point location = convertToComponentRelativePoint(point, currentFrame, component); - boolean validateDrop = listener.validateDrop(draggedObject, location); - if (validateDrop) { - doDrop(listener, draggedObject, location); - } - return createBoolean(validateDrop, lastResult); - } - - private void doDrop(final DropListener listener, final DraggedObject draggedObject, final Point location) { - // executorService.execute(new Runnable() { - // @Override - // public void run() { - listener.doDrop(draggedObject, location); - // } - // }); - } - - @Override - public void done() { - // executorService.shutdown(); - } - } - - private static final class ValidateDropIterator extends DoInListenersAdapter { - private final DraggedObject draggedObject; - private final Point point; - private final Container currentFrame; - - private ValidateDropIterator(DraggedObject draggedObject, Point point, Container currentFrame) { - this.draggedObject = draggedObject; - this.point = point; - this.currentFrame = currentFrame; - } - - @Override - public Boolean doIn(DropListener listener, Component component, Boolean lastResult) { - log("validateDrop", component, listener); - Point location = convertToComponentRelativePoint(point, currentFrame, component); - boolean validateDrop = listener.validateDrop(draggedObject, location); - return createBoolean(validateDrop, lastResult); - } - } - - private static final class DragAllowedChangedIterator extends DoInListenersAdapter { - private final boolean validationResult; - - private DragAllowedChangedIterator(boolean validationResult) { - this.validationResult = validationResult; - } - - @Override - public Void doIn(DragOverListener listener, Component component, Void lastResult) { - log("dragAllowedChanged", component, listener); - listener.dragAllowedChanged(validationResult); - return null; - } - } - - private static Point convertToComponentRelativePoint(Point location, Container currentFrame, Component component) { - Point componentLocation = new Point(0, 0); - if (component == currentFrame) { - componentLocation = (Point) location.clone(); - } else if (component != null) { - componentLocation = SwingUtilities.convertPoint(currentFrame, location, component); - } - return componentLocation; - } - - public static boolean createBoolean(Boolean... booleans) { - if (booleans == null || booleans.length == 0) { - return false; - } - for (Boolean bool : booleans) { - if (bool != null && bool) { - return true; - } - } - return false; - } - - private static void log(String method, Object... objects) { - log.debug("[" + method + "] " + Arrays.toString(objects)); - } + public static DoInListeners dragEnter( + Point point, DraggedObject draggedObject, boolean validationResult, Container currentFrame) { + return new DragEnterIterator(point, draggedObject, validationResult, currentFrame); + } + + public static DoInListeners dragExit(boolean causeOfDrop) { + return new DragExitIterator(causeOfDrop); + } + + public static DoInListeners updateLocation( + Point point, Container currentFrame) { + return new UpdateLocationIterator(point, currentFrame); + } + + public static DoInListeners dropOcurred(boolean success) { + return new DropOcurredIterator(success); + } + + public static DoInListeners doDrop( + Point point, DraggedObject draggedObject, Container currentFrame) { + return new DoDropIterator(point, draggedObject, currentFrame); + } + + public static DoInListeners validateDrop( + DraggedObject draggedObject, Point point, Container currentFrame) { + return new ValidateDropIterator(draggedObject, point, currentFrame); + } + + public static DoInListeners dragAllowedChanged(boolean validationResult) { + return new DragAllowedChangedIterator(validationResult); + } + + private static final class DragEnterIterator + extends DoInListenersAdapter { + private final Point point; + private final DraggedObject draggedObject; + private final boolean validationResult; + private final Container currentFrame; + + private DragEnterIterator( + Point point, + DraggedObject draggedObject, + boolean validationResult, + Container currentFrame) { + this.point = point; + this.draggedObject = draggedObject; + this.validationResult = validationResult; + this.currentFrame = currentFrame; + } + + @Override + public Void doIn(DragOverListener listener, Component component, Void lastResult) { + log("dragEnter", component, listener); + listener.dragEnter(draggedObject); + listener.dragAllowedChanged(validationResult); + Point location = convertToComponentRelativePoint(point, currentFrame, component); + listener.updateLocation(location); + return null; + } + } + + private static final class DragExitIterator extends DoInListenersAdapter { + private final boolean causeOfDrop; + + private DragExitIterator(boolean causeOfDrop) { + this.causeOfDrop = causeOfDrop; + } + + @Override + public Void doIn(DragOverListener listener, Component component, Void lastResult) { + log("dragExit", component, listener); + listener.dragExit(causeOfDrop); + return null; + } + } + + private static final class UpdateLocationIterator + extends DoInListenersAdapter { + private final Point point; + private final Container currentFrame; + + private UpdateLocationIterator(Point point, Container currentFrame) { + this.point = point; + this.currentFrame = currentFrame; + } + + @Override + public Void doIn(DragOverListener listener, Component component, Void lastResult) { + log("updateLocation", component, listener); + Point location = convertToComponentRelativePoint(point, currentFrame, component); + listener.updateLocation(location); + return null; + } + } + + private static final class DropOcurredIterator + extends DoInListenersAdapter { + private final boolean success; + + private DropOcurredIterator(boolean success) { + this.success = success; + } + + @Override + public Void doIn(DragOverListener listener, Component component, Void lastResult) { + log("dropOcurred", component, listener); + listener.dropOcurred(success); + return null; + } + } + + private static final class DoDropIterator implements DoInListeners { + private final Point point; + private final DraggedObject draggedObject; + private final Container currentFrame; + + // private ExecutorService executorService; + + private DoDropIterator(Point point, DraggedObject draggedObject, Container currentFrame) { + this.point = point; + this.draggedObject = draggedObject; + this.currentFrame = currentFrame; + // executorService = Executors.newSingleThreadExecutor(); + } + + @Override + public Boolean doIn(DropListener listener, Component component, Boolean lastResult) { + log("doDrop", component, listener); + Point location = convertToComponentRelativePoint(point, currentFrame, component); + boolean validateDrop = listener.validateDrop(draggedObject, location); + if (validateDrop) { + doDrop(listener, draggedObject, location); + } + return createBoolean(validateDrop, lastResult); + } + + private void doDrop( + final DropListener listener, final DraggedObject draggedObject, final Point location) { + // executorService.execute(new Runnable() { + // @Override + // public void run() { + listener.doDrop(draggedObject, location); + // } + // }); + } + + @Override + public void done() { + // executorService.shutdown(); + } + } + + private static final class ValidateDropIterator + extends DoInListenersAdapter { + private final DraggedObject draggedObject; + private final Point point; + private final Container currentFrame; + + private ValidateDropIterator(DraggedObject draggedObject, Point point, Container currentFrame) { + this.draggedObject = draggedObject; + this.point = point; + this.currentFrame = currentFrame; + } + + @Override + public Boolean doIn(DropListener listener, Component component, Boolean lastResult) { + log("validateDrop", component, listener); + Point location = convertToComponentRelativePoint(point, currentFrame, component); + boolean validateDrop = listener.validateDrop(draggedObject, location); + return createBoolean(validateDrop, lastResult); + } + } + + private static final class DragAllowedChangedIterator + extends DoInListenersAdapter { + private final boolean validationResult; + + private DragAllowedChangedIterator(boolean validationResult) { + this.validationResult = validationResult; + } + + @Override + public Void doIn(DragOverListener listener, Component component, Void lastResult) { + log("dragAllowedChanged", component, listener); + listener.dragAllowedChanged(validationResult); + return null; + } + } + + private static Point convertToComponentRelativePoint( + Point location, Container currentFrame, Component component) { + Point componentLocation = new Point(0, 0); + if (component == currentFrame) { + componentLocation = (Point) location.clone(); + } else if (component != null) { + componentLocation = SwingUtilities.convertPoint(currentFrame, location, component); + } + return componentLocation; + } + + public static boolean createBoolean(Boolean... booleans) { + if (booleans == null || booleans.length == 0) { + return false; + } + for (Boolean bool : booleans) { + if (bool != null && bool) { + return true; + } + } + return false; + } + + private static void log(String method, Object... objects) { + log.debug("[" + method + "] " + Arrays.toString(objects)); + } } diff --git a/src/main/java/com/josdem/jmetadata/dnd/DragAndDropListener.java b/src/main/java/com/josdem/jmetadata/dnd/DragAndDropListener.java index 318c2fd..ed40f51 100644 --- a/src/main/java/com/josdem/jmetadata/dnd/DragAndDropListener.java +++ b/src/main/java/com/josdem/jmetadata/dnd/DragAndDropListener.java @@ -17,5 +17,5 @@ package com.josdem.jmetadata.dnd; public interface DragAndDropListener { - Class[] handledTypes(); + Class[] handledTypes(); } diff --git a/src/main/java/com/josdem/jmetadata/dnd/DragOverAdapter.java b/src/main/java/com/josdem/jmetadata/dnd/DragOverAdapter.java index ca1bfd7..5b2e57e 100644 --- a/src/main/java/com/josdem/jmetadata/dnd/DragOverAdapter.java +++ b/src/main/java/com/josdem/jmetadata/dnd/DragOverAdapter.java @@ -19,23 +19,18 @@ import java.awt.Point; public abstract class DragOverAdapter implements DragOverListener { - @Override - public void dragEnter(DraggedObject o) { - } + @Override + public void dragEnter(DraggedObject o) {} - @Override - public void dragExit(boolean dropped) { - } + @Override + public void dragExit(boolean dropped) {} - @Override - public void updateLocation(Point location) { - } + @Override + public void updateLocation(Point location) {} - @Override - public void dragAllowedChanged(boolean newStatus) { - } + @Override + public void dragAllowedChanged(boolean newStatus) {} - @Override - public void dropOcurred(boolean success) { - } + @Override + public void dropOcurred(boolean success) {} } diff --git a/src/main/java/com/josdem/jmetadata/dnd/DragOverListener.java b/src/main/java/com/josdem/jmetadata/dnd/DragOverListener.java index 640a2dc..6a9a168 100644 --- a/src/main/java/com/josdem/jmetadata/dnd/DragOverListener.java +++ b/src/main/java/com/josdem/jmetadata/dnd/DragOverListener.java @@ -19,9 +19,13 @@ import java.awt.Point; public interface DragOverListener extends DragAndDropListener { - void updateLocation(Point location); - void dragEnter(DraggedObject dragObject); - void dragExit(boolean dropped); - void dropOcurred(boolean success); - void dragAllowedChanged(boolean newStatus); + void updateLocation(Point location); + + void dragEnter(DraggedObject dragObject); + + void dragExit(boolean dropped); + + void dropOcurred(boolean success); + + void dragAllowedChanged(boolean newStatus); } diff --git a/src/main/java/com/josdem/jmetadata/dnd/DragRemoveListener.java b/src/main/java/com/josdem/jmetadata/dnd/DragRemoveListener.java index 9f6c856..d75238b 100644 --- a/src/main/java/com/josdem/jmetadata/dnd/DragRemoveListener.java +++ b/src/main/java/com/josdem/jmetadata/dnd/DragRemoveListener.java @@ -17,5 +17,5 @@ package com.josdem.jmetadata.dnd; public interface DragRemoveListener { - void remove(Object parent, Object child); + void remove(Object parent, Object child); } diff --git a/src/main/java/com/josdem/jmetadata/dnd/DragTooltipDialog.java b/src/main/java/com/josdem/jmetadata/dnd/DragTooltipDialog.java index cb6c6e0..6b4dd71 100644 --- a/src/main/java/com/josdem/jmetadata/dnd/DragTooltipDialog.java +++ b/src/main/java/com/josdem/jmetadata/dnd/DragTooltipDialog.java @@ -16,6 +16,8 @@ package com.josdem.jmetadata.dnd; +import com.josdem.jmetadata.util.FileSystemValidatorLight; +import com.josdem.jmetadata.util.Picture; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Cursor; @@ -29,330 +31,328 @@ import java.io.File; import java.util.Arrays; import java.util.List; - import javax.swing.BoxLayout; import javax.swing.JDialog; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; - -import com.josdem.jmetadata.util.Picture; -import com.josdem.jmetadata.util.FileSystemValidatorLight; - import lombok.extern.slf4j.Slf4j; @Slf4j - public class DragTooltipDialog extends JDialog { - private static final String DRAG_DIALOG_NAME = "dragDialog"; - - - - private static final Rectangle DRAG_ICON_BOUNDS = new Rectangle(1, 1, 18, 18); - private static final int DEFAULT_MIN_FONT_WIDTH = 4; - private static final int SPACER_WIDTH = 4; - private static final int ROW_HEIGHT = 20; - - public enum IconType { - Folder("folders", "dragFolder", Object.class, 14, 14), Playlist("playlists", "dragPlaylist", Object.class, 14, 14), Track( - "tracks", "dragTrack", Object.class, 14, 14), Download("downloads", "dragTrack", Object.class, 14, 14), Contact( - "contacts", "dragContacts", Object.class, 7, 14) { - @Override - public boolean matches(Object arg0) { - return super.matches(arg0); - } - }, - PendingEmail("pending emails", "dragPendingEmail", Object.class, 16, 14) { - @Override - public boolean matches(Object arg0) { - return super.matches(arg0); - } - }; - - private final String text; - private final String synthName; - private final Class clazz; - private final int height; - private final int width; - - private IconType(String text, String synthName, Class clazz, int width, int height) { - this.text = text; - this.synthName = synthName; - this.clazz = clazz; - this.width = width; - this.height = height; - } - - public String getText() { - return text; - } - - public static IconType getIconType(Object object) { - for (IconType iconType : values()) { - if (iconType.matches(object)) { - return iconType; - } - } - return null; - } - - public boolean matches(Object o) { - return clazz.isAssignableFrom(o.getClass()); - } - } - - private static final long serialVersionUID = 1L; - private JPanel jContentPane = null; - private JLabel dragIcon = null; - private JPanel descriptionPanel = null; - private Dimension fullSize = new Dimension(100, 100); - private static final Dimension compactSize = new Dimension(44, 44); - private JPanel dragAcceptedPanel; - private boolean allowed; - - public DragTooltipDialog(Window owner) { - super((owner instanceof Frame) ? (JFrame) owner : null, null, false, TransparencyManagerFactory.getManager() - .getTranslucencyCapableGC()); - initialize(); - TransparencyManagerFactory.getManager().setWindowOpaque(this, false); - } - - private void initialize() { - this.setSize(this.getPreferredSize()); - this.setCursor(new Cursor(Cursor.DEFAULT_CURSOR)); - this.setContentPane(getJContentPane()); - this.setUndecorated(true); - this.setAlwaysOnTop(true); - } - - public void setAllowed(boolean allowed) { - this.allowed = allowed; - if (!isVisible()) { - return; - } - if (dragIcon != null) { - try { - if (allowed) { - this.setContentPane(getDragAcceptedPanel()); - this.setSize(compactSize); - dragIcon.setName("dragPermitted"); - } else { - this.setContentPane(getJContentPane()); - this.setSize(fullSize); - dragIcon.setName("dragNotPermitted"); - } - } catch (IllegalArgumentException ex) { - log.debug("Drag tootltip display error."); - } - } - TransparencyManagerFactory.getManager().setWindowOpaque(this, false); - } - - private void setFullSize(Dimension contentSize) { - setFullSize(24 + contentSize.width, Math.max(20, contentSize.height)); - } - - private void setFullSize(int width, int height) { - this.fullSize = new Dimension(width, height); - setAllowed(allowed); - } - - private JPanel getDragAcceptedPanel() { - if (dragAcceptedPanel == null) { - dragAcceptedPanel = new JPanel(new BorderLayout()); - dragAcceptedPanel.setName("transparent"); - JLabel dragIconAccepted = new JLabel(); - dragIconAccepted.setName("dragPermittedPanel"); - dragAcceptedPanel.add(dragIconAccepted, BorderLayout.CENTER); - dragAcceptedPanel.setSize(compactSize); - } - return dragAcceptedPanel; - } - - public void setContent(FileSystemValidatorLight validator) { - jContentPane.setName(DRAG_DIALOG_NAME); - int height = 0; - int width = 0; - Dimension contentSize = new Dimension(width, height); - this.setFullSize(contentSize); - TransparencyManagerFactory.getManager().setWindowOpaque(this, false); - } - - public void setContent(String... message) { - jContentPane.setName(DRAG_DIALOG_NAME); - Dimension contentSize = fillContent(Arrays.asList(message)); - this.setFullSize(contentSize); - } - - public void setContent(final Picture picture) { - jContentPane.setName(DRAG_DIALOG_NAME); - final Dimension d = calculateImagePanelSize(picture); - final int width = d.width; - final int height = d.height; - JPanel imagePanel = new JPanel() { - private static final long serialVersionUID = 1L; - - @Override - protected void paintComponent(Graphics g) { - g.drawImage(picture.getImage(), 0, 0, width, height, null); - } - }; - descriptionPanel.setBounds(7, 20, width, height); - descriptionPanel.add(imagePanel); - this.setFullSize(width + 14, height + dragIcon.getHeight() + 7); - TransparencyManagerFactory.getManager().setWindowOpaque(this, false); - } - - private Dimension fillContent(List... stuff) { - int height = 0; - int width = 0; - for (List list : stuff) { - DynamicPanel dynamicPanel = getDynamicPanel(list); - if (dynamicPanel == null) { - continue; - } - width = Math.max(width, dynamicPanel.getPanelWidth()); - height += dynamicPanel.getPanelHeight(); - descriptionPanel.setBounds(21, 3, width, height); - descriptionPanel.add(dynamicPanel.getPanel()); - } - TransparencyManagerFactory.getManager().setWindowOpaque(this, false); - return new Dimension(width, height); - } - - private Dimension calculateImagePanelSize(Picture picture) { - int width = 100; - int height = 100; - int imgW = picture.getImage().getWidth(null); - int imgH = picture.getImage().getHeight(null); - if (imgW > imgH) { - height = (imgH * 100) / imgW; - } else { - width = (imgW * 100) / imgH; - } - return new Dimension(width, height); - } - - private JPanel getJContentPane() { - if (jContentPane == null) { - jContentPane = new JPanel(null); - jContentPane.setName(DRAG_DIALOG_NAME); - jContentPane.add(getDragIcon()); - jContentPane.add(getDescriptionPanel()); - } - return jContentPane; - } - - private JPanel getDescriptionPanel() { - if (descriptionPanel == null) { - descriptionPanel = new JPanel(); - descriptionPanel.setLayout(new BoxLayout(descriptionPanel, BoxLayout.Y_AXIS)); - } - return descriptionPanel; - } - - private DynamicPanel getDynamicPanel(List list) { - if (list == null || list.isEmpty()) { - return null; - } - IconType type = IconType.getIconType(list.get(0)); - return getDynamicPanel(type, list); - } - - private DynamicPanel getDynamicPanel(IconType type, List list) { - if (list == null || list.isEmpty()) { - return null; - } - - JPanel dynamicPanel = null; - JLabel dynamicText = null; - - String text = list.isEmpty() ? null : (list.size()) + " " + (type == null ? "ERROR" : type.getText()); - if (list.size() == 1) { - text = list.get(0) instanceof File ? ((File) list.get(0)).getName() : list.get(0).toString(); - } - - dynamicText = new JLabel(text); - dynamicText.setForeground(Color.WHITE); - FontMetrics fontMetrics = dynamicText.getFontMetrics(dynamicText.getFont()); - int width = fontMetrics.stringWidth(dynamicText.getText()) + DEFAULT_MIN_FONT_WIDTH; - int realHeight = ROW_HEIGHT; - String longestText = ""; - while (text.contains("
")) { - text = text.substring(text.indexOf("
") + DEFAULT_MIN_FONT_WIDTH); - if (text.length() > longestText.length()) { - longestText = text; - } - realHeight += ROW_HEIGHT; - } - if (!longestText.isEmpty()) { - width = fontMetrics.stringWidth(longestText) + DEFAULT_MIN_FONT_WIDTH; - } - dynamicPanel = new JPanel(); - dynamicPanel.setLayout(new FlowLayout(FlowLayout.LEFT, 0, 0)); - dynamicPanel.setMaximumSize(new Dimension(Integer.MAX_VALUE, realHeight)); - dynamicPanel.setMinimumSize(new Dimension(0, realHeight)); - dynamicPanel.setPreferredSize(new Dimension(100, realHeight)); - dynamicPanel.setSize(new Dimension(100, realHeight)); - if (type != null) { - dynamicPanel.add(getDynamicIcon(type), null); - JPanel spacer = new JPanel(); - Dimension d = new Dimension(SPACER_WIDTH, SPACER_WIDTH); - width += SPACER_WIDTH; - - spacer.setSize(d); - spacer.setMinimumSize(d); - spacer.setMaximumSize(d); - spacer.setPreferredSize(d); - dynamicPanel.add(spacer); - width += type.width; - } - dynamicPanel.add(dynamicText); - return new DynamicPanel(dynamicPanel, width, realHeight); - } - - private JPanel getDynamicIcon(IconType type) { - JPanel dynamicIcon = null; - dynamicIcon = new JPanel(); - dynamicIcon.setMaximumSize(new Dimension(type.width, type.height)); - dynamicIcon.setPreferredSize(new Dimension(type.width, type.height)); - dynamicIcon.setName(type.synthName); - dynamicIcon.setMinimumSize(new Dimension(type.width, type.height)); - return dynamicIcon; - } - - private JLabel getDragIcon() { - if (dragIcon == null) { - dragIcon = new JLabel(); - dragIcon.setText(""); - dragIcon.setBounds(DRAG_ICON_BOUNDS); - } - return dragIcon; - } - + private static final String DRAG_DIALOG_NAME = "dragDialog"; + + private static final Rectangle DRAG_ICON_BOUNDS = new Rectangle(1, 1, 18, 18); + private static final int DEFAULT_MIN_FONT_WIDTH = 4; + private static final int SPACER_WIDTH = 4; + private static final int ROW_HEIGHT = 20; + + public enum IconType { + Folder("folders", "dragFolder", Object.class, 14, 14), + Playlist("playlists", "dragPlaylist", Object.class, 14, 14), + Track("tracks", "dragTrack", Object.class, 14, 14), + Download("downloads", "dragTrack", Object.class, 14, 14), + Contact("contacts", "dragContacts", Object.class, 7, 14) { + @Override + public boolean matches(Object arg0) { + return super.matches(arg0); + } + }, + PendingEmail("pending emails", "dragPendingEmail", Object.class, 16, 14) { + @Override + public boolean matches(Object arg0) { + return super.matches(arg0); + } + }; + + private final String text; + private final String synthName; + private final Class clazz; + private final int height; + private final int width; + + private IconType(String text, String synthName, Class clazz, int width, int height) { + this.text = text; + this.synthName = synthName; + this.clazz = clazz; + this.width = width; + this.height = height; + } + + public String getText() { + return text; + } + + public static IconType getIconType(Object object) { + for (IconType iconType : values()) { + if (iconType.matches(object)) { + return iconType; + } + } + return null; + } + + public boolean matches(Object o) { + return clazz.isAssignableFrom(o.getClass()); + } + } + + private static final long serialVersionUID = 1L; + private JPanel jContentPane = null; + private JLabel dragIcon = null; + private JPanel descriptionPanel = null; + private Dimension fullSize = new Dimension(100, 100); + private static final Dimension compactSize = new Dimension(44, 44); + private JPanel dragAcceptedPanel; + private boolean allowed; + + public DragTooltipDialog(Window owner) { + super( + (owner instanceof Frame) ? (JFrame) owner : null, + null, + false, + TransparencyManagerFactory.getManager().getTranslucencyCapableGC()); + initialize(); + TransparencyManagerFactory.getManager().setWindowOpaque(this, false); + } + + private void initialize() { + this.setSize(this.getPreferredSize()); + this.setCursor(new Cursor(Cursor.DEFAULT_CURSOR)); + this.setContentPane(getJContentPane()); + this.setUndecorated(true); + this.setAlwaysOnTop(true); + } + + public void setAllowed(boolean allowed) { + this.allowed = allowed; + if (!isVisible()) { + return; + } + if (dragIcon != null) { + try { + if (allowed) { + this.setContentPane(getDragAcceptedPanel()); + this.setSize(compactSize); + dragIcon.setName("dragPermitted"); + } else { + this.setContentPane(getJContentPane()); + this.setSize(fullSize); + dragIcon.setName("dragNotPermitted"); + } + } catch (IllegalArgumentException ex) { + log.debug("Drag tootltip display error."); + } + } + TransparencyManagerFactory.getManager().setWindowOpaque(this, false); + } + + private void setFullSize(Dimension contentSize) { + setFullSize(24 + contentSize.width, Math.max(20, contentSize.height)); + } + + private void setFullSize(int width, int height) { + this.fullSize = new Dimension(width, height); + setAllowed(allowed); + } + + private JPanel getDragAcceptedPanel() { + if (dragAcceptedPanel == null) { + dragAcceptedPanel = new JPanel(new BorderLayout()); + dragAcceptedPanel.setName("transparent"); + JLabel dragIconAccepted = new JLabel(); + dragIconAccepted.setName("dragPermittedPanel"); + dragAcceptedPanel.add(dragIconAccepted, BorderLayout.CENTER); + dragAcceptedPanel.setSize(compactSize); + } + return dragAcceptedPanel; + } + + public void setContent(FileSystemValidatorLight validator) { + jContentPane.setName(DRAG_DIALOG_NAME); + int height = 0; + int width = 0; + Dimension contentSize = new Dimension(width, height); + this.setFullSize(contentSize); + TransparencyManagerFactory.getManager().setWindowOpaque(this, false); + } + + public void setContent(String... message) { + jContentPane.setName(DRAG_DIALOG_NAME); + Dimension contentSize = fillContent(Arrays.asList(message)); + this.setFullSize(contentSize); + } + + public void setContent(final Picture picture) { + jContentPane.setName(DRAG_DIALOG_NAME); + final Dimension d = calculateImagePanelSize(picture); + final int width = d.width; + final int height = d.height; + JPanel imagePanel = + new JPanel() { + private static final long serialVersionUID = 1L; + + @Override + protected void paintComponent(Graphics g) { + g.drawImage(picture.getImage(), 0, 0, width, height, null); + } + }; + descriptionPanel.setBounds(7, 20, width, height); + descriptionPanel.add(imagePanel); + this.setFullSize(width + 14, height + dragIcon.getHeight() + 7); + TransparencyManagerFactory.getManager().setWindowOpaque(this, false); + } + + private Dimension fillContent(List... stuff) { + int height = 0; + int width = 0; + for (List list : stuff) { + DynamicPanel dynamicPanel = getDynamicPanel(list); + if (dynamicPanel == null) { + continue; + } + width = Math.max(width, dynamicPanel.getPanelWidth()); + height += dynamicPanel.getPanelHeight(); + descriptionPanel.setBounds(21, 3, width, height); + descriptionPanel.add(dynamicPanel.getPanel()); + } + TransparencyManagerFactory.getManager().setWindowOpaque(this, false); + return new Dimension(width, height); + } + + private Dimension calculateImagePanelSize(Picture picture) { + int width = 100; + int height = 100; + int imgW = picture.getImage().getWidth(null); + int imgH = picture.getImage().getHeight(null); + if (imgW > imgH) { + height = (imgH * 100) / imgW; + } else { + width = (imgW * 100) / imgH; + } + return new Dimension(width, height); + } + + private JPanel getJContentPane() { + if (jContentPane == null) { + jContentPane = new JPanel(null); + jContentPane.setName(DRAG_DIALOG_NAME); + jContentPane.add(getDragIcon()); + jContentPane.add(getDescriptionPanel()); + } + return jContentPane; + } + + private JPanel getDescriptionPanel() { + if (descriptionPanel == null) { + descriptionPanel = new JPanel(); + descriptionPanel.setLayout(new BoxLayout(descriptionPanel, BoxLayout.Y_AXIS)); + } + return descriptionPanel; + } + + private DynamicPanel getDynamicPanel(List list) { + if (list == null || list.isEmpty()) { + return null; + } + IconType type = IconType.getIconType(list.get(0)); + return getDynamicPanel(type, list); + } + + private DynamicPanel getDynamicPanel(IconType type, List list) { + if (list == null || list.isEmpty()) { + return null; + } + + JPanel dynamicPanel = null; + JLabel dynamicText = null; + + String text = + list.isEmpty() ? null : (list.size()) + " " + (type == null ? "ERROR" : type.getText()); + if (list.size() == 1) { + text = list.get(0) instanceof File ? ((File) list.get(0)).getName() : list.get(0).toString(); + } + + dynamicText = new JLabel(text); + dynamicText.setForeground(Color.WHITE); + FontMetrics fontMetrics = dynamicText.getFontMetrics(dynamicText.getFont()); + int width = fontMetrics.stringWidth(dynamicText.getText()) + DEFAULT_MIN_FONT_WIDTH; + int realHeight = ROW_HEIGHT; + String longestText = ""; + while (text.contains("
")) { + text = text.substring(text.indexOf("
") + DEFAULT_MIN_FONT_WIDTH); + if (text.length() > longestText.length()) { + longestText = text; + } + realHeight += ROW_HEIGHT; + } + if (!longestText.isEmpty()) { + width = fontMetrics.stringWidth(longestText) + DEFAULT_MIN_FONT_WIDTH; + } + dynamicPanel = new JPanel(); + dynamicPanel.setLayout(new FlowLayout(FlowLayout.LEFT, 0, 0)); + dynamicPanel.setMaximumSize(new Dimension(Integer.MAX_VALUE, realHeight)); + dynamicPanel.setMinimumSize(new Dimension(0, realHeight)); + dynamicPanel.setPreferredSize(new Dimension(100, realHeight)); + dynamicPanel.setSize(new Dimension(100, realHeight)); + if (type != null) { + dynamicPanel.add(getDynamicIcon(type), null); + JPanel spacer = new JPanel(); + Dimension d = new Dimension(SPACER_WIDTH, SPACER_WIDTH); + width += SPACER_WIDTH; + + spacer.setSize(d); + spacer.setMinimumSize(d); + spacer.setMaximumSize(d); + spacer.setPreferredSize(d); + dynamicPanel.add(spacer); + width += type.width; + } + dynamicPanel.add(dynamicText); + return new DynamicPanel(dynamicPanel, width, realHeight); + } + + private JPanel getDynamicIcon(IconType type) { + JPanel dynamicIcon = null; + dynamicIcon = new JPanel(); + dynamicIcon.setMaximumSize(new Dimension(type.width, type.height)); + dynamicIcon.setPreferredSize(new Dimension(type.width, type.height)); + dynamicIcon.setName(type.synthName); + dynamicIcon.setMinimumSize(new Dimension(type.width, type.height)); + return dynamicIcon; + } + + private JLabel getDragIcon() { + if (dragIcon == null) { + dragIcon = new JLabel(); + dragIcon.setText(""); + dragIcon.setBounds(DRAG_ICON_BOUNDS); + } + return dragIcon; + } } class DynamicPanel { - private JPanel panel; - private int panelWidth; - private int panelHeight; + private JPanel panel; + private int panelWidth; + private int panelHeight; - public DynamicPanel(JPanel panel, int panelWidth, int panelHeight) { - super(); - this.panel = panel; - this.panelWidth = panelWidth; - this.panelHeight = panelHeight; - } + public DynamicPanel(JPanel panel, int panelWidth, int panelHeight) { + super(); + this.panel = panel; + this.panelWidth = panelWidth; + this.panelHeight = panelHeight; + } - public JPanel getPanel() { - return panel; - } + public JPanel getPanel() { + return panel; + } - public int getPanelWidth() { - return panelWidth; - } + public int getPanelWidth() { + return panelWidth; + } public int getPanelHeight() { - return panelHeight; - } + return panelHeight; + } } diff --git a/src/main/java/com/josdem/jmetadata/dnd/DraggedObject.java b/src/main/java/com/josdem/jmetadata/dnd/DraggedObject.java index b8d1ce4..a1a3b7a 100644 --- a/src/main/java/com/josdem/jmetadata/dnd/DraggedObject.java +++ b/src/main/java/com/josdem/jmetadata/dnd/DraggedObject.java @@ -18,35 +18,34 @@ public interface DraggedObject { - public T get(Class clazz); + public T get(Class clazz); - public Object get(); + public Object get(); - public boolean is(Class... clazz); + public boolean is(Class... clazz); - public Class getContentClass(); + public Class getContentClass(); - DraggedObject NULL = new DraggedObject() { - @Override - public T get(Class clazz) { - return null; - } + DraggedObject NULL = + new DraggedObject() { + @Override + public T get(Class clazz) { + return null; + } - @Override - public Class getContentClass() { - return Void.class; - } + @Override + public Class getContentClass() { + return Void.class; + } - @Override - public boolean is(Class... clazz) { - return false; - } - - @Override - public Object get() { - return null; - } - - }; + @Override + public boolean is(Class... clazz) { + return false; + } + @Override + public Object get() { + return null; + } + }; } diff --git a/src/main/java/com/josdem/jmetadata/dnd/DraggedObjectFactory.java b/src/main/java/com/josdem/jmetadata/dnd/DraggedObjectFactory.java index 347bcd9..f84d2fd 100644 --- a/src/main/java/com/josdem/jmetadata/dnd/DraggedObjectFactory.java +++ b/src/main/java/com/josdem/jmetadata/dnd/DraggedObjectFactory.java @@ -21,31 +21,31 @@ import java.util.List; public class DraggedObjectFactory { - private final List innerGenerators = new ArrayList(); - - public DraggedObjectFactory() { - innerGenerators.add(new DraggedObjectPictureGenerator()); - innerGenerators.add(new DraggedObjectFileSystemGenerator()); - } - - public DraggedObject getPreview(Transferable transferable) { - for (DraggedObjectGenerator generator : innerGenerators) { - DraggedObject draggedObject = generator.getPreview(transferable); - if (draggedObject != null && draggedObject.get() != null) { - return draggedObject; - } - } - return DraggedObject.NULL; - } - - public DraggedObject getContent(Transferable transferable) { - for (DraggedObjectGenerator generator : innerGenerators) { - DraggedObject draggedObject = generator.getContent(transferable); - if (draggedObject != null && draggedObject.get() != null) { - return draggedObject; - } - } - return DraggedObject.NULL; - } - + private final List innerGenerators = + new ArrayList(); + + public DraggedObjectFactory() { + innerGenerators.add(new DraggedObjectPictureGenerator()); + innerGenerators.add(new DraggedObjectFileSystemGenerator()); + } + + public DraggedObject getPreview(Transferable transferable) { + for (DraggedObjectGenerator generator : innerGenerators) { + DraggedObject draggedObject = generator.getPreview(transferable); + if (draggedObject != null && draggedObject.get() != null) { + return draggedObject; + } + } + return DraggedObject.NULL; + } + + public DraggedObject getContent(Transferable transferable) { + for (DraggedObjectGenerator generator : innerGenerators) { + DraggedObject draggedObject = generator.getContent(transferable); + if (draggedObject != null && draggedObject.get() != null) { + return draggedObject; + } + } + return DraggedObject.NULL; + } } diff --git a/src/main/java/com/josdem/jmetadata/dnd/DraggedObjectFileSystemGenerator.java b/src/main/java/com/josdem/jmetadata/dnd/DraggedObjectFileSystemGenerator.java index 2a3a1c0..842eeec 100644 --- a/src/main/java/com/josdem/jmetadata/dnd/DraggedObjectFileSystemGenerator.java +++ b/src/main/java/com/josdem/jmetadata/dnd/DraggedObjectFileSystemGenerator.java @@ -16,6 +16,7 @@ package com.josdem.jmetadata.dnd; +import com.josdem.jmetadata.util.FileSystemValidatorLight; import java.awt.datatransfer.DataFlavor; import java.awt.datatransfer.Transferable; import java.io.File; @@ -24,65 +25,64 @@ import java.util.List; import java.util.StringTokenizer; -import com.josdem.jmetadata.util.FileSystemValidatorLight; - public class DraggedObjectFileSystemGenerator extends SimpleDraggedObjectGenerator { - @Override - public DraggedObject get(Transferable transferable) { - DataFlavor[] flavors = transferable.getTransferDataFlavors(); - if (flavors == null) { - return null; - } - Object draggedObject; - for (DataFlavor flavor : flavors) { - List files = null; - files = tryGetFile(transferable, flavor); - if (files != null && !files.isEmpty()) { - boolean isFromExternalDevices = false; - try { - isFromExternalDevices = (Boolean) transferable.getTransferData(FileTransferable.EXTERNAL_DEVICES_FLAVOR); - } catch (Exception e) { - } - draggedObject = new FileSystemValidatorLight(isFromExternalDevices, files); - return new SimpleDraggedObject(draggedObject); - } - } - return new SimpleDraggedObject(null); - } + @Override + public DraggedObject get(Transferable transferable) { + DataFlavor[] flavors = transferable.getTransferDataFlavors(); + if (flavors == null) { + return null; + } + Object draggedObject; + for (DataFlavor flavor : flavors) { + List files = null; + files = tryGetFile(transferable, flavor); + if (files != null && !files.isEmpty()) { + boolean isFromExternalDevices = false; + try { + isFromExternalDevices = + (Boolean) transferable.getTransferData(FileTransferable.EXTERNAL_DEVICES_FLAVOR); + } catch (Exception e) { + } + draggedObject = new FileSystemValidatorLight(isFromExternalDevices, files); + return new SimpleDraggedObject(draggedObject); + } + } + return new SimpleDraggedObject(null); + } - @SuppressWarnings("unchecked") - protected static List tryGetFile(Transferable transferable, DataFlavor flavor) { - try { - Object container = transferable.getTransferData(flavor); - List someThings = (List) container; - if (someThings != null && !someThings.isEmpty() && someThings.get(0) instanceof File) { - return (List) someThings; - } - } catch (Exception e) { - return null; - } - // we can have a string or multiple inside - try { - String data = (String) transferable.getTransferData(flavor); - return textURIListToFileList(data); - } catch (Exception e) { - return null; - } - } + @SuppressWarnings("unchecked") + protected static List tryGetFile(Transferable transferable, DataFlavor flavor) { + try { + Object container = transferable.getTransferData(flavor); + List someThings = (List) container; + if (someThings != null && !someThings.isEmpty() && someThings.get(0) instanceof File) { + return (List) someThings; + } + } catch (Exception e) { + return null; + } + // we can have a string or multiple inside + try { + String data = (String) transferable.getTransferData(flavor); + return textURIListToFileList(data); + } catch (Exception e) { + return null; + } + } - private static List textURIListToFileList(String data) throws Exception { - List list = new ArrayList(1); - for (StringTokenizer st = new StringTokenizer(data, "\r\n"); st.hasMoreTokens();) { - String s = st.nextToken(); - if (s.startsWith("#")) { - // the line is a comment (as per the RFC 2483) - continue; - } - URI uri = new URI(s); - File file = new File(uri); - list.add(file); - } - return list; - } + private static List textURIListToFileList(String data) throws Exception { + List list = new ArrayList(1); + for (StringTokenizer st = new StringTokenizer(data, "\r\n"); st.hasMoreTokens(); ) { + String s = st.nextToken(); + if (s.startsWith("#")) { + // the line is a comment (as per the RFC 2483) + continue; + } + URI uri = new URI(s); + File file = new File(uri); + list.add(file); + } + return list; + } } diff --git a/src/main/java/com/josdem/jmetadata/dnd/DraggedObjectGenerator.java b/src/main/java/com/josdem/jmetadata/dnd/DraggedObjectGenerator.java index 4e98187..11d8423 100644 --- a/src/main/java/com/josdem/jmetadata/dnd/DraggedObjectGenerator.java +++ b/src/main/java/com/josdem/jmetadata/dnd/DraggedObjectGenerator.java @@ -19,6 +19,7 @@ import java.awt.datatransfer.Transferable; public interface DraggedObjectGenerator { - DraggedObject getPreview(Transferable transferable); - DraggedObject getContent(Transferable transferable); + DraggedObject getPreview(Transferable transferable); + + DraggedObject getContent(Transferable transferable); } diff --git a/src/main/java/com/josdem/jmetadata/dnd/DraggedObjectPictureGenerator.java b/src/main/java/com/josdem/jmetadata/dnd/DraggedObjectPictureGenerator.java index fbbd42e..d48134d 100644 --- a/src/main/java/com/josdem/jmetadata/dnd/DraggedObjectPictureGenerator.java +++ b/src/main/java/com/josdem/jmetadata/dnd/DraggedObjectPictureGenerator.java @@ -16,39 +16,34 @@ package com.josdem.jmetadata.dnd; -import java.io.File; -import java.util.List; +import com.josdem.jmetadata.util.Picture; import java.awt.datatransfer.DataFlavor; import java.awt.datatransfer.Transferable; - -import com.josdem.jmetadata.util.Picture; - +import java.io.File; +import java.util.List; import lombok.extern.slf4j.Slf4j; @Slf4j - public class DraggedObjectPictureGenerator extends DraggedObjectFileSystemGenerator { - - @Override - public DraggedObject get(Transferable transferable) { - DataFlavor[] flavors = transferable.getTransferDataFlavors(); - if (flavors == null) { - return null; - } - for (DataFlavor flavor : flavors) { - List files = null; - files = tryGetFile(transferable, flavor); - if (files != null && files.size() == 1 && !files.get(0).isDirectory()) { - try { - Object draggedObject = new Picture(files.get(0)); - return new SimpleDraggedObject(draggedObject); - } catch (Exception e) { - log.error(e.getMessage(), e); - } - } - } - return new SimpleDraggedObject(null); - } - + @Override + public DraggedObject get(Transferable transferable) { + DataFlavor[] flavors = transferable.getTransferDataFlavors(); + if (flavors == null) { + return null; + } + for (DataFlavor flavor : flavors) { + List files = null; + files = tryGetFile(transferable, flavor); + if (files != null && files.size() == 1 && !files.get(0).isDirectory()) { + try { + Object draggedObject = new Picture(files.get(0)); + return new SimpleDraggedObject(draggedObject); + } catch (Exception e) { + log.error(e.getMessage(), e); + } + } + } + return new SimpleDraggedObject(null); + } } diff --git a/src/main/java/com/josdem/jmetadata/dnd/DropListener.java b/src/main/java/com/josdem/jmetadata/dnd/DropListener.java index c82add3..0205fa4 100644 --- a/src/main/java/com/josdem/jmetadata/dnd/DropListener.java +++ b/src/main/java/com/josdem/jmetadata/dnd/DropListener.java @@ -19,6 +19,7 @@ import java.awt.Point; public interface DropListener extends DragAndDropListener { - boolean validateDrop(DraggedObject draggedObject, Point location); - void doDrop(DraggedObject draggedObject, Point location); + boolean validateDrop(DraggedObject draggedObject, Point location); + + void doDrop(DraggedObject draggedObject, Point location); } diff --git a/src/main/java/com/josdem/jmetadata/dnd/FileDragSource.java b/src/main/java/com/josdem/jmetadata/dnd/FileDragSource.java index bd8c628..31ccbf0 100644 --- a/src/main/java/com/josdem/jmetadata/dnd/FileDragSource.java +++ b/src/main/java/com/josdem/jmetadata/dnd/FileDragSource.java @@ -1,207 +1,162 @@ /** - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright 2013 Jose Luis De la Cruz Morales joseluis.delacruz@gmail.com - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - + * Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ + * + *

TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + * + *

1. Definitions. + * + *

"License" shall mean the terms and conditions for use, reproduction, and distribution as + * defined by Sections 1 through 9 of this document. + * + *

"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is + * granting the License. + * + *

"Legal Entity" shall mean the union of the acting entity and all other entities that control, + * are controlled by, or are under common control with that entity. For the purposes of this + * definition, "control" means (i) the power, direct or indirect, to cause the direction or + * management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent + * (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. + * + *

"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by + * this License. + * + *

"Source" form shall mean the preferred form for making modifications, including but not + * limited to software source code, documentation source, and configuration files. + * + *

"Object" form shall mean any form resulting from mechanical transformation or translation of a + * Source form, including but not limited to compiled object code, generated documentation, and + * conversions to other media types. + * + *

"Work" shall mean the work of authorship, whether in Source or Object form, made available + * under the License, as indicated by a copyright notice that is included in or attached to the work + * (an example is provided in the Appendix below). + * + *

"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or + * derived from) the Work and for which the editorial revisions, annotations, elaborations, or other + * modifications represent, as a whole, an original work of authorship. For the purposes of this + * License, Derivative Works shall not include works that remain separable from, or merely link (or + * bind by name) to the interfaces of, the Work and Derivative Works thereof. + * + *

"Contribution" shall mean any work of authorship, including the original version of the Work + * and any modifications or additions to that Work or Derivative Works thereof, that is + * intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an + * individual or Legal Entity authorized to submit on behalf of the copyright owner. For the + * purposes of this definition, "submitted" means any form of electronic, verbal, or written + * communication sent to the Licensor or its representatives, including but not limited to + * communication on electronic mailing lists, source code control systems, and issue tracking + * systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and + * improving the Work, but excluding communication that is conspicuously marked or otherwise + * designated in writing by the copyright owner as "Not a Contribution." + * + *

"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a + * Contribution has been received by Licensor and subsequently incorporated within the Work. + * + *

2. Grant of Copyright License. Subject to the terms and conditions of this License, each + * Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, + * irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, + * publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or + * Object form. + * + *

3. Grant of Patent License. Subject to the terms and conditions of this License, each + * Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, + * irrevocable (except as stated in this section) patent license to make, have made, use, offer to + * sell, sell, import, and otherwise transfer the Work, where such license applies only to those + * patent claims licensable by such Contributor that are necessarily infringed by their + * Contribution(s) alone or by combination of their Contribution(s) with the Work to which such + * Contribution(s) was submitted. If You institute patent litigation against any entity (including a + * cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated + * within the Work constitutes direct or contributory patent infringement, then any patent licenses + * granted to You under this License for that Work shall terminate as of the date such litigation is + * filed. + * + *

4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works + * thereof in any medium, with or without modifications, and in Source or Object form, provided that + * You meet the following conditions: + * + *

(a) You must give any other recipients of the Work or Derivative Works a copy of this License; + * and + * + *

(b) You must cause any modified files to carry prominent notices stating that You changed the + * files; and + * + *

(c) You must retain, in the Source form of any Derivative Works that You distribute, all + * copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding + * those notices that do not pertain to any part of the Derivative Works; and + * + *

(d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative + * Works that You distribute must include a readable copy of the attribution notices contained + * within such NOTICE file, excluding those notices that do not pertain to any part of the + * Derivative Works, in at least one of the following places: within a NOTICE text file distributed + * as part of the Derivative Works; within the Source form or documentation, if provided along with + * the Derivative Works; or, within a display generated by the Derivative Works, if and wherever + * such third-party notices normally appear. The contents of the NOTICE file are for informational + * purposes only and do not modify the License. You may add Your own attribution notices within + * Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the + * Work, provided that such additional attribution notices cannot be construed as modifying the + * License. + * + *

You may add Your own copyright statement to Your modifications and may provide additional or + * different license terms and conditions for use, reproduction, or distribution of Your + * modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and + * distribution of the Work otherwise complies with the conditions stated in this License. + * + *

5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution + * intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms + * and conditions of this License, without any additional terms or conditions. Notwithstanding the + * above, nothing herein shall supersede or modify the terms of any separate license agreement you + * may have executed with Licensor regarding such Contributions. + * + *

6. Trademarks. This License does not grant permission to use the trade names, trademarks, + * service marks, or product names of the Licensor, except as required for reasonable and customary + * use in describing the origin of the Work and reproducing the content of the NOTICE file. + * + *

7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor + * provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, + * any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + * PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or + * redistributing the Work and assume any risks associated with Your exercise of permissions under + * this License. + * + *

8. Limitation of Liability. In no event and under no legal theory, whether in tort (including + * negligence), contract, or otherwise, unless required by applicable law (such as deliberate and + * grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for + * damages, including any direct, indirect, special, incidental, or consequential damages of any + * character arising as a result of this License or out of the use or inability to use the Work + * (including but not limited to damages for loss of goodwill, work stoppage, computer failure or + * malfunction, or any and all other commercial damages or losses), even if such Contributor has + * been advised of the possibility of such damages. + * + *

9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative + * Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, + * indemnity, or other liability obligations and/or rights consistent with this License. However, in + * accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, + * not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each + * Contributor harmless for any liability incurred by, or claims asserted against, such Contributor + * by reason of your accepting any such warranty or additional liability. + * + *

END OF TERMS AND CONDITIONS + * + *

APPENDIX: How to apply the Apache License to your work. + * + *

To apply the Apache License to your work, attach the following boilerplate notice, with the + * fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include + * the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. + * We also recommend that a file or class name and description of purpose be included on the same + * "printed page" as the copyright notice for easier identification within third-party archives. + * + *

Copyright 2013 Jose Luis De la Cruz Morales joseluis.delacruz@gmail.com + * + *

Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of the License at + * + *

http://www.apache.org/licenses/LICENSE-2.0 + * + *

Unless required by applicable law or agreed to in writing, software distributed under the + * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either + * express or implied. See the License for the specific language governing permissions and + * limitations under the License. + */ package com.josdem.jmetadata.dnd; import java.awt.Component; @@ -218,61 +173,55 @@ file or class name and description of purpose be included on the import java.awt.dnd.InvalidDnDOperationException; import java.io.File; import java.util.List; - import lombok.extern.slf4j.Slf4j; @Slf4j - public final class FileDragSource implements DragGestureListener, DragSourceListener { private DragSource dragSource; - private FileSelection fileSelection; - - - public static void addDragSource(Component c, FileSelection modelSelection) { - DragSource dragSource = new DragSource(); - FileDragSource dgl = new FileDragSource(dragSource, modelSelection); - // Do not change ACTION_COPY or else only pain and misery will follow you until the end of time. JAVA DnDrops sux. - // Big Time - dragSource.createDefaultDragGestureRecognizer(c, DnDConstants.ACTION_COPY, dgl); - } - - private FileDragSource(DragSource dragSource, FileSelection fileSelection) { - this.dragSource = dragSource; - this.fileSelection = fileSelection; - } - - @Override - public void dragGestureRecognized(DragGestureEvent dge) { - Point dragOrigin = dge.getDragOrigin(); - List draggedItems = fileSelection.selectedObjects(dragOrigin); - if (draggedItems != null && !draggedItems.isEmpty()) { - Transferable t = new FileTransferable(fileSelection.isFromExternalDevices(dragOrigin), draggedItems); - try { - dragSource.startDrag(dge, DragSource.DefaultCopyDrop, t, this); - } catch (InvalidDnDOperationException e) { - log.error(e.getMessage(), e); - } - } - } - - @Override - public void dragDropEnd(DragSourceDropEvent dsde) { - } - - @Override - public void dragEnter(DragSourceDragEvent dsde) { - } - - @Override - public void dragExit(DragSourceEvent dse) { - } - - @Override - public void dragOver(DragSourceDragEvent dsde) { - } - - @Override - public void dropActionChanged(DragSourceDragEvent dsde) { - } + private FileSelection fileSelection; + + public static void addDragSource(Component c, FileSelection modelSelection) { + DragSource dragSource = new DragSource(); + FileDragSource dgl = new FileDragSource(dragSource, modelSelection); + // Do not change ACTION_COPY or else only pain and misery will follow you until the end of time. + // JAVA DnDrops sux. + // Big Time + dragSource.createDefaultDragGestureRecognizer(c, DnDConstants.ACTION_COPY, dgl); + } + + private FileDragSource(DragSource dragSource, FileSelection fileSelection) { + this.dragSource = dragSource; + this.fileSelection = fileSelection; + } + + @Override + public void dragGestureRecognized(DragGestureEvent dge) { + Point dragOrigin = dge.getDragOrigin(); + List draggedItems = fileSelection.selectedObjects(dragOrigin); + if (draggedItems != null && !draggedItems.isEmpty()) { + Transferable t = + new FileTransferable(fileSelection.isFromExternalDevices(dragOrigin), draggedItems); + try { + dragSource.startDrag(dge, DragSource.DefaultCopyDrop, t, this); + } catch (InvalidDnDOperationException e) { + log.error(e.getMessage(), e); + } + } + } + + @Override + public void dragDropEnd(DragSourceDropEvent dsde) {} + + @Override + public void dragEnter(DragSourceDragEvent dsde) {} + + @Override + public void dragExit(DragSourceEvent dse) {} + + @Override + public void dragOver(DragSourceDragEvent dsde) {} + + @Override + public void dropActionChanged(DragSourceDragEvent dsde) {} } diff --git a/src/main/java/com/josdem/jmetadata/dnd/FileSelection.java b/src/main/java/com/josdem/jmetadata/dnd/FileSelection.java index abf6085..679086e 100644 --- a/src/main/java/com/josdem/jmetadata/dnd/FileSelection.java +++ b/src/main/java/com/josdem/jmetadata/dnd/FileSelection.java @@ -1,4 +1,3 @@ - package com.josdem.jmetadata.dnd; import java.awt.Point; @@ -6,6 +5,7 @@ import java.util.List; public interface FileSelection { - List selectedObjects(Point point); - boolean isFromExternalDevices(Point point); + List selectedObjects(Point point); + + boolean isFromExternalDevices(Point point); } diff --git a/src/main/java/com/josdem/jmetadata/dnd/FileTransferable.java b/src/main/java/com/josdem/jmetadata/dnd/FileTransferable.java index bba7423..9001d1c 100644 --- a/src/main/java/com/josdem/jmetadata/dnd/FileTransferable.java +++ b/src/main/java/com/josdem/jmetadata/dnd/FileTransferable.java @@ -25,35 +25,34 @@ public class FileTransferable implements Transferable { - private final List files; - private final boolean isFromExternalPanel; - public static final DataFlavor EXTERNAL_DEVICES_FLAVOR = new DataFlavor(Boolean.class, "external-devices-source"); - - - public FileTransferable(boolean isFromExternalPanel, List files) { - this.isFromExternalPanel = isFromExternalPanel; - this.files = files; - } - - @Override - public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException, IOException { - if (flavor.equals(DataFlavor.javaFileListFlavor)) { - return files; - } else if(flavor.equals(EXTERNAL_DEVICES_FLAVOR)){ - return isFromExternalPanel; - }else { - throw new UnsupportedFlavorException(flavor); - } - } - - @Override - public DataFlavor[] getTransferDataFlavors() { - return new DataFlavor[] { DataFlavor.javaFileListFlavor, EXTERNAL_DEVICES_FLAVOR }; - } - - @Override - public boolean isDataFlavorSupported(DataFlavor flavor) { - return flavor.equals(DataFlavor.javaFileListFlavor) || flavor.equals(EXTERNAL_DEVICES_FLAVOR); - } - + private final List files; + private final boolean isFromExternalPanel; + public static final DataFlavor EXTERNAL_DEVICES_FLAVOR = + new DataFlavor(Boolean.class, "external-devices-source"); + + public FileTransferable(boolean isFromExternalPanel, List files) { + this.isFromExternalPanel = isFromExternalPanel; + this.files = files; + } + + @Override + public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException, IOException { + if (flavor.equals(DataFlavor.javaFileListFlavor)) { + return files; + } else if (flavor.equals(EXTERNAL_DEVICES_FLAVOR)) { + return isFromExternalPanel; + } else { + throw new UnsupportedFlavorException(flavor); + } + } + + @Override + public DataFlavor[] getTransferDataFlavors() { + return new DataFlavor[] {DataFlavor.javaFileListFlavor, EXTERNAL_DEVICES_FLAVOR}; + } + + @Override + public boolean isDataFlavorSupported(DataFlavor flavor) { + return flavor.equals(DataFlavor.javaFileListFlavor) || flavor.equals(EXTERNAL_DEVICES_FLAVOR); + } } diff --git a/src/main/java/com/josdem/jmetadata/dnd/ImageDropListener.java b/src/main/java/com/josdem/jmetadata/dnd/ImageDropListener.java index a8c4c87..4ffb94d 100644 --- a/src/main/java/com/josdem/jmetadata/dnd/ImageDropListener.java +++ b/src/main/java/com/josdem/jmetadata/dnd/ImageDropListener.java @@ -16,71 +16,68 @@ package com.josdem.jmetadata.dnd; -import java.awt.Image; -import java.awt.Point; - import com.josdem.jmetadata.gui.ImagePanel; import com.josdem.jmetadata.observer.ObservValue; import com.josdem.jmetadata.observer.Observable; import com.josdem.jmetadata.observer.ObserverCollection; -import com.josdem.jmetadata.util.Picture; import com.josdem.jmetadata.util.FileSystemValidatorLight; - +import com.josdem.jmetadata.util.Picture; +import java.awt.Image; +import java.awt.Point; import lombok.extern.slf4j.Slf4j; @Slf4j - public class ImageDropListener implements DropListener { private final ImagePanel imagePanel; - private static final Class[] classes = new Class[] { Picture.class }; - private final Observable> nombre = new Observable>(); + private static final Class[] classes = new Class[] {Picture.class}; + private final Observable> nombre = + new Observable>(); - - @Override - public Class[] handledTypes() { - return classes; - } + @Override + public Class[] handledTypes() { + return classes; + } public ImageDropListener(ImagePanel imagePanel) { - this.imagePanel = imagePanel; - } - - @Override - public void doDrop(DraggedObject draggedObject, Point location) { - Picture picture = draggedObject.get(Picture.class); - if (picture != null) { - doDrop(picture, location); - } - } - - public void doDrop(Picture pic, Point location) { - if (!pic.isValidImageSize()) { - log.info("editContact.portrait.dnd.error.size"); - return; - } - - if (!pic.isProportionedImage()) { - log.info("editContact.portrait.dnd.error.proportion"); - return; - } - - Image image = pic.getImage(); - if (image != null) { - imagePanel.setImage(image, .17, .17); - this.nombre.fire(new ObservValue(imagePanel)); - } - } - - public void doDrop(FileSystemValidatorLight validator, Point location) { - log.info("editContact.portrait.dnd.error.file"); - } - - @Override - public boolean validateDrop(DraggedObject draggedObject, Point location) { - return draggedObject.is(Picture.class, FileSystemValidatorLight.class); - } - - public ObserverCollection> onDropped() { - return nombre; - } + this.imagePanel = imagePanel; + } + + @Override + public void doDrop(DraggedObject draggedObject, Point location) { + Picture picture = draggedObject.get(Picture.class); + if (picture != null) { + doDrop(picture, location); + } + } + + public void doDrop(Picture pic, Point location) { + if (!pic.isValidImageSize()) { + log.info("editContact.portrait.dnd.error.size"); + return; + } + + if (!pic.isProportionedImage()) { + log.info("editContact.portrait.dnd.error.proportion"); + return; + } + + Image image = pic.getImage(); + if (image != null) { + imagePanel.setImage(image, .17, .17); + this.nombre.fire(new ObservValue(imagePanel)); + } + } + + public void doDrop(FileSystemValidatorLight validator, Point location) { + log.info("editContact.portrait.dnd.error.file"); + } + + @Override + public boolean validateDrop(DraggedObject draggedObject, Point location) { + return draggedObject.is(Picture.class, FileSystemValidatorLight.class); + } + + public ObserverCollection> onDropped() { + return nombre; + } } diff --git a/src/main/java/com/josdem/jmetadata/dnd/Jdk6u10TransparencyManager.java b/src/main/java/com/josdem/jmetadata/dnd/Jdk6u10TransparencyManager.java index d70fb2b..33c92b8 100644 --- a/src/main/java/com/josdem/jmetadata/dnd/Jdk6u10TransparencyManager.java +++ b/src/main/java/com/josdem/jmetadata/dnd/Jdk6u10TransparencyManager.java @@ -16,127 +16,123 @@ package com.josdem.jmetadata.dnd; -import java.awt.Shape; -import java.awt.Window; +import com.josdem.jmetadata.util.MethodWrapper; import java.awt.Component; import java.awt.Container; import java.awt.GraphicsConfiguration; import java.awt.GraphicsDevice; import java.awt.GraphicsEnvironment; - +import java.awt.Shape; +import java.awt.Window; import javax.swing.JComponent; -import com.josdem.jmetadata.util.MethodWrapper; - import lombok.extern.slf4j.Slf4j; @Slf4j - public class Jdk6u10TransparencyManager implements TransparencyManager { private MethodWrapper setWindowShapeMethod; - private MethodWrapper setWindowOpacityMethod; - private MethodWrapper setWindowOpaqueMethod; - private MethodWrapper isTranslucencyCapableMethod; + private MethodWrapper setWindowOpacityMethod; + private MethodWrapper setWindowOpaqueMethod; + private MethodWrapper isTranslucencyCapableMethod; private MethodWrapper isTranslucencySupportedMethod; - - public Jdk6u10TransparencyManager() { - Class translucencyClass = MethodWrapper.getClass("com.sun.awt.AWTUtilities$Translucency"); - isTranslucencySupportedMethod = MethodWrapper - .forClass("com.sun.awt.AWTUtilities") - .method("isTranslucencySupported") - .withParameters(translucencyClass) - .andReturnType(boolean.class); - isTranslucencyCapableMethod = MethodWrapper - .forClass("com.sun.awt.AWTUtilities") - .method("isTranslucencyCapable") - .withParameters(GraphicsConfiguration.class) - .andReturnType(boolean.class); - setWindowShapeMethod = MethodWrapper - .forClass("com.sun.awt.AWTUtilities") - .method("setWindowShape") - .withParameters(Window.class, Shape.class) - .andReturnType(null); - setWindowOpacityMethod = MethodWrapper - .forClass("com.sun.awt.AWTUtilities") - .method("setWindowOpacity") - .withParameters(Window.class, float.class) - .andReturnType(null); - setWindowOpaqueMethod = MethodWrapper - .forClass("com.sun.awt.AWTUtilities") - .method("setWindowOpaque") - .withParameters(Window.class, boolean.class) - .andReturnType(null); - } - - @Override - public boolean isTranslucencySupported(Object kind) { - return isTranslucencySupportedMethod.invoke(kind); - } - - @Override - public boolean isTranslucencyCapable(GraphicsConfiguration gc) { - return isTranslucencyCapableMethod.invoke(gc); - } - - @Override - public void setWindowShape(Window window, Shape shape) { - setWindowShapeMethod.invoke(window, shape); - } - - @Override - public void setWindowOpacity(Window window, float opacity) { - setWindowOpacityMethod.invoke(window, opacity); - } - - @Override - public void setWindowOpaque(Window window, boolean opaque) { - setWindowOpaqueMethod.invoke(window, opaque); - doTheDoubleBuffer(window); - } - - private void doTheDoubleBuffer(Component c) { - if (c instanceof JComponent) { - JComponent comp = (JComponent) c; - comp.setDoubleBuffered(false); - } - if (c instanceof Container) { - Container container = (Container) c; - for (Component c2 : container.getComponents()) { - doTheDoubleBuffer(c2); - } - } - - } - - @Override - public GraphicsConfiguration getTranslucencyCapableGC() { - GraphicsEnvironment localGraphicsEnvironment = GraphicsEnvironment.getLocalGraphicsEnvironment(); - GraphicsDevice defaultScreenDevice = localGraphicsEnvironment.getDefaultScreenDevice(); - GraphicsConfiguration translucencyCapableGC = defaultScreenDevice.getDefaultConfiguration(); - - if (!isTranslucencyCapable(translucencyCapableGC)) { - translucencyCapableGC = null; - - log.info("Default graphics configuration does not support translucency"); - - GraphicsEnvironment env = localGraphicsEnvironment; - GraphicsDevice[] devices = env.getScreenDevices(); - - for (int i = 0; i < devices.length && translucencyCapableGC == null; i++) { - GraphicsConfiguration[] configs = devices[i].getConfigurations(); - - for (int j = 0; j < configs.length && translucencyCapableGC == null; j++) { - if (isTranslucencyCapable(configs[j])) { - translucencyCapableGC = configs[j]; - } - } - } - } - - if (translucencyCapableGC == null) { - log.warn("Translucency capable graphics configuration not found"); - } - return translucencyCapableGC; - } + public Jdk6u10TransparencyManager() { + Class translucencyClass = MethodWrapper.getClass("com.sun.awt.AWTUtilities$Translucency"); + isTranslucencySupportedMethod = + MethodWrapper.forClass("com.sun.awt.AWTUtilities") + .method("isTranslucencySupported") + .withParameters(translucencyClass) + .andReturnType(boolean.class); + isTranslucencyCapableMethod = + MethodWrapper.forClass("com.sun.awt.AWTUtilities") + .method("isTranslucencyCapable") + .withParameters(GraphicsConfiguration.class) + .andReturnType(boolean.class); + setWindowShapeMethod = + MethodWrapper.forClass("com.sun.awt.AWTUtilities") + .method("setWindowShape") + .withParameters(Window.class, Shape.class) + .andReturnType(null); + setWindowOpacityMethod = + MethodWrapper.forClass("com.sun.awt.AWTUtilities") + .method("setWindowOpacity") + .withParameters(Window.class, float.class) + .andReturnType(null); + setWindowOpaqueMethod = + MethodWrapper.forClass("com.sun.awt.AWTUtilities") + .method("setWindowOpaque") + .withParameters(Window.class, boolean.class) + .andReturnType(null); + } + + @Override + public boolean isTranslucencySupported(Object kind) { + return isTranslucencySupportedMethod.invoke(kind); + } + + @Override + public boolean isTranslucencyCapable(GraphicsConfiguration gc) { + return isTranslucencyCapableMethod.invoke(gc); + } + + @Override + public void setWindowShape(Window window, Shape shape) { + setWindowShapeMethod.invoke(window, shape); + } + + @Override + public void setWindowOpacity(Window window, float opacity) { + setWindowOpacityMethod.invoke(window, opacity); + } + + @Override + public void setWindowOpaque(Window window, boolean opaque) { + setWindowOpaqueMethod.invoke(window, opaque); + doTheDoubleBuffer(window); + } + + private void doTheDoubleBuffer(Component c) { + if (c instanceof JComponent) { + JComponent comp = (JComponent) c; + comp.setDoubleBuffered(false); + } + if (c instanceof Container) { + Container container = (Container) c; + for (Component c2 : container.getComponents()) { + doTheDoubleBuffer(c2); + } + } + } + + @Override + public GraphicsConfiguration getTranslucencyCapableGC() { + GraphicsEnvironment localGraphicsEnvironment = + GraphicsEnvironment.getLocalGraphicsEnvironment(); + GraphicsDevice defaultScreenDevice = localGraphicsEnvironment.getDefaultScreenDevice(); + GraphicsConfiguration translucencyCapableGC = defaultScreenDevice.getDefaultConfiguration(); + + if (!isTranslucencyCapable(translucencyCapableGC)) { + translucencyCapableGC = null; + + log.info("Default graphics configuration does not support translucency"); + + GraphicsEnvironment env = localGraphicsEnvironment; + GraphicsDevice[] devices = env.getScreenDevices(); + + for (int i = 0; i < devices.length && translucencyCapableGC == null; i++) { + GraphicsConfiguration[] configs = devices[i].getConfigurations(); + + for (int j = 0; j < configs.length && translucencyCapableGC == null; j++) { + if (isTranslucencyCapable(configs[j])) { + translucencyCapableGC = configs[j]; + } + } + } + } + + if (translucencyCapableGC == null) { + log.warn("Translucency capable graphics configuration not found"); + } + return translucencyCapableGC; + } } diff --git a/src/main/java/com/josdem/jmetadata/dnd/MainFrameDragOverListener.java b/src/main/java/com/josdem/jmetadata/dnd/MainFrameDragOverListener.java index 0f44251..ff2d33d 100644 --- a/src/main/java/com/josdem/jmetadata/dnd/MainFrameDragOverListener.java +++ b/src/main/java/com/josdem/jmetadata/dnd/MainFrameDragOverListener.java @@ -16,87 +16,85 @@ package com.josdem.jmetadata.dnd; +import com.josdem.jmetadata.util.FileSystemValidatorLight; +import com.josdem.jmetadata.util.Picture; import java.awt.Frame; import java.awt.Point; import java.awt.Window; - import javax.swing.SwingUtilities; -import com.josdem.jmetadata.util.FileSystemValidatorLight; -import com.josdem.jmetadata.util.Picture; - public class MainFrameDragOverListener implements DragOverListener { - private final Window frame; - private DragTooltipDialog dialog; + private final Window frame; + private DragTooltipDialog dialog; - public MainFrameDragOverListener(Window frame) { - this.frame = frame; - } + public MainFrameDragOverListener(Window frame) { + this.frame = frame; + } - @Override - public void dragEnter(DraggedObject draggedObject) { - if (frame instanceof Frame) { - dialog = new DragTooltipDialog((Frame) frame); - } else { - dialog = new DragTooltipDialog(null); - } - if (draggedObject.is(FileSystemValidatorLight.class)) { - FileSystemValidatorLight validator = draggedObject.get(FileSystemValidatorLight.class); - if (!validator.hasError()) { - dialog.setContent(validator); - } else { - dialog.setContent("mainFrameDrop.error.1level"); - } - } else if (draggedObject.is(Picture.class)) { - Picture picture = draggedObject.get(Picture.class); - dialog.setContent(picture); - dialog.setVisible(true); - } else if (draggedObject.get() == null) { - dialog.setContent(""); - dialog.setVisible(true); - } else { - dialog.setContent("It is impossible to insert what you dragged. Cause its evil"); - } - dialog.setVisible(true); - } + @Override + public void dragEnter(DraggedObject draggedObject) { + if (frame instanceof Frame) { + dialog = new DragTooltipDialog((Frame) frame); + } else { + dialog = new DragTooltipDialog(null); + } + if (draggedObject.is(FileSystemValidatorLight.class)) { + FileSystemValidatorLight validator = draggedObject.get(FileSystemValidatorLight.class); + if (!validator.hasError()) { + dialog.setContent(validator); + } else { + dialog.setContent("mainFrameDrop.error.1level"); + } + } else if (draggedObject.is(Picture.class)) { + Picture picture = draggedObject.get(Picture.class); + dialog.setContent(picture); + dialog.setVisible(true); + } else if (draggedObject.get() == null) { + dialog.setContent(""); + dialog.setVisible(true); + } else { + dialog.setContent("It is impossible to insert what you dragged. Cause its evil"); + } + dialog.setVisible(true); + } - @Override - public void dragExit(boolean droppe) { - if (dialog != null) { - dialog.setVisible(false); - dialog.dispose(); - dialog = null; - } - } + @Override + public void dragExit(boolean droppe) { + if (dialog != null) { + dialog.setVisible(false); + dialog.dispose(); + dialog = null; + } + } - @Override - public void dropOcurred(boolean success) { - if (dialog != null) { - dialog.setVisible(false); - dialog.dispose(); - dialog = null; - } - } + @Override + public void dropOcurred(boolean success) { + if (dialog != null) { + dialog.setVisible(false); + dialog.dispose(); + dialog = null; + } + } - @Override - public void updateLocation(Point location) { - if (dialog != null) { - Point p = (Point) location.clone(); - p.x = p.x + 5; - SwingUtilities.convertPointToScreen(p, frame); - dialog.setLocation(p); - } - } + @Override + public void updateLocation(Point location) { + if (dialog != null) { + Point p = (Point) location.clone(); + p.x = p.x + 5; + SwingUtilities.convertPointToScreen(p, frame); + dialog.setLocation(p); + } + } - @Override - public void dragAllowedChanged(boolean allowed) { - if (dialog != null) { - dialog.setAllowed(allowed); - } - } + @Override + public void dragAllowedChanged(boolean allowed) { + if (dialog != null) { + dialog.setAllowed(allowed); + } + } - @Override - public Class[] handledTypes() { - return null; - } + @Override + public Class[] handledTypes() { + return null; + } } diff --git a/src/main/java/com/josdem/jmetadata/dnd/MultiLayerDropTargetListener.java b/src/main/java/com/josdem/jmetadata/dnd/MultiLayerDropTargetListener.java index 1bb7e7c..539f7e2 100644 --- a/src/main/java/com/josdem/jmetadata/dnd/MultiLayerDropTargetListener.java +++ b/src/main/java/com/josdem/jmetadata/dnd/MultiLayerDropTargetListener.java @@ -16,6 +16,8 @@ package com.josdem.jmetadata.dnd; +import com.josdem.jmetadata.observer.ObservValue; +import com.josdem.jmetadata.observer.Observer; import java.awt.Component; import java.awt.Container; import java.awt.Window; @@ -25,147 +27,144 @@ import java.awt.dnd.DropTargetDragEvent; import java.awt.dnd.DropTargetDropEvent; import java.awt.dnd.DropTargetEvent; - -import com.josdem.jmetadata.observer.Observer; -import com.josdem.jmetadata.observer.ObservValue; -import org.springframework.stereotype.Service; - import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; @Slf4j - @Service -public class MultiLayerDropTargetListener extends DropTargetAdapter implements Observer> { - private static boolean lastDropSuccess; - - private DnDListenerCollection dropListeners = new DnDListenerCollection(); - - private DnDListenerCollection dragListeners = new DnDListenerCollection(); - - private DragAndDropActionFactory actionFactory; - - private DraggedObjectFactory draggedObjectFactory; - - private DragAndDropAction currentAction; - - - public MultiLayerDropTargetListener() { - this.draggedObjectFactory = new DraggedObjectFactory(); - this.actionFactory = new DragAndDropActionFactoryDefault(); - } - - @Override - public void dragEnter(DropTargetDragEvent dtde) { - getDragAction().dragExit(); - lastDropSuccess = false; - Window window = null; - Component component; - Component component2 = component = dtde.getDropTargetContext().getComponent(); - while (window == null && component != null) { - if (component instanceof Window) { - window = (Window) component; - } else { - component = component.getParent(); - } - } - Container currentTriggerFrame = null; - if (window == null) { - if (component2 instanceof Container) { - currentTriggerFrame = (Container) component2; - } else { - currentTriggerFrame = component2.getParent(); - } - } else { - currentTriggerFrame = window; - } - getDragAction(currentTriggerFrame); - dragOver(dtde); - } - - @Override - public void dragOver(DropTargetDragEvent dtde) { - initializeTransferable(dtde.getTransferable(), false); - getDragAction().setLocation(dtde.getLocation()); - if (getDragAction().validate(dtde.getLocation())) { - dtde.acceptDrag(DnDConstants.ACTION_COPY); - } else { - dtde.rejectDrag(); - } - } - - @Override - public void drop(final DropTargetDropEvent dtde) { - dtde.acceptDrop(DnDConstants.ACTION_COPY); - initializeTransferable(dtde.getTransferable(), true); - boolean success = getDragAction().drop(dtde.getLocation()); - if (success) { - log .info("drop success"); - } - lastDropSuccess = success; - } - - @Override - public void dragExit(DropTargetEvent dte) { - getDragAction().dragExit(); - } - - private synchronized DragAndDropAction getDragAction(Container container) { - getDragAction().dragExit(); - currentAction = actionFactory.getAction(container); - currentAction.onComponentChangedListener().add(this); - return currentAction; - } - - private synchronized DragAndDropAction getDragAction() { - if (currentAction == null || currentAction.isDone()) { - return DragAndDropAction.EMPTY_ACTION; - } - return currentAction; - } - - private void initializeTransferable(Transferable transferable, boolean isDrop) { - if (isDrop) { - getDragAction().setDragObject(draggedObjectFactory.getContent(transferable)); - } else { - if (!getDragAction().isDragObjectSet()) { - getDragAction().setDragObject(draggedObjectFactory.getPreview(transferable)); - } - } - } - - public void addDropListener(Component component, DropListener listener) { - // DebugAssist.showConfirmationDialog("COMPONENT:", component.getClass().getName(), "\nListener:", - // listener.getClass().getName()); - dropListeners.put(component, listener); - } - - public void addDragListener(Component component, DragOverListener listener) { - dragListeners.put(component, listener); - } - - public void removeListeners(Component component) { - dragListeners.remove(component); - dropListeners.remove(component); - } - - public void removeDropListener(Component component, DropListener listener) { - dropListeners.remove(component, listener); - } - - public void removeDragListener(Component component, DragOverListener listener) { - dragListeners.remove(component, listener); - } - - @Override - public void observe(ObservValue eventArgs) { - Component c = eventArgs.getValue(); - Class contentClass = getDragAction().getContentClass(); - getDragAction().setDropListeners(dropListeners.getInmediateEntries(contentClass, c)); - getDragAction().setDragListeners(dragListeners.getUpwardEntries(contentClass, c)); - } - - public static boolean isLastDropSuccess() { - return lastDropSuccess; - } - +public class MultiLayerDropTargetListener extends DropTargetAdapter + implements Observer> { + private static boolean lastDropSuccess; + + private DnDListenerCollection dropListeners = + new DnDListenerCollection(); + + private DnDListenerCollection dragListeners = + new DnDListenerCollection(); + + private DragAndDropActionFactory actionFactory; + + private DraggedObjectFactory draggedObjectFactory; + + private DragAndDropAction currentAction; + + public MultiLayerDropTargetListener() { + this.draggedObjectFactory = new DraggedObjectFactory(); + this.actionFactory = new DragAndDropActionFactoryDefault(); + } + + @Override + public void dragEnter(DropTargetDragEvent dtde) { + getDragAction().dragExit(); + lastDropSuccess = false; + Window window = null; + Component component; + Component component2 = component = dtde.getDropTargetContext().getComponent(); + while (window == null && component != null) { + if (component instanceof Window) { + window = (Window) component; + } else { + component = component.getParent(); + } + } + Container currentTriggerFrame = null; + if (window == null) { + if (component2 instanceof Container) { + currentTriggerFrame = (Container) component2; + } else { + currentTriggerFrame = component2.getParent(); + } + } else { + currentTriggerFrame = window; + } + getDragAction(currentTriggerFrame); + dragOver(dtde); + } + + @Override + public void dragOver(DropTargetDragEvent dtde) { + initializeTransferable(dtde.getTransferable(), false); + getDragAction().setLocation(dtde.getLocation()); + if (getDragAction().validate(dtde.getLocation())) { + dtde.acceptDrag(DnDConstants.ACTION_COPY); + } else { + dtde.rejectDrag(); + } + } + + @Override + public void drop(final DropTargetDropEvent dtde) { + dtde.acceptDrop(DnDConstants.ACTION_COPY); + initializeTransferable(dtde.getTransferable(), true); + boolean success = getDragAction().drop(dtde.getLocation()); + if (success) { + log.info("drop success"); + } + lastDropSuccess = success; + } + + @Override + public void dragExit(DropTargetEvent dte) { + getDragAction().dragExit(); + } + + private synchronized DragAndDropAction getDragAction(Container container) { + getDragAction().dragExit(); + currentAction = actionFactory.getAction(container); + currentAction.onComponentChangedListener().add(this); + return currentAction; + } + + private synchronized DragAndDropAction getDragAction() { + if (currentAction == null || currentAction.isDone()) { + return DragAndDropAction.EMPTY_ACTION; + } + return currentAction; + } + + private void initializeTransferable(Transferable transferable, boolean isDrop) { + if (isDrop) { + getDragAction().setDragObject(draggedObjectFactory.getContent(transferable)); + } else { + if (!getDragAction().isDragObjectSet()) { + getDragAction().setDragObject(draggedObjectFactory.getPreview(transferable)); + } + } + } + + public void addDropListener(Component component, DropListener listener) { + // DebugAssist.showConfirmationDialog("COMPONENT:", component.getClass().getName(), + // "\nListener:", + // listener.getClass().getName()); + dropListeners.put(component, listener); + } + + public void addDragListener(Component component, DragOverListener listener) { + dragListeners.put(component, listener); + } + + public void removeListeners(Component component) { + dragListeners.remove(component); + dropListeners.remove(component); + } + + public void removeDropListener(Component component, DropListener listener) { + dropListeners.remove(component, listener); + } + + public void removeDragListener(Component component, DragOverListener listener) { + dragListeners.remove(component, listener); + } + + @Override + public void observe(ObservValue eventArgs) { + Component c = eventArgs.getValue(); + Class contentClass = getDragAction().getContentClass(); + getDragAction().setDropListeners(dropListeners.getInmediateEntries(contentClass, c)); + getDragAction().setDragListeners(dragListeners.getUpwardEntries(contentClass, c)); + } + + public static boolean isLastDropSuccess() { + return lastDropSuccess; + } } diff --git a/src/main/java/com/josdem/jmetadata/dnd/NullTransparencyManager.java b/src/main/java/com/josdem/jmetadata/dnd/NullTransparencyManager.java index c7e401f..23951b1 100644 --- a/src/main/java/com/josdem/jmetadata/dnd/NullTransparencyManager.java +++ b/src/main/java/com/josdem/jmetadata/dnd/NullTransparencyManager.java @@ -22,31 +22,27 @@ public class NullTransparencyManager implements TransparencyManager { - @Override - public boolean isTranslucencySupported(Object kind) { - return false; - } + @Override + public boolean isTranslucencySupported(Object kind) { + return false; + } - @Override - public boolean isTranslucencyCapable(GraphicsConfiguration gc) { - return false; - } + @Override + public boolean isTranslucencyCapable(GraphicsConfiguration gc) { + return false; + } - @Override - public void setWindowShape(Window window, Shape shape) { - } + @Override + public void setWindowShape(Window window, Shape shape) {} - @Override - public void setWindowOpacity(Window window, float opacity) { - } + @Override + public void setWindowOpacity(Window window, float opacity) {} - @Override - public void setWindowOpaque(Window window, boolean opaque) { - } - - @Override - public GraphicsConfiguration getTranslucencyCapableGC() { - return null; - } + @Override + public void setWindowOpaque(Window window, boolean opaque) {} + @Override + public GraphicsConfiguration getTranslucencyCapableGC() { + return null; + } } diff --git a/src/main/java/com/josdem/jmetadata/dnd/ScrollPaneDragOverListener.java b/src/main/java/com/josdem/jmetadata/dnd/ScrollPaneDragOverListener.java index 2bca03e..d6eb8c2 100644 --- a/src/main/java/com/josdem/jmetadata/dnd/ScrollPaneDragOverListener.java +++ b/src/main/java/com/josdem/jmetadata/dnd/ScrollPaneDragOverListener.java @@ -17,119 +17,118 @@ package com.josdem.jmetadata.dnd; import java.awt.Point; - import javax.swing.JScrollBar; import javax.swing.JScrollPane; public class ScrollPaneDragOverListener extends DragOverAdapter { - private static final int AREA_FACTOR = 1; - private static final int VELOCITY_FACTOR = 10; - private static final int VELOCITY_MS = 500; - private static final int BEGIN = 160; - private static final int AUTO_SCROLL_AREA_COUNT = 3; - private static final int AUTO_SCROLL_AREA_HEIGHT = 12; - private static final int AUTO_SCROLL_AREA_LIMIT = AUTO_SCROLL_AREA_HEIGHT * AUTO_SCROLL_AREA_COUNT; - - private int lastScrollPaneVelocity = 0; - - private long lastScrollPaneDragOverEvent = System.currentTimeMillis(); - private final JScrollPane scrollPane; - - @Override - public void updateLocation(Point location) { - manageVerticalScrollBar(location); - } - - public ScrollPaneDragOverListener(JScrollPane jScrollPane) { - scrollPane = jScrollPane; - } - - void manageVerticalScrollBar(Point location) { - if (!canProcessDragEvent()) { - return; - } - int adjustment = 3; - int velocity = checkAreaForScrollVelocity(location.y) * adjustment; - if (!canStartScrolling(velocity)) { - return; - } - moveScrollbar(velocity); - } - - private boolean canProcessDragEvent() { - // process events continuously around 60 ms period - if (System.currentTimeMillis() - lastScrollPaneDragOverEvent < 60) { - return false; - } - lastScrollPaneDragOverEvent = System.currentTimeMillis(); - return true; - } - - public int checkAreaForScrollVelocity(int y) { - int velocity = 0; - if (isInsideUpperAutoScrollableArea(y)) { - velocity = getUpperAreaVelocity(y) * -1; - } else if (isInsideBottomAutoScrollableArea(y)) { - velocity = getBottomAreaVelocity(y); - } - return velocity; - } - - private int getBottomAreaVelocity(int y) { - int velocity = VELOCITY_FACTOR; - int area = AREA_FACTOR; - int scrollPaneHeight = getScrollPaneHeight(); - while (scrollPaneHeight - AUTO_SCROLL_AREA_HEIGHT * area > y) { - area++; - velocity--; - } - return velocity; - } - - int getScrollPaneHeight() { - return scrollPane.getHeight(); - } - - private int getUpperAreaVelocity(int y) { - int velocity = VELOCITY_FACTOR; - int area = AREA_FACTOR; - while (y > (BEGIN + AUTO_SCROLL_AREA_HEIGHT * area)) { - area++; - velocity--; - } - return velocity; - } - - private boolean isInsideUpperAutoScrollableArea(int y) { - return (0 <= y && y <= (BEGIN + AUTO_SCROLL_AREA_LIMIT)); - } - - private boolean isInsideBottomAutoScrollableArea(int y) { - int scrollPaneHeight = getScrollPaneHeight(); - int limit = scrollPaneHeight - AUTO_SCROLL_AREA_LIMIT; - return limit >= 0 && limit <= y && y <= scrollPaneHeight; - } - - private void moveScrollbar(int velocity) { - JScrollBar verticalScrollBar = scrollPane.getVerticalScrollBar(); - int currentVal = verticalScrollBar.getValue(); - verticalScrollBar.setValue(currentVal + velocity); - } - - private boolean canStartScrolling(int velocity) { - // start scrolling after VELOCITY_MS milliseconds of the first drag over event received - if (lastScrollPaneVelocity == 0 && velocity != 0) { - lastScrollPaneDragOverEvent = System.currentTimeMillis() + VELOCITY_MS; - lastScrollPaneVelocity = velocity; - return false; - } - lastScrollPaneVelocity = velocity; - return true; - } - - @Override - public Class[] handledTypes() { - return null; - } - + private static final int AREA_FACTOR = 1; + private static final int VELOCITY_FACTOR = 10; + private static final int VELOCITY_MS = 500; + private static final int BEGIN = 160; + private static final int AUTO_SCROLL_AREA_COUNT = 3; + private static final int AUTO_SCROLL_AREA_HEIGHT = 12; + private static final int AUTO_SCROLL_AREA_LIMIT = + AUTO_SCROLL_AREA_HEIGHT * AUTO_SCROLL_AREA_COUNT; + + private int lastScrollPaneVelocity = 0; + + private long lastScrollPaneDragOverEvent = System.currentTimeMillis(); + private final JScrollPane scrollPane; + + @Override + public void updateLocation(Point location) { + manageVerticalScrollBar(location); + } + + public ScrollPaneDragOverListener(JScrollPane jScrollPane) { + scrollPane = jScrollPane; + } + + void manageVerticalScrollBar(Point location) { + if (!canProcessDragEvent()) { + return; + } + int adjustment = 3; + int velocity = checkAreaForScrollVelocity(location.y) * adjustment; + if (!canStartScrolling(velocity)) { + return; + } + moveScrollbar(velocity); + } + + private boolean canProcessDragEvent() { + // process events continuously around 60 ms period + if (System.currentTimeMillis() - lastScrollPaneDragOverEvent < 60) { + return false; + } + lastScrollPaneDragOverEvent = System.currentTimeMillis(); + return true; + } + + public int checkAreaForScrollVelocity(int y) { + int velocity = 0; + if (isInsideUpperAutoScrollableArea(y)) { + velocity = getUpperAreaVelocity(y) * -1; + } else if (isInsideBottomAutoScrollableArea(y)) { + velocity = getBottomAreaVelocity(y); + } + return velocity; + } + + private int getBottomAreaVelocity(int y) { + int velocity = VELOCITY_FACTOR; + int area = AREA_FACTOR; + int scrollPaneHeight = getScrollPaneHeight(); + while (scrollPaneHeight - AUTO_SCROLL_AREA_HEIGHT * area > y) { + area++; + velocity--; + } + return velocity; + } + + int getScrollPaneHeight() { + return scrollPane.getHeight(); + } + + private int getUpperAreaVelocity(int y) { + int velocity = VELOCITY_FACTOR; + int area = AREA_FACTOR; + while (y > (BEGIN + AUTO_SCROLL_AREA_HEIGHT * area)) { + area++; + velocity--; + } + return velocity; + } + + private boolean isInsideUpperAutoScrollableArea(int y) { + return (0 <= y && y <= (BEGIN + AUTO_SCROLL_AREA_LIMIT)); + } + + private boolean isInsideBottomAutoScrollableArea(int y) { + int scrollPaneHeight = getScrollPaneHeight(); + int limit = scrollPaneHeight - AUTO_SCROLL_AREA_LIMIT; + return limit >= 0 && limit <= y && y <= scrollPaneHeight; + } + + private void moveScrollbar(int velocity) { + JScrollBar verticalScrollBar = scrollPane.getVerticalScrollBar(); + int currentVal = verticalScrollBar.getValue(); + verticalScrollBar.setValue(currentVal + velocity); + } + + private boolean canStartScrolling(int velocity) { + // start scrolling after VELOCITY_MS milliseconds of the first drag over event received + if (lastScrollPaneVelocity == 0 && velocity != 0) { + lastScrollPaneDragOverEvent = System.currentTimeMillis() + VELOCITY_MS; + lastScrollPaneVelocity = velocity; + return false; + } + lastScrollPaneVelocity = velocity; + return true; + } + + @Override + public Class[] handledTypes() { + return null; + } } diff --git a/src/main/java/com/josdem/jmetadata/dnd/SimpleDraggedObject.java b/src/main/java/com/josdem/jmetadata/dnd/SimpleDraggedObject.java index 136318a..6a9fde3 100644 --- a/src/main/java/com/josdem/jmetadata/dnd/SimpleDraggedObject.java +++ b/src/main/java/com/josdem/jmetadata/dnd/SimpleDraggedObject.java @@ -17,55 +17,54 @@ package com.josdem.jmetadata.dnd; public class SimpleDraggedObject implements DraggedObject { - private final Object wrappedObject; + private final Object wrappedObject; - public SimpleDraggedObject(Object wrappedObject) { - this.wrappedObject = wrappedObject; - } + public SimpleDraggedObject(Object wrappedObject) { + this.wrappedObject = wrappedObject; + } - public Class getContentClass() { - return wrappedObject.getClass(); - } + public Class getContentClass() { + return wrappedObject.getClass(); + } - @Override - public T get(Class clazz) { - if (clazz == null) { - @SuppressWarnings("unchecked") - T wrap = (T) wrappedObject; - return wrap; - } - if (is(clazz)) { - @SuppressWarnings("unchecked") - T wrap = (T) wrappedObject; - return wrap; - } - return null; - } + @Override + public T get(Class clazz) { + if (clazz == null) { + @SuppressWarnings("unchecked") + T wrap = (T) wrappedObject; + return wrap; + } + if (is(clazz)) { + @SuppressWarnings("unchecked") + T wrap = (T) wrappedObject; + return wrap; + } + return null; + } - @Override - public Object get() { - return wrappedObject; - } + @Override + public Object get() { + return wrappedObject; + } - @Override - public boolean is(Class... clazz) { - return is(wrappedObject, clazz); - } - - public static boolean is(Object object, Class... clazz) { - if (clazz == null || clazz.length == 0) { - return object == null; - } - if (object != null) { - Class wrapClass = object.getClass(); - for (Class targetClass : clazz) { - if (targetClass.isAssignableFrom(wrapClass)) { - return true; - } - return false; - } - } - return false; - } + @Override + public boolean is(Class... clazz) { + return is(wrappedObject, clazz); + } + public static boolean is(Object object, Class... clazz) { + if (clazz == null || clazz.length == 0) { + return object == null; + } + if (object != null) { + Class wrapClass = object.getClass(); + for (Class targetClass : clazz) { + if (targetClass.isAssignableFrom(wrapClass)) { + return true; + } + return false; + } + } + return false; + } } diff --git a/src/main/java/com/josdem/jmetadata/dnd/SimpleDraggedObjectGenerator.java b/src/main/java/com/josdem/jmetadata/dnd/SimpleDraggedObjectGenerator.java index a2843bb..3d10161 100644 --- a/src/main/java/com/josdem/jmetadata/dnd/SimpleDraggedObjectGenerator.java +++ b/src/main/java/com/josdem/jmetadata/dnd/SimpleDraggedObjectGenerator.java @@ -20,16 +20,15 @@ public abstract class SimpleDraggedObjectGenerator implements DraggedObjectGenerator { - @Override - public final DraggedObject getPreview(Transferable transferable) { - return get(transferable); - } + @Override + public final DraggedObject getPreview(Transferable transferable) { + return get(transferable); + } - @Override - public DraggedObject getContent(Transferable transferable) { - return get(transferable); - } - - abstract DraggedObject get(Transferable transferable); + @Override + public DraggedObject getContent(Transferable transferable) { + return get(transferable); + } + abstract DraggedObject get(Transferable transferable); } diff --git a/src/main/java/com/josdem/jmetadata/dnd/TransparencyManager.java b/src/main/java/com/josdem/jmetadata/dnd/TransparencyManager.java index aca1bfb..f325e3c 100644 --- a/src/main/java/com/josdem/jmetadata/dnd/TransparencyManager.java +++ b/src/main/java/com/josdem/jmetadata/dnd/TransparencyManager.java @@ -21,10 +21,15 @@ import java.awt.Window; public interface TransparencyManager { - public boolean isTranslucencySupported(Object kind); - public boolean isTranslucencyCapable(GraphicsConfiguration gc); - public void setWindowShape(Window window, Shape shape); - public void setWindowOpacity(Window window, float opacity); - public void setWindowOpaque(Window window, boolean opaque); - public GraphicsConfiguration getTranslucencyCapableGC(); + public boolean isTranslucencySupported(Object kind); + + public boolean isTranslucencyCapable(GraphicsConfiguration gc); + + public void setWindowShape(Window window, Shape shape); + + public void setWindowOpacity(Window window, float opacity); + + public void setWindowOpaque(Window window, boolean opaque); + + public GraphicsConfiguration getTranslucencyCapableGC(); } diff --git a/src/main/java/com/josdem/jmetadata/dnd/TransparencyManagerFactory.java b/src/main/java/com/josdem/jmetadata/dnd/TransparencyManagerFactory.java index 03f14df..816d446 100644 --- a/src/main/java/com/josdem/jmetadata/dnd/TransparencyManagerFactory.java +++ b/src/main/java/com/josdem/jmetadata/dnd/TransparencyManagerFactory.java @@ -19,23 +19,20 @@ import lombok.extern.slf4j.Slf4j; @Slf4j - public class TransparencyManagerFactory { - private static TransparencyManager manager; - - - public static TransparencyManager getManager() { - if (manager != null) { - return manager; - } - try { - manager = new Jdk6u10TransparencyManager(); - return manager; - } catch (Throwable t) { - log.error("Unexpected exception during TransparencyManager instantiation.", t); - } - manager = new NullTransparencyManager(); - return manager; - } - + private static TransparencyManager manager; + + public static TransparencyManager getManager() { + if (manager != null) { + return manager; + } + try { + manager = new Jdk6u10TransparencyManager(); + return manager; + } catch (Throwable t) { + log.error("Unexpected exception during TransparencyManager instantiation.", t); + } + manager = new NullTransparencyManager(); + return manager; + } } diff --git a/src/main/java/com/josdem/jmetadata/event/Events.java b/src/main/java/com/josdem/jmetadata/event/Events.java index b2088f4..2cc78eb 100644 --- a/src/main/java/com/josdem/jmetadata/event/Events.java +++ b/src/main/java/com/josdem/jmetadata/event/Events.java @@ -1,71 +1,69 @@ -/* - Copyright 2013 Jose Luis De la Cruz Morales joseluis.delacruz@gmail.com - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -package com.josdem.jmetadata.event; - -import java.util.List; - -import org.asmatron.messengine.event.EmptyEvent; -import org.asmatron.messengine.event.EventId; -import org.asmatron.messengine.event.ValueEvent; -import com.josdem.jmetadata.model.Metadata; -import com.josdem.jmetadata.model.MetadataAlbumValues; -import com.josdem.jmetadata.model.User; - -import static org.asmatron.messengine.event.EventId.ev; - -public interface Events { - - String USER_LOGGED = "userLogged"; - EventId> LOGGED = ev(USER_LOGGED); - - String USER_LOGIN_FAILED = "userLoginFailed"; - EventId LOGIN_FAILED = ev(USER_LOGIN_FAILED); - - String MUSIC_DIRECTORY_SELECTED = "musicDirectorySelected"; - EventId> DIRECTORY_SELECTED = ev(MUSIC_DIRECTORY_SELECTED); - - String MUSIC_DIRECTORY_NOT_EXIST = "musicDirectoryNotExist"; - EventId> DIRECTORY_NOT_EXIST = ev(MUSIC_DIRECTORY_NOT_EXIST); - - String TOO_MUCH_FILES_LOADED = "tooMuchFilesLoaded"; - EventId> MUCH_FILES_LOADED = ev(TOO_MUCH_FILES_LOADED); - - String MUSIC_DIRECTORY_SELECTED_CANCEL = "musicDirectorySelectedCancel"; - EventId DIRECTORY_SELECTED_CANCEL = ev(MUSIC_DIRECTORY_SELECTED_CANCEL); - - String TRACKS_LOADED = "tracksLoaded"; - EventId LOADED = ev(TRACKS_LOADED); - - String DIRECTORY_EMPTY_EVENT = "directoryEmptyEvent"; - EventId DIRECTORY_EMPTY = ev(DIRECTORY_EMPTY_EVENT); - - String LOAD_METADATA = "loadMetadata"; - EventId>> LOAD = ev(LOAD_METADATA); - - String OPEN_ERROR = "openError"; - EventId OPEN = ev(OPEN_ERROR); - - String APPLY_METADATA = "readyToApplyMetadata"; - EventId> READY_TO_APPLY = ev(APPLY_METADATA); - - String COVER_ART_FAILED = "coverArtFailed"; - EventId> LOAD_COVER_ART = ev(COVER_ART_FAILED); - - String LOAD_FILE_FAILED = "loadFileFailed"; - EventId> LOAD_FILE = ev(LOAD_FILE_FAILED); - -} +/* + Copyright 2013 Jose Luis De la Cruz Morales joseluis.delacruz@gmail.com + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +package com.josdem.jmetadata.event; + +import static org.asmatron.messengine.event.EventId.ev; + +import com.josdem.jmetadata.model.Metadata; +import com.josdem.jmetadata.model.MetadataAlbumValues; +import com.josdem.jmetadata.model.User; +import java.util.List; +import org.asmatron.messengine.event.EmptyEvent; +import org.asmatron.messengine.event.EventId; +import org.asmatron.messengine.event.ValueEvent; + +public interface Events { + + String USER_LOGGED = "userLogged"; + EventId> LOGGED = ev(USER_LOGGED); + + String USER_LOGIN_FAILED = "userLoginFailed"; + EventId LOGIN_FAILED = ev(USER_LOGIN_FAILED); + + String MUSIC_DIRECTORY_SELECTED = "musicDirectorySelected"; + EventId> DIRECTORY_SELECTED = ev(MUSIC_DIRECTORY_SELECTED); + + String MUSIC_DIRECTORY_NOT_EXIST = "musicDirectoryNotExist"; + EventId> DIRECTORY_NOT_EXIST = ev(MUSIC_DIRECTORY_NOT_EXIST); + + String TOO_MUCH_FILES_LOADED = "tooMuchFilesLoaded"; + EventId> MUCH_FILES_LOADED = ev(TOO_MUCH_FILES_LOADED); + + String MUSIC_DIRECTORY_SELECTED_CANCEL = "musicDirectorySelectedCancel"; + EventId DIRECTORY_SELECTED_CANCEL = ev(MUSIC_DIRECTORY_SELECTED_CANCEL); + + String TRACKS_LOADED = "tracksLoaded"; + EventId LOADED = ev(TRACKS_LOADED); + + String DIRECTORY_EMPTY_EVENT = "directoryEmptyEvent"; + EventId DIRECTORY_EMPTY = ev(DIRECTORY_EMPTY_EVENT); + + String LOAD_METADATA = "loadMetadata"; + EventId>> LOAD = ev(LOAD_METADATA); + + String OPEN_ERROR = "openError"; + EventId OPEN = ev(OPEN_ERROR); + + String APPLY_METADATA = "readyToApplyMetadata"; + EventId> READY_TO_APPLY = ev(APPLY_METADATA); + + String COVER_ART_FAILED = "coverArtFailed"; + EventId> LOAD_COVER_ART = ev(COVER_ART_FAILED); + + String LOAD_FILE_FAILED = "loadFileFailed"; + EventId> LOAD_FILE = ev(LOAD_FILE_FAILED); +} diff --git a/src/main/java/com/josdem/jmetadata/exception/BusinessException.java b/src/main/java/com/josdem/jmetadata/exception/BusinessException.java index 8fd9624..b122dae 100644 --- a/src/main/java/com/josdem/jmetadata/exception/BusinessException.java +++ b/src/main/java/com/josdem/jmetadata/exception/BusinessException.java @@ -18,13 +18,11 @@ public class BusinessException extends RuntimeException { - public BusinessException(String message){ + public BusinessException(String message) { super(message); } - public BusinessException(String message, Throwable cause){ + public BusinessException(String message, Throwable cause) { super(message, cause); } - } - diff --git a/src/main/java/com/josdem/jmetadata/exception/InvalidId3VersionException.java b/src/main/java/com/josdem/jmetadata/exception/InvalidId3VersionException.java index 68487c6..9e1eef4 100644 --- a/src/main/java/com/josdem/jmetadata/exception/InvalidId3VersionException.java +++ b/src/main/java/com/josdem/jmetadata/exception/InvalidId3VersionException.java @@ -18,6 +18,5 @@ public class InvalidId3VersionException extends Exception { - private static final long serialVersionUID = 1L; - + private static final long serialVersionUID = 1L; } diff --git a/src/main/java/com/josdem/jmetadata/exception/MetadataException.java b/src/main/java/com/josdem/jmetadata/exception/MetadataException.java index d3dfaff..931002c 100644 --- a/src/main/java/com/josdem/jmetadata/exception/MetadataException.java +++ b/src/main/java/com/josdem/jmetadata/exception/MetadataException.java @@ -18,7 +18,7 @@ public class MetadataException extends Exception { - public MetadataException(String message) { - super(message); - } + public MetadataException(String message) { + super(message); + } } diff --git a/src/main/java/com/josdem/jmetadata/exception/TooMuchFilesException.java b/src/main/java/com/josdem/jmetadata/exception/TooMuchFilesException.java index 87149e5..a9216fc 100644 --- a/src/main/java/com/josdem/jmetadata/exception/TooMuchFilesException.java +++ b/src/main/java/com/josdem/jmetadata/exception/TooMuchFilesException.java @@ -18,15 +18,14 @@ public class TooMuchFilesException extends Exception { - private final Integer maxFiles; + private final Integer maxFiles; - public TooMuchFilesException(Integer maxFiles) { - this.maxFiles = maxFiles; - } - - @Override - public String getMessage() { - return "TOO MUCH FILES LOADED: " + maxFiles; - } + public TooMuchFilesException(Integer maxFiles) { + this.maxFiles = maxFiles; + } + @Override + public String getMessage() { + return "TOO MUCH FILES LOADED: " + maxFiles; + } } diff --git a/src/main/java/com/josdem/jmetadata/gui/AllDialog.java b/src/main/java/com/josdem/jmetadata/gui/AllDialog.java index 578c7c0..2522f52 100644 --- a/src/main/java/com/josdem/jmetadata/gui/AllDialog.java +++ b/src/main/java/com/josdem/jmetadata/gui/AllDialog.java @@ -26,7 +26,6 @@ import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.awt.event.WindowEvent; - import javax.swing.JButton; import javax.swing.JComponent; import javax.swing.JDialog; @@ -35,149 +34,147 @@ import javax.swing.JPanel; /** - * @understands - * This class decorates the dialog borders avoiding code duplication in every - * dialog

Note: Call {@code initializeContentPane()} in the - * contructor of every subclass but before setting the dialog visible + * @understands This class decorates the dialog borders avoiding code duplication in every + * dialog

Note: Call {@code initializeContentPane()} in the contructor of + * every subclass but before setting the dialog visible */ - public abstract class AllDialog extends JDialog { - private static final long serialVersionUID = -9135593375722062618L; - private static final Insets TITLE_LABEL_INSETS = new Insets(1, 0, 0, 0); - private static final Insets EXIT_BUTTON_INSETS = new Insets(2, 0, 0, 0); - private static final Dimension TITLE_PANEL_DEFAULT_SIZE = new Dimension(560, 24); - private static final Dimension EXIT_BUTTON_SIZE = new Dimension(15, 15); - protected static final Insets TITLE_PANEL_INSETS = new Insets(0, 5, 0, 5); - protected static final Insets CONTENT_PANEL_INSETS = new Insets(0, 5, 4, 5); - private static final String EXIT_BUTTON_NAME = "closeDialogButton"; - private static final String ROOT_PANE_NAME = "RootPane"; - protected static final int TITLE_HEIGHT = 24; - protected static final int BORDER = 5; - private JPanel titlePanel; - private JLabel titleLabel; - private JButton exitButton; - - /** - * Set the title of the dialog - * - * @param titleLabel - */ - abstract String dialogTitle(); - - /** - * Obtains the panel with the components for the dialog - * - * @return JComponent dialog contents - */ - abstract JComponent getContentComponent(); - - public AllDialog(JFrame frame, boolean modal, String message) { - super(frame, modal); - initialize(); - } - - private void initialize() { - setUndecorated(true); - setModalityType(Dialog.DEFAULT_MODALITY_TYPE); - getRootPane().setName(ROOT_PANE_NAME); - } - - protected void changeSize(int width, int height) { - Dimension preferredSize = new Dimension(width, height); - this.setPreferredSize(preferredSize); - this.setMinimumSize(preferredSize); - this.setMaximumSize(preferredSize); - this.setSize(preferredSize); - this.validate(); - } - - /** - * Call this method from the classes which extends this, after initialize - * all their components and before setting it visible. - */ - protected void initializeContentPane() { - // setting the layout of the dialog - GridBagConstraints titlePanelConstraints = new GridBagConstraints(); - titlePanelConstraints.gridx = 0; - titlePanelConstraints.gridy = 0; - titlePanelConstraints.fill = GridBagConstraints.HORIZONTAL; - titlePanelConstraints.weightx = 1; - titlePanelConstraints.insets = TITLE_PANEL_INSETS; - GridBagConstraints contentPanelConstraints = new GridBagConstraints(); - contentPanelConstraints.gridx = 0; - contentPanelConstraints.gridy = 1; - contentPanelConstraints.fill = GridBagConstraints.BOTH; - contentPanelConstraints.weightx = 1; - contentPanelConstraints.weighty = 1; - contentPanelConstraints.insets = CONTENT_PANEL_INSETS; - - getContentPane().setLayout(new GridBagLayout()); - getContentPane().add(getTitlePanel(), titlePanelConstraints); - getContentPane().add(getContentComponent(), contentPanelConstraints); - - // setting the size according to the content component - Dimension contentSize = getContentComponent().getPreferredSize(); - int w = (int) contentSize.getWidth() + BORDER * 2; - int h = (int) contentSize.getHeight() + BORDER + TITLE_HEIGHT; - changeSize(w, h); - setLocationRelativeTo(getParent()); - pack(); - } - - protected JPanel getTitlePanel() { - if (titlePanel == null) { - GridBagConstraints titleLabelConstraints = new GridBagConstraints(); - titleLabelConstraints.gridx = 0; - titleLabelConstraints.gridy = 0; - titleLabelConstraints.insets = TITLE_LABEL_INSETS; - titleLabelConstraints.weightx = 1; - titleLabelConstraints.fill = GridBagConstraints.HORIZONTAL; - GridBagConstraints exitButtonConstraints = new GridBagConstraints(); - exitButtonConstraints.gridx = 1; - exitButtonConstraints.gridy = 0; - exitButtonConstraints.insets = EXIT_BUTTON_INSETS; - exitButtonConstraints.anchor = GridBagConstraints.CENTER; - - titlePanel = new JPanel(); - titlePanel.setLayout(new GridBagLayout()); - titlePanel.setPreferredSize(TITLE_PANEL_DEFAULT_SIZE); - titlePanel.setMinimumSize(TITLE_PANEL_DEFAULT_SIZE); - titlePanel.setMaximumSize(TITLE_PANEL_DEFAULT_SIZE); - titlePanel.add(getTitleLabel(), titleLabelConstraints); - titlePanel.add(getExitButton(), exitButtonConstraints); - } - return titlePanel; - } - - protected JLabel getTitleLabel() { - if (titleLabel == null) { - titleLabel = new JLabel(); - } - return titleLabel; - } - - protected JButton getExitButton() { - if (exitButton == null) { - exitButton = new JButton(); - exitButton.setName(EXIT_BUTTON_NAME); - exitButton.setPreferredSize(EXIT_BUTTON_SIZE); - exitButton.setMinimumSize(EXIT_BUTTON_SIZE); - exitButton.setMaximumSize(EXIT_BUTTON_SIZE); - exitButton.setMnemonic(KeyEvent.VK_UNDEFINED); - exitButton.addActionListener(new CloseListener()); - } - return exitButton; - } - - protected void closeDialog() { - Window window = AllDialog.this; - window.dispatchEvent(new WindowEvent(window, WindowEvent.WINDOW_CLOSING)); - } - - class CloseListener implements ActionListener { - @Override - public void actionPerformed(ActionEvent e) { - closeDialog(); - } - } + private static final long serialVersionUID = -9135593375722062618L; + private static final Insets TITLE_LABEL_INSETS = new Insets(1, 0, 0, 0); + private static final Insets EXIT_BUTTON_INSETS = new Insets(2, 0, 0, 0); + private static final Dimension TITLE_PANEL_DEFAULT_SIZE = new Dimension(560, 24); + private static final Dimension EXIT_BUTTON_SIZE = new Dimension(15, 15); + protected static final Insets TITLE_PANEL_INSETS = new Insets(0, 5, 0, 5); + protected static final Insets CONTENT_PANEL_INSETS = new Insets(0, 5, 4, 5); + private static final String EXIT_BUTTON_NAME = "closeDialogButton"; + private static final String ROOT_PANE_NAME = "RootPane"; + protected static final int TITLE_HEIGHT = 24; + protected static final int BORDER = 5; + private JPanel titlePanel; + private JLabel titleLabel; + private JButton exitButton; + + /** + * Set the title of the dialog + * + * @param titleLabel + */ + abstract String dialogTitle(); + + /** + * Obtains the panel with the components for the dialog + * + * @return JComponent dialog contents + */ + abstract JComponent getContentComponent(); + + public AllDialog(JFrame frame, boolean modal, String message) { + super(frame, modal); + initialize(); + } + + private void initialize() { + setUndecorated(true); + setModalityType(Dialog.DEFAULT_MODALITY_TYPE); + getRootPane().setName(ROOT_PANE_NAME); + } + + protected void changeSize(int width, int height) { + Dimension preferredSize = new Dimension(width, height); + this.setPreferredSize(preferredSize); + this.setMinimumSize(preferredSize); + this.setMaximumSize(preferredSize); + this.setSize(preferredSize); + this.validate(); + } + + /** + * Call this method from the classes which extends this, after initialize all their components and + * before setting it visible. + */ + protected void initializeContentPane() { + // setting the layout of the dialog + GridBagConstraints titlePanelConstraints = new GridBagConstraints(); + titlePanelConstraints.gridx = 0; + titlePanelConstraints.gridy = 0; + titlePanelConstraints.fill = GridBagConstraints.HORIZONTAL; + titlePanelConstraints.weightx = 1; + titlePanelConstraints.insets = TITLE_PANEL_INSETS; + GridBagConstraints contentPanelConstraints = new GridBagConstraints(); + contentPanelConstraints.gridx = 0; + contentPanelConstraints.gridy = 1; + contentPanelConstraints.fill = GridBagConstraints.BOTH; + contentPanelConstraints.weightx = 1; + contentPanelConstraints.weighty = 1; + contentPanelConstraints.insets = CONTENT_PANEL_INSETS; + + getContentPane().setLayout(new GridBagLayout()); + getContentPane().add(getTitlePanel(), titlePanelConstraints); + getContentPane().add(getContentComponent(), contentPanelConstraints); + + // setting the size according to the content component + Dimension contentSize = getContentComponent().getPreferredSize(); + int w = (int) contentSize.getWidth() + BORDER * 2; + int h = (int) contentSize.getHeight() + BORDER + TITLE_HEIGHT; + changeSize(w, h); + setLocationRelativeTo(getParent()); + pack(); + } + + protected JPanel getTitlePanel() { + if (titlePanel == null) { + GridBagConstraints titleLabelConstraints = new GridBagConstraints(); + titleLabelConstraints.gridx = 0; + titleLabelConstraints.gridy = 0; + titleLabelConstraints.insets = TITLE_LABEL_INSETS; + titleLabelConstraints.weightx = 1; + titleLabelConstraints.fill = GridBagConstraints.HORIZONTAL; + GridBagConstraints exitButtonConstraints = new GridBagConstraints(); + exitButtonConstraints.gridx = 1; + exitButtonConstraints.gridy = 0; + exitButtonConstraints.insets = EXIT_BUTTON_INSETS; + exitButtonConstraints.anchor = GridBagConstraints.CENTER; + + titlePanel = new JPanel(); + titlePanel.setLayout(new GridBagLayout()); + titlePanel.setPreferredSize(TITLE_PANEL_DEFAULT_SIZE); + titlePanel.setMinimumSize(TITLE_PANEL_DEFAULT_SIZE); + titlePanel.setMaximumSize(TITLE_PANEL_DEFAULT_SIZE); + titlePanel.add(getTitleLabel(), titleLabelConstraints); + titlePanel.add(getExitButton(), exitButtonConstraints); + } + return titlePanel; + } + + protected JLabel getTitleLabel() { + if (titleLabel == null) { + titleLabel = new JLabel(); + } + return titleLabel; + } + + protected JButton getExitButton() { + if (exitButton == null) { + exitButton = new JButton(); + exitButton.setName(EXIT_BUTTON_NAME); + exitButton.setPreferredSize(EXIT_BUTTON_SIZE); + exitButton.setMinimumSize(EXIT_BUTTON_SIZE); + exitButton.setMaximumSize(EXIT_BUTTON_SIZE); + exitButton.setMnemonic(KeyEvent.VK_UNDEFINED); + exitButton.addActionListener(new CloseListener()); + } + return exitButton; + } + + protected void closeDialog() { + Window window = AllDialog.this; + window.dispatchEvent(new WindowEvent(window, WindowEvent.WINDOW_CLOSING)); + } + + class CloseListener implements ActionListener { + @Override + public void actionPerformed(ActionEvent e) { + closeDialog(); + } + } } diff --git a/src/main/java/com/josdem/jmetadata/gui/ImagePanel.java b/src/main/java/com/josdem/jmetadata/gui/ImagePanel.java index 6e3517b..4f18952 100644 --- a/src/main/java/com/josdem/jmetadata/gui/ImagePanel.java +++ b/src/main/java/com/josdem/jmetadata/gui/ImagePanel.java @@ -1,103 +1,103 @@ -/* - Copyright 2013 Jose Luis De la Cruz Morales joseluis.delacruz@gmail.com - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -package com.josdem.jmetadata.gui; - -import java.awt.AlphaComposite; -import java.awt.Color; -import java.awt.Graphics; -import java.awt.Graphics2D; -import java.awt.GraphicsConfiguration; -import java.awt.Image; -import java.awt.RenderingHints; -import java.awt.Transparency; -import java.awt.image.BufferedImage; - -import javax.swing.JPanel; - -import lombok.extern.slf4j.Slf4j; - -@Slf4j - -public final class ImagePanel extends JPanel { - - private static final long serialVersionUID = 1L; - - private Image portrait; - private double arcHeight; - private double arcWidth; - - - public ImagePanel() { - } - - public ImagePanel(Image portrait, double arcWidth, double arcHeight) { - setImage(portrait, arcWidth, arcHeight); - } - - public void setImage(Image portrait, double arcWidth, double arcHeight) { - this.portrait = portrait; - this.arcWidth = arcWidth; - this.arcHeight = arcHeight; - this.repaint(); - } - - public Image getImage() { - return portrait; - } - - @Override - protected void paintComponent(Graphics g) { - if (portrait == null) { - super.paintComponent(g); - return; - } - try { - // Create a translucent intermediate image in which we can perform the soft clipping - GraphicsConfiguration gc = ((Graphics2D) g).getDeviceConfiguration(); - BufferedImage intermediateBufferedImage = gc.createCompatibleImage(getWidth(), getHeight(), - Transparency.TRANSLUCENT); - Graphics2D bufferGraphics = intermediateBufferedImage.createGraphics(); - - // Clear the image so all pixels have zero alpha - bufferGraphics.setComposite(AlphaComposite.Clear); - bufferGraphics.fillRect(0, 0, getWidth(), getHeight()); - - // Render our clip shape into the image. Shape on where to paint - bufferGraphics.setComposite(AlphaComposite.Src); - bufferGraphics.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY); - bufferGraphics.setColor(Color.WHITE); - bufferGraphics.fillRoundRect(0, 0, getWidth(), getHeight(), (int) (getWidth() * arcWidth), - (int) (getHeight() * arcHeight)); - - // SrcAtop uses the alpha value as a coverage value for each pixel stored in the - // destination shape. For the areas outside our clip shape, the destination - // alpha will be zero, so nothing is rendered in those areas. For - // the areas inside our clip shape, the destination alpha will be fully - // opaque. - bufferGraphics.setComposite(AlphaComposite.SrcAtop); - bufferGraphics.drawImage(portrait, 0, 0, getWidth(), getHeight(), null); - bufferGraphics.dispose(); - - // Copy our intermediate image to the screen - g.drawImage(intermediateBufferedImage, 0, 0, null); - - } catch (Exception e) { - log.warn("Error: Creating Renderings", e); - } - } - -} +/* + Copyright 2013 Jose Luis De la Cruz Morales joseluis.delacruz@gmail.com + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +package com.josdem.jmetadata.gui; + +import java.awt.AlphaComposite; +import java.awt.Color; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.GraphicsConfiguration; +import java.awt.Image; +import java.awt.RenderingHints; +import java.awt.Transparency; +import java.awt.image.BufferedImage; +import javax.swing.JPanel; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +public final class ImagePanel extends JPanel { + + private static final long serialVersionUID = 1L; + + private Image portrait; + private double arcHeight; + private double arcWidth; + + public ImagePanel() {} + + public ImagePanel(Image portrait, double arcWidth, double arcHeight) { + setImage(portrait, arcWidth, arcHeight); + } + + public void setImage(Image portrait, double arcWidth, double arcHeight) { + this.portrait = portrait; + this.arcWidth = arcWidth; + this.arcHeight = arcHeight; + this.repaint(); + } + + public Image getImage() { + return portrait; + } + + @Override + protected void paintComponent(Graphics g) { + if (portrait == null) { + super.paintComponent(g); + return; + } + try { + // Create a translucent intermediate image in which we can perform the soft clipping + GraphicsConfiguration gc = ((Graphics2D) g).getDeviceConfiguration(); + BufferedImage intermediateBufferedImage = + gc.createCompatibleImage(getWidth(), getHeight(), Transparency.TRANSLUCENT); + Graphics2D bufferGraphics = intermediateBufferedImage.createGraphics(); + + // Clear the image so all pixels have zero alpha + bufferGraphics.setComposite(AlphaComposite.Clear); + bufferGraphics.fillRect(0, 0, getWidth(), getHeight()); + + // Render our clip shape into the image. Shape on where to paint + bufferGraphics.setComposite(AlphaComposite.Src); + bufferGraphics.setRenderingHint( + RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY); + bufferGraphics.setColor(Color.WHITE); + bufferGraphics.fillRoundRect( + 0, + 0, + getWidth(), + getHeight(), + (int) (getWidth() * arcWidth), + (int) (getHeight() * arcHeight)); + + // SrcAtop uses the alpha value as a coverage value for each pixel stored in the + // destination shape. For the areas outside our clip shape, the destination + // alpha will be zero, so nothing is rendered in those areas. For + // the areas inside our clip shape, the destination alpha will be fully + // opaque. + bufferGraphics.setComposite(AlphaComposite.SrcAtop); + bufferGraphics.drawImage(portrait, 0, 0, getWidth(), getHeight(), null); + bufferGraphics.dispose(); + + // Copy our intermediate image to the screen + g.drawImage(intermediateBufferedImage, 0, 0, null); + + } catch (Exception e) { + log.warn("Error: Creating Renderings", e); + } + } +} diff --git a/src/main/java/com/josdem/jmetadata/gui/LoginWindow.java b/src/main/java/com/josdem/jmetadata/gui/LoginWindow.java index 452a030..e3bd4ea 100644 --- a/src/main/java/com/josdem/jmetadata/gui/LoginWindow.java +++ b/src/main/java/com/josdem/jmetadata/gui/LoginWindow.java @@ -16,13 +16,18 @@ package com.josdem.jmetadata.gui; +import com.josdem.jmetadata.ApplicationConstants; +import com.josdem.jmetadata.action.Actions; +import com.josdem.jmetadata.event.Events; +import com.josdem.jmetadata.gui.util.SelectedTextForeground; +import com.josdem.jmetadata.gui.util.SynthFonts; +import com.josdem.jmetadata.model.User; import java.awt.Color; import java.awt.Rectangle; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; - import javax.swing.Icon; import javax.swing.JButton; import javax.swing.JFrame; @@ -31,162 +36,179 @@ import javax.swing.JPasswordField; import javax.swing.JTextField; import javax.swing.UIManager; - import org.asmatron.messengine.annotations.EventMethod; import org.asmatron.messengine.engines.support.ViewEngineConfigurator; -import com.josdem.jmetadata.ApplicationConstants; -import com.josdem.jmetadata.action.Actions; -import com.josdem.jmetadata.event.Events; -import com.josdem.jmetadata.gui.util.SelectedTextForeground; -import com.josdem.jmetadata.gui.util.SynthFonts; -import com.josdem.jmetadata.model.User; import org.springframework.beans.factory.annotation.Autowired; /** * @understands UI components for logging window -*/ - + */ public class LoginWindow { - private JButton sendButton; - private JTextField usernameTextfield; - private JPasswordField passwordTextfield; - private JFrame frame; - private JPanel panel; - private static final String SEND_BUTTON_LABEL = "Login"; - private static final Rectangle FRAME_BOUNDS = new Rectangle(300, 300, 390, 180); - private static final int TEXT_COLUMNS = 10; - private JLabel usernameLabel; - private JLabel passwordLabel; - - private static final String USERNAME_TEXTFIELD_NAME = "loginTextField"; - private static final String PASSWORD_TEXTFIELD_NAME = "passwordLoginField"; - private static final Rectangle USERNAME_LABEL_BOUNDS = new Rectangle(20, 30, 120, 22); - private static final Rectangle PASSWORD_LABEL_BOUNDS = new Rectangle(20, 70, 120, 22); - private static final Rectangle USERNAME_TEXTFIELD_BOUNDS = new Rectangle(140, 27, 220, 34); - private static final Rectangle PASSWORD_TEXTFIELD_BOUNDS = new Rectangle(140, 71, 220, 34); - private static final String SIGN_UP_BUTTON_NAME = "buttonCenterLogin"; - private static final Rectangle SIGN_UP_BUTTON_BOUNDS = new Rectangle(140, 114, 220, 34); - - private static final Color COLOR_SELECTION_TEXTFIELDS = SelectedTextForeground.SELECTED_FOREGROUND_COLOR; - private static final Icon BULLET_ICON = UIManager.getDefaults().getIcon("icons.createAccountBullet"); - private static final int REQUIRE_ICON_TEXT_GAP = 2; - - @Autowired - private ViewEngineConfigurator configurator; - - public LoginWindow() { - initialize(); - } - - private void initialize(){ - getFrame().add(getPanel()); - getFrame().setVisible(false); - - getSendButton().addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - configurator.getViewEngine().sendValueAction(Actions.LOGIN, new User(usernameTextfield.getText(), new String(passwordTextfield.getPassword()))); - } - }); - - getSendButton().addKeyListener(new KeyAdapter() { - - @Override - public void keyPressed(KeyEvent e) { - configurator.getViewEngine().sendValueAction(Actions.LOGIN, new User(usernameTextfield.getText(), new String(passwordTextfield.getPassword()))); - } - }); - - getPasswordTextfield().addKeyListener(new KeyAdapter() { - - @Override - public void keyPressed(KeyEvent e) { - int key = e.getKeyCode(); - if(key == KeyEvent.VK_ENTER){ - configurator.getViewEngine().sendValueAction(Actions.LOGIN, new User(usernameTextfield.getText(), new String(passwordTextfield.getPassword()))); - } - } - }); - } - - @EventMethod(Events.USER_LOGGED) - public void onUserLogged(){ - this.getFrame().dispose(); - } - - private JPanel getPanel() { - if(panel == null){ - panel = new JPanel(); - panel.setLayout(null); - panel.add(getUserNameLabel()); - panel.add(getUsernameTextfield()); - panel.add(getPasswordLabel()); - panel.add(getPasswordTextfield()); - panel.add(getSendButton()); - } - return panel; - } - - private JLabel getPasswordLabel() { - if(passwordLabel == null){ - passwordLabel = new JLabel(); - passwordLabel.setText(ApplicationConstants.PASSWORD_LABEL); - passwordLabel.setBounds(PASSWORD_LABEL_BOUNDS); - passwordLabel.setName(SynthFonts.PLAIN_FONT16_GRAY100_100_100); - passwordLabel.setIcon(BULLET_ICON); - passwordLabel.setIconTextGap(REQUIRE_ICON_TEXT_GAP); - } - return passwordLabel; - } - - private JLabel getUserNameLabel() { - if(usernameLabel == null){ - usernameLabel = new JLabel(); - usernameLabel.setText(ApplicationConstants.USERNAME_LABEL); - usernameLabel.setBounds(USERNAME_LABEL_BOUNDS); - usernameLabel.setName(SynthFonts.PLAIN_FONT16_GRAY100_100_100); - usernameLabel.setIcon(BULLET_ICON); - usernameLabel.setIconTextGap(REQUIRE_ICON_TEXT_GAP); - } - return usernameLabel; - } - - private JTextField getUsernameTextfield() { - if(usernameTextfield == null){ - usernameTextfield = new JTextField(TEXT_COLUMNS); - usernameTextfield.setBounds(USERNAME_TEXTFIELD_BOUNDS); - usernameTextfield.setName(USERNAME_TEXTFIELD_NAME); - usernameTextfield.setSelectionColor(COLOR_SELECTION_TEXTFIELDS); - } - return usernameTextfield; - } - - private JTextField getPasswordTextfield() { - if(passwordTextfield == null){ - passwordTextfield = new JPasswordField(TEXT_COLUMNS); - passwordTextfield.setBounds(PASSWORD_TEXTFIELD_BOUNDS); - passwordTextfield.setName(PASSWORD_TEXTFIELD_NAME); - passwordTextfield.setSelectionColor(COLOR_SELECTION_TEXTFIELDS); - passwordTextfield.setEchoChar('\u25CF'); - } - return passwordTextfield; - } - - public JFrame getFrame() { - if(frame == null){ - frame = new JFrame(); - frame.setBounds(FRAME_BOUNDS); - frame.setResizable(false); - } - return frame; - } - - private JButton getSendButton() { - if (sendButton == null) { - sendButton = new JButton(SEND_BUTTON_LABEL); - sendButton.setName(SIGN_UP_BUTTON_NAME); - sendButton.setBounds(SIGN_UP_BUTTON_BOUNDS); - } - return sendButton; - } + private JButton sendButton; + private JTextField usernameTextfield; + private JPasswordField passwordTextfield; + private JFrame frame; + private JPanel panel; + private static final String SEND_BUTTON_LABEL = "Login"; + private static final Rectangle FRAME_BOUNDS = new Rectangle(300, 300, 390, 180); + private static final int TEXT_COLUMNS = 10; + private JLabel usernameLabel; + private JLabel passwordLabel; + + private static final String USERNAME_TEXTFIELD_NAME = "loginTextField"; + private static final String PASSWORD_TEXTFIELD_NAME = "passwordLoginField"; + private static final Rectangle USERNAME_LABEL_BOUNDS = new Rectangle(20, 30, 120, 22); + private static final Rectangle PASSWORD_LABEL_BOUNDS = new Rectangle(20, 70, 120, 22); + private static final Rectangle USERNAME_TEXTFIELD_BOUNDS = new Rectangle(140, 27, 220, 34); + private static final Rectangle PASSWORD_TEXTFIELD_BOUNDS = new Rectangle(140, 71, 220, 34); + private static final String SIGN_UP_BUTTON_NAME = "buttonCenterLogin"; + private static final Rectangle SIGN_UP_BUTTON_BOUNDS = new Rectangle(140, 114, 220, 34); + + private static final Color COLOR_SELECTION_TEXTFIELDS = + SelectedTextForeground.SELECTED_FOREGROUND_COLOR; + private static final Icon BULLET_ICON = + UIManager.getDefaults().getIcon("icons.createAccountBullet"); + private static final int REQUIRE_ICON_TEXT_GAP = 2; + + @Autowired private ViewEngineConfigurator configurator; + + public LoginWindow() { + initialize(); + } + + private void initialize() { + getFrame().add(getPanel()); + getFrame().setVisible(false); + + getSendButton() + .addActionListener( + new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + configurator + .getViewEngine() + .sendValueAction( + Actions.LOGIN, + new User( + usernameTextfield.getText(), + new String(passwordTextfield.getPassword()))); + } + }); + + getSendButton() + .addKeyListener( + new KeyAdapter() { + + @Override + public void keyPressed(KeyEvent e) { + configurator + .getViewEngine() + .sendValueAction( + Actions.LOGIN, + new User( + usernameTextfield.getText(), + new String(passwordTextfield.getPassword()))); + } + }); + + getPasswordTextfield() + .addKeyListener( + new KeyAdapter() { + + @Override + public void keyPressed(KeyEvent e) { + int key = e.getKeyCode(); + if (key == KeyEvent.VK_ENTER) { + configurator + .getViewEngine() + .sendValueAction( + Actions.LOGIN, + new User( + usernameTextfield.getText(), + new String(passwordTextfield.getPassword()))); + } + } + }); + } + + @EventMethod(Events.USER_LOGGED) + public void onUserLogged() { + this.getFrame().dispose(); + } + + private JPanel getPanel() { + if (panel == null) { + panel = new JPanel(); + panel.setLayout(null); + panel.add(getUserNameLabel()); + panel.add(getUsernameTextfield()); + panel.add(getPasswordLabel()); + panel.add(getPasswordTextfield()); + panel.add(getSendButton()); + } + return panel; + } + + private JLabel getPasswordLabel() { + if (passwordLabel == null) { + passwordLabel = new JLabel(); + passwordLabel.setText(ApplicationConstants.PASSWORD_LABEL); + passwordLabel.setBounds(PASSWORD_LABEL_BOUNDS); + passwordLabel.setName(SynthFonts.PLAIN_FONT16_GRAY100_100_100); + passwordLabel.setIcon(BULLET_ICON); + passwordLabel.setIconTextGap(REQUIRE_ICON_TEXT_GAP); + } + return passwordLabel; + } + + private JLabel getUserNameLabel() { + if (usernameLabel == null) { + usernameLabel = new JLabel(); + usernameLabel.setText(ApplicationConstants.USERNAME_LABEL); + usernameLabel.setBounds(USERNAME_LABEL_BOUNDS); + usernameLabel.setName(SynthFonts.PLAIN_FONT16_GRAY100_100_100); + usernameLabel.setIcon(BULLET_ICON); + usernameLabel.setIconTextGap(REQUIRE_ICON_TEXT_GAP); + } + return usernameLabel; + } + + private JTextField getUsernameTextfield() { + if (usernameTextfield == null) { + usernameTextfield = new JTextField(TEXT_COLUMNS); + usernameTextfield.setBounds(USERNAME_TEXTFIELD_BOUNDS); + usernameTextfield.setName(USERNAME_TEXTFIELD_NAME); + usernameTextfield.setSelectionColor(COLOR_SELECTION_TEXTFIELDS); + } + return usernameTextfield; + } + + private JTextField getPasswordTextfield() { + if (passwordTextfield == null) { + passwordTextfield = new JPasswordField(TEXT_COLUMNS); + passwordTextfield.setBounds(PASSWORD_TEXTFIELD_BOUNDS); + passwordTextfield.setName(PASSWORD_TEXTFIELD_NAME); + passwordTextfield.setSelectionColor(COLOR_SELECTION_TEXTFIELDS); + passwordTextfield.setEchoChar('\u25CF'); + } + return passwordTextfield; + } + + public JFrame getFrame() { + if (frame == null) { + frame = new JFrame(); + frame.setBounds(FRAME_BOUNDS); + frame.setResizable(false); + } + return frame; + } + + private JButton getSendButton() { + if (sendButton == null) { + sendButton = new JButton(SEND_BUTTON_LABEL); + sendButton.setName(SIGN_UP_BUTTON_NAME); + sendButton.setBounds(SIGN_UP_BUTTON_BOUNDS); + } + return sendButton; + } } diff --git a/src/main/java/com/josdem/jmetadata/gui/MainWindow.java b/src/main/java/com/josdem/jmetadata/gui/MainWindow.java index b462241..d066455 100644 --- a/src/main/java/com/josdem/jmetadata/gui/MainWindow.java +++ b/src/main/java/com/josdem/jmetadata/gui/MainWindow.java @@ -16,6 +16,27 @@ package com.josdem.jmetadata.gui; +import com.josdem.jmetadata.ApplicationConstants; +import com.josdem.jmetadata.action.ActionResult; +import com.josdem.jmetadata.action.Actions; +import com.josdem.jmetadata.dnd.ImageDropListener; +import com.josdem.jmetadata.dnd.MainFrameDragOverListener; +import com.josdem.jmetadata.dnd.MultiLayerDropTargetListener; +import com.josdem.jmetadata.event.Events; +import com.josdem.jmetadata.gui.table.DescriptionTable; +import com.josdem.jmetadata.helper.DialogHelper; +import com.josdem.jmetadata.helper.FileChooserHelper; +import com.josdem.jmetadata.helper.MetadataAdapter; +import com.josdem.jmetadata.model.CoverArt; +import com.josdem.jmetadata.model.CoverArtType; +import com.josdem.jmetadata.model.ExportPackage; +import com.josdem.jmetadata.model.Metadata; +import com.josdem.jmetadata.model.MetadataAlbumValues; +import com.josdem.jmetadata.model.Model; +import com.josdem.jmetadata.model.User; +import com.josdem.jmetadata.observer.ObservValue; +import com.josdem.jmetadata.observer.Observer; +import com.josdem.jmetadata.util.ImageUtils; import java.awt.Image; import java.awt.Rectangle; import java.awt.dnd.DropTarget; @@ -30,7 +51,6 @@ import java.util.Iterator; import java.util.List; import java.util.Set; - import javax.annotation.PostConstruct; import javax.swing.AbstractAction; import javax.swing.ImageIcon; @@ -55,1093 +75,1289 @@ import javax.swing.event.TableModelListener; import javax.swing.table.DefaultTableModel; import javax.swing.table.TableModel; - +import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.builder.ToStringBuilder; - import org.asmatron.messengine.action.ResponseCallback; import org.asmatron.messengine.annotations.EventMethod; import org.asmatron.messengine.engines.support.ControlEngineConfigurator; import org.asmatron.messengine.engines.support.ViewEngineConfigurator; - import org.springframework.beans.factory.annotation.Autowired; -import com.josdem.jmetadata.ApplicationConstants; -import com.josdem.jmetadata.action.ActionResult; -import com.josdem.jmetadata.action.Actions; -import com.josdem.jmetadata.dnd.ImageDropListener; -import com.josdem.jmetadata.dnd.MainFrameDragOverListener; -import com.josdem.jmetadata.dnd.MultiLayerDropTargetListener; -import com.josdem.jmetadata.event.Events; -import com.josdem.jmetadata.gui.table.DescriptionTable; -import com.josdem.jmetadata.helper.DialogHelper; -import com.josdem.jmetadata.helper.FileChooserHelper; -import com.josdem.jmetadata.helper.MetadataAdapter; -import com.josdem.jmetadata.model.CoverArt; -import com.josdem.jmetadata.model.CoverArtType; -import com.josdem.jmetadata.model.ExportPackage; -import com.josdem.jmetadata.model.Metadata; -import com.josdem.jmetadata.model.MetadataAlbumValues; -import com.josdem.jmetadata.model.Model; -import com.josdem.jmetadata.model.User; -import com.josdem.jmetadata.observer.ObservValue; -import com.josdem.jmetadata.observer.Observer; -import com.josdem.jmetadata.util.ImageUtils; - -import lombok.extern.slf4j.Slf4j; - @Slf4j /** * @understands A principal JAudioScrobbler principal window */ - @SuppressWarnings("unused") public class MainWindow extends JFrame { - private static final long serialVersionUID = 1311230231101552007L; - private static final String JMENU_ITEM_LABEL = "Sign in Last.fm"; - private static final String JMENU_EXIT_LABEL = "Exit"; - private static final String JMENU_LABEL = "File"; - private static final int DIRECTORY_SELECTED_LENGHT = 20; - private static final String STATUS_LABEL = "Status"; - private static final String CTRL_O = "CTRL+O"; - private static final String ENTER = "ENTER"; - private static final String LOGIN_MENU_ITEM = "loginMenuItem"; - private static final String EXIT_MENU_ITEM = "exitMenuItem"; - private static final String SEND_SCROBBLINGS = "Send"; - private static final String LOAD_FILES = "Open"; - private static final String LOG_OUT = "logged out"; - private static final String LOGIN_LABEL_NAME = "loginLabel"; - private static final String STATUS_LABEL_NAME = "statusLabel"; - private static final String IMAGE_LABEL_NAME = "imageLabelName"; - private static final String MAIN_MENU_NAME = "mainMenuName"; - private static final String IMAGE_PANEL_NAME = "bigDnDImagePanel"; - - /** - * Default button style - * private static final String SEND_BUTTON_NAME = "button[A-Za-z0-9]+"; - */ - private static final String TEXTFIELD_NAME = "searchTextField"; - private static final String OPEN_BUTTON_NAME = "openButton"; - private static final String SEND_BUTTON_NAME = "sendButton"; - private static final String APPLY_BUTTON_NAME = "applyButton"; - private static final String COMPLETE_BUTTON_NAME = "completeMetadataButton"; - private static final String EXPORT_BUTTON_NAME = "exportButton"; - private static final String PROGRESS_BAR_NAME = "bigProgressBar"; - private static final int PROGRESS_BAR_DEFAULT_VALUE = 0; - private static final int PROGRESS_BAR_MAXIMUM_VALUE = 100; - - /** - * Bottom panel bounds - */ - private static final Rectangle BOTTOM_PANEL_BOUNDS = new Rectangle(0, 500, 1024, 100); - private static final Rectangle LABEL_BOUNDS = new Rectangle(10, 10, 50, 20); - private static final Rectangle DIRECTORY_BOUNDS = new Rectangle(60, 10, 195, 20); - private static final Rectangle PROGRESS_BAR_BOUNDS = new Rectangle(265, 10, 150, 20); - private static final Rectangle OPEN_BUTTON_BOUNDS = new Rectangle(425, 10, 110, 28); - private static final Rectangle SEND_BUTTON_BOUNDS = new Rectangle(545, 10, 110, 28); - private static final Rectangle COMPLETE_BUTTON_BOUNDS = new Rectangle(665, 10, 110, 28); - private static final Rectangle APPLY_BUTTON_BOUNDS = new Rectangle(785, 10, 110, 28); - private static final Rectangle EXPORT_BUTTON_BOUNDS = new Rectangle(905, 10, 110, 28); - - /** - * Top panel bounds - */ - private static final Rectangle TOP_PANEL_BOUNDS = new Rectangle(0, 0, 1024, 40); - private static final Rectangle LOGIN_LABEL_BOUNDS = new Rectangle(450, 10, 200, 20); - - /** - * Middle panel bounds - */ - private static final Rectangle MIDDLE_PANEL_BOUNDS = new Rectangle(0, 50, 1024, 400); - private static final Rectangle IMAGE_PANEL_BOUNDS = new Rectangle(10, 10, 300, 300); - private static final Rectangle IMAGE_LABEL_BOUNDS = new Rectangle(100, 320, 200, 20); - private static final Rectangle SCROLL_PANE_BOUNDS = new Rectangle(320, 10, 693, 390); - - private JPanel panel; - private JButton openButton; - private JButton sendButton; - private JButton applyButton; - private JButton exportButton; - private JButton completeMetadataButton; - private JTextField directorySelected; - private JPanel bottomPanel; - private JTable descriptionTable; - private JSlider progressBar; - private JLabel label; - private JLabel imageLabel; - private JLabel loginLabel; - private JPanel middlePanel; - private JPanel topPanel; - private JPanel imagePanel; - private JMenuBar menuBar; - private JMenu mainMenu; - private JMenuItem lastFmMenuItem; - private JMenuItem exitMenuItem; - private InputMap inputMap; - private JScrollPane scrollPane; - private ImageUtils imageUtils = new ImageUtils(); - private Set metadataWithAlbum = new HashSet(); - private MetadataAdapter metadataAdapter = new MetadataAdapter(); - private DialogHelper dialogHelper = new DialogHelper(); - private FileChooserHelper fileChooserHelper = new FileChooserHelper(); - boolean tableLoaded; - boolean working; - private int counter = 0; - private int selectedRow; - - @Autowired - private LoginWindow loginWindow; - @Autowired - private ViewEngineConfigurator viewEngineConfigurator; - @Autowired - private ControlEngineConfigurator controlEngineConfigurator; - - - public MainWindow() { - super(ApplicationConstants.APPLICATION_NAME); - initialize(); - getDescriptionTable().getModel().addTableModelListener(new DescriptionTableModelListener()); - } - - private void initialize() { - registerKeyStrokeAction(); - this.setBounds(0, 0, ApplicationConstants.WIDTH, ApplicationConstants.HEIGHT); - this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - this.setResizable(false); - this.setJMenuBar(getMenubar()); - this.add(getPanel()); - this.setVisible(true); - } - - @PostConstruct - private void setDragAndDrop() { - MultiLayerDropTargetListener multiLayerDropTargetListener = new MultiLayerDropTargetListener(); - setDropTarget(new DropTarget(this, multiLayerDropTargetListener)); - multiLayerDropTargetListener.addDragListener(this, new MainFrameDragOverListener(this)); - ImageDropListener listener = new ImageDropListener(new ImagePanel()); - listener.onDropped().add(new Observer>() { - - public void observe(ObservValue t) { - ImagePanel value = t.getValue(); - Image image = value.getImage(); - List metadatas = controlEngineConfigurator.getControlEngine().get(Model.METADATA); - Metadata metadata = metadatas.get(selectedRow); - CoverArt coverArt = new CoverArt(imageUtils.resize(image, ApplicationConstants.THREE_HUNDRED, ApplicationConstants.THREE_HUNDRED), CoverArtType.DRAG_AND_DROP); - metadata.setNewCoverArt(coverArt); - log.info("sertting image to the row: " + selectedRow); - updateImage(selectedRow); - metadataWithAlbum.add(metadata); - getDescriptionTable().getModel().setValueAt(ActionResult.New, selectedRow, ApplicationConstants.STATUS_COLUMN); - getApplyButton().setEnabled(!working); - log.info("setting applyButton to : " + !working); - } - }); - multiLayerDropTargetListener.addDropListener(imagePanel, listener); - } - - @EventMethod(Events.USER_LOGGED) - void onUserLogged(User currentUser) { - StringBuilder sb = new StringBuilder(); - sb.append(ApplicationConstants.LOGGED_AS); - sb.append(currentUser.getUsername()); - getLoginLabel().setText(sb.toString()); - getSendButton().setEnabled(true); - } - - @EventMethod(Events.COVER_ART_FAILED) - void onCovertArtFailed(String title) { - StringBuilder sb = new StringBuilder(); - sb.append(title); - sb.append(ApplicationConstants.CORRUPTED_METADATA_LABEL); - dialogHelper.showMessageDialog(this, sb.toString()); - } - - @EventMethod(Events.LOAD_FILE_FAILED) - void onLoadFileFailed(String fileName) { - StringBuilder sb = new StringBuilder(); - sb.append(ApplicationConstants.FILE_NOT_FOUND); - sb.append(fileName); - dialogHelper.showMessageDialog(this, sb.toString()); - } - - @EventMethod(Events.USER_LOGIN_FAILED) - void onUserLoginFailed() { - getLoginLabel().setText(ApplicationConstants.LOGIN_FAIL); - } - - @EventMethod(Events.MUSIC_DIRECTORY_SELECTED) - void onMusicDirectorySelected(String path) { - tableLoaded = false; - deleteALLRows(descriptionTable); - metadataWithAlbum.clear(); - getDirectoryField().setText(path); - getLabel().setText(ApplicationConstants.WORKING); - } - - @EventMethod(Events.MUSIC_DIRECTORY_NOT_EXIST) - void onMusicDirectoryNotExist(String path) { - StringBuilder sb = new StringBuilder(); - sb.append(ApplicationConstants.DIRECTORY_NOT_FOUND); - sb.append(path); - dialogHelper.showMessageDialog(this, sb.toString()); - getOpenButton().setEnabled(true); - } - - @EventMethod(Events.TOO_MUCH_FILES_LOADED) - void onTooMuchFilesLoaded(String maxFiles) { - StringBuilder sb = new StringBuilder(); - sb.append(ApplicationConstants.TOO_MUCH_FILES_LOADED); - sb.append(maxFiles); - dialogHelper.showMessageDialog(this, sb.toString()); - getOpenButton().setEnabled(true); - } - - @EventMethod(Events.MUSIC_DIRECTORY_SELECTED_CANCEL) - void onMusicDirectorySelectedCancel() { - getOpenButton().setEnabled(true); - if(tableLoaded){ - getCompleteMetadataButton().setEnabled(true); - getExportButton().setEnabled(true); - } - } - - private void resetStatus() { - log.info("Trying to reset to the default image"); - getCompleteMetadataButton().setEnabled(true); - getExportButton().setEnabled(true); - getOpenButton().setEnabled(true); - getLabel().setText(ApplicationConstants.DONE); - } - - @EventMethod(Events.TRACKS_LOADED) - void onTracksLoaded() { - Set filesWithoutMinimumMetadata = controlEngineConfigurator.getControlEngine().get(Model.FILES_WITHOUT_MINIMUM_METADATA); - List metadatas = controlEngineConfigurator.getControlEngine().get(Model.METADATA); - if (!filesWithoutMinimumMetadata.isEmpty()) { - File file = new File("Music File"); - Iterator iterator = filesWithoutMinimumMetadata.iterator(); - while (iterator.hasNext()) { - file = iterator.next(); - } - if (filesWithoutMinimumMetadata.size() == 1) { - StringBuilder sb = new StringBuilder(); - sb.append(file.getName()); - sb.append(ApplicationConstants.METADATA_FROM_FILE_LABEL); - dialogHelper.showMessageDialog(this, sb.toString()); - } else { - int otherFiles = filesWithoutMinimumMetadata.size() - 1; - StringBuilder sb = new StringBuilder(); - sb.append(file.getName()); - sb.append(ApplicationConstants.AND_ANOTHER); - sb.append(otherFiles); - sb.append(ApplicationConstants.METADATA_FROM_FILE_LABEL); - dialogHelper.showMessageDialog(this, sb.toString()); - } - } - resetStatus(); - ListSelectionModel listSelectionModel = getDescriptionTable().getSelectionModel(); - listSelectionModel.setSelectionInterval(0, 0); - selectedRow = 0; - updateImage(selectedRow); - tableLoaded = true; - } - - @EventMethod(Events.DIRECTORY_EMPTY_EVENT) - void onDirectoryEmpty() { - dialogHelper.showMessageDialog(this, ApplicationConstants.DIRECTORY_EMPTY); - resetStatus(); - } - - @EventMethod(Events.LOAD_METADATA) - void onLoadMetadata(List metadatas) { - JTable descriptionTable = getDescriptionTable(); - DefaultTableModel model = (DefaultTableModel) descriptionTable.getModel(); - for (Metadata metadata : metadatas) { - int row = descriptionTable.getRowCount(); - model.addRow(new Object[] { "", "", "", "", "", "", "", "" }); - descriptionTable.setValueAt(metadata.getArtist(), row, ApplicationConstants.ARTIST_COLUMN); - descriptionTable.setValueAt(metadata.getTitle(), row, ApplicationConstants.TITLE_COLUMN); - descriptionTable.setValueAt(metadata.getAlbum(), row, ApplicationConstants.ALBUM_COLUMN); - descriptionTable.setValueAt(metadata.getGenre(), row, ApplicationConstants.GENRE_COLUMN); - descriptionTable.setValueAt(metadata.getYear(), row, ApplicationConstants.YEAR_COLUMN); - descriptionTable.setValueAt(metadata.getTrackNumber(), row, ApplicationConstants.TRACK_NUMBER_COLUMN); - descriptionTable.setValueAt(metadata.getTotalTracks(), row, ApplicationConstants.TOTAL_TRACKS_NUMBER_COLUMN); - descriptionTable.setValueAt(metadata.getCdNumber(), row, ApplicationConstants.CD_NUMBER_COLUMN); - descriptionTable.setValueAt(metadata.getTotalCds(), row, ApplicationConstants.TOTAL_CDS_NUMBER_COLUMN); - if(metadata.isMetadataFromFile()){ - descriptionTable.setValueAt(ApplicationConstants.NEW , row, ApplicationConstants.STATUS_COLUMN); - metadataWithAlbum.add(metadata); - getApplyButton().setEnabled(true); - } else { - descriptionTable.setValueAt(ApplicationConstants.READY, row, ApplicationConstants.STATUS_COLUMN); - } - } - } - - @EventMethod(Events.APPLY_METADATA) - void onReadyToApplyMetadata(MetadataAlbumValues metadataValues) { - String artist = metadataValues.getArtist(); - String album = metadataValues.getAlbum(); - String genre = metadataValues.getGenre(); - String year = metadataValues.getYear(); - String tracks = metadataValues.getTracks(); - String cd = metadataValues.getCd(); - String cds = metadataValues.getCds(); - DefaultTableModel model = (DefaultTableModel) descriptionTable.getModel(); - List metadatas = controlEngineConfigurator.getControlEngine().get(Model.METADATA); - log.info("Album size: " + metadataWithAlbum.size()); - for (int i = 0; i < model.getRowCount(); i++) { - Metadata metadata = metadatas.get(i); - if (!StringUtils.isEmpty(artist)) { - getDescriptionTable().getModel().setValueAt(artist, i, ApplicationConstants.ARTIST_COLUMN); - } - if (!StringUtils.isEmpty(album)) { - getDescriptionTable().getModel().setValueAt(album, i, ApplicationConstants.ALBUM_COLUMN); - } - if (!StringUtils.isEmpty(genre)) { - getDescriptionTable().getModel().setValueAt(genre, i, ApplicationConstants.GENRE_COLUMN); - } - if (!StringUtils.isEmpty(year)) { - getDescriptionTable().getModel().setValueAt(year, i, ApplicationConstants.YEAR_COLUMN); - } - if (!StringUtils.isEmpty(tracks)) { - getDescriptionTable().getModel().setValueAt(tracks, i, ApplicationConstants.TOTAL_TRACKS_NUMBER_COLUMN); - } - if (!StringUtils.isEmpty(cd)) { - getDescriptionTable().getModel().setValueAt(cd, i, ApplicationConstants.CD_NUMBER_COLUMN); - } - if (!StringUtils.isEmpty(cds)) { - getDescriptionTable().getModel().setValueAt(cds, i, ApplicationConstants.TOTAL_CDS_NUMBER_COLUMN); - } - if (metadataValues.getCoverArt() != null) { - log.info("coverArt detected for: " + metadata.getTitle()); - CoverArt coverArt = new CoverArt(metadataValues.getCoverArt(), CoverArtType.DRAG_AND_DROP); - metadata.setNewCoverArt(coverArt); - metadataWithAlbum.add(metadata); - getDescriptionTable().getModel().setValueAt(ActionResult.New, i, ApplicationConstants.STATUS_COLUMN); - if (i == selectedRow) { - updateImage(i); - } - getApplyButton().setEnabled(!working); - log.info("setting applyButton to : " + !working); - } - } - } - - private void deleteALLRows(JTable descriptionTable) { - DefaultTableModel model = (DefaultTableModel) descriptionTable.getModel(); - for (int i = model.getRowCount() - 1; i >= 0; i--) { - model.removeRow(i); - } - } - - @EventMethod(Events.OPEN_ERROR) - void onOpenError() { - getLabel().setText(ApplicationConstants.OPEN_ERROR); - } - - private JMenuBar getMenubar() { - if (menuBar == null) { - menuBar = new JMenuBar(); - menuBar.add(getLastFmMenu()); - } - return menuBar; - } - - private JMenu getLastFmMenu() { - if (mainMenu == null) { - mainMenu = new JMenu(JMENU_LABEL); - mainMenu.setName(MAIN_MENU_NAME); - mainMenu.setMnemonic(KeyEvent.VK_F); - mainMenu.add(getLastFmMenuItem()); - mainMenu.add(getExitMenuItem()); - } - return mainMenu; - } - - private JMenuItem getLastFmMenuItem() { - if (lastFmMenuItem == null) { - lastFmMenuItem = new JMenuItem(JMENU_ITEM_LABEL); - lastFmMenuItem.setName(LOGIN_MENU_ITEM); - lastFmMenuItem.setMnemonic(KeyEvent.VK_S); - - lastFmMenuItem.addActionListener(new ActionListener() { - - public void actionPerformed(ActionEvent e) { - loginWindow.getFrame().setLocationRelativeTo(MainWindow.this); - loginWindow.getFrame().setVisible(true); - } - }); - } - return lastFmMenuItem; - } - - private JMenuItem getExitMenuItem() { - if (exitMenuItem == null) { - exitMenuItem = new JMenuItem(JMENU_EXIT_LABEL); - exitMenuItem.setName(EXIT_MENU_ITEM); - exitMenuItem.setMnemonic(KeyEvent.VK_E); - - exitMenuItem.addActionListener(new ActionListener() { - - public void actionPerformed(ActionEvent e) { - System.exit(0); - } - }); - } - return exitMenuItem; - } - - private JPanel getBottomPanel() { - if (bottomPanel == null) { - bottomPanel = new JPanel(); - bottomPanel.setLayout(null); - bottomPanel.setBounds(BOTTOM_PANEL_BOUNDS); - bottomPanel.add(getLabel()); - bottomPanel.add(getDirectoryField()); - bottomPanel.add(getProgressBar()); - bottomPanel.add(getOpenButton()); - bottomPanel.add(getSendButton()); - bottomPanel.add(getCompleteMetadataButton()); - bottomPanel.add(getApplyButton()); - bottomPanel.add(getExportButton()); - } - return bottomPanel; - } - - private void registerKeyStrokeAction() { - KeyStroke ctrlo = KeyStroke.getKeyStroke(KeyEvent.VK_O, InputEvent.CTRL_DOWN_MASK); - KeyStroke enter = KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0); - inputMap = getOpenButton().getInputMap(JButton.WHEN_IN_FOCUSED_WINDOW); - inputMap.put(ctrlo, CTRL_O); - inputMap.put(enter, ENTER); - getOpenButton().getActionMap().put(CTRL_O, new ClickAction(getOpenButton())); - getOpenButton().getActionMap().put(ENTER, new ClickAction(getOpenButton())); - } - - private JPanel getPanel() { - if (panel == null) { - panel = new JPanel(); - panel.setLayout(null); - panel.add(getTopPanel()); - panel.add(getMiddlePanel()); - panel.add(getBottomPanel()); - } - return panel; - } - - private JPanel getMiddlePanel() { - if (middlePanel == null) { - middlePanel = new JPanel(); - middlePanel.setLayout(null); - middlePanel.setBounds(MIDDLE_PANEL_BOUNDS); - middlePanel.add(getImageLabel()); - middlePanel.add(getImagePanel()); - middlePanel.add(getScrollPane()); - } - return middlePanel; - } - - private JPanel getImagePanel() { - if (imagePanel == null) { - imagePanel = new JPanel(); - imagePanel.setName(IMAGE_PANEL_NAME); - imagePanel.setBounds(IMAGE_PANEL_BOUNDS); - } - return imagePanel; - } - - private JLabel getImageLabel() { - if (imageLabel == null) { - imageLabel = new JLabel(); - imageLabel.setName(IMAGE_LABEL_NAME); - imageLabel.setBounds(IMAGE_LABEL_BOUNDS); - } - return imageLabel; - } - - private JPanel getTopPanel() { - if (topPanel == null) { - topPanel = new JPanel(); - topPanel.setLayout(null); - topPanel.setBounds(TOP_PANEL_BOUNDS); - topPanel.add(getLoginLabel()); - } - return topPanel; - } - - private JTextField getDirectoryField() { - if (directorySelected == null) { - directorySelected = new JTextField(DIRECTORY_SELECTED_LENGHT); - directorySelected.setName(TEXTFIELD_NAME); - directorySelected.setBounds(DIRECTORY_BOUNDS); - directorySelected.setEnabled(false); - } - return directorySelected; - } - - private JSlider getProgressBar() { - if (progressBar == null) { - progressBar = new JSlider(); - progressBar.setName(PROGRESS_BAR_NAME); - progressBar.setBounds(PROGRESS_BAR_BOUNDS); - progressBar.setMaximum(PROGRESS_BAR_MAXIMUM_VALUE); - progressBar.setRequestFocusEnabled(false); - progressBar.setValue(PROGRESS_BAR_DEFAULT_VALUE); - progressBar.setPaintLabels(false); - progressBar.setOpaque(false); - progressBar.setFocusable(false); - progressBar.setEnabled(false); - progressBar.setVisible(true); - } - return progressBar; - } - - public JLabel getLabel() { - if (label == null) { - label = new JLabel(STATUS_LABEL); - label.setName(STATUS_LABEL_NAME); - label.setBounds(LABEL_BOUNDS); - } - return label; - } - - private JLabel getLoginLabel() { - if (loginLabel == null) { - loginLabel = new JLabel(LOG_OUT); - loginLabel.setName(LOGIN_LABEL_NAME); - loginLabel.setBounds(LOGIN_LABEL_BOUNDS); - } - return loginLabel; - } - - public JButton getCompleteMetadataButton() { - if (completeMetadataButton == null) { - completeMetadataButton = new JButton(ActionResult.Complete.toString()); - completeMetadataButton.setName(COMPLETE_BUTTON_NAME); - completeMetadataButton.setEnabled(false); - completeMetadataButton.setBounds(COMPLETE_BUTTON_BOUNDS); - - completeMetadataButton.addActionListener(new ActionListener() { - - public void actionPerformed(ActionEvent e) { - resetStatus(); - new CompleteWorker(); - } - - private void resetStatus() { - metadataWithAlbum.clear(); - for (int i = 0; i < getDescriptionTable().getModel().getRowCount(); i++) { - getDescriptionTable().getModel().setValueAt(ApplicationConstants.READY, i, ApplicationConstants.STATUS_COLUMN); - } - } - }); - } - return completeMetadataButton; - } - - public JButton getApplyButton() { - if (applyButton == null) { - applyButton = new JButton(ApplicationConstants.APPLY); - applyButton.setName(APPLY_BUTTON_NAME); - applyButton.setEnabled(false); - applyButton.setBounds(APPLY_BUTTON_BOUNDS); - - applyButton.addActionListener(new ActionListener() { - - public void actionPerformed(ActionEvent e) { - new WriteWorker(); - } - - }); - } - return applyButton; - } - - public JButton getExportButton() { - if (exportButton == null) { - exportButton = new JButton(ApplicationConstants.EXPORT); - exportButton.setName(EXPORT_BUTTON_NAME); - exportButton.setEnabled(false); - exportButton.setBounds(EXPORT_BUTTON_BOUNDS); - - exportButton.addActionListener(new ActionListener() { - - - public void actionPerformed(ActionEvent e) { - log.info("Exporting"); - File root = fileChooserHelper.getDirectory(); - if (root != null) { - new ExportWorker(root); - } - } - - }); - } - return exportButton; - } - - public JButton getSendButton() { - if (sendButton == null) { - sendButton = new JButton(SEND_SCROBBLINGS); - sendButton.setName(SEND_BUTTON_NAME); - sendButton.setEnabled(false); - sendButton.setBounds(SEND_BUTTON_BOUNDS); - - sendButton.addActionListener(new ActionListener() { - - public void actionPerformed(ActionEvent e) { - new SendWorker(); - } - }); - } - return sendButton; - } - - public JButton getOpenButton() { - if (openButton == null) { - openButton = new JButton(LOAD_FILES); - openButton.setName(OPEN_BUTTON_NAME); - openButton.setBounds(OPEN_BUTTON_BOUNDS); - - openButton.addActionListener(new ActionListener() { - - public void actionPerformed(ActionEvent e) { - openButton.setEnabled(false); - getCompleteMetadataButton().setEnabled(false); - getExportButton().setEnabled(false); - viewEngineConfigurator.getViewEngine().send(Actions.METADATA); - } - }); - } - return openButton; - } - - private JScrollPane getScrollPane() { - if (scrollPane == null) { - scrollPane = new JScrollPane(getDescriptionTable()); - scrollPane.setBounds(SCROLL_PANE_BOUNDS); - } - return scrollPane; - } - - public JTable getDescriptionTable() { - if (descriptionTable == null) { - descriptionTable = new DescriptionTable(); - descriptionTable.addMouseListener(new MouseAdapter() { - - public void mouseClicked(MouseEvent e) { - if (e.getButton() == MouseEvent.BUTTON3) { - MetadataDialog metadataDialog = new MetadataDialog(MainWindow.this, controlEngineConfigurator, "Alter ALL rows"); - metadataDialog.setVisible(true); - } - } - }); - - descriptionTable.getSelectionModel().addListSelectionListener(new ListSelectionListener() { - - public void valueChanged(ListSelectionEvent e) { - if (tableLoaded) { - selectedRow = descriptionTable.getSelectedRow(); - log.info("SETTING SELECTED ROW to : " + selectedRow); - updateImage(selectedRow); - } - } - - }); - - descriptionTable.getModel().addTableModelListener(new TableModelListener() { - - public void tableChanged(TableModelEvent e) { - if (e.getType() == TableModelEvent.UPDATE && tableLoaded && e.getColumn() != ApplicationConstants.STATUS_COLUMN) { - int column = e.getColumn(); - int row = e.getFirstRow(); - String value = getDescriptionTable().getModel().getValueAt(row, column).toString(); - log.info("value changed: " + value); - List metadataList = viewEngineConfigurator.getViewEngine().get(Model.METADATA); - Metadata metadata = metadataList.get(row); - metadataAdapter.update(metadata, column, value); - metadataWithAlbum.add(metadata); - - getDescriptionTable().getModel().setValueAt(ActionResult.New, row, ApplicationConstants.STATUS_COLUMN); - - controlEngineConfigurator.getControlEngine().set(Model.METADATA_ARTIST, metadataWithAlbum, null); - getApplyButton().setEnabled(!working); - log.info("setting applyButton to : " + !working); - } - } - }); - - } - - return descriptionTable; - } - - private void updateImage(int selectedRow) { - TableModel model = getDescriptionTable().getModel(); - List metadataList = viewEngineConfigurator.getViewEngine().get(Model.METADATA); - - Metadata metadata = metadataList.get(selectedRow); - log.info("metadata: " + ToStringBuilder.reflectionToString(metadata)); - - imagePanel.removeAll(); - if (metadata.getNewCoverArt() != null) { - CoverArt coverArt = metadata.getNewCoverArt(); - log.info("setting coverArt to: " + coverArt.getType()); - ImageIcon imageIcon = new ImageIcon(coverArt.getImage()); - imagePanel.add(new JLabel(imageIcon)); - String label = ApplicationConstants.COVER_ART_FROM_LASTFM; - if (coverArt.getType().equals(CoverArtType.DRAG_AND_DROP)) { - label = ApplicationConstants.COVER_ART_FROM_DRAG_AND_DROP; - } - imageLabel.setText(label); - } else if (metadata.getCoverArt() != null) { - if(imageUtils.is300Image(metadata.getCoverArt())){ - imagePanel.add(new JLabel(new ImageIcon(metadata.getCoverArt()))); - } else { - Image resize = imageUtils.resize(metadata.getCoverArt(), ApplicationConstants.THREE_HUNDRED, ApplicationConstants.THREE_HUNDRED); - imagePanel.add(new JLabel(new ImageIcon(resize))); - } - imageLabel.setText(ApplicationConstants.COVER_ART_FROM_FILE); - } else { - imageLabel.setText(ApplicationConstants.COVER_ART_DEFAULT); - } - imagePanel.invalidate(); - imagePanel.revalidate(); - imagePanel.repaint(); - } - - private class WriteWorker { - - public WriteWorker() { - work(); - } - - private void work() { - SwingWorker swingWorker = new SwingWorker() { - - protected Boolean doInBackground() throws Exception { - getLabel().setText(ApplicationConstants.WRITING_METADATA); - counter = 0; - working = true; - log.info("Starting to write..."); - getApplyButton().setEnabled(!working); - getExportButton().setEnabled(!working); - log.info("setting applyButton to : " + !working); - log.info("Ready for write " + metadataWithAlbum.size() + " files"); - for (final Metadata metadata : metadataWithAlbum) { - viewEngineConfigurator.getViewEngine().request(Actions.WRITE, metadata, new ResponseCallback() { - - public void onResponse(ActionResult result) { - log.info("Writing metadata to " + metadata.getTitle() + " w/result: " + result); - updateStatus(counter++, metadataWithAlbum.size()); - getDescriptionTable().getModel().setValueAt(result, getRow(metadata), ApplicationConstants.STATUS_COLUMN); - if (metadata.getCoverArt() != null && selectedRow == getRow(metadata)) { - log.info("setting image to row: " + selectedRow); - updateImage(selectedRow); - } - if (counter >= metadataWithAlbum.size()) { - resetButtonsState(); - finishingWorker(); - } - } - - private void finishingWorker() { - log.info("I'm done, ALL rows have been written"); - working = false; - getApplyButton().setEnabled(working); - getExportButton().setEnabled(true); - log.info("setting applyButton to : " + working); - metadataWithAlbum.clear(); - } - }); - } - return true; - } - - }; - MainWindow.this.getCompleteMetadataButton().setEnabled(false); - getOpenButton().setEnabled(false); - swingWorker.execute(); - } - - } - - private class CompleteWorker { - - public CompleteWorker() { - work(); - } - - private void work() { - SwingWorker swingWorker = new SwingWorker() { - - protected Boolean doInBackground() throws Exception { - final List metadataList = viewEngineConfigurator.getViewEngine().get(Model.METADATA); - getLabel().setText(ApplicationConstants.GETTING_ALBUM); - counter = 0; - working = true; - log.info("Start to work..."); - getApplyButton().setEnabled(!working); - getExportButton().setEnabled(!working); - log.info("setting applyButton to : " + !working); - for (final Metadata metadata : metadataList) { - final int i = metadataList.indexOf(metadata); - MainWindow.this.viewEngineConfigurator.getViewEngine().request(Actions.COMPLETE_MUSICBRAINZ, metadataList, new ResponseCallback() { - - public void onResponse(ActionResult response) { - updateStatus(counter++, metadataList.size()); - log.info("response in getting from MusicBrainz album " + metadata.getTitle() + ": " + response); - if (response.equals(ActionResult.New)) { - metadataWithAlbum.add(metadata); - getDescriptionTable().getModel().setValueAt(metadata.getAlbum(), i, ApplicationConstants.ALBUM_COLUMN); - getDescriptionTable().getModel().setValueAt(metadata.getTrackNumber(), i, ApplicationConstants.TRACK_NUMBER_COLUMN); - getDescriptionTable().getModel().setValueAt(metadata.getTotalTracks(), i, ApplicationConstants.TOTAL_TRACKS_NUMBER_COLUMN); - getDescriptionTable().getModel().setValueAt(metadata.getCdNumber(), i, ApplicationConstants.CD_NUMBER_COLUMN); - getDescriptionTable().getModel().setValueAt(metadata.getTotalCds(), i, ApplicationConstants.TOTAL_CDS_NUMBER_COLUMN); - } - getDescriptionTable().getModel().setValueAt(response, i, ApplicationConstants.STATUS_COLUMN); - if (counter >= metadataList.size()) { - getFormatterData(); - } - } - - private void getFormatterData() { - getLabel().setText(ApplicationConstants.GETTING_FORMATTER); - counter = 0; - log.info("Formating for " + metadataList.size() + " files"); - for (final Metadata metadata : metadataList) { - final int i = metadataList.indexOf(metadata); - MainWindow.this.viewEngineConfigurator.getViewEngine().request(Actions.COMPLETE_FORMATTER, metadata, new ResponseCallback() { - - @Override - public void onResponse(ActionResult response) { - updateStatus(counter++, metadataList.size()); - log.info("response in getFormatterData for " + metadata.getTitle() + ": " + response); - if (response.equals(ActionResult.New)) { - metadataWithAlbum.add(metadata); - getDescriptionTable().getModel().setValueAt(metadata.getArtist(), i, ApplicationConstants.ARTIST_COLUMN); - getDescriptionTable().getModel().setValueAt(metadata.getTitle(), i, ApplicationConstants.TITLE_COLUMN); - getDescriptionTable().getModel().setValueAt(metadata.getAlbum(), i, ApplicationConstants.ALBUM_COLUMN); - } else if (!getDescriptionTable().getModel().getValueAt(i, ApplicationConstants.STATUS_COLUMN).equals(ActionResult.New)) { - getDescriptionTable().getModel().setValueAt(response, i, ApplicationConstants.STATUS_COLUMN); - } - if (counter >= metadataList.size()) { - getLastfmData(); - } - } - - }); - } - } - - private void completeValuesForAlbum() { - getLabel().setText(ApplicationConstants.COMPLETE_DEFAULT_VALUES); - counter = 0; - log.info("Completing album for " + metadataList.size() + " files"); - MainWindow.this.viewEngineConfigurator.getViewEngine().request(Actions.COMPLETE_DEFAULT, metadataList, new ResponseCallback() { - - @Override - public void onResponse(ActionResult response) { - log.info("response in completeValuesForAlbum for " + metadata.getTitle() + ": " + response); - if (response.equals(ActionResult.New)) { - for (Metadata metadata : metadataList) { - int i = metadataList.indexOf(metadata); - updateStatus(counter++, metadataList.size()); - getDescriptionTable().getModel().setValueAt(metadata.getTotalTracks(), i, ApplicationConstants.TOTAL_TRACKS_NUMBER_COLUMN); - getDescriptionTable().getModel().setValueAt(metadata.getCdNumber(), i, ApplicationConstants.CD_NUMBER_COLUMN); - getDescriptionTable().getModel().setValueAt(metadata.getTotalCds(), i, ApplicationConstants.TOTAL_CDS_NUMBER_COLUMN); - } - }else if (!getDescriptionTable().getModel().getValueAt(i, ApplicationConstants.STATUS_COLUMN).equals(ActionResult.New)) { - getDescriptionTable().getModel().setValueAt(response, i, ApplicationConstants.STATUS_COLUMN); - } - afterComplete(metadataWithAlbum); - } - - }); - } - - private void getLastfmData() { - getLabel().setText(ApplicationConstants.GETTING_LAST_FM); - counter = 0; - log.info("Searching in lastfm for " + metadataList.size() + " files"); - for (final Metadata metadata : metadataList) { - final int i = metadataList.indexOf(metadata); - MainWindow.this.viewEngineConfigurator.getViewEngine().request(Actions.COMPLETE_LAST_FM, metadata, new ResponseCallback() { - - public void onResponse(ActionResult response) { - updateStatus(counter++, metadataList.size()); - log.info("response in getLastfmData for " + metadata.getTitle() + ": " + response); - if (response.equals(ActionResult.New)) { - metadataWithAlbum.add(metadata); - getDescriptionTable().getModel().setValueAt(metadata.getArtist(), i, ApplicationConstants.ARTIST_COLUMN); - getDescriptionTable().getModel().setValueAt(metadata.getTitle(), i, ApplicationConstants.TITLE_COLUMN); - getDescriptionTable().getModel().setValueAt(metadata.getAlbum(), i, ApplicationConstants.ALBUM_COLUMN); - getDescriptionTable().getModel().setValueAt(metadata.getYear(), i, ApplicationConstants.YEAR_COLUMN); - getDescriptionTable().getModel().setValueAt(metadata.getGenre(), i, ApplicationConstants.GENRE_COLUMN); - getDescriptionTable().getModel().setValueAt(ActionResult.New, i, ApplicationConstants.STATUS_COLUMN); - if (metadata.getNewCoverArt() != null && i == selectedRow) { - updateImage(i); - } - } else if (!getDescriptionTable().getModel().getValueAt(i, ApplicationConstants.STATUS_COLUMN).equals(ActionResult.New)) { - getDescriptionTable().getModel().setValueAt(response, i, ApplicationConstants.STATUS_COLUMN); - } - if (counter >= metadataList.size()) { - completeValuesForAlbum(); - } - } - }); - } - - } - }); - } - return true; - } - }; - - MainWindow.this.getCompleteMetadataButton().setEnabled(false); - getOpenButton().setEnabled(false); - swingWorker.execute(); - } - } - - private void afterComplete(Set metadataWithOutArtist) { - if (!metadataWithOutArtist.isEmpty()) { - controlEngineConfigurator.getControlEngine().set(Model.METADATA_ARTIST, metadataWithOutArtist, null); - getApplyButton().setEnabled(true); - log.info("setting applyButton to : true"); - } - resetButtonsState(); - working = false; - log.info("setting working to : " + false); - log.info("I already worked"); - } - - private void resetButtonsState() { - getLabel().setText(ApplicationConstants.DONE); - getCompleteMetadataButton().setEnabled(true); - getOpenButton().setEnabled(true); - getExportButton().setEnabled(true); - getDescriptionTable().setEnabled(true); - } - - private void updateStatus(final int i, int size) { - int progress = ((i + 1) * 100) / size; - getProgressBar().setValue(progress); - }; - - private class SendWorker { - public SendWorker() { - work(); - } - - private void work() { - SwingWorker swingWorker = new SwingWorker() { - - protected Boolean doInBackground() throws Exception { - final List metadataList = viewEngineConfigurator.getViewEngine().get(Model.METADATA); - counter = 0; - for (final Metadata metadata : metadataList) { - MainWindow.this.viewEngineConfigurator.getViewEngine().request(Actions.SEND, metadata, new ResponseCallback() { - - public void onResponse(ActionResult response) { - log.info("response on sending " + metadata.getTitle() + ": " + response); - updateStatus(counter++, metadataList.size()); - getDescriptionTable().getModel().setValueAt(response, getRow(metadata), ApplicationConstants.STATUS_COLUMN); - } - - }); - } - return true; - } - - public void done() { - getLabel().setText(ApplicationConstants.DONE); - getCompleteMetadataButton().setEnabled(true); - getSendButton().setEnabled(true); - getOpenButton().setEnabled(true); - } - }; - swingWorker.execute(); - getCompleteMetadataButton().setEnabled(false); - getSendButton().setEnabled(false); - getOpenButton().setEnabled(false); - getProgressBar().setVisible(true); - getLabel().setText(ApplicationConstants.WORKING); - } - } - - private class ExportWorker { - private final List metadataList; - private final ExportPackage exportPackage; - - public ExportWorker(File root) { - metadataList = viewEngineConfigurator.getViewEngine().get(Model.METADATA); - exportPackage = new ExportPackage(root, metadataList); - work(); - } - - private void work() { - SwingWorker swingWorker = new SwingWorker() { - - protected Boolean doInBackground() throws Exception { - MainWindow.this.viewEngineConfigurator.getViewEngine().request(Actions.EXPORT, exportPackage, new ResponseCallback() { - - public void onResponse(ActionResult response) { - for (Metadata metadata : metadataList) { - getDescriptionTable().getModel().setValueAt(response, getRow(metadata), ApplicationConstants.STATUS_COLUMN); - } - } - - }); - return true; - } - }; - swingWorker.execute(); - } - } - - private int getRow(Metadata metadataTarget) { - TableModel model = getDescriptionTable().getModel(); - List metadataList = viewEngineConfigurator.getViewEngine().get(Model.METADATA); - - for (int i = 0; i < model.getRowCount(); i++) { - String artist = (String) model.getValueAt(i, 0); - String title = (String) model.getValueAt(i, 1); - if (artist.equals(metadataTarget.getArtist()) && title.equals(metadataTarget.getTitle())) { - return i; - } - } - - return 0; - } - - private class ClickAction extends AbstractAction { - private static final long serialVersionUID = 1L; - private JButton button; - - public ClickAction(JButton button) { - this.button = button; - } - - public void actionPerformed(ActionEvent e) { - button.doClick(); - } - } - - private class DescriptionTableModelListener implements TableModelListener { - - public void tableChanged(TableModelEvent e) { - if (MainWindow.this.getCompleteMetadataButton().getText().equals(ApplicationConstants.APPLY) && e.getColumn() != ApplicationConstants.STATUS_COLUMN) { - int lastRow = e.getLastRow(); - DefaultTableModel model = (DefaultTableModel) e.getSource(); - String artist = (String) model.getValueAt(lastRow, 0); - String trackName = (String) model.getValueAt(lastRow, 1); - String album = (String) model.getValueAt(lastRow, 2); - } - } - } - + private static final long serialVersionUID = 1311230231101552007L; + private static final String JMENU_ITEM_LABEL = "Sign in Last.fm"; + private static final String JMENU_EXIT_LABEL = "Exit"; + private static final String JMENU_LABEL = "File"; + private static final int DIRECTORY_SELECTED_LENGHT = 20; + private static final String STATUS_LABEL = "Status"; + private static final String CTRL_O = "CTRL+O"; + private static final String ENTER = "ENTER"; + private static final String LOGIN_MENU_ITEM = "loginMenuItem"; + private static final String EXIT_MENU_ITEM = "exitMenuItem"; + private static final String SEND_SCROBBLINGS = "Send"; + private static final String LOAD_FILES = "Open"; + private static final String LOG_OUT = "logged out"; + private static final String LOGIN_LABEL_NAME = "loginLabel"; + private static final String STATUS_LABEL_NAME = "statusLabel"; + private static final String IMAGE_LABEL_NAME = "imageLabelName"; + private static final String MAIN_MENU_NAME = "mainMenuName"; + private static final String IMAGE_PANEL_NAME = "bigDnDImagePanel"; + + /** Default button style private static final String SEND_BUTTON_NAME = "button[A-Za-z0-9]+"; */ + private static final String TEXTFIELD_NAME = "searchTextField"; + + private static final String OPEN_BUTTON_NAME = "openButton"; + private static final String SEND_BUTTON_NAME = "sendButton"; + private static final String APPLY_BUTTON_NAME = "applyButton"; + private static final String COMPLETE_BUTTON_NAME = "completeMetadataButton"; + private static final String EXPORT_BUTTON_NAME = "exportButton"; + private static final String PROGRESS_BAR_NAME = "bigProgressBar"; + private static final int PROGRESS_BAR_DEFAULT_VALUE = 0; + private static final int PROGRESS_BAR_MAXIMUM_VALUE = 100; + + /** Bottom panel bounds */ + private static final Rectangle BOTTOM_PANEL_BOUNDS = new Rectangle(0, 500, 1024, 100); + + private static final Rectangle LABEL_BOUNDS = new Rectangle(10, 10, 50, 20); + private static final Rectangle DIRECTORY_BOUNDS = new Rectangle(60, 10, 195, 20); + private static final Rectangle PROGRESS_BAR_BOUNDS = new Rectangle(265, 10, 150, 20); + private static final Rectangle OPEN_BUTTON_BOUNDS = new Rectangle(425, 10, 110, 28); + private static final Rectangle SEND_BUTTON_BOUNDS = new Rectangle(545, 10, 110, 28); + private static final Rectangle COMPLETE_BUTTON_BOUNDS = new Rectangle(665, 10, 110, 28); + private static final Rectangle APPLY_BUTTON_BOUNDS = new Rectangle(785, 10, 110, 28); + private static final Rectangle EXPORT_BUTTON_BOUNDS = new Rectangle(905, 10, 110, 28); + + /** Top panel bounds */ + private static final Rectangle TOP_PANEL_BOUNDS = new Rectangle(0, 0, 1024, 40); + + private static final Rectangle LOGIN_LABEL_BOUNDS = new Rectangle(450, 10, 200, 20); + + /** Middle panel bounds */ + private static final Rectangle MIDDLE_PANEL_BOUNDS = new Rectangle(0, 50, 1024, 400); + + private static final Rectangle IMAGE_PANEL_BOUNDS = new Rectangle(10, 10, 300, 300); + private static final Rectangle IMAGE_LABEL_BOUNDS = new Rectangle(100, 320, 200, 20); + private static final Rectangle SCROLL_PANE_BOUNDS = new Rectangle(320, 10, 693, 390); + + private JPanel panel; + private JButton openButton; + private JButton sendButton; + private JButton applyButton; + private JButton exportButton; + private JButton completeMetadataButton; + private JTextField directorySelected; + private JPanel bottomPanel; + private JTable descriptionTable; + private JSlider progressBar; + private JLabel label; + private JLabel imageLabel; + private JLabel loginLabel; + private JPanel middlePanel; + private JPanel topPanel; + private JPanel imagePanel; + private JMenuBar menuBar; + private JMenu mainMenu; + private JMenuItem lastFmMenuItem; + private JMenuItem exitMenuItem; + private InputMap inputMap; + private JScrollPane scrollPane; + private ImageUtils imageUtils = new ImageUtils(); + private Set metadataWithAlbum = new HashSet(); + private MetadataAdapter metadataAdapter = new MetadataAdapter(); + private DialogHelper dialogHelper = new DialogHelper(); + private FileChooserHelper fileChooserHelper = new FileChooserHelper(); + boolean tableLoaded; + boolean working; + private int counter = 0; + private int selectedRow; + + @Autowired private LoginWindow loginWindow; + @Autowired private ViewEngineConfigurator viewEngineConfigurator; + @Autowired private ControlEngineConfigurator controlEngineConfigurator; + + public MainWindow() { + super(ApplicationConstants.APPLICATION_NAME); + initialize(); + getDescriptionTable().getModel().addTableModelListener(new DescriptionTableModelListener()); + } + + private void initialize() { + registerKeyStrokeAction(); + this.setBounds(0, 0, ApplicationConstants.WIDTH, ApplicationConstants.HEIGHT); + this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + this.setResizable(false); + this.setJMenuBar(getMenubar()); + this.add(getPanel()); + this.setVisible(true); + } + + @PostConstruct + private void setDragAndDrop() { + MultiLayerDropTargetListener multiLayerDropTargetListener = new MultiLayerDropTargetListener(); + setDropTarget(new DropTarget(this, multiLayerDropTargetListener)); + multiLayerDropTargetListener.addDragListener(this, new MainFrameDragOverListener(this)); + ImageDropListener listener = new ImageDropListener(new ImagePanel()); + listener + .onDropped() + .add( + new Observer>() { + + public void observe(ObservValue t) { + ImagePanel value = t.getValue(); + Image image = value.getImage(); + List metadatas = + controlEngineConfigurator.getControlEngine().get(Model.METADATA); + Metadata metadata = metadatas.get(selectedRow); + CoverArt coverArt = + new CoverArt( + imageUtils.resize( + image, + ApplicationConstants.THREE_HUNDRED, + ApplicationConstants.THREE_HUNDRED), + CoverArtType.DRAG_AND_DROP); + metadata.setNewCoverArt(coverArt); + log.info("sertting image to the row: " + selectedRow); + updateImage(selectedRow); + metadataWithAlbum.add(metadata); + getDescriptionTable() + .getModel() + .setValueAt(ActionResult.New, selectedRow, ApplicationConstants.STATUS_COLUMN); + getApplyButton().setEnabled(!working); + log.info("setting applyButton to : " + !working); + } + }); + multiLayerDropTargetListener.addDropListener(imagePanel, listener); + } + + @EventMethod(Events.USER_LOGGED) + void onUserLogged(User currentUser) { + StringBuilder sb = new StringBuilder(); + sb.append(ApplicationConstants.LOGGED_AS); + sb.append(currentUser.getUsername()); + getLoginLabel().setText(sb.toString()); + getSendButton().setEnabled(true); + } + + @EventMethod(Events.COVER_ART_FAILED) + void onCovertArtFailed(String title) { + StringBuilder sb = new StringBuilder(); + sb.append(title); + sb.append(ApplicationConstants.CORRUPTED_METADATA_LABEL); + dialogHelper.showMessageDialog(this, sb.toString()); + } + + @EventMethod(Events.LOAD_FILE_FAILED) + void onLoadFileFailed(String fileName) { + StringBuilder sb = new StringBuilder(); + sb.append(ApplicationConstants.FILE_NOT_FOUND); + sb.append(fileName); + dialogHelper.showMessageDialog(this, sb.toString()); + } + + @EventMethod(Events.USER_LOGIN_FAILED) + void onUserLoginFailed() { + getLoginLabel().setText(ApplicationConstants.LOGIN_FAIL); + } + + @EventMethod(Events.MUSIC_DIRECTORY_SELECTED) + void onMusicDirectorySelected(String path) { + tableLoaded = false; + deleteALLRows(descriptionTable); + metadataWithAlbum.clear(); + getDirectoryField().setText(path); + getLabel().setText(ApplicationConstants.WORKING); + } + + @EventMethod(Events.MUSIC_DIRECTORY_NOT_EXIST) + void onMusicDirectoryNotExist(String path) { + StringBuilder sb = new StringBuilder(); + sb.append(ApplicationConstants.DIRECTORY_NOT_FOUND); + sb.append(path); + dialogHelper.showMessageDialog(this, sb.toString()); + getOpenButton().setEnabled(true); + } + + @EventMethod(Events.TOO_MUCH_FILES_LOADED) + void onTooMuchFilesLoaded(String maxFiles) { + StringBuilder sb = new StringBuilder(); + sb.append(ApplicationConstants.TOO_MUCH_FILES_LOADED); + sb.append(maxFiles); + dialogHelper.showMessageDialog(this, sb.toString()); + getOpenButton().setEnabled(true); + } + + @EventMethod(Events.MUSIC_DIRECTORY_SELECTED_CANCEL) + void onMusicDirectorySelectedCancel() { + getOpenButton().setEnabled(true); + if (tableLoaded) { + getCompleteMetadataButton().setEnabled(true); + getExportButton().setEnabled(true); + } + } + + private void resetStatus() { + log.info("Trying to reset to the default image"); + getCompleteMetadataButton().setEnabled(true); + getExportButton().setEnabled(true); + getOpenButton().setEnabled(true); + getLabel().setText(ApplicationConstants.DONE); + } + + @EventMethod(Events.TRACKS_LOADED) + void onTracksLoaded() { + Set filesWithoutMinimumMetadata = + controlEngineConfigurator.getControlEngine().get(Model.FILES_WITHOUT_MINIMUM_METADATA); + List metadatas = controlEngineConfigurator.getControlEngine().get(Model.METADATA); + if (!filesWithoutMinimumMetadata.isEmpty()) { + File file = new File("Music File"); + Iterator iterator = filesWithoutMinimumMetadata.iterator(); + while (iterator.hasNext()) { + file = iterator.next(); + } + if (filesWithoutMinimumMetadata.size() == 1) { + StringBuilder sb = new StringBuilder(); + sb.append(file.getName()); + sb.append(ApplicationConstants.METADATA_FROM_FILE_LABEL); + dialogHelper.showMessageDialog(this, sb.toString()); + } else { + int otherFiles = filesWithoutMinimumMetadata.size() - 1; + StringBuilder sb = new StringBuilder(); + sb.append(file.getName()); + sb.append(ApplicationConstants.AND_ANOTHER); + sb.append(otherFiles); + sb.append(ApplicationConstants.METADATA_FROM_FILE_LABEL); + dialogHelper.showMessageDialog(this, sb.toString()); + } + } + resetStatus(); + ListSelectionModel listSelectionModel = getDescriptionTable().getSelectionModel(); + listSelectionModel.setSelectionInterval(0, 0); + selectedRow = 0; + updateImage(selectedRow); + tableLoaded = true; + } + + @EventMethod(Events.DIRECTORY_EMPTY_EVENT) + void onDirectoryEmpty() { + dialogHelper.showMessageDialog(this, ApplicationConstants.DIRECTORY_EMPTY); + resetStatus(); + } + + @EventMethod(Events.LOAD_METADATA) + void onLoadMetadata(List metadatas) { + JTable descriptionTable = getDescriptionTable(); + DefaultTableModel model = (DefaultTableModel) descriptionTable.getModel(); + for (Metadata metadata : metadatas) { + int row = descriptionTable.getRowCount(); + model.addRow(new Object[] {"", "", "", "", "", "", "", ""}); + descriptionTable.setValueAt(metadata.getArtist(), row, ApplicationConstants.ARTIST_COLUMN); + descriptionTable.setValueAt(metadata.getTitle(), row, ApplicationConstants.TITLE_COLUMN); + descriptionTable.setValueAt(metadata.getAlbum(), row, ApplicationConstants.ALBUM_COLUMN); + descriptionTable.setValueAt(metadata.getGenre(), row, ApplicationConstants.GENRE_COLUMN); + descriptionTable.setValueAt(metadata.getYear(), row, ApplicationConstants.YEAR_COLUMN); + descriptionTable.setValueAt( + metadata.getTrackNumber(), row, ApplicationConstants.TRACK_NUMBER_COLUMN); + descriptionTable.setValueAt( + metadata.getTotalTracks(), row, ApplicationConstants.TOTAL_TRACKS_NUMBER_COLUMN); + descriptionTable.setValueAt( + metadata.getCdNumber(), row, ApplicationConstants.CD_NUMBER_COLUMN); + descriptionTable.setValueAt( + metadata.getTotalCds(), row, ApplicationConstants.TOTAL_CDS_NUMBER_COLUMN); + if (metadata.isMetadataFromFile()) { + descriptionTable.setValueAt( + ApplicationConstants.NEW, row, ApplicationConstants.STATUS_COLUMN); + metadataWithAlbum.add(metadata); + getApplyButton().setEnabled(true); + } else { + descriptionTable.setValueAt( + ApplicationConstants.READY, row, ApplicationConstants.STATUS_COLUMN); + } + } + } + + @EventMethod(Events.APPLY_METADATA) + void onReadyToApplyMetadata(MetadataAlbumValues metadataValues) { + String artist = metadataValues.getArtist(); + String album = metadataValues.getAlbum(); + String genre = metadataValues.getGenre(); + String year = metadataValues.getYear(); + String tracks = metadataValues.getTracks(); + String cd = metadataValues.getCd(); + String cds = metadataValues.getCds(); + DefaultTableModel model = (DefaultTableModel) descriptionTable.getModel(); + List metadatas = controlEngineConfigurator.getControlEngine().get(Model.METADATA); + log.info("Album size: " + metadataWithAlbum.size()); + for (int i = 0; i < model.getRowCount(); i++) { + Metadata metadata = metadatas.get(i); + if (!StringUtils.isEmpty(artist)) { + getDescriptionTable().getModel().setValueAt(artist, i, ApplicationConstants.ARTIST_COLUMN); + } + if (!StringUtils.isEmpty(album)) { + getDescriptionTable().getModel().setValueAt(album, i, ApplicationConstants.ALBUM_COLUMN); + } + if (!StringUtils.isEmpty(genre)) { + getDescriptionTable().getModel().setValueAt(genre, i, ApplicationConstants.GENRE_COLUMN); + } + if (!StringUtils.isEmpty(year)) { + getDescriptionTable().getModel().setValueAt(year, i, ApplicationConstants.YEAR_COLUMN); + } + if (!StringUtils.isEmpty(tracks)) { + getDescriptionTable() + .getModel() + .setValueAt(tracks, i, ApplicationConstants.TOTAL_TRACKS_NUMBER_COLUMN); + } + if (!StringUtils.isEmpty(cd)) { + getDescriptionTable().getModel().setValueAt(cd, i, ApplicationConstants.CD_NUMBER_COLUMN); + } + if (!StringUtils.isEmpty(cds)) { + getDescriptionTable() + .getModel() + .setValueAt(cds, i, ApplicationConstants.TOTAL_CDS_NUMBER_COLUMN); + } + if (metadataValues.getCoverArt() != null) { + log.info("coverArt detected for: " + metadata.getTitle()); + CoverArt coverArt = new CoverArt(metadataValues.getCoverArt(), CoverArtType.DRAG_AND_DROP); + metadata.setNewCoverArt(coverArt); + metadataWithAlbum.add(metadata); + getDescriptionTable() + .getModel() + .setValueAt(ActionResult.New, i, ApplicationConstants.STATUS_COLUMN); + if (i == selectedRow) { + updateImage(i); + } + getApplyButton().setEnabled(!working); + log.info("setting applyButton to : " + !working); + } + } + } + + private void deleteALLRows(JTable descriptionTable) { + DefaultTableModel model = (DefaultTableModel) descriptionTable.getModel(); + for (int i = model.getRowCount() - 1; i >= 0; i--) { + model.removeRow(i); + } + } + + @EventMethod(Events.OPEN_ERROR) + void onOpenError() { + getLabel().setText(ApplicationConstants.OPEN_ERROR); + } + + private JMenuBar getMenubar() { + if (menuBar == null) { + menuBar = new JMenuBar(); + menuBar.add(getLastFmMenu()); + } + return menuBar; + } + + private JMenu getLastFmMenu() { + if (mainMenu == null) { + mainMenu = new JMenu(JMENU_LABEL); + mainMenu.setName(MAIN_MENU_NAME); + mainMenu.setMnemonic(KeyEvent.VK_F); + mainMenu.add(getLastFmMenuItem()); + mainMenu.add(getExitMenuItem()); + } + return mainMenu; + } + + private JMenuItem getLastFmMenuItem() { + if (lastFmMenuItem == null) { + lastFmMenuItem = new JMenuItem(JMENU_ITEM_LABEL); + lastFmMenuItem.setName(LOGIN_MENU_ITEM); + lastFmMenuItem.setMnemonic(KeyEvent.VK_S); + + lastFmMenuItem.addActionListener( + new ActionListener() { + + public void actionPerformed(ActionEvent e) { + loginWindow.getFrame().setLocationRelativeTo(MainWindow.this); + loginWindow.getFrame().setVisible(true); + } + }); + } + return lastFmMenuItem; + } + + private JMenuItem getExitMenuItem() { + if (exitMenuItem == null) { + exitMenuItem = new JMenuItem(JMENU_EXIT_LABEL); + exitMenuItem.setName(EXIT_MENU_ITEM); + exitMenuItem.setMnemonic(KeyEvent.VK_E); + + exitMenuItem.addActionListener( + new ActionListener() { + + public void actionPerformed(ActionEvent e) { + System.exit(0); + } + }); + } + return exitMenuItem; + } + + private JPanel getBottomPanel() { + if (bottomPanel == null) { + bottomPanel = new JPanel(); + bottomPanel.setLayout(null); + bottomPanel.setBounds(BOTTOM_PANEL_BOUNDS); + bottomPanel.add(getLabel()); + bottomPanel.add(getDirectoryField()); + bottomPanel.add(getProgressBar()); + bottomPanel.add(getOpenButton()); + bottomPanel.add(getSendButton()); + bottomPanel.add(getCompleteMetadataButton()); + bottomPanel.add(getApplyButton()); + bottomPanel.add(getExportButton()); + } + return bottomPanel; + } + + private void registerKeyStrokeAction() { + KeyStroke ctrlo = KeyStroke.getKeyStroke(KeyEvent.VK_O, InputEvent.CTRL_DOWN_MASK); + KeyStroke enter = KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0); + inputMap = getOpenButton().getInputMap(JButton.WHEN_IN_FOCUSED_WINDOW); + inputMap.put(ctrlo, CTRL_O); + inputMap.put(enter, ENTER); + getOpenButton().getActionMap().put(CTRL_O, new ClickAction(getOpenButton())); + getOpenButton().getActionMap().put(ENTER, new ClickAction(getOpenButton())); + } + + private JPanel getPanel() { + if (panel == null) { + panel = new JPanel(); + panel.setLayout(null); + panel.add(getTopPanel()); + panel.add(getMiddlePanel()); + panel.add(getBottomPanel()); + } + return panel; + } + + private JPanel getMiddlePanel() { + if (middlePanel == null) { + middlePanel = new JPanel(); + middlePanel.setLayout(null); + middlePanel.setBounds(MIDDLE_PANEL_BOUNDS); + middlePanel.add(getImageLabel()); + middlePanel.add(getImagePanel()); + middlePanel.add(getScrollPane()); + } + return middlePanel; + } + + private JPanel getImagePanel() { + if (imagePanel == null) { + imagePanel = new JPanel(); + imagePanel.setName(IMAGE_PANEL_NAME); + imagePanel.setBounds(IMAGE_PANEL_BOUNDS); + } + return imagePanel; + } + + private JLabel getImageLabel() { + if (imageLabel == null) { + imageLabel = new JLabel(); + imageLabel.setName(IMAGE_LABEL_NAME); + imageLabel.setBounds(IMAGE_LABEL_BOUNDS); + } + return imageLabel; + } + + private JPanel getTopPanel() { + if (topPanel == null) { + topPanel = new JPanel(); + topPanel.setLayout(null); + topPanel.setBounds(TOP_PANEL_BOUNDS); + topPanel.add(getLoginLabel()); + } + return topPanel; + } + + private JTextField getDirectoryField() { + if (directorySelected == null) { + directorySelected = new JTextField(DIRECTORY_SELECTED_LENGHT); + directorySelected.setName(TEXTFIELD_NAME); + directorySelected.setBounds(DIRECTORY_BOUNDS); + directorySelected.setEnabled(false); + } + return directorySelected; + } + + private JSlider getProgressBar() { + if (progressBar == null) { + progressBar = new JSlider(); + progressBar.setName(PROGRESS_BAR_NAME); + progressBar.setBounds(PROGRESS_BAR_BOUNDS); + progressBar.setMaximum(PROGRESS_BAR_MAXIMUM_VALUE); + progressBar.setRequestFocusEnabled(false); + progressBar.setValue(PROGRESS_BAR_DEFAULT_VALUE); + progressBar.setPaintLabels(false); + progressBar.setOpaque(false); + progressBar.setFocusable(false); + progressBar.setEnabled(false); + progressBar.setVisible(true); + } + return progressBar; + } + + public JLabel getLabel() { + if (label == null) { + label = new JLabel(STATUS_LABEL); + label.setName(STATUS_LABEL_NAME); + label.setBounds(LABEL_BOUNDS); + } + return label; + } + + private JLabel getLoginLabel() { + if (loginLabel == null) { + loginLabel = new JLabel(LOG_OUT); + loginLabel.setName(LOGIN_LABEL_NAME); + loginLabel.setBounds(LOGIN_LABEL_BOUNDS); + } + return loginLabel; + } + + public JButton getCompleteMetadataButton() { + if (completeMetadataButton == null) { + completeMetadataButton = new JButton(ActionResult.Complete.toString()); + completeMetadataButton.setName(COMPLETE_BUTTON_NAME); + completeMetadataButton.setEnabled(false); + completeMetadataButton.setBounds(COMPLETE_BUTTON_BOUNDS); + + completeMetadataButton.addActionListener( + new ActionListener() { + + public void actionPerformed(ActionEvent e) { + resetStatus(); + new CompleteWorker(); + } + + private void resetStatus() { + metadataWithAlbum.clear(); + for (int i = 0; i < getDescriptionTable().getModel().getRowCount(); i++) { + getDescriptionTable() + .getModel() + .setValueAt(ApplicationConstants.READY, i, ApplicationConstants.STATUS_COLUMN); + } + } + }); + } + return completeMetadataButton; + } + + public JButton getApplyButton() { + if (applyButton == null) { + applyButton = new JButton(ApplicationConstants.APPLY); + applyButton.setName(APPLY_BUTTON_NAME); + applyButton.setEnabled(false); + applyButton.setBounds(APPLY_BUTTON_BOUNDS); + + applyButton.addActionListener( + new ActionListener() { + + public void actionPerformed(ActionEvent e) { + new WriteWorker(); + } + }); + } + return applyButton; + } + + public JButton getExportButton() { + if (exportButton == null) { + exportButton = new JButton(ApplicationConstants.EXPORT); + exportButton.setName(EXPORT_BUTTON_NAME); + exportButton.setEnabled(false); + exportButton.setBounds(EXPORT_BUTTON_BOUNDS); + + exportButton.addActionListener( + new ActionListener() { + + public void actionPerformed(ActionEvent e) { + log.info("Exporting"); + File root = fileChooserHelper.getDirectory(); + if (root != null) { + new ExportWorker(root); + } + } + }); + } + return exportButton; + } + + public JButton getSendButton() { + if (sendButton == null) { + sendButton = new JButton(SEND_SCROBBLINGS); + sendButton.setName(SEND_BUTTON_NAME); + sendButton.setEnabled(false); + sendButton.setBounds(SEND_BUTTON_BOUNDS); + + sendButton.addActionListener( + new ActionListener() { + + public void actionPerformed(ActionEvent e) { + new SendWorker(); + } + }); + } + return sendButton; + } + + public JButton getOpenButton() { + if (openButton == null) { + openButton = new JButton(LOAD_FILES); + openButton.setName(OPEN_BUTTON_NAME); + openButton.setBounds(OPEN_BUTTON_BOUNDS); + + openButton.addActionListener( + new ActionListener() { + + public void actionPerformed(ActionEvent e) { + openButton.setEnabled(false); + getCompleteMetadataButton().setEnabled(false); + getExportButton().setEnabled(false); + viewEngineConfigurator.getViewEngine().send(Actions.METADATA); + } + }); + } + return openButton; + } + + private JScrollPane getScrollPane() { + if (scrollPane == null) { + scrollPane = new JScrollPane(getDescriptionTable()); + scrollPane.setBounds(SCROLL_PANE_BOUNDS); + } + return scrollPane; + } + + public JTable getDescriptionTable() { + if (descriptionTable == null) { + descriptionTable = new DescriptionTable(); + descriptionTable.addMouseListener( + new MouseAdapter() { + + public void mouseClicked(MouseEvent e) { + if (e.getButton() == MouseEvent.BUTTON3) { + MetadataDialog metadataDialog = + new MetadataDialog( + MainWindow.this, controlEngineConfigurator, "Alter ALL rows"); + metadataDialog.setVisible(true); + } + } + }); + + descriptionTable + .getSelectionModel() + .addListSelectionListener( + new ListSelectionListener() { + + public void valueChanged(ListSelectionEvent e) { + if (tableLoaded) { + selectedRow = descriptionTable.getSelectedRow(); + log.info("SETTING SELECTED ROW to : " + selectedRow); + updateImage(selectedRow); + } + } + }); + + descriptionTable + .getModel() + .addTableModelListener( + new TableModelListener() { + + public void tableChanged(TableModelEvent e) { + if (e.getType() == TableModelEvent.UPDATE + && tableLoaded + && e.getColumn() != ApplicationConstants.STATUS_COLUMN) { + int column = e.getColumn(); + int row = e.getFirstRow(); + String value = + getDescriptionTable().getModel().getValueAt(row, column).toString(); + log.info("value changed: " + value); + List metadataList = + viewEngineConfigurator.getViewEngine().get(Model.METADATA); + Metadata metadata = metadataList.get(row); + metadataAdapter.update(metadata, column, value); + metadataWithAlbum.add(metadata); + + getDescriptionTable() + .getModel() + .setValueAt(ActionResult.New, row, ApplicationConstants.STATUS_COLUMN); + + controlEngineConfigurator + .getControlEngine() + .set(Model.METADATA_ARTIST, metadataWithAlbum, null); + getApplyButton().setEnabled(!working); + log.info("setting applyButton to : " + !working); + } + } + }); + } + + return descriptionTable; + } + + private void updateImage(int selectedRow) { + TableModel model = getDescriptionTable().getModel(); + List metadataList = viewEngineConfigurator.getViewEngine().get(Model.METADATA); + + Metadata metadata = metadataList.get(selectedRow); + log.info("metadata: " + ToStringBuilder.reflectionToString(metadata)); + + imagePanel.removeAll(); + if (metadata.getNewCoverArt() != null) { + CoverArt coverArt = metadata.getNewCoverArt(); + log.info("setting coverArt to: " + coverArt.getType()); + ImageIcon imageIcon = new ImageIcon(coverArt.getImage()); + imagePanel.add(new JLabel(imageIcon)); + String label = ApplicationConstants.COVER_ART_FROM_LASTFM; + if (coverArt.getType().equals(CoverArtType.DRAG_AND_DROP)) { + label = ApplicationConstants.COVER_ART_FROM_DRAG_AND_DROP; + } + imageLabel.setText(label); + } else if (metadata.getCoverArt() != null) { + if (imageUtils.is300Image(metadata.getCoverArt())) { + imagePanel.add(new JLabel(new ImageIcon(metadata.getCoverArt()))); + } else { + Image resize = + imageUtils.resize( + metadata.getCoverArt(), + ApplicationConstants.THREE_HUNDRED, + ApplicationConstants.THREE_HUNDRED); + imagePanel.add(new JLabel(new ImageIcon(resize))); + } + imageLabel.setText(ApplicationConstants.COVER_ART_FROM_FILE); + } else { + imageLabel.setText(ApplicationConstants.COVER_ART_DEFAULT); + } + imagePanel.invalidate(); + imagePanel.revalidate(); + imagePanel.repaint(); + } + + private class WriteWorker { + + public WriteWorker() { + work(); + } + + private void work() { + SwingWorker swingWorker = + new SwingWorker() { + + protected Boolean doInBackground() throws Exception { + getLabel().setText(ApplicationConstants.WRITING_METADATA); + counter = 0; + working = true; + log.info("Starting to write..."); + getApplyButton().setEnabled(!working); + getExportButton().setEnabled(!working); + log.info("setting applyButton to : " + !working); + log.info("Ready for write " + metadataWithAlbum.size() + " files"); + for (final Metadata metadata : metadataWithAlbum) { + viewEngineConfigurator + .getViewEngine() + .request( + Actions.WRITE, + metadata, + new ResponseCallback() { + + public void onResponse(ActionResult result) { + log.info( + "Writing metadata to " + + metadata.getTitle() + + " w/result: " + + result); + updateStatus(counter++, metadataWithAlbum.size()); + getDescriptionTable() + .getModel() + .setValueAt( + result, getRow(metadata), ApplicationConstants.STATUS_COLUMN); + if (metadata.getCoverArt() != null && selectedRow == getRow(metadata)) { + log.info("setting image to row: " + selectedRow); + updateImage(selectedRow); + } + if (counter >= metadataWithAlbum.size()) { + resetButtonsState(); + finishingWorker(); + } + } + + private void finishingWorker() { + log.info("I'm done, ALL rows have been written"); + working = false; + getApplyButton().setEnabled(working); + getExportButton().setEnabled(true); + log.info("setting applyButton to : " + working); + metadataWithAlbum.clear(); + } + }); + } + return true; + } + }; + MainWindow.this.getCompleteMetadataButton().setEnabled(false); + getOpenButton().setEnabled(false); + swingWorker.execute(); + } + } + + private class CompleteWorker { + + public CompleteWorker() { + work(); + } + + private void work() { + SwingWorker swingWorker = + new SwingWorker() { + + protected Boolean doInBackground() throws Exception { + final List metadataList = + viewEngineConfigurator.getViewEngine().get(Model.METADATA); + getLabel().setText(ApplicationConstants.GETTING_ALBUM); + counter = 0; + working = true; + log.info("Start to work..."); + getApplyButton().setEnabled(!working); + getExportButton().setEnabled(!working); + log.info("setting applyButton to : " + !working); + for (final Metadata metadata : metadataList) { + final int i = metadataList.indexOf(metadata); + MainWindow.this + .viewEngineConfigurator + .getViewEngine() + .request( + Actions.COMPLETE_MUSICBRAINZ, + metadataList, + new ResponseCallback() { + + public void onResponse(ActionResult response) { + updateStatus(counter++, metadataList.size()); + log.info( + "response in getting from MusicBrainz album " + + metadata.getTitle() + + ": " + + response); + if (response.equals(ActionResult.New)) { + metadataWithAlbum.add(metadata); + getDescriptionTable() + .getModel() + .setValueAt( + metadata.getAlbum(), i, ApplicationConstants.ALBUM_COLUMN); + getDescriptionTable() + .getModel() + .setValueAt( + metadata.getTrackNumber(), + i, + ApplicationConstants.TRACK_NUMBER_COLUMN); + getDescriptionTable() + .getModel() + .setValueAt( + metadata.getTotalTracks(), + i, + ApplicationConstants.TOTAL_TRACKS_NUMBER_COLUMN); + getDescriptionTable() + .getModel() + .setValueAt( + metadata.getCdNumber(), + i, + ApplicationConstants.CD_NUMBER_COLUMN); + getDescriptionTable() + .getModel() + .setValueAt( + metadata.getTotalCds(), + i, + ApplicationConstants.TOTAL_CDS_NUMBER_COLUMN); + } + getDescriptionTable() + .getModel() + .setValueAt(response, i, ApplicationConstants.STATUS_COLUMN); + if (counter >= metadataList.size()) { + getFormatterData(); + } + } + + private void getFormatterData() { + getLabel().setText(ApplicationConstants.GETTING_FORMATTER); + counter = 0; + log.info("Formating for " + metadataList.size() + " files"); + for (final Metadata metadata : metadataList) { + final int i = metadataList.indexOf(metadata); + MainWindow.this + .viewEngineConfigurator + .getViewEngine() + .request( + Actions.COMPLETE_FORMATTER, + metadata, + new ResponseCallback() { + + @Override + public void onResponse(ActionResult response) { + updateStatus(counter++, metadataList.size()); + log.info( + "response in getFormatterData for " + + metadata.getTitle() + + ": " + + response); + if (response.equals(ActionResult.New)) { + metadataWithAlbum.add(metadata); + getDescriptionTable() + .getModel() + .setValueAt( + metadata.getArtist(), + i, + ApplicationConstants.ARTIST_COLUMN); + getDescriptionTable() + .getModel() + .setValueAt( + metadata.getTitle(), + i, + ApplicationConstants.TITLE_COLUMN); + getDescriptionTable() + .getModel() + .setValueAt( + metadata.getAlbum(), + i, + ApplicationConstants.ALBUM_COLUMN); + } else if (!getDescriptionTable() + .getModel() + .getValueAt(i, ApplicationConstants.STATUS_COLUMN) + .equals(ActionResult.New)) { + getDescriptionTable() + .getModel() + .setValueAt( + response, + i, + ApplicationConstants.STATUS_COLUMN); + } + if (counter >= metadataList.size()) { + getLastfmData(); + } + } + }); + } + } + + private void completeValuesForAlbum() { + getLabel().setText(ApplicationConstants.COMPLETE_DEFAULT_VALUES); + counter = 0; + log.info("Completing album for " + metadataList.size() + " files"); + MainWindow.this + .viewEngineConfigurator + .getViewEngine() + .request( + Actions.COMPLETE_DEFAULT, + metadataList, + new ResponseCallback() { + + @Override + public void onResponse(ActionResult response) { + log.info( + "response in completeValuesForAlbum for " + + metadata.getTitle() + + ": " + + response); + if (response.equals(ActionResult.New)) { + for (Metadata metadata : metadataList) { + int i = metadataList.indexOf(metadata); + updateStatus(counter++, metadataList.size()); + getDescriptionTable() + .getModel() + .setValueAt( + metadata.getTotalTracks(), + i, + ApplicationConstants + .TOTAL_TRACKS_NUMBER_COLUMN); + getDescriptionTable() + .getModel() + .setValueAt( + metadata.getCdNumber(), + i, + ApplicationConstants.CD_NUMBER_COLUMN); + getDescriptionTable() + .getModel() + .setValueAt( + metadata.getTotalCds(), + i, + ApplicationConstants.TOTAL_CDS_NUMBER_COLUMN); + } + } else if (!getDescriptionTable() + .getModel() + .getValueAt(i, ApplicationConstants.STATUS_COLUMN) + .equals(ActionResult.New)) { + getDescriptionTable() + .getModel() + .setValueAt( + response, i, ApplicationConstants.STATUS_COLUMN); + } + afterComplete(metadataWithAlbum); + } + }); + } + + private void getLastfmData() { + getLabel().setText(ApplicationConstants.GETTING_LAST_FM); + counter = 0; + log.info("Searching in lastfm for " + metadataList.size() + " files"); + for (final Metadata metadata : metadataList) { + final int i = metadataList.indexOf(metadata); + MainWindow.this + .viewEngineConfigurator + .getViewEngine() + .request( + Actions.COMPLETE_LAST_FM, + metadata, + new ResponseCallback() { + + public void onResponse(ActionResult response) { + updateStatus(counter++, metadataList.size()); + log.info( + "response in getLastfmData for " + + metadata.getTitle() + + ": " + + response); + if (response.equals(ActionResult.New)) { + metadataWithAlbum.add(metadata); + getDescriptionTable() + .getModel() + .setValueAt( + metadata.getArtist(), + i, + ApplicationConstants.ARTIST_COLUMN); + getDescriptionTable() + .getModel() + .setValueAt( + metadata.getTitle(), + i, + ApplicationConstants.TITLE_COLUMN); + getDescriptionTable() + .getModel() + .setValueAt( + metadata.getAlbum(), + i, + ApplicationConstants.ALBUM_COLUMN); + getDescriptionTable() + .getModel() + .setValueAt( + metadata.getYear(), + i, + ApplicationConstants.YEAR_COLUMN); + getDescriptionTable() + .getModel() + .setValueAt( + metadata.getGenre(), + i, + ApplicationConstants.GENRE_COLUMN); + getDescriptionTable() + .getModel() + .setValueAt( + ActionResult.New, + i, + ApplicationConstants.STATUS_COLUMN); + if (metadata.getNewCoverArt() != null + && i == selectedRow) { + updateImage(i); + } + } else if (!getDescriptionTable() + .getModel() + .getValueAt(i, ApplicationConstants.STATUS_COLUMN) + .equals(ActionResult.New)) { + getDescriptionTable() + .getModel() + .setValueAt( + response, + i, + ApplicationConstants.STATUS_COLUMN); + } + if (counter >= metadataList.size()) { + completeValuesForAlbum(); + } + } + }); + } + } + }); + } + return true; + } + }; + + MainWindow.this.getCompleteMetadataButton().setEnabled(false); + getOpenButton().setEnabled(false); + swingWorker.execute(); + } + } + + private void afterComplete(Set metadataWithOutArtist) { + if (!metadataWithOutArtist.isEmpty()) { + controlEngineConfigurator + .getControlEngine() + .set(Model.METADATA_ARTIST, metadataWithOutArtist, null); + getApplyButton().setEnabled(true); + log.info("setting applyButton to : true"); + } + resetButtonsState(); + working = false; + log.info("setting working to : " + false); + log.info("I already worked"); + } + + private void resetButtonsState() { + getLabel().setText(ApplicationConstants.DONE); + getCompleteMetadataButton().setEnabled(true); + getOpenButton().setEnabled(true); + getExportButton().setEnabled(true); + getDescriptionTable().setEnabled(true); + } + + private void updateStatus(final int i, int size) { + int progress = ((i + 1) * 100) / size; + getProgressBar().setValue(progress); + } + ; + + private class SendWorker { + public SendWorker() { + work(); + } + + private void work() { + SwingWorker swingWorker = + new SwingWorker() { + + protected Boolean doInBackground() throws Exception { + final List metadataList = + viewEngineConfigurator.getViewEngine().get(Model.METADATA); + counter = 0; + for (final Metadata metadata : metadataList) { + MainWindow.this + .viewEngineConfigurator + .getViewEngine() + .request( + Actions.SEND, + metadata, + new ResponseCallback() { + + public void onResponse(ActionResult response) { + log.info( + "response on sending " + metadata.getTitle() + ": " + response); + updateStatus(counter++, metadataList.size()); + getDescriptionTable() + .getModel() + .setValueAt( + response, getRow(metadata), ApplicationConstants.STATUS_COLUMN); + } + }); + } + return true; + } + + public void done() { + getLabel().setText(ApplicationConstants.DONE); + getCompleteMetadataButton().setEnabled(true); + getSendButton().setEnabled(true); + getOpenButton().setEnabled(true); + } + }; + swingWorker.execute(); + getCompleteMetadataButton().setEnabled(false); + getSendButton().setEnabled(false); + getOpenButton().setEnabled(false); + getProgressBar().setVisible(true); + getLabel().setText(ApplicationConstants.WORKING); + } + } + + private class ExportWorker { + private final List metadataList; + private final ExportPackage exportPackage; + + public ExportWorker(File root) { + metadataList = viewEngineConfigurator.getViewEngine().get(Model.METADATA); + exportPackage = new ExportPackage(root, metadataList); + work(); + } + + private void work() { + SwingWorker swingWorker = + new SwingWorker() { + + protected Boolean doInBackground() throws Exception { + MainWindow.this + .viewEngineConfigurator + .getViewEngine() + .request( + Actions.EXPORT, + exportPackage, + new ResponseCallback() { + + public void onResponse(ActionResult response) { + for (Metadata metadata : metadataList) { + getDescriptionTable() + .getModel() + .setValueAt( + response, getRow(metadata), ApplicationConstants.STATUS_COLUMN); + } + } + }); + return true; + } + }; + swingWorker.execute(); + } + } + + private int getRow(Metadata metadataTarget) { + TableModel model = getDescriptionTable().getModel(); + List metadataList = viewEngineConfigurator.getViewEngine().get(Model.METADATA); + + for (int i = 0; i < model.getRowCount(); i++) { + String artist = (String) model.getValueAt(i, 0); + String title = (String) model.getValueAt(i, 1); + if (artist.equals(metadataTarget.getArtist()) && title.equals(metadataTarget.getTitle())) { + return i; + } + } + + return 0; + } + + private class ClickAction extends AbstractAction { + private static final long serialVersionUID = 1L; + private JButton button; + + public ClickAction(JButton button) { + this.button = button; + } + + public void actionPerformed(ActionEvent e) { + button.doClick(); + } + } + + private class DescriptionTableModelListener implements TableModelListener { + + public void tableChanged(TableModelEvent e) { + if (MainWindow.this.getCompleteMetadataButton().getText().equals(ApplicationConstants.APPLY) + && e.getColumn() != ApplicationConstants.STATUS_COLUMN) { + int lastRow = e.getLastRow(); + DefaultTableModel model = (DefaultTableModel) e.getSource(); + String artist = (String) model.getValueAt(lastRow, 0); + String trackName = (String) model.getValueAt(lastRow, 1); + String album = (String) model.getValueAt(lastRow, 2); + } + } + } } diff --git a/src/main/java/com/josdem/jmetadata/gui/MetadataDialog.java b/src/main/java/com/josdem/jmetadata/gui/MetadataDialog.java index d6fb2e0..53ae8d0 100644 --- a/src/main/java/com/josdem/jmetadata/gui/MetadataDialog.java +++ b/src/main/java/com/josdem/jmetadata/gui/MetadataDialog.java @@ -16,6 +16,18 @@ package com.josdem.jmetadata.gui; +import com.josdem.jmetadata.collaborator.MetadataCollaborator; +import com.josdem.jmetadata.dnd.ImageDropListener; +import com.josdem.jmetadata.dnd.MainFrameDragOverListener; +import com.josdem.jmetadata.dnd.MultiLayerDropTargetListener; +import com.josdem.jmetadata.event.Events; +import com.josdem.jmetadata.helper.MetadataHelper; +import com.josdem.jmetadata.model.Metadata; +import com.josdem.jmetadata.model.MetadataAlbumValues; +import com.josdem.jmetadata.model.Model; +import com.josdem.jmetadata.observer.ObservValue; +import com.josdem.jmetadata.observer.Observer; +import com.josdem.jmetadata.util.ImageUtils; import java.awt.Image; import java.awt.Rectangle; import java.awt.dnd.DropTarget; @@ -26,7 +38,6 @@ import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.util.List; - import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JComponent; @@ -34,409 +45,403 @@ import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JTextField; - import org.asmatron.messengine.engines.support.ControlEngineConfigurator; import org.asmatron.messengine.event.ValueEvent; -import com.josdem.jmetadata.collaborator.MetadataCollaborator; -import com.josdem.jmetadata.dnd.ImageDropListener; -import com.josdem.jmetadata.dnd.MainFrameDragOverListener; -import com.josdem.jmetadata.dnd.MultiLayerDropTargetListener; -import com.josdem.jmetadata.event.Events; -import com.josdem.jmetadata.helper.MetadataHelper; -import com.josdem.jmetadata.model.Metadata; -import com.josdem.jmetadata.model.MetadataAlbumValues; -import com.josdem.jmetadata.model.Model; -import com.josdem.jmetadata.observer.ObservValue; -import com.josdem.jmetadata.observer.Observer; -import com.josdem.jmetadata.util.ImageUtils; public class MetadataDialog extends AllDialog { - private static final long serialVersionUID = 4326045585716235724L; - private static final int ONE_HUNDRED_FIFTY = 150; - private static final int THREE_HUNDRED = 300; - private static final Rectangle CONTENT_PANEL_BOUNDS = new Rectangle(0, 0, 388, 357); - private static final Rectangle IMAGE_BOUNDS = new Rectangle(123, 10, 150, 150); - private static final Rectangle ARTIST_TEXTFIELD_BOUNDS = new Rectangle(123, 170, 200, 22); - private static final Rectangle ALBUM_TEXTFIELD_BOUNDS = new Rectangle(123, 190, 200, 22); - private static final Rectangle GENRE_TEXTFIELD_BOUNDS = new Rectangle(123, 210, 200, 22); - private static final Rectangle YEAR_TEXTFIELD_BOUNDS = new Rectangle(123, 230, 120, 22); - private static final Rectangle TRACKS_TEXTFIELD_BOUNDS = new Rectangle(123, 250, 120, 22); - private static final Rectangle CD_TEXTFIELD_BOUNDS = new Rectangle(123, 270, 120, 22); - private static final Rectangle CDS_TEXTFIELD_BOUNDS = new Rectangle(123, 290, 120, 22); - private static final Rectangle IMAGE_LABEL_BOUNDS = new Rectangle(24, 10, 226, 18); - private static final Rectangle ARTIST_LABEL_BOUNDS = new Rectangle(24, 170, 226, 18); - private static final Rectangle ALBUM_LABEL_BOUNDS = new Rectangle(24, 190, 226, 18); - private static final Rectangle GENRE_LABEL_BOUNDS = new Rectangle(24, 210, 226, 18); - private static final Rectangle YEAR_LABEL_BOUNDS = new Rectangle(24, 230, 226, 18); - private static final Rectangle TRACKS_LABEL_BOUNDS = new Rectangle(24, 250, 226, 18); - private static final Rectangle CD_LABEL_BOUNDS = new Rectangle(24, 270, 226, 18); - private static final Rectangle CDS_LABEL_BOUNDS = new Rectangle(24, 290, 226, 18); - private static final Rectangle SEND_BUTTON_BOUNDS = new Rectangle(200, 330, 80, 22); - private static final Rectangle CANCEL_BUTTON_BOUNDS = new Rectangle(109, 330, 80, 22); - - private static final String ARTIST_TEXT_FIELD = "artistTextField"; - private static final String ALBUM_TEXT_FIELD = "albumTextField"; - private static final String GENRE_TEXT_FIELD = "genreTextField"; - private static final String YEAR_TEXT_FIELD = "yearTextField"; - private static final String TRACKS_TEXT_FIELD = "tracksTextField"; - private static final String CD_TEXT_FIELD = "cdTextField"; - private static final String CDS_TEXT_FIELD = "cdsTextField"; - - private static final String IMAGE_LABEL = "imageLabel"; - private static final String IMAGE_NAME = "smallDnDImagePanel"; - private static final String ARTIST_LABEL = "artistLabel"; - private static final String ALBUM_LABEL = "albumLabel"; - private static final String GENRE_LABEL = "genreLabel"; - private static final String YEAR_LABEL = "yearLabel"; - private static final String TRACKS_LABEL = "tracksLabel"; - private static final String CD_LABEL = "cdLabel"; - private static final String CDS_LABEL = "cdsLabel"; - private static final String BUTTON_NAME = "buttonCancel"; - private static final String APPLY_BUTTON_NAME = "buttonApply"; - private static final String APPLY = "Apply"; - private static final String IMAGE = "Cover Art"; - private static final String ARTIST = "Artist"; - private static final String ALBUM = "Album"; - private static final String GENRE = "Genre"; - private static final String YEAR = "Year"; - private static final String TRACKS = "#Trks"; - private static final String CANCEL = "Cancel"; - private static final String CD = "#CD"; - private static final String CDS = "#CDs"; - private JPanel contentPanel; - private JTextField artistTextField; - private JTextField albumTextField; - private JTextField genreTextField; - private JTextField yearTextField; - private JTextField tracksTextField; - private JTextField cdTextField; - private JTextField cdsTextField; - private JButton applyButton; - private JButton cancelButton; - private final String message; - private JLabel imageLabel; - private JLabel artistLabel; - private JLabel albumLabel; - private JLabel genreLabel; - private JLabel yearLabel; - private JLabel tracksLabel; - private JLabel cdLabel; - private JLabel cdsLabel; - private JPanel imagePanel; - private Image coverArt; - private ImageUtils imageUtils = new ImageUtils(); - private MetadataHelper metadataHelper = new MetadataHelper(); - private MetadataCollaborator metadataCollaborator = new MetadataCollaborator(); - private final ControlEngineConfigurator configurator; - - public MetadataDialog(JFrame frame, ControlEngineConfigurator controlEngineConfigurator, String message) { - super(frame, true, message); - this.configurator = controlEngineConfigurator; - this.message = message; - List metadatas = controlEngineConfigurator.getControlEngine().get(Model.METADATA); - metadataCollaborator.setMetadatas(metadatas); - initializeContentPane(); - getTitleLabel().setText(dialogTitle()); - MultiLayerDropTargetListener multiLayerDropTargetListener = new MultiLayerDropTargetListener(); - setDragAndDrop(multiLayerDropTargetListener); - } - - private void setDragAndDrop(MultiLayerDropTargetListener multiLayerDropTargetListener) { - setDropTarget(new DropTarget(this, multiLayerDropTargetListener)); - multiLayerDropTargetListener.addDragListener(this, new MainFrameDragOverListener(this)); - ImageDropListener listener = new ImageDropListener(new ImagePanel()); - listener.onDropped().add(new Observer>() { - - - public void observe(ObservValue t) { - ImagePanel value = t.getValue(); - Image image = value.getImage(); - coverArt = imageUtils.resize(image, THREE_HUNDRED, THREE_HUNDRED); - JLabel imageLabel = new JLabel(new ImageIcon(imageUtils.resize(image, ONE_HUNDRED_FIFTY, ONE_HUNDRED_FIFTY))); - getImagePanel().removeAll(); - getImagePanel().add(imageLabel); - MetadataDialog.this.invalidate(); - MetadataDialog.this.validate(); - } - }); - multiLayerDropTargetListener.addDropListener(imagePanel, listener); - } - - - String dialogTitle() { - return message; - } - - private JPanel getContentPanel() { - if (contentPanel == null) { - contentPanel = new JPanel(); - contentPanel.setLayout(null); - contentPanel.setBounds(CONTENT_PANEL_BOUNDS); - contentPanel.add(getImageLabel()); - contentPanel.add(getImagePanel()); - contentPanel.add(getArtistLabel()); - contentPanel.add(getArtistTextField()); - contentPanel.add(getAlbumLabel()); - contentPanel.add(getAlbumTextField()); - contentPanel.add(getGenreLabel()); - contentPanel.add(getGenreTextField()); - contentPanel.add(getYearLabel()); - contentPanel.add(getYearTextField()); - contentPanel.add(getTracksLabel()); - contentPanel.add(getTracksTextField()); - contentPanel.add(getCdLabel()); - contentPanel.add(getCdTextField()); - contentPanel.add(getCdsLabel()); - contentPanel.add(getCdsTextField()); - contentPanel.add(getApplyButton()); - contentPanel.add(getCancelButton()); - } - return contentPanel; - } - - private JLabel getArtistLabel() { - if (artistLabel == null) { - artistLabel = new JLabel(); - artistLabel.setBounds(ARTIST_LABEL_BOUNDS); - artistLabel.setName(ARTIST_LABEL); - artistLabel.setText(ARTIST); - artistLabel.requestFocus(); - } - return artistLabel; - } - - private JTextField getArtistTextField() { - if (artistTextField == null) { - artistTextField = new JTextField(); - artistTextField.setBounds(ARTIST_TEXTFIELD_BOUNDS); - artistTextField.setName(ARTIST_TEXT_FIELD); - artistTextField.setText(metadataCollaborator.getArtist()); - } - return artistTextField; - } - - private JLabel getAlbumLabel() { - if (albumLabel == null) { - albumLabel = new JLabel(); - albumLabel.setBounds(ALBUM_LABEL_BOUNDS); - albumLabel.setName(ALBUM_LABEL); - albumLabel.setText(ALBUM); - albumLabel.requestFocus(); - } - return albumLabel; - } - - private JTextField getAlbumTextField() { - if (albumTextField == null) { - albumTextField = new JTextField(); - albumTextField.setBounds(ALBUM_TEXTFIELD_BOUNDS); - albumTextField.setName(ALBUM_TEXT_FIELD); - albumTextField.setText(metadataCollaborator.getAlbum()); - } - return albumTextField; - } - - private JLabel getYearLabel() { - if (yearLabel == null) { - yearLabel = new JLabel(); - yearLabel.setBounds(YEAR_LABEL_BOUNDS); - yearLabel.setName(YEAR_LABEL); - yearLabel.setText(YEAR); - yearLabel.requestFocus(); - } - return yearLabel; - } - - private JTextField getYearTextField() { - if (yearTextField == null) { - yearTextField = new JTextField(); - yearTextField.setBounds(YEAR_TEXTFIELD_BOUNDS); - yearTextField.setName(YEAR_TEXT_FIELD); - yearTextField.setText(metadataCollaborator.getYear()); - } - return yearTextField; - } - - private JLabel getImageLabel() { - if(imageLabel == null){ - imageLabel = new JLabel(); - imageLabel.setBounds(IMAGE_LABEL_BOUNDS); - imageLabel.setName(IMAGE_LABEL); - imageLabel.setText(IMAGE); - imageLabel.requestFocus(); - } - return imageLabel; - } - - private JPanel getImagePanel() { - if(imagePanel == null){ - imagePanel = new JPanel(); - imagePanel.setName(IMAGE_NAME); - imagePanel.setBounds(IMAGE_BOUNDS); - } - return imagePanel; - } - - - JComponent getContentComponent() { - return getContentPanel(); - } - - private JLabel getCdsLabel() { - if (cdsLabel == null) { - cdsLabel = new JLabel(); - cdsLabel.setBounds(CDS_LABEL_BOUNDS); - cdsLabel.setName(CDS_LABEL); - cdsLabel.setText(CDS); - cdsLabel.requestFocus(); - } - return cdsLabel; - } - - private JTextField getCdsTextField() { - if (cdsTextField == null) { - cdsTextField = new JTextField(); - cdsTextField.setBounds(CDS_TEXTFIELD_BOUNDS); - cdsTextField.setName(CDS_TEXT_FIELD); - cdsTextField.setText(metadataCollaborator.getTotalCds()); - } - return cdsTextField; - } - - private JLabel getCdLabel() { - if (cdLabel == null) { - cdLabel = new JLabel(); - cdLabel.setBounds(CD_LABEL_BOUNDS); - cdLabel.setName(CD_LABEL); - cdLabel.setText(CD); - cdLabel.requestFocus(); - } - return cdLabel; - } - - private JTextField getCdTextField() { - if (cdTextField == null) { - cdTextField = new JTextField(); - cdTextField.setBounds(CD_TEXTFIELD_BOUNDS); - cdTextField.setName(CD_TEXT_FIELD); - cdTextField.setText(metadataCollaborator.getCdNumber()); - } - return cdTextField; - } - - private JLabel getTracksLabel() { - if (tracksLabel == null) { - tracksLabel = new JLabel(); - tracksLabel.setBounds(TRACKS_LABEL_BOUNDS); - tracksLabel.setName(TRACKS_LABEL); - tracksLabel.setText(TRACKS); - tracksLabel.requestFocus(); - } - return tracksLabel; - } - - private JTextField getTracksTextField() { - if (tracksTextField == null) { - tracksTextField = new JTextField(); - tracksTextField.setBounds(TRACKS_TEXTFIELD_BOUNDS); - tracksTextField.setName(TRACKS_TEXT_FIELD); - tracksTextField.setText(metadataCollaborator.getTotalTracks()); - } - return tracksTextField; - } - - private JLabel getGenreLabel() { - if (genreLabel == null) { - genreLabel = new JLabel(); - genreLabel.setBounds(GENRE_LABEL_BOUNDS); - genreLabel.setName(GENRE_LABEL); - genreLabel.setText(GENRE); - genreLabel.requestFocus(); - } - return genreLabel; - } - - private JTextField getGenreTextField() { - if (genreTextField == null) { - genreTextField = new JTextField(); - genreTextField.setBounds(GENRE_TEXTFIELD_BOUNDS); - genreTextField.setName(GENRE_TEXT_FIELD); - genreTextField.setText(metadataCollaborator.getGenre()); - genreTextField.addFocusListener(new FocusListener()); - genreTextField.addKeyListener(new KeyListener()); - } - return genreTextField; - } - - private JButton getApplyButton() { - if (applyButton == null) { - applyButton = new JButton(); - applyButton.setBounds(SEND_BUTTON_BOUNDS); - applyButton.setName(APPLY_BUTTON_NAME); - applyButton.setText(APPLY); - applyButton.setMnemonic(KeyEvent.VK_A); - applyButton.setEnabled(true); - getRootPane().setDefaultButton(applyButton); - applyButton.addActionListener(new ActionListener() { - - public void actionPerformed(ActionEvent e) { - applyButton.setEnabled(false); - MetadataAlbumValues metadataValues = metadataHelper.createMetadataAlbumValues(); - metadataValues.setCoverArt(coverArt); - metadataValues.setArtist(getArtistTextField().getText()); - metadataValues.setAlbum(getAlbumTextField().getText()); - metadataValues.setGenre(getGenreTextField().getText()); - metadataValues.setYear(getYearTextField().getText()); - metadataValues.setTracks(getTracksTextField().getText()); - metadataValues.setCd(getCdTextField().getText()); - metadataValues.setCds(getCdsTextField().getText()); - configurator.getControlEngine().fireEvent(Events.READY_TO_APPLY, new ValueEvent(metadataValues)); - closeDialog(); - } - }); - } - return applyButton; - } - - private JButton getCancelButton() { - if (cancelButton == null) { - cancelButton = new JButton(); - cancelButton.setBounds(CANCEL_BUTTON_BOUNDS); - cancelButton.setName(BUTTON_NAME); - cancelButton.setText(CANCEL); - cancelButton.setMnemonic(KeyEvent.VK_C); - cancelButton.addActionListener(new CloseListener()); - } - return cancelButton; - } - - private final class KeyListener extends KeyAdapter { - - public void keyReleased(KeyEvent e) { - if (e.getSource().equals(genreTextField)) { - if (genreTextField.getText().length() > 0) { - getApplyButton().setEnabled(true); - } - } - if (getApplyButton().isEnabled() && e.getKeyCode() == KeyEvent.VK_ENTER) { - getApplyButton().doClick(); - } - } - } - - private final class FocusListener extends FocusAdapter { - - public void focusLost(FocusEvent e) { - if (e.getSource().equals(genreTextField)) { - if (!genreTextField.getText().equals("")) { - getApplyButton().setEnabled(true); - } - } - } - } - - public void setMetadataHelper(MetadataHelper metadataHelper) { - this.metadataHelper = metadataHelper; - } - + private static final long serialVersionUID = 4326045585716235724L; + private static final int ONE_HUNDRED_FIFTY = 150; + private static final int THREE_HUNDRED = 300; + private static final Rectangle CONTENT_PANEL_BOUNDS = new Rectangle(0, 0, 388, 357); + private static final Rectangle IMAGE_BOUNDS = new Rectangle(123, 10, 150, 150); + private static final Rectangle ARTIST_TEXTFIELD_BOUNDS = new Rectangle(123, 170, 200, 22); + private static final Rectangle ALBUM_TEXTFIELD_BOUNDS = new Rectangle(123, 190, 200, 22); + private static final Rectangle GENRE_TEXTFIELD_BOUNDS = new Rectangle(123, 210, 200, 22); + private static final Rectangle YEAR_TEXTFIELD_BOUNDS = new Rectangle(123, 230, 120, 22); + private static final Rectangle TRACKS_TEXTFIELD_BOUNDS = new Rectangle(123, 250, 120, 22); + private static final Rectangle CD_TEXTFIELD_BOUNDS = new Rectangle(123, 270, 120, 22); + private static final Rectangle CDS_TEXTFIELD_BOUNDS = new Rectangle(123, 290, 120, 22); + private static final Rectangle IMAGE_LABEL_BOUNDS = new Rectangle(24, 10, 226, 18); + private static final Rectangle ARTIST_LABEL_BOUNDS = new Rectangle(24, 170, 226, 18); + private static final Rectangle ALBUM_LABEL_BOUNDS = new Rectangle(24, 190, 226, 18); + private static final Rectangle GENRE_LABEL_BOUNDS = new Rectangle(24, 210, 226, 18); + private static final Rectangle YEAR_LABEL_BOUNDS = new Rectangle(24, 230, 226, 18); + private static final Rectangle TRACKS_LABEL_BOUNDS = new Rectangle(24, 250, 226, 18); + private static final Rectangle CD_LABEL_BOUNDS = new Rectangle(24, 270, 226, 18); + private static final Rectangle CDS_LABEL_BOUNDS = new Rectangle(24, 290, 226, 18); + private static final Rectangle SEND_BUTTON_BOUNDS = new Rectangle(200, 330, 80, 22); + private static final Rectangle CANCEL_BUTTON_BOUNDS = new Rectangle(109, 330, 80, 22); + + private static final String ARTIST_TEXT_FIELD = "artistTextField"; + private static final String ALBUM_TEXT_FIELD = "albumTextField"; + private static final String GENRE_TEXT_FIELD = "genreTextField"; + private static final String YEAR_TEXT_FIELD = "yearTextField"; + private static final String TRACKS_TEXT_FIELD = "tracksTextField"; + private static final String CD_TEXT_FIELD = "cdTextField"; + private static final String CDS_TEXT_FIELD = "cdsTextField"; + + private static final String IMAGE_LABEL = "imageLabel"; + private static final String IMAGE_NAME = "smallDnDImagePanel"; + private static final String ARTIST_LABEL = "artistLabel"; + private static final String ALBUM_LABEL = "albumLabel"; + private static final String GENRE_LABEL = "genreLabel"; + private static final String YEAR_LABEL = "yearLabel"; + private static final String TRACKS_LABEL = "tracksLabel"; + private static final String CD_LABEL = "cdLabel"; + private static final String CDS_LABEL = "cdsLabel"; + private static final String BUTTON_NAME = "buttonCancel"; + private static final String APPLY_BUTTON_NAME = "buttonApply"; + private static final String APPLY = "Apply"; + private static final String IMAGE = "Cover Art"; + private static final String ARTIST = "Artist"; + private static final String ALBUM = "Album"; + private static final String GENRE = "Genre"; + private static final String YEAR = "Year"; + private static final String TRACKS = "#Trks"; + private static final String CANCEL = "Cancel"; + private static final String CD = "#CD"; + private static final String CDS = "#CDs"; + private JPanel contentPanel; + private JTextField artistTextField; + private JTextField albumTextField; + private JTextField genreTextField; + private JTextField yearTextField; + private JTextField tracksTextField; + private JTextField cdTextField; + private JTextField cdsTextField; + private JButton applyButton; + private JButton cancelButton; + private final String message; + private JLabel imageLabel; + private JLabel artistLabel; + private JLabel albumLabel; + private JLabel genreLabel; + private JLabel yearLabel; + private JLabel tracksLabel; + private JLabel cdLabel; + private JLabel cdsLabel; + private JPanel imagePanel; + private Image coverArt; + private ImageUtils imageUtils = new ImageUtils(); + private MetadataHelper metadataHelper = new MetadataHelper(); + private MetadataCollaborator metadataCollaborator = new MetadataCollaborator(); + private final ControlEngineConfigurator configurator; + + public MetadataDialog( + JFrame frame, ControlEngineConfigurator controlEngineConfigurator, String message) { + super(frame, true, message); + this.configurator = controlEngineConfigurator; + this.message = message; + List metadatas = controlEngineConfigurator.getControlEngine().get(Model.METADATA); + metadataCollaborator.setMetadatas(metadatas); + initializeContentPane(); + getTitleLabel().setText(dialogTitle()); + MultiLayerDropTargetListener multiLayerDropTargetListener = new MultiLayerDropTargetListener(); + setDragAndDrop(multiLayerDropTargetListener); + } + + private void setDragAndDrop(MultiLayerDropTargetListener multiLayerDropTargetListener) { + setDropTarget(new DropTarget(this, multiLayerDropTargetListener)); + multiLayerDropTargetListener.addDragListener(this, new MainFrameDragOverListener(this)); + ImageDropListener listener = new ImageDropListener(new ImagePanel()); + listener + .onDropped() + .add( + new Observer>() { + + public void observe(ObservValue t) { + ImagePanel value = t.getValue(); + Image image = value.getImage(); + coverArt = imageUtils.resize(image, THREE_HUNDRED, THREE_HUNDRED); + JLabel imageLabel = + new JLabel( + new ImageIcon( + imageUtils.resize(image, ONE_HUNDRED_FIFTY, ONE_HUNDRED_FIFTY))); + getImagePanel().removeAll(); + getImagePanel().add(imageLabel); + MetadataDialog.this.invalidate(); + MetadataDialog.this.validate(); + } + }); + multiLayerDropTargetListener.addDropListener(imagePanel, listener); + } + + String dialogTitle() { + return message; + } + + private JPanel getContentPanel() { + if (contentPanel == null) { + contentPanel = new JPanel(); + contentPanel.setLayout(null); + contentPanel.setBounds(CONTENT_PANEL_BOUNDS); + contentPanel.add(getImageLabel()); + contentPanel.add(getImagePanel()); + contentPanel.add(getArtistLabel()); + contentPanel.add(getArtistTextField()); + contentPanel.add(getAlbumLabel()); + contentPanel.add(getAlbumTextField()); + contentPanel.add(getGenreLabel()); + contentPanel.add(getGenreTextField()); + contentPanel.add(getYearLabel()); + contentPanel.add(getYearTextField()); + contentPanel.add(getTracksLabel()); + contentPanel.add(getTracksTextField()); + contentPanel.add(getCdLabel()); + contentPanel.add(getCdTextField()); + contentPanel.add(getCdsLabel()); + contentPanel.add(getCdsTextField()); + contentPanel.add(getApplyButton()); + contentPanel.add(getCancelButton()); + } + return contentPanel; + } + + private JLabel getArtistLabel() { + if (artistLabel == null) { + artistLabel = new JLabel(); + artistLabel.setBounds(ARTIST_LABEL_BOUNDS); + artistLabel.setName(ARTIST_LABEL); + artistLabel.setText(ARTIST); + artistLabel.requestFocus(); + } + return artistLabel; + } + + private JTextField getArtistTextField() { + if (artistTextField == null) { + artistTextField = new JTextField(); + artistTextField.setBounds(ARTIST_TEXTFIELD_BOUNDS); + artistTextField.setName(ARTIST_TEXT_FIELD); + artistTextField.setText(metadataCollaborator.getArtist()); + } + return artistTextField; + } + + private JLabel getAlbumLabel() { + if (albumLabel == null) { + albumLabel = new JLabel(); + albumLabel.setBounds(ALBUM_LABEL_BOUNDS); + albumLabel.setName(ALBUM_LABEL); + albumLabel.setText(ALBUM); + albumLabel.requestFocus(); + } + return albumLabel; + } + + private JTextField getAlbumTextField() { + if (albumTextField == null) { + albumTextField = new JTextField(); + albumTextField.setBounds(ALBUM_TEXTFIELD_BOUNDS); + albumTextField.setName(ALBUM_TEXT_FIELD); + albumTextField.setText(metadataCollaborator.getAlbum()); + } + return albumTextField; + } + + private JLabel getYearLabel() { + if (yearLabel == null) { + yearLabel = new JLabel(); + yearLabel.setBounds(YEAR_LABEL_BOUNDS); + yearLabel.setName(YEAR_LABEL); + yearLabel.setText(YEAR); + yearLabel.requestFocus(); + } + return yearLabel; + } + + private JTextField getYearTextField() { + if (yearTextField == null) { + yearTextField = new JTextField(); + yearTextField.setBounds(YEAR_TEXTFIELD_BOUNDS); + yearTextField.setName(YEAR_TEXT_FIELD); + yearTextField.setText(metadataCollaborator.getYear()); + } + return yearTextField; + } + + private JLabel getImageLabel() { + if (imageLabel == null) { + imageLabel = new JLabel(); + imageLabel.setBounds(IMAGE_LABEL_BOUNDS); + imageLabel.setName(IMAGE_LABEL); + imageLabel.setText(IMAGE); + imageLabel.requestFocus(); + } + return imageLabel; + } + + private JPanel getImagePanel() { + if (imagePanel == null) { + imagePanel = new JPanel(); + imagePanel.setName(IMAGE_NAME); + imagePanel.setBounds(IMAGE_BOUNDS); + } + return imagePanel; + } + + JComponent getContentComponent() { + return getContentPanel(); + } + + private JLabel getCdsLabel() { + if (cdsLabel == null) { + cdsLabel = new JLabel(); + cdsLabel.setBounds(CDS_LABEL_BOUNDS); + cdsLabel.setName(CDS_LABEL); + cdsLabel.setText(CDS); + cdsLabel.requestFocus(); + } + return cdsLabel; + } + + private JTextField getCdsTextField() { + if (cdsTextField == null) { + cdsTextField = new JTextField(); + cdsTextField.setBounds(CDS_TEXTFIELD_BOUNDS); + cdsTextField.setName(CDS_TEXT_FIELD); + cdsTextField.setText(metadataCollaborator.getTotalCds()); + } + return cdsTextField; + } + + private JLabel getCdLabel() { + if (cdLabel == null) { + cdLabel = new JLabel(); + cdLabel.setBounds(CD_LABEL_BOUNDS); + cdLabel.setName(CD_LABEL); + cdLabel.setText(CD); + cdLabel.requestFocus(); + } + return cdLabel; + } + + private JTextField getCdTextField() { + if (cdTextField == null) { + cdTextField = new JTextField(); + cdTextField.setBounds(CD_TEXTFIELD_BOUNDS); + cdTextField.setName(CD_TEXT_FIELD); + cdTextField.setText(metadataCollaborator.getCdNumber()); + } + return cdTextField; + } + + private JLabel getTracksLabel() { + if (tracksLabel == null) { + tracksLabel = new JLabel(); + tracksLabel.setBounds(TRACKS_LABEL_BOUNDS); + tracksLabel.setName(TRACKS_LABEL); + tracksLabel.setText(TRACKS); + tracksLabel.requestFocus(); + } + return tracksLabel; + } + + private JTextField getTracksTextField() { + if (tracksTextField == null) { + tracksTextField = new JTextField(); + tracksTextField.setBounds(TRACKS_TEXTFIELD_BOUNDS); + tracksTextField.setName(TRACKS_TEXT_FIELD); + tracksTextField.setText(metadataCollaborator.getTotalTracks()); + } + return tracksTextField; + } + + private JLabel getGenreLabel() { + if (genreLabel == null) { + genreLabel = new JLabel(); + genreLabel.setBounds(GENRE_LABEL_BOUNDS); + genreLabel.setName(GENRE_LABEL); + genreLabel.setText(GENRE); + genreLabel.requestFocus(); + } + return genreLabel; + } + + private JTextField getGenreTextField() { + if (genreTextField == null) { + genreTextField = new JTextField(); + genreTextField.setBounds(GENRE_TEXTFIELD_BOUNDS); + genreTextField.setName(GENRE_TEXT_FIELD); + genreTextField.setText(metadataCollaborator.getGenre()); + genreTextField.addFocusListener(new FocusListener()); + genreTextField.addKeyListener(new KeyListener()); + } + return genreTextField; + } + + private JButton getApplyButton() { + if (applyButton == null) { + applyButton = new JButton(); + applyButton.setBounds(SEND_BUTTON_BOUNDS); + applyButton.setName(APPLY_BUTTON_NAME); + applyButton.setText(APPLY); + applyButton.setMnemonic(KeyEvent.VK_A); + applyButton.setEnabled(true); + getRootPane().setDefaultButton(applyButton); + applyButton.addActionListener( + new ActionListener() { + + public void actionPerformed(ActionEvent e) { + applyButton.setEnabled(false); + MetadataAlbumValues metadataValues = metadataHelper.createMetadataAlbumValues(); + metadataValues.setCoverArt(coverArt); + metadataValues.setArtist(getArtistTextField().getText()); + metadataValues.setAlbum(getAlbumTextField().getText()); + metadataValues.setGenre(getGenreTextField().getText()); + metadataValues.setYear(getYearTextField().getText()); + metadataValues.setTracks(getTracksTextField().getText()); + metadataValues.setCd(getCdTextField().getText()); + metadataValues.setCds(getCdsTextField().getText()); + configurator + .getControlEngine() + .fireEvent( + Events.READY_TO_APPLY, new ValueEvent(metadataValues)); + closeDialog(); + } + }); + } + return applyButton; + } + + private JButton getCancelButton() { + if (cancelButton == null) { + cancelButton = new JButton(); + cancelButton.setBounds(CANCEL_BUTTON_BOUNDS); + cancelButton.setName(BUTTON_NAME); + cancelButton.setText(CANCEL); + cancelButton.setMnemonic(KeyEvent.VK_C); + cancelButton.addActionListener(new CloseListener()); + } + return cancelButton; + } + + private final class KeyListener extends KeyAdapter { + + public void keyReleased(KeyEvent e) { + if (e.getSource().equals(genreTextField)) { + if (genreTextField.getText().length() > 0) { + getApplyButton().setEnabled(true); + } + } + if (getApplyButton().isEnabled() && e.getKeyCode() == KeyEvent.VK_ENTER) { + getApplyButton().doClick(); + } + } + } + + private final class FocusListener extends FocusAdapter { + + public void focusLost(FocusEvent e) { + if (e.getSource().equals(genreTextField)) { + if (!genreTextField.getText().equals("")) { + getApplyButton().setEnabled(true); + } + } + } + } + + public void setMetadataHelper(MetadataHelper metadataHelper) { + this.metadataHelper = metadataHelper; + } } diff --git a/src/main/java/com/josdem/jmetadata/gui/table/DescriptionTable.java b/src/main/java/com/josdem/jmetadata/gui/table/DescriptionTable.java index bcdcd81..44f298f 100644 --- a/src/main/java/com/josdem/jmetadata/gui/table/DescriptionTable.java +++ b/src/main/java/com/josdem/jmetadata/gui/table/DescriptionTable.java @@ -21,78 +21,69 @@ import javax.swing.table.TableColumn; import javax.swing.table.TableColumnModel; - /** - * @author josdem (joseluis.delacruz@gmail.com) -*/ - + * @author josdem (joseluis.delacruz@gmail.com) + */ public class DescriptionTable extends DescriptionTableStyle { - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = 1L; - static String[] columnNames = {"Artist", - "Track", - "Album", - "Genre", - "Year", - "# Trk", - "# Trks", - "# CD", - "# CDs", - "Status"}; + static String[] columnNames = { + "Artist", "Track", "Album", "Genre", "Year", "# Trk", "# Trks", "# CD", "# CDs", "Status" + }; - static Object[][] data = { + static Object[][] data = { {"", "", "", "", "", "", "", "", "", ""}, - }; + }; - public DescriptionTable() { - DefaultTableModel model = new DefaultTableModel(data,columnNames); - this.setModel(model); - this.setName("descriptionTable"); - TableColumnModel tableColumnModel = new DefaultTableColumnModel(); + public DescriptionTable() { + DefaultTableModel model = new DefaultTableModel(data, columnNames); + this.setModel(model); + this.setName("descriptionTable"); + TableColumnModel tableColumnModel = new DefaultTableColumnModel(); - for (DescriptionTableColumns col : DescriptionTableColumns.values()) { - tableColumnModel.addColumn(setupColumn(col)); - } + for (DescriptionTableColumns col : DescriptionTableColumns.values()) { + tableColumnModel.addColumn(setupColumn(col)); + } - this.setTableHeader(new DescriptionTableHeader(tableColumnModel)); - setPreferredWidth(); - } + this.setTableHeader(new DescriptionTableHeader(tableColumnModel)); + setPreferredWidth(); + } - private TableColumn setupColumn(DescriptionTableColumns descriptionTableColumn) { - TableColumn column = new TableColumn(); - column.setHeaderValue(descriptionTableColumn.label()); - column.setMinWidth(descriptionTableColumn.minWidth()); - column.setMaxWidth(descriptionTableColumn.maxWidth()); - return column; - } + private TableColumn setupColumn(DescriptionTableColumns descriptionTableColumn) { + TableColumn column = new TableColumn(); + column.setHeaderValue(descriptionTableColumn.label()); + column.setMinWidth(descriptionTableColumn.minWidth()); + column.setMaxWidth(descriptionTableColumn.maxWidth()); + return column; + } - private void setPreferredWidth() { - for(int i=0; i< this.getColumnCount(); i++){ - switch(i){ - case 0: - this.getColumnModel().getColumn(i).setPreferredWidth(100); - break; - case 1: - this.getColumnModel().getColumn(i).setMinWidth(180); - this.getColumnModel().getColumn(i).setMaxWidth(Integer.MAX_VALUE); - break; - case 2: - case 3: - this.getColumnModel().getColumn(i).setPreferredWidth(100); - break; - case 4: - case 5: - case 6: - case 7: - case 8: - this.getColumnModel().getColumn(i).setMinWidth(50); - this.getColumnModel().getColumn(i).setMaxWidth(50); - break; - case 9: - this.getColumnModel().getColumn(i).setMinWidth(60); - this.getColumnModel().getColumn(i).setMaxWidth(60); - break; - } - } - } + private void setPreferredWidth() { + for (int i = 0; i < this.getColumnCount(); i++) { + switch (i) { + case 0: + this.getColumnModel().getColumn(i).setPreferredWidth(100); + break; + case 1: + this.getColumnModel().getColumn(i).setMinWidth(180); + this.getColumnModel().getColumn(i).setMaxWidth(Integer.MAX_VALUE); + break; + case 2: + case 3: + this.getColumnModel().getColumn(i).setPreferredWidth(100); + break; + case 4: + case 5: + case 6: + case 7: + case 8: + this.getColumnModel().getColumn(i).setMinWidth(50); + this.getColumnModel().getColumn(i).setMaxWidth(50); + break; + case 9: + this.getColumnModel().getColumn(i).setMinWidth(60); + this.getColumnModel().getColumn(i).setMaxWidth(60); + break; + } + } + } } diff --git a/src/main/java/com/josdem/jmetadata/gui/table/DescriptionTableColumns.java b/src/main/java/com/josdem/jmetadata/gui/table/DescriptionTableColumns.java index 681e75b..457b8c5 100644 --- a/src/main/java/com/josdem/jmetadata/gui/table/DescriptionTableColumns.java +++ b/src/main/java/com/josdem/jmetadata/gui/table/DescriptionTableColumns.java @@ -17,35 +17,40 @@ package com.josdem.jmetadata.gui.table; public enum DescriptionTableColumns { - - ARTIST("Artist", 68, 68), TRACK("Track", 180, 180), ALBUM("Album", 68, 68), GENRE("Genre", 67, 67), - YEAR("Year", 50, 50), N_TRACK("# Trk", 50, 50), N_TRACKS("# Trks", 50, 50), N_CD("# CD", 50, 50), - N_CDS("# CDS", 50, 50), STATUS("Status", 60, 60); - - private final String name; - private final int minWidth; - private final int maxWidth; - - private DescriptionTableColumns(String name, int minWidth, int maxWidth) { - this.name = name; - this.minWidth = minWidth; - this.maxWidth = maxWidth; - } - - public String label() { - return getName() == null ? "" : getName(); - } - - public int maxWidth() { - return maxWidth; - } - - public int minWidth() { - return minWidth; - } - - public String getName() { - return name; - } - + ARTIST("Artist", 68, 68), + TRACK("Track", 180, 180), + ALBUM("Album", 68, 68), + GENRE("Genre", 67, 67), + YEAR("Year", 50, 50), + N_TRACK("# Trk", 50, 50), + N_TRACKS("# Trks", 50, 50), + N_CD("# CD", 50, 50), + N_CDS("# CDS", 50, 50), + STATUS("Status", 60, 60); + + private final String name; + private final int minWidth; + private final int maxWidth; + + private DescriptionTableColumns(String name, int minWidth, int maxWidth) { + this.name = name; + this.minWidth = minWidth; + this.maxWidth = maxWidth; + } + + public String label() { + return getName() == null ? "" : getName(); + } + + public int maxWidth() { + return maxWidth; + } + + public int minWidth() { + return minWidth; + } + + public String getName() { + return name; + } } diff --git a/src/main/java/com/josdem/jmetadata/gui/table/DescriptionTableHeader.java b/src/main/java/com/josdem/jmetadata/gui/table/DescriptionTableHeader.java index 45c7234..7766c8d 100644 --- a/src/main/java/com/josdem/jmetadata/gui/table/DescriptionTableHeader.java +++ b/src/main/java/com/josdem/jmetadata/gui/table/DescriptionTableHeader.java @@ -16,12 +16,13 @@ package com.josdem.jmetadata.gui.table; +import com.josdem.jmetadata.gui.util.SynthFonts; +import com.josdem.jmetadata.gui.util.SynthIcons; import java.awt.Component; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.Insets; import java.util.List; - import javax.swing.Icon; import javax.swing.JLabel; import javax.swing.JPanel; @@ -32,104 +33,103 @@ import javax.swing.table.TableCellRenderer; import javax.swing.table.TableColumnModel; -import com.josdem.jmetadata.gui.util.SynthFonts; -import com.josdem.jmetadata.gui.util.SynthIcons; - public class DescriptionTableHeader extends JTableHeader { - private static final long serialVersionUID = 1L; - - public DescriptionTableHeader(TableColumnModel columnModel) { - super(columnModel); - this.setReorderingAllowed(true); - this.setDefaultRenderer(new DescriptionTableHeaderCellRenderer()); - } + private static final long serialVersionUID = 1L; + public DescriptionTableHeader(TableColumnModel columnModel) { + super(columnModel); + this.setReorderingAllowed(true); + this.setDefaultRenderer(new DescriptionTableHeaderCellRenderer()); + } } - class DescriptionTableHeaderCellRenderer implements TableCellRenderer { - private static final String CONTAINER_NAME = "tableHeader"; - private static final String CONTAINER_SORT_NAME = "tableSortedHeader"; - private static final Insets ICON_INSETS = new Insets(0, 0, 0, 3); - private static final Insets LABEL_INSETS = new Insets(0, 4, 0, 3); - private JPanel panel = new JPanel(); - private JLabel label = new JLabel(); - private JLabel iconLabel = new JLabel(); - - public DescriptionTableHeaderCellRenderer() { - label.setName(SynthFonts.BOLD_FONT11_BLACK); - GridBagConstraints iconConstraints = new GridBagConstraints(); - GridBagConstraints labelConstraints = new GridBagConstraints(); - labelConstraints.gridx = 0; - labelConstraints.gridy = 0; - labelConstraints.fill = GridBagConstraints.HORIZONTAL; - labelConstraints.weightx = 1.0; - labelConstraints.insets = LABEL_INSETS; - iconConstraints.gridx = 1; - iconConstraints.gridy = 0; - iconConstraints.insets = ICON_INSETS; - panel.setLayout(new GridBagLayout()); - panel.add(label, labelConstraints); - panel.add(iconLabel, iconConstraints); - } - - @Override - public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, - int row, int column) { - Icon sortIcon = getIcon(table, column); - iconLabel.setIcon(sortIcon); - label.setText(value.toString()); - label.setName(SynthFonts.BOLD_FONT11_BLACK); - - setLabelAlignment(value.toString(), label); - - if (sortIcon != null) { - label.setName(SynthFonts.BOLD_FONT11_WHITE); - panel.setName(CONTAINER_SORT_NAME); - iconLabel.setVisible(true); - } else { - panel.setName(CONTAINER_NAME); - iconLabel.setVisible(false); - } - return panel; - } - - private void setLabelAlignment(String columnName, JLabel label) { - label.setHorizontalAlignment(JLabel.LEFT); - if (columnName.equals("Plays") || columnName.equals("Time") || columnName.equals("Bitrate") - || columnName.equals("Size") || columnName.equals("Skips")) { - label.setHorizontalAlignment(JLabel.RIGHT); - } - if (columnName.equals("Rating")) { - label.setHorizontalAlignment(JLabel.CENTER); - } - } - - private Icon getIcon(JTable table, int column) { - // DescriptionTable dTable = (DescriptionTable) table; - if (table == null || table.getRowSorter() == null) { - return UIManager.getIcon("Table.naturalSortIcon"); - } - Icon sortIcon = null; - - List sortKeys = table.getRowSorter().getSortKeys(); - if (sortKeys.size() > 0 && sortKeys.get(0).getColumn() == table.convertColumnIndexToModel(column)) { - switch (sortKeys.get(0).getSortOrder()) { - case ASCENDING: - sortIcon = SynthIcons.SORT_ASCENDING_ICON; - break; - case DESCENDING: - sortIcon = SynthIcons.SORT_DESCENDING_ICON; - break; - case UNSORTED: - sortIcon = SynthIcons.SORT_NATURAL_ICON; - break; - default: - throw new AssertionError("Cannot happen"); - } - } - - return sortIcon; - } + private static final String CONTAINER_NAME = "tableHeader"; + private static final String CONTAINER_SORT_NAME = "tableSortedHeader"; + private static final Insets ICON_INSETS = new Insets(0, 0, 0, 3); + private static final Insets LABEL_INSETS = new Insets(0, 4, 0, 3); + private JPanel panel = new JPanel(); + private JLabel label = new JLabel(); + private JLabel iconLabel = new JLabel(); + + public DescriptionTableHeaderCellRenderer() { + label.setName(SynthFonts.BOLD_FONT11_BLACK); + GridBagConstraints iconConstraints = new GridBagConstraints(); + GridBagConstraints labelConstraints = new GridBagConstraints(); + labelConstraints.gridx = 0; + labelConstraints.gridy = 0; + labelConstraints.fill = GridBagConstraints.HORIZONTAL; + labelConstraints.weightx = 1.0; + labelConstraints.insets = LABEL_INSETS; + iconConstraints.gridx = 1; + iconConstraints.gridy = 0; + iconConstraints.insets = ICON_INSETS; + panel.setLayout(new GridBagLayout()); + panel.add(label, labelConstraints); + panel.add(iconLabel, iconConstraints); + } + + @Override + public Component getTableCellRendererComponent( + JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { + Icon sortIcon = getIcon(table, column); + iconLabel.setIcon(sortIcon); + label.setText(value.toString()); + label.setName(SynthFonts.BOLD_FONT11_BLACK); + + setLabelAlignment(value.toString(), label); + + if (sortIcon != null) { + label.setName(SynthFonts.BOLD_FONT11_WHITE); + panel.setName(CONTAINER_SORT_NAME); + iconLabel.setVisible(true); + } else { + panel.setName(CONTAINER_NAME); + iconLabel.setVisible(false); + } + return panel; + } + + private void setLabelAlignment(String columnName, JLabel label) { + label.setHorizontalAlignment(JLabel.LEFT); + if (columnName.equals("Plays") + || columnName.equals("Time") + || columnName.equals("Bitrate") + || columnName.equals("Size") + || columnName.equals("Skips")) { + label.setHorizontalAlignment(JLabel.RIGHT); + } + if (columnName.equals("Rating")) { + label.setHorizontalAlignment(JLabel.CENTER); + } + } + + private Icon getIcon(JTable table, int column) { + // DescriptionTable dTable = (DescriptionTable) table; + if (table == null || table.getRowSorter() == null) { + return UIManager.getIcon("Table.naturalSortIcon"); + } + Icon sortIcon = null; + + List sortKeys = table.getRowSorter().getSortKeys(); + if (sortKeys.size() > 0 + && sortKeys.get(0).getColumn() == table.convertColumnIndexToModel(column)) { + switch (sortKeys.get(0).getSortOrder()) { + case ASCENDING: + sortIcon = SynthIcons.SORT_ASCENDING_ICON; + break; + case DESCENDING: + sortIcon = SynthIcons.SORT_DESCENDING_ICON; + break; + case UNSORTED: + sortIcon = SynthIcons.SORT_NATURAL_ICON; + break; + default: + throw new AssertionError("Cannot happen"); + } + } + + return sortIcon; + } } diff --git a/src/main/java/com/josdem/jmetadata/gui/table/DescriptionTableStyle.java b/src/main/java/com/josdem/jmetadata/gui/table/DescriptionTableStyle.java index 9c6fcbe..c3a896e 100644 --- a/src/main/java/com/josdem/jmetadata/gui/table/DescriptionTableStyle.java +++ b/src/main/java/com/josdem/jmetadata/gui/table/DescriptionTableStyle.java @@ -16,48 +16,46 @@ package com.josdem.jmetadata.gui.table; +import com.josdem.jmetadata.gui.util.SynthColors; import java.awt.Color; import java.awt.Component; import javax.swing.JTable; import javax.swing.table.TableCellRenderer; -import com.josdem.jmetadata.gui.util.SynthColors; - public class DescriptionTableStyle extends JTable { - private static final long serialVersionUID = -1153564046400612566L; + private static final long serialVersionUID = -1153564046400612566L; - private Color getEvenRowColor() { - return SynthColors.CLEAR_GRAY245_245_245; - } + private Color getEvenRowColor() { + return SynthColors.CLEAR_GRAY245_245_245; + } - private Color getOddRowColor() { - return SynthColors.WHITE255_255_255; - } + private Color getOddRowColor() { + return SynthColors.WHITE255_255_255; + } - private Color getSelectedRowColor() { - return SynthColors.BLUE175_205_225; - } + private Color getSelectedRowColor() { + return SynthColors.BLUE175_205_225; + } - @Override - public Color getGridColor() { - return SynthColors.GRAY150_150_150; - } + @Override + public Color getGridColor() { + return SynthColors.GRAY150_150_150; + } - @Override - public Component prepareRenderer(TableCellRenderer renderer, int rowIndex, int vColIndex) { - Component c = super.prepareRenderer(renderer, rowIndex, vColIndex); - if (rowIndex % 2 == 0) { - c.setBackground(getOddRowColor()); - } else { - c.setBackground(getEvenRowColor()); - } - - if (isRowSelected(rowIndex)) { - c.setBackground(getSelectedRowColor()); - } + @Override + public Component prepareRenderer(TableCellRenderer renderer, int rowIndex, int vColIndex) { + Component c = super.prepareRenderer(renderer, rowIndex, vColIndex); + if (rowIndex % 2 == 0) { + c.setBackground(getOddRowColor()); + } else { + c.setBackground(getEvenRowColor()); + } - return c; + if (isRowSelected(rowIndex)) { + c.setBackground(getSelectedRowColor()); } + return c; + } } diff --git a/src/main/java/com/josdem/jmetadata/gui/util/SelectedTextForeground.java b/src/main/java/com/josdem/jmetadata/gui/util/SelectedTextForeground.java index 17387f4..9c3482e 100644 --- a/src/main/java/com/josdem/jmetadata/gui/util/SelectedTextForeground.java +++ b/src/main/java/com/josdem/jmetadata/gui/util/SelectedTextForeground.java @@ -1,23 +1,23 @@ -/* - Copyright 2013 Jose Luis De la Cruz Morales joseluis.delacruz@gmail.com - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -package com.josdem.jmetadata.gui.util; - -import java.awt.Color; - -public interface SelectedTextForeground { - Color SELECTED_FOREGROUND_COLOR = new Color(220, 200, 225); -} +/* + Copyright 2013 Jose Luis De la Cruz Morales joseluis.delacruz@gmail.com + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +package com.josdem.jmetadata.gui.util; + +import java.awt.Color; + +public interface SelectedTextForeground { + Color SELECTED_FOREGROUND_COLOR = new Color(220, 200, 225); +} diff --git a/src/main/java/com/josdem/jmetadata/gui/util/SynthColors.java b/src/main/java/com/josdem/jmetadata/gui/util/SynthColors.java index c0620a8..e8112c2 100644 --- a/src/main/java/com/josdem/jmetadata/gui/util/SynthColors.java +++ b/src/main/java/com/josdem/jmetadata/gui/util/SynthColors.java @@ -17,12 +17,11 @@ package com.josdem.jmetadata.gui.util; import java.awt.Color; - import javax.swing.UIManager; public interface SynthColors { - Color WHITE255_255_255 = UIManager.getDefaults().getColor("Color.white255_255_255"); - Color CLEAR_GRAY245_245_245 = UIManager.getDefaults().getColor("Color.clearGray245_245_245"); - Color BLUE175_205_225 = UIManager.getDefaults().getColor("Color.blue175_205_225"); - Color GRAY150_150_150 = UIManager.getDefaults().getColor("Color.grid150_150_150"); + Color WHITE255_255_255 = UIManager.getDefaults().getColor("Color.white255_255_255"); + Color CLEAR_GRAY245_245_245 = UIManager.getDefaults().getColor("Color.clearGray245_245_245"); + Color BLUE175_205_225 = UIManager.getDefaults().getColor("Color.blue175_205_225"); + Color GRAY150_150_150 = UIManager.getDefaults().getColor("Color.grid150_150_150"); } diff --git a/src/main/java/com/josdem/jmetadata/gui/util/SynthFonts.java b/src/main/java/com/josdem/jmetadata/gui/util/SynthFonts.java index 3fb15f2..f890766 100644 --- a/src/main/java/com/josdem/jmetadata/gui/util/SynthFonts.java +++ b/src/main/java/com/josdem/jmetadata/gui/util/SynthFonts.java @@ -17,7 +17,7 @@ package com.josdem.jmetadata.gui.util; public interface SynthFonts { - String BOLD_FONT11_WHITE = "boldFont11White"; - String BOLD_FONT11_BLACK = "boldFont11Black"; - String PLAIN_FONT16_GRAY100_100_100 = "plainFont16Gray100100100"; + String BOLD_FONT11_WHITE = "boldFont11White"; + String BOLD_FONT11_BLACK = "boldFont11Black"; + String PLAIN_FONT16_GRAY100_100_100 = "plainFont16Gray100100100"; } diff --git a/src/main/java/com/josdem/jmetadata/gui/util/SynthIcons.java b/src/main/java/com/josdem/jmetadata/gui/util/SynthIcons.java index 8740361..5486f45 100644 --- a/src/main/java/com/josdem/jmetadata/gui/util/SynthIcons.java +++ b/src/main/java/com/josdem/jmetadata/gui/util/SynthIcons.java @@ -1,48 +1,49 @@ -/* - Copyright 2013 Jose Luis De la Cruz Morales joseluis.delacruz@gmail.com - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -package com.josdem.jmetadata.gui.util; - -import javax.swing.Icon; -import javax.swing.UIManager; - -public interface SynthIcons { - Icon FOLDER_ICON = UIManager.getDefaults().getIcon("Tree.openIcon"); - Icon PLAYLIST_ICON = UIManager.getDefaults().getIcon("Tree.leafIcon"); - Icon NEW_FOLDER_ICON = UIManager.getDefaults().getIcon("Tree.newOpenIcon"); - Icon NEW_PLAYLIST_ICON = UIManager.getDefaults().getIcon("Tree.newLeafIcon"); - Icon HIGHLIGHT_ICON = UIManager.getDefaults().getIcon("Tree.highlight"); - Icon SORT_ASCENDING_ICON = UIManager.getIcon("Table.ascendingSortIcon"); - Icon SORT_DESCENDING_ICON = UIManager.getIcon("Table.descendingSortIcon"); - Icon SORT_NATURAL_ICON = UIManager.getIcon("Table.naturalSortIcon"); - Icon SPEAKER_ICON = UIManager.getDefaults().getIcon("Table.speakerIcon"); - Icon NEW_ICON = UIManager.getDefaults().getIcon("Table.newIcon"); - Icon DOWNLOAD_ICON = UIManager.getDefaults().getIcon("Table.downloadingTrackIcon"); - Icon DOWNLOAD_QUEUE_ICON = UIManager.getDefaults().getIcon("Table.downloadingQueueIcon"); - Icon DOWNLOAD_ERROR_ICON = UIManager.getDefaults().getIcon("Table.downloadingErrorIcon"); - Icon SPEAKER_INVISIBLE_ICON = UIManager.getDefaults().getIcon("Table.speakerInvisibleIcon"); - Icon OFFLINE_ICON = UIManager.getDefaults().getIcon("contactTree.leafOfflineIcon"); - Icon ONLLINE_ICON = UIManager.getDefaults().getIcon("contactTree.leafOnlineIcon"); - Icon PENDING_ICON = UIManager.getDefaults().getIcon("contactTree.leafPendingIcon"); - Icon FACEBOOK_ONLINE_ICON = UIManager.getDefaults().getIcon("contactTree.leafOnlineFacebokIcon"); - Icon FACEBOOK_OFFLINE_ICON = UIManager.getDefaults().getIcon("contactTree.leafOfflineFacebokIcon"); - Icon FACEBOOK_AWAY_ICON = UIManager.getDefaults().getIcon("contactTree.leafAwayFacebookIcon"); - Icon FEED_FOLDER_ICON = UIManager.getDefaults().getIcon("feed.folderIcon"); - Icon FEED_PLAYLIST_ICON = UIManager.getDefaults().getIcon("feed.playlistIcon"); - Icon FEED_MUSIC_ICON = UIManager.getDefaults().getIcon("feed.musicIcon"); - Icon YOUTUBE_ACTIVE_ICON = UIManager.getDefaults().getIcon("youtube.activeIcon"); - Icon YOUTUBE_INACTIVE_ICON = UIManager.getDefaults().getIcon("youtube.inactiveIcon"); -} +/* + Copyright 2013 Jose Luis De la Cruz Morales joseluis.delacruz@gmail.com + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +package com.josdem.jmetadata.gui.util; + +import javax.swing.Icon; +import javax.swing.UIManager; + +public interface SynthIcons { + Icon FOLDER_ICON = UIManager.getDefaults().getIcon("Tree.openIcon"); + Icon PLAYLIST_ICON = UIManager.getDefaults().getIcon("Tree.leafIcon"); + Icon NEW_FOLDER_ICON = UIManager.getDefaults().getIcon("Tree.newOpenIcon"); + Icon NEW_PLAYLIST_ICON = UIManager.getDefaults().getIcon("Tree.newLeafIcon"); + Icon HIGHLIGHT_ICON = UIManager.getDefaults().getIcon("Tree.highlight"); + Icon SORT_ASCENDING_ICON = UIManager.getIcon("Table.ascendingSortIcon"); + Icon SORT_DESCENDING_ICON = UIManager.getIcon("Table.descendingSortIcon"); + Icon SORT_NATURAL_ICON = UIManager.getIcon("Table.naturalSortIcon"); + Icon SPEAKER_ICON = UIManager.getDefaults().getIcon("Table.speakerIcon"); + Icon NEW_ICON = UIManager.getDefaults().getIcon("Table.newIcon"); + Icon DOWNLOAD_ICON = UIManager.getDefaults().getIcon("Table.downloadingTrackIcon"); + Icon DOWNLOAD_QUEUE_ICON = UIManager.getDefaults().getIcon("Table.downloadingQueueIcon"); + Icon DOWNLOAD_ERROR_ICON = UIManager.getDefaults().getIcon("Table.downloadingErrorIcon"); + Icon SPEAKER_INVISIBLE_ICON = UIManager.getDefaults().getIcon("Table.speakerInvisibleIcon"); + Icon OFFLINE_ICON = UIManager.getDefaults().getIcon("contactTree.leafOfflineIcon"); + Icon ONLLINE_ICON = UIManager.getDefaults().getIcon("contactTree.leafOnlineIcon"); + Icon PENDING_ICON = UIManager.getDefaults().getIcon("contactTree.leafPendingIcon"); + Icon FACEBOOK_ONLINE_ICON = UIManager.getDefaults().getIcon("contactTree.leafOnlineFacebokIcon"); + Icon FACEBOOK_OFFLINE_ICON = + UIManager.getDefaults().getIcon("contactTree.leafOfflineFacebokIcon"); + Icon FACEBOOK_AWAY_ICON = UIManager.getDefaults().getIcon("contactTree.leafAwayFacebookIcon"); + Icon FEED_FOLDER_ICON = UIManager.getDefaults().getIcon("feed.folderIcon"); + Icon FEED_PLAYLIST_ICON = UIManager.getDefaults().getIcon("feed.playlistIcon"); + Icon FEED_MUSIC_ICON = UIManager.getDefaults().getIcon("feed.musicIcon"); + Icon YOUTUBE_ACTIVE_ICON = UIManager.getDefaults().getIcon("youtube.activeIcon"); + Icon YOUTUBE_INACTIVE_ICON = UIManager.getDefaults().getIcon("youtube.inactiveIcon"); +} diff --git a/src/main/java/com/josdem/jmetadata/helper/ApplicationContextSingleton.java b/src/main/java/com/josdem/jmetadata/helper/ApplicationContextSingleton.java index 66c5042..51f08c9 100644 --- a/src/main/java/com/josdem/jmetadata/helper/ApplicationContextSingleton.java +++ b/src/main/java/com/josdem/jmetadata/helper/ApplicationContextSingleton.java @@ -19,18 +19,16 @@ import org.springframework.context.ConfigurableApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; - /** * @understands a class who knows how to get the application context from spring -*/ - + */ public class ApplicationContextSingleton { - private static ConfigurableApplicationContext applicationContext; - - public static ConfigurableApplicationContext getApplicationContext(){ - if (applicationContext == null) { - applicationContext = new ClassPathXmlApplicationContext( "spring/applicationContext.xml" ); - } - return applicationContext; - } + private static ConfigurableApplicationContext applicationContext; + + public static ConfigurableApplicationContext getApplicationContext() { + if (applicationContext == null) { + applicationContext = new ClassPathXmlApplicationContext("spring/applicationContext.xml"); + } + return applicationContext; + } } diff --git a/src/main/java/com/josdem/jmetadata/helper/ArtworkHelper.java b/src/main/java/com/josdem/jmetadata/helper/ArtworkHelper.java index a2d361d..0ca7977 100644 --- a/src/main/java/com/josdem/jmetadata/helper/ArtworkHelper.java +++ b/src/main/java/com/josdem/jmetadata/helper/ArtworkHelper.java @@ -22,8 +22,7 @@ @Component public class ArtworkHelper { - public Artwork createArtwork() { - return new Artwork(); - } - + public Artwork createArtwork() { + return new Artwork(); + } } diff --git a/src/main/java/com/josdem/jmetadata/helper/AudioFileHelper.java b/src/main/java/com/josdem/jmetadata/helper/AudioFileHelper.java index d0ef42e..14d4af9 100644 --- a/src/main/java/com/josdem/jmetadata/helper/AudioFileHelper.java +++ b/src/main/java/com/josdem/jmetadata/helper/AudioFileHelper.java @@ -18,7 +18,6 @@ import java.io.File; import java.io.IOException; - import org.jaudiotagger.audio.AudioFile; import org.jaudiotagger.audio.AudioFileIO; import org.jaudiotagger.audio.exceptions.CannotReadException; @@ -30,8 +29,12 @@ @Service public class AudioFileHelper { - public AudioFile read(File file) throws CannotReadException, IOException, TagException, ReadOnlyFileException, InvalidAudioFrameException { - return AudioFileIO.read(file); - } - + public AudioFile read(File file) + throws CannotReadException, + IOException, + TagException, + ReadOnlyFileException, + InvalidAudioFrameException { + return AudioFileIO.read(file); + } } diff --git a/src/main/java/com/josdem/jmetadata/helper/AuthenticatorHelper.java b/src/main/java/com/josdem/jmetadata/helper/AuthenticatorHelper.java index 3ff0fd6..dc6f2ff 100644 --- a/src/main/java/com/josdem/jmetadata/helper/AuthenticatorHelper.java +++ b/src/main/java/com/josdem/jmetadata/helper/AuthenticatorHelper.java @@ -16,15 +16,15 @@ package com.josdem.jmetadata.helper; +import com.josdem.jmetadata.Auth; import de.umass.lastfm.Authenticator; import de.umass.lastfm.Session; -import com.josdem.jmetadata.Auth; import org.springframework.stereotype.Component; @Component public class AuthenticatorHelper { - public Session getSession(String username, String password) { - return Authenticator.getMobileSession(username, password, Auth.KEY, Auth.SECRET); - } + public Session getSession(String username, String password) { + return Authenticator.getMobileSession(username, password, Auth.KEY, Auth.SECRET); + } } diff --git a/src/main/java/com/josdem/jmetadata/helper/CoverArtRetrofitHelper.java b/src/main/java/com/josdem/jmetadata/helper/CoverArtRetrofitHelper.java index 48622c9..277113e 100644 --- a/src/main/java/com/josdem/jmetadata/helper/CoverArtRetrofitHelper.java +++ b/src/main/java/com/josdem/jmetadata/helper/CoverArtRetrofitHelper.java @@ -20,12 +20,12 @@ import retrofit2.converter.gson.GsonConverterFactory; public class CoverArtRetrofitHelper { - private static final String BASE_URL = "https://coverartarchive.org/"; + private static final String BASE_URL = "https://coverartarchive.org/"; - public static Retrofit getRetrofit() { - return new Retrofit.Builder() - .baseUrl(BASE_URL) - .addConverterFactory(GsonConverterFactory.create()) - .build(); - } + public static Retrofit getRetrofit() { + return new Retrofit.Builder() + .baseUrl(BASE_URL) + .addConverterFactory(GsonConverterFactory.create()) + .build(); + } } diff --git a/src/main/java/com/josdem/jmetadata/helper/DialogHelper.java b/src/main/java/com/josdem/jmetadata/helper/DialogHelper.java index 798d4a4..879d48e 100644 --- a/src/main/java/com/josdem/jmetadata/helper/DialogHelper.java +++ b/src/main/java/com/josdem/jmetadata/helper/DialogHelper.java @@ -21,8 +21,7 @@ public class DialogHelper { - public void showMessageDialog(JFrame frame, String message) { - JOptionPane.showMessageDialog(frame, message); - } - + public void showMessageDialog(JFrame frame, String message) { + JOptionPane.showMessageDialog(frame, message); + } } diff --git a/src/main/java/com/josdem/jmetadata/helper/ExporterHelper.java b/src/main/java/com/josdem/jmetadata/helper/ExporterHelper.java index 24083a2..8ceba08 100644 --- a/src/main/java/com/josdem/jmetadata/helper/ExporterHelper.java +++ b/src/main/java/com/josdem/jmetadata/helper/ExporterHelper.java @@ -16,40 +16,39 @@ package com.josdem.jmetadata.helper; +import com.josdem.jmetadata.action.ActionResult; +import com.josdem.jmetadata.exception.MetadataException; +import com.josdem.jmetadata.model.ExportPackage; +import com.josdem.jmetadata.model.Metadata; import java.io.IOException; import java.util.Collections; import java.util.List; - -import org.springframework.stereotype.Service; -import org.springframework.beans.factory.annotation.Autowired; - -import org.jaudiotagger.tag.TagException; import org.jaudiotagger.audio.exceptions.CannotReadException; import org.jaudiotagger.audio.exceptions.ReadOnlyFileException; - -import com.josdem.jmetadata.model.Metadata; -import com.josdem.jmetadata.action.ActionResult; -import com.josdem.jmetadata.model.ExportPackage; -import com.josdem.jmetadata.exception.MetadataException; +import org.jaudiotagger.tag.TagException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; @Service public class ExporterHelper { - @Autowired - private ImageExporter imageExporter; - @Autowired - private MetadataExporter metadataExporter; - - public ActionResult export(ExportPackage exportPackage) throws IOException, CannotReadException, TagException, ReadOnlyFileException, MetadataException { - List metadatas = exportPackage.getMetadataList(); - for (Metadata metadata : metadatas) { - metadata.setOrderByFile(true); - } - Collections.sort(metadatas); - exportPackage.setMetadataList(metadatas); - imageExporter.export(exportPackage); - metadataExporter.export(exportPackage); - return ActionResult.Exported; - } - + @Autowired private ImageExporter imageExporter; + @Autowired private MetadataExporter metadataExporter; + + public ActionResult export(ExportPackage exportPackage) + throws IOException, + CannotReadException, + TagException, + ReadOnlyFileException, + MetadataException { + List metadatas = exportPackage.getMetadataList(); + for (Metadata metadata : metadatas) { + metadata.setOrderByFile(true); + } + Collections.sort(metadatas); + exportPackage.setMetadataList(metadatas); + imageExporter.export(exportPackage); + metadataExporter.export(exportPackage); + return ActionResult.Exported; + } } diff --git a/src/main/java/com/josdem/jmetadata/helper/FileChooserHelper.java b/src/main/java/com/josdem/jmetadata/helper/FileChooserHelper.java index bafb26f..717260f 100644 --- a/src/main/java/com/josdem/jmetadata/helper/FileChooserHelper.java +++ b/src/main/java/com/josdem/jmetadata/helper/FileChooserHelper.java @@ -17,16 +17,14 @@ package com.josdem.jmetadata.helper; import java.io.File; - import javax.swing.JFileChooser; public class FileChooserHelper { - public File getDirectory() { - JFileChooser fileChooser = new JFileChooser(); - fileChooser.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES); - int selection = fileChooser.showOpenDialog(null); - return (selection == JFileChooser.APPROVE_OPTION) ? fileChooser.getSelectedFile() : null; - } - + public File getDirectory() { + JFileChooser fileChooser = new JFileChooser(); + fileChooser.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES); + int selection = fileChooser.showOpenDialog(null); + return (selection == JFileChooser.APPROVE_OPTION) ? fileChooser.getSelectedFile() : null; + } } diff --git a/src/main/java/com/josdem/jmetadata/helper/FormatterHelper.java b/src/main/java/com/josdem/jmetadata/helper/FormatterHelper.java index d4698ad..0336e0b 100644 --- a/src/main/java/com/josdem/jmetadata/helper/FormatterHelper.java +++ b/src/main/java/com/josdem/jmetadata/helper/FormatterHelper.java @@ -22,28 +22,27 @@ @Component public class FormatterHelper { - public String getBasicFormat(String word) { - if(word.length() == 2){ - return word; - } - String formatted = word.replace("-", StringUtils.EMPTY); - formatted = formatted.replace("(", StringUtils.EMPTY); - formatted = formatted.replace(")", StringUtils.EMPTY); - formatted = formatted.replace("0", StringUtils.EMPTY); - formatted = formatted.replace("1", StringUtils.EMPTY); - formatted = formatted.replace("2", StringUtils.EMPTY); - formatted = formatted.replace("3", StringUtils.EMPTY); - formatted = formatted.replace("4", StringUtils.EMPTY); - formatted = formatted.replace("5", StringUtils.EMPTY); - formatted = formatted.replace("6", StringUtils.EMPTY); - formatted = formatted.replace("7", StringUtils.EMPTY); - formatted = formatted.replace("8", StringUtils.EMPTY); - formatted = formatted.replace("9", StringUtils.EMPTY); - formatted = formatted.replace("'", StringUtils.EMPTY); - formatted = formatted.replace(",", StringUtils.EMPTY); - formatted = formatted.replace("I", StringUtils.EMPTY); - formatted = formatted.replace("&", StringUtils.EMPTY); - return formatted.replace(" ", StringUtils.EMPTY); - } - + public String getBasicFormat(String word) { + if (word.length() == 2) { + return word; + } + String formatted = word.replace("-", StringUtils.EMPTY); + formatted = formatted.replace("(", StringUtils.EMPTY); + formatted = formatted.replace(")", StringUtils.EMPTY); + formatted = formatted.replace("0", StringUtils.EMPTY); + formatted = formatted.replace("1", StringUtils.EMPTY); + formatted = formatted.replace("2", StringUtils.EMPTY); + formatted = formatted.replace("3", StringUtils.EMPTY); + formatted = formatted.replace("4", StringUtils.EMPTY); + formatted = formatted.replace("5", StringUtils.EMPTY); + formatted = formatted.replace("6", StringUtils.EMPTY); + formatted = formatted.replace("7", StringUtils.EMPTY); + formatted = formatted.replace("8", StringUtils.EMPTY); + formatted = formatted.replace("9", StringUtils.EMPTY); + formatted = formatted.replace("'", StringUtils.EMPTY); + formatted = formatted.replace(",", StringUtils.EMPTY); + formatted = formatted.replace("I", StringUtils.EMPTY); + formatted = formatted.replace("&", StringUtils.EMPTY); + return formatted.replace(" ", StringUtils.EMPTY); + } } diff --git a/src/main/java/com/josdem/jmetadata/helper/ImageExporter.java b/src/main/java/com/josdem/jmetadata/helper/ImageExporter.java index 046c3c8..f1cce8e 100644 --- a/src/main/java/com/josdem/jmetadata/helper/ImageExporter.java +++ b/src/main/java/com/josdem/jmetadata/helper/ImageExporter.java @@ -16,45 +16,46 @@ package com.josdem.jmetadata.helper; +import com.josdem.jmetadata.exception.MetadataException; +import com.josdem.jmetadata.model.ExportPackage; +import com.josdem.jmetadata.model.Metadata; +import com.josdem.jmetadata.service.MetadataService; +import com.josdem.jmetadata.util.ImageUtils; import java.io.File; import java.io.IOException; import java.util.List; - -import org.springframework.stereotype.Service; -import org.springframework.beans.factory.annotation.Autowired; - import org.apache.commons.lang3.StringUtils; - -import org.jaudiotagger.tag.TagException; import org.jaudiotagger.audio.exceptions.CannotReadException; import org.jaudiotagger.audio.exceptions.ReadOnlyFileException; - -import com.josdem.jmetadata.model.Metadata; -import com.josdem.jmetadata.util.ImageUtils; -import com.josdem.jmetadata.model.ExportPackage; -import com.josdem.jmetadata.service.MetadataService; -import com.josdem.jmetadata.exception.MetadataException; +import org.jaudiotagger.tag.TagException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; @Service public class ImageExporter { - @Autowired - private MetadataService metadataService; - - private ImageUtils imageUtils = new ImageUtils(); - - public void export(ExportPackage exportPackage) throws IOException, CannotReadException, TagException, ReadOnlyFileException, MetadataException { - List metadataList = exportPackage.getMetadataList(); - if(metadataList.get(0).getCoverArt() == null){ - return; - } - File root = exportPackage.getRoot(); - if (metadataService.isSameAlbum(metadataList)){ - imageUtils.saveCoverArtToFile(metadataList.get(0).getCoverArt(), root, StringUtils.EMPTY); - } else { - for (Metadata metadata : metadataList) { - imageUtils.saveCoverArtToFile(metadata.getCoverArt(), root, metadata.getArtist() + "-" + metadata.getTitle()); - } - } - } + @Autowired private MetadataService metadataService; + + private ImageUtils imageUtils = new ImageUtils(); + + public void export(ExportPackage exportPackage) + throws IOException, + CannotReadException, + TagException, + ReadOnlyFileException, + MetadataException { + List metadataList = exportPackage.getMetadataList(); + if (metadataList.get(0).getCoverArt() == null) { + return; + } + File root = exportPackage.getRoot(); + if (metadataService.isSameAlbum(metadataList)) { + imageUtils.saveCoverArtToFile(metadataList.get(0).getCoverArt(), root, StringUtils.EMPTY); + } else { + for (Metadata metadata : metadataList) { + imageUtils.saveCoverArtToFile( + metadata.getCoverArt(), root, metadata.getArtist() + "-" + metadata.getTitle()); + } + } + } } diff --git a/src/main/java/com/josdem/jmetadata/helper/LastFMAlbumHelper.java b/src/main/java/com/josdem/jmetadata/helper/LastFMAlbumHelper.java index a66b928..9395990 100644 --- a/src/main/java/com/josdem/jmetadata/helper/LastFMAlbumHelper.java +++ b/src/main/java/com/josdem/jmetadata/helper/LastFMAlbumHelper.java @@ -16,47 +16,47 @@ package com.josdem.jmetadata.helper; -import de.umass.lastfm.Album; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; import com.josdem.jmetadata.Auth; import com.josdem.jmetadata.model.GenreTypes; -import org.springframework.stereotype.Component; - +import de.umass.lastfm.Album; import java.text.SimpleDateFormat; import java.util.Collection; import java.util.Date; import java.util.Iterator; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Component; @Slf4j @Component public class LastFMAlbumHelper { - public Album getAlbum(String artist, String album) { - return Album.getInfo(artist, album, Auth.KEY); - } + public Album getAlbum(String artist, String album) { + return Album.getInfo(artist, album, Auth.KEY); + } - public String getYear(Date releaseDate) { - if (releaseDate == null) { - return StringUtils.EMPTY; - } - SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy"); - String year = simpleDateFormat.format(releaseDate); - log.info("Year: {}", year); - return year; + public String getYear(Date releaseDate) { + if (releaseDate == null) { + return StringUtils.EMPTY; } - - public String getGenre(Album album) { - Collection tags = album.getTags(); - Iterator iterator = tags.iterator(); - while (iterator.hasNext()) { - String lastFmTag = iterator.next().toLowerCase(); - log.info("lastFmTag: {}", lastFmTag); - if (GenreTypes.getGenreByName(lastFmTag) != GenreTypes.UNKNOWN) { - log.info("lastFmTag matched in GenreTypes: {}", GenreTypes.getGenreByName(lastFmTag).getName()); - return GenreTypes.getGenreByName(lastFmTag).getName(); - } - } - return StringUtils.EMPTY; + SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy"); + String year = simpleDateFormat.format(releaseDate); + log.info("Year: {}", year); + return year; + } + + public String getGenre(Album album) { + Collection tags = album.getTags(); + Iterator iterator = tags.iterator(); + while (iterator.hasNext()) { + String lastFmTag = iterator.next().toLowerCase(); + log.info("lastFmTag: {}", lastFmTag); + if (GenreTypes.getGenreByName(lastFmTag) != GenreTypes.UNKNOWN) { + log.info( + "lastFmTag matched in GenreTypes: {}", GenreTypes.getGenreByName(lastFmTag).getName()); + return GenreTypes.getGenreByName(lastFmTag).getName(); + } } -} \ No newline at end of file + return StringUtils.EMPTY; + } +} diff --git a/src/main/java/com/josdem/jmetadata/helper/LastFMAuthenticator.java b/src/main/java/com/josdem/jmetadata/helper/LastFMAuthenticator.java index 38db6f0..ca40cc2 100644 --- a/src/main/java/com/josdem/jmetadata/helper/LastFMAuthenticator.java +++ b/src/main/java/com/josdem/jmetadata/helper/LastFMAuthenticator.java @@ -17,23 +17,20 @@ package com.josdem.jmetadata.helper; import de.umass.lastfm.Session; +import java.io.IOException; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import java.io.IOException; - @Component public class LastFMAuthenticator { - @Autowired - private AuthenticatorHelper authenticatorHelper; + @Autowired private AuthenticatorHelper authenticatorHelper; - public Session login(String username, String password) throws IOException { - if (StringUtils.isEmpty(username) || StringUtils.isEmpty(password)) { - return null; - } - return authenticatorHelper.getSession(username, password); + public Session login(String username, String password) throws IOException { + if (StringUtils.isEmpty(username) || StringUtils.isEmpty(password)) { + return null; } - + return authenticatorHelper.getSession(username, password); + } } diff --git a/src/main/java/com/josdem/jmetadata/helper/LastFMTrackHelper.java b/src/main/java/com/josdem/jmetadata/helper/LastFMTrackHelper.java index 8a833a1..0be517a 100644 --- a/src/main/java/com/josdem/jmetadata/helper/LastFMTrackHelper.java +++ b/src/main/java/com/josdem/jmetadata/helper/LastFMTrackHelper.java @@ -22,8 +22,7 @@ public class LastFMTrackHelper { - public ScrobbleResult scrobble(String artist, String title, int time, Session session) { - return Track.scrobble(artist, title, time, session); - } - + public ScrobbleResult scrobble(String artist, String title, int time, Session session) { + return Track.scrobble(artist, title, time, session); + } } diff --git a/src/main/java/com/josdem/jmetadata/helper/MetadataAdapter.java b/src/main/java/com/josdem/jmetadata/helper/MetadataAdapter.java index a207250..ba5393e 100644 --- a/src/main/java/com/josdem/jmetadata/helper/MetadataAdapter.java +++ b/src/main/java/com/josdem/jmetadata/helper/MetadataAdapter.java @@ -21,34 +21,33 @@ public class MetadataAdapter { - public void update(Metadata metadata, int column, String value) { - if(column == ApplicationConstants.ARTIST_COLUMN){ - metadata.setArtist(value); - } - if (column == ApplicationConstants.TITLE_COLUMN){ - metadata.setTitle(value); - } - if (column == ApplicationConstants.ALBUM_COLUMN){ - metadata.setAlbum(value); - } - if (column == ApplicationConstants.YEAR_COLUMN){ - metadata.setYear(value); - } - if (column == ApplicationConstants.TRACK_NUMBER_COLUMN){ - metadata.setTrackNumber(value); - } - if (column == ApplicationConstants.TOTAL_TRACKS_NUMBER_COLUMN){ - metadata.setTotalTracks(value); - } - if (column == ApplicationConstants.CD_NUMBER_COLUMN){ - metadata.setCdNumber(value); - } - if (column == ApplicationConstants.TOTAL_CDS_NUMBER_COLUMN){ - metadata.setTotalCds(value); - } - if (column == ApplicationConstants.GENRE_COLUMN){ - metadata.setGenre(value); - } - } - + public void update(Metadata metadata, int column, String value) { + if (column == ApplicationConstants.ARTIST_COLUMN) { + metadata.setArtist(value); + } + if (column == ApplicationConstants.TITLE_COLUMN) { + metadata.setTitle(value); + } + if (column == ApplicationConstants.ALBUM_COLUMN) { + metadata.setAlbum(value); + } + if (column == ApplicationConstants.YEAR_COLUMN) { + metadata.setYear(value); + } + if (column == ApplicationConstants.TRACK_NUMBER_COLUMN) { + metadata.setTrackNumber(value); + } + if (column == ApplicationConstants.TOTAL_TRACKS_NUMBER_COLUMN) { + metadata.setTotalTracks(value); + } + if (column == ApplicationConstants.CD_NUMBER_COLUMN) { + metadata.setCdNumber(value); + } + if (column == ApplicationConstants.TOTAL_CDS_NUMBER_COLUMN) { + metadata.setTotalCds(value); + } + if (column == ApplicationConstants.GENRE_COLUMN) { + metadata.setGenre(value); + } + } } diff --git a/src/main/java/com/josdem/jmetadata/helper/MetadataExporter.java b/src/main/java/com/josdem/jmetadata/helper/MetadataExporter.java index 16a70d8..9f86baa 100644 --- a/src/main/java/com/josdem/jmetadata/helper/MetadataExporter.java +++ b/src/main/java/com/josdem/jmetadata/helper/MetadataExporter.java @@ -16,75 +16,72 @@ package com.josdem.jmetadata.helper; +import com.josdem.jmetadata.ApplicationConstants; +import com.josdem.jmetadata.exception.MetadataException; +import com.josdem.jmetadata.model.ExportPackage; +import com.josdem.jmetadata.model.Metadata; +import com.josdem.jmetadata.service.FormatterService; +import com.josdem.jmetadata.service.MetadataService; +import com.josdem.jmetadata.util.FileUtils; import java.io.File; import java.io.IOException; import java.io.OutputStream; import java.util.List; - +import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; - -import org.springframework.stereotype.Service; -import org.springframework.beans.factory.annotation.Autowired; - -import org.jaudiotagger.tag.TagException; import org.jaudiotagger.audio.exceptions.CannotReadException; import org.jaudiotagger.audio.exceptions.ReadOnlyFileException; - -import com.josdem.jmetadata.model.Metadata; -import com.josdem.jmetadata.util.FileUtils; -import com.josdem.jmetadata.ApplicationConstants; -import com.josdem.jmetadata.model.ExportPackage; -import com.josdem.jmetadata.service.MetadataService; -import com.josdem.jmetadata.service.FormatterService; -import com.josdem.jmetadata.exception.MetadataException; - -import lombok.extern.slf4j.Slf4j; +import org.jaudiotagger.tag.TagException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; @Slf4j - @Service public class MetadataExporter { - private static final String NEW_LINE = "\n"; - private static final String DASH = " - "; - private static final String DOT = ". "; - private static final String PAR_OPEN = " ("; - private static final String PAR_CLOSE = ")"; - private static final String BY = " by "; - private FileUtils fileUtils = new FileUtils(); - private OutStreamWriter outputStreamWriter = new OutStreamWriter(); - - @Autowired - private MetadataService metadataService; - @Autowired - private FormatterService formatter; - - - public void export(ExportPackage exportPackage) throws IOException, CannotReadException, TagException, ReadOnlyFileException, MetadataException { - File file = fileUtils.createFile(exportPackage.getRoot(), StringUtils.EMPTY, ApplicationConstants.FILE_EXT); - log.info("Exporting metadata to: " + file.getAbsolutePath()); - OutputStream writer = outputStreamWriter.getWriter(file); - int counter = 1; - List metadatas = exportPackage.getMetadataList(); - if(metadataService.isSameAlbum(metadatas)){ - writer.write(metadatas.get(0).getAlbum().getBytes()); - writer.write(BY.getBytes()); - writer.write(metadatas.get(0).getArtist().getBytes()); - writer.write(NEW_LINE.getBytes()); - writer.write(NEW_LINE.getBytes()); - } - for (Metadata metadata : metadatas) { - writer.write(Integer.toString(counter++).getBytes()); - writer.write(DOT.getBytes()); - writer.write(metadata.getArtist().getBytes()); - writer.write(DASH.getBytes()); - writer.write(metadata.getTitle().getBytes()); - writer.write(PAR_OPEN.getBytes()); - writer.write(formatter.getDuration(metadata.getLength()).getBytes()); - writer.write(PAR_CLOSE.getBytes()); - writer.write(NEW_LINE.getBytes()); - } - writer.flush(); - writer.close(); - } - + private static final String NEW_LINE = "\n"; + private static final String DASH = " - "; + private static final String DOT = ". "; + private static final String PAR_OPEN = " ("; + private static final String PAR_CLOSE = ")"; + private static final String BY = " by "; + private FileUtils fileUtils = new FileUtils(); + private OutStreamWriter outputStreamWriter = new OutStreamWriter(); + + @Autowired private MetadataService metadataService; + @Autowired private FormatterService formatter; + + public void export(ExportPackage exportPackage) + throws IOException, + CannotReadException, + TagException, + ReadOnlyFileException, + MetadataException { + File file = + fileUtils.createFile( + exportPackage.getRoot(), StringUtils.EMPTY, ApplicationConstants.FILE_EXT); + log.info("Exporting metadata to: " + file.getAbsolutePath()); + OutputStream writer = outputStreamWriter.getWriter(file); + int counter = 1; + List metadatas = exportPackage.getMetadataList(); + if (metadataService.isSameAlbum(metadatas)) { + writer.write(metadatas.get(0).getAlbum().getBytes()); + writer.write(BY.getBytes()); + writer.write(metadatas.get(0).getArtist().getBytes()); + writer.write(NEW_LINE.getBytes()); + writer.write(NEW_LINE.getBytes()); + } + for (Metadata metadata : metadatas) { + writer.write(Integer.toString(counter++).getBytes()); + writer.write(DOT.getBytes()); + writer.write(metadata.getArtist().getBytes()); + writer.write(DASH.getBytes()); + writer.write(metadata.getTitle().getBytes()); + writer.write(PAR_OPEN.getBytes()); + writer.write(formatter.getDuration(metadata.getLength()).getBytes()); + writer.write(PAR_CLOSE.getBytes()); + writer.write(NEW_LINE.getBytes()); + } + writer.flush(); + writer.close(); + } } diff --git a/src/main/java/com/josdem/jmetadata/helper/MetadataHelper.java b/src/main/java/com/josdem/jmetadata/helper/MetadataHelper.java index 71e151f..f295f48 100644 --- a/src/main/java/com/josdem/jmetadata/helper/MetadataHelper.java +++ b/src/main/java/com/josdem/jmetadata/helper/MetadataHelper.java @@ -17,21 +17,19 @@ package com.josdem.jmetadata.helper; import com.josdem.jmetadata.model.MetadataAlbumValues; -import org.springframework.stereotype.Service; - import java.io.File; import java.util.HashSet; import java.util.Set; +import org.springframework.stereotype.Service; @Service public class MetadataHelper { - public Set createHashSet() { - return new HashSet<>(); - } - - public MetadataAlbumValues createMetadataAlbumValues() { - return new MetadataAlbumValues(); - } + public Set createHashSet() { + return new HashSet<>(); + } + public MetadataAlbumValues createMetadataAlbumValues() { + return new MetadataAlbumValues(); + } } diff --git a/src/main/java/com/josdem/jmetadata/helper/OutStreamWriter.java b/src/main/java/com/josdem/jmetadata/helper/OutStreamWriter.java index b365276..01213e6 100644 --- a/src/main/java/com/josdem/jmetadata/helper/OutStreamWriter.java +++ b/src/main/java/com/josdem/jmetadata/helper/OutStreamWriter.java @@ -23,8 +23,7 @@ public class OutStreamWriter { - public OutputStream getWriter(File file) throws FileNotFoundException { - return new FileOutputStream(file); - } - + public OutputStream getWriter(File file) throws FileNotFoundException { + return new FileOutputStream(file); + } } diff --git a/src/main/java/com/josdem/jmetadata/helper/ReaderHelper.java b/src/main/java/com/josdem/jmetadata/helper/ReaderHelper.java index ab68b43..748609e 100644 --- a/src/main/java/com/josdem/jmetadata/helper/ReaderHelper.java +++ b/src/main/java/com/josdem/jmetadata/helper/ReaderHelper.java @@ -24,17 +24,16 @@ @Service public class ReaderHelper { - public String getGenre(Tag tag, String genre) { - try{ - if (genre != null && genre.startsWith("(")) { - int index = Integer.valueOf(genre.substring(genre.indexOf('(') + 1, genre.indexOf(')'))); - return GenreTypes.getGenreByCode(index); - } else { - return tag.getFirst(FieldKey.GENRE); - } - } catch (NumberFormatException nue){ - return tag.getFirst(FieldKey.GENRE); - } - } - + public String getGenre(Tag tag, String genre) { + try { + if (genre != null && genre.startsWith("(")) { + int index = Integer.valueOf(genre.substring(genre.indexOf('(') + 1, genre.indexOf(')'))); + return GenreTypes.getGenreByCode(index); + } else { + return tag.getFirst(FieldKey.GENRE); + } + } catch (NumberFormatException nue) { + return tag.getFirst(FieldKey.GENRE); + } + } } diff --git a/src/main/java/com/josdem/jmetadata/helper/RetrofitHelper.java b/src/main/java/com/josdem/jmetadata/helper/RetrofitHelper.java index 5e9a569..a39e6c7 100644 --- a/src/main/java/com/josdem/jmetadata/helper/RetrofitHelper.java +++ b/src/main/java/com/josdem/jmetadata/helper/RetrofitHelper.java @@ -20,12 +20,12 @@ import retrofit2.converter.gson.GsonConverterFactory; public class RetrofitHelper { - private static final String BASE_URL = "https://musicbrainz.org/ws/2/"; + private static final String BASE_URL = "https://musicbrainz.org/ws/2/"; - public static Retrofit getRetrofit() { - return new Retrofit.Builder() - .baseUrl(BASE_URL) - .addConverterFactory(GsonConverterFactory.create()) - .build(); - } + public static Retrofit getRetrofit() { + return new Retrofit.Builder() + .baseUrl(BASE_URL) + .addConverterFactory(GsonConverterFactory.create()) + .build(); + } } diff --git a/src/main/java/com/josdem/jmetadata/helper/ScrobblerHelper.java b/src/main/java/com/josdem/jmetadata/helper/ScrobblerHelper.java index a1be531..f2980e8 100644 --- a/src/main/java/com/josdem/jmetadata/helper/ScrobblerHelper.java +++ b/src/main/java/com/josdem/jmetadata/helper/ScrobblerHelper.java @@ -16,105 +16,114 @@ package com.josdem.jmetadata.helper; -import java.util.Map; -import java.util.HashMap; +import com.josdem.jmetadata.action.ActionResult; +import com.josdem.jmetadata.model.Metadata; +import com.josdem.jmetadata.model.Model; +import com.josdem.jmetadata.model.User; +import de.umass.lastfm.Session; +import de.umass.lastfm.scrobble.ScrobbleResult; import java.io.IOException; +import java.util.HashMap; +import java.util.Map; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledFuture; import java.util.concurrent.TimeUnit; - +import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.asmatron.messengine.ControlEngine; - import org.springframework.stereotype.Service; -import de.umass.lastfm.Session; -import de.umass.lastfm.scrobble.ScrobbleResult; - -import com.josdem.jmetadata.model.User; -import com.josdem.jmetadata.model.Model; -import com.josdem.jmetadata.model.Metadata; -import com.josdem.jmetadata.action.ActionResult; - -import lombok.extern.slf4j.Slf4j; - @Slf4j /** -* @understands A class who knows how to send scrobblings -*/ - + * @understands A class who knows how to send scrobblings + */ @Service public class ScrobblerHelper { - private static final int ONE_THOUSAND = 1000; - private static final int MIN_LENGHT = 240; - private static final int REQUEST_PERIOD = 250; - private Map metadataMap = new HashMap(); - private LastFMTrackHelper lastFMTrackHelper = new LastFMTrackHelper(); - private ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor(); - private static final int DELTA = 120; - - private ControlEngine controlEngine; - - private ActionResult scrobbling(Metadata metadata) throws IOException, InterruptedException { - User currentUser = controlEngine.get(Model.CURRENT_USER); - if (StringUtils.isEmpty(currentUser.getUsername())) { - return ActionResult.NotLogged; - } - - if (currentUser.getSession() != null) { - try { - // According to Caching Rule (http://www.u-mass.de/lastfm/doc) - ScheduledFuture future = scheduler.schedule(new ScrobbleTask(metadata, currentUser.getSession()), REQUEST_PERIOD, TimeUnit.MICROSECONDS); - return future.get(); - } catch (ExecutionException eex) { - log.error(eex.getMessage(), eex); - return ActionResult.Error; - } - } else { - log.error("There isn't a valid session"); - return ActionResult.Sessionless; - } - } - - public ActionResult send(Metadata metadata) throws IOException, InterruptedException { - long time = (System.currentTimeMillis() / ONE_THOUSAND); - - // According to submission rules http://www.last.fm/api/submissions - if (StringUtils.isNotEmpty(metadata.getArtist()) && StringUtils.isNotEmpty(metadata.getTitle()) && metadata.getLength() > MIN_LENGHT) { - long startTime = time - (metadataMap.size() * DELTA); - metadataMap.put(metadata, startTime); - return scrobbling(metadata); - } - return ActionResult.Not_Scrobbleable; - } - - public void setControlEngine(ControlEngine controlEngine) { - this.controlEngine = controlEngine; - } - - private class ScrobbleTask implements Callable { - private final Metadata metadata; - private final Session session; - - public ScrobbleTask(Metadata metadata, Session session) { - this.metadata = metadata; - this.session = session; - } - - @Override - public ActionResult call() throws Exception { - ScrobbleResult result = lastFMTrackHelper.scrobble(metadata.getArtist(), metadata.getTitle(), metadataMap.get(metadata).intValue(), session); - if (result.isSuccessful() && !result.isIgnored()) { - log.debug(metadata.getArtist() + " - " + metadata.getTitle() + " scrobbling to Last.fm was Successful"); - return ActionResult.Sent; - } else { - log.error("Submitting track " + metadata.getTitle() + " to Last.fm failed: " + result); - return ActionResult.Error; - } - } - } + private static final int ONE_THOUSAND = 1000; + private static final int MIN_LENGHT = 240; + private static final int REQUEST_PERIOD = 250; + private Map metadataMap = new HashMap(); + private LastFMTrackHelper lastFMTrackHelper = new LastFMTrackHelper(); + private ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor(); + private static final int DELTA = 120; + + private ControlEngine controlEngine; + + private ActionResult scrobbling(Metadata metadata) throws IOException, InterruptedException { + User currentUser = controlEngine.get(Model.CURRENT_USER); + if (StringUtils.isEmpty(currentUser.getUsername())) { + return ActionResult.NotLogged; + } + + if (currentUser.getSession() != null) { + try { + // According to Caching Rule (http://www.u-mass.de/lastfm/doc) + ScheduledFuture future = + scheduler.schedule( + new ScrobbleTask(metadata, currentUser.getSession()), + REQUEST_PERIOD, + TimeUnit.MICROSECONDS); + return future.get(); + } catch (ExecutionException eex) { + log.error(eex.getMessage(), eex); + return ActionResult.Error; + } + } else { + log.error("There isn't a valid session"); + return ActionResult.Sessionless; + } + } + + public ActionResult send(Metadata metadata) throws IOException, InterruptedException { + long time = (System.currentTimeMillis() / ONE_THOUSAND); + + // According to submission rules http://www.last.fm/api/submissions + if (StringUtils.isNotEmpty(metadata.getArtist()) + && StringUtils.isNotEmpty(metadata.getTitle()) + && metadata.getLength() > MIN_LENGHT) { + long startTime = time - (metadataMap.size() * DELTA); + metadataMap.put(metadata, startTime); + return scrobbling(metadata); + } + return ActionResult.Not_Scrobbleable; + } + + public void setControlEngine(ControlEngine controlEngine) { + this.controlEngine = controlEngine; + } + + private class ScrobbleTask implements Callable { + private final Metadata metadata; + private final Session session; + + public ScrobbleTask(Metadata metadata, Session session) { + this.metadata = metadata; + this.session = session; + } + + @Override + public ActionResult call() throws Exception { + ScrobbleResult result = + lastFMTrackHelper.scrobble( + metadata.getArtist(), + metadata.getTitle(), + metadataMap.get(metadata).intValue(), + session); + if (result.isSuccessful() && !result.isIgnored()) { + log.debug( + metadata.getArtist() + + " - " + + metadata.getTitle() + + " scrobbling to Last.fm was Successful"); + return ActionResult.Sent; + } else { + log.error("Submitting track " + metadata.getTitle() + " to Last.fm failed: " + result); + return ActionResult.Error; + } + } + } } diff --git a/src/main/java/com/josdem/jmetadata/laf/HipecotechLookAndFeel.java b/src/main/java/com/josdem/jmetadata/laf/HipecotechLookAndFeel.java index 496d674..93be537 100644 --- a/src/main/java/com/josdem/jmetadata/laf/HipecotechLookAndFeel.java +++ b/src/main/java/com/josdem/jmetadata/laf/HipecotechLookAndFeel.java @@ -17,28 +17,28 @@ package com.josdem.jmetadata.laf; import java.text.ParseException; - import javax.swing.plaf.synth.SynthLookAndFeel; public class HipecotechLookAndFeel extends SynthLookAndFeel { - private static final long serialVersionUID = -4532847419431106496L; - - public HipecotechLookAndFeel() throws ParseException { - load(HipecotechLookAndFeel.class.getResourceAsStream("/style/Hipecotech.xml"), HipecotechLookAndFeel.class); - } - - @Override - public String getName() { - return "Hipecotech"; - } - - @Override - public String getID() { - return "Hipecotech"; - } - - public String getDescription() { - return "Hipecotech Look and Feel"; - } - + private static final long serialVersionUID = -4532847419431106496L; + + public HipecotechLookAndFeel() throws ParseException { + load( + HipecotechLookAndFeel.class.getResourceAsStream("/style/Hipecotech.xml"), + HipecotechLookAndFeel.class); + } + + @Override + public String getName() { + return "Hipecotech"; + } + + @Override + public String getID() { + return "Hipecotech"; + } + + public String getDescription() { + return "Hipecotech Look and Feel"; + } } diff --git a/src/main/java/com/josdem/jmetadata/laf/painter/DeviceProgressBarPainter.java b/src/main/java/com/josdem/jmetadata/laf/painter/DeviceProgressBarPainter.java index a509fed..f1d28aa 100644 --- a/src/main/java/com/josdem/jmetadata/laf/painter/DeviceProgressBarPainter.java +++ b/src/main/java/com/josdem/jmetadata/laf/painter/DeviceProgressBarPainter.java @@ -1,51 +1,51 @@ -/* - Copyright 2013 Jose Luis De la Cruz Morales joseluis.delacruz@gmail.com - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -package com.josdem.jmetadata.laf.painter; - -import java.awt.Color; -import java.awt.Graphics; -import java.awt.Graphics2D; -import java.awt.RenderingHints; - -import javax.swing.JSlider; -import javax.swing.plaf.synth.SynthContext; - -public class DeviceProgressBarPainter extends ProgressBarPainter { - - @Override - public void paintSliderTrackBackground(SynthContext context, Graphics g, int x, int y, int w, int h, int orientation) { - Graphics2D g2 = (Graphics2D) g; - JSlider slider = (JSlider) context.getComponent(); - g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); - g2.setPaint(getBorderGradientPaint()); - g2.fill(getBorderPath(slider)); - g2.setColor(new Color(0xb9, 0xb9, 0xb9)); - g2.fill(getBackgroundPath(slider)); - } - - @Override - public void paintSliderThumbBackground(SynthContext context, Graphics g, int x, int y, int w, int h, int orientation) { - Graphics2D g2 = (Graphics2D) g; - JSlider slider = (JSlider)context.getComponent(); - g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); - g2.setPaint(getPurpleProgressGradientPaint()); - g2.fill(getProgressPath(slider)); - g2.setPaint(getBrightInPurpleProgressGradientPaint()); - g2.fill(getBrightInProgressPath(slider)); - } - -} +/* + Copyright 2013 Jose Luis De la Cruz Morales joseluis.delacruz@gmail.com + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +package com.josdem.jmetadata.laf.painter; + +import java.awt.Color; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.RenderingHints; +import javax.swing.JSlider; +import javax.swing.plaf.synth.SynthContext; + +public class DeviceProgressBarPainter extends ProgressBarPainter { + + @Override + public void paintSliderTrackBackground( + SynthContext context, Graphics g, int x, int y, int w, int h, int orientation) { + Graphics2D g2 = (Graphics2D) g; + JSlider slider = (JSlider) context.getComponent(); + g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); + g2.setPaint(getBorderGradientPaint()); + g2.fill(getBorderPath(slider)); + g2.setColor(new Color(0xb9, 0xb9, 0xb9)); + g2.fill(getBackgroundPath(slider)); + } + + @Override + public void paintSliderThumbBackground( + SynthContext context, Graphics g, int x, int y, int w, int h, int orientation) { + Graphics2D g2 = (Graphics2D) g; + JSlider slider = (JSlider) context.getComponent(); + g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); + g2.setPaint(getPurpleProgressGradientPaint()); + g2.fill(getProgressPath(slider)); + g2.setPaint(getBrightInPurpleProgressGradientPaint()); + g2.fill(getBrightInProgressPath(slider)); + } +} diff --git a/src/main/java/com/josdem/jmetadata/laf/painter/ProgresSliderPainter.java b/src/main/java/com/josdem/jmetadata/laf/painter/ProgresSliderPainter.java index 34dd376..e023a43 100644 --- a/src/main/java/com/josdem/jmetadata/laf/painter/ProgresSliderPainter.java +++ b/src/main/java/com/josdem/jmetadata/laf/painter/ProgresSliderPainter.java @@ -1,47 +1,48 @@ -/* - Copyright 2013 Jose Luis De la Cruz Morales joseluis.delacruz@gmail.com - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -package com.josdem.jmetadata.laf.painter; - -import java.awt.Color; -import java.awt.Graphics; - -import javax.swing.JSlider; -import javax.swing.plaf.synth.SynthContext; -import javax.swing.plaf.synth.SynthPainter; - -public class ProgresSliderPainter extends SynthPainter { - Color color = new Color(0xaa, 0xaa, 0xaa); - - @Override - public void paintSliderTrackBackground(SynthContext context, Graphics g, int x, int y, int w, int h, int orientation) { - JSlider progressSlider = (JSlider) context.getComponent(); - double currentValue = progressSlider.getValue(); - double maximun = progressSlider.getMaximum(); - double minimum = progressSlider.getMinimum(); - int fillValue = (int) (w * (currentValue - minimum) / (maximun - minimum)); - //let painting the component fully - h -= 1; - g.setColor(color); - g.drawRoundRect(x, y, w, h, 4, 4); - g.fillRoundRect(x, y, fillValue, h, 4, 4); - } - - @Override - public void paintSliderThumbBackground(SynthContext context, Graphics g, int x, int y, int w, int h, int orientation) { - //do nothing, we don't want a thumb - } -} +/* + Copyright 2013 Jose Luis De la Cruz Morales joseluis.delacruz@gmail.com + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +package com.josdem.jmetadata.laf.painter; + +import java.awt.Color; +import java.awt.Graphics; +import javax.swing.JSlider; +import javax.swing.plaf.synth.SynthContext; +import javax.swing.plaf.synth.SynthPainter; + +public class ProgresSliderPainter extends SynthPainter { + Color color = new Color(0xaa, 0xaa, 0xaa); + + @Override + public void paintSliderTrackBackground( + SynthContext context, Graphics g, int x, int y, int w, int h, int orientation) { + JSlider progressSlider = (JSlider) context.getComponent(); + double currentValue = progressSlider.getValue(); + double maximun = progressSlider.getMaximum(); + double minimum = progressSlider.getMinimum(); + int fillValue = (int) (w * (currentValue - minimum) / (maximun - minimum)); + // let painting the component fully + h -= 1; + g.setColor(color); + g.drawRoundRect(x, y, w, h, 4, 4); + g.fillRoundRect(x, y, fillValue, h, 4, 4); + } + + @Override + public void paintSliderThumbBackground( + SynthContext context, Graphics g, int x, int y, int w, int h, int orientation) { + // do nothing, we don't want a thumb + } +} diff --git a/src/main/java/com/josdem/jmetadata/laf/painter/ProgressBarPainter.java b/src/main/java/com/josdem/jmetadata/laf/painter/ProgressBarPainter.java index 0c9ad1a..ee84a85 100644 --- a/src/main/java/com/josdem/jmetadata/laf/painter/ProgressBarPainter.java +++ b/src/main/java/com/josdem/jmetadata/laf/painter/ProgressBarPainter.java @@ -1,210 +1,309 @@ -/* - Copyright 2013 Jose Luis De la Cruz Morales joseluis.delacruz@gmail.com - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -package com.josdem.jmetadata.laf.painter; - -import java.awt.Color; -import java.awt.Graphics; -import java.awt.Graphics2D; -import java.awt.LinearGradientPaint; -import java.awt.RenderingHints; -import java.awt.geom.GeneralPath; - -import javax.swing.JSlider; -import javax.swing.plaf.synth.SynthContext; -import javax.swing.plaf.synth.SynthPainter; - -public class ProgressBarPainter extends SynthPainter { - - @Override - public void paintSliderTrackBackground(SynthContext context, Graphics g, int x, int y, int w, int h, int orientation) { - Graphics2D g2 = (Graphics2D) g; - JSlider slider = (JSlider) context.getComponent(); - g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); - g2.setPaint(slider.isEnabled() ? getBorderGradientPaint() : getDisabledBorderGradientPaint()); - g2.fill(getBorderPath(slider)); - g2.setColor(slider.isEnabled() ? new Color(0xb9, 0xb9, 0xb9) : new Color(0xf3, 0xf3, 0xf3)); - g2.fill(getBackgroundPath(slider)); - } - - @Override - public void paintSliderThumbBackground(SynthContext context, Graphics g, int x, int y, int w, int h, int orientation) { - Graphics2D g2 = (Graphics2D) g; - JSlider slider = (JSlider)context.getComponent(); - g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); - g2.setPaint(slider.isEnabled() ? getPurpleProgressGradientPaint() : getGrayProgressGradientPaint()); - g2.fill(getProgressPath(slider)); - g2.setPaint(slider.isEnabled() ? getBrightInPurpleProgressGradientPaint() : getBrightInGrayProgressGradientPaint()); - g2.fill(getBrightInProgressPath(slider)); - } - - private int getProgressFromSlider(JSlider progressSlider) { - double currentValue = progressSlider.getValue(); - double sliderWidth = progressSlider.getSize().getWidth(); - int fillValue = (int) (currentValue*sliderWidth/100); - //TODO FIXME Ugly patch for avoiding alias in progress when the bar is at is minimum size; - int curveGap = 3; - return fillValue > curveGap ? fillValue : curveGap; - } - - protected GeneralPath getBorderPath(JSlider slider) { - GeneralPath gp = new GeneralPath(); - double sliderWidth = slider.getWidth(); - double sliderHeight = slider.getHeight(); - double gap = 2.5; - double zero = 0.00; - - gp.moveTo(sliderWidth, sliderHeight/2); - gp.curveTo(sliderWidth, sliderHeight-gap, sliderWidth-gap, sliderHeight, sliderWidth-gap*2, sliderHeight); - gp.lineTo(gap*2, sliderHeight); - gp.curveTo(gap, sliderHeight, zero, sliderHeight-gap, zero, sliderHeight/2); - gp.lineTo(zero, sliderHeight/2); - gp.curveTo(zero, gap, gap, zero, gap*2, zero); - gp.lineTo(sliderWidth-gap*2, zero); - gp.curveTo(sliderWidth-gap, zero, sliderWidth, gap, sliderWidth, sliderHeight/2); - gp.closePath(); - return gp; - } - - protected GeneralPath getBackgroundPath(JSlider slider) { - GeneralPath gp2 = new GeneralPath(); - double sliderWidth = slider.getWidth(); - double sliderHeight = slider.getHeight(); - double gap = 2.5; - double border = 1.00; - - gp2.moveTo(sliderWidth-border, sliderHeight/2); - gp2.curveTo(sliderWidth-border, sliderHeight-gap, sliderWidth-gap, sliderHeight-border, sliderWidth-2*gap, sliderHeight-border); - gp2.lineTo(2*gap, sliderHeight-border); - gp2.curveTo(gap, sliderHeight-border, border, sliderHeight-gap, border, sliderHeight/2); - gp2.lineTo(border, sliderHeight/2); - gp2.curveTo(border, gap, gap, border, gap*2, border); - gp2.lineTo(sliderWidth-gap*2, border); - gp2.curveTo(sliderWidth-gap, border, sliderWidth-border, gap, sliderWidth-border, sliderHeight/2); - gp2.closePath(); - return gp2; - } - - protected LinearGradientPaint getBorderGradientPaint() { - float fractions[] = { 0.000f, 0.0553f, 0.1111f, 0.1673f, 0.2240f, 0.2814f, 0.3393f, 0.3979f, 0.4573f, 0.5176f, 0.5789f, - 0.6414f, 0.7055f, 0.7715f, 0.8402f, 0.9133f, 1.000f }; - - Color colors[] = { Color.WHITE, new Color(0xf1, 0xf1, 0xf1), new Color(0xe3, 0xe3, 0xe3), new Color(0xd5, 0xd5, 0xd5), - new Color(0xc8, 0xc7, 0xc7), new Color(0xba, 0xb9, 0xb9), new Color(0xac, 0xab, 0xab), - new Color(0x9e, 0x9d, 0x9d), new Color(0x91, 0x8f, 0x8f), new Color(0x83, 0x81, 0x81), - new Color(0x75, 0x73, 0x73), new Color(0x67, 0x65, 0x65), new Color(0x5a, 0x57, 0x57), - new Color(0x4c, 0x49, 0x49), new Color(0x3e, 0x3b, 0x3b), new Color(0x30, 0x2d, 0x2d), - new Color(0x23, 0x1f, 0x20) }; - LinearGradientPaint gradientPaint = new LinearGradientPaint(70.00f, 11.95f, 70.00f, -8.46f, fractions, colors); - return gradientPaint; - } - - protected LinearGradientPaint getPurpleProgressGradientPaint() { - float fractions[] = { 0.000f, 0.0418f, 0.0845f, 0.1283f, 0.1732f, 0.2194f, 0.2671f, 0.3164f, 0.3676f, 0.4210f, 0.4771f, - 0.5365f, 0.6001f, 0.6694f, 0.7471f, 0.8401f, 1.000f }; - Color colors[] = { new Color(0xb8, 0x0, 0xb8), new Color(0xaf, 0x1, 0xb0), new Color(0xa6, 0x2, 0xa8), - new Color(0x9d, 0x3, 0xa1), new Color(0x94, 0x4, 0x99), new Color(0x8b, 0x5, 0x91), new Color(0x82, 0x6, 0x8a), - new Color(0x79, 0x7, 0x82), new Color(0x71, 0x8, 0x7b), new Color(0x68, 0x9, 0x73), new Color(0x5f, 0xa, 0x6b), - new Color(0x56, 0xb, 0x64), new Color(0x4d, 0xc, 0x5c), new Color(0x44, 0xd, 0x54), new Color(0x3b, 0xe, 0x4d), - new Color(0x32, 0xf, 0x45), new Color(0x2a, 0x11, 0x3e) }; - LinearGradientPaint gradientPaint = new LinearGradientPaint(44.00f, 10.31f, 44.00f, 1.43f, fractions, colors); - return gradientPaint; - } - - protected GeneralPath getProgressPath(JSlider slider) { - GeneralPath gp = new GeneralPath(); - double sliderWidth = slider.getWidth(); - double sliderHeight = slider.getHeight(); - double progressFromSlider = getProgressFromSlider(slider); - double border = 1.0; - double gap = 2.5; - gp.moveTo(progressFromSlider, border); - gp.lineTo(2*gap, border); - gp.curveTo(gap, border, border, gap, border, sliderHeight/2.0); - gp.curveTo(gap, sliderHeight - gap, gap, sliderHeight-border, 2*gap, sliderHeight-border); - gp.lineTo(progressFromSlider, sliderHeight-border); - double fillValue = getProgressFromSlider(slider); - int curveGap = 3; - if (fillValue >= slider.getWidth()-curveGap) { - gp.lineTo(sliderWidth-2*gap, sliderHeight-border); - gp.curveTo(sliderWidth-gap, sliderHeight-border, sliderWidth-border, sliderHeight-gap, sliderWidth-border, sliderHeight/2.0); - gp.curveTo(sliderWidth-border, gap, sliderWidth-gap, border, sliderWidth-2*gap, border); - } - gp.closePath(); - return gp; - } - - protected GeneralPath getBrightInProgressPath(JSlider slider) { - GeneralPath gp = new GeneralPath(); - double sliderHeight = slider.getHeight(); - double sliderWidth = slider.getWidth(); - double gap = 2.5; - int curveGap = 3; - double fillValue = getProgressFromSlider(slider); - fillValue = fillValue < sliderWidth-curveGap ? fillValue : sliderWidth-curveGap; - gp.moveTo(fillValue, gap); - gp.lineTo(2*gap, gap); - gp.curveTo(2*gap, gap, gap, 2*gap, gap, sliderHeight/2.0); - gp.lineTo(fillValue, sliderHeight/2.0); - gp.closePath(); - return gp; - } - - protected LinearGradientPaint getBrightInPurpleProgressGradientPaint() { - float fractions[] = { 0.160f, 0.479f, 0.877f }; - Color colors[] = { new Color(0x4d, 0x15, 0x5c), new Color(0x85, 0x65, 0x90), new Color(0xd1, 0xc9, 0xd8) }; - LinearGradientPaint gradientPaint = new LinearGradientPaint(44.25f, 6.33f, 44.25f, 0.50f, fractions, colors); - return gradientPaint; - } - - private LinearGradientPaint getDisabledBorderGradientPaint() { - float fractions[] = {0.000f, 0.0553f, 0.1111f, 0.1673f, 0.2240f, 0.2814f, 0.3393f, 0.3979f, 0.4573f, 0.5176f, 0.5789f, - 0.6414f, 0.7055f, 0.7715f, 0.8402f, 0.9133f, 1.000f }; - - Color colors[] = { Color.WHITE, new Color(0xfb, 0xfb, 0xfb), new Color(0xf8, 0xf8, 0xf8), new Color(0xf4, 0xf4, 0xf4), - new Color(0xf1, 0xf1, 0xf1), new Color(0xed, 0xed, 0xed), new Color(0xea, 0xea, 0xea), - new Color(0xe6, 0xe6, 0xe6), new Color(0xe3, 0xe3, 0xe3), new Color(0xe0, 0xe0, 0xe0), - new Color(0xdc, 0xdc, 0xdc), new Color(0xd9, 0xd9, 0xd9), new Color(0xd5, 0xd5, 0xd5), - new Color(0xd2, 0xd2, 0xd2), new Color(0xce, 0xce, 0xce), new Color(0xcb, 0xcb, 0xcb), - new Color(0xc8, 0xc8, 0xc8) }; - LinearGradientPaint gradientPaint = new LinearGradientPaint(70.00f, 11.95f, 70.00f, -8.46f, fractions, colors); - return gradientPaint; - } - - private LinearGradientPaint getGrayProgressGradientPaint() { - float fractions[] = {0.000f, 0.0418f, 0.0845f, 0.1283f, 0.1732f, 0.2194f, 0.2671f, 0.3164f, 0.3676f, 0.4210f, 0.4771f, 0.5365f, - 0.6001f, 0.6694f, 0.7471f, 0.8401f, 1.000f }; - - Color colors[] = { new Color(0xf0, 0xf0, 0xf0), new Color(0xea, 0xea, 0xea), new Color(0xe4, 0xe4, 0xe4), new Color(0xdf, 0xdf, 0xdf), - new Color(0xd9, 0xd9, 0xd9), new Color(0xd3, 0xd3, 0xd3), new Color(0xce, 0xce, 0xce), - new Color(0xc8, 0xc8, 0xc8), new Color(0xc3, 0xc3, 0xc3), new Color(0xbd, 0xbd, 0xbd), - new Color(0xb7, 0xb7, 0xb7), new Color(0xb2, 0xb2, 0xb2), new Color(0xac, 0xac, 0xac), - new Color(0xa6, 0xa6, 0xa6), new Color(0xa1, 0xa1, 0xa1), new Color(0x9b, 0x9b, 0x9b), - new Color(0x96, 0x96, 0x96) }; - LinearGradientPaint gradientPaint = new LinearGradientPaint(70.00f, 10.31f, 70.00f, 1.43f, fractions, colors); - return gradientPaint; - } - - - private LinearGradientPaint getBrightInGrayProgressGradientPaint() { - float fractions[] = {0.160f, 0.479f, 0.877f }; - - Color colors[] = { new Color(0x78, 0x78, 0x78), new Color(0xb4, 0xb4, 0xb4), new Color(0xe6, 0xe6, 0xe6)}; - LinearGradientPaint gradientPaint = new LinearGradientPaint(70.00f, 6.33f, 70.00f, 0.50f, fractions, colors); - return gradientPaint; - } - -} +/* + Copyright 2013 Jose Luis De la Cruz Morales joseluis.delacruz@gmail.com + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +package com.josdem.jmetadata.laf.painter; + +import java.awt.Color; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.LinearGradientPaint; +import java.awt.RenderingHints; +import java.awt.geom.GeneralPath; +import javax.swing.JSlider; +import javax.swing.plaf.synth.SynthContext; +import javax.swing.plaf.synth.SynthPainter; + +public class ProgressBarPainter extends SynthPainter { + + @Override + public void paintSliderTrackBackground( + SynthContext context, Graphics g, int x, int y, int w, int h, int orientation) { + Graphics2D g2 = (Graphics2D) g; + JSlider slider = (JSlider) context.getComponent(); + g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); + g2.setPaint(slider.isEnabled() ? getBorderGradientPaint() : getDisabledBorderGradientPaint()); + g2.fill(getBorderPath(slider)); + g2.setColor(slider.isEnabled() ? new Color(0xb9, 0xb9, 0xb9) : new Color(0xf3, 0xf3, 0xf3)); + g2.fill(getBackgroundPath(slider)); + } + + @Override + public void paintSliderThumbBackground( + SynthContext context, Graphics g, int x, int y, int w, int h, int orientation) { + Graphics2D g2 = (Graphics2D) g; + JSlider slider = (JSlider) context.getComponent(); + g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); + g2.setPaint( + slider.isEnabled() ? getPurpleProgressGradientPaint() : getGrayProgressGradientPaint()); + g2.fill(getProgressPath(slider)); + g2.setPaint( + slider.isEnabled() + ? getBrightInPurpleProgressGradientPaint() + : getBrightInGrayProgressGradientPaint()); + g2.fill(getBrightInProgressPath(slider)); + } + + private int getProgressFromSlider(JSlider progressSlider) { + double currentValue = progressSlider.getValue(); + double sliderWidth = progressSlider.getSize().getWidth(); + int fillValue = (int) (currentValue * sliderWidth / 100); + // TODO FIXME Ugly patch for avoiding alias in progress when the bar is at is minimum size; + int curveGap = 3; + return fillValue > curveGap ? fillValue : curveGap; + } + + protected GeneralPath getBorderPath(JSlider slider) { + GeneralPath gp = new GeneralPath(); + double sliderWidth = slider.getWidth(); + double sliderHeight = slider.getHeight(); + double gap = 2.5; + double zero = 0.00; + + gp.moveTo(sliderWidth, sliderHeight / 2); + gp.curveTo( + sliderWidth, + sliderHeight - gap, + sliderWidth - gap, + sliderHeight, + sliderWidth - gap * 2, + sliderHeight); + gp.lineTo(gap * 2, sliderHeight); + gp.curveTo(gap, sliderHeight, zero, sliderHeight - gap, zero, sliderHeight / 2); + gp.lineTo(zero, sliderHeight / 2); + gp.curveTo(zero, gap, gap, zero, gap * 2, zero); + gp.lineTo(sliderWidth - gap * 2, zero); + gp.curveTo(sliderWidth - gap, zero, sliderWidth, gap, sliderWidth, sliderHeight / 2); + gp.closePath(); + return gp; + } + + protected GeneralPath getBackgroundPath(JSlider slider) { + GeneralPath gp2 = new GeneralPath(); + double sliderWidth = slider.getWidth(); + double sliderHeight = slider.getHeight(); + double gap = 2.5; + double border = 1.00; + + gp2.moveTo(sliderWidth - border, sliderHeight / 2); + gp2.curveTo( + sliderWidth - border, + sliderHeight - gap, + sliderWidth - gap, + sliderHeight - border, + sliderWidth - 2 * gap, + sliderHeight - border); + gp2.lineTo(2 * gap, sliderHeight - border); + gp2.curveTo(gap, sliderHeight - border, border, sliderHeight - gap, border, sliderHeight / 2); + gp2.lineTo(border, sliderHeight / 2); + gp2.curveTo(border, gap, gap, border, gap * 2, border); + gp2.lineTo(sliderWidth - gap * 2, border); + gp2.curveTo( + sliderWidth - gap, + border, + sliderWidth - border, + gap, + sliderWidth - border, + sliderHeight / 2); + gp2.closePath(); + return gp2; + } + + protected LinearGradientPaint getBorderGradientPaint() { + float fractions[] = { + 0.000f, 0.0553f, 0.1111f, 0.1673f, 0.2240f, 0.2814f, 0.3393f, 0.3979f, 0.4573f, 0.5176f, + 0.5789f, 0.6414f, 0.7055f, 0.7715f, 0.8402f, 0.9133f, 1.000f + }; + + Color colors[] = { + Color.WHITE, + new Color(0xf1, 0xf1, 0xf1), + new Color(0xe3, 0xe3, 0xe3), + new Color(0xd5, 0xd5, 0xd5), + new Color(0xc8, 0xc7, 0xc7), + new Color(0xba, 0xb9, 0xb9), + new Color(0xac, 0xab, 0xab), + new Color(0x9e, 0x9d, 0x9d), + new Color(0x91, 0x8f, 0x8f), + new Color(0x83, 0x81, 0x81), + new Color(0x75, 0x73, 0x73), + new Color(0x67, 0x65, 0x65), + new Color(0x5a, 0x57, 0x57), + new Color(0x4c, 0x49, 0x49), + new Color(0x3e, 0x3b, 0x3b), + new Color(0x30, 0x2d, 0x2d), + new Color(0x23, 0x1f, 0x20) + }; + LinearGradientPaint gradientPaint = + new LinearGradientPaint(70.00f, 11.95f, 70.00f, -8.46f, fractions, colors); + return gradientPaint; + } + + protected LinearGradientPaint getPurpleProgressGradientPaint() { + float fractions[] = { + 0.000f, 0.0418f, 0.0845f, 0.1283f, 0.1732f, 0.2194f, 0.2671f, 0.3164f, 0.3676f, 0.4210f, + 0.4771f, 0.5365f, 0.6001f, 0.6694f, 0.7471f, 0.8401f, 1.000f + }; + Color colors[] = { + new Color(0xb8, 0x0, 0xb8), + new Color(0xaf, 0x1, 0xb0), + new Color(0xa6, 0x2, 0xa8), + new Color(0x9d, 0x3, 0xa1), + new Color(0x94, 0x4, 0x99), + new Color(0x8b, 0x5, 0x91), + new Color(0x82, 0x6, 0x8a), + new Color(0x79, 0x7, 0x82), + new Color(0x71, 0x8, 0x7b), + new Color(0x68, 0x9, 0x73), + new Color(0x5f, 0xa, 0x6b), + new Color(0x56, 0xb, 0x64), + new Color(0x4d, 0xc, 0x5c), + new Color(0x44, 0xd, 0x54), + new Color(0x3b, 0xe, 0x4d), + new Color(0x32, 0xf, 0x45), + new Color(0x2a, 0x11, 0x3e) + }; + LinearGradientPaint gradientPaint = + new LinearGradientPaint(44.00f, 10.31f, 44.00f, 1.43f, fractions, colors); + return gradientPaint; + } + + protected GeneralPath getProgressPath(JSlider slider) { + GeneralPath gp = new GeneralPath(); + double sliderWidth = slider.getWidth(); + double sliderHeight = slider.getHeight(); + double progressFromSlider = getProgressFromSlider(slider); + double border = 1.0; + double gap = 2.5; + gp.moveTo(progressFromSlider, border); + gp.lineTo(2 * gap, border); + gp.curveTo(gap, border, border, gap, border, sliderHeight / 2.0); + gp.curveTo(gap, sliderHeight - gap, gap, sliderHeight - border, 2 * gap, sliderHeight - border); + gp.lineTo(progressFromSlider, sliderHeight - border); + double fillValue = getProgressFromSlider(slider); + int curveGap = 3; + if (fillValue >= slider.getWidth() - curveGap) { + gp.lineTo(sliderWidth - 2 * gap, sliderHeight - border); + gp.curveTo( + sliderWidth - gap, + sliderHeight - border, + sliderWidth - border, + sliderHeight - gap, + sliderWidth - border, + sliderHeight / 2.0); + gp.curveTo( + sliderWidth - border, gap, sliderWidth - gap, border, sliderWidth - 2 * gap, border); + } + gp.closePath(); + return gp; + } + + protected GeneralPath getBrightInProgressPath(JSlider slider) { + GeneralPath gp = new GeneralPath(); + double sliderHeight = slider.getHeight(); + double sliderWidth = slider.getWidth(); + double gap = 2.5; + int curveGap = 3; + double fillValue = getProgressFromSlider(slider); + fillValue = fillValue < sliderWidth - curveGap ? fillValue : sliderWidth - curveGap; + gp.moveTo(fillValue, gap); + gp.lineTo(2 * gap, gap); + gp.curveTo(2 * gap, gap, gap, 2 * gap, gap, sliderHeight / 2.0); + gp.lineTo(fillValue, sliderHeight / 2.0); + gp.closePath(); + return gp; + } + + protected LinearGradientPaint getBrightInPurpleProgressGradientPaint() { + float fractions[] = {0.160f, 0.479f, 0.877f}; + Color colors[] = { + new Color(0x4d, 0x15, 0x5c), new Color(0x85, 0x65, 0x90), new Color(0xd1, 0xc9, 0xd8) + }; + LinearGradientPaint gradientPaint = + new LinearGradientPaint(44.25f, 6.33f, 44.25f, 0.50f, fractions, colors); + return gradientPaint; + } + + private LinearGradientPaint getDisabledBorderGradientPaint() { + float fractions[] = { + 0.000f, 0.0553f, 0.1111f, 0.1673f, 0.2240f, 0.2814f, 0.3393f, 0.3979f, 0.4573f, 0.5176f, + 0.5789f, 0.6414f, 0.7055f, 0.7715f, 0.8402f, 0.9133f, 1.000f + }; + + Color colors[] = { + Color.WHITE, + new Color(0xfb, 0xfb, 0xfb), + new Color(0xf8, 0xf8, 0xf8), + new Color(0xf4, 0xf4, 0xf4), + new Color(0xf1, 0xf1, 0xf1), + new Color(0xed, 0xed, 0xed), + new Color(0xea, 0xea, 0xea), + new Color(0xe6, 0xe6, 0xe6), + new Color(0xe3, 0xe3, 0xe3), + new Color(0xe0, 0xe0, 0xe0), + new Color(0xdc, 0xdc, 0xdc), + new Color(0xd9, 0xd9, 0xd9), + new Color(0xd5, 0xd5, 0xd5), + new Color(0xd2, 0xd2, 0xd2), + new Color(0xce, 0xce, 0xce), + new Color(0xcb, 0xcb, 0xcb), + new Color(0xc8, 0xc8, 0xc8) + }; + LinearGradientPaint gradientPaint = + new LinearGradientPaint(70.00f, 11.95f, 70.00f, -8.46f, fractions, colors); + return gradientPaint; + } + + private LinearGradientPaint getGrayProgressGradientPaint() { + float fractions[] = { + 0.000f, 0.0418f, 0.0845f, 0.1283f, 0.1732f, 0.2194f, 0.2671f, 0.3164f, 0.3676f, 0.4210f, + 0.4771f, 0.5365f, 0.6001f, 0.6694f, 0.7471f, 0.8401f, 1.000f + }; + + Color colors[] = { + new Color(0xf0, 0xf0, 0xf0), + new Color(0xea, 0xea, 0xea), + new Color(0xe4, 0xe4, 0xe4), + new Color(0xdf, 0xdf, 0xdf), + new Color(0xd9, 0xd9, 0xd9), + new Color(0xd3, 0xd3, 0xd3), + new Color(0xce, 0xce, 0xce), + new Color(0xc8, 0xc8, 0xc8), + new Color(0xc3, 0xc3, 0xc3), + new Color(0xbd, 0xbd, 0xbd), + new Color(0xb7, 0xb7, 0xb7), + new Color(0xb2, 0xb2, 0xb2), + new Color(0xac, 0xac, 0xac), + new Color(0xa6, 0xa6, 0xa6), + new Color(0xa1, 0xa1, 0xa1), + new Color(0x9b, 0x9b, 0x9b), + new Color(0x96, 0x96, 0x96) + }; + LinearGradientPaint gradientPaint = + new LinearGradientPaint(70.00f, 10.31f, 70.00f, 1.43f, fractions, colors); + return gradientPaint; + } + + private LinearGradientPaint getBrightInGrayProgressGradientPaint() { + float fractions[] = {0.160f, 0.479f, 0.877f}; + + Color colors[] = { + new Color(0x78, 0x78, 0x78), new Color(0xb4, 0xb4, 0xb4), new Color(0xe6, 0xe6, 0xe6) + }; + LinearGradientPaint gradientPaint = + new LinearGradientPaint(70.00f, 6.33f, 70.00f, 0.50f, fractions, colors); + return gradientPaint; + } +} diff --git a/src/main/java/com/josdem/jmetadata/laf/painter/ProgressBarPainterAlwaysEnabled.java b/src/main/java/com/josdem/jmetadata/laf/painter/ProgressBarPainterAlwaysEnabled.java index 4c8959c..9356a29 100644 --- a/src/main/java/com/josdem/jmetadata/laf/painter/ProgressBarPainterAlwaysEnabled.java +++ b/src/main/java/com/josdem/jmetadata/laf/painter/ProgressBarPainterAlwaysEnabled.java @@ -1,175 +1,215 @@ -/* - Copyright 2013 Jose Luis De la Cruz Morales joseluis.delacruz@gmail.com - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -package com.josdem.jmetadata.laf.painter; - -import java.awt.Color; -import java.awt.Graphics; -import java.awt.Graphics2D; -import java.awt.LinearGradientPaint; -import java.awt.RenderingHints; -import java.awt.geom.GeneralPath; - -import javax.swing.JSlider; -import javax.swing.plaf.synth.SynthContext; -import javax.swing.plaf.synth.SynthPainter; - -public class ProgressBarPainterAlwaysEnabled extends SynthPainter { - private static final int curveGap = 3; - private static final float borderFractions[] = { 0.000f, 0.0553f, 0.1111f, 0.1673f, 0.2240f, 0.2814f, 0.3393f, - 0.3979f, 0.4573f, 0.5176f, 0.5789f, 0.6414f, 0.7055f, 0.7715f, 0.8402f, 0.9133f, 1.000f }; - - private static final Color borderColors[] = { Color.WHITE, new Color(0xf1, 0xf1, 0xf1), new Color(0xe3, 0xe3, 0xe3), - new Color(0xd5, 0xd5, 0xd5), new Color(0xc8, 0xc7, 0xc7), new Color(0xba, 0xb9, 0xb9), - new Color(0xac, 0xab, 0xab), new Color(0x9e, 0x9d, 0x9d), new Color(0x91, 0x8f, 0x8f), - new Color(0x83, 0x81, 0x81), new Color(0x75, 0x73, 0x73), new Color(0x67, 0x65, 0x65), - new Color(0x5a, 0x57, 0x57), new Color(0x4c, 0x49, 0x49), new Color(0x3e, 0x3b, 0x3b), - new Color(0x30, 0x2d, 0x2d), new Color(0x23, 0x1f, 0x20) }; - private static final float fractions[] = { 0.000f, 1.000f }; - private static final Color colors[] = { Color.WHITE, new Color(0x22, 0x1f, 0x1f) }; - - @Override - public void paintSliderTrackBackground(SynthContext context, Graphics g, int x, int y, int w, int h, int orientation) { - Graphics2D g2 = (Graphics2D) g; - JSlider slider = (JSlider) context.getComponent(); - g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); - g2.setPaint(getBorderGradientPaint()); - g2.fill(getBorderPath(slider)); - g2.setColor(new Color(0x5a, 0x28, 0x5a)); - g2.fill(getBackgroundPath(slider)); - } - - @Override - public void paintSliderThumbBackground(SynthContext context, Graphics g, int x, int y, int w, int h, int orientation) { - Graphics2D g2 = (Graphics2D) g; - JSlider slider = (JSlider) context.getComponent(); - g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); - if (getProgress(slider) == 0) { - return; - } - g2.setPaint(getGrayProgressGradientPaint()); - g2.fill(getProgressPath(slider)); - g2.setPaint(getBrightInGrayProgressGradientPaint()); - g2.fill(getBrightInProgressPath(slider)); - } - - private int getProgressFromSlider(JSlider progressSlider) { - int fillValue = getProgress(progressSlider); - // TODO FIXME Ugly patch for avoiding alias in progress when the bar is at is minimum size; - return fillValue > curveGap ? fillValue : curveGap; - } - - private int getProgress(JSlider progressSlider) { - double currentValue = progressSlider.getValue(); - double sliderWidth = progressSlider.getSize().getWidth(); - int fillValue = (int) (currentValue * sliderWidth / 100); - return fillValue; - } - - private GeneralPath getBorderPath(JSlider slider) { - GeneralPath gp = new GeneralPath(); - double sliderWidth = slider.getWidth(); - double sliderHeight = slider.getHeight(); - double gap = 2.5; - double zero = 0.00; - - gp.moveTo(sliderWidth, sliderHeight / 2); - gp.curveTo(sliderWidth, sliderHeight - gap, sliderWidth - gap, sliderHeight, sliderWidth - gap * 2, sliderHeight); - gp.lineTo(gap * 2, sliderHeight); - gp.curveTo(gap, sliderHeight, zero, sliderHeight - gap, zero, sliderHeight / 2); - gp.lineTo(zero, sliderHeight / 2); - gp.curveTo(zero, gap, gap, zero, gap * 2, zero); - gp.lineTo(sliderWidth - gap * 2, zero); - gp.curveTo(sliderWidth - gap, zero, sliderWidth, gap, sliderWidth, sliderHeight / 2); - gp.closePath(); - return gp; - } - - private GeneralPath getBackgroundPath(JSlider slider) { - GeneralPath gp2 = new GeneralPath(); - double sliderWidth = slider.getWidth(); - double sliderHeight = slider.getHeight(); - double gap = 2.5; - double border = 1.00; - - gp2.moveTo(sliderWidth - border, sliderHeight / 2); - gp2.curveTo(sliderWidth - border, sliderHeight - gap, sliderWidth - gap, sliderHeight - border, sliderWidth - 2 - * gap, sliderHeight - border); - gp2.lineTo(2 * gap, sliderHeight - border); - gp2.curveTo(gap, sliderHeight - border, border, sliderHeight - gap, border, sliderHeight / 2); - gp2.lineTo(border, sliderHeight / 2); - gp2.curveTo(border, gap, gap, border, gap * 2, border); - gp2.lineTo(sliderWidth - gap * 2, border); - gp2.curveTo(sliderWidth - gap, border, sliderWidth - border, gap, sliderWidth - border, sliderHeight / 2); - gp2.closePath(); - return gp2; - } - - private LinearGradientPaint getBorderGradientPaint() { - LinearGradientPaint gradientPaint = new LinearGradientPaint(70.00f, 11.95f, 70.00f, -8.46f, borderFractions, - borderColors); - return gradientPaint; - } - - private GeneralPath getProgressPath(JSlider slider) { - GeneralPath gp = new GeneralPath(); - double sliderWidth = slider.getWidth(); - double sliderHeight = slider.getHeight(); - double progressFromSlider = getProgressFromSlider(slider); - double border = 1.0; - double gap = 2.5; - gp.moveTo(progressFromSlider, border); - gp.lineTo(2 * gap, border); - gp.curveTo(gap, border, border, gap, border, sliderHeight / 2.0); - gp.curveTo(gap, sliderHeight - gap, gap, sliderHeight - border, 2 * gap, sliderHeight - border); - gp.lineTo(progressFromSlider, sliderHeight - border); - double fillValue = getProgressFromSlider(slider); - if (fillValue >= slider.getWidth() - curveGap) { - gp.lineTo(sliderWidth - 2 * gap, sliderHeight - border); - gp.curveTo(sliderWidth - gap, sliderHeight - border, sliderWidth - border, sliderHeight - gap, sliderWidth - - border, sliderHeight / 2.0); - gp.curveTo(sliderWidth - border, gap, sliderWidth - gap, border, sliderWidth - 2 * gap, border); - } - gp.closePath(); - return gp; - } - - private GeneralPath getBrightInProgressPath(JSlider slider) { - GeneralPath gp = new GeneralPath(); - double sliderHeight = slider.getHeight(); - double sliderWidth = slider.getWidth(); - double gap = 2.5; - double fillValue = getProgressFromSlider(slider); - fillValue = fillValue < sliderWidth - curveGap ? fillValue : sliderWidth - curveGap; - gp.moveTo(fillValue, gap); - gp.lineTo(2 * gap, gap); - gp.curveTo(2 * gap, gap, gap, 2 * gap, gap, sliderHeight / 2.0); - gp.lineTo(fillValue, sliderHeight / 2.0); - gp.closePath(); - return gp; - } - - private LinearGradientPaint getBrightInGrayProgressGradientPaint() { - LinearGradientPaint gradientPaint = new LinearGradientPaint(70.00f, 3.94f, 70.00f, -7.00f, fractions, colors); - return gradientPaint; - } - - private LinearGradientPaint getGrayProgressGradientPaint() { - LinearGradientPaint gradientPaint = new LinearGradientPaint(69.00f, 11.00f, 69.00f, -9.77f, fractions, colors); - return gradientPaint; - } - -} +/* + Copyright 2013 Jose Luis De la Cruz Morales joseluis.delacruz@gmail.com + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +package com.josdem.jmetadata.laf.painter; + +import java.awt.Color; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.LinearGradientPaint; +import java.awt.RenderingHints; +import java.awt.geom.GeneralPath; +import javax.swing.JSlider; +import javax.swing.plaf.synth.SynthContext; +import javax.swing.plaf.synth.SynthPainter; + +public class ProgressBarPainterAlwaysEnabled extends SynthPainter { + private static final int curveGap = 3; + private static final float borderFractions[] = { + 0.000f, 0.0553f, 0.1111f, 0.1673f, 0.2240f, 0.2814f, 0.3393f, 0.3979f, 0.4573f, 0.5176f, + 0.5789f, 0.6414f, 0.7055f, 0.7715f, 0.8402f, 0.9133f, 1.000f + }; + + private static final Color borderColors[] = { + Color.WHITE, + new Color(0xf1, 0xf1, 0xf1), + new Color(0xe3, 0xe3, 0xe3), + new Color(0xd5, 0xd5, 0xd5), + new Color(0xc8, 0xc7, 0xc7), + new Color(0xba, 0xb9, 0xb9), + new Color(0xac, 0xab, 0xab), + new Color(0x9e, 0x9d, 0x9d), + new Color(0x91, 0x8f, 0x8f), + new Color(0x83, 0x81, 0x81), + new Color(0x75, 0x73, 0x73), + new Color(0x67, 0x65, 0x65), + new Color(0x5a, 0x57, 0x57), + new Color(0x4c, 0x49, 0x49), + new Color(0x3e, 0x3b, 0x3b), + new Color(0x30, 0x2d, 0x2d), + new Color(0x23, 0x1f, 0x20) + }; + private static final float fractions[] = {0.000f, 1.000f}; + private static final Color colors[] = {Color.WHITE, new Color(0x22, 0x1f, 0x1f)}; + + @Override + public void paintSliderTrackBackground( + SynthContext context, Graphics g, int x, int y, int w, int h, int orientation) { + Graphics2D g2 = (Graphics2D) g; + JSlider slider = (JSlider) context.getComponent(); + g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); + g2.setPaint(getBorderGradientPaint()); + g2.fill(getBorderPath(slider)); + g2.setColor(new Color(0x5a, 0x28, 0x5a)); + g2.fill(getBackgroundPath(slider)); + } + + @Override + public void paintSliderThumbBackground( + SynthContext context, Graphics g, int x, int y, int w, int h, int orientation) { + Graphics2D g2 = (Graphics2D) g; + JSlider slider = (JSlider) context.getComponent(); + g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); + if (getProgress(slider) == 0) { + return; + } + g2.setPaint(getGrayProgressGradientPaint()); + g2.fill(getProgressPath(slider)); + g2.setPaint(getBrightInGrayProgressGradientPaint()); + g2.fill(getBrightInProgressPath(slider)); + } + + private int getProgressFromSlider(JSlider progressSlider) { + int fillValue = getProgress(progressSlider); + // TODO FIXME Ugly patch for avoiding alias in progress when the bar is at is minimum size; + return fillValue > curveGap ? fillValue : curveGap; + } + + private int getProgress(JSlider progressSlider) { + double currentValue = progressSlider.getValue(); + double sliderWidth = progressSlider.getSize().getWidth(); + int fillValue = (int) (currentValue * sliderWidth / 100); + return fillValue; + } + + private GeneralPath getBorderPath(JSlider slider) { + GeneralPath gp = new GeneralPath(); + double sliderWidth = slider.getWidth(); + double sliderHeight = slider.getHeight(); + double gap = 2.5; + double zero = 0.00; + + gp.moveTo(sliderWidth, sliderHeight / 2); + gp.curveTo( + sliderWidth, + sliderHeight - gap, + sliderWidth - gap, + sliderHeight, + sliderWidth - gap * 2, + sliderHeight); + gp.lineTo(gap * 2, sliderHeight); + gp.curveTo(gap, sliderHeight, zero, sliderHeight - gap, zero, sliderHeight / 2); + gp.lineTo(zero, sliderHeight / 2); + gp.curveTo(zero, gap, gap, zero, gap * 2, zero); + gp.lineTo(sliderWidth - gap * 2, zero); + gp.curveTo(sliderWidth - gap, zero, sliderWidth, gap, sliderWidth, sliderHeight / 2); + gp.closePath(); + return gp; + } + + private GeneralPath getBackgroundPath(JSlider slider) { + GeneralPath gp2 = new GeneralPath(); + double sliderWidth = slider.getWidth(); + double sliderHeight = slider.getHeight(); + double gap = 2.5; + double border = 1.00; + + gp2.moveTo(sliderWidth - border, sliderHeight / 2); + gp2.curveTo( + sliderWidth - border, + sliderHeight - gap, + sliderWidth - gap, + sliderHeight - border, + sliderWidth - 2 * gap, + sliderHeight - border); + gp2.lineTo(2 * gap, sliderHeight - border); + gp2.curveTo(gap, sliderHeight - border, border, sliderHeight - gap, border, sliderHeight / 2); + gp2.lineTo(border, sliderHeight / 2); + gp2.curveTo(border, gap, gap, border, gap * 2, border); + gp2.lineTo(sliderWidth - gap * 2, border); + gp2.curveTo( + sliderWidth - gap, + border, + sliderWidth - border, + gap, + sliderWidth - border, + sliderHeight / 2); + gp2.closePath(); + return gp2; + } + + private LinearGradientPaint getBorderGradientPaint() { + LinearGradientPaint gradientPaint = + new LinearGradientPaint(70.00f, 11.95f, 70.00f, -8.46f, borderFractions, borderColors); + return gradientPaint; + } + + private GeneralPath getProgressPath(JSlider slider) { + GeneralPath gp = new GeneralPath(); + double sliderWidth = slider.getWidth(); + double sliderHeight = slider.getHeight(); + double progressFromSlider = getProgressFromSlider(slider); + double border = 1.0; + double gap = 2.5; + gp.moveTo(progressFromSlider, border); + gp.lineTo(2 * gap, border); + gp.curveTo(gap, border, border, gap, border, sliderHeight / 2.0); + gp.curveTo(gap, sliderHeight - gap, gap, sliderHeight - border, 2 * gap, sliderHeight - border); + gp.lineTo(progressFromSlider, sliderHeight - border); + double fillValue = getProgressFromSlider(slider); + if (fillValue >= slider.getWidth() - curveGap) { + gp.lineTo(sliderWidth - 2 * gap, sliderHeight - border); + gp.curveTo( + sliderWidth - gap, + sliderHeight - border, + sliderWidth - border, + sliderHeight - gap, + sliderWidth - border, + sliderHeight / 2.0); + gp.curveTo( + sliderWidth - border, gap, sliderWidth - gap, border, sliderWidth - 2 * gap, border); + } + gp.closePath(); + return gp; + } + + private GeneralPath getBrightInProgressPath(JSlider slider) { + GeneralPath gp = new GeneralPath(); + double sliderHeight = slider.getHeight(); + double sliderWidth = slider.getWidth(); + double gap = 2.5; + double fillValue = getProgressFromSlider(slider); + fillValue = fillValue < sliderWidth - curveGap ? fillValue : sliderWidth - curveGap; + gp.moveTo(fillValue, gap); + gp.lineTo(2 * gap, gap); + gp.curveTo(2 * gap, gap, gap, 2 * gap, gap, sliderHeight / 2.0); + gp.lineTo(fillValue, sliderHeight / 2.0); + gp.closePath(); + return gp; + } + + private LinearGradientPaint getBrightInGrayProgressGradientPaint() { + LinearGradientPaint gradientPaint = + new LinearGradientPaint(70.00f, 3.94f, 70.00f, -7.00f, fractions, colors); + return gradientPaint; + } + + private LinearGradientPaint getGrayProgressGradientPaint() { + LinearGradientPaint gradientPaint = + new LinearGradientPaint(69.00f, 11.00f, 69.00f, -9.77f, fractions, colors); + return gradientPaint; + } +} diff --git a/src/main/java/com/josdem/jmetadata/laf/painter/ProgressBigBarGrayPainter.java b/src/main/java/com/josdem/jmetadata/laf/painter/ProgressBigBarGrayPainter.java index 93c9a86..2d067b9 100644 --- a/src/main/java/com/josdem/jmetadata/laf/painter/ProgressBigBarGrayPainter.java +++ b/src/main/java/com/josdem/jmetadata/laf/painter/ProgressBigBarGrayPainter.java @@ -1,161 +1,212 @@ -/* - Copyright 2013 Jose Luis De la Cruz Morales joseluis.delacruz@gmail.com - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -package com.josdem.jmetadata.laf.painter; - -import java.awt.Color; -import java.awt.Graphics; -import java.awt.Graphics2D; -import java.awt.LinearGradientPaint; -import java.awt.RenderingHints; -import java.awt.geom.GeneralPath; - -import javax.swing.JSlider; -import javax.swing.plaf.synth.SynthContext; -import javax.swing.plaf.synth.SynthPainter; - -public class ProgressBigBarGrayPainter extends SynthPainter { - - private final LinearGradientPaint thumbBackgroundGradientOne = new LinearGradientPaint(69.00f, 9.33f, 69.00f, -1.67f, - new float[] { 0.000f, 1.000f }, new Color[] { Color.WHITE, new Color(0x22, 0x1f, 0x1f) }); - - private final LinearGradientPaint thumbBackgroundGradientTwo = new LinearGradientPaint(69.00f, 3.50f, 69.00f, -10.14f, new float[] { 0.000f, - 1.000f }, new Color[] { Color.WHITE, new Color(0x32, 0x32, 0x32) }); - - @Override - public void paintSliderTrackBackground(SynthContext context, Graphics g, int x, int y, int w, int h, int orientation) { - Graphics2D g2 = (Graphics2D) g; - JSlider slider = (JSlider) context.getComponent(); - g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); - g2.setPaint(getBorderGradientPaint()); - g2.fill(getBorderPath(slider)); - g2.setColor(new Color(0xb9, 0xb9, 0xb9)); - } - - @Override - public void paintSliderThumbBackground(SynthContext context, Graphics g, int x, int y, int w, int h, int orientation) { - Graphics2D g2 = (Graphics2D) g; - JSlider slider = (JSlider) context.getComponent(); - g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); - g2.setPaint(thumbBackgroundGradientOne); - g2.fill(getProgressPath(slider)); - g2.setPaint(thumbBackgroundGradientTwo); - g2.fill(getBrightInProgressPath(slider)); - } - - private int getProgressFromSlider(JSlider progressSlider) { - double currentValue = progressSlider.getValue(); - double sliderWidth = progressSlider.getSize().getWidth(); - int fillValue = (int) (currentValue * sliderWidth / 100); - // TODO FIXME Ugly patch for avoiding alias in progress when the bar is at is minimum size; - int curveGap = 3; - return fillValue > curveGap ? fillValue : curveGap; - } - - protected GeneralPath getBorderPath(JSlider slider) { - GeneralPath gp = new GeneralPath(); - double sliderWidth = slider.getWidth(); - double sliderHeight = slider.getHeight(); - double gap = 2.5; - double zero = 0.00; - - gp.moveTo(sliderWidth, sliderHeight / 2); - gp.curveTo(sliderWidth, sliderHeight - gap, sliderWidth - gap, sliderHeight, sliderWidth - gap * 2, sliderHeight); - gp.lineTo(gap * 2, sliderHeight); - gp.curveTo(gap, sliderHeight, zero, sliderHeight - gap, zero, sliderHeight / 2); - gp.lineTo(zero, sliderHeight / 2); - gp.curveTo(zero, gap, gap, zero, gap * 2, zero); - gp.lineTo(sliderWidth - gap * 2, zero); - gp.curveTo(sliderWidth - gap, zero, sliderWidth, gap, sliderWidth, sliderHeight / 2); - gp.closePath(); - return gp; - } - - protected GeneralPath getBackgroundPath(JSlider slider) { - GeneralPath gp2 = new GeneralPath(); - double sliderWidth = slider.getWidth(); - double sliderHeight = slider.getHeight(); - double gap = 2.5; - double border = 1.00; - - gp2.moveTo(sliderWidth - border, sliderHeight / 2); - gp2.curveTo(sliderWidth - border, sliderHeight - gap, sliderWidth - gap, sliderHeight - border, sliderWidth - 2 - * gap, sliderHeight - border); - gp2.lineTo(2 * gap, sliderHeight - border); - gp2.curveTo(gap, sliderHeight - border, border, sliderHeight - gap, border, sliderHeight / 2); - gp2.lineTo(border, sliderHeight / 2); - gp2.curveTo(border, gap, gap, border, gap * 2, border); - gp2.lineTo(sliderWidth - gap * 2, border); - gp2.curveTo(sliderWidth - gap, border, sliderWidth - border, gap, sliderWidth - border, sliderHeight / 2); - gp2.closePath(); - return gp2; - } - - protected LinearGradientPaint getBorderGradientPaint() { - float fractions[] = { 0.000f, 0.0553f, 0.1111f, 0.1673f, 0.2240f, 0.2814f, 0.3393f, 0.3979f, 0.4573f, 0.5176f, - 0.5789f, 0.6414f, 0.7055f, 0.7715f, 0.8402f, 0.9133f, 1.000f }; - - Color colors[] = { Color.WHITE, new Color(0xf1, 0xf1, 0xf1), new Color(0xe3, 0xe3, 0xe3), - new Color(0xd5, 0xd5, 0xd5), new Color(0xc8, 0xc7, 0xc7), new Color(0xba, 0xb9, 0xb9), - new Color(0xac, 0xab, 0xab), new Color(0x9e, 0x9d, 0x9d), new Color(0x91, 0x8f, 0x8f), - new Color(0x83, 0x81, 0x81), new Color(0x75, 0x73, 0x73), new Color(0x67, 0x65, 0x65), - new Color(0x5a, 0x57, 0x57), new Color(0x4c, 0x49, 0x49), new Color(0x3e, 0x3b, 0x3b), - new Color(0x30, 0x2d, 0x2d), new Color(0x23, 0x1f, 0x20) }; - LinearGradientPaint gradientPaint = new LinearGradientPaint(70.00f, 13.17f, 70.00f, -11.32f, fractions, colors); - return gradientPaint; - } - - protected GeneralPath getProgressPath(JSlider slider) { - GeneralPath gp = new GeneralPath(); - double sliderWidth = slider.getWidth(); - double sliderHeight = slider.getHeight(); - double progressFromSlider = getProgressFromSlider(slider); - double border = 1.0; - double gap = 2.5; - gp.moveTo(progressFromSlider, border); - gp.lineTo(2 * gap, border); - gp.curveTo(gap, border, border, gap, border, sliderHeight / 2.0); - gp.curveTo(gap, sliderHeight - gap, gap, sliderHeight - border, 2 * gap, sliderHeight - border); - gp.lineTo(progressFromSlider, sliderHeight - border); - double fillValue = getProgressFromSlider(slider); - int curveGap = 3; - if (fillValue >= slider.getWidth() - curveGap) { - gp.lineTo(sliderWidth - 2 * gap, sliderHeight - border); - gp.curveTo(sliderWidth - gap, sliderHeight - border, sliderWidth - border, sliderHeight - gap, sliderWidth - - border, sliderHeight / 2.0); - gp.curveTo(sliderWidth - border, gap, sliderWidth - gap, border, sliderWidth - 2 * gap, border); - } - gp.closePath(); - return gp; - } - - protected GeneralPath getBrightInProgressPath(JSlider slider) { - GeneralPath gp = new GeneralPath(); - double sliderHeight = slider.getHeight(); - double sliderWidth = slider.getWidth(); - double gap = 2.5; - int curveGap = 3; - double fillValue = getProgressFromSlider(slider); - fillValue = fillValue < sliderWidth - curveGap ? fillValue : sliderWidth - curveGap; - gp.moveTo(fillValue, gap); - gp.lineTo(2 * gap, gap); - gp.curveTo(2 * gap, gap, gap, 2 * gap, gap, sliderHeight / 2.0); - gp.lineTo(fillValue, sliderHeight / 2.0); - gp.closePath(); - return gp; - } - -} +/* + Copyright 2013 Jose Luis De la Cruz Morales joseluis.delacruz@gmail.com + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +package com.josdem.jmetadata.laf.painter; + +import java.awt.Color; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.LinearGradientPaint; +import java.awt.RenderingHints; +import java.awt.geom.GeneralPath; +import javax.swing.JSlider; +import javax.swing.plaf.synth.SynthContext; +import javax.swing.plaf.synth.SynthPainter; + +public class ProgressBigBarGrayPainter extends SynthPainter { + + private final LinearGradientPaint thumbBackgroundGradientOne = + new LinearGradientPaint( + 69.00f, + 9.33f, + 69.00f, + -1.67f, + new float[] {0.000f, 1.000f}, + new Color[] {Color.WHITE, new Color(0x22, 0x1f, 0x1f)}); + + private final LinearGradientPaint thumbBackgroundGradientTwo = + new LinearGradientPaint( + 69.00f, + 3.50f, + 69.00f, + -10.14f, + new float[] {0.000f, 1.000f}, + new Color[] {Color.WHITE, new Color(0x32, 0x32, 0x32)}); + + @Override + public void paintSliderTrackBackground( + SynthContext context, Graphics g, int x, int y, int w, int h, int orientation) { + Graphics2D g2 = (Graphics2D) g; + JSlider slider = (JSlider) context.getComponent(); + g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); + g2.setPaint(getBorderGradientPaint()); + g2.fill(getBorderPath(slider)); + g2.setColor(new Color(0xb9, 0xb9, 0xb9)); + } + + @Override + public void paintSliderThumbBackground( + SynthContext context, Graphics g, int x, int y, int w, int h, int orientation) { + Graphics2D g2 = (Graphics2D) g; + JSlider slider = (JSlider) context.getComponent(); + g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); + g2.setPaint(thumbBackgroundGradientOne); + g2.fill(getProgressPath(slider)); + g2.setPaint(thumbBackgroundGradientTwo); + g2.fill(getBrightInProgressPath(slider)); + } + + private int getProgressFromSlider(JSlider progressSlider) { + double currentValue = progressSlider.getValue(); + double sliderWidth = progressSlider.getSize().getWidth(); + int fillValue = (int) (currentValue * sliderWidth / 100); + // TODO FIXME Ugly patch for avoiding alias in progress when the bar is at is minimum size; + int curveGap = 3; + return fillValue > curveGap ? fillValue : curveGap; + } + + protected GeneralPath getBorderPath(JSlider slider) { + GeneralPath gp = new GeneralPath(); + double sliderWidth = slider.getWidth(); + double sliderHeight = slider.getHeight(); + double gap = 2.5; + double zero = 0.00; + + gp.moveTo(sliderWidth, sliderHeight / 2); + gp.curveTo( + sliderWidth, + sliderHeight - gap, + sliderWidth - gap, + sliderHeight, + sliderWidth - gap * 2, + sliderHeight); + gp.lineTo(gap * 2, sliderHeight); + gp.curveTo(gap, sliderHeight, zero, sliderHeight - gap, zero, sliderHeight / 2); + gp.lineTo(zero, sliderHeight / 2); + gp.curveTo(zero, gap, gap, zero, gap * 2, zero); + gp.lineTo(sliderWidth - gap * 2, zero); + gp.curveTo(sliderWidth - gap, zero, sliderWidth, gap, sliderWidth, sliderHeight / 2); + gp.closePath(); + return gp; + } + + protected GeneralPath getBackgroundPath(JSlider slider) { + GeneralPath gp2 = new GeneralPath(); + double sliderWidth = slider.getWidth(); + double sliderHeight = slider.getHeight(); + double gap = 2.5; + double border = 1.00; + + gp2.moveTo(sliderWidth - border, sliderHeight / 2); + gp2.curveTo( + sliderWidth - border, + sliderHeight - gap, + sliderWidth - gap, + sliderHeight - border, + sliderWidth - 2 * gap, + sliderHeight - border); + gp2.lineTo(2 * gap, sliderHeight - border); + gp2.curveTo(gap, sliderHeight - border, border, sliderHeight - gap, border, sliderHeight / 2); + gp2.lineTo(border, sliderHeight / 2); + gp2.curveTo(border, gap, gap, border, gap * 2, border); + gp2.lineTo(sliderWidth - gap * 2, border); + gp2.curveTo( + sliderWidth - gap, + border, + sliderWidth - border, + gap, + sliderWidth - border, + sliderHeight / 2); + gp2.closePath(); + return gp2; + } + + protected LinearGradientPaint getBorderGradientPaint() { + float fractions[] = { + 0.000f, 0.0553f, 0.1111f, 0.1673f, 0.2240f, 0.2814f, 0.3393f, 0.3979f, 0.4573f, 0.5176f, + 0.5789f, 0.6414f, 0.7055f, 0.7715f, 0.8402f, 0.9133f, 1.000f + }; + + Color colors[] = { + Color.WHITE, + new Color(0xf1, 0xf1, 0xf1), + new Color(0xe3, 0xe3, 0xe3), + new Color(0xd5, 0xd5, 0xd5), + new Color(0xc8, 0xc7, 0xc7), + new Color(0xba, 0xb9, 0xb9), + new Color(0xac, 0xab, 0xab), + new Color(0x9e, 0x9d, 0x9d), + new Color(0x91, 0x8f, 0x8f), + new Color(0x83, 0x81, 0x81), + new Color(0x75, 0x73, 0x73), + new Color(0x67, 0x65, 0x65), + new Color(0x5a, 0x57, 0x57), + new Color(0x4c, 0x49, 0x49), + new Color(0x3e, 0x3b, 0x3b), + new Color(0x30, 0x2d, 0x2d), + new Color(0x23, 0x1f, 0x20) + }; + LinearGradientPaint gradientPaint = + new LinearGradientPaint(70.00f, 13.17f, 70.00f, -11.32f, fractions, colors); + return gradientPaint; + } + + protected GeneralPath getProgressPath(JSlider slider) { + GeneralPath gp = new GeneralPath(); + double sliderWidth = slider.getWidth(); + double sliderHeight = slider.getHeight(); + double progressFromSlider = getProgressFromSlider(slider); + double border = 1.0; + double gap = 2.5; + gp.moveTo(progressFromSlider, border); + gp.lineTo(2 * gap, border); + gp.curveTo(gap, border, border, gap, border, sliderHeight / 2.0); + gp.curveTo(gap, sliderHeight - gap, gap, sliderHeight - border, 2 * gap, sliderHeight - border); + gp.lineTo(progressFromSlider, sliderHeight - border); + double fillValue = getProgressFromSlider(slider); + int curveGap = 3; + if (fillValue >= slider.getWidth() - curveGap) { + gp.lineTo(sliderWidth - 2 * gap, sliderHeight - border); + gp.curveTo( + sliderWidth - gap, + sliderHeight - border, + sliderWidth - border, + sliderHeight - gap, + sliderWidth - border, + sliderHeight / 2.0); + gp.curveTo( + sliderWidth - border, gap, sliderWidth - gap, border, sliderWidth - 2 * gap, border); + } + gp.closePath(); + return gp; + } + + protected GeneralPath getBrightInProgressPath(JSlider slider) { + GeneralPath gp = new GeneralPath(); + double sliderHeight = slider.getHeight(); + double sliderWidth = slider.getWidth(); + double gap = 2.5; + int curveGap = 3; + double fillValue = getProgressFromSlider(slider); + fillValue = fillValue < sliderWidth - curveGap ? fillValue : sliderWidth - curveGap; + gp.moveTo(fillValue, gap); + gp.lineTo(2 * gap, gap); + gp.curveTo(2 * gap, gap, gap, 2 * gap, gap, sliderHeight / 2.0); + gp.lineTo(fillValue, sliderHeight / 2.0); + gp.closePath(); + return gp; + } +} diff --git a/src/main/java/com/josdem/jmetadata/laf/painter/ProgressBigBarPainter.java b/src/main/java/com/josdem/jmetadata/laf/painter/ProgressBigBarPainter.java index b9206df..a7be755 100644 --- a/src/main/java/com/josdem/jmetadata/laf/painter/ProgressBigBarPainter.java +++ b/src/main/java/com/josdem/jmetadata/laf/painter/ProgressBigBarPainter.java @@ -1,172 +1,233 @@ -/* - Copyright 2013 Jose Luis De la Cruz Morales joseluis.delacruz@gmail.com - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -package com.josdem.jmetadata.laf.painter; - -import java.awt.Color; -import java.awt.Graphics; -import java.awt.Graphics2D; -import java.awt.LinearGradientPaint; -import java.awt.RenderingHints; -import java.awt.geom.GeneralPath; - -import javax.swing.JSlider; -import javax.swing.plaf.synth.SynthContext; -import javax.swing.plaf.synth.SynthPainter; - -public class ProgressBigBarPainter extends SynthPainter { - - @Override - public void paintSliderTrackBackground(SynthContext context, Graphics g, int x, int y, int w, int h, int orientation) { - Graphics2D g2 = (Graphics2D) g; - JSlider slider = (JSlider) context.getComponent(); - g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); - g2.setPaint(getBorderGradientPaint()); - g2.fill(getBorderPath(slider)); - g2.setColor(new Color(0xb9, 0xb9, 0xb9)); - } - - @Override - public void paintSliderThumbBackground(SynthContext context, Graphics g, int x, int y, int w, int h, int orientation) { - Graphics2D g2 = (Graphics2D) g; - JSlider slider = (JSlider)context.getComponent(); - g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); - g2.setPaint(getPurpleProgressGradientPaint()); - g2.fill(getProgressPath(slider)); - g2.setPaint(getBrightInPurpleProgressGradientPaint()); - g2.fill(getBrightInProgressPath(slider)); - } - - private int getProgressFromSlider(JSlider progressSlider) { - double currentValue = progressSlider.getValue(); - double sliderWidth = progressSlider.getSize().getWidth(); - int fillValue = (int) (currentValue*sliderWidth/100); - //TODO FIXME Ugly patch for avoiding alias in progress when the bar is at is minimum size; - int curveGap = 3; - return fillValue > curveGap ? fillValue : curveGap; - } - - protected GeneralPath getBorderPath(JSlider slider) { - GeneralPath gp = new GeneralPath(); - double sliderWidth = slider.getWidth(); - double sliderHeight = slider.getHeight(); - double gap = 2.5; - double zero = 0.00; - - gp.moveTo(sliderWidth, sliderHeight/2); - gp.curveTo(sliderWidth, sliderHeight-gap, sliderWidth-gap, sliderHeight, sliderWidth-gap*2, sliderHeight); - gp.lineTo(gap*2, sliderHeight); - gp.curveTo(gap, sliderHeight, zero, sliderHeight-gap, zero, sliderHeight/2); - gp.lineTo(zero, sliderHeight/2); - gp.curveTo(zero, gap, gap, zero, gap*2, zero); - gp.lineTo(sliderWidth-gap*2, zero); - gp.curveTo(sliderWidth-gap, zero, sliderWidth, gap, sliderWidth, sliderHeight/2); - gp.closePath(); - return gp; - } - - protected GeneralPath getBackgroundPath(JSlider slider) { - GeneralPath gp2 = new GeneralPath(); - double sliderWidth = slider.getWidth(); - double sliderHeight = slider.getHeight(); - double gap = 2.5; - double border = 1.00; - - gp2.moveTo(sliderWidth-border, sliderHeight/2); - gp2.curveTo(sliderWidth-border, sliderHeight-gap, sliderWidth-gap, sliderHeight-border, sliderWidth-2*gap, sliderHeight-border); - gp2.lineTo(2*gap, sliderHeight-border); - gp2.curveTo(gap, sliderHeight-border, border, sliderHeight-gap, border, sliderHeight/2); - gp2.lineTo(border, sliderHeight/2); - gp2.curveTo(border, gap, gap, border, gap*2, border); - gp2.lineTo(sliderWidth-gap*2, border); - gp2.curveTo(sliderWidth-gap, border, sliderWidth-border, gap, sliderWidth-border, sliderHeight/2); - gp2.closePath(); - return gp2; - } - - protected LinearGradientPaint getBorderGradientPaint() { - float fractions[] = { 0.000f, 0.0553f, 0.1111f, 0.1673f, 0.2240f, 0.2814f, 0.3393f, 0.3979f, 0.4573f, 0.5176f, 0.5789f, - 0.6414f, 0.7055f, 0.7715f, 0.8402f, 0.9133f, 1.000f }; - - Color colors[] = { Color.WHITE, new Color(0xf1,0xf1,0xf1), new Color(0xe3,0xe3,0xe3), new Color(0xd5,0xd5,0xd5), - new Color(0xc8,0xc7,0xc7), new Color(0xba,0xb9,0xb9), new Color(0xac,0xab,0xab), - new Color(0x9e,0x9d,0x9d), new Color(0x91,0x8f,0x8f), new Color(0x83,0x81,0x81), - new Color(0x75,0x73,0x73), new Color(0x67,0x65,0x65), new Color(0x5a,0x57,0x57), - new Color(0x4c,0x49,0x49), new Color(0x3e,0x3b,0x3b), new Color(0x30,0x2d,0x2d), - new Color(0x23,0x1f,0x20) }; - LinearGradientPaint gradientPaint = new LinearGradientPaint(70.00f, 13.17f, 70.00f, -11.32f, fractions, colors); - return gradientPaint; - } - - protected LinearGradientPaint getPurpleProgressGradientPaint() { - float fractions[] = { 0.000f, 0.0418f, 0.0845f, 0.1283f, 0.1732f, 0.2194f, 0.2671f, 0.3164f, 0.3676f, 0.4210f, 0.4771f, - 0.5365f, 0.6001f, 0.6694f, 0.7471f, 0.8401f, 1.000f }; - Color colors[] = { new Color(0xb8,0x0,0xb8), new Color(0xaf,0x1,0xb0), new Color(0xa6,0x2,0xa8), - new Color(0x9d,0x3,0xa1), new Color(0x94,0x4,0x99), new Color(0x8b,0x5,0x91), new Color(0x82,0x6,0x8a), - new Color(0x79,0x7,0x82), new Color(0x71,0x8,0x7b), new Color(0x68,0x9,0x73), new Color(0x5f,0xa,0x6b), - new Color(0x56,0xb,0x64), new Color(0x4d,0xc,0x5c), new Color(0x44,0xd,0x54), new Color(0x3b,0xe,0x4d), - new Color(0x32,0xf,0x45), new Color(0x2a,0x11,0x3e) }; - LinearGradientPaint gradientPaint = new LinearGradientPaint(69.00f, 9.31f, 69.00f, -7.24f, fractions, colors); - return gradientPaint; - } - - protected GeneralPath getProgressPath(JSlider slider) { - GeneralPath gp = new GeneralPath(); - double sliderWidth = slider.getWidth(); - double sliderHeight = slider.getHeight(); - double progressFromSlider = getProgressFromSlider(slider); - double border = 1.0; - double gap = 2.5; - gp.moveTo(progressFromSlider, border); - gp.lineTo(2*gap, border); - gp.curveTo(gap, border, border, gap, border, sliderHeight/2.0); - gp.curveTo(gap, sliderHeight - gap, gap, sliderHeight-border, 2*gap, sliderHeight-border); - gp.lineTo(progressFromSlider, sliderHeight-border); - double fillValue = getProgressFromSlider(slider); - int curveGap = 3; - if (fillValue >= slider.getWidth()-curveGap) { - gp.lineTo(sliderWidth-2*gap, sliderHeight-border); - gp.curveTo(sliderWidth-gap, sliderHeight-border, sliderWidth-border, sliderHeight-gap, sliderWidth-border, sliderHeight/2.0); - gp.curveTo(sliderWidth-border, gap, sliderWidth-gap, border, sliderWidth-2*gap, border); - } - gp.closePath(); - return gp; - } - - protected GeneralPath getBrightInProgressPath(JSlider slider) { - GeneralPath gp = new GeneralPath(); - double sliderHeight = slider.getHeight(); - double sliderWidth = slider.getWidth(); - double gap = 2.5; - int curveGap = 3; - double fillValue = getProgressFromSlider(slider); - fillValue = fillValue < sliderWidth-curveGap ? fillValue : sliderWidth-curveGap; - gp.moveTo(fillValue, gap); - gp.lineTo(2*gap, gap); - gp.curveTo(2*gap, gap, gap, 2*gap, gap, sliderHeight/2.0); - gp.lineTo(fillValue, sliderHeight/2.0); - gp.closePath(); - return gp; - } - - protected LinearGradientPaint getBrightInPurpleProgressGradientPaint() { - float fractions[] = { 0.160f, 0.479f, 0.877f }; - Color colors[] = { new Color(0x4d, 0x15, 0x5c), new Color(0x85, 0x65, 0x90), new Color(0xd1, 0xc9, 0xd8) }; - LinearGradientPaint gradientPaint = new LinearGradientPaint(44.25f, 6.33f, 44.25f, 0.50f, fractions, colors); - return gradientPaint; - } - -} +/* + Copyright 2013 Jose Luis De la Cruz Morales joseluis.delacruz@gmail.com + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +package com.josdem.jmetadata.laf.painter; + +import java.awt.Color; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.LinearGradientPaint; +import java.awt.RenderingHints; +import java.awt.geom.GeneralPath; +import javax.swing.JSlider; +import javax.swing.plaf.synth.SynthContext; +import javax.swing.plaf.synth.SynthPainter; + +public class ProgressBigBarPainter extends SynthPainter { + + @Override + public void paintSliderTrackBackground( + SynthContext context, Graphics g, int x, int y, int w, int h, int orientation) { + Graphics2D g2 = (Graphics2D) g; + JSlider slider = (JSlider) context.getComponent(); + g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); + g2.setPaint(getBorderGradientPaint()); + g2.fill(getBorderPath(slider)); + g2.setColor(new Color(0xb9, 0xb9, 0xb9)); + } + + @Override + public void paintSliderThumbBackground( + SynthContext context, Graphics g, int x, int y, int w, int h, int orientation) { + Graphics2D g2 = (Graphics2D) g; + JSlider slider = (JSlider) context.getComponent(); + g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); + g2.setPaint(getPurpleProgressGradientPaint()); + g2.fill(getProgressPath(slider)); + g2.setPaint(getBrightInPurpleProgressGradientPaint()); + g2.fill(getBrightInProgressPath(slider)); + } + + private int getProgressFromSlider(JSlider progressSlider) { + double currentValue = progressSlider.getValue(); + double sliderWidth = progressSlider.getSize().getWidth(); + int fillValue = (int) (currentValue * sliderWidth / 100); + // TODO FIXME Ugly patch for avoiding alias in progress when the bar is at is minimum size; + int curveGap = 3; + return fillValue > curveGap ? fillValue : curveGap; + } + + protected GeneralPath getBorderPath(JSlider slider) { + GeneralPath gp = new GeneralPath(); + double sliderWidth = slider.getWidth(); + double sliderHeight = slider.getHeight(); + double gap = 2.5; + double zero = 0.00; + + gp.moveTo(sliderWidth, sliderHeight / 2); + gp.curveTo( + sliderWidth, + sliderHeight - gap, + sliderWidth - gap, + sliderHeight, + sliderWidth - gap * 2, + sliderHeight); + gp.lineTo(gap * 2, sliderHeight); + gp.curveTo(gap, sliderHeight, zero, sliderHeight - gap, zero, sliderHeight / 2); + gp.lineTo(zero, sliderHeight / 2); + gp.curveTo(zero, gap, gap, zero, gap * 2, zero); + gp.lineTo(sliderWidth - gap * 2, zero); + gp.curveTo(sliderWidth - gap, zero, sliderWidth, gap, sliderWidth, sliderHeight / 2); + gp.closePath(); + return gp; + } + + protected GeneralPath getBackgroundPath(JSlider slider) { + GeneralPath gp2 = new GeneralPath(); + double sliderWidth = slider.getWidth(); + double sliderHeight = slider.getHeight(); + double gap = 2.5; + double border = 1.00; + + gp2.moveTo(sliderWidth - border, sliderHeight / 2); + gp2.curveTo( + sliderWidth - border, + sliderHeight - gap, + sliderWidth - gap, + sliderHeight - border, + sliderWidth - 2 * gap, + sliderHeight - border); + gp2.lineTo(2 * gap, sliderHeight - border); + gp2.curveTo(gap, sliderHeight - border, border, sliderHeight - gap, border, sliderHeight / 2); + gp2.lineTo(border, sliderHeight / 2); + gp2.curveTo(border, gap, gap, border, gap * 2, border); + gp2.lineTo(sliderWidth - gap * 2, border); + gp2.curveTo( + sliderWidth - gap, + border, + sliderWidth - border, + gap, + sliderWidth - border, + sliderHeight / 2); + gp2.closePath(); + return gp2; + } + + protected LinearGradientPaint getBorderGradientPaint() { + float fractions[] = { + 0.000f, 0.0553f, 0.1111f, 0.1673f, 0.2240f, 0.2814f, 0.3393f, 0.3979f, 0.4573f, 0.5176f, + 0.5789f, 0.6414f, 0.7055f, 0.7715f, 0.8402f, 0.9133f, 1.000f + }; + + Color colors[] = { + Color.WHITE, + new Color(0xf1, 0xf1, 0xf1), + new Color(0xe3, 0xe3, 0xe3), + new Color(0xd5, 0xd5, 0xd5), + new Color(0xc8, 0xc7, 0xc7), + new Color(0xba, 0xb9, 0xb9), + new Color(0xac, 0xab, 0xab), + new Color(0x9e, 0x9d, 0x9d), + new Color(0x91, 0x8f, 0x8f), + new Color(0x83, 0x81, 0x81), + new Color(0x75, 0x73, 0x73), + new Color(0x67, 0x65, 0x65), + new Color(0x5a, 0x57, 0x57), + new Color(0x4c, 0x49, 0x49), + new Color(0x3e, 0x3b, 0x3b), + new Color(0x30, 0x2d, 0x2d), + new Color(0x23, 0x1f, 0x20) + }; + LinearGradientPaint gradientPaint = + new LinearGradientPaint(70.00f, 13.17f, 70.00f, -11.32f, fractions, colors); + return gradientPaint; + } + + protected LinearGradientPaint getPurpleProgressGradientPaint() { + float fractions[] = { + 0.000f, 0.0418f, 0.0845f, 0.1283f, 0.1732f, 0.2194f, 0.2671f, 0.3164f, 0.3676f, 0.4210f, + 0.4771f, 0.5365f, 0.6001f, 0.6694f, 0.7471f, 0.8401f, 1.000f + }; + Color colors[] = { + new Color(0xb8, 0x0, 0xb8), + new Color(0xaf, 0x1, 0xb0), + new Color(0xa6, 0x2, 0xa8), + new Color(0x9d, 0x3, 0xa1), + new Color(0x94, 0x4, 0x99), + new Color(0x8b, 0x5, 0x91), + new Color(0x82, 0x6, 0x8a), + new Color(0x79, 0x7, 0x82), + new Color(0x71, 0x8, 0x7b), + new Color(0x68, 0x9, 0x73), + new Color(0x5f, 0xa, 0x6b), + new Color(0x56, 0xb, 0x64), + new Color(0x4d, 0xc, 0x5c), + new Color(0x44, 0xd, 0x54), + new Color(0x3b, 0xe, 0x4d), + new Color(0x32, 0xf, 0x45), + new Color(0x2a, 0x11, 0x3e) + }; + LinearGradientPaint gradientPaint = + new LinearGradientPaint(69.00f, 9.31f, 69.00f, -7.24f, fractions, colors); + return gradientPaint; + } + + protected GeneralPath getProgressPath(JSlider slider) { + GeneralPath gp = new GeneralPath(); + double sliderWidth = slider.getWidth(); + double sliderHeight = slider.getHeight(); + double progressFromSlider = getProgressFromSlider(slider); + double border = 1.0; + double gap = 2.5; + gp.moveTo(progressFromSlider, border); + gp.lineTo(2 * gap, border); + gp.curveTo(gap, border, border, gap, border, sliderHeight / 2.0); + gp.curveTo(gap, sliderHeight - gap, gap, sliderHeight - border, 2 * gap, sliderHeight - border); + gp.lineTo(progressFromSlider, sliderHeight - border); + double fillValue = getProgressFromSlider(slider); + int curveGap = 3; + if (fillValue >= slider.getWidth() - curveGap) { + gp.lineTo(sliderWidth - 2 * gap, sliderHeight - border); + gp.curveTo( + sliderWidth - gap, + sliderHeight - border, + sliderWidth - border, + sliderHeight - gap, + sliderWidth - border, + sliderHeight / 2.0); + gp.curveTo( + sliderWidth - border, gap, sliderWidth - gap, border, sliderWidth - 2 * gap, border); + } + gp.closePath(); + return gp; + } + + protected GeneralPath getBrightInProgressPath(JSlider slider) { + GeneralPath gp = new GeneralPath(); + double sliderHeight = slider.getHeight(); + double sliderWidth = slider.getWidth(); + double gap = 2.5; + int curveGap = 3; + double fillValue = getProgressFromSlider(slider); + fillValue = fillValue < sliderWidth - curveGap ? fillValue : sliderWidth - curveGap; + gp.moveTo(fillValue, gap); + gp.lineTo(2 * gap, gap); + gp.curveTo(2 * gap, gap, gap, 2 * gap, gap, sliderHeight / 2.0); + gp.lineTo(fillValue, sliderHeight / 2.0); + gp.closePath(); + return gp; + } + + protected LinearGradientPaint getBrightInPurpleProgressGradientPaint() { + float fractions[] = {0.160f, 0.479f, 0.877f}; + Color colors[] = { + new Color(0x4d, 0x15, 0x5c), new Color(0x85, 0x65, 0x90), new Color(0xd1, 0xc9, 0xd8) + }; + LinearGradientPaint gradientPaint = + new LinearGradientPaint(44.25f, 6.33f, 44.25f, 0.50f, fractions, colors); + return gradientPaint; + } +} diff --git a/src/main/java/com/josdem/jmetadata/laf/painter/TableDownloadSelectedHeaderPanelPainter.java b/src/main/java/com/josdem/jmetadata/laf/painter/TableDownloadSelectedHeaderPanelPainter.java index ee97023..42ab984 100644 --- a/src/main/java/com/josdem/jmetadata/laf/painter/TableDownloadSelectedHeaderPanelPainter.java +++ b/src/main/java/com/josdem/jmetadata/laf/painter/TableDownloadSelectedHeaderPanelPainter.java @@ -1,47 +1,66 @@ -/* - Copyright 2013 Jose Luis De la Cruz Morales joseluis.delacruz@gmail.com - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -package com.josdem.jmetadata.laf.painter; - -import java.awt.Color; -import java.awt.Graphics; -import java.awt.Graphics2D; -import java.awt.LinearGradientPaint; - -import javax.swing.plaf.synth.SynthContext; -import javax.swing.plaf.synth.SynthPainter; - -public class TableDownloadSelectedHeaderPanelPainter extends SynthPainter { - private static final float[] FRACTIONS = { 0.360f, 0.4506f, 0.5073f, 0.5558f, 0.5996f, 0.6402f, 0.6785f, 0.7149f, 0.7497f, 0.7833f, 0.8158f, 0.8474f, 0.8780f, 0.9080f, 0.9372f, 0.9658f, 0.994f }; - - private static final Color[] COLORS = { new Color(0x5a, 0x5a, 0x5a), new Color(0x60, 0x60, 0x60), new Color(0x67, 0x67, 0x67), new Color(0x6e, 0x6e, 0x6e), new Color(0x75, 0x75, 0x75), - new Color(0x7c, 0x7c, 0x7c), new Color(0x83, 0x83, 0x83), new Color(0x8a, 0x8a, 0x8a), new Color(0x91, 0x91, 0x91), new Color(0x97, 0x97, 0x97), new Color(0x9e, 0x9e, 0x9e), - new Color(0xa5, 0xa5, 0xa5), new Color(0xac, 0xac, 0xac), new Color(0xb3, 0xb3, 0xb3), new Color(0xba, 0xba, 0xba), new Color(0xc1, 0xc1, 0xc1), new Color(0xc8, 0xc8, 0xc8) }; - private Color shadowColor = new Color(0x64, 0x64, 0x64); - private Color gridColor = new Color(0x77, 0x77, 0x77); - - @Override - public void paintPanelBackground(SynthContext context, Graphics g, int x, int y, int w, int h) { - LinearGradientPaint gradientPaint = new LinearGradientPaint(67.00f, 25.08f, 67.00f, -11.50f, FRACTIONS, COLORS); - ((Graphics2D) g).setPaint(gradientPaint); - g.fillRect(x, y, w, h); - g.setColor(shadowColor); - g.fillRect(x, y, w, 3); - g.setColor(gridColor); - g.drawLine(0, h - 1, w, h - 1); - g.drawLine(w - 1, 0, w - 1, h - 1); - } -} +/* + Copyright 2013 Jose Luis De la Cruz Morales joseluis.delacruz@gmail.com + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +package com.josdem.jmetadata.laf.painter; + +import java.awt.Color; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.LinearGradientPaint; +import javax.swing.plaf.synth.SynthContext; +import javax.swing.plaf.synth.SynthPainter; + +public class TableDownloadSelectedHeaderPanelPainter extends SynthPainter { + private static final float[] FRACTIONS = { + 0.360f, 0.4506f, 0.5073f, 0.5558f, 0.5996f, 0.6402f, 0.6785f, 0.7149f, 0.7497f, 0.7833f, + 0.8158f, 0.8474f, 0.8780f, 0.9080f, 0.9372f, 0.9658f, 0.994f + }; + + private static final Color[] COLORS = { + new Color(0x5a, 0x5a, 0x5a), + new Color(0x60, 0x60, 0x60), + new Color(0x67, 0x67, 0x67), + new Color(0x6e, 0x6e, 0x6e), + new Color(0x75, 0x75, 0x75), + new Color(0x7c, 0x7c, 0x7c), + new Color(0x83, 0x83, 0x83), + new Color(0x8a, 0x8a, 0x8a), + new Color(0x91, 0x91, 0x91), + new Color(0x97, 0x97, 0x97), + new Color(0x9e, 0x9e, 0x9e), + new Color(0xa5, 0xa5, 0xa5), + new Color(0xac, 0xac, 0xac), + new Color(0xb3, 0xb3, 0xb3), + new Color(0xba, 0xba, 0xba), + new Color(0xc1, 0xc1, 0xc1), + new Color(0xc8, 0xc8, 0xc8) + }; + private Color shadowColor = new Color(0x64, 0x64, 0x64); + private Color gridColor = new Color(0x77, 0x77, 0x77); + + @Override + public void paintPanelBackground(SynthContext context, Graphics g, int x, int y, int w, int h) { + LinearGradientPaint gradientPaint = + new LinearGradientPaint(67.00f, 25.08f, 67.00f, -11.50f, FRACTIONS, COLORS); + ((Graphics2D) g).setPaint(gradientPaint); + g.fillRect(x, y, w, h); + g.setColor(shadowColor); + g.fillRect(x, y, w, 3); + g.setColor(gridColor); + g.drawLine(0, h - 1, w, h - 1); + g.drawLine(w - 1, 0, w - 1, h - 1); + } +} diff --git a/src/main/java/com/josdem/jmetadata/laf/painter/TableHeaderPanelPainter.java b/src/main/java/com/josdem/jmetadata/laf/painter/TableHeaderPanelPainter.java index ab3b0a4..05e6bc4 100644 --- a/src/main/java/com/josdem/jmetadata/laf/painter/TableHeaderPanelPainter.java +++ b/src/main/java/com/josdem/jmetadata/laf/painter/TableHeaderPanelPainter.java @@ -1,44 +1,44 @@ -/* - Copyright 2013 Jose Luis De la Cruz Morales joseluis.delacruz@gmail.com - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -package com.josdem.jmetadata.laf.painter; - -import java.awt.Color; -import java.awt.Graphics; -import java.awt.Graphics2D; -import java.awt.LinearGradientPaint; - -import javax.swing.plaf.synth.SynthContext; -import javax.swing.plaf.synth.SynthPainter; - -public class TableHeaderPanelPainter extends SynthPainter { - private static final float[] FRACTIONS = {0f, 1f}; - private static final Color[] COLORS = {new Color(0xd9,0xd9,0xd9), new Color(0x67,0x67,0x67)}; - private Color shadowColor = new Color(0xb4,0xb3,0xb4); - private Color gridColor = new Color(0x77,0x77,0x77); - - @Override - public void paintPanelBackground(SynthContext context, Graphics g, int x, int y, int w, int h) { - LinearGradientPaint gradientPaint = new LinearGradientPaint(2f, 18.42f, 2f, -8.84f, FRACTIONS, COLORS); - ((Graphics2D) g).setPaint(gradientPaint); - g.fillRect(x, y, w, h); - g.setColor(shadowColor); - g.fillRect(x, y, w, 3); - g.setColor(gridColor); - g.drawLine(0, h - 1, w, h - 1); - g.drawLine(w-1, 0, w-1, h - 1); - } -} +/* + Copyright 2013 Jose Luis De la Cruz Morales joseluis.delacruz@gmail.com + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +package com.josdem.jmetadata.laf.painter; + +import java.awt.Color; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.LinearGradientPaint; +import javax.swing.plaf.synth.SynthContext; +import javax.swing.plaf.synth.SynthPainter; + +public class TableHeaderPanelPainter extends SynthPainter { + private static final float[] FRACTIONS = {0f, 1f}; + private static final Color[] COLORS = {new Color(0xd9, 0xd9, 0xd9), new Color(0x67, 0x67, 0x67)}; + private Color shadowColor = new Color(0xb4, 0xb3, 0xb4); + private Color gridColor = new Color(0x77, 0x77, 0x77); + + @Override + public void paintPanelBackground(SynthContext context, Graphics g, int x, int y, int w, int h) { + LinearGradientPaint gradientPaint = + new LinearGradientPaint(2f, 18.42f, 2f, -8.84f, FRACTIONS, COLORS); + ((Graphics2D) g).setPaint(gradientPaint); + g.fillRect(x, y, w, h); + g.setColor(shadowColor); + g.fillRect(x, y, w, 3); + g.setColor(gridColor); + g.drawLine(0, h - 1, w, h - 1); + g.drawLine(w - 1, 0, w - 1, h - 1); + } +} diff --git a/src/main/java/com/josdem/jmetadata/laf/painter/TableSearchSelectedHeaderPanelPainter.java b/src/main/java/com/josdem/jmetadata/laf/painter/TableSearchSelectedHeaderPanelPainter.java index 8e28052..aeaa9e6 100644 --- a/src/main/java/com/josdem/jmetadata/laf/painter/TableSearchSelectedHeaderPanelPainter.java +++ b/src/main/java/com/josdem/jmetadata/laf/painter/TableSearchSelectedHeaderPanelPainter.java @@ -1,48 +1,66 @@ -/* - Copyright 2013 Jose Luis De la Cruz Morales joseluis.delacruz@gmail.com - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -package com.josdem.jmetadata.laf.painter; - -import java.awt.Color; -import java.awt.Graphics; -import java.awt.Graphics2D; -import java.awt.LinearGradientPaint; - -import javax.swing.plaf.synth.SynthContext; -import javax.swing.plaf.synth.SynthPainter; - -public class TableSearchSelectedHeaderPanelPainter extends SynthPainter { - private static final float[] FRACTIONS = { 0.294f, 0.4186f, 0.4858f, 0.5408f, 0.5892f, 0.6332f, 0.6739f, 0.7122f, 0.7485f, 0.7831f, 0.8162f, 0.8482f, 0.8790f, 0.9090f, 0.9380f, 0.9663f, 0.994f }; - - private static final Color[] COLORS = { new Color(0x97, 0x5d, 0x8d), new Color(0x9a, 0x62, 0x8f), new Color(0x9e, 0x67, 0x92), new Color(0xa2, 0x6c, 0x94), new Color(0xa6, 0x71, 0x97), - new Color(0xaa, 0x76, 0x99), new Color(0xad, 0x7b, 0x9c), new Color(0xb1, 0x80, 0x9e), new Color(0xb5, 0x85, 0xa1), new Color(0xb9, 0x8a, 0xa4), new Color(0xbd, 0x8f, 0xa6), - new Color(0xc0, 0x94, 0xa9), new Color(0xc4, 0x99, 0xab), new Color(0xc8, 0x9e, 0xae), new Color(0xcc, 0xa3, 0xb0), new Color(0xd0, 0xa8, 0xb3), new Color(0xd4, 0xae, 0xb6) }; - private Color shadowColor = new Color(0x97, 0x5d, 0x8d); - private Color gridColor = new Color(0x77, 0x77, 0x77); - - @Override - public void paintPanelBackground(SynthContext context, Graphics g, int x, int y, int w, int h) { - LinearGradientPaint gradientPaint = new LinearGradientPaint(67.00f, 18.24f, 67.00f, -7.18f, FRACTIONS, COLORS); - ((Graphics2D) g).setPaint(gradientPaint); - g.fillRect(x, y, w, h); - g.setColor(shadowColor); - g.fillRect(x, y, w, 3); - g.setColor(gridColor); - g.drawLine(0, h - 1, w, h - 1); - g.drawLine(w - 1, 0, w - 1, h - 1); - } - -} +/* + Copyright 2013 Jose Luis De la Cruz Morales joseluis.delacruz@gmail.com + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +package com.josdem.jmetadata.laf.painter; + +import java.awt.Color; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.LinearGradientPaint; +import javax.swing.plaf.synth.SynthContext; +import javax.swing.plaf.synth.SynthPainter; + +public class TableSearchSelectedHeaderPanelPainter extends SynthPainter { + private static final float[] FRACTIONS = { + 0.294f, 0.4186f, 0.4858f, 0.5408f, 0.5892f, 0.6332f, 0.6739f, 0.7122f, 0.7485f, 0.7831f, + 0.8162f, 0.8482f, 0.8790f, 0.9090f, 0.9380f, 0.9663f, 0.994f + }; + + private static final Color[] COLORS = { + new Color(0x97, 0x5d, 0x8d), + new Color(0x9a, 0x62, 0x8f), + new Color(0x9e, 0x67, 0x92), + new Color(0xa2, 0x6c, 0x94), + new Color(0xa6, 0x71, 0x97), + new Color(0xaa, 0x76, 0x99), + new Color(0xad, 0x7b, 0x9c), + new Color(0xb1, 0x80, 0x9e), + new Color(0xb5, 0x85, 0xa1), + new Color(0xb9, 0x8a, 0xa4), + new Color(0xbd, 0x8f, 0xa6), + new Color(0xc0, 0x94, 0xa9), + new Color(0xc4, 0x99, 0xab), + new Color(0xc8, 0x9e, 0xae), + new Color(0xcc, 0xa3, 0xb0), + new Color(0xd0, 0xa8, 0xb3), + new Color(0xd4, 0xae, 0xb6) + }; + private Color shadowColor = new Color(0x97, 0x5d, 0x8d); + private Color gridColor = new Color(0x77, 0x77, 0x77); + + @Override + public void paintPanelBackground(SynthContext context, Graphics g, int x, int y, int w, int h) { + LinearGradientPaint gradientPaint = + new LinearGradientPaint(67.00f, 18.24f, 67.00f, -7.18f, FRACTIONS, COLORS); + ((Graphics2D) g).setPaint(gradientPaint); + g.fillRect(x, y, w, h); + g.setColor(shadowColor); + g.fillRect(x, y, w, 3); + g.setColor(gridColor); + g.drawLine(0, h - 1, w, h - 1); + g.drawLine(w - 1, 0, w - 1, h - 1); + } +} diff --git a/src/main/java/com/josdem/jmetadata/laf/painter/TableSelectedHeaderPanelPainter.java b/src/main/java/com/josdem/jmetadata/laf/painter/TableSelectedHeaderPanelPainter.java index 8f77f3c..96909f4 100644 --- a/src/main/java/com/josdem/jmetadata/laf/painter/TableSelectedHeaderPanelPainter.java +++ b/src/main/java/com/josdem/jmetadata/laf/painter/TableSelectedHeaderPanelPainter.java @@ -1,48 +1,66 @@ -/* - Copyright 2013 Jose Luis De la Cruz Morales joseluis.delacruz@gmail.com - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -package com.josdem.jmetadata.laf.painter; - -import java.awt.Color; -import java.awt.Graphics; -import java.awt.Graphics2D; -import java.awt.LinearGradientPaint; - -import javax.swing.plaf.synth.SynthContext; -import javax.swing.plaf.synth.SynthPainter; - -public class TableSelectedHeaderPanelPainter extends SynthPainter { - private static final float[] FRACTIONS = { 0.261f, 0.3920f, 0.4625f, 0.5202f, 0.5709f, 0.6169f, 0.6596f, 0.6996f, 0.7376f, 0.7737f, 0.8084f, 0.8417f, 0.8740f, 0.9052f, 0.9355f, 0.9651f, 0.994f, }; - - private static final Color[] COLORS = { new Color(0x50, 0x8c, 0xaa), new Color(0x55, 0x8f, 0xad), new Color(0x5a, 0x93, 0xb0), new Color(0x5f, 0x97, 0xb3), new Color(0x65, 0x9b, 0xb6), - new Color(0x6a, 0x9e, 0xb9), new Color(0x6f, 0xa2, 0xbc), new Color(0x75, 0xa6, 0xbf), new Color(0x7a, 0xaa, 0xc3), new Color(0x7f, 0xad, 0xc6), new Color(0x85, 0xb1, 0xc9), - new Color(0x8a, 0xb5, 0xcc), new Color(0x8f, 0xb9, 0xcf), new Color(0x95, 0xbc, 0xd2), new Color(0x9a, 0xc0, 0xd5), new Color(0x9f, 0xc4, 0xd8), new Color(0xa5, 0xc8, 0xdc) }; - private Color shadowColor = new Color(0x50, 0x8c, 0xaa); - private Color gridColor = new Color(0x77, 0x77, 0x77); - - @Override - public void paintPanelBackground(SynthContext context, Graphics g, int x, int y, int w, int h) { - LinearGradientPaint gradientPaint = new LinearGradientPaint(67.00f, 18.20f, 67.00f, -8.00f, FRACTIONS, COLORS); - ((Graphics2D) g).setPaint(gradientPaint); - g.fillRect(x, y, w, h); - g.setColor(shadowColor); - g.fillRect(x, y, w, 3); - g.setColor(gridColor); - g.drawLine(0, h - 1, w, h - 1); - g.drawLine(w - 1, 0, w - 1, h - 1); - } - -} +/* + Copyright 2013 Jose Luis De la Cruz Morales joseluis.delacruz@gmail.com + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +package com.josdem.jmetadata.laf.painter; + +import java.awt.Color; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.LinearGradientPaint; +import javax.swing.plaf.synth.SynthContext; +import javax.swing.plaf.synth.SynthPainter; + +public class TableSelectedHeaderPanelPainter extends SynthPainter { + private static final float[] FRACTIONS = { + 0.261f, 0.3920f, 0.4625f, 0.5202f, 0.5709f, 0.6169f, 0.6596f, 0.6996f, 0.7376f, 0.7737f, + 0.8084f, 0.8417f, 0.8740f, 0.9052f, 0.9355f, 0.9651f, 0.994f, + }; + + private static final Color[] COLORS = { + new Color(0x50, 0x8c, 0xaa), + new Color(0x55, 0x8f, 0xad), + new Color(0x5a, 0x93, 0xb0), + new Color(0x5f, 0x97, 0xb3), + new Color(0x65, 0x9b, 0xb6), + new Color(0x6a, 0x9e, 0xb9), + new Color(0x6f, 0xa2, 0xbc), + new Color(0x75, 0xa6, 0xbf), + new Color(0x7a, 0xaa, 0xc3), + new Color(0x7f, 0xad, 0xc6), + new Color(0x85, 0xb1, 0xc9), + new Color(0x8a, 0xb5, 0xcc), + new Color(0x8f, 0xb9, 0xcf), + new Color(0x95, 0xbc, 0xd2), + new Color(0x9a, 0xc0, 0xd5), + new Color(0x9f, 0xc4, 0xd8), + new Color(0xa5, 0xc8, 0xdc) + }; + private Color shadowColor = new Color(0x50, 0x8c, 0xaa); + private Color gridColor = new Color(0x77, 0x77, 0x77); + + @Override + public void paintPanelBackground(SynthContext context, Graphics g, int x, int y, int w, int h) { + LinearGradientPaint gradientPaint = + new LinearGradientPaint(67.00f, 18.20f, 67.00f, -8.00f, FRACTIONS, COLORS); + ((Graphics2D) g).setPaint(gradientPaint); + g.fillRect(x, y, w, h); + g.setColor(shadowColor); + g.fillRect(x, y, w, 3); + g.setColor(gridColor); + g.drawLine(0, h - 1, w, h - 1); + g.drawLine(w - 1, 0, w - 1, h - 1); + } +} diff --git a/src/main/java/com/josdem/jmetadata/metadata/MetadataReader.java b/src/main/java/com/josdem/jmetadata/metadata/MetadataReader.java index d35ba59..9b4e663 100644 --- a/src/main/java/com/josdem/jmetadata/metadata/MetadataReader.java +++ b/src/main/java/com/josdem/jmetadata/metadata/MetadataReader.java @@ -16,159 +16,157 @@ package com.josdem.jmetadata.metadata; -import java.io.File; +import com.josdem.jmetadata.event.Events; +import com.josdem.jmetadata.exception.MetadataException; +import com.josdem.jmetadata.model.Metadata; import java.awt.Image; +import java.io.File; import java.io.IOException; - +import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.asmatron.messengine.event.ValueEvent; import org.asmatron.messengine.engines.support.ControlEngineConfigurator; - -import com.josdem.jmetadata.exception.MetadataException; -import org.jaudiotagger.tag.Tag; -import org.jaudiotagger.tag.FieldKey; -import org.jaudiotagger.tag.TagException; -import org.jaudiotagger.tag.datatype.Artwork; +import org.asmatron.messengine.event.ValueEvent; import org.jaudiotagger.audio.AudioHeader; import org.jaudiotagger.audio.exceptions.CannotReadException; -import org.jaudiotagger.audio.exceptions.ReadOnlyFileException; import org.jaudiotagger.audio.exceptions.InvalidAudioFrameException; - -import org.springframework.stereotype.Service; +import org.jaudiotagger.audio.exceptions.ReadOnlyFileException; +import org.jaudiotagger.tag.FieldKey; +import org.jaudiotagger.tag.Tag; +import org.jaudiotagger.tag.TagException; +import org.jaudiotagger.tag.datatype.Artwork; import org.springframework.beans.factory.annotation.Autowired; - -import com.josdem.jmetadata.event.Events; -import com.josdem.jmetadata.model.Metadata; - -import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; @Slf4j /** -* @undestands A class who gather all common methods getting Metadata -*/ - + * @undestands A class who gather all common methods getting Metadata + */ @Service public abstract class MetadataReader { - private static final String NULL = "null"; + private static final String NULL = "null"; protected Tag tag; - protected AudioHeader header; - - @Autowired - protected ControlEngineConfigurator configurator; - - - public abstract String getGenre(); - public abstract Metadata getMetadata(File file) throws CannotReadException, IOException, TagException, ReadOnlyFileException, InvalidAudioFrameException, MetadataException; - - private String getArtist(){ - return tag.getFirst(FieldKey.ARTIST); - } - - private String getTitle(){ - return tag.getFirst(FieldKey.TITLE); - } - - private String getAlbum(){ - return tag.getFirst(FieldKey.ALBUM); - } - - private String getYear() { - return tag.getFirst(FieldKey.YEAR); - } - - private int getLength(){ - return header.getTrackLength(); - } - - private int getBitRate() { - // Case variable bitRate - String bitRate = header.getBitRate().replace("~", ""); - return Integer.parseInt(bitRate); - } - - private String getTrackNumber(){ - try{ - String trackNumber = tag.getFirst(FieldKey.TRACK); - return trackNumber == NULL ? StringUtils.EMPTY : trackNumber; - } catch (NullPointerException nue){ - log.warn("NullPointer Exception in getting TrackNumber at: " + getTitle()); - return StringUtils.EMPTY; - } - } - - private String getTotalTracks(){ - try{ - String totalTracks = tag.getFirst(FieldKey.TRACK_TOTAL); - return totalTracks == NULL ? StringUtils.EMPTY : totalTracks; - } catch(NullPointerException nue){ - log.warn("NullPointer Exception in getting Total Tracks at: " + getTitle()); - return StringUtils.EMPTY; - } - } - - private String getCdNumber() { - try{ - String cdNumber = tag.getFirst(FieldKey.DISC_NO); - return cdNumber == NULL ? StringUtils.EMPTY : cdNumber; - } catch (NullPointerException nue){ - log.warn("NullPointer Exception in getting CD Number at: " + getTitle()); - return StringUtils.EMPTY; - } - } - - private String getTotalCds() { - try{ - String cdsTotal = tag.getFirst(FieldKey.DISC_TOTAL); - return cdsTotal == NULL ? StringUtils.EMPTY : cdsTotal; - } catch (NullPointerException nue){ - log.warn("NullPointer Exception in getting Total CDs Number at: " + getTitle()); - return StringUtils.EMPTY; - } - } - - /** - * TODO: Bug in JAudioTagger null pointer exception when artwork.getImage() - */ - private Image getCoverArt(Metadata metadata) throws MetadataException { - try{ - if(tag == null) return null; - Artwork artwork = tag.getFirstArtwork(); - log.info(getTitle() + " has cover art?: " + (artwork != null)); - return artwork==null ? null: artwork.getImage(); - } catch(IllegalArgumentException iae){ - return handleCoverArtException(metadata, iae); - } catch (IOException ioe){ - return handleCoverArtException(metadata, ioe); - } catch (NullPointerException nue){ - return handleCoverArtException(metadata, nue); - } - } - - private Image handleCoverArtException(Metadata metadata, Exception exc) { - log.info("couldn't get coverArt for file: " + metadata.getTitle()); - log.error("Exception: " + exc.getMessage()); - configurator.getControlEngine().fireEvent(Events.LOAD_COVER_ART, new ValueEvent(getTitle())); - return null; - } - - protected Metadata generateMetadata(File file) throws IOException, MetadataException { - Metadata metadata = new Metadata(); - metadata.setCoverArt(getCoverArt(metadata)); - metadata.setTitle(getTitle()); - metadata.setArtist(getArtist()); - metadata.setAlbum(getAlbum()); - metadata.setGenre(getGenre()); - metadata.setYear(getYear()); - metadata.setLength(getLength()); - metadata.setTrackNumber(getTrackNumber()); - metadata.setTotalTracks(getTotalTracks()); - metadata.setCdNumber(getCdNumber()); - metadata.setTotalCds(getTotalCds()); - metadata.setBitRate(getBitRate()); - metadata.setFile(file); - return metadata; - } - + protected AudioHeader header; + + @Autowired protected ControlEngineConfigurator configurator; + + public abstract String getGenre(); + + public abstract Metadata getMetadata(File file) + throws CannotReadException, + IOException, + TagException, + ReadOnlyFileException, + InvalidAudioFrameException, + MetadataException; + + private String getArtist() { + return tag.getFirst(FieldKey.ARTIST); + } + + private String getTitle() { + return tag.getFirst(FieldKey.TITLE); + } + + private String getAlbum() { + return tag.getFirst(FieldKey.ALBUM); + } + + private String getYear() { + return tag.getFirst(FieldKey.YEAR); + } + + private int getLength() { + return header.getTrackLength(); + } + + private int getBitRate() { + // Case variable bitRate + String bitRate = header.getBitRate().replace("~", ""); + return Integer.parseInt(bitRate); + } + + private String getTrackNumber() { + try { + String trackNumber = tag.getFirst(FieldKey.TRACK); + return trackNumber == NULL ? StringUtils.EMPTY : trackNumber; + } catch (NullPointerException nue) { + log.warn("NullPointer Exception in getting TrackNumber at: " + getTitle()); + return StringUtils.EMPTY; + } + } + + private String getTotalTracks() { + try { + String totalTracks = tag.getFirst(FieldKey.TRACK_TOTAL); + return totalTracks == NULL ? StringUtils.EMPTY : totalTracks; + } catch (NullPointerException nue) { + log.warn("NullPointer Exception in getting Total Tracks at: " + getTitle()); + return StringUtils.EMPTY; + } + } + + private String getCdNumber() { + try { + String cdNumber = tag.getFirst(FieldKey.DISC_NO); + return cdNumber == NULL ? StringUtils.EMPTY : cdNumber; + } catch (NullPointerException nue) { + log.warn("NullPointer Exception in getting CD Number at: " + getTitle()); + return StringUtils.EMPTY; + } + } + + private String getTotalCds() { + try { + String cdsTotal = tag.getFirst(FieldKey.DISC_TOTAL); + return cdsTotal == NULL ? StringUtils.EMPTY : cdsTotal; + } catch (NullPointerException nue) { + log.warn("NullPointer Exception in getting Total CDs Number at: " + getTitle()); + return StringUtils.EMPTY; + } + } + + /** TODO: Bug in JAudioTagger null pointer exception when artwork.getImage() */ + private Image getCoverArt(Metadata metadata) throws MetadataException { + try { + if (tag == null) return null; + Artwork artwork = tag.getFirstArtwork(); + log.info(getTitle() + " has cover art?: " + (artwork != null)); + return artwork == null ? null : artwork.getImage(); + } catch (IllegalArgumentException iae) { + return handleCoverArtException(metadata, iae); + } catch (IOException ioe) { + return handleCoverArtException(metadata, ioe); + } catch (NullPointerException nue) { + return handleCoverArtException(metadata, nue); + } + } + + private Image handleCoverArtException(Metadata metadata, Exception exc) { + log.info("couldn't get coverArt for file: " + metadata.getTitle()); + log.error("Exception: " + exc.getMessage()); + configurator + .getControlEngine() + .fireEvent(Events.LOAD_COVER_ART, new ValueEvent(getTitle())); + return null; + } + + protected Metadata generateMetadata(File file) throws IOException, MetadataException { + Metadata metadata = new Metadata(); + metadata.setCoverArt(getCoverArt(metadata)); + metadata.setTitle(getTitle()); + metadata.setArtist(getArtist()); + metadata.setAlbum(getAlbum()); + metadata.setGenre(getGenre()); + metadata.setYear(getYear()); + metadata.setLength(getLength()); + metadata.setTrackNumber(getTrackNumber()); + metadata.setTotalTracks(getTotalTracks()); + metadata.setCdNumber(getCdNumber()); + metadata.setTotalCds(getTotalCds()); + metadata.setBitRate(getBitRate()); + metadata.setFile(file); + return metadata; + } } diff --git a/src/main/java/com/josdem/jmetadata/metadata/MetadataWriter.java b/src/main/java/com/josdem/jmetadata/metadata/MetadataWriter.java index 588b02b..4be4246 100644 --- a/src/main/java/com/josdem/jmetadata/metadata/MetadataWriter.java +++ b/src/main/java/com/josdem/jmetadata/metadata/MetadataWriter.java @@ -16,244 +16,236 @@ package com.josdem.jmetadata.metadata; +import com.josdem.jmetadata.exception.MetadataException; +import com.josdem.jmetadata.helper.ArtworkHelper; +import com.josdem.jmetadata.helper.AudioFileHelper; +import com.josdem.jmetadata.util.ImageUtils; +import java.awt.Image; import java.io.File; import java.io.IOException; -import java.awt.Image; - +import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; - -import com.josdem.jmetadata.exception.MetadataException; -import org.jaudiotagger.tag.Tag; -import org.jaudiotagger.tag.FieldKey; -import org.jaudiotagger.tag.TagException; -import org.jaudiotagger.tag.datatype.Artwork; -import org.jaudiotagger.tag.KeyNotFoundException; - import org.jaudiotagger.audio.AudioFile; import org.jaudiotagger.audio.exceptions.CannotReadException; import org.jaudiotagger.audio.exceptions.CannotWriteException; import org.jaudiotagger.audio.exceptions.InvalidAudioFrameException; import org.jaudiotagger.audio.exceptions.ReadOnlyFileException; import org.jaudiotagger.tag.FieldDataInvalidException; - -import com.josdem.jmetadata.util.ImageUtils; -import com.josdem.jmetadata.helper.ArtworkHelper; -import com.josdem.jmetadata.helper.AudioFileHelper; - -import lombok.extern.slf4j.Slf4j; +import org.jaudiotagger.tag.FieldKey; +import org.jaudiotagger.tag.KeyNotFoundException; +import org.jaudiotagger.tag.Tag; +import org.jaudiotagger.tag.TagException; +import org.jaudiotagger.tag.datatype.Artwork; @Slf4j /** -* @understands A class who knows how to write metadata in a audio file -*/ - + * @understands A class who knows how to write metadata in a audio file + */ public class MetadataWriter { - private Tag tag; - private AudioFile audioFile; - private AudioFileHelper audioFileIOHelper = new AudioFileHelper(); - private ImageUtils imageUtils = new ImageUtils(); - private ArtworkHelper artworkHelper = new ArtworkHelper(); - - - public void setFile(File file) { - try { - audioFile = audioFileIOHelper.read(file); - tag = audioFile.getTag(); - } catch (CannotReadException nre) { - log.error(nre.getMessage(), nre); - } catch (IOException ioe) { - log.error(ioe.getMessage(), ioe); - } catch (TagException tae) { - log.error(tae.getMessage(), tae); - } catch (ReadOnlyFileException roe) { - log.error(roe.getMessage(), roe); - } catch (InvalidAudioFrameException iae) { - log.error(iae.getMessage(), iae); - } - } - - public void writeArtist(String artist) { - try { - tag.setField(FieldKey.ARTIST, artist); - audioFile.commit(); - } catch (KeyNotFoundException kne) { - log.error(kne.getMessage(), kne); - } catch (FieldDataInvalidException fie) { - log.error(fie.getMessage(), fie); - } catch (CannotWriteException nwe) { - log.error(nwe.getMessage(), nwe); - } - } - - public void writeTitle(String trackName) { - try { - tag.setField(FieldKey.TITLE, trackName); - audioFile.commit(); - } catch (KeyNotFoundException kne) { - log.error(kne.getMessage(), kne); - } catch (FieldDataInvalidException fie) { - log.error(fie.getMessage(), fie); - } catch (CannotWriteException nwe) { - log.error(nwe.getMessage(), nwe); - } - } - - public boolean writeAlbum(String album) throws MetadataException { - try { - tag.setField(FieldKey.ALBUM, album); - audioFile.commit(); - return true; - } catch (KeyNotFoundException kne) { - throw new MetadataException(kne.getMessage()); - } catch (FieldDataInvalidException fie) { - throw new MetadataException(fie.getMessage()); - } catch (CannotWriteException nwe) { - throw new MetadataException(nwe.getMessage()); - } - } - - public boolean writeTrackNumber(String trackNumber) throws MetadataException { - try { - if(StringUtils.isEmpty(trackNumber)){ - return false; - } - tag.setField(FieldKey.TRACK, trackNumber); - audioFile.commit(); - return true; - } catch (KeyNotFoundException kne) { - throw new MetadataException(kne.getMessage()); - } catch (FieldDataInvalidException fie) { - throw new MetadataException(fie.getMessage()); - } catch (CannotWriteException nwe) { - throw new MetadataException(nwe.getMessage()); - } - } - - public boolean writeTotalTracksNumber(String totalTracksNumber) throws MetadataException { - try { - if(StringUtils.isEmpty(totalTracksNumber)){ - return false; - } - tag.setField(FieldKey.TRACK_TOTAL, totalTracksNumber); - audioFile.commit(); - return true; - } catch (KeyNotFoundException kne) { - throw new MetadataException(kne.getMessage()); - } catch (FieldDataInvalidException fie) { - throw new MetadataException(fie.getMessage()); - } catch (CannotWriteException nwe) { - throw new MetadataException(nwe.getMessage()); - } - } - - public boolean writeCoverArt(Image lastfmCoverArt) throws MetadataException { - try { - File coverArtFile = imageUtils.saveCoverArtToFile(lastfmCoverArt); - Artwork artwork = artworkHelper.createArtwork(); - artwork.setFromFile(coverArtFile); - tag.setField(artwork); - audioFile.commit(); - return true; - } catch (KeyNotFoundException kne) { - throw new MetadataException(kne.getMessage()); - } catch (FieldDataInvalidException fie) { - throw new MetadataException(fie.getMessage()); - } catch (CannotWriteException nwe) { - throw new MetadataException(nwe.getMessage()); - } catch (IOException ioe) { - throw new MetadataException(ioe.getMessage()); - } catch (NullPointerException nue) { - throw new MetadataException(nue.getMessage()); - } - } - - public boolean removeCoverArt() throws MetadataException { - try { - tag.deleteArtworkField(); - audioFile.commit(); - return true; - } catch (KeyNotFoundException kne) { - throw new MetadataException(kne.getMessage()); - } catch (CannotWriteException nwe) { - throw new MetadataException(nwe.getMessage()); - } - } - - public boolean writeCdNumber(String cdNumber) throws MetadataException { - try { - if(StringUtils.isEmpty(cdNumber)){ - return false; - } - tag.setField(FieldKey.DISC_NO, cdNumber); - audioFile.commit(); - return true; - } catch (KeyNotFoundException kne) { - throw new MetadataException(kne.getMessage()); - } catch (FieldDataInvalidException fie) { - throw new MetadataException(fie.getMessage()); - } catch (CannotWriteException nwe) { - throw new MetadataException(nwe.getMessage()); - } catch (NullPointerException nue){ - throw new MetadataException(nue.getMessage()); - } - } - - public boolean writeTotalCds(String totalCds) throws MetadataException { - try { - if(StringUtils.isEmpty(totalCds)){ - return false; - } - tag.setField(FieldKey.DISC_TOTAL, totalCds); - audioFile.commit(); - return true; - } catch (KeyNotFoundException kne) { - throw new MetadataException(kne.getMessage()); - } catch (FieldDataInvalidException fie) { - throw new MetadataException(fie.getMessage()); - } catch (CannotWriteException nwe) { - throw new MetadataException(nwe.getMessage()); - } catch (NullPointerException nue){ - throw new MetadataException(nue.getMessage()); - } - } - - public boolean writeYear(String year) throws MetadataException { - try { - if(StringUtils.isEmpty(year)){ - return false; - } - tag.setField(FieldKey.YEAR, year); - audioFile.commit(); - return true; - } catch (KeyNotFoundException kne) { - throw new MetadataException(kne.getMessage()); - } catch (FieldDataInvalidException fie) { - throw new MetadataException(fie.getMessage()); - } catch (CannotWriteException nwe) { - throw new MetadataException(nwe.getMessage()); - } catch (NullPointerException nue){ - throw new MetadataException(nue.getMessage()); - } - } - - public boolean writeGenre(String genre) throws MetadataException { - try { - if(StringUtils.isEmpty(genre)){ - return false; - } - tag.setField(FieldKey.GENRE, genre); - audioFile.commit(); - return true; - } catch (KeyNotFoundException kne) { - throw new MetadataException(kne.getMessage()); - } catch (FieldDataInvalidException fie) { - throw new MetadataException(fie.getMessage()); - } catch (CannotWriteException nwe) { - throw new MetadataException(nwe.getMessage()); - } catch (NullPointerException nue){ - throw new MetadataException(nue.getMessage()); - } - } - + private Tag tag; + private AudioFile audioFile; + private AudioFileHelper audioFileIOHelper = new AudioFileHelper(); + private ImageUtils imageUtils = new ImageUtils(); + private ArtworkHelper artworkHelper = new ArtworkHelper(); + + public void setFile(File file) { + try { + audioFile = audioFileIOHelper.read(file); + tag = audioFile.getTag(); + } catch (CannotReadException nre) { + log.error(nre.getMessage(), nre); + } catch (IOException ioe) { + log.error(ioe.getMessage(), ioe); + } catch (TagException tae) { + log.error(tae.getMessage(), tae); + } catch (ReadOnlyFileException roe) { + log.error(roe.getMessage(), roe); + } catch (InvalidAudioFrameException iae) { + log.error(iae.getMessage(), iae); + } + } + + public void writeArtist(String artist) { + try { + tag.setField(FieldKey.ARTIST, artist); + audioFile.commit(); + } catch (KeyNotFoundException kne) { + log.error(kne.getMessage(), kne); + } catch (FieldDataInvalidException fie) { + log.error(fie.getMessage(), fie); + } catch (CannotWriteException nwe) { + log.error(nwe.getMessage(), nwe); + } + } + + public void writeTitle(String trackName) { + try { + tag.setField(FieldKey.TITLE, trackName); + audioFile.commit(); + } catch (KeyNotFoundException kne) { + log.error(kne.getMessage(), kne); + } catch (FieldDataInvalidException fie) { + log.error(fie.getMessage(), fie); + } catch (CannotWriteException nwe) { + log.error(nwe.getMessage(), nwe); + } + } + + public boolean writeAlbum(String album) throws MetadataException { + try { + tag.setField(FieldKey.ALBUM, album); + audioFile.commit(); + return true; + } catch (KeyNotFoundException kne) { + throw new MetadataException(kne.getMessage()); + } catch (FieldDataInvalidException fie) { + throw new MetadataException(fie.getMessage()); + } catch (CannotWriteException nwe) { + throw new MetadataException(nwe.getMessage()); + } + } + + public boolean writeTrackNumber(String trackNumber) throws MetadataException { + try { + if (StringUtils.isEmpty(trackNumber)) { + return false; + } + tag.setField(FieldKey.TRACK, trackNumber); + audioFile.commit(); + return true; + } catch (KeyNotFoundException kne) { + throw new MetadataException(kne.getMessage()); + } catch (FieldDataInvalidException fie) { + throw new MetadataException(fie.getMessage()); + } catch (CannotWriteException nwe) { + throw new MetadataException(nwe.getMessage()); + } + } + + public boolean writeTotalTracksNumber(String totalTracksNumber) throws MetadataException { + try { + if (StringUtils.isEmpty(totalTracksNumber)) { + return false; + } + tag.setField(FieldKey.TRACK_TOTAL, totalTracksNumber); + audioFile.commit(); + return true; + } catch (KeyNotFoundException kne) { + throw new MetadataException(kne.getMessage()); + } catch (FieldDataInvalidException fie) { + throw new MetadataException(fie.getMessage()); + } catch (CannotWriteException nwe) { + throw new MetadataException(nwe.getMessage()); + } + } + + public boolean writeCoverArt(Image lastfmCoverArt) throws MetadataException { + try { + File coverArtFile = imageUtils.saveCoverArtToFile(lastfmCoverArt); + Artwork artwork = artworkHelper.createArtwork(); + artwork.setFromFile(coverArtFile); + tag.setField(artwork); + audioFile.commit(); + return true; + } catch (KeyNotFoundException kne) { + throw new MetadataException(kne.getMessage()); + } catch (FieldDataInvalidException fie) { + throw new MetadataException(fie.getMessage()); + } catch (CannotWriteException nwe) { + throw new MetadataException(nwe.getMessage()); + } catch (IOException ioe) { + throw new MetadataException(ioe.getMessage()); + } catch (NullPointerException nue) { + throw new MetadataException(nue.getMessage()); + } + } + + public boolean removeCoverArt() throws MetadataException { + try { + tag.deleteArtworkField(); + audioFile.commit(); + return true; + } catch (KeyNotFoundException kne) { + throw new MetadataException(kne.getMessage()); + } catch (CannotWriteException nwe) { + throw new MetadataException(nwe.getMessage()); + } + } + + public boolean writeCdNumber(String cdNumber) throws MetadataException { + try { + if (StringUtils.isEmpty(cdNumber)) { + return false; + } + tag.setField(FieldKey.DISC_NO, cdNumber); + audioFile.commit(); + return true; + } catch (KeyNotFoundException kne) { + throw new MetadataException(kne.getMessage()); + } catch (FieldDataInvalidException fie) { + throw new MetadataException(fie.getMessage()); + } catch (CannotWriteException nwe) { + throw new MetadataException(nwe.getMessage()); + } catch (NullPointerException nue) { + throw new MetadataException(nue.getMessage()); + } + } + + public boolean writeTotalCds(String totalCds) throws MetadataException { + try { + if (StringUtils.isEmpty(totalCds)) { + return false; + } + tag.setField(FieldKey.DISC_TOTAL, totalCds); + audioFile.commit(); + return true; + } catch (KeyNotFoundException kne) { + throw new MetadataException(kne.getMessage()); + } catch (FieldDataInvalidException fie) { + throw new MetadataException(fie.getMessage()); + } catch (CannotWriteException nwe) { + throw new MetadataException(nwe.getMessage()); + } catch (NullPointerException nue) { + throw new MetadataException(nue.getMessage()); + } + } + + public boolean writeYear(String year) throws MetadataException { + try { + if (StringUtils.isEmpty(year)) { + return false; + } + tag.setField(FieldKey.YEAR, year); + audioFile.commit(); + return true; + } catch (KeyNotFoundException kne) { + throw new MetadataException(kne.getMessage()); + } catch (FieldDataInvalidException fie) { + throw new MetadataException(fie.getMessage()); + } catch (CannotWriteException nwe) { + throw new MetadataException(nwe.getMessage()); + } catch (NullPointerException nue) { + throw new MetadataException(nue.getMessage()); + } + } + + public boolean writeGenre(String genre) throws MetadataException { + try { + if (StringUtils.isEmpty(genre)) { + return false; + } + tag.setField(FieldKey.GENRE, genre); + audioFile.commit(); + return true; + } catch (KeyNotFoundException kne) { + throw new MetadataException(kne.getMessage()); + } catch (FieldDataInvalidException fie) { + throw new MetadataException(fie.getMessage()); + } catch (CannotWriteException nwe) { + throw new MetadataException(nwe.getMessage()); + } catch (NullPointerException nue) { + throw new MetadataException(nue.getMessage()); + } + } } diff --git a/src/main/java/com/josdem/jmetadata/metadata/Mp3Reader.java b/src/main/java/com/josdem/jmetadata/metadata/Mp3Reader.java index 200de21..05c331f 100644 --- a/src/main/java/com/josdem/jmetadata/metadata/Mp3Reader.java +++ b/src/main/java/com/josdem/jmetadata/metadata/Mp3Reader.java @@ -17,8 +17,6 @@ package com.josdem.jmetadata.metadata; -import lombok.extern.slf4j.Slf4j; -import org.asmatron.messengine.event.ValueEvent; import com.josdem.jmetadata.collaborator.JAudioTaggerCollaborator; import com.josdem.jmetadata.event.Events; import com.josdem.jmetadata.exception.MetadataException; @@ -26,6 +24,11 @@ import com.josdem.jmetadata.helper.ReaderHelper; import com.josdem.jmetadata.model.GenreTypes; import com.josdem.jmetadata.model.Metadata; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.IOException; +import lombok.extern.slf4j.Slf4j; +import org.asmatron.messengine.event.ValueEvent; import org.jaudiotagger.audio.AudioFile; import org.jaudiotagger.audio.exceptions.CannotReadException; import org.jaudiotagger.audio.exceptions.CannotWriteException; @@ -39,61 +42,61 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import java.io.File; -import java.io.FileNotFoundException; -import java.io.IOException; - @Slf4j @Service public class Mp3Reader extends MetadataReader { - @Autowired - private AudioFileHelper audioFileHelper; - @Autowired - private ReaderHelper readerHelper; - @Autowired - private JAudioTaggerCollaborator jAudioTaggerCollaborator; + @Autowired private AudioFileHelper audioFileHelper; + @Autowired private ReaderHelper readerHelper; + @Autowired private JAudioTaggerCollaborator jAudioTaggerCollaborator; - private AudioFile audioFile; + private AudioFile audioFile; - public Metadata getMetadata(File file) throws CannotReadException, IOException, TagException, ReadOnlyFileException, MetadataException { + public Metadata getMetadata(File file) + throws CannotReadException, + IOException, + TagException, + ReadOnlyFileException, + MetadataException { + try { + audioFile = audioFileHelper.read(file); + } catch (InvalidAudioFrameException ina) { + return null; + } catch (FileNotFoundException fnf) { + log.error("File: " + file.getAbsolutePath() + " Not found"); + configurator + .getControlEngine() + .fireEvent(Events.LOAD_FILE, new ValueEvent(file.getAbsolutePath())); + return null; + } + if (audioFile instanceof MP3File) { + MP3File audioMP3 = (MP3File) audioFile; + if (!audioMP3.hasID3v2Tag()) { + AbstractID3v2Tag id3v2tag = new ID3v24Tag(); + audioMP3.setID3v2TagOnly(id3v2tag); try { - audioFile = audioFileHelper.read(file); - } catch (InvalidAudioFrameException ina) { - return null; - } catch (FileNotFoundException fnf) { - log.error("File: " + file.getAbsolutePath() + " Not found"); - configurator.getControlEngine().fireEvent(Events.LOAD_FILE, new ValueEvent(file.getAbsolutePath())); - return null; + audioFile.commit(); + } catch (CannotWriteException cwe) { + log.error("An error occurs when I tried to update to ID3 v2"); + cwe.printStackTrace(); } - if (audioFile instanceof MP3File) { - MP3File audioMP3 = (MP3File) audioFile; - if (!audioMP3.hasID3v2Tag()) { - AbstractID3v2Tag id3v2tag = new ID3v24Tag(); - audioMP3.setID3v2TagOnly(id3v2tag); - try { - audioFile.commit(); - } catch (CannotWriteException cwe) { - log.error("An error occurs when I tried to update to ID3 v2"); - cwe.printStackTrace(); - } - } - tag = audioFile.getTag(); - header = audioFile.getAudioHeader(); - if (jAudioTaggerCollaborator.isValid(tag, header)) { - return generateMetadata(file); - } - } - return new Metadata(); + } + tag = audioFile.getTag(); + header = audioFile.getAudioHeader(); + if (jAudioTaggerCollaborator.isValid(tag, header)) { + return generateMetadata(file); + } } + return new Metadata(); + } - @Override - public String getGenre() { - String tmpGenre = tag.getFirst(FieldKey.GENRE); - try { - int index = Integer.valueOf(tmpGenre); - return GenreTypes.getGenreByCode(index); - } catch (NumberFormatException nfe) { - return readerHelper.getGenre(tag, tmpGenre); - } + @Override + public String getGenre() { + String tmpGenre = tag.getFirst(FieldKey.GENRE); + try { + int index = Integer.valueOf(tmpGenre); + return GenreTypes.getGenreByCode(index); + } catch (NumberFormatException nfe) { + return readerHelper.getGenre(tag, tmpGenre); } + } } diff --git a/src/main/java/com/josdem/jmetadata/metadata/Mp4Reader.java b/src/main/java/com/josdem/jmetadata/metadata/Mp4Reader.java index 63725a1..dc7e9ad 100644 --- a/src/main/java/com/josdem/jmetadata/metadata/Mp4Reader.java +++ b/src/main/java/com/josdem/jmetadata/metadata/Mp4Reader.java @@ -16,12 +16,11 @@ package com.josdem.jmetadata.metadata; -import java.io.File; -import java.io.IOException; - import com.josdem.jmetadata.exception.MetadataException; import com.josdem.jmetadata.helper.AudioFileHelper; import com.josdem.jmetadata.model.Metadata; +import java.io.File; +import java.io.IOException; import org.jaudiotagger.audio.AudioFile; import org.jaudiotagger.audio.exceptions.CannotReadException; import org.jaudiotagger.audio.exceptions.InvalidAudioFrameException; @@ -33,29 +32,32 @@ import org.springframework.stereotype.Service; /** -* @author josdem (joseluis.delacruz@gmail.com) -* @undestands This class knows how to read metadata from a m4a file -*/ - + * @author josdem (joseluis.delacruz@gmail.com) + * @undestands This class knows how to read metadata from a m4a file + */ @Service public class Mp4Reader extends MetadataReader { - @Autowired - private AudioFileHelper audioFileHelper; - - public Metadata getMetadata(File file) throws IOException, TagException, ReadOnlyFileException, InvalidAudioFrameException, MetadataException { - try{ - AudioFile audioFile = audioFileHelper.read(file); - tag = (Mp4Tag) audioFile.getTag(); - header = audioFile.getAudioHeader(); - return generateMetadata(file); - } catch (CannotReadException cnr){ - return null; - } - } - - @Override - public String getGenre() { - return tag.getFirst(FieldKey.GENRE); - } + @Autowired private AudioFileHelper audioFileHelper; + + public Metadata getMetadata(File file) + throws IOException, + TagException, + ReadOnlyFileException, + InvalidAudioFrameException, + MetadataException { + try { + AudioFile audioFile = audioFileHelper.read(file); + tag = (Mp4Tag) audioFile.getTag(); + header = audioFile.getAudioHeader(); + return generateMetadata(file); + } catch (CannotReadException cnr) { + return null; + } + } + + @Override + public String getGenre() { + return tag.getFirst(FieldKey.GENRE); + } } diff --git a/src/main/java/com/josdem/jmetadata/model/Album.java b/src/main/java/com/josdem/jmetadata/model/Album.java index f5a4fdf..22872d3 100644 --- a/src/main/java/com/josdem/jmetadata/model/Album.java +++ b/src/main/java/com/josdem/jmetadata/model/Album.java @@ -17,30 +17,36 @@ package com.josdem.jmetadata.model; import com.google.gson.annotations.SerializedName; -import lombok.Data; - import java.util.List; +import lombok.Data; @Data public class Album { - private String date; - private String barcode; - private String status; - private String title; - private String country; - @SerializedName("cover-art-archive") - private CoverArtArchive coverArtArchive; - @SerializedName("release-events") - private List releaseEvents; - private String packaging; - private String disambiguation; - @SerializedName("text-representation") - private TextRepresentation textRepresentation; - private String id; - private String quality; - private String asin; - @SerializedName("status-id") - private String statusId; - @SerializedName("packaging-id") - private String packagingId; + private String date; + private String barcode; + private String status; + private String title; + private String country; + + @SerializedName("cover-art-archive") + private CoverArtArchive coverArtArchive; + + @SerializedName("release-events") + private List releaseEvents; + + private String packaging; + private String disambiguation; + + @SerializedName("text-representation") + private TextRepresentation textRepresentation; + + private String id; + private String quality; + private String asin; + + @SerializedName("status-id") + private String statusId; + + @SerializedName("packaging-id") + private String packagingId; } diff --git a/src/main/java/com/josdem/jmetadata/model/Area.java b/src/main/java/com/josdem/jmetadata/model/Area.java index b7cc627..7d5ec38 100644 --- a/src/main/java/com/josdem/jmetadata/model/Area.java +++ b/src/main/java/com/josdem/jmetadata/model/Area.java @@ -1,16 +1,17 @@ package com.josdem.jmetadata.model; import com.google.gson.annotations.SerializedName; -import lombok.Data; - import java.util.List; +import lombok.Data; @Data public class Area { - private String id; - private String name; - @SerializedName("sort-name") - private String sortName; - @SerializedName("iso-3166-1-codes") - private List codes; + private String id; + private String name; + + @SerializedName("sort-name") + private String sortName; + + @SerializedName("iso-3166-1-codes") + private List codes; } diff --git a/src/main/java/com/josdem/jmetadata/model/Artist.java b/src/main/java/com/josdem/jmetadata/model/Artist.java index 62fb846..d3639ec 100644 --- a/src/main/java/com/josdem/jmetadata/model/Artist.java +++ b/src/main/java/com/josdem/jmetadata/model/Artist.java @@ -21,8 +21,9 @@ @Data public class Artist { - private String id; - private String name; - @SerializedName("sort-name") - private String sortName; + private String id; + private String name; + + @SerializedName("sort-name") + private String sortName; } diff --git a/src/main/java/com/josdem/jmetadata/model/ArtistCredit.java b/src/main/java/com/josdem/jmetadata/model/ArtistCredit.java index b4276dc..c234701 100644 --- a/src/main/java/com/josdem/jmetadata/model/ArtistCredit.java +++ b/src/main/java/com/josdem/jmetadata/model/ArtistCredit.java @@ -20,6 +20,6 @@ @Data public class ArtistCredit { - private String name; - private Artist artist; + private String name; + private Artist artist; } diff --git a/src/main/java/com/josdem/jmetadata/model/CoverArt.java b/src/main/java/com/josdem/jmetadata/model/CoverArt.java index c6011d6..8fabfcf 100644 --- a/src/main/java/com/josdem/jmetadata/model/CoverArt.java +++ b/src/main/java/com/josdem/jmetadata/model/CoverArt.java @@ -16,14 +16,13 @@ package com.josdem.jmetadata.model; +import java.awt.Image; import lombok.AllArgsConstructor; import lombok.Getter; -import java.awt.Image; - @Getter @AllArgsConstructor public class CoverArt { - private final Image image; - private final CoverArtType type; + private final Image image; + private final CoverArtType type; } diff --git a/src/main/java/com/josdem/jmetadata/model/CoverArtArchive.java b/src/main/java/com/josdem/jmetadata/model/CoverArtArchive.java index 898a029..28fb0c4 100644 --- a/src/main/java/com/josdem/jmetadata/model/CoverArtArchive.java +++ b/src/main/java/com/josdem/jmetadata/model/CoverArtArchive.java @@ -20,9 +20,9 @@ @Data public class CoverArtArchive { - private boolean darkened; - private boolean back; - private boolean artwork; - private boolean front; - private int count; + private boolean darkened; + private boolean back; + private boolean artwork; + private boolean front; + private int count; } diff --git a/src/main/java/com/josdem/jmetadata/model/CoverArtImage.java b/src/main/java/com/josdem/jmetadata/model/CoverArtImage.java index 0a5449d..ebdae6a 100644 --- a/src/main/java/com/josdem/jmetadata/model/CoverArtImage.java +++ b/src/main/java/com/josdem/jmetadata/model/CoverArtImage.java @@ -16,19 +16,18 @@ package com.josdem.jmetadata.model; -import lombok.Data; - import java.util.List; +import lombok.Data; @Data public class CoverArtImage { - private List types; - private boolean front; - private boolean back; - private int edit; - private String image; - private String comment; - private boolean approved; - private Thumbnail thumbnails; - private String id; + private List types; + private boolean front; + private boolean back; + private int edit; + private String image; + private String comment; + private boolean approved; + private Thumbnail thumbnails; + private String id; } diff --git a/src/main/java/com/josdem/jmetadata/model/CoverArtResponse.java b/src/main/java/com/josdem/jmetadata/model/CoverArtResponse.java index 0c7fc85..a276f56 100644 --- a/src/main/java/com/josdem/jmetadata/model/CoverArtResponse.java +++ b/src/main/java/com/josdem/jmetadata/model/CoverArtResponse.java @@ -16,12 +16,11 @@ package com.josdem.jmetadata.model; -import lombok.Data; - import java.util.List; +import lombok.Data; @Data public class CoverArtResponse { - private List images; - private String release; + private List images; + private String release; } diff --git a/src/main/java/com/josdem/jmetadata/model/CoverArtType.java b/src/main/java/com/josdem/jmetadata/model/CoverArtType.java index 4f0e3f1..bdb3b5d 100644 --- a/src/main/java/com/josdem/jmetadata/model/CoverArtType.java +++ b/src/main/java/com/josdem/jmetadata/model/CoverArtType.java @@ -17,5 +17,6 @@ package com.josdem.jmetadata.model; public enum CoverArtType { - LAST_FM, DRAG_AND_DROP; + LAST_FM, + DRAG_AND_DROP; } diff --git a/src/main/java/com/josdem/jmetadata/model/ExportPackage.java b/src/main/java/com/josdem/jmetadata/model/ExportPackage.java index cf81eea..3b15a9b 100644 --- a/src/main/java/com/josdem/jmetadata/model/ExportPackage.java +++ b/src/main/java/com/josdem/jmetadata/model/ExportPackage.java @@ -16,18 +16,16 @@ package com.josdem.jmetadata.model; +import java.io.File; +import java.util.List; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.Setter; -import java.io.File; -import java.util.List; - - @Getter @Setter @AllArgsConstructor public class ExportPackage { - private final File root; - private List metadataList; + private final File root; + private List metadataList; } diff --git a/src/main/java/com/josdem/jmetadata/model/GenreTypes.java b/src/main/java/com/josdem/jmetadata/model/GenreTypes.java index 4472303..7fbdfb6 100644 --- a/src/main/java/com/josdem/jmetadata/model/GenreTypes.java +++ b/src/main/java/com/josdem/jmetadata/model/GenreTypes.java @@ -19,61 +19,191 @@ import org.apache.commons.lang3.StringUtils; public enum GenreTypes { + BLUES(0, "Blues"), + CLASSIC_ROCK(1, "Classic Rock"), + COUNTRY(2, "Country"), + DANCE(3, "Dance"), + DISCO(4, "Disco"), + FUNK(5, "Funk"), + GRUNGE(6, "Grunge"), + HIP_HOP(7, "Hip-Hop"), + JAZZ(8, "Jazz"), + METAL(9, "Metal"), + NEW_AGE(10, "New Age"), + OLDIES(11, "Oldies"), + OTHER(12, "Other"), + POP(13, "Pop"), + R_and_B(14, "R&B"), + RAP(15, "Rap"), + REGGAE(16, "Reggae"), + ROCK(17, "Rock"), + TECHNO(18, "Techno"), + INDUSTRIAL(19, "Industrial"), + ALTERNATIVE(20, "Alternative"), + SKA(21, "Ska"), + DEATH_METAL(22, "Death Metal"), + PRANKS(23, "Pranks"), + SOUNDTRACK(24, "Soundtrack"), + EURO_TECHNO(25, "Euro-Techno"), + AMBIENT(26, "Ambient"), + TRIP_HOP(27, "Trip-Hop"), + VOCAL(28, "Vocal"), + JAZZ_FUNK(29, "Jazz+Funk"), + FUSION(30, "Fusion"), + TRANCE(31, "Trance"), + CLASSICAL(32, "Classical"), + INSTRUMENTAL(33, "Instrumental"), + ACID(34, "Acid"), + HOUSE(35, "House"), + GAME(36, "Game"), + SOUND_CLIP(37, "Sound Clip"), + GOSPEL(38, "Gospel"), + NOISE(39, "Noise"), + ALTERNATIVE_ROCK(40, "Alternative Rock"), + BASS(41, "Bass"), + SOUL(42, "Soul"), + PUNK(43, "Punk"), + SPACE(44, "Space"), + MEDITATIVE(45, "Meditative"), + INSTRUMENTAL_POP(46, "Instrumental Pop"), + INSTRUMENTAL_ROCK(47, "Instrumental Rock"), + ETHNIC(48, "Ethnic"), + GOTHIC(49, "Gothic"), + DARKWAVE(50, "Darkwave"), + TECHN0_INDUSTRIAL(51, "Techno-Industrial"), + ELECTRONIC(52, "Electronic"), + POP_FOLK(53, "Pop-Folk"), + EURODANCE(54, "Eurodance"), + DREAM(55, "Dream"), + SOUTHERN_ROCK(56, "Southern Rock"), + COMEDY(57, "Comedy"), + CULT(58, "Cult"), + GANGSTA(59, "Gangsta"), + TOP_40(60, "Top 40"), + CHRISTIAN_RAP(61, "Christian Rap"), + POP_FUNK(62, "Pop/Funk"), + JUNGLE(63, "Jungle"), + NATIVE_US(64, "Native US"), + CABARET(65, "Cabaret"), + NEW_WAVE(66, "New Wave"), + PSYCHADELIC(67, "Psychadelic"), + RAVE(68, "Rave"), + SHOWTUNES(69, "Showtunes"), + TRAILER(70, "Trailer"), + LO_FI(71, "Lo-Fi"), + TRIBAL(72, "Tribal"), + ACID_PUNK(73, "Acid Punk"), + ACID_JAZZ(74, "Acid Jazz"), + POLKA(75, "Polka"), + RETRO(76, "Retro"), + MUSICAL(77, "Musical"), + ROCK_ROLL(78, "Rock & Roll"), + HARD_ROCK(79, "Hard Rock"), + FOLK(80, "Folk"), + FOLK_ROCK(81, "Folk-Rock"), + NATIONAL_FOLK(82, "National Folk"), + SWING(83, "Swing"), + FAST_FUSION(84, "Fast Fusion"), + BEBOB(85, "Bebob"), + LATIN(86, "Latin"), + REVIVAL(87, "Revival"), + CELTIC(88, "Celtic"), + BLUEGRASS(89, "Bluegrass"), + AVANTGARDE(90, "Avantgarde"), + GOTHIC_ROCK(91, "Gothic Rock"), + PROGRESSIVE_ROCK(92, "Progressive Rock"), + PSYCHEDELIC_ROCK(93, "Psychedelic Rock"), + SYMPHONIC_ROCK(94, "Symphonic Rock"), + SLOW_ROCK(95, "Slow Rock"), + BIG_BAND(96, "Big Band"), + CHORUS(97, "Chorus"), + EASY_LISTENING(98, "Easy Listening"), + ACOUSTIC(99, "Acoustic"), + HUMOUR(100, "Humour"), + SPEECH(101, "Speech"), + CHANSON(102, "Chanson"), + OPERA(103, "Opera"), + CHAMBER_MUSIC(104, "Chamber Music"), + SONATA(105, "Sonata"), + SYMPHONY(106, "Symphony"), + BOOTY_BASS(107, "Booty Bass"), + PRIMUS(108, "Primus"), + PORN_GROOVE(109, "Porn Groove"), + SALTIRE(110, "Satire"), + SLOW_JAM(111, "Slow Jam"), + CLUB(112, "Club"), + TANGO(113, "Tango"), + SAMBA(114, "Samba"), + FOLKLORE(115, "Folklore"), + BALLAD(116, "Ballad"), + POWER_BALLAD(117, "Power Ballad"), + RHYTHMIC_SOUL(118, "Rhythmic Soul"), + FREESTYLE(119, "Freestyle"), + DUET(120, "Duet"), + PUNK_ROCK(121, "Punk Rock"), + DRUM_SOLO(122, "Drum Solo"), + ACAPELLA(123, "Acapella"), + EURO_HOUSE(124, "Euro-House"), + DANCE_HALL(125, "Dance Hall"), + GOA(126, "Goa"), + DRUM_BASS(127, "Drum & Bass"), + CLUB_HOUSE(128, "Club ,House"), + HARDCORE(129, "Hardcore"), + TERROR(130, "Terror"), + INDIE(131, "Indie"), + BRITPOP(132, "BritPop"), + NEGERPUNK(133, "Negerpunk"), + POLSK_PUNK(134, "Polsk Punk"), + BEAT(135, "Beat"), + CHRISTIAN_GANGSTA_RAP(136, "Christian Gangsta Rap"), + HEAVY_METAL(137, "Heavy Metal"), + BLACK_METAL(138, "Black Metal"), + CROSSOVER(139, "Crossover"), + CONTEMPORARY_CHRISTIAN(140, "Contemporary Christian"), + CHRISTIAN_ROCK(141, "Christian Rock"), + MERENGUE(142, "Merengue"), + SALSA(143, "Salsa"), + THRASH_METAL(144, "Thrash Metal"), + ANIME(145, "Anime"), + JPOP(146, "JPop"), + SYNTHPOP(147, "Synthpop"), + UNKNOWN(148, "Unknown"), + LOUNGE(149, "Lounge"), + VOCAL_TRANCE(150, "Vocal Trance"), + DOWNTEMPO(151, "Downtempo"), + MINIMAL(152, "Minimal"); - BLUES(0, "Blues"), CLASSIC_ROCK(1, "Classic Rock"), COUNTRY(2, "Country"), DANCE(3, "Dance"), DISCO(4, "Disco"), FUNK(5, "Funk"), GRUNGE(6, "Grunge"), HIP_HOP(7, "Hip-Hop"), JAZZ(8, "Jazz"), METAL( - 9, "Metal"), NEW_AGE(10, "New Age"), OLDIES(11, "Oldies"), OTHER(12, "Other"), POP(13, "Pop"), R_and_B(14, "R&B"), RAP(15, "Rap"), REGGAE(16, "Reggae"), ROCK(17, "Rock"), TECHNO(18, - "Techno"), INDUSTRIAL(19, "Industrial"), ALTERNATIVE(20, "Alternative"), SKA(21, "Ska"), DEATH_METAL(22, "Death Metal"), PRANKS(23, "Pranks"), SOUNDTRACK(24, "Soundtrack"), EURO_TECHNO( - 25, "Euro-Techno"), AMBIENT(26, "Ambient"), TRIP_HOP(27, "Trip-Hop"), VOCAL(28, "Vocal"), JAZZ_FUNK(29, "Jazz+Funk"), FUSION(30, "Fusion"), TRANCE(31, "Trance"), CLASSICAL(32, "Classical"), INSTRUMENTAL( - 33, "Instrumental"), ACID(34, "Acid"), HOUSE(35, "House"), GAME(36, "Game"), SOUND_CLIP(37, "Sound Clip"), GOSPEL(38, "Gospel"), NOISE(39, "Noise"), ALTERNATIVE_ROCK(40, - "Alternative Rock"), BASS(41, "Bass"), SOUL(42, "Soul"), PUNK(43, "Punk"), SPACE(44, "Space"), MEDITATIVE(45, "Meditative"), INSTRUMENTAL_POP(46, "Instrumental Pop"), INSTRUMENTAL_ROCK( - 47, "Instrumental Rock"), ETHNIC(48, "Ethnic"), GOTHIC(49, "Gothic"), DARKWAVE(50, "Darkwave"), TECHN0_INDUSTRIAL(51, "Techno-Industrial"), ELECTRONIC(52, "Electronic"), POP_FOLK(53, - "Pop-Folk"), EURODANCE(54, "Eurodance"), DREAM(55, "Dream"), SOUTHERN_ROCK(56, "Southern Rock"), COMEDY(57, "Comedy"), CULT(58, "Cult"), GANGSTA(59, "Gangsta"), TOP_40(60, "Top 40"), CHRISTIAN_RAP( - 61, "Christian Rap"), POP_FUNK(62, "Pop/Funk"), JUNGLE(63, "Jungle"), NATIVE_US(64, "Native US"), CABARET(65, "Cabaret"), NEW_WAVE(66, "New Wave"), PSYCHADELIC(67, "Psychadelic"), RAVE( - 68, "Rave"), SHOWTUNES(69, "Showtunes"), TRAILER(70, "Trailer"), LO_FI(71, "Lo-Fi"), TRIBAL(72, "Tribal"), ACID_PUNK(73, "Acid Punk"), ACID_JAZZ(74, "Acid Jazz"), POLKA(75, "Polka"), RETRO( - 76, "Retro"), MUSICAL(77, "Musical"), ROCK_ROLL(78, "Rock & Roll"), HARD_ROCK(79, "Hard Rock"), FOLK(80, "Folk"), FOLK_ROCK(81, "Folk-Rock"), NATIONAL_FOLK(82, "National Folk"), SWING(83, - "Swing"), FAST_FUSION(84, "Fast Fusion"), BEBOB(85, "Bebob"), LATIN(86, "Latin"), REVIVAL(87, "Revival"), CELTIC(88, "Celtic"), BLUEGRASS(89, "Bluegrass"), AVANTGARDE(90, "Avantgarde"), GOTHIC_ROCK( - 91, "Gothic Rock"), PROGRESSIVE_ROCK(92, "Progressive Rock"), PSYCHEDELIC_ROCK(93, "Psychedelic Rock"), SYMPHONIC_ROCK(94, "Symphonic Rock"), SLOW_ROCK(95, "Slow Rock"), BIG_BAND(96, - "Big Band"), CHORUS(97, "Chorus"), EASY_LISTENING(98, "Easy Listening"), ACOUSTIC(99, "Acoustic"), HUMOUR(100, "Humour"), SPEECH(101, "Speech"), CHANSON(102, "Chanson"), OPERA(103, - "Opera"), CHAMBER_MUSIC(104, "Chamber Music"), SONATA(105, "Sonata"), SYMPHONY(106, "Symphony"), BOOTY_BASS(107, "Booty Bass"), PRIMUS(108, "Primus"), PORN_GROOVE(109, "Porn Groove"), SALTIRE( - 110, "Satire"), SLOW_JAM(111, "Slow Jam"), CLUB(112, "Club"), TANGO(113, "Tango"), SAMBA(114, "Samba"), FOLKLORE(115, "Folklore"), BALLAD(116, "Ballad"), POWER_BALLAD(117, "Power Ballad"), RHYTHMIC_SOUL( - 118, "Rhythmic Soul"), FREESTYLE(119, "Freestyle"), DUET(120, "Duet"), PUNK_ROCK(121, "Punk Rock"), DRUM_SOLO(122, "Drum Solo"), ACAPELLA(123, "Acapella"), EURO_HOUSE(124, "Euro-House"), DANCE_HALL( - 125, "Dance Hall"), GOA(126, "Goa"), DRUM_BASS(127, "Drum & Bass"), CLUB_HOUSE(128, "Club ,House"), HARDCORE(129, "Hardcore"), TERROR(130, "Terror"), INDIE(131, "Indie"), BRITPOP(132, - "BritPop"), NEGERPUNK(133, "Negerpunk"), POLSK_PUNK(134, "Polsk Punk"), BEAT(135, "Beat"), CHRISTIAN_GANGSTA_RAP(136, "Christian Gangsta Rap"), HEAVY_METAL(137, "Heavy Metal"), BLACK_METAL( - 138, "Black Metal"), CROSSOVER(139, "Crossover"), CONTEMPORARY_CHRISTIAN(140, "Contemporary Christian"), CHRISTIAN_ROCK(141, "Christian Rock"), MERENGUE(142, "Merengue"), SALSA(143, - "Salsa"), THRASH_METAL(144, "Thrash Metal"), ANIME(145, "Anime"), JPOP(146, "JPop"), SYNTHPOP(147, "Synthpop"), UNKNOWN(148, "Unknown"), LOUNGE(149, "Lounge"), VOCAL_TRANCE(150, - "Vocal Trance"), DOWNTEMPO(151, "Downtempo"), MINIMAL(152, "Minimal"); + private final String name; + private final int code; - private final String name; - private final int code; + private GenreTypes(int code, String name) { + this.code = code; + this.name = name; + } - private GenreTypes(int code, String name) { - this.code = code; - this.name = name; - } + public String getName() { + return name; + } - public String getName() { - return name; - } + public int getCode() { + return code; + } - public int getCode() { - return code; - } + public static String getGenreByCode(int code) { + for (GenreTypes item : GenreTypes.values()) { + if (item.getCode() == code) { + return item.getName(); + } + } + return StringUtils.EMPTY; + } - public static String getGenreByCode(int code) { - for (GenreTypes item : GenreTypes.values()) { - if (item.getCode() == code) { - return item.getName(); - } - } - return StringUtils.EMPTY; - } - - public static GenreTypes getGenreByName(String name) { - for (GenreTypes item : GenreTypes.values()) { - if (item.getName().toLowerCase().equals(name.toLowerCase())) { - return item; - } - } - return UNKNOWN; - } + public static GenreTypes getGenreByName(String name) { + for (GenreTypes item : GenreTypes.values()) { + if (item.getName().toLowerCase().equals(name.toLowerCase())) { + return item; + } + } + return UNKNOWN; + } } diff --git a/src/main/java/com/josdem/jmetadata/model/Label.java b/src/main/java/com/josdem/jmetadata/model/Label.java index abd9149..3529770 100644 --- a/src/main/java/com/josdem/jmetadata/model/Label.java +++ b/src/main/java/com/josdem/jmetadata/model/Label.java @@ -20,6 +20,6 @@ @Data public class Label { - private String id; - private String name; + private String id; + private String name; } diff --git a/src/main/java/com/josdem/jmetadata/model/LabelInfo.java b/src/main/java/com/josdem/jmetadata/model/LabelInfo.java index eec09b9..857278b 100644 --- a/src/main/java/com/josdem/jmetadata/model/LabelInfo.java +++ b/src/main/java/com/josdem/jmetadata/model/LabelInfo.java @@ -21,7 +21,8 @@ @Data public class LabelInfo { - @SerializedName("catalog-number") - private String catalogNumber; - private Label label; + @SerializedName("catalog-number") + private String catalogNumber; + + private Label label; } diff --git a/src/main/java/com/josdem/jmetadata/model/LastfmAlbum.java b/src/main/java/com/josdem/jmetadata/model/LastfmAlbum.java index 3778482..655dd33 100644 --- a/src/main/java/com/josdem/jmetadata/model/LastfmAlbum.java +++ b/src/main/java/com/josdem/jmetadata/model/LastfmAlbum.java @@ -16,15 +16,14 @@ package com.josdem.jmetadata.model; +import java.awt.Image; import lombok.Getter; import lombok.Setter; -import java.awt.Image; - @Getter @Setter public class LastfmAlbum { - private Image imageIcon; - private String year; - private String genre; + private Image imageIcon; + private String year; + private String genre; } diff --git a/src/main/java/com/josdem/jmetadata/model/Media.java b/src/main/java/com/josdem/jmetadata/model/Media.java index 6e53e5b..21f524d 100644 --- a/src/main/java/com/josdem/jmetadata/model/Media.java +++ b/src/main/java/com/josdem/jmetadata/model/Media.java @@ -21,9 +21,11 @@ @Data public class Media { - private String format; - @SerializedName("disc-count") - private int discCount; - @SerializedName("track-count") - private int trackCount; + private String format; + + @SerializedName("disc-count") + private int discCount; + + @SerializedName("track-count") + private int trackCount; } diff --git a/src/main/java/com/josdem/jmetadata/model/Metadata.java b/src/main/java/com/josdem/jmetadata/model/Metadata.java index e0b2877..d236b9c 100644 --- a/src/main/java/com/josdem/jmetadata/model/Metadata.java +++ b/src/main/java/com/josdem/jmetadata/model/Metadata.java @@ -16,46 +16,46 @@ package com.josdem.jmetadata.model; +import java.awt.Image; +import java.io.File; import lombok.Getter; import lombok.Setter; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.awt.Image; -import java.io.File; - @Getter @Setter public class Metadata implements Comparable { - private String title; - private String artist; - private String album; - private String genre; - private String trackNumber; - private String totalTracks; - private Image coverArt; - private int length; - private int bitRate; - private File file; - private String cdNumber; - private String totalCds; - private String year; - private CoverArt newCoverArt; - private boolean metadataFromFile; - private boolean orderByFile = false; - - private final Logger log = LoggerFactory.getLogger(this.getClass()); - - public int compareTo(Metadata metadata) { - if (metadata.isOrderByFile()) { - return getFile().getName().compareTo(metadata.getFile().getName()); - } - try { - var thisTrackNumber = Integer.parseInt(getTrackNumber()); - return Integer.compare(thisTrackNumber, Integer.parseInt(metadata.getTrackNumber())); - } catch (NumberFormatException nfe) { - log.info("Metadata : {} has an incorrect trackNumber: {}", metadata.getTitle(), nfe.getMessage()); - return 0; - } + private String title; + private String artist; + private String album; + private String genre; + private String trackNumber; + private String totalTracks; + private Image coverArt; + private int length; + private int bitRate; + private File file; + private String cdNumber; + private String totalCds; + private String year; + private CoverArt newCoverArt; + private boolean metadataFromFile; + private boolean orderByFile = false; + + private final Logger log = LoggerFactory.getLogger(this.getClass()); + + public int compareTo(Metadata metadata) { + if (metadata.isOrderByFile()) { + return getFile().getName().compareTo(metadata.getFile().getName()); + } + try { + var thisTrackNumber = Integer.parseInt(getTrackNumber()); + return Integer.compare(thisTrackNumber, Integer.parseInt(metadata.getTrackNumber())); + } catch (NumberFormatException nfe) { + log.info( + "Metadata : {} has an incorrect trackNumber: {}", metadata.getTitle(), nfe.getMessage()); + return 0; } + } } diff --git a/src/main/java/com/josdem/jmetadata/model/MetadataAlbumValues.java b/src/main/java/com/josdem/jmetadata/model/MetadataAlbumValues.java index dceec4a..86f34ad 100644 --- a/src/main/java/com/josdem/jmetadata/model/MetadataAlbumValues.java +++ b/src/main/java/com/josdem/jmetadata/model/MetadataAlbumValues.java @@ -16,20 +16,19 @@ package com.josdem.jmetadata.model; +import java.awt.Image; import lombok.Getter; import lombok.Setter; -import java.awt.Image; - @Getter @Setter public class MetadataAlbumValues { - private String genre; - private String album; - private String tracks; - private String cd; - private String cds; - private Image coverArt; - private String year; - private String artist; + private String genre; + private String album; + private String tracks; + private String cd; + private String cds; + private Image coverArt; + private String year; + private String artist; } diff --git a/src/main/java/com/josdem/jmetadata/model/Model.java b/src/main/java/com/josdem/jmetadata/model/Model.java index b869125..2b73baa 100644 --- a/src/main/java/com/josdem/jmetadata/model/Model.java +++ b/src/main/java/com/josdem/jmetadata/model/Model.java @@ -16,25 +16,24 @@ package com.josdem.jmetadata.model; +import static org.asmatron.messengine.model.ModelId.model; + import java.io.File; import java.util.List; import java.util.Set; - import org.asmatron.messengine.model.ModelId; -import static org.asmatron.messengine.model.ModelId.model; - public interface Model { - String CURRENT_USER_ID = "application.currentUser"; - ModelId CURRENT_USER = model(CURRENT_USER_ID); + String CURRENT_USER_ID = "application.currentUser"; + ModelId CURRENT_USER = model(CURRENT_USER_ID); - String METADATA_LIST = "application.metadataList"; - ModelId> METADATA = model(METADATA_LIST); + String METADATA_LIST = "application.metadataList"; + ModelId> METADATA = model(METADATA_LIST); - String METADATA_ARTIST_LIST = "application.metadataArtistList"; - ModelId> METADATA_ARTIST = model(METADATA_ARTIST_LIST); + String METADATA_ARTIST_LIST = "application.metadataArtistList"; + ModelId> METADATA_ARTIST = model(METADATA_ARTIST_LIST); - String FILES_WITHOUT_MINIMUM_METADATA_LIST = "application.filesWithoutMinimumMetadata"; - ModelId> FILES_WITHOUT_MINIMUM_METADATA = model(FILES_WITHOUT_MINIMUM_METADATA_LIST); + String FILES_WITHOUT_MINIMUM_METADATA_LIST = "application.filesWithoutMinimumMetadata"; + ModelId> FILES_WITHOUT_MINIMUM_METADATA = model(FILES_WITHOUT_MINIMUM_METADATA_LIST); } diff --git a/src/main/java/com/josdem/jmetadata/model/MusicBrainzResponse.java b/src/main/java/com/josdem/jmetadata/model/MusicBrainzResponse.java index 7281f0a..45dc753 100644 --- a/src/main/java/com/josdem/jmetadata/model/MusicBrainzResponse.java +++ b/src/main/java/com/josdem/jmetadata/model/MusicBrainzResponse.java @@ -16,14 +16,13 @@ package com.josdem.jmetadata.model; -import lombok.Data; - import java.util.List; +import lombok.Data; @Data public class MusicBrainzResponse { - private String created; - private int count; - private int offset; - private List releases; + private String created; + private int count; + private int offset; + private List releases; } diff --git a/src/main/java/com/josdem/jmetadata/model/Release.java b/src/main/java/com/josdem/jmetadata/model/Release.java index 00ef5de..2658693 100644 --- a/src/main/java/com/josdem/jmetadata/model/Release.java +++ b/src/main/java/com/josdem/jmetadata/model/Release.java @@ -17,33 +17,42 @@ package com.josdem.jmetadata.model; import com.google.gson.annotations.SerializedName; -import lombok.Data; - import java.util.List; +import lombok.Data; @Data public class Release { - private String id; - private int score; - @SerializedName("status-id") - private String statusId; - private int count; - private String title; - private String status; - @SerializedName("text-representation") - private TextRepresentation textRepresentation; - @SerializedName("artist-credit") - private List artistCredit; - @SerializedName("release-events") - private List releaseEvents; - @SerializedName("release-group") - private ReleaseGroup releaseGroup; - private String date; - private String country; - private String barcode; - @SerializedName("label-info") - private List labelInfo; - @SerializedName("track-count") - private int trackCount; - private List media; + private String id; + private int score; + + @SerializedName("status-id") + private String statusId; + + private int count; + private String title; + private String status; + + @SerializedName("text-representation") + private TextRepresentation textRepresentation; + + @SerializedName("artist-credit") + private List artistCredit; + + @SerializedName("release-events") + private List releaseEvents; + + @SerializedName("release-group") + private ReleaseGroup releaseGroup; + + private String date; + private String country; + private String barcode; + + @SerializedName("label-info") + private List labelInfo; + + @SerializedName("track-count") + private int trackCount; + + private List media; } diff --git a/src/main/java/com/josdem/jmetadata/model/ReleaseEvent.java b/src/main/java/com/josdem/jmetadata/model/ReleaseEvent.java index 34aed67..66bc8f6 100644 --- a/src/main/java/com/josdem/jmetadata/model/ReleaseEvent.java +++ b/src/main/java/com/josdem/jmetadata/model/ReleaseEvent.java @@ -4,6 +4,6 @@ @Data public class ReleaseEvent { - private String date; - private Area area; + private String date; + private Area area; } diff --git a/src/main/java/com/josdem/jmetadata/model/ReleaseGroup.java b/src/main/java/com/josdem/jmetadata/model/ReleaseGroup.java index ed1ba2c..7a45b34 100644 --- a/src/main/java/com/josdem/jmetadata/model/ReleaseGroup.java +++ b/src/main/java/com/josdem/jmetadata/model/ReleaseGroup.java @@ -5,12 +5,16 @@ @Data public class ReleaseGroup { - private String id; - @SerializedName("type-id") - private String typeId; - @SerializedName("primary-type-id") - private String primaryTypeId; - private String title; - @SerializedName("primary-type") - private String primaryType; + private String id; + + @SerializedName("type-id") + private String typeId; + + @SerializedName("primary-type-id") + private String primaryTypeId; + + private String title; + + @SerializedName("primary-type") + private String primaryType; } diff --git a/src/main/java/com/josdem/jmetadata/model/TextRepresentation.java b/src/main/java/com/josdem/jmetadata/model/TextRepresentation.java index 20f9b37..b15d8d4 100644 --- a/src/main/java/com/josdem/jmetadata/model/TextRepresentation.java +++ b/src/main/java/com/josdem/jmetadata/model/TextRepresentation.java @@ -20,6 +20,6 @@ @Data public class TextRepresentation { - private String language; - private String script; + private String language; + private String script; } diff --git a/src/main/java/com/josdem/jmetadata/model/Thumbnail.java b/src/main/java/com/josdem/jmetadata/model/Thumbnail.java index f9e50a9..5d08293 100644 --- a/src/main/java/com/josdem/jmetadata/model/Thumbnail.java +++ b/src/main/java/com/josdem/jmetadata/model/Thumbnail.java @@ -21,12 +21,15 @@ @Data public class Thumbnail { - private String large; - private String small; - @SerializedName("250") - private String twoHundredFifty; - @SerializedName("500") - private String fiveHundred; - @SerializedName("1200") - private String oneThousandTwoHundred; + private String large; + private String small; + + @SerializedName("250") + private String twoHundredFifty; + + @SerializedName("500") + private String fiveHundred; + + @SerializedName("1200") + private String oneThousandTwoHundred; } diff --git a/src/main/java/com/josdem/jmetadata/model/User.java b/src/main/java/com/josdem/jmetadata/model/User.java index 233f1f2..308e134 100644 --- a/src/main/java/com/josdem/jmetadata/model/User.java +++ b/src/main/java/com/josdem/jmetadata/model/User.java @@ -23,12 +23,12 @@ @Getter @Setter public class User { - private final String username; - private final String password; - private Session session; + private final String username; + private final String password; + private Session session; - public User(String username, String password) { - this.username = username; - this.password = password; - } + public User(String username, String password) { + this.username = username; + this.password = password; + } } diff --git a/src/main/java/com/josdem/jmetadata/observer/NullObservable.java b/src/main/java/com/josdem/jmetadata/observer/NullObservable.java index 7b33456..7398a78 100644 --- a/src/main/java/com/josdem/jmetadata/observer/NullObservable.java +++ b/src/main/java/com/josdem/jmetadata/observer/NullObservable.java @@ -19,32 +19,28 @@ import java.awt.Component; public class NullObservable extends Observable { - private static final ObserverCollection> INSTANCE = new NullObservable>(); + private static final ObserverCollection> INSTANCE = + new NullObservable>(); - private NullObservable() { - } + private NullObservable() {} - public boolean fire(T param) { - return true; - } + public boolean fire(T param) { + return true; + } - public void add(Observer l) { - } + public void add(Observer l) {} - public void remove(Observer listener) { - } + public void remove(Observer listener) {} - public void clean() { - } + public void clean() {} - @SuppressWarnings("unchecked") - public static Observable get() { - return (Observable) INSTANCE; - } - - @SuppressWarnings("unchecked") - public static ObserverCollection getCollection() { - return (ObserverCollection) INSTANCE; - } + @SuppressWarnings("unchecked") + public static Observable get() { + return (Observable) INSTANCE; + } + @SuppressWarnings("unchecked") + public static ObserverCollection getCollection() { + return (ObserverCollection) INSTANCE; + } } diff --git a/src/main/java/com/josdem/jmetadata/observer/ObservValue.java b/src/main/java/com/josdem/jmetadata/observer/ObservValue.java index fd3d5bb..fed2de1 100644 --- a/src/main/java/com/josdem/jmetadata/observer/ObservValue.java +++ b/src/main/java/com/josdem/jmetadata/observer/ObservValue.java @@ -17,13 +17,13 @@ package com.josdem.jmetadata.observer; public class ObservValue extends ObserveObject { - private final T value; + private final T value; - public ObservValue(T value) { - this.value = value; - } + public ObservValue(T value) { + this.value = value; + } - public T getValue() { - return value; - } + public T getValue() { + return value; + } } diff --git a/src/main/java/com/josdem/jmetadata/observer/Observable.java b/src/main/java/com/josdem/jmetadata/observer/Observable.java index e766318..7acb477 100644 --- a/src/main/java/com/josdem/jmetadata/observer/Observable.java +++ b/src/main/java/com/josdem/jmetadata/observer/Observable.java @@ -18,45 +18,41 @@ import java.util.ArrayList; import java.util.List; - import lombok.extern.slf4j.Slf4j; @Slf4j - - public class Observable implements ObserverCollection { - private List> observers = new ArrayList>(); - - - public boolean fire(T param) { - if (param == null) { - return true; - } - boolean ok = true; - List> observers = new ArrayList>(this.observers); - for (Observer listener : observers) { - try { - listener.observe(param); - } catch (Exception e) { - ok = false; - log.error(e.getMessage(), e); - } - } - return ok; - } - - public void add(Observer l) { - if (l == null) { - throw new NullPointerException("Can't add a null listener."); - } - observers.add(l); - } - - public void remove(Observer listener) { - observers.remove(listener); - } - - public void clean() { - observers.clear(); - } + private List> observers = new ArrayList>(); + + public boolean fire(T param) { + if (param == null) { + return true; + } + boolean ok = true; + List> observers = new ArrayList>(this.observers); + for (Observer listener : observers) { + try { + listener.observe(param); + } catch (Exception e) { + ok = false; + log.error(e.getMessage(), e); + } + } + return ok; + } + + public void add(Observer l) { + if (l == null) { + throw new NullPointerException("Can't add a null listener."); + } + observers.add(l); + } + + public void remove(Observer listener) { + observers.remove(listener); + } + + public void clean() { + observers.clear(); + } } diff --git a/src/main/java/com/josdem/jmetadata/observer/ObservableControl.java b/src/main/java/com/josdem/jmetadata/observer/ObservableControl.java index e4eb7b5..aa5568b 100644 --- a/src/main/java/com/josdem/jmetadata/observer/ObservableControl.java +++ b/src/main/java/com/josdem/jmetadata/observer/ObservableControl.java @@ -17,7 +17,7 @@ package com.josdem.jmetadata.observer; public interface ObservableControl { - void suspend(); + void suspend(); - void resume(); + void resume(); } diff --git a/src/main/java/com/josdem/jmetadata/observer/ObserveObject.java b/src/main/java/com/josdem/jmetadata/observer/ObserveObject.java index 1a4d22a..26b7a17 100644 --- a/src/main/java/com/josdem/jmetadata/observer/ObserveObject.java +++ b/src/main/java/com/josdem/jmetadata/observer/ObserveObject.java @@ -17,8 +17,7 @@ package com.josdem.jmetadata.observer; public class ObserveObject { - public static final ObserveObject EMPTY = new ObserveObject(); + public static final ObserveObject EMPTY = new ObserveObject(); - protected ObserveObject() { - } + protected ObserveObject() {} } diff --git a/src/main/java/com/josdem/jmetadata/observer/ObservePropertyChanged.java b/src/main/java/com/josdem/jmetadata/observer/ObservePropertyChanged.java index 6e35621..3627e39 100644 --- a/src/main/java/com/josdem/jmetadata/observer/ObservePropertyChanged.java +++ b/src/main/java/com/josdem/jmetadata/observer/ObservePropertyChanged.java @@ -18,21 +18,20 @@ public class ObservePropertyChanged extends ObservValue { - private final S source; - private final V oldValue; - - public ObservePropertyChanged(S s, V newValue, V oldValue) { - super(newValue); - this.oldValue = oldValue; - this.source = s; - } - - public V getOldValue() { - return oldValue; - } - - public S getSource() { - return source; - } - + private final S source; + private final V oldValue; + + public ObservePropertyChanged(S s, V newValue, V oldValue) { + super(newValue); + this.oldValue = oldValue; + this.source = s; + } + + public V getOldValue() { + return oldValue; + } + + public S getSource() { + return source; + } } diff --git a/src/main/java/com/josdem/jmetadata/observer/ObservedProperty.java b/src/main/java/com/josdem/jmetadata/observer/ObservedProperty.java index 23ff7ee..149f403 100644 --- a/src/main/java/com/josdem/jmetadata/observer/ObservedProperty.java +++ b/src/main/java/com/josdem/jmetadata/observer/ObservedProperty.java @@ -17,53 +17,53 @@ package com.josdem.jmetadata.observer; public class ObservedProperty { - private final S source; - private Observable> ob = new Observable>(); - private V value; - private ObservePropertyChanged lastEvent; + private final S source; + private Observable> ob = + new Observable>(); + private V value; + private ObservePropertyChanged lastEvent; - public ObservedProperty(S s, V value) { - this.source = s; - this.value = value; - } + public ObservedProperty(S s, V value) { + this.source = s; + this.value = value; + } - public ObservedProperty(S s) { - this.source = s; - } + public ObservedProperty(S s) { + this.source = s; + } - public void setValue(V v) { - if (v == this.value || (this.value != null && this.value.equals(v))) { - return; - } - setValueAndRaiseEvent(v); + public void setValue(V v) { + if (v == this.value || (this.value != null && this.value.equals(v))) { + return; + } + setValueAndRaiseEvent(v); + } - } + public V getValue() { + return value; + } - public V getValue() { - return value; - } + public ObserverCollection> on() { + return ob; + } - public ObserverCollection> on() { - return ob; - } + public void addAndLaunch(Observer> observer) { + ObservePropertyChanged event = lastEvent; + if (event == null) { + event = new ObservePropertyChanged(source, value, value); + } + observer.observe(event); + on().add(observer); + } - public void addAndLaunch(Observer> observer) { - ObservePropertyChanged event = lastEvent; - if (event == null) { - event = new ObservePropertyChanged(source, value, value); - } - observer.observe(event); - on().add(observer); - } + public void setValueAndRaiseEvent(V newValue) { + V oldValue = this.value; + this.value = newValue; + lastEvent = new ObservePropertyChanged(source, newValue, oldValue); + ob.fire(lastEvent); + } - public void setValueAndRaiseEvent(V newValue) { - V oldValue = this.value; - this.value = newValue; - lastEvent = new ObservePropertyChanged(source, newValue, oldValue); - ob.fire(lastEvent); - } - - public static ObservedProperty newProp(S s) { - return new ObservedProperty(s); - } + public static ObservedProperty newProp(S s) { + return new ObservedProperty(s); + } } diff --git a/src/main/java/com/josdem/jmetadata/observer/Observer.java b/src/main/java/com/josdem/jmetadata/observer/Observer.java index cbda567..b22e98a 100644 --- a/src/main/java/com/josdem/jmetadata/observer/Observer.java +++ b/src/main/java/com/josdem/jmetadata/observer/Observer.java @@ -17,6 +17,5 @@ package com.josdem.jmetadata.observer; public interface Observer { - public void observe(T t); - + public void observe(T t); } diff --git a/src/main/java/com/josdem/jmetadata/observer/ObserverCollection.java b/src/main/java/com/josdem/jmetadata/observer/ObserverCollection.java index 2d6f79b..a8a1089 100644 --- a/src/main/java/com/josdem/jmetadata/observer/ObserverCollection.java +++ b/src/main/java/com/josdem/jmetadata/observer/ObserverCollection.java @@ -17,8 +17,7 @@ package com.josdem.jmetadata.observer; public interface ObserverCollection { - public void add(Observer l); - - public void remove(Observer listener); + public void add(Observer l); + public void remove(Observer listener); } diff --git a/src/main/java/com/josdem/jmetadata/observer/PausableObservable.java b/src/main/java/com/josdem/jmetadata/observer/PausableObservable.java index 3a07057..2ccac0d 100644 --- a/src/main/java/com/josdem/jmetadata/observer/PausableObservable.java +++ b/src/main/java/com/josdem/jmetadata/observer/PausableObservable.java @@ -16,30 +16,32 @@ package com.josdem.jmetadata.observer; -public class PausableObservable extends Observable implements ObservableControl { - private boolean enabled = true; - private T suspendedEventObject = null; - - public void suspend() { - enabled = false; - } - - public void resume() { - enabled = true; - fire(suspendedEventObject); - suspendedEventObject = null; - } - - public boolean fire(T param) { - if (enabled) { - return super.fire(param); - } else { - suspendedEventObject = param; - return true; - } - }; - - public boolean isEnabled() { - return true; - } +public class PausableObservable extends Observable + implements ObservableControl { + private boolean enabled = true; + private T suspendedEventObject = null; + + public void suspend() { + enabled = false; + } + + public void resume() { + enabled = true; + fire(suspendedEventObject); + suspendedEventObject = null; + } + + public boolean fire(T param) { + if (enabled) { + return super.fire(param); + } else { + suspendedEventObject = param; + return true; + } + } + ; + + public boolean isEnabled() { + return true; + } } diff --git a/src/main/java/com/josdem/jmetadata/service/CoverArtRestService.java b/src/main/java/com/josdem/jmetadata/service/CoverArtRestService.java index 69f4433..25cb730 100644 --- a/src/main/java/com/josdem/jmetadata/service/CoverArtRestService.java +++ b/src/main/java/com/josdem/jmetadata/service/CoverArtRestService.java @@ -23,7 +23,6 @@ public interface CoverArtRestService { - @GET("release/{id}") - Call getRelease(@Path("id") String id); - + @GET("release/{id}") + Call getRelease(@Path("id") String id); } diff --git a/src/main/java/com/josdem/jmetadata/service/DefaultService.java b/src/main/java/com/josdem/jmetadata/service/DefaultService.java index d0dde32..3ac014f 100644 --- a/src/main/java/com/josdem/jmetadata/service/DefaultService.java +++ b/src/main/java/com/josdem/jmetadata/service/DefaultService.java @@ -17,12 +17,10 @@ package com.josdem.jmetadata.service; import com.josdem.jmetadata.model.Metadata; - import java.util.List; public interface DefaultService { - boolean isCompletable(List metadatas); + boolean isCompletable(List metadatas); - void complete(List metadatas); + void complete(List metadatas); } - diff --git a/src/main/java/com/josdem/jmetadata/service/ExtractService.java b/src/main/java/com/josdem/jmetadata/service/ExtractService.java index 3cede4a..1e987a0 100644 --- a/src/main/java/com/josdem/jmetadata/service/ExtractService.java +++ b/src/main/java/com/josdem/jmetadata/service/ExtractService.java @@ -17,12 +17,11 @@ package com.josdem.jmetadata.service; import com.josdem.jmetadata.model.Metadata; -import org.springframework.stereotype.Service; - import java.io.File; +import org.springframework.stereotype.Service; @Service public interface ExtractService { - Metadata extractFromFileName(File file); + Metadata extractFromFileName(File file); } diff --git a/src/main/java/com/josdem/jmetadata/service/FormatterService.java b/src/main/java/com/josdem/jmetadata/service/FormatterService.java index 82c8fbd..f26018f 100644 --- a/src/main/java/com/josdem/jmetadata/service/FormatterService.java +++ b/src/main/java/com/josdem/jmetadata/service/FormatterService.java @@ -19,12 +19,11 @@ import com.josdem.jmetadata.model.Metadata; public interface FormatterService { - Boolean wasFormatted(Metadata metadata); + Boolean wasFormatted(Metadata metadata); - Boolean wasCamelized(Metadata metadata); + Boolean wasCamelized(Metadata metadata); - String getDuration(int length); + String getDuration(int length); - void isAnalyzable(Metadata metadata); + void isAnalyzable(Metadata metadata); } - diff --git a/src/main/java/com/josdem/jmetadata/service/ImageService.java b/src/main/java/com/josdem/jmetadata/service/ImageService.java index 201355f..9b3fe1b 100644 --- a/src/main/java/com/josdem/jmetadata/service/ImageService.java +++ b/src/main/java/com/josdem/jmetadata/service/ImageService.java @@ -16,14 +16,15 @@ package com.josdem.jmetadata.service; -import java.io.File; import java.awt.Image; +import java.io.File; import java.io.IOException; import java.net.MalformedURLException; public interface ImageService { - File createTempFile() throws IOException; - void write(Image bufferedImage, File file) throws IOException; - Image readImage(String imageURL) throws MalformedURLException, IOException; -} + File createTempFile() throws IOException; + void write(Image bufferedImage, File file) throws IOException; + + Image readImage(String imageURL) throws MalformedURLException, IOException; +} diff --git a/src/main/java/com/josdem/jmetadata/service/LastFMCompleteService.java b/src/main/java/com/josdem/jmetadata/service/LastFMCompleteService.java index 7e5d409..eaedfed 100644 --- a/src/main/java/com/josdem/jmetadata/service/LastFMCompleteService.java +++ b/src/main/java/com/josdem/jmetadata/service/LastFMCompleteService.java @@ -16,15 +16,16 @@ package com.josdem.jmetadata.service; +import com.josdem.jmetadata.action.ActionResult; +import com.josdem.jmetadata.model.LastfmAlbum; +import com.josdem.jmetadata.model.Metadata; import java.io.IOException; import java.net.MalformedURLException; -import com.josdem.jmetadata.model.Metadata; -import com.josdem.jmetadata.model.LastfmAlbum; -import com.josdem.jmetadata.action.ActionResult; - public interface LastFMCompleteService { - boolean canLastFMHelpToComplete(Metadata metadata); - LastfmAlbum getLastFM(Metadata metadata) throws MalformedURLException, IOException; - ActionResult isSomethingNew(LastfmAlbum lastfmAlbum, Metadata metadata); + boolean canLastFMHelpToComplete(Metadata metadata); + + LastfmAlbum getLastFM(Metadata metadata) throws MalformedURLException, IOException; + + ActionResult isSomethingNew(LastfmAlbum lastfmAlbum, Metadata metadata); } diff --git a/src/main/java/com/josdem/jmetadata/service/LastfmService.java b/src/main/java/com/josdem/jmetadata/service/LastfmService.java index e36a384..cb57127 100644 --- a/src/main/java/com/josdem/jmetadata/service/LastfmService.java +++ b/src/main/java/com/josdem/jmetadata/service/LastfmService.java @@ -16,9 +16,9 @@ package com.josdem.jmetadata.service; -import com.josdem.jmetadata.model.Metadata; import com.josdem.jmetadata.action.ActionResult; +import com.josdem.jmetadata.model.Metadata; public interface LastfmService { - ActionResult completeLastFM(Metadata metadata); + ActionResult completeLastFM(Metadata metadata); } diff --git a/src/main/java/com/josdem/jmetadata/service/MetadataService.java b/src/main/java/com/josdem/jmetadata/service/MetadataService.java index e729c22..5278ec3 100644 --- a/src/main/java/com/josdem/jmetadata/service/MetadataService.java +++ b/src/main/java/com/josdem/jmetadata/service/MetadataService.java @@ -20,21 +20,28 @@ import com.josdem.jmetadata.exception.MetadataException; import com.josdem.jmetadata.exception.TooMuchFilesException; import com.josdem.jmetadata.model.Metadata; +import java.io.File; +import java.io.IOException; +import java.util.List; import org.jaudiotagger.audio.exceptions.CannotReadException; import org.jaudiotagger.audio.exceptions.InvalidAudioFrameException; import org.jaudiotagger.audio.exceptions.ReadOnlyFileException; import org.jaudiotagger.tag.TagException; -import java.io.File; -import java.io.IOException; -import java.util.List; - public interface MetadataService { - List extractMetadata(File root) throws IOException, InterruptedException, TooMuchFilesException, CannotReadException, TagException, ReadOnlyFileException, InvalidAudioFrameException, MetadataException, InvalidId3VersionException; - - boolean isSameAlbum(List metadatas); + List extractMetadata(File root) + throws IOException, + InterruptedException, + TooMuchFilesException, + CannotReadException, + TagException, + ReadOnlyFileException, + InvalidAudioFrameException, + MetadataException, + InvalidId3VersionException; - boolean isSameArtist(List metadatas); + boolean isSameAlbum(List metadatas); + boolean isSameArtist(List metadatas); } diff --git a/src/main/java/com/josdem/jmetadata/service/MusicBrainzService.java b/src/main/java/com/josdem/jmetadata/service/MusicBrainzService.java index 053744e..05fa536 100644 --- a/src/main/java/com/josdem/jmetadata/service/MusicBrainzService.java +++ b/src/main/java/com/josdem/jmetadata/service/MusicBrainzService.java @@ -20,6 +20,5 @@ public interface MusicBrainzService { - Album getAlbumByName(String name); - + Album getAlbumByName(String name); } diff --git a/src/main/java/com/josdem/jmetadata/service/RestService.java b/src/main/java/com/josdem/jmetadata/service/RestService.java index b608336..e983be2 100644 --- a/src/main/java/com/josdem/jmetadata/service/RestService.java +++ b/src/main/java/com/josdem/jmetadata/service/RestService.java @@ -26,17 +26,17 @@ import retrofit2.http.Query; public interface RestService { - @Headers({ - "Accept: " + ApplicationConstants.MEDIA_TYPE, - "User-Agent: " + ApplicationConstants.USER_AGENT - }) - @GET("release") - Call getReleases(@Query("query") String query); + @Headers({ + "Accept: " + ApplicationConstants.MEDIA_TYPE, + "User-Agent: " + ApplicationConstants.USER_AGENT + }) + @GET("release") + Call getReleases(@Query("query") String query); - @Headers({ - "Accept: " + ApplicationConstants.MEDIA_TYPE, - "User-Agent: " + ApplicationConstants.USER_AGENT - }) - @GET("release/{id}") - Call getRelease(@Path("id") String id); + @Headers({ + "Accept: " + ApplicationConstants.MEDIA_TYPE, + "User-Agent: " + ApplicationConstants.USER_AGENT + }) + @GET("release/{id}") + Call getRelease(@Path("id") String id); } diff --git a/src/main/java/com/josdem/jmetadata/service/impl/DefaultServiceImpl.java b/src/main/java/com/josdem/jmetadata/service/impl/DefaultServiceImpl.java index c553479..bed556d 100644 --- a/src/main/java/com/josdem/jmetadata/service/impl/DefaultServiceImpl.java +++ b/src/main/java/com/josdem/jmetadata/service/impl/DefaultServiceImpl.java @@ -16,54 +16,65 @@ package com.josdem.jmetadata.service.impl; -import org.apache.commons.lang3.StringUtils; import com.josdem.jmetadata.model.Metadata; import com.josdem.jmetadata.service.DefaultService; import com.josdem.jmetadata.service.MetadataService; +import java.util.List; +import java.util.Optional; +import java.util.OptionalInt; +import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import java.util.List; -import java.util.Optional; -import java.util.OptionalInt; - @Service public class DefaultServiceImpl implements DefaultService { - private static final String CD_NUMBER = "1"; - private static final String TOTAL_CD_NUMBER = "1"; + private static final String CD_NUMBER = "1"; + private static final String TOTAL_CD_NUMBER = "1"; - @Autowired - private MetadataService metadataService; + @Autowired private MetadataService metadataService; - private final Logger log = LoggerFactory.getLogger(this.getClass()); + private final Logger log = LoggerFactory.getLogger(this.getClass()); - public boolean isCompletable(List metadatas) { - return metadatas.size() >= 2 && metadataService.isSameAlbum(metadatas) && isSomethingMissing(metadatas); - } + public boolean isCompletable(List metadatas) { + return metadatas.size() >= 2 + && metadataService.isSameAlbum(metadatas) + && isSomethingMissing(metadatas); + } - public void complete(List metadatas) { - metadatas.forEach(metadata -> { - try { - metadata.setTotalTracks(String.valueOf(getTotalTracks(metadatas))); - metadata.setCdNumber(CD_NUMBER); - metadata.setTotalCds(TOTAL_CD_NUMBER); - } catch (NumberFormatException nfe) { - log.warn("NumberFormatException caused by track: {} - {}", metadata.getTitle(), nfe.getMessage()); - } + public void complete(List metadatas) { + metadatas.forEach( + metadata -> { + try { + metadata.setTotalTracks(String.valueOf(getTotalTracks(metadatas))); + metadata.setCdNumber(CD_NUMBER); + metadata.setTotalCds(TOTAL_CD_NUMBER); + } catch (NumberFormatException nfe) { + log.warn( + "NumberFormatException caused by track: {} - {}", + metadata.getTitle(), + nfe.getMessage()); + } }); - } - - private boolean isSomethingMissing(List metadatas) { - Optional any = metadatas.stream().filter(metadata -> StringUtils.isEmpty(metadata.getTotalTracks()) || StringUtils.isEmpty(metadata.getCdNumber()) || StringUtils.isEmpty(metadata.getTotalCds())).findAny(); - return any.isPresent(); - } + } - private int getTotalTracks(List metadatas) { - OptionalInt optionalInt = metadatas.stream().mapToInt(metadata -> Integer.parseInt(metadata.getTrackNumber())).max(); - return optionalInt.isPresent() ? optionalInt.getAsInt() : 0; - } + private boolean isSomethingMissing(List metadatas) { + Optional any = + metadatas.stream() + .filter( + metadata -> + StringUtils.isEmpty(metadata.getTotalTracks()) + || StringUtils.isEmpty(metadata.getCdNumber()) + || StringUtils.isEmpty(metadata.getTotalCds())) + .findAny(); + return any.isPresent(); + } + private int getTotalTracks(List metadatas) { + OptionalInt optionalInt = + metadatas.stream().mapToInt(metadata -> Integer.parseInt(metadata.getTrackNumber())).max(); + return optionalInt.isPresent() ? optionalInt.getAsInt() : 0; + } } diff --git a/src/main/java/com/josdem/jmetadata/service/impl/ExtractServiceImpl.java b/src/main/java/com/josdem/jmetadata/service/impl/ExtractServiceImpl.java index 41ee9c4..6f23720 100644 --- a/src/main/java/com/josdem/jmetadata/service/impl/ExtractServiceImpl.java +++ b/src/main/java/com/josdem/jmetadata/service/impl/ExtractServiceImpl.java @@ -18,42 +18,38 @@ import com.josdem.jmetadata.model.Metadata; import com.josdem.jmetadata.service.ExtractService; -import org.springframework.stereotype.Service; - import java.io.File; import java.util.NoSuchElementException; import java.util.StringTokenizer; import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; @Slf4j - - @Service public class ExtractServiceImpl implements ExtractService { - - public Metadata extractFromFileName(File file) { - String titleComplete = file.getName(); - Metadata metadata = new Metadata(); - metadata.setFile(file); - try { - StringTokenizer stringTokenizer = new StringTokenizer(titleComplete, "-"); - String artist = stringTokenizer.nextToken().trim(); - String title = removeExtension(stringTokenizer.nextToken().trim()); - metadata.setArtist(artist); - metadata.setTitle(title); - } catch (NoSuchElementException nue) { - String uniqueName = removeExtension(titleComplete); - metadata.setArtist(uniqueName); - metadata.setTitle(uniqueName); - log.info(titleComplete, "{} has no next token"); - } - metadata.setMetadataFromFile(true); - return metadata; - } - - private String removeExtension(String name) { - int extensionIndex = name.lastIndexOf("."); - return extensionIndex == -1 ? name : name.substring(0, extensionIndex); + public Metadata extractFromFileName(File file) { + String titleComplete = file.getName(); + Metadata metadata = new Metadata(); + metadata.setFile(file); + try { + StringTokenizer stringTokenizer = new StringTokenizer(titleComplete, "-"); + String artist = stringTokenizer.nextToken().trim(); + String title = removeExtension(stringTokenizer.nextToken().trim()); + metadata.setArtist(artist); + metadata.setTitle(title); + } catch (NoSuchElementException nue) { + String uniqueName = removeExtension(titleComplete); + metadata.setArtist(uniqueName); + metadata.setTitle(uniqueName); + log.info(titleComplete, "{} has no next token"); } + metadata.setMetadataFromFile(true); + return metadata; + } + + private String removeExtension(String name) { + int extensionIndex = name.lastIndexOf("."); + return extensionIndex == -1 ? name : name.substring(0, extensionIndex); + } } diff --git a/src/main/java/com/josdem/jmetadata/service/impl/FormatterServiceImpl.java b/src/main/java/com/josdem/jmetadata/service/impl/FormatterServiceImpl.java index 4b925b9..da56d25 100644 --- a/src/main/java/com/josdem/jmetadata/service/impl/FormatterServiceImpl.java +++ b/src/main/java/com/josdem/jmetadata/service/impl/FormatterServiceImpl.java @@ -16,110 +16,165 @@ package com.josdem.jmetadata.service.impl; -import lombok.RequiredArgsConstructor; -import org.apache.commons.lang3.StringUtils; import com.josdem.jmetadata.helper.FormatterHelper; import com.josdem.jmetadata.model.Metadata; import com.josdem.jmetadata.service.FormatterService; -import org.springframework.stereotype.Service; - import java.util.Objects; import java.util.StringTokenizer; +import lombok.RequiredArgsConstructor; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Service; @Service @RequiredArgsConstructor public class FormatterServiceImpl implements FormatterService { - private static final int SIXTY = 60; - private final FormatterHelper helper; + private static final int SIXTY = 60; + private final FormatterHelper helper; - public Boolean wasFormatted(Metadata metadata) { - return wasTitleFormatted(metadata) || wasArtistFormatted(metadata) || wasAlbumFormatted(metadata); - } + public Boolean wasFormatted(Metadata metadata) { + return wasTitleFormatted(metadata) + || wasArtistFormatted(metadata) + || wasAlbumFormatted(metadata); + } - private Boolean wasTitleFormatted(Metadata metadata) { - if (StringUtils.isEmpty(metadata.getTitle())) { - return false; - } - String newTitle = metadata.getTitle().replace("&", "&").replace("`", "'").replace("é", "é").replace("á", "á").replace("í", "í").replace("ó", "ó") - .replace("ú", "ú").replace("´", "'").replace("è", "e").replace("É", "É").replace("ê", "ê").replace("ü", "ü").replace("ö", "ö") - .replace("à", "a").replace("°", "°").replace("ñ", "ñ").replace("ä", "ä").replace("û", "û"); - if (!newTitle.equals(metadata.getTitle())) { - metadata.setTitle(newTitle); - return true; - } - return false; + private Boolean wasTitleFormatted(Metadata metadata) { + if (StringUtils.isEmpty(metadata.getTitle())) { + return false; } - - private Boolean wasArtistFormatted(Metadata metadata) { - if (StringUtils.isEmpty(metadata.getArtist())) { - return false; - } - String newArtist = metadata.getArtist().replace("&", "&").replace("`", "'").replace("é", "é").replace("á", "á").replace("í", "í").replace("ó", "ó") - .replace("ú", "ú").replace("´", "'").replace("è", "è").replace("É", "É").replace("ê", "ê").replace("ü", "ü").replace("ö", "ö") - .replace("à", "a").replace("°", "°").replace("ñ", "ñ").replace("ä", "ä").replace("û", "û"); - if (!newArtist.equals(metadata.getArtist())) { - metadata.setArtist(newArtist); - return true; - } - return false; + String newTitle = + metadata + .getTitle() + .replace("&", "&") + .replace("`", "'") + .replace("é", "é") + .replace("á", "á") + .replace("í", "í") + .replace("ó", "ó") + .replace("ú", "ú") + .replace("´", "'") + .replace("è", "e") + .replace("É", "É") + .replace("ê", "ê") + .replace("ü", "ü") + .replace("ö", "ö") + .replace("à", "a") + .replace("°", "°") + .replace("ñ", "ñ") + .replace("ä", "ä") + .replace("û", "û"); + if (!newTitle.equals(metadata.getTitle())) { + metadata.setTitle(newTitle); + return true; } + return false; + } - private Boolean wasAlbumFormatted(Metadata metadata) { - if (StringUtils.isEmpty(metadata.getAlbum())) { - return false; - } - String newAlbum = metadata.getAlbum().replace("&", "&").replace("`", "'").replace("é", "é").replace("á", "á").replace("í", "í").replace("ó", "ó") - .replace("ú", "ú").replace("´", "'").replace("è", "è").replace("É", "É").replace("ê", "ê").replace("ü", "ü").replace("ö", "ö") - .replace("à", "a").replace("°", "°").replace("ñ", "ñ").replace("ä", "ä").replace("û", "û"); - if (!newAlbum.equals(metadata.getAlbum())) { - metadata.setAlbum(newAlbum); - return true; - } - return false; + private Boolean wasArtistFormatted(Metadata metadata) { + if (StringUtils.isEmpty(metadata.getArtist())) { + return false; } - - public Boolean wasCamelized(Metadata metadata) { - Boolean camelized = false; - String artistFormatted = helper.getBasicFormat(metadata.getArtist()); - String titleFormatted = helper.getBasicFormat(metadata.getTitle()); - String albumFormatted = helper.getBasicFormat(metadata.getAlbum()); - if (StringUtils.isAllLowerCase(titleFormatted) || StringUtils.isAllUpperCase(titleFormatted)) { - metadata.setTitle(toCamelCase(metadata.getTitle())); - camelized = true; - } - if (StringUtils.isAllLowerCase(artistFormatted) || StringUtils.isAllUpperCase(artistFormatted)) { - metadata.setArtist(toCamelCase(metadata.getArtist())); - camelized = true; - } - if (StringUtils.isAllLowerCase(albumFormatted) || StringUtils.isAllUpperCase(albumFormatted)) { - metadata.setAlbum(toCamelCase(metadata.getAlbum())); - camelized = true; - } - return camelized; + String newArtist = + metadata + .getArtist() + .replace("&", "&") + .replace("`", "'") + .replace("é", "é") + .replace("á", "á") + .replace("í", "í") + .replace("ó", "ó") + .replace("ú", "ú") + .replace("´", "'") + .replace("è", "è") + .replace("É", "É") + .replace("ê", "ê") + .replace("ü", "ü") + .replace("ö", "ö") + .replace("à", "a") + .replace("°", "°") + .replace("ñ", "ñ") + .replace("ä", "ä") + .replace("û", "û"); + if (!newArtist.equals(metadata.getArtist())) { + metadata.setArtist(newArtist); + return true; } + return false; + } - private String toCamelCase(String value) { - StringTokenizer stringTokenizer = new StringTokenizer(value.toLowerCase()); - StringBuilder stringBuilder = new StringBuilder(); - while (stringTokenizer.hasMoreTokens()) { - stringBuilder.append(StringUtils.capitalize(stringTokenizer.nextToken())); - stringBuilder.append(" "); - } - String[] strings = StringUtils.split(stringBuilder.toString(), " "); - return StringUtils.join(strings, " "); + private Boolean wasAlbumFormatted(Metadata metadata) { + if (StringUtils.isEmpty(metadata.getAlbum())) { + return false; } - - public String getDuration(int length) { - int seconds = length % SIXTY; - int minutes = (length - seconds) / SIXTY; - return minutes + ":" + seconds; + String newAlbum = + metadata + .getAlbum() + .replace("&", "&") + .replace("`", "'") + .replace("é", "é") + .replace("á", "á") + .replace("í", "í") + .replace("ó", "ó") + .replace("ú", "ú") + .replace("´", "'") + .replace("è", "è") + .replace("É", "É") + .replace("ê", "ê") + .replace("ü", "ü") + .replace("ö", "ö") + .replace("à", "a") + .replace("°", "°") + .replace("ñ", "ñ") + .replace("ä", "ä") + .replace("û", "û"); + if (!newAlbum.equals(metadata.getAlbum())) { + metadata.setAlbum(newAlbum); + return true; } - - public void isAnalyzable(Metadata metadata) { - Objects.requireNonNull(metadata.getTitle()); - Objects.requireNonNull(metadata.getArtist()); - Objects.requireNonNull(metadata.getAlbum()); + return false; + } + + public Boolean wasCamelized(Metadata metadata) { + Boolean camelized = false; + String artistFormatted = helper.getBasicFormat(metadata.getArtist()); + String titleFormatted = helper.getBasicFormat(metadata.getTitle()); + String albumFormatted = helper.getBasicFormat(metadata.getAlbum()); + if (StringUtils.isAllLowerCase(titleFormatted) || StringUtils.isAllUpperCase(titleFormatted)) { + metadata.setTitle(toCamelCase(metadata.getTitle())); + camelized = true; } - + if (StringUtils.isAllLowerCase(artistFormatted) + || StringUtils.isAllUpperCase(artistFormatted)) { + metadata.setArtist(toCamelCase(metadata.getArtist())); + camelized = true; + } + if (StringUtils.isAllLowerCase(albumFormatted) || StringUtils.isAllUpperCase(albumFormatted)) { + metadata.setAlbum(toCamelCase(metadata.getAlbum())); + camelized = true; + } + return camelized; + } + + private String toCamelCase(String value) { + StringTokenizer stringTokenizer = new StringTokenizer(value.toLowerCase()); + StringBuilder stringBuilder = new StringBuilder(); + while (stringTokenizer.hasMoreTokens()) { + stringBuilder.append(StringUtils.capitalize(stringTokenizer.nextToken())); + stringBuilder.append(" "); + } + String[] strings = StringUtils.split(stringBuilder.toString(), " "); + return StringUtils.join(strings, " "); + } + + public String getDuration(int length) { + int seconds = length % SIXTY; + int minutes = (length - seconds) / SIXTY; + return minutes + ":" + seconds; + } + + public void isAnalyzable(Metadata metadata) { + Objects.requireNonNull(metadata.getTitle()); + Objects.requireNonNull(metadata.getArtist()); + Objects.requireNonNull(metadata.getAlbum()); + } } diff --git a/src/main/java/com/josdem/jmetadata/service/impl/ImageServiceImpl.java b/src/main/java/com/josdem/jmetadata/service/impl/ImageServiceImpl.java index fa14b80..e0ff7ce 100644 --- a/src/main/java/com/josdem/jmetadata/service/impl/ImageServiceImpl.java +++ b/src/main/java/com/josdem/jmetadata/service/impl/ImageServiceImpl.java @@ -18,28 +18,26 @@ import com.josdem.jmetadata.ApplicationConstants; import com.josdem.jmetadata.service.ImageService; -import org.springframework.stereotype.Service; - -import javax.imageio.ImageIO; import java.awt.Image; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import java.net.URI; +import javax.imageio.ImageIO; +import org.springframework.stereotype.Service; @Service public class ImageServiceImpl implements ImageService { - public File createTempFile() throws IOException { - return File.createTempFile(ApplicationConstants.PREFIX, ApplicationConstants.IMAGE_EXT); - } - - public void write(Image bufferedImage, File file) throws IOException { - ImageIO.write((BufferedImage) bufferedImage, ApplicationConstants.IMAGE_EXT, file); - } + public File createTempFile() throws IOException { + return File.createTempFile(ApplicationConstants.PREFIX, ApplicationConstants.IMAGE_EXT); + } - public Image readImage(String imageURL) throws IOException { - return ImageIO.read(URI.create(imageURL).toURL()); - } + public void write(Image bufferedImage, File file) throws IOException { + ImageIO.write((BufferedImage) bufferedImage, ApplicationConstants.IMAGE_EXT, file); + } + public Image readImage(String imageURL) throws IOException { + return ImageIO.read(URI.create(imageURL).toURL()); + } } diff --git a/src/main/java/com/josdem/jmetadata/service/impl/LastFMCompleteServiceImpl.java b/src/main/java/com/josdem/jmetadata/service/impl/LastFMCompleteServiceImpl.java index de00932..19b5c43 100644 --- a/src/main/java/com/josdem/jmetadata/service/impl/LastFMCompleteServiceImpl.java +++ b/src/main/java/com/josdem/jmetadata/service/impl/LastFMCompleteServiceImpl.java @@ -16,149 +16,144 @@ package com.josdem.jmetadata.service.impl; -import java.awt.Image; -import java.util.Date; -import java.util.HashMap; -import java.io.IOException; -import java.net.MalformedURLException; - -import org.apache.commons.lang3.StringUtils; - -import org.springframework.stereotype.Service; -import org.springframework.beans.factory.annotation.Autowired; - -import de.umass.lastfm.Album; -import de.umass.lastfm.ImageSize; - -import com.josdem.jmetadata.model.Metadata; +import com.josdem.jmetadata.action.ActionResult; +import com.josdem.jmetadata.helper.LastFMAlbumHelper; import com.josdem.jmetadata.model.CoverArt; import com.josdem.jmetadata.model.CoverArtType; import com.josdem.jmetadata.model.LastfmAlbum; -import com.josdem.jmetadata.action.ActionResult; -import com.josdem.jmetadata.helper.LastFMAlbumHelper; +import com.josdem.jmetadata.model.Metadata; import com.josdem.jmetadata.service.ImageService; import com.josdem.jmetadata.service.LastFMCompleteService; - +import de.umass.lastfm.Album; +import de.umass.lastfm.ImageSize; +import java.awt.Image; +import java.io.IOException; +import java.net.MalformedURLException; +import java.util.Date; +import java.util.HashMap; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; @Slf4j - /** - * @understands A class who evaluates metadata and decides if LastFM can help to complete information + * @understands A class who evaluates metadata and decides if LastFM can help to complete + * information */ - @Service public class LastFMCompleteServiceImpl implements LastFMCompleteService { - @Autowired - private LastFMAlbumHelper lastfmHelper; - @Autowired - private ImageService imageService; + @Autowired private LastFMAlbumHelper lastfmHelper; + @Autowired private ImageService imageService; private HashMap cachedAlbums = new HashMap(); - - public boolean canLastFMHelpToComplete(Metadata metadata) { - String artist = metadata.getArtist(); - String album = metadata.getAlbum(); - - if (isMetadataIncomplete(metadata) && hasAlbumAndArtist(artist, album)) { - Album info = cachedAlbums.get(metadata.getAlbum()); - if(info==null){ - info = lastfmHelper.getAlbum(artist, album); - if(info!=null){ - String imageUrl = info.getImageURL(ImageSize.EXTRALARGE); - if(!StringUtils.isEmpty(imageUrl)){ - cachedAlbums.put(metadata.getAlbum(), info); - } - } - } - return info == null ? false : true; - } - return false; - } - - private boolean hasAlbumAndArtist(String artist, String album) { - return (!StringUtils.isEmpty(album) && !StringUtils.isEmpty(artist)); - } - - private boolean isMetadataIncomplete(Metadata metadata) { - return (metadata.getCoverArt() == null || StringUtils.isEmpty(metadata.getYear()) || StringUtils.isEmpty(metadata.getGenre())); - } - - public LastfmAlbum getLastFM(Metadata metadata) throws MalformedURLException, IOException { - LastfmAlbum lastfmAlbum = new LastfmAlbum(); - setCoverArt(metadata, lastfmAlbum); - setYear(metadata, lastfmAlbum); - setGenre(metadata, lastfmAlbum); - return lastfmAlbum; - } - - private void setCoverArt(Metadata metadata, LastfmAlbum lastfmAlbum) throws MalformedURLException, IOException { - if(metadata.getCoverArt() != null){ - return; - } - String imageURL = StringUtils.EMPTY; - Album album = cachedAlbums.get(metadata.getAlbum()); - if(album!=null){ - imageURL = album.getImageURL(ImageSize.EXTRALARGE); - log.info("imageURL: {} from album: {}", imageURL, album.getName()); - } - if (!StringUtils.isEmpty(imageURL)) { - Image image = imageService.readImage(imageURL); - lastfmAlbum.setImageIcon(image); - } - } - - private void setGenre(Metadata metadata, LastfmAlbum lastfmAlbum) { - if(!StringUtils.isEmpty(metadata.getGenre()) || StringUtils.isEmpty(metadata.getAlbum())){ - return; - } - Album album = cachedAlbums.get(metadata.getAlbum()); - String genre = StringUtils.EMPTY; - if(album != null){ - genre = lastfmHelper.getGenre(album); - } - if(!StringUtils.isEmpty(genre)){ - log.info("Genre from lastFM: {}", genre); - lastfmAlbum.setGenre(genre); - } else { - lastfmAlbum.setGenre(StringUtils.EMPTY); - } - } - - private void setYear(Metadata metadata, LastfmAlbum lastfmAlbum) { - if(!StringUtils.isEmpty(metadata.getYear())){ - return; - } - Date release = null; - Album album = cachedAlbums.get(metadata.getAlbum()); - if(album != null) { - release = album.getReleaseDate(); - } - if(release != null){ - log.info("Year date format: " + release); - lastfmAlbum.setYear(lastfmHelper.getYear(release)); - log.info("Year metadata format: " + lastfmAlbum.getYear()); - } else { - lastfmAlbum.setYear(StringUtils.EMPTY); - } - } - - public ActionResult isSomethingNew(LastfmAlbum lastfmAlbum, Metadata metadata) { - if(lastfmAlbum.getImageIcon() == null && StringUtils.isEmpty(lastfmAlbum.getYear()) && StringUtils.isEmpty(lastfmAlbum.getGenre())){ - return ActionResult.Ready; - } - CoverArt coverArt = new CoverArt(lastfmAlbum.getImageIcon(), CoverArtType.LAST_FM); - metadata.setNewCoverArt(coverArt); - if(StringUtils.isEmpty(metadata.getYear())){ - metadata.setYear(lastfmAlbum.getYear()); - } - if(StringUtils.isEmpty(metadata.getGenre())){ - metadata.setGenre(lastfmAlbum.getGenre()); - } - return ActionResult.New; - } - + public boolean canLastFMHelpToComplete(Metadata metadata) { + String artist = metadata.getArtist(); + String album = metadata.getAlbum(); + + if (isMetadataIncomplete(metadata) && hasAlbumAndArtist(artist, album)) { + Album info = cachedAlbums.get(metadata.getAlbum()); + if (info == null) { + info = lastfmHelper.getAlbum(artist, album); + if (info != null) { + String imageUrl = info.getImageURL(ImageSize.EXTRALARGE); + if (!StringUtils.isEmpty(imageUrl)) { + cachedAlbums.put(metadata.getAlbum(), info); + } + } + } + return info == null ? false : true; + } + return false; + } + + private boolean hasAlbumAndArtist(String artist, String album) { + return (!StringUtils.isEmpty(album) && !StringUtils.isEmpty(artist)); + } + + private boolean isMetadataIncomplete(Metadata metadata) { + return (metadata.getCoverArt() == null + || StringUtils.isEmpty(metadata.getYear()) + || StringUtils.isEmpty(metadata.getGenre())); + } + + public LastfmAlbum getLastFM(Metadata metadata) throws MalformedURLException, IOException { + LastfmAlbum lastfmAlbum = new LastfmAlbum(); + setCoverArt(metadata, lastfmAlbum); + setYear(metadata, lastfmAlbum); + setGenre(metadata, lastfmAlbum); + return lastfmAlbum; + } + + private void setCoverArt(Metadata metadata, LastfmAlbum lastfmAlbum) + throws MalformedURLException, IOException { + if (metadata.getCoverArt() != null) { + return; + } + String imageURL = StringUtils.EMPTY; + Album album = cachedAlbums.get(metadata.getAlbum()); + if (album != null) { + imageURL = album.getImageURL(ImageSize.EXTRALARGE); + log.info("imageURL: {} from album: {}", imageURL, album.getName()); + } + if (!StringUtils.isEmpty(imageURL)) { + Image image = imageService.readImage(imageURL); + lastfmAlbum.setImageIcon(image); + } + } + + private void setGenre(Metadata metadata, LastfmAlbum lastfmAlbum) { + if (!StringUtils.isEmpty(metadata.getGenre()) || StringUtils.isEmpty(metadata.getAlbum())) { + return; + } + Album album = cachedAlbums.get(metadata.getAlbum()); + String genre = StringUtils.EMPTY; + if (album != null) { + genre = lastfmHelper.getGenre(album); + } + if (!StringUtils.isEmpty(genre)) { + log.info("Genre from lastFM: {}", genre); + lastfmAlbum.setGenre(genre); + } else { + lastfmAlbum.setGenre(StringUtils.EMPTY); + } + } + + private void setYear(Metadata metadata, LastfmAlbum lastfmAlbum) { + if (!StringUtils.isEmpty(metadata.getYear())) { + return; + } + Date release = null; + Album album = cachedAlbums.get(metadata.getAlbum()); + if (album != null) { + release = album.getReleaseDate(); + } + if (release != null) { + log.info("Year date format: " + release); + lastfmAlbum.setYear(lastfmHelper.getYear(release)); + log.info("Year metadata format: " + lastfmAlbum.getYear()); + } else { + lastfmAlbum.setYear(StringUtils.EMPTY); + } + } + + public ActionResult isSomethingNew(LastfmAlbum lastfmAlbum, Metadata metadata) { + if (lastfmAlbum.getImageIcon() == null + && StringUtils.isEmpty(lastfmAlbum.getYear()) + && StringUtils.isEmpty(lastfmAlbum.getGenre())) { + return ActionResult.Ready; + } + CoverArt coverArt = new CoverArt(lastfmAlbum.getImageIcon(), CoverArtType.LAST_FM); + metadata.setNewCoverArt(coverArt); + if (StringUtils.isEmpty(metadata.getYear())) { + metadata.setYear(lastfmAlbum.getYear()); + } + if (StringUtils.isEmpty(metadata.getGenre())) { + metadata.setGenre(lastfmAlbum.getGenre()); + } + return ActionResult.New; + } } diff --git a/src/main/java/com/josdem/jmetadata/service/impl/LastfmServiceImpl.java b/src/main/java/com/josdem/jmetadata/service/impl/LastfmServiceImpl.java index eba3dfc..37c53f9 100644 --- a/src/main/java/com/josdem/jmetadata/service/impl/LastfmServiceImpl.java +++ b/src/main/java/com/josdem/jmetadata/service/impl/LastfmServiceImpl.java @@ -16,44 +16,40 @@ package com.josdem.jmetadata.service.impl; -import java.io.IOException; -import java.net.MalformedURLException; - -import org.springframework.stereotype.Service; -import org.springframework.beans.factory.annotation.Autowired; - -import com.josdem.jmetadata.model.Metadata; -import com.josdem.jmetadata.model.LastfmAlbum; import com.josdem.jmetadata.action.ActionResult; -import com.josdem.jmetadata.service.LastfmService; +import com.josdem.jmetadata.model.LastfmAlbum; +import com.josdem.jmetadata.model.Metadata; import com.josdem.jmetadata.service.LastFMCompleteService; - +import com.josdem.jmetadata.service.LastfmService; +import java.io.IOException; +import java.net.MalformedURLException; import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; @Slf4j @Service public class LastfmServiceImpl implements LastfmService { - @Autowired - private LastFMCompleteService completeService; - - public synchronized ActionResult completeLastFM(Metadata metadata) { - try { - if (completeService.canLastFMHelpToComplete(metadata)) { - LastfmAlbum lastfmAlbum = completeService.getLastFM(metadata); - return completeService.isSomethingNew(lastfmAlbum, metadata); - } else { - return ActionResult.Ready; - } - } catch (MalformedURLException mfe) { - log.error("MalformedURLException: {}", mfe.getMessage(), mfe); - return ActionResult.Error; - } catch (IOException ioe) { - log.error("IOException: {}", ioe.getMessage(), ioe); - return ActionResult.Error; - } catch (IllegalStateException ise) { - log.error("Missing environment variables for LastFM API Key or Secret: {}", ise.getMessage()); - return ActionResult.Error; - } + @Autowired private LastFMCompleteService completeService; + + public synchronized ActionResult completeLastFM(Metadata metadata) { + try { + if (completeService.canLastFMHelpToComplete(metadata)) { + LastfmAlbum lastfmAlbum = completeService.getLastFM(metadata); + return completeService.isSomethingNew(lastfmAlbum, metadata); + } else { + return ActionResult.Ready; + } + } catch (MalformedURLException mfe) { + log.error("MalformedURLException: {}", mfe.getMessage(), mfe); + return ActionResult.Error; + } catch (IOException ioe) { + log.error("IOException: {}", ioe.getMessage(), ioe); + return ActionResult.Error; + } catch (IllegalStateException ise) { + log.error("Missing environment variables for LastFM API Key or Secret: {}", ise.getMessage()); + return ActionResult.Error; } + } } diff --git a/src/main/java/com/josdem/jmetadata/service/impl/MetadataServiceImpl.java b/src/main/java/com/josdem/jmetadata/service/impl/MetadataServiceImpl.java index e99221d..e5144db 100644 --- a/src/main/java/com/josdem/jmetadata/service/impl/MetadataServiceImpl.java +++ b/src/main/java/com/josdem/jmetadata/service/impl/MetadataServiceImpl.java @@ -16,24 +16,15 @@ package com.josdem.jmetadata.service.impl; -import org.apache.commons.lang3.StringUtils; -import org.asmatron.messengine.engines.support.ControlEngineConfigurator; +import com.josdem.jmetadata.exception.MetadataException; import com.josdem.jmetadata.exception.TooMuchFilesException; import com.josdem.jmetadata.helper.MetadataHelper; -import com.josdem.jmetadata.exception.MetadataException; import com.josdem.jmetadata.metadata.MetadataReader; import com.josdem.jmetadata.model.Metadata; import com.josdem.jmetadata.model.Model; import com.josdem.jmetadata.service.ExtractService; import com.josdem.jmetadata.service.MetadataService; import com.josdem.jmetadata.util.FileUtils; -import org.jaudiotagger.audio.exceptions.CannotReadException; -import org.jaudiotagger.audio.exceptions.InvalidAudioFrameException; -import org.jaudiotagger.audio.exceptions.ReadOnlyFileException; -import org.jaudiotagger.tag.TagException; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - import java.io.File; import java.io.IOException; import java.util.ArrayList; @@ -42,75 +33,95 @@ import java.util.Properties; import java.util.Set; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.asmatron.messengine.engines.support.ControlEngineConfigurator; +import org.jaudiotagger.audio.exceptions.CannotReadException; +import org.jaudiotagger.audio.exceptions.InvalidAudioFrameException; +import org.jaudiotagger.audio.exceptions.ReadOnlyFileException; +import org.jaudiotagger.tag.TagException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; @Slf4j - - @Service public class MetadataServiceImpl implements MetadataService { - @Autowired - private ControlEngineConfigurator configurator; - @Autowired - private MetadataHelper metadataHelper; - @Autowired - private ExtractService extractService; - @Autowired - private MetadataReader mp3Reader; - @Autowired - private MetadataReader mp4Reader; - @Autowired - private FileUtils fileUtils; - @Autowired - private Properties properties; - - private List metadataList; - private Set filesWithoutMinimumMetadata; - - public List extractMetadata(File root) throws IOException, TooMuchFilesException, CannotReadException, TagException, ReadOnlyFileException, InvalidAudioFrameException, MetadataException { - metadataList = new ArrayList<>(); - filesWithoutMinimumMetadata = metadataHelper.createHashSet(); - List fileList = fileUtils.getFileList(root); - log.info("properties: {}", properties.getProperty("max.files.allowed")); - if (fileList.size() > Integer.parseInt(properties.getProperty("max.files.allowed"))) { - throw new TooMuchFilesException(fileList.size()); - } - configurator.getControlEngine().set(Model.FILES_WITHOUT_MINIMUM_METADATA, filesWithoutMinimumMetadata, null); - return getMetadataList(fileList); + @Autowired private ControlEngineConfigurator configurator; + @Autowired private MetadataHelper metadataHelper; + @Autowired private ExtractService extractService; + @Autowired private MetadataReader mp3Reader; + @Autowired private MetadataReader mp4Reader; + @Autowired private FileUtils fileUtils; + @Autowired private Properties properties; + + private List metadataList; + private Set filesWithoutMinimumMetadata; + + public List extractMetadata(File root) + throws IOException, + TooMuchFilesException, + CannotReadException, + TagException, + ReadOnlyFileException, + InvalidAudioFrameException, + MetadataException { + metadataList = new ArrayList<>(); + filesWithoutMinimumMetadata = metadataHelper.createHashSet(); + List fileList = fileUtils.getFileList(root); + log.info("properties: {}", properties.getProperty("max.files.allowed")); + if (fileList.size() > Integer.parseInt(properties.getProperty("max.files.allowed"))) { + throw new TooMuchFilesException(fileList.size()); } - - private List getMetadataList(List fileList) throws IOException, CannotReadException, TagException, ReadOnlyFileException, InvalidAudioFrameException, MetadataException { - for (File file : fileList) { - log.info("Reading file: {}", file.getName()); - Metadata metadata = null; - if (fileUtils.isMp3File(file)) { - metadata = mp3Reader.getMetadata(file); - } else if (fileUtils.isM4aFile(file)) { - metadata = mp4Reader.getMetadata(file); - } - - if (metadata == null) { - log.info("{} is not a valid audio File", file.getAbsoluteFile()); - } else if (StringUtils.isNotEmpty(metadata.getArtist()) && StringUtils.isNotEmpty(metadata.getTitle())) { - metadataList.add(metadata); - } else { - metadataList.add(extractService.extractFromFileName(file)); - filesWithoutMinimumMetadata.add(file); - } - } - return metadataList; - } - - public boolean isSameAlbum(List metadatas) { - var albums = new ArrayList(); - metadatas.forEach(metadata -> albums.add(Objects.requireNonNull(metadata.getAlbum(), "album cannot be null"))); - return albums.stream().distinct().count() == 1 && !metadatas.getFirst().getAlbum().equals(StringUtils.EMPTY); + configurator + .getControlEngine() + .set(Model.FILES_WITHOUT_MINIMUM_METADATA, filesWithoutMinimumMetadata, null); + return getMetadataList(fileList); + } + + private List getMetadataList(List fileList) + throws IOException, + CannotReadException, + TagException, + ReadOnlyFileException, + InvalidAudioFrameException, + MetadataException { + for (File file : fileList) { + log.info("Reading file: {}", file.getName()); + Metadata metadata = null; + if (fileUtils.isMp3File(file)) { + metadata = mp3Reader.getMetadata(file); + } else if (fileUtils.isM4aFile(file)) { + metadata = mp4Reader.getMetadata(file); + } + + if (metadata == null) { + log.info("{} is not a valid audio File", file.getAbsoluteFile()); + } else if (StringUtils.isNotEmpty(metadata.getArtist()) + && StringUtils.isNotEmpty(metadata.getTitle())) { + metadataList.add(metadata); + } else { + metadataList.add(extractService.extractFromFileName(file)); + filesWithoutMinimumMetadata.add(file); + } } - - public boolean isSameArtist(List metadatas) { - var artists = new ArrayList(); - metadatas.forEach(metadata -> artists.add(Objects.requireNonNull(metadata.getArtist(), "artist cannot be null"))); - return artists.stream().distinct().count() == 1 && !metadatas.getFirst().getArtist().equals(StringUtils.EMPTY); - } - + return metadataList; + } + + public boolean isSameAlbum(List metadatas) { + var albums = new ArrayList(); + metadatas.forEach( + metadata -> + albums.add(Objects.requireNonNull(metadata.getAlbum(), "album cannot be null"))); + return albums.stream().distinct().count() == 1 + && !metadatas.getFirst().getAlbum().equals(StringUtils.EMPTY); + } + + public boolean isSameArtist(List metadatas) { + var artists = new ArrayList(); + metadatas.forEach( + metadata -> + artists.add(Objects.requireNonNull(metadata.getArtist(), "artist cannot be null"))); + return artists.stream().distinct().count() == 1 + && !metadatas.getFirst().getArtist().equals(StringUtils.EMPTY); + } } diff --git a/src/main/java/com/josdem/jmetadata/service/impl/MusicBrainzServiceImpl.java b/src/main/java/com/josdem/jmetadata/service/impl/MusicBrainzServiceImpl.java index 28fc6d7..5539bd2 100644 --- a/src/main/java/com/josdem/jmetadata/service/impl/MusicBrainzServiceImpl.java +++ b/src/main/java/com/josdem/jmetadata/service/impl/MusicBrainzServiceImpl.java @@ -22,35 +22,33 @@ import com.josdem.jmetadata.service.MusicBrainzService; import com.josdem.jmetadata.service.RestService; import com.josdem.jmetadata.util.ApplicationState; +import java.io.IOException; +import javax.annotation.PostConstruct; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import retrofit2.Response; -import javax.annotation.PostConstruct; -import java.io.IOException; - @Slf4j @Service public class MusicBrainzServiceImpl implements MusicBrainzService { - private RestService restService; - - @PostConstruct - void setup() { - restService = RetrofitHelper.getRetrofit().create(RestService.class); - } - - public Album getAlbumByName(String name) { - log.info("Getting release"); - var musicBrainzResponse = ApplicationState.cache.get(name); - String id = musicBrainzResponse.getReleases().getFirst().getId(); - var call = restService.getRelease(id); - try { - Response response = call.execute(); - return response.body(); - } catch (IOException e) { - throw new BusinessException(e.getMessage()); - } + private RestService restService; + + @PostConstruct + void setup() { + restService = RetrofitHelper.getRetrofit().create(RestService.class); + } + + public Album getAlbumByName(String name) { + log.info("Getting release"); + var musicBrainzResponse = ApplicationState.cache.get(name); + String id = musicBrainzResponse.getReleases().getFirst().getId(); + var call = restService.getRelease(id); + try { + Response response = call.execute(); + return response.body(); + } catch (IOException e) { + throw new BusinessException(e.getMessage()); } - + } } diff --git a/src/main/java/com/josdem/jmetadata/util/ApplicationState.java b/src/main/java/com/josdem/jmetadata/util/ApplicationState.java index f447fac..46b1e6e 100644 --- a/src/main/java/com/josdem/jmetadata/util/ApplicationState.java +++ b/src/main/java/com/josdem/jmetadata/util/ApplicationState.java @@ -17,12 +17,10 @@ package com.josdem.jmetadata.util; import com.josdem.jmetadata.model.MusicBrainzResponse; - import java.util.HashMap; import java.util.Map; public class ApplicationState { - public static final Map cache = new HashMap<>(); - + public static final Map cache = new HashMap<>(); } diff --git a/src/main/java/com/josdem/jmetadata/util/Environment.java b/src/main/java/com/josdem/jmetadata/util/Environment.java index 6957d44..e88ed8e 100644 --- a/src/main/java/com/josdem/jmetadata/util/Environment.java +++ b/src/main/java/com/josdem/jmetadata/util/Environment.java @@ -18,8 +18,7 @@ public class Environment { - public static boolean isLinux() { - return System.getProperty("os.name").toLowerCase().contains("linux"); - } - + public static boolean isLinux() { + return System.getProperty("os.name").toLowerCase().contains("linux"); + } } diff --git a/src/main/java/com/josdem/jmetadata/util/FileSystemValidatorLight.java b/src/main/java/com/josdem/jmetadata/util/FileSystemValidatorLight.java index 501ace3..73f3a62 100644 --- a/src/main/java/com/josdem/jmetadata/util/FileSystemValidatorLight.java +++ b/src/main/java/com/josdem/jmetadata/util/FileSystemValidatorLight.java @@ -1,63 +1,62 @@ -/* - Copyright 2013 Jose Luis De la Cruz Morales joseluis.delacruz@gmail.com - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -package com.josdem.jmetadata.util; - -import java.io.File; -import java.util.ArrayList; -import java.util.List; - -public class FileSystemValidatorLight { - - private final List folderList = new ArrayList(); - private final List trackList = new ArrayList(); - private final List playlistList = new ArrayList(); - - public FileSystemValidatorLight(boolean fromExternalDevicesPanel, Iterable files) { - for (File file : files) { - validateFile(file); - } - } - - private void validateFile(File file) { - if (file.isHidden()) { - return; - } - if (file.isDirectory()) { - File[] listFiles = file.listFiles(); - boolean fold = false; - for (File file2 : listFiles) { - if (file2.isDirectory() && !file2.isHidden()) { - fold = true; - break; - } - } - if (fold) { - folderList.add(file); - } else { - playlistList.add(file); - } - - } else { - trackList.add(file); - } - } - - public boolean hasError() { - return false; - } - -} +/* + Copyright 2013 Jose Luis De la Cruz Morales joseluis.delacruz@gmail.com + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +package com.josdem.jmetadata.util; + +import java.io.File; +import java.util.ArrayList; +import java.util.List; + +public class FileSystemValidatorLight { + + private final List folderList = new ArrayList(); + private final List trackList = new ArrayList(); + private final List playlistList = new ArrayList(); + + public FileSystemValidatorLight(boolean fromExternalDevicesPanel, Iterable files) { + for (File file : files) { + validateFile(file); + } + } + + private void validateFile(File file) { + if (file.isHidden()) { + return; + } + if (file.isDirectory()) { + File[] listFiles = file.listFiles(); + boolean fold = false; + for (File file2 : listFiles) { + if (file2.isDirectory() && !file2.isHidden()) { + fold = true; + break; + } + } + if (fold) { + folderList.add(file); + } else { + playlistList.add(file); + } + + } else { + trackList.add(file); + } + } + + public boolean hasError() { + return false; + } +} diff --git a/src/main/java/com/josdem/jmetadata/util/FileUtils.java b/src/main/java/com/josdem/jmetadata/util/FileUtils.java index 3365c80..3e5b457 100644 --- a/src/main/java/com/josdem/jmetadata/util/FileUtils.java +++ b/src/main/java/com/josdem/jmetadata/util/FileUtils.java @@ -16,58 +16,61 @@ package com.josdem.jmetadata.util; -import org.apache.commons.lang3.StringUtils; import com.josdem.jmetadata.ApplicationConstants; -import org.springframework.stereotype.Component; - import java.io.File; import java.io.IOException; import java.time.LocalDateTime; import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Component; @Component public class FileUtils { - private List fileList; + private List fileList; - public List getFileList(File root) { - fileList = new ArrayList<>(); - scan(root); - return fileList; - } + public List getFileList(File root) { + fileList = new ArrayList<>(); + scan(root); + return fileList; + } - private void scan(File root) { - var listFiles = root.list(); - assert listFiles != null; - Arrays.stream(listFiles).forEach(file -> { - var inode = new File(root.getAbsolutePath() + File.separator + file); - if (inode.isDirectory()) { + private void scan(File root) { + var listFiles = root.list(); + assert listFiles != null; + Arrays.stream(listFiles) + .forEach( + file -> { + var inode = new File(root.getAbsolutePath() + File.separator + file); + if (inode.isDirectory()) { scan(inode); - } else { + } else { fileList.add(inode); - } - }); - } + } + }); + } - public boolean isMp3File(File file) { - return StringUtils.endsWithIgnoreCase(file.getPath(), "mp3"); - } + public boolean isMp3File(File file) { + return StringUtils.endsWithIgnoreCase(file.getPath(), "mp3"); + } - public boolean isM4aFile(File file) { - return StringUtils.endsWithIgnoreCase(file.getPath(), "m4a"); - } + public boolean isM4aFile(File file) { + return StringUtils.endsWithIgnoreCase(file.getPath(), "m4a"); + } - public File createTempFile() throws IOException { - return File.createTempFile(ApplicationConstants.PREFIX, ApplicationConstants.FILE_EXT); - } + public File createTempFile() throws IOException { + return File.createTempFile(ApplicationConstants.PREFIX, ApplicationConstants.FILE_EXT); + } - public File createFile(File root, String prefix, String ext) { - long timestamp = LocalDateTime.now().getNano(); - StringBuilder sb = new StringBuilder(); - sb.append(timestamp); - sb.append("."); - sb.append(ext.toLowerCase()); - return (prefix.equals(StringUtils.EMPTY)) ? new File(root, ApplicationConstants.PREFIX + sb) : new File(root, prefix + sb); - } + public File createFile(File root, String prefix, String ext) { + long timestamp = LocalDateTime.now().getNano(); + StringBuilder sb = new StringBuilder(); + sb.append(timestamp); + sb.append("."); + sb.append(ext.toLowerCase()); + return (prefix.equals(StringUtils.EMPTY)) + ? new File(root, ApplicationConstants.PREFIX + sb) + : new File(root, prefix + sb); + } } diff --git a/src/main/java/com/josdem/jmetadata/util/ImageIconBase.java b/src/main/java/com/josdem/jmetadata/util/ImageIconBase.java index 707ff65..6f8c58f 100644 --- a/src/main/java/com/josdem/jmetadata/util/ImageIconBase.java +++ b/src/main/java/com/josdem/jmetadata/util/ImageIconBase.java @@ -19,5 +19,5 @@ import javax.swing.ImageIcon; public interface ImageIconBase { - ImageIcon getImageIcon(); + ImageIcon getImageIcon(); } diff --git a/src/main/java/com/josdem/jmetadata/util/ImageUtils.java b/src/main/java/com/josdem/jmetadata/util/ImageUtils.java index 1f6f34b..10c66db 100644 --- a/src/main/java/com/josdem/jmetadata/util/ImageUtils.java +++ b/src/main/java/com/josdem/jmetadata/util/ImageUtils.java @@ -19,7 +19,6 @@ import com.josdem.jmetadata.ApplicationConstants; import com.josdem.jmetadata.service.ImageService; import com.josdem.jmetadata.service.impl.ImageServiceImpl; - import java.awt.*; import java.awt.image.BufferedImage; import java.awt.image.ImageObserver; @@ -28,70 +27,71 @@ import lombok.extern.slf4j.Slf4j; @Slf4j - public class ImageUtils { - private ImageService imageService = new ImageServiceImpl(); + private ImageService imageService = new ImageServiceImpl(); - private FileUtils fileUtils = new FileUtils(); - private static final int THREE_HUNDRED = 300; + private FileUtils fileUtils = new FileUtils(); + private static final int THREE_HUNDRED = 300; + public Image resize(Image image, int width, int height) { + BufferedImage bufferedImage = (BufferedImage) image; + int type = bufferedImage.getType() == 0 ? BufferedImage.TYPE_INT_ARGB : bufferedImage.getType(); + BufferedImage resizedImage = new BufferedImage(width, height, type); + Graphics2D g = resizedImage.createGraphics(); + g.setComposite(AlphaComposite.Src); - public Image resize(Image image, int width, int height) { - BufferedImage bufferedImage = (BufferedImage) image; - int type = bufferedImage.getType() == 0 ? BufferedImage.TYPE_INT_ARGB : bufferedImage.getType(); - BufferedImage resizedImage = new BufferedImage(width, height, type); - Graphics2D g = resizedImage.createGraphics(); - g.setComposite(AlphaComposite.Src); + g.setRenderingHint( + RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR); - g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR); + g.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY); - g.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY); + g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); - g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); - - g.drawImage(image, 0, 0, width, height, null); - g.dispose(); - return resizedImage; - } + g.drawImage(image, 0, 0, width, height, null); + g.dispose(); + return resizedImage; + } - private void write(Image bufferedImage, File file) throws IOException { - imageService.write(bufferedImage, file); - } + private void write(Image bufferedImage, File file) throws IOException { + imageService.write(bufferedImage, file); + } - public void saveCoverArtToFile(Image image, File root, String prefix) throws IOException { - if (image == null) { - return; - } - File file = fileUtils.createFile(root, prefix, ApplicationConstants.IMAGE_EXT); - saveImage(image, file); + public void saveCoverArtToFile(Image image, File root, String prefix) throws IOException { + if (image == null) { + return; } + File file = fileUtils.createFile(root, prefix, ApplicationConstants.IMAGE_EXT); + saveImage(image, file); + } - public File saveCoverArtToFile(Image image) throws IOException { - if (image == null) { - return null; - } - File file = imageService.createTempFile(); - saveImage(image, file); - return file; + public File saveCoverArtToFile(Image image) throws IOException { + if (image == null) { + return null; } - - private void saveImage(Image image, File file) throws IOException { - log.info("Saving image: {}", file.getAbsolutePath()); - if (!is300Image(image)) { - image = resize(image, ApplicationConstants.THREE_HUNDRED, ApplicationConstants.THREE_HUNDRED); - } - write(image, file); + File file = imageService.createTempFile(); + saveImage(image, file); + return file; + } + + private void saveImage(Image image, File file) throws IOException { + log.info("Saving image: {}", file.getAbsolutePath()); + if (!is300Image(image)) { + image = resize(image, ApplicationConstants.THREE_HUNDRED, ApplicationConstants.THREE_HUNDRED); } + write(image, file); + } - public boolean is300Image(Image image) { - int imageHeight = image.getHeight(new ImageObserver() { + public boolean is300Image(Image image) { + int imageHeight = + image.getHeight( + new ImageObserver() { - public boolean imageUpdate(Image img, int infoflags, int x, int y, int width, int height) { + public boolean imageUpdate( + Image img, int infoflags, int x, int y, int width, int height) { return false; - } - }); - log.info("Image height: " + imageHeight); - return imageHeight == THREE_HUNDRED ? true : false; - } - + } + }); + log.info("Image height: " + imageHeight); + return imageHeight == THREE_HUNDRED ? true : false; + } } diff --git a/src/main/java/com/josdem/jmetadata/util/MethodWrapper.java b/src/main/java/com/josdem/jmetadata/util/MethodWrapper.java index 8957e7a..b9504d7 100644 --- a/src/main/java/com/josdem/jmetadata/util/MethodWrapper.java +++ b/src/main/java/com/josdem/jmetadata/util/MethodWrapper.java @@ -1,146 +1,143 @@ -/* - Copyright 2013 Jose Luis De la Cruz Morales joseluis.delacruz@gmail.com - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -package com.josdem.jmetadata.util; - -import java.lang.reflect.Method; - -import lombok.extern.slf4j.Slf4j; - -@Slf4j - - -public class MethodWrapper { - private final Method method; - private final Class returnType; - - - public static MethodWrapperBuilderPhase1 forClass(String className) { - return new MethodWrapperBuilder(className); - } - - public static MethodWrapperBuilderPhase1 forClass(Class clazz) { - return new MethodWrapperBuilder(clazz); - } - - private MethodWrapper(Method method, Class returnType) { - this.method = method; - this.returnType = returnType; - } - - private MethodWrapper check() { - return this; - } - - public static Class getClass(String string) { - try { - return Class.forName(string); - } catch (ClassNotFoundException e) { - log.error(e.getMessage(), e); - } - return null; - } - - public T invoke(Object... param) { - return new UsingMethodWrapper(null).invoke(param); - } - - public UsingMethodWrapper using(Object object) { - return new UsingMethodWrapper(object); - } - - public class UsingMethodWrapper { - private final Object object; - - private UsingMethodWrapper(Object object) { - this.object = object; - } - - @SuppressWarnings("unchecked") - public X invoke(Object... param) { - try { - if (returnType == null) { - method.invoke(object, param); - return null; - } - return (X) method.invoke(object, param); - } catch (Exception e) { - log.error(e.getMessage(), new RuntimeException("The method has just exploded in your face")); - return null; - } - } - - } - - public static interface MethodWrapperBuilderPhase1 { - MethodWrapperBuilderPhase2 method(String methodName); - } - - public static interface MethodWrapperBuilderPhase2 { - MethodWrapperBuilderPhase3 withParameters(Class... parameters); - } - - public static interface MethodWrapperBuilderPhase3 { - MethodWrapper andReturnType(Class returnType); - } - - private static class MethodWrapperBuilder implements MethodWrapperBuilderPhase1, MethodWrapperBuilderPhase2, - MethodWrapperBuilderPhase3 { - private final Class clazz; - private String methodName; - private Class[] parameters; - - private MethodWrapperBuilder(Class clazz) { - this.clazz = clazz; - } - - private MethodWrapperBuilder(String className) { - try { - clazz = Class.forName(className); - } catch (ClassNotFoundException e) { - log.error(e.getMessage(), e); - throw new RuntimeException(className + " does not exist"); - } - } - - public MethodWrapperBuilder method(String methodName) { - this.methodName = methodName; - return this; - } - - public MethodWrapperBuilder withParameters(Class... parameters) { - this.parameters = parameters; - return this; - } - - public MethodWrapper andReturnType(Class returnType) { - Method method; - try { - method = clazz.getDeclaredMethod(methodName, parameters); - if (method.getReturnType().equals(returnType) - || (returnType == null && method.getReturnType().equals(void.class))) { - return new MethodWrapper(method, returnType).check(); - } - } catch (SecurityException e) { - log.error(e.getMessage(), e); - } catch (NoSuchMethodException e) { - log.error(e.getMessage(), e); - } - throw new RuntimeException("Method " + methodName + " does not exist"); - } - - } -} +/* + Copyright 2013 Jose Luis De la Cruz Morales joseluis.delacruz@gmail.com + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +package com.josdem.jmetadata.util; + +import java.lang.reflect.Method; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +public class MethodWrapper { + private final Method method; + private final Class returnType; + + public static MethodWrapperBuilderPhase1 forClass(String className) { + return new MethodWrapperBuilder(className); + } + + public static MethodWrapperBuilderPhase1 forClass(Class clazz) { + return new MethodWrapperBuilder(clazz); + } + + private MethodWrapper(Method method, Class returnType) { + this.method = method; + this.returnType = returnType; + } + + private MethodWrapper check() { + return this; + } + + public static Class getClass(String string) { + try { + return Class.forName(string); + } catch (ClassNotFoundException e) { + log.error(e.getMessage(), e); + } + return null; + } + + public T invoke(Object... param) { + return new UsingMethodWrapper(null).invoke(param); + } + + public UsingMethodWrapper using(Object object) { + return new UsingMethodWrapper(object); + } + + public class UsingMethodWrapper { + private final Object object; + + private UsingMethodWrapper(Object object) { + this.object = object; + } + + @SuppressWarnings("unchecked") + public X invoke(Object... param) { + try { + if (returnType == null) { + method.invoke(object, param); + return null; + } + return (X) method.invoke(object, param); + } catch (Exception e) { + log.error( + e.getMessage(), new RuntimeException("The method has just exploded in your face")); + return null; + } + } + } + + public static interface MethodWrapperBuilderPhase1 { + MethodWrapperBuilderPhase2 method(String methodName); + } + + public static interface MethodWrapperBuilderPhase2 { + MethodWrapperBuilderPhase3 withParameters(Class... parameters); + } + + public static interface MethodWrapperBuilderPhase3 { + MethodWrapper andReturnType(Class returnType); + } + + private static class MethodWrapperBuilder + implements MethodWrapperBuilderPhase1, + MethodWrapperBuilderPhase2, + MethodWrapperBuilderPhase3 { + private final Class clazz; + private String methodName; + private Class[] parameters; + + private MethodWrapperBuilder(Class clazz) { + this.clazz = clazz; + } + + private MethodWrapperBuilder(String className) { + try { + clazz = Class.forName(className); + } catch (ClassNotFoundException e) { + log.error(e.getMessage(), e); + throw new RuntimeException(className + " does not exist"); + } + } + + public MethodWrapperBuilder method(String methodName) { + this.methodName = methodName; + return this; + } + + public MethodWrapperBuilder withParameters(Class... parameters) { + this.parameters = parameters; + return this; + } + + public MethodWrapper andReturnType(Class returnType) { + Method method; + try { + method = clazz.getDeclaredMethod(methodName, parameters); + if (method.getReturnType().equals(returnType) + || (returnType == null && method.getReturnType().equals(void.class))) { + return new MethodWrapper(method, returnType).check(); + } + } catch (SecurityException e) { + log.error(e.getMessage(), e); + } catch (NoSuchMethodException e) { + log.error(e.getMessage(), e); + } + throw new RuntimeException("Method " + methodName + " does not exist"); + } + } +} diff --git a/src/main/java/com/josdem/jmetadata/util/Picture.java b/src/main/java/com/josdem/jmetadata/util/Picture.java index 0302ce8..f8b2ff6 100644 --- a/src/main/java/com/josdem/jmetadata/util/Picture.java +++ b/src/main/java/com/josdem/jmetadata/util/Picture.java @@ -1,63 +1,60 @@ -/* - Copyright 2013 Jose Luis De la Cruz Morales joseluis.delacruz@gmail.com - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -package com.josdem.jmetadata.util; - -import java.awt.Image; -import java.awt.image.BufferedImage; -import java.io.File; -import java.io.IOException; - -import javax.imageio.ImageIO; - - -public class Picture { - private static final double PROPORTION = 0.45; - private static final int MIN_SIZE = 47; - private BufferedImage image; - private String name; - private int height; - private int width; - - public Picture(File file) throws IOException { - image = ImageIO.read(file); - if (image == null) { - throw new IllegalArgumentException("not an image"); - } - name = file.getName(); - height = image.getHeight(); - width = image.getWidth(); - } - - public Image getImage() { - return image; - } - - public String getName() { - return name; - } - - public boolean isProportionedImage() { - double min = Math.min(width, height); - int max = Math.max(width, height); - return min / max >= PROPORTION; - } - - public boolean isValidImageSize() { - return width > MIN_SIZE && height > MIN_SIZE; - } - -} +/* + Copyright 2013 Jose Luis De la Cruz Morales joseluis.delacruz@gmail.com + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +package com.josdem.jmetadata.util; + +import java.awt.Image; +import java.awt.image.BufferedImage; +import java.io.File; +import java.io.IOException; +import javax.imageio.ImageIO; + +public class Picture { + private static final double PROPORTION = 0.45; + private static final int MIN_SIZE = 47; + private BufferedImage image; + private String name; + private int height; + private int width; + + public Picture(File file) throws IOException { + image = ImageIO.read(file); + if (image == null) { + throw new IllegalArgumentException("not an image"); + } + name = file.getName(); + height = image.getHeight(); + width = image.getWidth(); + } + + public Image getImage() { + return image; + } + + public String getName() { + return name; + } + + public boolean isProportionedImage() { + double min = Math.min(width, height); + int max = Math.max(width, height); + return min / max >= PROPORTION; + } + + public boolean isValidImageSize() { + return width > MIN_SIZE && height > MIN_SIZE; + } +} diff --git a/src/test/java/com/josdem/jmetadata/TestLauncher.java b/src/test/java/com/josdem/jmetadata/TestLauncher.java index ced6906..b06e9b4 100644 --- a/src/test/java/com/josdem/jmetadata/TestLauncher.java +++ b/src/test/java/com/josdem/jmetadata/TestLauncher.java @@ -16,6 +16,9 @@ package com.josdem.jmetadata; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + import org.asmatron.messengine.engines.DefaultEngine; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -23,27 +26,22 @@ import org.mockito.MockitoAnnotations; import org.springframework.context.ConfigurableApplicationContext; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; - public class TestLauncher { - @Mock - private DefaultEngine defaultEngine; - @Mock - private ConfigurableApplicationContext context; + @Mock private DefaultEngine defaultEngine; + @Mock private ConfigurableApplicationContext context; - @BeforeEach - public void setup() throws Exception { - MockitoAnnotations.initMocks(this); - } + @BeforeEach + public void setup() throws Exception { + MockitoAnnotations.initMocks(this); + } - @Test - public void shouldInitialize() throws Exception { - when(context.getBean(DefaultEngine.class)).thenReturn(defaultEngine); + @Test + public void shouldInitialize() throws Exception { + when(context.getBean(DefaultEngine.class)).thenReturn(defaultEngine); - new Launcher(context); + new Launcher(context); - verify(context).getBean(DefaultEngine.class); - verify(defaultEngine).start(); - } + verify(context).getBean(DefaultEngine.class); + verify(defaultEngine).start(); + } } diff --git a/src/test/java/com/josdem/jmetadata/collaborator/TestJAudioTaggerCollaborator.java b/src/test/java/com/josdem/jmetadata/collaborator/TestJAudioTaggerCollaborator.java index 98b9614..fef11fd 100644 --- a/src/test/java/com/josdem/jmetadata/collaborator/TestJAudioTaggerCollaborator.java +++ b/src/test/java/com/josdem/jmetadata/collaborator/TestJAudioTaggerCollaborator.java @@ -16,6 +16,11 @@ package com.josdem.jmetadata.collaborator; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import java.util.stream.Stream; +import lombok.extern.slf4j.Slf4j; import org.jaudiotagger.audio.AudioHeader; import org.jaudiotagger.tag.Tag; import org.junit.jupiter.api.*; @@ -26,49 +31,37 @@ import org.mockito.Mock; import org.mockito.MockitoAnnotations; -import java.util.stream.Stream; - -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertTrue; -import lombok.extern.slf4j.Slf4j; - @Slf4j - - @TestInstance(TestInstance.Lifecycle.PER_CLASS) class TestJAudioTaggerCollaborator { - - @InjectMocks - private final JAudioTaggerCollaborator jAudioTaggerCollaborator = new JAudioTaggerCollaborator(); - - @Mock - private Tag tag; - @Mock - private AudioHeader header; - - @BeforeEach - public void setup() throws Exception { - MockitoAnnotations.initMocks(this); - } - - @Test - @DisplayName("validating tag and header") - public void shouldValidateTagAndHeader(TestInfo testInfo) { - log.info(testInfo.getDisplayName()); - assertTrue(jAudioTaggerCollaborator.isValid(tag, header)); - } - - @ParameterizedTest - @MethodSource("metadata") - @DisplayName("detecting invalid metadata") - public void shouldDetectInvalidTag(Tag tag, AudioHeader header) { - log.info("Running detecting invalid metadata"); - assertFalse(jAudioTaggerCollaborator.isValid(tag, header)); - } - - private Stream metadata() { - return Stream.of(Arguments.of(tag, null), Arguments.of(null, header)); - } - + @InjectMocks + private final JAudioTaggerCollaborator jAudioTaggerCollaborator = new JAudioTaggerCollaborator(); + + @Mock private Tag tag; + @Mock private AudioHeader header; + + @BeforeEach + public void setup() throws Exception { + MockitoAnnotations.initMocks(this); + } + + @Test + @DisplayName("validating tag and header") + public void shouldValidateTagAndHeader(TestInfo testInfo) { + log.info(testInfo.getDisplayName()); + assertTrue(jAudioTaggerCollaborator.isValid(tag, header)); + } + + @ParameterizedTest + @MethodSource("metadata") + @DisplayName("detecting invalid metadata") + public void shouldDetectInvalidTag(Tag tag, AudioHeader header) { + log.info("Running detecting invalid metadata"); + assertFalse(jAudioTaggerCollaborator.isValid(tag, header)); + } + + private Stream metadata() { + return Stream.of(Arguments.of(tag, null), Arguments.of(null, header)); + } } diff --git a/src/test/java/com/josdem/jmetadata/collaborator/TestMetadataCollaborator.java b/src/test/java/com/josdem/jmetadata/collaborator/TestMetadataCollaborator.java index fab835a..fe0c732 100644 --- a/src/test/java/com/josdem/jmetadata/collaborator/TestMetadataCollaborator.java +++ b/src/test/java/com/josdem/jmetadata/collaborator/TestMetadataCollaborator.java @@ -16,8 +16,15 @@ package com.josdem.jmetadata.collaborator; -import org.apache.commons.lang3.StringUtils; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.mockito.Mockito.when; + import com.josdem.jmetadata.model.Metadata; +import java.util.ArrayList; +import java.util.List; +import java.util.logging.Logger; +import org.apache.commons.lang3.StringUtils; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -26,277 +33,265 @@ import org.mockito.Mock; import org.mockito.MockitoAnnotations; -import java.util.ArrayList; -import java.util.List; -import java.util.logging.Logger; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.mockito.Mockito.when; - class TestMetadataCollaborator { - @InjectMocks - private final MetadataCollaborator metadataCollaborator = new MetadataCollaborator(); - - private final Logger log = Logger.getLogger(this.getClass().getName()); - - private final List metadatas = new ArrayList(); - - @Mock - private Metadata metadataOne; - @Mock - private Metadata metadataTwo; - - private final String artist = "artist"; - private final String album = "album"; - private final String genre = "genre"; - private final String year = "year"; - private final String totalTracks = "totalTracks"; - private final String totalCds = "totalCds"; - private final String cdNumber = "cdNumber"; - - @BeforeEach - public void setup() throws Exception { - MockitoAnnotations.initMocks(this); - } - - @Test - @DisplayName("getting artist") - public void shouldGetArtist(TestInfo testInfo) { - log.info(() -> "Running test: " + testInfo.getDisplayName()); - setMetadatasExpectations(); - when(metadataOne.getArtist()).thenReturn(artist); - when(metadataTwo.getArtist()).thenReturn(artist); - - assertEquals(artist, metadataCollaborator.getArtist()); - } - - private void setMetadatasExpectations() { - metadatas.add(metadataOne); - metadatas.add(metadataTwo); - metadataCollaborator.setMetadatas(metadatas); - } - - @Test - @DisplayName("not getting artist") - public void shouldNotGetArtist(TestInfo testInfo) { - log.info(() -> "Running test: " + testInfo.getDisplayName()); - setMetadatasExpectations(); - when(metadataOne.getArtist()).thenReturn(artist); - when(metadataTwo.getArtist()).thenReturn("otherArtist"); - - assertEquals(StringUtils.EMPTY, metadataCollaborator.getArtist()); - } - - @Test - @DisplayName("not accepting null artist") - public void shouldGetEmptyArtist(TestInfo testInfo) { - log.info(() -> "Running test: " + testInfo.getDisplayName()); - setMetadatasExpectations(); - when(metadataOne.getArtist()).thenReturn(null); - when(metadataTwo.getArtist()).thenReturn(null); - - assertThrows(NullPointerException.class, metadataCollaborator::getArtist); - } - - @Test - @DisplayName("getting album") - public void shouldGetAlbum(TestInfo testInfo) { - log.info(() -> "Running test: " + testInfo.getDisplayName()); - setMetadatasExpectations(); - when(metadataOne.getAlbum()).thenReturn(album); - when(metadataTwo.getAlbum()).thenReturn(album); - - assertEquals(album, metadataCollaborator.getAlbum()); - } - - @Test - @DisplayName("not getting album") - public void shouldNotGetAlbum(TestInfo testInfo) { - log.info(() -> "Running test: " + testInfo.getDisplayName()); - setMetadatasExpectations(); - when(metadataOne.getAlbum()).thenReturn(album); - when(metadataTwo.getAlbum()).thenReturn("otherAlbum"); - - assertEquals(StringUtils.EMPTY, metadataCollaborator.getAlbum()); - } - - @Test - @DisplayName("note accepting null album") - public void shouldGetEmptyAlbum(TestInfo testInfo) { - log.info(() -> "Running test: " + testInfo.getDisplayName()); - setMetadatasExpectations(); - when(metadataOne.getAlbum()).thenReturn(null); - when(metadataTwo.getAlbum()).thenReturn(null); - - assertThrows(NullPointerException.class, metadataCollaborator::getAlbum); - } - - @Test - @DisplayName("getting genre") - public void shouldGetGenre(TestInfo testInfo) { - log.info(() -> "Running test: " + testInfo.getDisplayName()); - setMetadatasExpectations(); - when(metadataOne.getGenre()).thenReturn(genre); - when(metadataTwo.getGenre()).thenReturn(genre); - - assertEquals(genre, metadataCollaborator.getGenre()); - } - - @Test - @DisplayName("not getting genre") - public void shouldNotGetGenre(TestInfo testInfo) { - log.info(() -> "Running test: " + testInfo.getDisplayName()); - setMetadatasExpectations(); - when(metadataOne.getGenre()).thenReturn(genre); - when(metadataTwo.getGenre()).thenReturn("otherGenre"); - - assertEquals(StringUtils.EMPTY, metadataCollaborator.getGenre()); - } - - @Test - @DisplayName("not accepting null genre") - public void shouldGetEmptyGenre(TestInfo testInfo) { - log.info(() -> "Running test: " + testInfo.getDisplayName()); - setMetadatasExpectations(); - when(metadataOne.getGenre()).thenReturn(null); - when(metadataTwo.getGenre()).thenReturn(null); - - assertThrows(NullPointerException.class, metadataCollaborator::getGenre); - } - - @Test - @DisplayName("getting year") - public void shouldGetYear(TestInfo testInfo) { - log.info(() -> "Running test: " + testInfo.getDisplayName()); - setMetadatasExpectations(); - when(metadataOne.getYear()).thenReturn(year); - when(metadataTwo.getYear()).thenReturn(year); - - assertEquals(year, metadataCollaborator.getYear()); - } - - @Test - @DisplayName("not getting year") - public void shouldNotGetYear(TestInfo testInfo) { - log.info(() -> "Running test: " + testInfo.getDisplayName()); - setMetadatasExpectations(); - when(metadataOne.getYear()).thenReturn(year); - when(metadataTwo.getYear()).thenReturn("otherYear"); - - assertEquals(StringUtils.EMPTY, metadataCollaborator.getYear()); - } - - @Test - @DisplayName("not accepting null year") - public void shouldGetEmptyYear(TestInfo testInfo) { - log.info(() -> "Running test: " + testInfo.getDisplayName()); - setMetadatasExpectations(); - when(metadataOne.getYear()).thenReturn(null); - when(metadataTwo.getYear()).thenReturn(null); - - assertThrows(NullPointerException.class, metadataCollaborator::getYear); - ; - } - - @Test - @DisplayName("getting total tracks") - public void shouldGetTotalTracks(TestInfo testInfo) { - log.info(() -> "Running test: " + testInfo.getDisplayName()); - setMetadatasExpectations(); - when(metadataOne.getTotalTracks()).thenReturn(totalTracks); - when(metadataTwo.getTotalTracks()).thenReturn(totalTracks); - - assertEquals(totalTracks, metadataCollaborator.getTotalTracks()); - } - - @Test - @DisplayName("not getting total tracks") - public void shouldNotGetTotalTracks(TestInfo testInfo) { - log.info(() -> "Running test: " + testInfo.getDisplayName()); - setMetadatasExpectations(); - when(metadataOne.getTotalTracks()).thenReturn(totalTracks); - when(metadataTwo.getTotalTracks()).thenReturn("otherTotalTracks"); - - assertEquals(StringUtils.EMPTY, metadataCollaborator.getTotalTracks()); - } - - @Test - @DisplayName("not accepting null total tracks") - public void shouldGetEmptyTotalTracks(TestInfo testInfo) { - log.info(() -> "Running test: " + testInfo.getDisplayName()); - setMetadatasExpectations(); - when(metadataOne.getTotalTracks()).thenReturn(null); - when(metadataTwo.getTotalTracks()).thenReturn(null); - - assertThrows(NullPointerException.class, metadataCollaborator::getTotalTracks); - } - - @Test - @DisplayName("getting cd number") - public void shouldGetCdNumber(TestInfo testInfo) { - log.info(() -> "Running test: " + testInfo.getDisplayName()); - setMetadatasExpectations(); - when(metadataOne.getCdNumber()).thenReturn(cdNumber); - when(metadataTwo.getCdNumber()).thenReturn(cdNumber); - - assertEquals(cdNumber, metadataCollaborator.getCdNumber()); - } - - @Test - @DisplayName("not getting cd number") - public void shouldNotGetCdNumber(TestInfo testInfo) { - log.info(() -> "Running test: " + testInfo.getDisplayName()); - setMetadatasExpectations(); - when(metadataOne.getCdNumber()).thenReturn(cdNumber); - when(metadataTwo.getCdNumber()).thenReturn("otherCdNumber"); - - assertEquals(StringUtils.EMPTY, metadataCollaborator.getCdNumber()); - } - - @Test - @DisplayName("not accepting null cd number") - public void shouldGetEmptyCdNumber(TestInfo testInfo) { - log.info(() -> "Running test: " + testInfo.getDisplayName()); - setMetadatasExpectations(); - when(metadataOne.getCdNumber()).thenReturn(null); - when(metadataTwo.getCdNumber()).thenReturn(null); - - assertThrows(NullPointerException.class, metadataCollaborator::getCdNumber); - } - - @Test - @DisplayName("getting total cds") - public void shouldGetTotalCds(TestInfo testInfo) { - log.info(() -> "Running test: " + testInfo.getDisplayName()); - setMetadatasExpectations(); - when(metadataOne.getTotalCds()).thenReturn(totalCds); - when(metadataTwo.getTotalCds()).thenReturn(totalCds); - - assertEquals(totalCds, metadataCollaborator.getTotalCds()); - } - - @Test - @DisplayName("not getting total cds") - public void shouldNotGetTotalCds(TestInfo testInfo) { - log.info(() -> "Running test: " + testInfo.getDisplayName()); - setMetadatasExpectations(); - when(metadataOne.getTotalCds()).thenReturn(totalCds); - when(metadataTwo.getTotalCds()).thenReturn("otherCds"); - - assertEquals(StringUtils.EMPTY, metadataCollaborator.getTotalCds()); - } - - @Test - @DisplayName("not accepting null total cds") - public void shouldGetEmptyTotalCds(TestInfo testInfo) { - log.info(() -> "Running test: " + testInfo.getDisplayName()); - setMetadatasExpectations(); - when(metadataOne.getTotalCds()).thenReturn(null); - when(metadataTwo.getTotalCds()).thenReturn(null); - - assertThrows(NullPointerException.class, metadataCollaborator::getTotalCds); - } - + @InjectMocks private final MetadataCollaborator metadataCollaborator = new MetadataCollaborator(); + + private final Logger log = Logger.getLogger(this.getClass().getName()); + + private final List metadatas = new ArrayList(); + + @Mock private Metadata metadataOne; + @Mock private Metadata metadataTwo; + + private final String artist = "artist"; + private final String album = "album"; + private final String genre = "genre"; + private final String year = "year"; + private final String totalTracks = "totalTracks"; + private final String totalCds = "totalCds"; + private final String cdNumber = "cdNumber"; + + @BeforeEach + public void setup() throws Exception { + MockitoAnnotations.initMocks(this); + } + + @Test + @DisplayName("getting artist") + public void shouldGetArtist(TestInfo testInfo) { + log.info(() -> "Running test: " + testInfo.getDisplayName()); + setMetadatasExpectations(); + when(metadataOne.getArtist()).thenReturn(artist); + when(metadataTwo.getArtist()).thenReturn(artist); + + assertEquals(artist, metadataCollaborator.getArtist()); + } + + private void setMetadatasExpectations() { + metadatas.add(metadataOne); + metadatas.add(metadataTwo); + metadataCollaborator.setMetadatas(metadatas); + } + + @Test + @DisplayName("not getting artist") + public void shouldNotGetArtist(TestInfo testInfo) { + log.info(() -> "Running test: " + testInfo.getDisplayName()); + setMetadatasExpectations(); + when(metadataOne.getArtist()).thenReturn(artist); + when(metadataTwo.getArtist()).thenReturn("otherArtist"); + + assertEquals(StringUtils.EMPTY, metadataCollaborator.getArtist()); + } + + @Test + @DisplayName("not accepting null artist") + public void shouldGetEmptyArtist(TestInfo testInfo) { + log.info(() -> "Running test: " + testInfo.getDisplayName()); + setMetadatasExpectations(); + when(metadataOne.getArtist()).thenReturn(null); + when(metadataTwo.getArtist()).thenReturn(null); + + assertThrows(NullPointerException.class, metadataCollaborator::getArtist); + } + + @Test + @DisplayName("getting album") + public void shouldGetAlbum(TestInfo testInfo) { + log.info(() -> "Running test: " + testInfo.getDisplayName()); + setMetadatasExpectations(); + when(metadataOne.getAlbum()).thenReturn(album); + when(metadataTwo.getAlbum()).thenReturn(album); + + assertEquals(album, metadataCollaborator.getAlbum()); + } + + @Test + @DisplayName("not getting album") + public void shouldNotGetAlbum(TestInfo testInfo) { + log.info(() -> "Running test: " + testInfo.getDisplayName()); + setMetadatasExpectations(); + when(metadataOne.getAlbum()).thenReturn(album); + when(metadataTwo.getAlbum()).thenReturn("otherAlbum"); + + assertEquals(StringUtils.EMPTY, metadataCollaborator.getAlbum()); + } + + @Test + @DisplayName("note accepting null album") + public void shouldGetEmptyAlbum(TestInfo testInfo) { + log.info(() -> "Running test: " + testInfo.getDisplayName()); + setMetadatasExpectations(); + when(metadataOne.getAlbum()).thenReturn(null); + when(metadataTwo.getAlbum()).thenReturn(null); + + assertThrows(NullPointerException.class, metadataCollaborator::getAlbum); + } + + @Test + @DisplayName("getting genre") + public void shouldGetGenre(TestInfo testInfo) { + log.info(() -> "Running test: " + testInfo.getDisplayName()); + setMetadatasExpectations(); + when(metadataOne.getGenre()).thenReturn(genre); + when(metadataTwo.getGenre()).thenReturn(genre); + + assertEquals(genre, metadataCollaborator.getGenre()); + } + + @Test + @DisplayName("not getting genre") + public void shouldNotGetGenre(TestInfo testInfo) { + log.info(() -> "Running test: " + testInfo.getDisplayName()); + setMetadatasExpectations(); + when(metadataOne.getGenre()).thenReturn(genre); + when(metadataTwo.getGenre()).thenReturn("otherGenre"); + + assertEquals(StringUtils.EMPTY, metadataCollaborator.getGenre()); + } + + @Test + @DisplayName("not accepting null genre") + public void shouldGetEmptyGenre(TestInfo testInfo) { + log.info(() -> "Running test: " + testInfo.getDisplayName()); + setMetadatasExpectations(); + when(metadataOne.getGenre()).thenReturn(null); + when(metadataTwo.getGenre()).thenReturn(null); + + assertThrows(NullPointerException.class, metadataCollaborator::getGenre); + } + + @Test + @DisplayName("getting year") + public void shouldGetYear(TestInfo testInfo) { + log.info(() -> "Running test: " + testInfo.getDisplayName()); + setMetadatasExpectations(); + when(metadataOne.getYear()).thenReturn(year); + when(metadataTwo.getYear()).thenReturn(year); + + assertEquals(year, metadataCollaborator.getYear()); + } + + @Test + @DisplayName("not getting year") + public void shouldNotGetYear(TestInfo testInfo) { + log.info(() -> "Running test: " + testInfo.getDisplayName()); + setMetadatasExpectations(); + when(metadataOne.getYear()).thenReturn(year); + when(metadataTwo.getYear()).thenReturn("otherYear"); + + assertEquals(StringUtils.EMPTY, metadataCollaborator.getYear()); + } + + @Test + @DisplayName("not accepting null year") + public void shouldGetEmptyYear(TestInfo testInfo) { + log.info(() -> "Running test: " + testInfo.getDisplayName()); + setMetadatasExpectations(); + when(metadataOne.getYear()).thenReturn(null); + when(metadataTwo.getYear()).thenReturn(null); + + assertThrows(NullPointerException.class, metadataCollaborator::getYear); + ; + } + + @Test + @DisplayName("getting total tracks") + public void shouldGetTotalTracks(TestInfo testInfo) { + log.info(() -> "Running test: " + testInfo.getDisplayName()); + setMetadatasExpectations(); + when(metadataOne.getTotalTracks()).thenReturn(totalTracks); + when(metadataTwo.getTotalTracks()).thenReturn(totalTracks); + + assertEquals(totalTracks, metadataCollaborator.getTotalTracks()); + } + + @Test + @DisplayName("not getting total tracks") + public void shouldNotGetTotalTracks(TestInfo testInfo) { + log.info(() -> "Running test: " + testInfo.getDisplayName()); + setMetadatasExpectations(); + when(metadataOne.getTotalTracks()).thenReturn(totalTracks); + when(metadataTwo.getTotalTracks()).thenReturn("otherTotalTracks"); + + assertEquals(StringUtils.EMPTY, metadataCollaborator.getTotalTracks()); + } + + @Test + @DisplayName("not accepting null total tracks") + public void shouldGetEmptyTotalTracks(TestInfo testInfo) { + log.info(() -> "Running test: " + testInfo.getDisplayName()); + setMetadatasExpectations(); + when(metadataOne.getTotalTracks()).thenReturn(null); + when(metadataTwo.getTotalTracks()).thenReturn(null); + + assertThrows(NullPointerException.class, metadataCollaborator::getTotalTracks); + } + + @Test + @DisplayName("getting cd number") + public void shouldGetCdNumber(TestInfo testInfo) { + log.info(() -> "Running test: " + testInfo.getDisplayName()); + setMetadatasExpectations(); + when(metadataOne.getCdNumber()).thenReturn(cdNumber); + when(metadataTwo.getCdNumber()).thenReturn(cdNumber); + + assertEquals(cdNumber, metadataCollaborator.getCdNumber()); + } + + @Test + @DisplayName("not getting cd number") + public void shouldNotGetCdNumber(TestInfo testInfo) { + log.info(() -> "Running test: " + testInfo.getDisplayName()); + setMetadatasExpectations(); + when(metadataOne.getCdNumber()).thenReturn(cdNumber); + when(metadataTwo.getCdNumber()).thenReturn("otherCdNumber"); + + assertEquals(StringUtils.EMPTY, metadataCollaborator.getCdNumber()); + } + + @Test + @DisplayName("not accepting null cd number") + public void shouldGetEmptyCdNumber(TestInfo testInfo) { + log.info(() -> "Running test: " + testInfo.getDisplayName()); + setMetadatasExpectations(); + when(metadataOne.getCdNumber()).thenReturn(null); + when(metadataTwo.getCdNumber()).thenReturn(null); + + assertThrows(NullPointerException.class, metadataCollaborator::getCdNumber); + } + + @Test + @DisplayName("getting total cds") + public void shouldGetTotalCds(TestInfo testInfo) { + log.info(() -> "Running test: " + testInfo.getDisplayName()); + setMetadatasExpectations(); + when(metadataOne.getTotalCds()).thenReturn(totalCds); + when(metadataTwo.getTotalCds()).thenReturn(totalCds); + + assertEquals(totalCds, metadataCollaborator.getTotalCds()); + } + + @Test + @DisplayName("not getting total cds") + public void shouldNotGetTotalCds(TestInfo testInfo) { + log.info(() -> "Running test: " + testInfo.getDisplayName()); + setMetadatasExpectations(); + when(metadataOne.getTotalCds()).thenReturn(totalCds); + when(metadataTwo.getTotalCds()).thenReturn("otherCds"); + + assertEquals(StringUtils.EMPTY, metadataCollaborator.getTotalCds()); + } + + @Test + @DisplayName("not accepting null total cds") + public void shouldGetEmptyTotalCds(TestInfo testInfo) { + log.info(() -> "Running test: " + testInfo.getDisplayName()); + setMetadatasExpectations(); + when(metadataOne.getTotalCds()).thenReturn(null); + when(metadataTwo.getTotalCds()).thenReturn(null); + + assertThrows(NullPointerException.class, metadataCollaborator::getTotalCds); + } } diff --git a/src/test/java/com/josdem/jmetadata/controller/TestCompleteController.java b/src/test/java/com/josdem/jmetadata/controller/TestCompleteController.java index 05f7d06..461f5a1 100644 --- a/src/test/java/com/josdem/jmetadata/controller/TestCompleteController.java +++ b/src/test/java/com/josdem/jmetadata/controller/TestCompleteController.java @@ -16,6 +16,10 @@ package com.josdem.jmetadata.controller; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + import com.josdem.jmetadata.action.ActionResult; import com.josdem.jmetadata.exception.MetadataException; import com.josdem.jmetadata.metadata.MetadataWriter; @@ -23,111 +27,98 @@ import com.josdem.jmetadata.model.Metadata; import com.josdem.jmetadata.service.LastfmService; import com.josdem.jmetadata.service.MusicBrainzService; +import java.awt.Image; +import java.io.File; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.MockitoAnnotations; -import java.awt.Image; -import java.io.File; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; - class TestCompleteController { - private static final String ERROR = "Error"; - - @InjectMocks - private final CompleteController controller = new CompleteController(); - - @Mock - private MetadataWriter metadataWriter; - @Mock - private Metadata metadata; - @Mock - private File file; - @Mock - private LastfmService coverArtService; - @Mock - private MusicBrainzService musicBrainzService; - @Mock - private CoverArt coverArt; - @Mock - private Image imageIcon; - - private String artist = "Dave Deen"; - private String title = "Footprints (Original Mix)"; - private String album = "Footprints EP"; - private String genre = "Trance"; - private String trackNumber = "10"; - private String totalTracks = "25"; - private String year = "1990"; - private String cdNumber = "1"; - private String totalCds = "2"; - - @BeforeEach - public void setup() throws Exception { - MockitoAnnotations.initMocks(this); - - when(metadata.getArtist()).thenReturn(artist); - when(metadata.getTitle()).thenReturn(title); - when(metadata.getAlbum()).thenReturn(album); - when(metadata.getTrackNumber()).thenReturn(trackNumber); - when(metadata.getTotalTracks()).thenReturn(totalTracks); - when(metadata.getCdNumber()).thenReturn(cdNumber); - when(metadata.getTotalCds()).thenReturn(totalCds); - when(metadata.getYear()).thenReturn(year); - when(metadata.getGenre()).thenReturn(genre); - when(coverArtService.completeLastFM(metadata)).thenReturn(ActionResult.Ready); - } - - @Test - public void shouldCompleteAlbumInMetadata() throws Exception { - when(metadata.getFile()).thenReturn(file); - - ActionResult result = controller.completeAlbum(metadata); - - verify(metadataWriter).setFile(file); - verify(metadataWriter).writeArtist(artist); - verify(metadataWriter).writeTitle(title); - verify(metadataWriter).writeAlbum(album); - verify(metadataWriter).writeTrackNumber(trackNumber.toString()); - verify(metadataWriter).writeTotalTracksNumber(totalTracks.toString()); - verify(metadataWriter).writeCdNumber(cdNumber); - verify(metadataWriter).writeTotalCds(totalCds); - verify(metadataWriter).writeYear(year); - verify(metadataWriter).writeGenre(genre); - assertEquals(ActionResult.Updated, result); - } - - @Test - public void shouldRemoveCoverArt() throws Exception { - when(metadata.getNewCoverArt()).thenReturn(coverArt); - when(coverArt.getImage()).thenReturn(imageIcon); - - ActionResult result = controller.completeAlbum(metadata); - - verify(metadataWriter).removeCoverArt(); - verify(metadataWriter).writeCoverArt(imageIcon); - verify(metadata).setCoverArt(imageIcon); - assertEquals(ActionResult.Updated, result); - } - - @Test - public void shouldNotUpdateMetadata() throws Exception { - when(metadata.getFile()).thenReturn(file); - when(metadataWriter.writeAlbum(album)).thenThrow(new MetadataException(ERROR)); - - ActionResult result = controller.completeAlbum(metadata); - - assertEquals(ActionResult.Error, result); - } - - @Test - public void shouldCompleteCoverArtMetadata() throws Exception { - controller.completeLastFmMetadata(metadata); - verify(coverArtService).completeLastFM(metadata); - } + private static final String ERROR = "Error"; + + @InjectMocks private final CompleteController controller = new CompleteController(); + + @Mock private MetadataWriter metadataWriter; + @Mock private Metadata metadata; + @Mock private File file; + @Mock private LastfmService coverArtService; + @Mock private MusicBrainzService musicBrainzService; + @Mock private CoverArt coverArt; + @Mock private Image imageIcon; + + private String artist = "Dave Deen"; + private String title = "Footprints (Original Mix)"; + private String album = "Footprints EP"; + private String genre = "Trance"; + private String trackNumber = "10"; + private String totalTracks = "25"; + private String year = "1990"; + private String cdNumber = "1"; + private String totalCds = "2"; + + @BeforeEach + public void setup() throws Exception { + MockitoAnnotations.initMocks(this); + + when(metadata.getArtist()).thenReturn(artist); + when(metadata.getTitle()).thenReturn(title); + when(metadata.getAlbum()).thenReturn(album); + when(metadata.getTrackNumber()).thenReturn(trackNumber); + when(metadata.getTotalTracks()).thenReturn(totalTracks); + when(metadata.getCdNumber()).thenReturn(cdNumber); + when(metadata.getTotalCds()).thenReturn(totalCds); + when(metadata.getYear()).thenReturn(year); + when(metadata.getGenre()).thenReturn(genre); + when(coverArtService.completeLastFM(metadata)).thenReturn(ActionResult.Ready); + } + + @Test + public void shouldCompleteAlbumInMetadata() throws Exception { + when(metadata.getFile()).thenReturn(file); + + ActionResult result = controller.completeAlbum(metadata); + + verify(metadataWriter).setFile(file); + verify(metadataWriter).writeArtist(artist); + verify(metadataWriter).writeTitle(title); + verify(metadataWriter).writeAlbum(album); + verify(metadataWriter).writeTrackNumber(trackNumber.toString()); + verify(metadataWriter).writeTotalTracksNumber(totalTracks.toString()); + verify(metadataWriter).writeCdNumber(cdNumber); + verify(metadataWriter).writeTotalCds(totalCds); + verify(metadataWriter).writeYear(year); + verify(metadataWriter).writeGenre(genre); + assertEquals(ActionResult.Updated, result); + } + + @Test + public void shouldRemoveCoverArt() throws Exception { + when(metadata.getNewCoverArt()).thenReturn(coverArt); + when(coverArt.getImage()).thenReturn(imageIcon); + + ActionResult result = controller.completeAlbum(metadata); + + verify(metadataWriter).removeCoverArt(); + verify(metadataWriter).writeCoverArt(imageIcon); + verify(metadata).setCoverArt(imageIcon); + assertEquals(ActionResult.Updated, result); + } + + @Test + public void shouldNotUpdateMetadata() throws Exception { + when(metadata.getFile()).thenReturn(file); + when(metadataWriter.writeAlbum(album)).thenThrow(new MetadataException(ERROR)); + + ActionResult result = controller.completeAlbum(metadata); + + assertEquals(ActionResult.Error, result); + } + + @Test + public void shouldCompleteCoverArtMetadata() throws Exception { + controller.completeLastFmMetadata(metadata); + verify(coverArtService).completeLastFM(metadata); + } } diff --git a/src/test/java/com/josdem/jmetadata/controller/TestDefaultController.java b/src/test/java/com/josdem/jmetadata/controller/TestDefaultController.java index 8af3e80..8bb78f2 100644 --- a/src/test/java/com/josdem/jmetadata/controller/TestDefaultController.java +++ b/src/test/java/com/josdem/jmetadata/controller/TestDefaultController.java @@ -16,9 +16,16 @@ package com.josdem.jmetadata.controller; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + import com.josdem.jmetadata.action.ActionResult; import com.josdem.jmetadata.model.Metadata; import com.josdem.jmetadata.service.DefaultService; +import java.util.ArrayList; +import java.util.List; +import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -27,53 +34,40 @@ import org.mockito.Mock; import org.mockito.MockitoAnnotations; -import java.util.ArrayList; -import java.util.List; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; -import lombok.extern.slf4j.Slf4j; - @Slf4j - - class TestDefaultController { - @InjectMocks - private final DefaultController defaultController = new DefaultController(); - - @Mock - private DefaultService defaultService; + @InjectMocks private final DefaultController defaultController = new DefaultController(); - private final List metadatas = new ArrayList(); + @Mock private DefaultService defaultService; + private final List metadatas = new ArrayList(); - @BeforeEach - public void setup() throws Exception { - MockitoAnnotations.initMocks(this); - } + @BeforeEach + public void setup() throws Exception { + MockitoAnnotations.initMocks(this); + } - @Test - @DisplayName("completing total tracks") - public void shouldCompleteTotalTracks(TestInfo testInfo) throws Exception { - log.info(testInfo.getDisplayName()); - when(defaultService.isCompletable(metadatas)).thenReturn(true); + @Test + @DisplayName("completing total tracks") + public void shouldCompleteTotalTracks(TestInfo testInfo) throws Exception { + log.info(testInfo.getDisplayName()); + when(defaultService.isCompletable(metadatas)).thenReturn(true); - ActionResult result = defaultController.complete(metadatas); + ActionResult result = defaultController.complete(metadatas); - verify(defaultService).complete(metadatas); - assertEquals(ActionResult.New, result); - } + verify(defaultService).complete(metadatas); + assertEquals(ActionResult.New, result); + } - @Test - @DisplayName("not completing total tracks") - public void shouldNotCompleteTotalTracks(TestInfo testInfo) throws Exception { - log.info(testInfo.getDisplayName()); - when(defaultService.isCompletable(metadatas)).thenReturn(false); + @Test + @DisplayName("not completing total tracks") + public void shouldNotCompleteTotalTracks(TestInfo testInfo) throws Exception { + log.info(testInfo.getDisplayName()); + when(defaultService.isCompletable(metadatas)).thenReturn(false); - ActionResult result = defaultController.complete(metadatas); + ActionResult result = defaultController.complete(metadatas); - assertEquals(ActionResult.Ready, result); - } + assertEquals(ActionResult.Ready, result); + } } diff --git a/src/test/java/com/josdem/jmetadata/controller/TestExporterController.java b/src/test/java/com/josdem/jmetadata/controller/TestExporterController.java index 96499c6..c612641 100644 --- a/src/test/java/com/josdem/jmetadata/controller/TestExporterController.java +++ b/src/test/java/com/josdem/jmetadata/controller/TestExporterController.java @@ -16,9 +16,15 @@ package com.josdem.jmetadata.controller; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + import com.josdem.jmetadata.action.ActionResult; import com.josdem.jmetadata.helper.ExporterHelper; import com.josdem.jmetadata.model.ExportPackage; +import java.io.IOException; +import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -27,53 +33,39 @@ import org.mockito.Mock; import org.mockito.MockitoAnnotations; -import java.io.IOException; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; -import lombok.extern.slf4j.Slf4j; - @Slf4j - - class TestExporterController { - @InjectMocks - private final ExporterController exporterController = new ExporterController(); - - @Mock - private ExportPackage exportPackage; - @Mock - private ExporterHelper exporterHelper; - + @InjectMocks private final ExporterController exporterController = new ExporterController(); - @BeforeEach - public void setup() throws Exception { - MockitoAnnotations.initMocks(this); - } + @Mock private ExportPackage exportPackage; + @Mock private ExporterHelper exporterHelper; - @Test - @DisplayName("sending metadata") - public void shouldSendMetadata(TestInfo testInfo) throws Exception { - log.info(testInfo.getDisplayName()); - when(exporterHelper.export(exportPackage)).thenReturn(ActionResult.Exported); + @BeforeEach + public void setup() throws Exception { + MockitoAnnotations.initMocks(this); + } - ActionResult result = exporterController.sendMetadata(exportPackage); + @Test + @DisplayName("sending metadata") + public void shouldSendMetadata(TestInfo testInfo) throws Exception { + log.info(testInfo.getDisplayName()); + when(exporterHelper.export(exportPackage)).thenReturn(ActionResult.Exported); - verify(exporterHelper).export(exportPackage); - assertEquals(ActionResult.Exported, result); - } + ActionResult result = exporterController.sendMetadata(exportPackage); - @Test - @DisplayName("reporting error in sending metadata") - public void shouldReportErrorInSendingMetadata(TestInfo testInfo) throws Exception { - log.info(testInfo.getDisplayName()); - when(exporterHelper.export(exportPackage)).thenThrow(new IOException()); + verify(exporterHelper).export(exportPackage); + assertEquals(ActionResult.Exported, result); + } - ActionResult result = exporterController.sendMetadata(exportPackage); + @Test + @DisplayName("reporting error in sending metadata") + public void shouldReportErrorInSendingMetadata(TestInfo testInfo) throws Exception { + log.info(testInfo.getDisplayName()); + when(exporterHelper.export(exportPackage)).thenThrow(new IOException()); - assertEquals(ActionResult.Error, result); - } + ActionResult result = exporterController.sendMetadata(exportPackage); + assertEquals(ActionResult.Error, result); + } } diff --git a/src/test/java/com/josdem/jmetadata/controller/TestFormatterController.java b/src/test/java/com/josdem/jmetadata/controller/TestFormatterController.java index 038fdd7..02e2dea 100644 --- a/src/test/java/com/josdem/jmetadata/controller/TestFormatterController.java +++ b/src/test/java/com/josdem/jmetadata/controller/TestFormatterController.java @@ -16,6 +16,8 @@ package com.josdem.jmetadata.controller; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.Mockito.when; import com.josdem.jmetadata.action.ActionResult; import com.josdem.jmetadata.model.Metadata; @@ -26,46 +28,39 @@ import org.mockito.Mock; import org.mockito.MockitoAnnotations; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.mockito.Mockito.when; - public class TestFormatterController { - @InjectMocks - private FormatterController formatterController = new FormatterController(); - - @Mock - private FormatterService formatterService; - @Mock - private Metadata metadata; + @InjectMocks private FormatterController formatterController = new FormatterController(); - @BeforeEach - public void setup() throws Exception { - MockitoAnnotations.initMocks(this); - } + @Mock private FormatterService formatterService; + @Mock private Metadata metadata; - @Test - public void shouldFormatWhenBadFormat() throws Exception { - when(formatterService.wasFormatted(metadata)).thenReturn(true); - when(formatterService.wasCamelized(metadata)).thenReturn(false); - ActionResult result = formatterController.format(metadata); - assertEquals(ActionResult.New, result); - } + @BeforeEach + public void setup() throws Exception { + MockitoAnnotations.initMocks(this); + } - @Test - public void shouldFormatWhenNotCamelized() throws Exception { - when(formatterService.wasFormatted(metadata)).thenReturn(false); - when(formatterService.wasCamelized(metadata)).thenReturn(true); - ActionResult result = formatterController.format(metadata); - assertEquals(ActionResult.New, result); - } + @Test + public void shouldFormatWhenBadFormat() throws Exception { + when(formatterService.wasFormatted(metadata)).thenReturn(true); + when(formatterService.wasCamelized(metadata)).thenReturn(false); + ActionResult result = formatterController.format(metadata); + assertEquals(ActionResult.New, result); + } - @Test - public void shouldReturnComplete() throws Exception { - when(formatterService.wasFormatted(metadata)).thenReturn(false); - when(formatterService.wasCamelized(metadata)).thenReturn(false); - ActionResult result = formatterController.format(metadata); - assertEquals(ActionResult.Ready, result); - } + @Test + public void shouldFormatWhenNotCamelized() throws Exception { + when(formatterService.wasFormatted(metadata)).thenReturn(false); + when(formatterService.wasCamelized(metadata)).thenReturn(true); + ActionResult result = formatterController.format(metadata); + assertEquals(ActionResult.New, result); + } + @Test + public void shouldReturnComplete() throws Exception { + when(formatterService.wasFormatted(metadata)).thenReturn(false); + when(formatterService.wasCamelized(metadata)).thenReturn(false); + ActionResult result = formatterController.format(metadata); + assertEquals(ActionResult.Ready, result); + } } diff --git a/src/test/java/com/josdem/jmetadata/controller/TestLoginController.java b/src/test/java/com/josdem/jmetadata/controller/TestLoginController.java index 27f0fc5..198243f 100644 --- a/src/test/java/com/josdem/jmetadata/controller/TestLoginController.java +++ b/src/test/java/com/josdem/jmetadata/controller/TestLoginController.java @@ -16,14 +16,22 @@ package com.josdem.jmetadata.controller; -import de.umass.lastfm.Session; -import org.asmatron.messengine.ControlEngine; -import org.asmatron.messengine.engines.support.ControlEngineConfigurator; -import org.asmatron.messengine.event.ValueEvent; +import static org.mockito.Matchers.eq; +import static org.mockito.Matchers.isA; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + import com.josdem.jmetadata.event.Events; import com.josdem.jmetadata.helper.LastFMAuthenticator; import com.josdem.jmetadata.model.Model; import com.josdem.jmetadata.model.User; +import de.umass.lastfm.Session; +import java.io.IOException; +import lombok.extern.slf4j.Slf4j; +import org.asmatron.messengine.ControlEngine; +import org.asmatron.messengine.engines.support.ControlEngineConfigurator; +import org.asmatron.messengine.event.ValueEvent; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -32,78 +40,61 @@ import org.mockito.Mock; import org.mockito.MockitoAnnotations; -import java.io.IOException; - -import static org.mockito.Matchers.eq; -import static org.mockito.Matchers.isA; -import static org.mockito.Mockito.never; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; -import lombok.extern.slf4j.Slf4j; - @Slf4j - class TestLoginController { - @InjectMocks - private final LoginController controller = new LoginController(); - - @Mock - private LastFMAuthenticator lastfmAuthenticator; - @Mock - private ControlEngineConfigurator configurator; - @Mock - private ControlEngine controlEngine; - @Mock - private Session session; - - private final String username = "josdem"; - private final String password = "password"; + @InjectMocks private final LoginController controller = new LoginController(); - private User credentials; + @Mock private LastFMAuthenticator lastfmAuthenticator; + @Mock private ControlEngineConfigurator configurator; + @Mock private ControlEngine controlEngine; + @Mock private Session session; + private final String username = "josdem"; + private final String password = "password"; - @BeforeEach - public void setup() throws Exception { - MockitoAnnotations.initMocks(this); - when(configurator.getControlEngine()).thenReturn(controlEngine); + private User credentials; - credentials = new User(username, password); - } + @BeforeEach + public void setup() throws Exception { + MockitoAnnotations.initMocks(this); + when(configurator.getControlEngine()).thenReturn(controlEngine); - @Test - @DisplayName("login as a user") - public void shouldLogin(TestInfo testInfo) throws Exception { - log.info(testInfo.getDisplayName()); - when(lastfmAuthenticator.login(username, password)).thenReturn(session); + credentials = new User(username, password); + } - controller.login(credentials); + @Test + @DisplayName("login as a user") + public void shouldLogin(TestInfo testInfo) throws Exception { + log.info(testInfo.getDisplayName()); + when(lastfmAuthenticator.login(username, password)).thenReturn(session); - verify(lastfmAuthenticator).login(username, password); - verify(controlEngine).set(Model.CURRENT_USER, credentials, null); - verify(controlEngine).fireEvent(eq(Events.LOGGED), isA(ValueEvent.class)); - } + controller.login(credentials); - @Test - @DisplayName("login as a user failed") - public void shouldFailAtLogin(TestInfo testInfo) throws Exception { - log.info(testInfo.getDisplayName()); - controller.login(credentials); + verify(lastfmAuthenticator).login(username, password); + verify(controlEngine).set(Model.CURRENT_USER, credentials, null); + verify(controlEngine).fireEvent(eq(Events.LOGGED), isA(ValueEvent.class)); + } - verify(lastfmAuthenticator).login(username, password); - verify(controlEngine, never()).set(Model.CURRENT_USER, credentials, null); - verify(controlEngine).fireEvent(Events.LOGIN_FAILED); - } + @Test + @DisplayName("login as a user failed") + public void shouldFailAtLogin(TestInfo testInfo) throws Exception { + log.info(testInfo.getDisplayName()); + controller.login(credentials); - @Test - @DisplayName("login as a user failed due to exception") - public void shouldFailDueToException(TestInfo testInfo) throws Exception { - log.info(testInfo.getDisplayName()); - when(lastfmAuthenticator.login(username, password)).thenThrow(new IOException()); + verify(lastfmAuthenticator).login(username, password); + verify(controlEngine, never()).set(Model.CURRENT_USER, credentials, null); + verify(controlEngine).fireEvent(Events.LOGIN_FAILED); + } - controller.login(credentials); + @Test + @DisplayName("login as a user failed due to exception") + public void shouldFailDueToException(TestInfo testInfo) throws Exception { + log.info(testInfo.getDisplayName()); + when(lastfmAuthenticator.login(username, password)).thenThrow(new IOException()); - verify(controlEngine).fireEvent(Events.LOGIN_FAILED); - } + controller.login(credentials); + verify(controlEngine).fireEvent(Events.LOGIN_FAILED); + } } diff --git a/src/test/java/com/josdem/jmetadata/controller/TestScrobblerController.java b/src/test/java/com/josdem/jmetadata/controller/TestScrobblerController.java index bef148b..48d67d7 100644 --- a/src/test/java/com/josdem/jmetadata/controller/TestScrobblerController.java +++ b/src/test/java/com/josdem/jmetadata/controller/TestScrobblerController.java @@ -16,11 +16,17 @@ package com.josdem.jmetadata.controller; -import org.asmatron.messengine.ControlEngine; -import org.asmatron.messengine.engines.support.ControlEngineConfigurator; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + import com.josdem.jmetadata.action.ActionResult; import com.josdem.jmetadata.helper.ScrobblerHelper; import com.josdem.jmetadata.model.Metadata; +import java.io.IOException; +import lombok.extern.slf4j.Slf4j; +import org.asmatron.messengine.ControlEngine; +import org.asmatron.messengine.engines.support.ControlEngineConfigurator; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -29,88 +35,73 @@ import org.mockito.Mock; import org.mockito.MockitoAnnotations; -import java.io.IOException; +@Slf4j +class TestScrobblerController { -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; -import lombok.extern.slf4j.Slf4j; + @InjectMocks private final ScrobblerController controller = new ScrobblerController(); -@Slf4j + @Mock private Metadata metadata; + @Mock private ControlEngineConfigurator configurator; + @Mock private ControlEngine controlEngine; + @Mock private ScrobblerHelper scrobblerHelper; + @BeforeEach + public void setup() throws Exception { + MockitoAnnotations.openMocks(this); + when(configurator.getControlEngine()).thenReturn(controlEngine); + } -class TestScrobblerController { + @Test + @DisplayName("sending metadata") + public void shouldSendMetadata(TestInfo testInfo) throws Exception { + log.info(testInfo.getDisplayName()); + when(scrobblerHelper.send(metadata)).thenReturn(ActionResult.New); + + ActionResult result = controller.sendMetadata(metadata); + + verify(scrobblerHelper).send(metadata); + assertEquals(ActionResult.New, result); + } + + @Test + @DisplayName("detecting error in scrobbling") + public void shouldDetectWhenErrorInScrobbling(TestInfo testInfo) throws Exception { + log.info(testInfo.getDisplayName()); + when(scrobblerHelper.send(metadata)).thenReturn(ActionResult.Error); + + ActionResult result = controller.sendMetadata(metadata); + + verify(scrobblerHelper).send(metadata); + assertEquals(ActionResult.Error, result); + } + + @Test + @DisplayName("setting up scrobbler") + public void shouldSetup(TestInfo testInfo) { + log.info(testInfo.getDisplayName()); + controller.setup(); + verify(scrobblerHelper).setControlEngine(controlEngine); + } + + @Test + @DisplayName("catching IOException") + public void shouldCatchIOException(TestInfo testInfo) throws Exception { + log.info(testInfo.getDisplayName()); + when(scrobblerHelper.send(metadata)).thenThrow(new IOException()); + + ActionResult result = controller.sendMetadata(metadata); + + assertEquals(ActionResult.Error, result); + } + + @Test + @DisplayName("catching InterruptedException") + public void shouldCatchInterruptedException(TestInfo testInfo) throws Exception { + log.info(testInfo.getDisplayName()); + when(scrobblerHelper.send(metadata)).thenThrow(new InterruptedException()); + + ActionResult result = controller.sendMetadata(metadata); - @InjectMocks - private final ScrobblerController controller = new ScrobblerController(); - - @Mock - private Metadata metadata; - @Mock - private ControlEngineConfigurator configurator; - @Mock - private ControlEngine controlEngine; - @Mock - private ScrobblerHelper scrobblerHelper; - - - @BeforeEach - public void setup() throws Exception { - MockitoAnnotations.openMocks(this); - when(configurator.getControlEngine()).thenReturn(controlEngine); - } - - @Test - @DisplayName("sending metadata") - public void shouldSendMetadata(TestInfo testInfo) throws Exception { - log.info(testInfo.getDisplayName()); - when(scrobblerHelper.send(metadata)).thenReturn(ActionResult.New); - - ActionResult result = controller.sendMetadata(metadata); - - verify(scrobblerHelper).send(metadata); - assertEquals(ActionResult.New, result); - } - - @Test - @DisplayName("detecting error in scrobbling") - public void shouldDetectWhenErrorInScrobbling(TestInfo testInfo) throws Exception { - log.info(testInfo.getDisplayName()); - when(scrobblerHelper.send(metadata)).thenReturn(ActionResult.Error); - - ActionResult result = controller.sendMetadata(metadata); - - verify(scrobblerHelper).send(metadata); - assertEquals(ActionResult.Error, result); - } - - @Test - @DisplayName("setting up scrobbler") - public void shouldSetup(TestInfo testInfo) { - log.info(testInfo.getDisplayName()); - controller.setup(); - verify(scrobblerHelper).setControlEngine(controlEngine); - } - - @Test - @DisplayName("catching IOException") - public void shouldCatchIOException(TestInfo testInfo) throws Exception { - log.info(testInfo.getDisplayName()); - when(scrobblerHelper.send(metadata)).thenThrow(new IOException()); - - ActionResult result = controller.sendMetadata(metadata); - - assertEquals(ActionResult.Error, result); - } - - @Test - @DisplayName("catching InterruptedException") - public void shouldCatchInterruptedException(TestInfo testInfo) throws Exception { - log.info(testInfo.getDisplayName()); - when(scrobblerHelper.send(metadata)).thenThrow(new InterruptedException()); - - ActionResult result = controller.sendMetadata(metadata); - - assertEquals(ActionResult.Error, result); - } + assertEquals(ActionResult.Error, result); + } } diff --git a/src/test/java/com/josdem/jmetadata/gui/TestLoginWindow.java b/src/test/java/com/josdem/jmetadata/gui/TestLoginWindow.java index 759978b..1c1ab53 100644 --- a/src/test/java/com/josdem/jmetadata/gui/TestLoginWindow.java +++ b/src/test/java/com/josdem/jmetadata/gui/TestLoginWindow.java @@ -16,11 +16,17 @@ package com.josdem.jmetadata.gui; +import static org.mockito.Matchers.eq; +import static org.mockito.Matchers.isA; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import com.josdem.jmetadata.action.Actions; +import com.josdem.jmetadata.model.User; +import java.awt.*; import org.asmatron.messengine.ViewEngine; import org.asmatron.messengine.engines.support.ViewEngineConfigurator; import org.fest.swing.fixture.FrameFixture; -import com.josdem.jmetadata.action.Actions; -import com.josdem.jmetadata.model.User; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -28,53 +34,43 @@ import org.mockito.Mock; import org.mockito.MockitoAnnotations; -import java.awt.*; - -import static org.mockito.Matchers.eq; -import static org.mockito.Matchers.isA; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; - public class TestLoginWindow { - @InjectMocks - private LoginWindow loginWindow = new LoginWindow(); + @InjectMocks private LoginWindow loginWindow = new LoginWindow(); - private static final String USERNAME_TEXTFIELD_NAME = "loginTextField"; - private static final String PASSWORD_TEXTFIELD_NAME = "passwordLoginField"; - private static final String SIGN_UP_BUTTON_NAME = "buttonCenterLogin"; - private static final Dimension FRAME_DIMENSION = new Dimension(390, 180); - private FrameFixture window; - private String user = "josdem"; - private String password = "password"; + private static final String USERNAME_TEXTFIELD_NAME = "loginTextField"; + private static final String PASSWORD_TEXTFIELD_NAME = "passwordLoginField"; + private static final String SIGN_UP_BUTTON_NAME = "buttonCenterLogin"; + private static final Dimension FRAME_DIMENSION = new Dimension(390, 180); + private FrameFixture window; + private String user = "josdem"; + private String password = "password"; - @Mock - private ViewEngineConfigurator configurator; - @Mock - private ViewEngine viewEngine; + @Mock private ViewEngineConfigurator configurator; + @Mock private ViewEngine viewEngine; - @BeforeEach - public void setup() throws Exception { - MockitoAnnotations.initMocks(this); - when(configurator.getViewEngine()).thenReturn(viewEngine); - window = new FrameFixture(loginWindow.getFrame()); - window.show(FRAME_DIMENSION); - } + @BeforeEach + public void setup() throws Exception { + MockitoAnnotations.initMocks(this); + when(configurator.getViewEngine()).thenReturn(viewEngine); + window = new FrameFixture(loginWindow.getFrame()); + window.show(FRAME_DIMENSION); + } - @Test - public void shouldLoginByActionListener() { - setUsernameAndPassword(); - window.button(SIGN_UP_BUTTON_NAME).click(); + @Test + public void shouldLoginByActionListener() { + setUsernameAndPassword(); + window.button(SIGN_UP_BUTTON_NAME).click(); - verify(viewEngine).sendValueAction(eq(Actions.LOGIN), isA(User.class)); - } + verify(viewEngine).sendValueAction(eq(Actions.LOGIN), isA(User.class)); + } - private void setUsernameAndPassword() { - window.textBox(USERNAME_TEXTFIELD_NAME).enterText(user); - window.textBox(PASSWORD_TEXTFIELD_NAME).enterText(password); - } + private void setUsernameAndPassword() { + window.textBox(USERNAME_TEXTFIELD_NAME).enterText(user); + window.textBox(PASSWORD_TEXTFIELD_NAME).enterText(password); + } - @AfterEach - public void tearDown() throws Exception { - window.cleanUp(); - } + @AfterEach + public void tearDown() throws Exception { + window.cleanUp(); + } } diff --git a/src/test/java/com/josdem/jmetadata/gui/TestMetadataDialog.java b/src/test/java/com/josdem/jmetadata/gui/TestMetadataDialog.java index 91d44e8..7e932d0 100644 --- a/src/test/java/com/josdem/jmetadata/gui/TestMetadataDialog.java +++ b/src/test/java/com/josdem/jmetadata/gui/TestMetadataDialog.java @@ -16,114 +16,110 @@ package com.josdem.jmetadata.gui; -import org.asmatron.messengine.ControlEngine; -import org.asmatron.messengine.engines.support.ControlEngineConfigurator; -import org.asmatron.messengine.event.ValueEvent; -import org.fest.swing.fixture.FrameFixture; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + import com.josdem.jmetadata.event.Events; import com.josdem.jmetadata.helper.MetadataHelper; import com.josdem.jmetadata.model.Metadata; import com.josdem.jmetadata.model.MetadataAlbumValues; import com.josdem.jmetadata.model.Model; import com.josdem.jmetadata.util.Environment; +import java.awt.*; +import java.util.ArrayList; +import java.util.List; +import javax.swing.*; +import org.asmatron.messengine.ControlEngine; +import org.asmatron.messengine.engines.support.ControlEngineConfigurator; +import org.asmatron.messengine.event.ValueEvent; +import org.fest.swing.fixture.FrameFixture; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.mockito.Mock; import org.mockito.MockitoAnnotations; -import javax.swing.*; -import java.awt.*; -import java.util.ArrayList; -import java.util.List; - -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; - class TestMetadataDialog { - private static final int HEIGHT = 450; - private static final int WIDTH = 400; - private static final String ARTIST = "Armin Van Buuren"; - private static final String ALBUM = "Mirage"; - private static final String GENRE = "Trance"; - private static final String YEAR = "2010"; - private static final String TRACKS = "16"; - private static final String CD = "1"; - private static final String CDS = "1"; - - private static final String ARTIST_INPUT = "artistTextField"; - private static final String ALBUM_INPUT = "albumTextField"; - private static final String GENRE_INPUT = "genreTextField"; - private static final String YEAR_INPUT = "yearTextField"; - private static final String TRACKS_INPUT = "tracksTextField"; - private static final String CD_INPUT = "cdTextField"; - private static final String CDS_INPUT = "cdsTextField"; - - private static final String APPLY_BUTTON_NAME = "buttonApply"; - - @Mock - private ControlEngineConfigurator controlEngineConfigurator; - @Mock - private ControlEngine controlEngine; - @Mock - private MetadataHelper metadataHelper; - @Mock - private MetadataAlbumValues metadataAlbumValues; - @Mock - private Metadata metadata; - - private FrameFixture window; - private final JFrame frame = new JFrame(); - private final MainWindow mainWindow = new MainWindow(); - private final List metadatas = new ArrayList<>(); - - @BeforeEach - public void setup() throws Exception { - MockitoAnnotations.initMocks(this); - when(controlEngineConfigurator.getControlEngine()).thenReturn(controlEngine); + private static final int HEIGHT = 450; + private static final int WIDTH = 400; + private static final String ARTIST = "Armin Van Buuren"; + private static final String ALBUM = "Mirage"; + private static final String GENRE = "Trance"; + private static final String YEAR = "2010"; + private static final String TRACKS = "16"; + private static final String CD = "1"; + private static final String CDS = "1"; + + private static final String ARTIST_INPUT = "artistTextField"; + private static final String ALBUM_INPUT = "albumTextField"; + private static final String GENRE_INPUT = "genreTextField"; + private static final String YEAR_INPUT = "yearTextField"; + private static final String TRACKS_INPUT = "tracksTextField"; + private static final String CD_INPUT = "cdTextField"; + private static final String CDS_INPUT = "cdsTextField"; + + private static final String APPLY_BUTTON_NAME = "buttonApply"; + + @Mock private ControlEngineConfigurator controlEngineConfigurator; + @Mock private ControlEngine controlEngine; + @Mock private MetadataHelper metadataHelper; + @Mock private MetadataAlbumValues metadataAlbumValues; + @Mock private Metadata metadata; + + private FrameFixture window; + private final JFrame frame = new JFrame(); + private final MainWindow mainWindow = new MainWindow(); + private final List metadatas = new ArrayList<>(); + + @BeforeEach + public void setup() throws Exception { + MockitoAnnotations.initMocks(this); + when(controlEngineConfigurator.getControlEngine()).thenReturn(controlEngine); + } + + @Test + public void shouldSetAlbumValues() throws Exception { + // Avoid running in Linux since is not working properly + if (!Environment.isLinux()) { + metadatas.add(metadata); + when(metadataHelper.createMetadataAlbumValues()).thenReturn(metadataAlbumValues); + when(controlEngine.get(Model.METADATA)).thenReturn(metadatas); + + String message = "message"; + MetadataDialog metadataDialog = + new MetadataDialog(mainWindow, controlEngineConfigurator, message); + metadataDialog.setMetadataHelper(metadataHelper); + frame.add(metadataDialog.getContentPane()); + window = new FrameFixture(frame); + window.show(); + window.resizeTo(new Dimension(WIDTH, HEIGHT)); + window.textBox(ARTIST_INPUT).enterText(ARTIST); + window.textBox(ALBUM_INPUT).enterText(ALBUM); + window.textBox(GENRE_INPUT).enterText(GENRE); + window.textBox(YEAR_INPUT).enterText(YEAR); + window.textBox(TRACKS_INPUT).enterText(TRACKS); + window.textBox(CD_INPUT).enterText(CD); + window.textBox(CDS_INPUT).enterText(CDS); + + window.button(APPLY_BUTTON_NAME).click(); + + verify(metadataAlbumValues).setArtist(ARTIST); + verify(metadataAlbumValues).setAlbum(ALBUM); + verify(metadataAlbumValues).setGenre(GENRE); + verify(metadataAlbumValues).setYear(YEAR); + verify(metadataAlbumValues).setTracks(TRACKS); + verify(metadataAlbumValues).setCd(CD); + verify(metadataAlbumValues).setCds(CDS); + verify(controlEngine) + .fireEvent( + Events.READY_TO_APPLY, new ValueEvent(metadataAlbumValues)); } + } - @Test - public void shouldSetAlbumValues() throws Exception { - //Avoid running in Linux since is not working properly - if (!Environment.isLinux()) { - metadatas.add(metadata); - when(metadataHelper.createMetadataAlbumValues()).thenReturn(metadataAlbumValues); - when(controlEngine.get(Model.METADATA)).thenReturn(metadatas); - - String message = "message"; - MetadataDialog metadataDialog = new MetadataDialog(mainWindow, controlEngineConfigurator, message); - metadataDialog.setMetadataHelper(metadataHelper); - frame.add(metadataDialog.getContentPane()); - window = new FrameFixture(frame); - window.show(); - window.resizeTo(new Dimension(WIDTH, HEIGHT)); - window.textBox(ARTIST_INPUT).enterText(ARTIST); - window.textBox(ALBUM_INPUT).enterText(ALBUM); - window.textBox(GENRE_INPUT).enterText(GENRE); - window.textBox(YEAR_INPUT).enterText(YEAR); - window.textBox(TRACKS_INPUT).enterText(TRACKS); - window.textBox(CD_INPUT).enterText(CD); - window.textBox(CDS_INPUT).enterText(CDS); - - window.button(APPLY_BUTTON_NAME).click(); - - verify(metadataAlbumValues).setArtist(ARTIST); - verify(metadataAlbumValues).setAlbum(ALBUM); - verify(metadataAlbumValues).setGenre(GENRE); - verify(metadataAlbumValues).setYear(YEAR); - verify(metadataAlbumValues).setTracks(TRACKS); - verify(metadataAlbumValues).setCd(CD); - verify(metadataAlbumValues).setCds(CDS); - verify(controlEngine).fireEvent(Events.READY_TO_APPLY, new ValueEvent(metadataAlbumValues)); - } + @AfterEach + public void tearDown() throws Exception { + if (!Environment.isLinux()) { + window.cleanUp(); } - - @AfterEach - public void tearDown() throws Exception { - if (!Environment.isLinux()) { - window.cleanUp(); - } - } - + } } diff --git a/src/test/java/com/josdem/jmetadata/gui/table/TestDescriptionTableColumns.java b/src/test/java/com/josdem/jmetadata/gui/table/TestDescriptionTableColumns.java index c4ad33e..7ffbc8e 100644 --- a/src/test/java/com/josdem/jmetadata/gui/table/TestDescriptionTableColumns.java +++ b/src/test/java/com/josdem/jmetadata/gui/table/TestDescriptionTableColumns.java @@ -16,81 +16,79 @@ package com.josdem.jmetadata.gui.table; +import static org.junit.jupiter.api.Assertions.assertEquals; import org.junit.jupiter.api.Test; -import static org.junit.jupiter.api.Assertions.assertEquals; - public class TestDescriptionTableColumns { - @Test - public void shouldValidateArtistColumn() throws Exception { - assertEquals("Artist", DescriptionTableColumns.ARTIST.label()); - assertEquals(68, DescriptionTableColumns.ARTIST.minWidth()); - assertEquals(68, DescriptionTableColumns.ARTIST.maxWidth()); - } - - @Test - public void shouldValidateTrackColumn() throws Exception { - assertEquals("Track", DescriptionTableColumns.TRACK.label()); - assertEquals(180, DescriptionTableColumns.TRACK.minWidth()); - assertEquals(180, DescriptionTableColumns.TRACK.maxWidth()); - } - - @Test - public void shouldValidateAlbumColumn() throws Exception { - assertEquals("Album", DescriptionTableColumns.ALBUM.label()); - assertEquals(68, DescriptionTableColumns.ALBUM.minWidth()); - assertEquals(68, DescriptionTableColumns.ALBUM.maxWidth()); - } - - @Test - public void shouldValidateGenreColumn() throws Exception { - assertEquals("Genre", DescriptionTableColumns.GENRE.label()); - assertEquals(67, DescriptionTableColumns.GENRE.minWidth()); - assertEquals(67, DescriptionTableColumns.GENRE.maxWidth()); - } - - @Test - public void shouldValidateYearColumn() throws Exception { - assertEquals("Year", DescriptionTableColumns.YEAR.label()); - assertEquals(50, DescriptionTableColumns.YEAR.minWidth()); - assertEquals(50, DescriptionTableColumns.YEAR.maxWidth()); - } - - @Test - public void shouldValidateTrackNumberColumn() throws Exception { - assertEquals("# Trk", DescriptionTableColumns.N_TRACK.label()); - assertEquals(50, DescriptionTableColumns.N_TRACK.minWidth()); - assertEquals(50, DescriptionTableColumns.N_TRACK.maxWidth()); - } - - @Test - public void shouldValidateTotalTracksColumn() throws Exception { - assertEquals("# Trks", DescriptionTableColumns.N_TRACKS.label()); - assertEquals(50, DescriptionTableColumns.N_TRACKS.minWidth()); - assertEquals(50, DescriptionTableColumns.N_TRACKS.maxWidth()); - } - - @Test - public void shouldValidateCdNumberColumn() throws Exception { - assertEquals("# CD", DescriptionTableColumns.N_CD.label()); - assertEquals(50, DescriptionTableColumns.N_CD.minWidth()); - assertEquals(50, DescriptionTableColumns.N_CD.maxWidth()); - } - - @Test - public void shouldValidateTotalCdsColumn() throws Exception { - assertEquals("# CDS", DescriptionTableColumns.N_CDS.label()); - assertEquals(50, DescriptionTableColumns.N_CDS.minWidth()); - assertEquals(50, DescriptionTableColumns.N_CDS.maxWidth()); - } - - @Test - public void shouldValidateStatusColumn() throws Exception { - assertEquals("Status", DescriptionTableColumns.STATUS.label()); - assertEquals(60, DescriptionTableColumns.STATUS.minWidth()); - assertEquals(60, DescriptionTableColumns.STATUS.maxWidth()); - } - + @Test + public void shouldValidateArtistColumn() throws Exception { + assertEquals("Artist", DescriptionTableColumns.ARTIST.label()); + assertEquals(68, DescriptionTableColumns.ARTIST.minWidth()); + assertEquals(68, DescriptionTableColumns.ARTIST.maxWidth()); + } + + @Test + public void shouldValidateTrackColumn() throws Exception { + assertEquals("Track", DescriptionTableColumns.TRACK.label()); + assertEquals(180, DescriptionTableColumns.TRACK.minWidth()); + assertEquals(180, DescriptionTableColumns.TRACK.maxWidth()); + } + + @Test + public void shouldValidateAlbumColumn() throws Exception { + assertEquals("Album", DescriptionTableColumns.ALBUM.label()); + assertEquals(68, DescriptionTableColumns.ALBUM.minWidth()); + assertEquals(68, DescriptionTableColumns.ALBUM.maxWidth()); + } + + @Test + public void shouldValidateGenreColumn() throws Exception { + assertEquals("Genre", DescriptionTableColumns.GENRE.label()); + assertEquals(67, DescriptionTableColumns.GENRE.minWidth()); + assertEquals(67, DescriptionTableColumns.GENRE.maxWidth()); + } + + @Test + public void shouldValidateYearColumn() throws Exception { + assertEquals("Year", DescriptionTableColumns.YEAR.label()); + assertEquals(50, DescriptionTableColumns.YEAR.minWidth()); + assertEquals(50, DescriptionTableColumns.YEAR.maxWidth()); + } + + @Test + public void shouldValidateTrackNumberColumn() throws Exception { + assertEquals("# Trk", DescriptionTableColumns.N_TRACK.label()); + assertEquals(50, DescriptionTableColumns.N_TRACK.minWidth()); + assertEquals(50, DescriptionTableColumns.N_TRACK.maxWidth()); + } + + @Test + public void shouldValidateTotalTracksColumn() throws Exception { + assertEquals("# Trks", DescriptionTableColumns.N_TRACKS.label()); + assertEquals(50, DescriptionTableColumns.N_TRACKS.minWidth()); + assertEquals(50, DescriptionTableColumns.N_TRACKS.maxWidth()); + } + + @Test + public void shouldValidateCdNumberColumn() throws Exception { + assertEquals("# CD", DescriptionTableColumns.N_CD.label()); + assertEquals(50, DescriptionTableColumns.N_CD.minWidth()); + assertEquals(50, DescriptionTableColumns.N_CD.maxWidth()); + } + + @Test + public void shouldValidateTotalCdsColumn() throws Exception { + assertEquals("# CDS", DescriptionTableColumns.N_CDS.label()); + assertEquals(50, DescriptionTableColumns.N_CDS.minWidth()); + assertEquals(50, DescriptionTableColumns.N_CDS.maxWidth()); + } + + @Test + public void shouldValidateStatusColumn() throws Exception { + assertEquals("Status", DescriptionTableColumns.STATUS.label()); + assertEquals(60, DescriptionTableColumns.STATUS.minWidth()); + assertEquals(60, DescriptionTableColumns.STATUS.maxWidth()); + } } diff --git a/src/test/java/com/josdem/jmetadata/helper/TestApplicationContextSingleton.java b/src/test/java/com/josdem/jmetadata/helper/TestApplicationContextSingleton.java index b716f96..5b01648 100644 --- a/src/test/java/com/josdem/jmetadata/helper/TestApplicationContextSingleton.java +++ b/src/test/java/com/josdem/jmetadata/helper/TestApplicationContextSingleton.java @@ -16,26 +16,25 @@ package com.josdem.jmetadata.helper; +import static org.junit.jupiter.api.Assertions.assertNotNull; -import org.asmatron.messengine.engines.DefaultEngine; import com.josdem.jmetadata.gui.LoginWindow; import com.josdem.jmetadata.gui.MainWindow; +import org.asmatron.messengine.engines.DefaultEngine; import org.junit.jupiter.api.Test; import org.springframework.context.ConfigurableApplicationContext; -import static org.junit.jupiter.api.Assertions.assertNotNull; - class TestApplicationContextSingleton { - @Test - public void shouldCreateAnApplicationContext() throws Exception { - ConfigurableApplicationContext applicationContext = ApplicationContextSingleton.getApplicationContext(); - DefaultEngine defaultEngine = applicationContext.getBean(DefaultEngine.class); - MainWindow mainWindow = applicationContext.getBean(MainWindow.class); - LoginWindow loginWindow = applicationContext.getBean(LoginWindow.class); - assertNotNull(defaultEngine); - assertNotNull(mainWindow); - assertNotNull(loginWindow); - } - + @Test + public void shouldCreateAnApplicationContext() throws Exception { + ConfigurableApplicationContext applicationContext = + ApplicationContextSingleton.getApplicationContext(); + DefaultEngine defaultEngine = applicationContext.getBean(DefaultEngine.class); + MainWindow mainWindow = applicationContext.getBean(MainWindow.class); + LoginWindow loginWindow = applicationContext.getBean(LoginWindow.class); + assertNotNull(defaultEngine); + assertNotNull(mainWindow); + assertNotNull(loginWindow); + } } diff --git a/src/test/java/com/josdem/jmetadata/helper/TestArtworkHelper.java b/src/test/java/com/josdem/jmetadata/helper/TestArtworkHelper.java index e330f63..fb53143 100644 --- a/src/test/java/com/josdem/jmetadata/helper/TestArtworkHelper.java +++ b/src/test/java/com/josdem/jmetadata/helper/TestArtworkHelper.java @@ -16,6 +16,7 @@ package com.josdem.jmetadata.helper; +import static org.junit.jupiter.api.Assertions.assertNotNull; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -26,21 +27,18 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.ContextConfiguration; -import static org.junit.jupiter.api.Assertions.assertNotNull; - @Slf4j @SpringBootTest @ContextConfiguration(classes = {ApplicationContextSingleton.class, ArtworkHelper.class}) @RequiredArgsConstructor(onConstructor_ = @Autowired) class TestArtworkHelper { - private final ArtworkHelper artworkHelper; - - @Test - @DisplayName("creating an artwork") - public void shouldCreateAnArtWork(TestInfo testInfo) { - log.info(testInfo.getDisplayName()); - assertNotNull(artworkHelper.createArtwork(), "should create an artwork"); - } + private final ArtworkHelper artworkHelper; + @Test + @DisplayName("creating an artwork") + public void shouldCreateAnArtWork(TestInfo testInfo) { + log.info(testInfo.getDisplayName()); + assertNotNull(artworkHelper.createArtwork(), "should create an artwork"); + } } diff --git a/src/test/java/com/josdem/jmetadata/helper/TestAudioFileHelper.java b/src/test/java/com/josdem/jmetadata/helper/TestAudioFileHelper.java index 45606c6..3b140a4 100644 --- a/src/test/java/com/josdem/jmetadata/helper/TestAudioFileHelper.java +++ b/src/test/java/com/josdem/jmetadata/helper/TestAudioFileHelper.java @@ -16,7 +16,9 @@ package com.josdem.jmetadata.helper; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import java.io.File; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.DisplayName; @@ -26,25 +28,21 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.ContextConfiguration; -import java.io.File; - -import static org.junit.jupiter.api.Assertions.assertNotNull; - @Slf4j @SpringBootTest @ContextConfiguration(classes = {ApplicationContextSingleton.class, AudioFileHelper.class}) @RequiredArgsConstructor(onConstructor_ = @Autowired) class TestAudioFileHelper { - private final AudioFileHelper audioFileHelper; - - private final File pepeGarden = new File("src/test/resources/audio/Jaytech - Pepe Garden (Original Mix).mp3"); + private final AudioFileHelper audioFileHelper; - @Test - @DisplayName("reading audio file") - public void shouldRead(TestInfo testInfo) throws Exception { - log.info(testInfo.getDisplayName()); - assertNotNull(audioFileHelper.read(pepeGarden), "should read audio file"); - } + private final File pepeGarden = + new File("src/test/resources/audio/Jaytech - Pepe Garden (Original Mix).mp3"); + @Test + @DisplayName("reading audio file") + public void shouldRead(TestInfo testInfo) throws Exception { + log.info(testInfo.getDisplayName()); + assertNotNull(audioFileHelper.read(pepeGarden), "should read audio file"); + } } diff --git a/src/test/java/com/josdem/jmetadata/helper/TestExporterHelper.java b/src/test/java/com/josdem/jmetadata/helper/TestExporterHelper.java index 5c8361f..8560361 100644 --- a/src/test/java/com/josdem/jmetadata/helper/TestExporterHelper.java +++ b/src/test/java/com/josdem/jmetadata/helper/TestExporterHelper.java @@ -16,6 +16,8 @@ package com.josdem.jmetadata.helper; +import static org.mockito.Mockito.verify; + import com.josdem.jmetadata.model.ExportPackage; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -23,30 +25,22 @@ import org.mockito.Mock; import org.mockito.MockitoAnnotations; -import static org.mockito.Mockito.verify; - public class TestExporterHelper { - @InjectMocks - private ExporterHelper exporterHelper = new ExporterHelper(); - - @Mock - private ImageExporter imageExporter; - @Mock - private MetadataExporter metadataExporter; - @Mock - private ExportPackage exportPackage; - - - @BeforeEach - public void setup() throws Exception { - MockitoAnnotations.initMocks(this); - } - - @Test - public void shouldExportImage() throws Exception { - exporterHelper.export(exportPackage); - verify(imageExporter).export(exportPackage); - verify(metadataExporter).export(exportPackage); - } - + @InjectMocks private ExporterHelper exporterHelper = new ExporterHelper(); + + @Mock private ImageExporter imageExporter; + @Mock private MetadataExporter metadataExporter; + @Mock private ExportPackage exportPackage; + + @BeforeEach + public void setup() throws Exception { + MockitoAnnotations.initMocks(this); + } + + @Test + public void shouldExportImage() throws Exception { + exporterHelper.export(exportPackage); + verify(imageExporter).export(exportPackage); + verify(metadataExporter).export(exportPackage); + } } diff --git a/src/test/java/com/josdem/jmetadata/helper/TestFormatterHelper.java b/src/test/java/com/josdem/jmetadata/helper/TestFormatterHelper.java index 0efa256..2d6922c 100644 --- a/src/test/java/com/josdem/jmetadata/helper/TestFormatterHelper.java +++ b/src/test/java/com/josdem/jmetadata/helper/TestFormatterHelper.java @@ -16,6 +16,7 @@ package com.josdem.jmetadata.helper; +import static org.junit.jupiter.api.Assertions.assertEquals; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -26,23 +27,20 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.ContextConfiguration; -import static org.junit.jupiter.api.Assertions.assertEquals; - @Slf4j @SpringBootTest @ContextConfiguration(classes = {ApplicationContextSingleton.class, FormatterHelper.class}) @RequiredArgsConstructor(onConstructor_ = @Autowired) class TestFormatterHelper { - private final FormatterHelper helper; - - @Test - @DisplayName("should format for comparison") - public void shouldFormatForComparison(TestInfo testInfo) { - log.info(testInfo.getDisplayName()); - var word = "de - pazz"; - var expectedWord = "depazz"; - assertEquals(expectedWord, helper.getBasicFormat(word)); - } + private final FormatterHelper helper; + @Test + @DisplayName("should format for comparison") + public void shouldFormatForComparison(TestInfo testInfo) { + log.info(testInfo.getDisplayName()); + var word = "de - pazz"; + var expectedWord = "depazz"; + assertEquals(expectedWord, helper.getBasicFormat(word)); + } } diff --git a/src/test/java/com/josdem/jmetadata/helper/TestImageExporter.java b/src/test/java/com/josdem/jmetadata/helper/TestImageExporter.java index 01dcd07..4a0f5f4 100644 --- a/src/test/java/com/josdem/jmetadata/helper/TestImageExporter.java +++ b/src/test/java/com/josdem/jmetadata/helper/TestImageExporter.java @@ -16,95 +16,90 @@ package com.josdem.jmetadata.helper; -import org.apache.commons.lang3.StringUtils; +import static org.mockito.Mockito.*; + import com.josdem.jmetadata.model.ExportPackage; import com.josdem.jmetadata.model.Metadata; import com.josdem.jmetadata.service.MetadataService; import com.josdem.jmetadata.util.ImageUtils; +import java.awt.*; +import java.io.File; +import java.util.ArrayList; +import java.util.List; +import org.apache.commons.lang3.StringUtils; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.MockitoAnnotations; -import java.awt.*; -import java.io.File; -import java.util.ArrayList; -import java.util.List; - -import static org.mockito.Mockito.*; - public class TestImageExporter { - @InjectMocks - private ImageExporter imageExporter = new ImageExporter(); - - @Mock - private ImageUtils imageUtils; - @Mock - private Metadata metadata; - @Mock - private Image coverArt; - @Mock - private MetadataService metadataService; - - private String album = "Bliksem"; - private String artist = "Sander van Doorn"; - private String title = "Bliksem"; - - private List metadatas = new ArrayList(); - private ExportPackage exportPackage; - @Mock - private File root; - - @BeforeEach - public void setup() throws Exception { - MockitoAnnotations.initMocks(this); - when(metadata.getAlbum()).thenReturn(album); - when(metadata.getArtist()).thenReturn(artist); - when(metadata.getTitle()).thenReturn(title); - metadatas.add(metadata); - exportPackage = new ExportPackage(root, metadatas); - } - - @Test - public void shouldExportASingleImage() throws Exception { - when(metadata.getCoverArt()).thenReturn(coverArt); - when(metadataService.isSameAlbum(metadatas)).thenReturn(true); - imageExporter.export(exportPackage); - verify(imageUtils).saveCoverArtToFile(metadatas.get(0).getCoverArt(), root, StringUtils.EMPTY); - } - - @Test - public void shouldExportASingleImageWhenSameAlbum() throws Exception { - when(metadata.getCoverArt()).thenReturn(coverArt); - when(metadataService.isSameAlbum(metadatas)).thenReturn(true); - metadatas.add(metadata); - imageExporter.export(exportPackage); - verify(imageUtils).saveCoverArtToFile(metadatas.get(0).getCoverArt(), root, StringUtils.EMPTY); - } - - @Test - public void shouldExportTwoImagesWhenDifAlbum() throws Exception { - when(metadata.getCoverArt()).thenReturn(coverArt); - Metadata metadata = setSecondMetadataExpectations(); - metadatas.add(metadata); - imageExporter.export(exportPackage); - verify(imageUtils).saveCoverArtToFile(coverArt, root, "Sander van Doorn" + "-" + "Bliksem"); - verify(imageUtils).saveCoverArtToFile(coverArt, root, "ATA" + "-" + "Blue Skies (Andy Tau Remix)"); - } - - private Metadata setSecondMetadataExpectations() { - Metadata metadata = mock(Metadata.class); - when(metadata.getAlbum()).thenReturn("Blue Skies"); - when(metadata.getArtist()).thenReturn("ATA"); - when(metadata.getTitle()).thenReturn("Blue Skies (Andy Tau Remix)"); - when(metadata.getCoverArt()).thenReturn(coverArt); - return metadata; - } - - @Test - public void shouldNotExportIfNoImage() throws Exception { - imageExporter.export(exportPackage); - verify(imageUtils, never()).saveCoverArtToFile(metadatas.get(0).getCoverArt(), root, StringUtils.EMPTY); - } + @InjectMocks private ImageExporter imageExporter = new ImageExporter(); + + @Mock private ImageUtils imageUtils; + @Mock private Metadata metadata; + @Mock private Image coverArt; + @Mock private MetadataService metadataService; + + private String album = "Bliksem"; + private String artist = "Sander van Doorn"; + private String title = "Bliksem"; + + private List metadatas = new ArrayList(); + private ExportPackage exportPackage; + @Mock private File root; + + @BeforeEach + public void setup() throws Exception { + MockitoAnnotations.initMocks(this); + when(metadata.getAlbum()).thenReturn(album); + when(metadata.getArtist()).thenReturn(artist); + when(metadata.getTitle()).thenReturn(title); + metadatas.add(metadata); + exportPackage = new ExportPackage(root, metadatas); + } + + @Test + public void shouldExportASingleImage() throws Exception { + when(metadata.getCoverArt()).thenReturn(coverArt); + when(metadataService.isSameAlbum(metadatas)).thenReturn(true); + imageExporter.export(exportPackage); + verify(imageUtils).saveCoverArtToFile(metadatas.get(0).getCoverArt(), root, StringUtils.EMPTY); + } + + @Test + public void shouldExportASingleImageWhenSameAlbum() throws Exception { + when(metadata.getCoverArt()).thenReturn(coverArt); + when(metadataService.isSameAlbum(metadatas)).thenReturn(true); + metadatas.add(metadata); + imageExporter.export(exportPackage); + verify(imageUtils).saveCoverArtToFile(metadatas.get(0).getCoverArt(), root, StringUtils.EMPTY); + } + + @Test + public void shouldExportTwoImagesWhenDifAlbum() throws Exception { + when(metadata.getCoverArt()).thenReturn(coverArt); + Metadata metadata = setSecondMetadataExpectations(); + metadatas.add(metadata); + imageExporter.export(exportPackage); + verify(imageUtils).saveCoverArtToFile(coverArt, root, "Sander van Doorn" + "-" + "Bliksem"); + verify(imageUtils) + .saveCoverArtToFile(coverArt, root, "ATA" + "-" + "Blue Skies (Andy Tau Remix)"); + } + + private Metadata setSecondMetadataExpectations() { + Metadata metadata = mock(Metadata.class); + when(metadata.getAlbum()).thenReturn("Blue Skies"); + when(metadata.getArtist()).thenReturn("ATA"); + when(metadata.getTitle()).thenReturn("Blue Skies (Andy Tau Remix)"); + when(metadata.getCoverArt()).thenReturn(coverArt); + return metadata; + } + + @Test + public void shouldNotExportIfNoImage() throws Exception { + imageExporter.export(exportPackage); + verify(imageUtils, never()) + .saveCoverArtToFile(metadatas.get(0).getCoverArt(), root, StringUtils.EMPTY); + } } diff --git a/src/test/java/com/josdem/jmetadata/helper/TestImageHelper.java b/src/test/java/com/josdem/jmetadata/helper/TestImageHelper.java index 42bb647..5e44819 100644 --- a/src/test/java/com/josdem/jmetadata/helper/TestImageHelper.java +++ b/src/test/java/com/josdem/jmetadata/helper/TestImageHelper.java @@ -16,10 +16,12 @@ package com.josdem.jmetadata.helper; +import static org.junit.jupiter.api.Assertions.assertTrue; import com.josdem.jmetadata.ApplicationConstants; import com.josdem.jmetadata.service.ImageService; import com.josdem.jmetadata.service.impl.ImageServiceImpl; +import java.io.File; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.DisplayName; @@ -29,24 +31,20 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.ContextConfiguration; -import java.io.File; - -import static org.junit.jupiter.api.Assertions.assertTrue; - @Slf4j @SpringBootTest @ContextConfiguration(classes = {ApplicationContextSingleton.class, ImageServiceImpl.class}) @RequiredArgsConstructor(onConstructor_ = @Autowired) class TestImageHelper { - private final ImageService imageService; + private final ImageService imageService; - @Test - @DisplayName("creating a temp file for cover art") - public void shouldCreateTempFile(TestInfo testInfo) throws Exception { - log.info(testInfo.getDisplayName()); - File tempFile = imageService.createTempFile(); - assertTrue(tempFile.getName().contains(ApplicationConstants.PREFIX)); - assertTrue(tempFile.getName().contains(ApplicationConstants.IMAGE_EXT)); - } + @Test + @DisplayName("creating a temp file for cover art") + public void shouldCreateTempFile(TestInfo testInfo) throws Exception { + log.info(testInfo.getDisplayName()); + File tempFile = imageService.createTempFile(); + assertTrue(tempFile.getName().contains(ApplicationConstants.PREFIX)); + assertTrue(tempFile.getName().contains(ApplicationConstants.IMAGE_EXT)); + } } diff --git a/src/test/java/com/josdem/jmetadata/helper/TestLastFMAlbumHelper.java b/src/test/java/com/josdem/jmetadata/helper/TestLastFMAlbumHelper.java index 3db3b7b..e1b4b7a 100644 --- a/src/test/java/com/josdem/jmetadata/helper/TestLastFMAlbumHelper.java +++ b/src/test/java/com/josdem/jmetadata/helper/TestLastFMAlbumHelper.java @@ -16,68 +16,65 @@ package com.josdem.jmetadata.helper; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.Mockito.when; + import de.umass.lastfm.Album; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Date; import org.apache.commons.lang3.StringUtils; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.mockito.Mock; import org.mockito.MockitoAnnotations; -import java.text.SimpleDateFormat; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Date; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.mockito.Mockito.when; - - public class TestLastFMAlbumHelper { - private final LastFMAlbumHelper lastFMAlbumHelper = new LastFMAlbumHelper(); - - private Date releaseDate = new Date(); - @Mock - private Album album; - - @BeforeEach - public void setup() throws Exception { - MockitoAnnotations.initMocks(this); - } - - @Test - public void shouldGetYear() throws Exception { - SimpleDateFormat simpleDateformat = new SimpleDateFormat("yyyy"); - String currentYear = simpleDateformat.format(releaseDate); - String year = lastFMAlbumHelper.getYear(releaseDate); - assertEquals(currentYear, year); - } - - @Test - public void shouldGetEmptyYear() throws Exception { - assertEquals(StringUtils.EMPTY, lastFMAlbumHelper.getYear(null)); - } - - @Test - public void shouldMatchAGenre() throws Exception { - Collection tags = new ArrayList(); - String tag = "House"; - tags.add(tag); - - when(album.getTags()).thenReturn(tags); - - String result = lastFMAlbumHelper.getGenre(album); - assertEquals(tag, result); - } - - @Test - public void shouldNotMatchAGenre() throws Exception { - Collection tags = new ArrayList(); - String tag = "usa"; - tags.add(tag); - - when(album.getTags()).thenReturn(tags); - - String result = lastFMAlbumHelper.getGenre(album); - assertEquals(StringUtils.EMPTY, result); - } + private final LastFMAlbumHelper lastFMAlbumHelper = new LastFMAlbumHelper(); + + private Date releaseDate = new Date(); + @Mock private Album album; + + @BeforeEach + public void setup() throws Exception { + MockitoAnnotations.initMocks(this); + } + + @Test + public void shouldGetYear() throws Exception { + SimpleDateFormat simpleDateformat = new SimpleDateFormat("yyyy"); + String currentYear = simpleDateformat.format(releaseDate); + String year = lastFMAlbumHelper.getYear(releaseDate); + assertEquals(currentYear, year); + } + + @Test + public void shouldGetEmptyYear() throws Exception { + assertEquals(StringUtils.EMPTY, lastFMAlbumHelper.getYear(null)); + } + + @Test + public void shouldMatchAGenre() throws Exception { + Collection tags = new ArrayList(); + String tag = "House"; + tags.add(tag); + + when(album.getTags()).thenReturn(tags); + + String result = lastFMAlbumHelper.getGenre(album); + assertEquals(tag, result); + } + + @Test + public void shouldNotMatchAGenre() throws Exception { + Collection tags = new ArrayList(); + String tag = "usa"; + tags.add(tag); + + when(album.getTags()).thenReturn(tags); + + String result = lastFMAlbumHelper.getGenre(album); + assertEquals(StringUtils.EMPTY, result); + } } diff --git a/src/test/java/com/josdem/jmetadata/helper/TestLastFMAuthenticator.java b/src/test/java/com/josdem/jmetadata/helper/TestLastFMAuthenticator.java index 1d2be6d..95758c7 100644 --- a/src/test/java/com/josdem/jmetadata/helper/TestLastFMAuthenticator.java +++ b/src/test/java/com/josdem/jmetadata/helper/TestLastFMAuthenticator.java @@ -16,6 +16,10 @@ package com.josdem.jmetadata.helper; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.mockito.Mockito.when; + import de.umass.lastfm.Session; import org.apache.commons.lang3.StringUtils; import org.junit.jupiter.api.BeforeEach; @@ -24,66 +28,59 @@ import org.mockito.Mock; import org.mockito.MockitoAnnotations; -import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.junit.jupiter.api.Assertions.assertNull; -import static org.mockito.Mockito.when; - class TestLastFMAuthenticator { - @InjectMocks - private final LastFMAuthenticator lastFMAuthenticator = new LastFMAuthenticator(); + @InjectMocks private final LastFMAuthenticator lastFMAuthenticator = new LastFMAuthenticator(); - @Mock - private AuthenticatorHelper authenticatorHelper; - @Mock - private Session session; + @Mock private AuthenticatorHelper authenticatorHelper; + @Mock private Session session; - int result; + int result; - @BeforeEach - public void initialize() { - MockitoAnnotations.initMocks(this); - } + @BeforeEach + public void initialize() { + MockitoAnnotations.initMocks(this); + } - @Test - public void shouldLogin() throws Exception { - String username = "josdem"; - String password = "validPassword"; + @Test + public void shouldLogin() throws Exception { + String username = "josdem"; + String password = "validPassword"; - when(authenticatorHelper.getSession(username, password)).thenReturn(session); + when(authenticatorHelper.getSession(username, password)).thenReturn(session); - assertNotNull(lastFMAuthenticator.login(username, password)); - } + assertNotNull(lastFMAuthenticator.login(username, password)); + } - @Test - public void shouldFailAtLoginIfNoUsernameAndPassword() throws Exception { - String username = StringUtils.EMPTY; - String password = StringUtils.EMPTY; + @Test + public void shouldFailAtLoginIfNoUsernameAndPassword() throws Exception { + String username = StringUtils.EMPTY; + String password = StringUtils.EMPTY; - assertNull(lastFMAuthenticator.login(username, password)); - } + assertNull(lastFMAuthenticator.login(username, password)); + } - @Test - public void shouldFailAtLoginIfNoUsername() throws Exception { - String username = StringUtils.EMPTY; - String password = "somePassword"; + @Test + public void shouldFailAtLoginIfNoUsername() throws Exception { + String username = StringUtils.EMPTY; + String password = "somePassword"; - assertNull(lastFMAuthenticator.login(username, password)); - } + assertNull(lastFMAuthenticator.login(username, password)); + } - @Test - public void shouldFailAtLoginIfNoPassword() throws Exception { - String username = "someUsername"; - String password = StringUtils.EMPTY; + @Test + public void shouldFailAtLoginIfNoPassword() throws Exception { + String username = "someUsername"; + String password = StringUtils.EMPTY; - assertNull(lastFMAuthenticator.login(username, password)); - } + assertNull(lastFMAuthenticator.login(username, password)); + } - @Test - public void shouldFailAtLogin() throws Exception { - String username = "josdem"; - String password = "invalidPassword"; + @Test + public void shouldFailAtLogin() throws Exception { + String username = "josdem"; + String password = "invalidPassword"; - assertNull(lastFMAuthenticator.login(username, password)); - } + assertNull(lastFMAuthenticator.login(username, password)); + } } diff --git a/src/test/java/com/josdem/jmetadata/helper/TestMetadataAdapter.java b/src/test/java/com/josdem/jmetadata/helper/TestMetadataAdapter.java index 8c88766..e70f4a1 100644 --- a/src/test/java/com/josdem/jmetadata/helper/TestMetadataAdapter.java +++ b/src/test/java/com/josdem/jmetadata/helper/TestMetadataAdapter.java @@ -16,6 +16,8 @@ package com.josdem.jmetadata.helper; +import static org.mockito.Mockito.verify; + import com.josdem.jmetadata.ApplicationConstants; import com.josdem.jmetadata.model.Metadata; import org.junit.jupiter.api.BeforeEach; @@ -23,90 +25,86 @@ import org.mockito.Mock; import org.mockito.MockitoAnnotations; -import static org.mockito.Mockito.verify; - - public class TestMetadataAdapter { - private final MetadataAdapter adapter = new MetadataAdapter(); + private final MetadataAdapter adapter = new MetadataAdapter(); - @Mock - private Metadata metadata; - private final static String ARTIST = "Daniel Kandi"; - private final static String TITLE = "Make Me Believe"; - private final static String ALBUM = "Anjunabeats 5"; - private final static String TRACK_NUMBER = "5"; - private final static String TOTAL_TRACKS = "13"; - private final static String GENRE_COLUMN = "Minimal Techno"; - private final static String YEAR_COLUMN = "2001"; - private final static String CD_NUMBER = "1"; + @Mock private Metadata metadata; + private static final String ARTIST = "Daniel Kandi"; + private static final String TITLE = "Make Me Believe"; + private static final String ALBUM = "Anjunabeats 5"; + private static final String TRACK_NUMBER = "5"; + private static final String TOTAL_TRACKS = "13"; + private static final String GENRE_COLUMN = "Minimal Techno"; + private static final String YEAR_COLUMN = "2001"; + private static final String CD_NUMBER = "1"; - private static final String TOTAL_CDS_NUMBER = null; + private static final String TOTAL_CDS_NUMBER = null; - @BeforeEach - public void setup() throws Exception { - MockitoAnnotations.initMocks(this); - } + @BeforeEach + public void setup() throws Exception { + MockitoAnnotations.initMocks(this); + } - @Test - public void shouldUpdateArtist() throws Exception { - adapter.update(metadata, ApplicationConstants.ARTIST_COLUMN, ARTIST); + @Test + public void shouldUpdateArtist() throws Exception { + adapter.update(metadata, ApplicationConstants.ARTIST_COLUMN, ARTIST); - verify(metadata).setArtist(ARTIST); - } + verify(metadata).setArtist(ARTIST); + } - @Test - public void shouldUpdateTitle() throws Exception { - adapter.update(metadata, ApplicationConstants.TITLE_COLUMN, TITLE); + @Test + public void shouldUpdateTitle() throws Exception { + adapter.update(metadata, ApplicationConstants.TITLE_COLUMN, TITLE); - verify(metadata).setTitle(TITLE); - } + verify(metadata).setTitle(TITLE); + } - @Test - public void shouldUpdateAlbum() throws Exception { - adapter.update(metadata, ApplicationConstants.ALBUM_COLUMN, ALBUM); + @Test + public void shouldUpdateAlbum() throws Exception { + adapter.update(metadata, ApplicationConstants.ALBUM_COLUMN, ALBUM); - verify(metadata).setAlbum(ALBUM); - } + verify(metadata).setAlbum(ALBUM); + } - @Test - public void shouldUpdateTrackNumber() throws Exception { - adapter.update(metadata, ApplicationConstants.TRACK_NUMBER_COLUMN, TRACK_NUMBER); + @Test + public void shouldUpdateTrackNumber() throws Exception { + adapter.update(metadata, ApplicationConstants.TRACK_NUMBER_COLUMN, TRACK_NUMBER); - verify(metadata).setTrackNumber(TRACK_NUMBER); - } + verify(metadata).setTrackNumber(TRACK_NUMBER); + } - @Test - public void shouldUpdateTotalTracksNumber() throws Exception { - adapter.update(metadata, ApplicationConstants.TOTAL_TRACKS_NUMBER_COLUMN, TOTAL_TRACKS); + @Test + public void shouldUpdateTotalTracksNumber() throws Exception { + adapter.update(metadata, ApplicationConstants.TOTAL_TRACKS_NUMBER_COLUMN, TOTAL_TRACKS); - verify(metadata).setTotalTracks(TOTAL_TRACKS); - } + verify(metadata).setTotalTracks(TOTAL_TRACKS); + } - @Test - public void shouldUpdateGenre() throws Exception { - adapter.update(metadata, ApplicationConstants.GENRE_COLUMN, GENRE_COLUMN); + @Test + public void shouldUpdateGenre() throws Exception { + adapter.update(metadata, ApplicationConstants.GENRE_COLUMN, GENRE_COLUMN); - verify(metadata).setGenre(GENRE_COLUMN); - } + verify(metadata).setGenre(GENRE_COLUMN); + } - @Test - public void shouldUpdateYear() throws Exception { - adapter.update(metadata, ApplicationConstants.YEAR_COLUMN, YEAR_COLUMN); + @Test + public void shouldUpdateYear() throws Exception { + adapter.update(metadata, ApplicationConstants.YEAR_COLUMN, YEAR_COLUMN); - verify(metadata).setYear(YEAR_COLUMN); - } + verify(metadata).setYear(YEAR_COLUMN); + } - @Test - public void shouldUpdateCdNumber() throws Exception { - adapter.update(metadata, ApplicationConstants.CD_NUMBER_COLUMN, CD_NUMBER); + @Test + public void shouldUpdateCdNumber() throws Exception { + adapter.update(metadata, ApplicationConstants.CD_NUMBER_COLUMN, CD_NUMBER); - verify(metadata).setCdNumber(CD_NUMBER); - } + verify(metadata).setCdNumber(CD_NUMBER); + } - @Test - public void shouldUpdateTotalCds() throws Exception { - adapter.update(metadata, ApplicationConstants.TOTAL_CDS_NUMBER_COLUMN, TOTAL_CDS_NUMBER); + @Test + public void shouldUpdateTotalCds() throws Exception { + adapter.update(metadata, ApplicationConstants.TOTAL_CDS_NUMBER_COLUMN, TOTAL_CDS_NUMBER); - verify(metadata).setTotalCds(TOTAL_CDS_NUMBER); - } + verify(metadata).setTotalCds(TOTAL_CDS_NUMBER); + } } diff --git a/src/test/java/com/josdem/jmetadata/helper/TestMetadataExporter.java b/src/test/java/com/josdem/jmetadata/helper/TestMetadataExporter.java index 4ee435f..62a6a5e 100644 --- a/src/test/java/com/josdem/jmetadata/helper/TestMetadataExporter.java +++ b/src/test/java/com/josdem/jmetadata/helper/TestMetadataExporter.java @@ -16,95 +16,86 @@ package com.josdem.jmetadata.helper; -import org.apache.commons.lang3.StringUtils; +import static org.mockito.Mockito.*; + import com.josdem.jmetadata.ApplicationConstants; import com.josdem.jmetadata.model.ExportPackage; import com.josdem.jmetadata.model.Metadata; import com.josdem.jmetadata.service.FormatterService; import com.josdem.jmetadata.service.MetadataService; import com.josdem.jmetadata.util.FileUtils; +import java.io.File; +import java.io.OutputStream; +import java.util.ArrayList; +import java.util.List; +import org.apache.commons.lang3.StringUtils; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.MockitoAnnotations; -import java.io.File; -import java.io.OutputStream; -import java.util.ArrayList; -import java.util.List; - -import static org.mockito.Mockito.*; - class TestMetadataExporter { - private static final String NEW_LINE = "\n"; - private static final String DASH = " - "; - private static final String DOT = ". "; - private static final String PAR_OPEN = " ("; - private static final String PAR_CLOSE = ")"; - private static final String BY = " by "; - - @InjectMocks - private MetadataExporter metadataExporter = new MetadataExporter(); - - @Mock - private FileUtils fileUtils; - @Mock - private FormatterService formatter; - @Mock - private Metadata metadata; - @Mock - private File file; - @Mock - private OutStreamWriter outputStreamWriter; - @Mock - private OutputStream writer; - @Mock - private ExportPackage exportPackage; - @Mock - private MetadataService metadataService; - - int length = 397; - - private final List metadatas = new ArrayList<>(); - - @BeforeEach - public void setup() throws Exception { - MockitoAnnotations.initMocks(this); - String album = "Bliksem"; - when(metadata.getAlbum()).thenReturn(album); - String artist = "Sander van Doorn"; - when(metadata.getArtist()).thenReturn(artist); - String title = "Bliksem"; - when(metadata.getTitle()).thenReturn(title); - when(metadata.getLength()).thenReturn(length); - String lenghtFormated = "6:37"; - when(formatter.getDuration(metadata.getLength())).thenReturn(lenghtFormated); - metadatas.add(metadata); - when(exportPackage.getRoot()).thenReturn(file); - when(exportPackage.getMetadataList()).thenReturn(metadatas); - when(fileUtils.createFile(file, StringUtils.EMPTY, ApplicationConstants.FILE_EXT)).thenReturn(file); - when(outputStreamWriter.getWriter(file)).thenReturn(writer); - } - - @Test - public void shouldExport() throws Exception { - when(metadataService.isSameAlbum(metadatas)).thenReturn(true); - - metadataExporter.export(exportPackage); - - verify(writer, times(2)).write(metadata.getAlbum().getBytes()); - verify(writer).write(BY.getBytes()); - verify(writer, times(2)).write(metadata.getArtist().getBytes()); - verify(writer, times(3)).write(NEW_LINE.getBytes()); - - verify(metadataService).isSameAlbum(metadatas); - verify(writer).write(Integer.toString(1).getBytes()); - verify(writer).write(DOT.getBytes()); - verify(writer).write(DASH.getBytes()); - verify(writer, times(2)).write(metadata.getTitle().getBytes()); - verify(writer).write(PAR_OPEN.getBytes()); - verify(writer).write(formatter.getDuration(metadata.getLength()).getBytes()); - verify(writer).write(PAR_CLOSE.getBytes()); - } + private static final String NEW_LINE = "\n"; + private static final String DASH = " - "; + private static final String DOT = ". "; + private static final String PAR_OPEN = " ("; + private static final String PAR_CLOSE = ")"; + private static final String BY = " by "; + + @InjectMocks private MetadataExporter metadataExporter = new MetadataExporter(); + + @Mock private FileUtils fileUtils; + @Mock private FormatterService formatter; + @Mock private Metadata metadata; + @Mock private File file; + @Mock private OutStreamWriter outputStreamWriter; + @Mock private OutputStream writer; + @Mock private ExportPackage exportPackage; + @Mock private MetadataService metadataService; + + int length = 397; + + private final List metadatas = new ArrayList<>(); + + @BeforeEach + public void setup() throws Exception { + MockitoAnnotations.initMocks(this); + String album = "Bliksem"; + when(metadata.getAlbum()).thenReturn(album); + String artist = "Sander van Doorn"; + when(metadata.getArtist()).thenReturn(artist); + String title = "Bliksem"; + when(metadata.getTitle()).thenReturn(title); + when(metadata.getLength()).thenReturn(length); + String lenghtFormated = "6:37"; + when(formatter.getDuration(metadata.getLength())).thenReturn(lenghtFormated); + metadatas.add(metadata); + when(exportPackage.getRoot()).thenReturn(file); + when(exportPackage.getMetadataList()).thenReturn(metadatas); + when(fileUtils.createFile(file, StringUtils.EMPTY, ApplicationConstants.FILE_EXT)) + .thenReturn(file); + when(outputStreamWriter.getWriter(file)).thenReturn(writer); + } + + @Test + public void shouldExport() throws Exception { + when(metadataService.isSameAlbum(metadatas)).thenReturn(true); + + metadataExporter.export(exportPackage); + + verify(writer, times(2)).write(metadata.getAlbum().getBytes()); + verify(writer).write(BY.getBytes()); + verify(writer, times(2)).write(metadata.getArtist().getBytes()); + verify(writer, times(3)).write(NEW_LINE.getBytes()); + + verify(metadataService).isSameAlbum(metadatas); + verify(writer).write(Integer.toString(1).getBytes()); + verify(writer).write(DOT.getBytes()); + verify(writer).write(DASH.getBytes()); + verify(writer, times(2)).write(metadata.getTitle().getBytes()); + verify(writer).write(PAR_OPEN.getBytes()); + verify(writer).write(formatter.getDuration(metadata.getLength()).getBytes()); + verify(writer).write(PAR_CLOSE.getBytes()); + } } diff --git a/src/test/java/com/josdem/jmetadata/helper/TestMetadataHelper.java b/src/test/java/com/josdem/jmetadata/helper/TestMetadataHelper.java index 6d0f3e1..2db8f05 100644 --- a/src/test/java/com/josdem/jmetadata/helper/TestMetadataHelper.java +++ b/src/test/java/com/josdem/jmetadata/helper/TestMetadataHelper.java @@ -16,6 +16,7 @@ package com.josdem.jmetadata.helper; +import static org.junit.jupiter.api.Assertions.assertNotNull; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -26,22 +27,18 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.ContextConfiguration; -import static org.junit.jupiter.api.Assertions.assertNotNull; - - @Slf4j @SpringBootTest @ContextConfiguration(classes = {ApplicationContextSingleton.class, MetadataHelper.class}) @RequiredArgsConstructor(onConstructor_ = @Autowired) class TestMetadataHelper { - private final MetadataHelper metadataHelper; - - @Test - @DisplayName("creating a hashset") - public void shouldCreateAHashset(TestInfo testInfo) { - log.info(testInfo.getDisplayName()); - assertNotNull(metadataHelper.createHashSet(), "should create a hashset"); - } + private final MetadataHelper metadataHelper; + @Test + @DisplayName("creating a hashset") + public void shouldCreateAHashset(TestInfo testInfo) { + log.info(testInfo.getDisplayName()); + assertNotNull(metadataHelper.createHashSet(), "should create a hashset"); + } } diff --git a/src/test/java/com/josdem/jmetadata/helper/TestReaderHelper.java b/src/test/java/com/josdem/jmetadata/helper/TestReaderHelper.java index dc1ed22..48b0a38 100644 --- a/src/test/java/com/josdem/jmetadata/helper/TestReaderHelper.java +++ b/src/test/java/com/josdem/jmetadata/helper/TestReaderHelper.java @@ -16,6 +16,9 @@ package com.josdem.jmetadata.helper; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.Mockito.when; + import org.jaudiotagger.tag.FieldKey; import org.jaudiotagger.tag.Tag; import org.junit.jupiter.api.BeforeEach; @@ -24,41 +27,36 @@ import org.mockito.Mock; import org.mockito.MockitoAnnotations; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.mockito.Mockito.when; - public class TestReaderHelper { - @InjectMocks - private ReaderHelper readerHelper = new ReaderHelper(); - - @Mock - private Tag tag; - - @BeforeEach - public void setup() throws Exception { - MockitoAnnotations.initMocks(this); - } - - @Test - public void shouldGetGenre() throws Exception { - String genre = "Minimal Techno"; - when(tag.getFirst(FieldKey.GENRE)).thenReturn(genre); - assertEquals(genre, readerHelper.getGenre(tag, genre)); - } - - @Test - public void shouldGetGenreByCodeWithParentheses() throws Exception { - String genreAsCode = "(18)"; - String genre = "Techno"; - when(tag.getFirst(FieldKey.GENRE)).thenReturn(genreAsCode); - assertEquals(genre, readerHelper.getGenre(tag, genreAsCode)); - } - - @Test - public void shouldKnowWhenMp3IsNotANumberInsideParenthesis() throws Exception { - String genre = "(None)"; - when(tag.getFirst(FieldKey.GENRE)).thenReturn(genre); - assertEquals(genre, readerHelper.getGenre(tag, genre)); - } + @InjectMocks private ReaderHelper readerHelper = new ReaderHelper(); + + @Mock private Tag tag; + + @BeforeEach + public void setup() throws Exception { + MockitoAnnotations.initMocks(this); + } + + @Test + public void shouldGetGenre() throws Exception { + String genre = "Minimal Techno"; + when(tag.getFirst(FieldKey.GENRE)).thenReturn(genre); + assertEquals(genre, readerHelper.getGenre(tag, genre)); + } + + @Test + public void shouldGetGenreByCodeWithParentheses() throws Exception { + String genreAsCode = "(18)"; + String genre = "Techno"; + when(tag.getFirst(FieldKey.GENRE)).thenReturn(genreAsCode); + assertEquals(genre, readerHelper.getGenre(tag, genreAsCode)); + } + + @Test + public void shouldKnowWhenMp3IsNotANumberInsideParenthesis() throws Exception { + String genre = "(None)"; + when(tag.getFirst(FieldKey.GENRE)).thenReturn(genre); + assertEquals(genre, readerHelper.getGenre(tag, genre)); + } } diff --git a/src/test/java/com/josdem/jmetadata/helper/TestScrobblerHelper.java b/src/test/java/com/josdem/jmetadata/helper/TestScrobblerHelper.java index db6707d..d639036 100644 --- a/src/test/java/com/josdem/jmetadata/helper/TestScrobblerHelper.java +++ b/src/test/java/com/josdem/jmetadata/helper/TestScrobblerHelper.java @@ -16,143 +16,143 @@ package com.josdem.jmetadata.helper; -import de.umass.lastfm.Session; -import de.umass.lastfm.scrobble.ScrobbleResult; -import org.apache.commons.lang3.StringUtils; -import org.asmatron.messengine.ControlEngine; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.Matchers.isA; +import static org.mockito.Mockito.*; + import com.josdem.jmetadata.action.ActionResult; import com.josdem.jmetadata.model.Metadata; import com.josdem.jmetadata.model.Model; import com.josdem.jmetadata.model.User; +import de.umass.lastfm.Session; +import de.umass.lastfm.scrobble.ScrobbleResult; +import java.util.Map; +import org.apache.commons.lang3.StringUtils; +import org.asmatron.messengine.ControlEngine; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.MockitoAnnotations; -import java.util.Map; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.mockito.Matchers.isA; -import static org.mockito.Mockito.*; - /** * @author josdem (joseluis.delacruz@gmail.com) */ - public class TestScrobblerHelper { - private static final String TRACK_NUMBER = "1"; - - @InjectMocks - private ScrobblerHelper helperScrobbler = new ScrobblerHelper(); - - @Mock - private Metadata metadata; - @Mock - private Map metadataMap; - @Mock - private ControlEngine controlEngine; - @Mock - private User currentUser; - @Mock - private LastFMTrackHelper lastFMTrackHelper; - @Mock - private Session session; - - private ActionResult result; - private String username = "josdem"; - private String password = "password"; - - @BeforeEach - public void setup() { - MockitoAnnotations.initMocks(this); - when(currentUser.getUsername()).thenReturn(username); - when(currentUser.getPassword()).thenReturn(password); - when(controlEngine.get(Model.CURRENT_USER)).thenReturn(currentUser); - helperScrobbler.setControlEngine(controlEngine); - } - - @Test - public void shouldNotAddAScrobblingifTrackSmallerThan240() throws Exception { - setExpectations(); - when(metadata.getArtist()).thenReturn("Above & Beyond"); - when(metadata.getTitle()).thenReturn("Anjunabeach"); - - result = helperScrobbler.send(metadata); - - notSendToScrobblingMapAssertion(); - } - - @Test - public void shouldNotAddAScrobblingIfNoArtist() throws Exception { - setExpectations(); - when(metadata.getArtist()).thenReturn(StringUtils.EMPTY); - when(metadata.getTitle()).thenReturn("Anjunabeach"); - - result = helperScrobbler.send(metadata); - - notSendToScrobblingMapAssertion(); - } - - private void notSendToScrobblingMapAssertion() { - verify(metadataMap, never()).size(); - verify(metadataMap, never()).put(isA(Metadata.class), isA(Long.class)); - assertEquals(ActionResult.Not_Scrobbleable, result); - } - - @Test - public void shouldNotAddAScrobblingIfNoTitle() throws Exception { - setExpectations(); - when(metadata.getArtist()).thenReturn("Above & Beyond"); - when(metadata.getTitle()).thenReturn(StringUtils.EMPTY); - - result = helperScrobbler.send(metadata); - notSendToScrobblingMapAssertion(); - } - - @Test - public void shouldFailWhenSubmitScrobbler() throws Exception { - ScrobbleResult result = mock(ScrobbleResult.class); - when(metadataMap.get(metadata)).thenReturn(100L); - setExpectations(); - setMetadataTrackExpectations(); - when(result.isSuccessful()).thenReturn(false); - when(lastFMTrackHelper.scrobble(metadata.getArtist(), metadata.getTitle(), metadataMap.get(metadata).intValue(), currentUser.getSession())).thenReturn(result); - - assertEquals(ActionResult.Sessionless, helperScrobbler.send(metadata)); - } - - private void setMetadataTrackExpectations() { - when(metadata.getLength()).thenReturn(300); - when(metadata.getArtist()).thenReturn("Above & Beyond"); - when(metadata.getTitle()).thenReturn("Anjunabeach"); - } - - @Test - public void shouldSendAnScrobbler() throws Exception { - ScrobbleResult result = mock(ScrobbleResult.class); - when(metadataMap.get(metadata)).thenReturn(100L); - when(currentUser.getSession()).thenReturn(session); - setExpectations(); - setMetadataTrackExpectations(); - when(result.isSuccessful()).thenReturn(true); - when(lastFMTrackHelper.scrobble(metadata.getArtist(), metadata.getTitle(), metadataMap.get(metadata).intValue(), currentUser.getSession())).thenReturn(result); - - assertEquals(ActionResult.Sent, helperScrobbler.send(metadata)); - } - - private void setExpectations() { - when(metadata.getAlbum()).thenReturn(StringUtils.EMPTY); - when(metadata.getLength()).thenReturn(1); - when(metadata.getTrackNumber()).thenReturn(TRACK_NUMBER); - } - - @Test - public void shouldReturnIfNoLogin() throws Exception { - setMetadataTrackExpectations(); - when(currentUser.getUsername()).thenReturn(StringUtils.EMPTY); - - assertEquals(ActionResult.NotLogged, helperScrobbler.send(metadata)); - } - + private static final String TRACK_NUMBER = "1"; + + @InjectMocks private ScrobblerHelper helperScrobbler = new ScrobblerHelper(); + + @Mock private Metadata metadata; + @Mock private Map metadataMap; + @Mock private ControlEngine controlEngine; + @Mock private User currentUser; + @Mock private LastFMTrackHelper lastFMTrackHelper; + @Mock private Session session; + + private ActionResult result; + private String username = "josdem"; + private String password = "password"; + + @BeforeEach + public void setup() { + MockitoAnnotations.initMocks(this); + when(currentUser.getUsername()).thenReturn(username); + when(currentUser.getPassword()).thenReturn(password); + when(controlEngine.get(Model.CURRENT_USER)).thenReturn(currentUser); + helperScrobbler.setControlEngine(controlEngine); + } + + @Test + public void shouldNotAddAScrobblingifTrackSmallerThan240() throws Exception { + setExpectations(); + when(metadata.getArtist()).thenReturn("Above & Beyond"); + when(metadata.getTitle()).thenReturn("Anjunabeach"); + + result = helperScrobbler.send(metadata); + + notSendToScrobblingMapAssertion(); + } + + @Test + public void shouldNotAddAScrobblingIfNoArtist() throws Exception { + setExpectations(); + when(metadata.getArtist()).thenReturn(StringUtils.EMPTY); + when(metadata.getTitle()).thenReturn("Anjunabeach"); + + result = helperScrobbler.send(metadata); + + notSendToScrobblingMapAssertion(); + } + + private void notSendToScrobblingMapAssertion() { + verify(metadataMap, never()).size(); + verify(metadataMap, never()).put(isA(Metadata.class), isA(Long.class)); + assertEquals(ActionResult.Not_Scrobbleable, result); + } + + @Test + public void shouldNotAddAScrobblingIfNoTitle() throws Exception { + setExpectations(); + when(metadata.getArtist()).thenReturn("Above & Beyond"); + when(metadata.getTitle()).thenReturn(StringUtils.EMPTY); + + result = helperScrobbler.send(metadata); + notSendToScrobblingMapAssertion(); + } + + @Test + public void shouldFailWhenSubmitScrobbler() throws Exception { + ScrobbleResult result = mock(ScrobbleResult.class); + when(metadataMap.get(metadata)).thenReturn(100L); + setExpectations(); + setMetadataTrackExpectations(); + when(result.isSuccessful()).thenReturn(false); + when(lastFMTrackHelper.scrobble( + metadata.getArtist(), + metadata.getTitle(), + metadataMap.get(metadata).intValue(), + currentUser.getSession())) + .thenReturn(result); + + assertEquals(ActionResult.Sessionless, helperScrobbler.send(metadata)); + } + + private void setMetadataTrackExpectations() { + when(metadata.getLength()).thenReturn(300); + when(metadata.getArtist()).thenReturn("Above & Beyond"); + when(metadata.getTitle()).thenReturn("Anjunabeach"); + } + + @Test + public void shouldSendAnScrobbler() throws Exception { + ScrobbleResult result = mock(ScrobbleResult.class); + when(metadataMap.get(metadata)).thenReturn(100L); + when(currentUser.getSession()).thenReturn(session); + setExpectations(); + setMetadataTrackExpectations(); + when(result.isSuccessful()).thenReturn(true); + when(lastFMTrackHelper.scrobble( + metadata.getArtist(), + metadata.getTitle(), + metadataMap.get(metadata).intValue(), + currentUser.getSession())) + .thenReturn(result); + + assertEquals(ActionResult.Sent, helperScrobbler.send(metadata)); + } + + private void setExpectations() { + when(metadata.getAlbum()).thenReturn(StringUtils.EMPTY); + when(metadata.getLength()).thenReturn(1); + when(metadata.getTrackNumber()).thenReturn(TRACK_NUMBER); + } + + @Test + public void shouldReturnIfNoLogin() throws Exception { + setMetadataTrackExpectations(); + when(currentUser.getUsername()).thenReturn(StringUtils.EMPTY); + + assertEquals(ActionResult.NotLogged, helperScrobbler.send(metadata)); + } } diff --git a/src/test/java/com/josdem/jmetadata/metadata/TestMetadataWriter.java b/src/test/java/com/josdem/jmetadata/metadata/TestMetadataWriter.java index 4cb1afb..f5dc130 100644 --- a/src/test/java/com/josdem/jmetadata/metadata/TestMetadataWriter.java +++ b/src/test/java/com/josdem/jmetadata/metadata/TestMetadataWriter.java @@ -16,10 +16,18 @@ package com.josdem.jmetadata.metadata; -import org.apache.commons.lang3.StringUtils; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.mockito.Matchers.isA; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + import com.josdem.jmetadata.helper.ArtworkHelper; import com.josdem.jmetadata.helper.AudioFileHelper; import com.josdem.jmetadata.util.ImageUtils; +import java.awt.*; +import java.io.File; +import org.apache.commons.lang3.StringUtils; import org.jaudiotagger.audio.AudioFile; import org.jaudiotagger.tag.FieldKey; import org.jaudiotagger.tag.Tag; @@ -30,187 +38,168 @@ import org.mockito.Mock; import org.mockito.MockitoAnnotations; -import java.awt.*; -import java.io.File; - -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertTrue; -import static org.mockito.Matchers.isA; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; - /** * @author josdem (joseluis.delacruz@gmail.com) */ - public class TestMetadataWriter { - @InjectMocks - private final MetadataWriter metadataWriter = new MetadataWriter(); - - @Mock - private AudioFile audioFile; - @Mock - private Tag tag; - @Mock - private File file; - @Mock - private AudioFileHelper audioFileHelper; - @Mock - private Image image; - @Mock - private ImageUtils imageUtils; - @Mock - private ArtworkHelper artworkHelper; - @Mock - private Artwork artwork; - - @BeforeEach - public void initialize() { - MockitoAnnotations.initMocks(this); - when(audioFile.getTag()).thenReturn(tag); - } - - @Test - public void shouldSetFile() throws Exception { - when(audioFileHelper.read(file)).thenReturn(audioFile); - metadataWriter.setFile(file); - - verify(audioFile).getTag(); - } - - @Test - public void shouldWriteArtist() throws Exception { - String artist = "Markus Schulz"; - metadataWriter.writeArtist(artist); - - verify(tag).setField(FieldKey.ARTIST, artist); - verify(audioFile).commit(); - } - - @Test - public void shouldWriteTrackName() throws Exception { - String trackName = "Nowhere"; - metadataWriter.writeTitle(trackName); - - verify(tag).setField(FieldKey.TITLE, trackName); - verify(audioFile).commit(); - } - - @Test - public void shouldWriteAlbum() throws Exception { - String album = "Sahara Nights"; - metadataWriter.writeAlbum(album); - - verify(tag).setField(FieldKey.ALBUM, album); - verify(audioFile).commit(); - } - - @Test - public void shouldWriteTrackNumber() throws Exception { - String trackNumber = "1"; - - metadataWriter.writeTrackNumber(trackNumber); - verify(tag).setField(FieldKey.TRACK, trackNumber); - verify(audioFile).commit(); - } - - @Test - public void shouldWriteTotalTracksNumber() throws Exception { - String totalTracksNumber = "10"; - - metadataWriter.writeTotalTracksNumber(totalTracksNumber); - verify(tag).setField(FieldKey.TRACK_TOTAL, totalTracksNumber); - verify(audioFile).commit(); - } - - @Test - public void shouldWriteCoverArt() throws Exception { - when(imageUtils.saveCoverArtToFile(image)).thenReturn(file); - when(artworkHelper.createArtwork()).thenReturn(artwork); - - metadataWriter.writeCoverArt(image); - - verify(imageUtils).saveCoverArtToFile(image); - verify(artwork).setFromFile(file); - verify(tag).setField(isA(Artwork.class)); - verify(audioFile).commit(); - } - - @Test - public void shouldWriteCdNumber() throws Exception { - String cdNumber = "1"; - - boolean result = metadataWriter.writeCdNumber(cdNumber); - - verify(tag).setField(FieldKey.DISC_NO, cdNumber); - verify(audioFile).commit(); - assertTrue(result); - } - - @Test - public void shouldWriteTotalCds() throws Exception { - String totalCds = "2"; - - boolean result = metadataWriter.writeTotalCds(totalCds); - - verify(tag).setField(FieldKey.DISC_TOTAL, totalCds); - verify(audioFile).commit(); - assertTrue(result); - } - - @Test - public void shouldNotWritetotalTracksNumberTrackNumberIfEmptyString() throws Exception { - assertFalse(metadataWriter.writeTrackNumber(StringUtils.EMPTY)); - } - - @Test - public void shouldNotWriteTotalTracksNumberIfEmptyString() throws Exception { - assertFalse(metadataWriter.writeTotalTracksNumber(StringUtils.EMPTY)); - } - - @Test - public void shouldNotWriteCdNumberIfEmptyString() throws Exception { - assertFalse(metadataWriter.writeCdNumber(StringUtils.EMPTY)); - } - - @Test - public void shouldNotWriteTotalCdsIfEmptyString() throws Exception { - assertFalse(metadataWriter.writeTotalCds(StringUtils.EMPTY)); - } - - @Test - public void shouldWriteYear() throws Exception { - String year = "1990"; - - metadataWriter.writeYear(year); - verify(tag).setField(FieldKey.YEAR, year); - verify(audioFile).commit(); - } - - @Test - public void shouldNotWriteYearIfEmptyString() throws Exception { - assertFalse(metadataWriter.writeYear(StringUtils.EMPTY)); - } - - @Test - public void shouldWriteGenre() throws Exception { - String genre = "Minimal Techno"; - - metadataWriter.writeGenre(genre); - verify(tag).setField(FieldKey.GENRE, genre); - verify(audioFile).commit(); - } - - @Test - public void shouldNotWriteGenreIfEmptyString() throws Exception { - assertFalse(metadataWriter.writeGenre(StringUtils.EMPTY)); - } - - @Test - public void shouldRemoveCoverArt() throws Exception { - assertTrue(metadataWriter.removeCoverArt()); - - verify(tag).deleteArtworkField(); - verify(audioFile).commit(); - } + @InjectMocks private final MetadataWriter metadataWriter = new MetadataWriter(); + + @Mock private AudioFile audioFile; + @Mock private Tag tag; + @Mock private File file; + @Mock private AudioFileHelper audioFileHelper; + @Mock private Image image; + @Mock private ImageUtils imageUtils; + @Mock private ArtworkHelper artworkHelper; + @Mock private Artwork artwork; + + @BeforeEach + public void initialize() { + MockitoAnnotations.initMocks(this); + when(audioFile.getTag()).thenReturn(tag); + } + + @Test + public void shouldSetFile() throws Exception { + when(audioFileHelper.read(file)).thenReturn(audioFile); + metadataWriter.setFile(file); + + verify(audioFile).getTag(); + } + + @Test + public void shouldWriteArtist() throws Exception { + String artist = "Markus Schulz"; + metadataWriter.writeArtist(artist); + + verify(tag).setField(FieldKey.ARTIST, artist); + verify(audioFile).commit(); + } + + @Test + public void shouldWriteTrackName() throws Exception { + String trackName = "Nowhere"; + metadataWriter.writeTitle(trackName); + + verify(tag).setField(FieldKey.TITLE, trackName); + verify(audioFile).commit(); + } + + @Test + public void shouldWriteAlbum() throws Exception { + String album = "Sahara Nights"; + metadataWriter.writeAlbum(album); + + verify(tag).setField(FieldKey.ALBUM, album); + verify(audioFile).commit(); + } + + @Test + public void shouldWriteTrackNumber() throws Exception { + String trackNumber = "1"; + + metadataWriter.writeTrackNumber(trackNumber); + verify(tag).setField(FieldKey.TRACK, trackNumber); + verify(audioFile).commit(); + } + + @Test + public void shouldWriteTotalTracksNumber() throws Exception { + String totalTracksNumber = "10"; + + metadataWriter.writeTotalTracksNumber(totalTracksNumber); + verify(tag).setField(FieldKey.TRACK_TOTAL, totalTracksNumber); + verify(audioFile).commit(); + } + + @Test + public void shouldWriteCoverArt() throws Exception { + when(imageUtils.saveCoverArtToFile(image)).thenReturn(file); + when(artworkHelper.createArtwork()).thenReturn(artwork); + + metadataWriter.writeCoverArt(image); + + verify(imageUtils).saveCoverArtToFile(image); + verify(artwork).setFromFile(file); + verify(tag).setField(isA(Artwork.class)); + verify(audioFile).commit(); + } + + @Test + public void shouldWriteCdNumber() throws Exception { + String cdNumber = "1"; + + boolean result = metadataWriter.writeCdNumber(cdNumber); + + verify(tag).setField(FieldKey.DISC_NO, cdNumber); + verify(audioFile).commit(); + assertTrue(result); + } + + @Test + public void shouldWriteTotalCds() throws Exception { + String totalCds = "2"; + + boolean result = metadataWriter.writeTotalCds(totalCds); + + verify(tag).setField(FieldKey.DISC_TOTAL, totalCds); + verify(audioFile).commit(); + assertTrue(result); + } + + @Test + public void shouldNotWritetotalTracksNumberTrackNumberIfEmptyString() throws Exception { + assertFalse(metadataWriter.writeTrackNumber(StringUtils.EMPTY)); + } + + @Test + public void shouldNotWriteTotalTracksNumberIfEmptyString() throws Exception { + assertFalse(metadataWriter.writeTotalTracksNumber(StringUtils.EMPTY)); + } + + @Test + public void shouldNotWriteCdNumberIfEmptyString() throws Exception { + assertFalse(metadataWriter.writeCdNumber(StringUtils.EMPTY)); + } + + @Test + public void shouldNotWriteTotalCdsIfEmptyString() throws Exception { + assertFalse(metadataWriter.writeTotalCds(StringUtils.EMPTY)); + } + + @Test + public void shouldWriteYear() throws Exception { + String year = "1990"; + + metadataWriter.writeYear(year); + verify(tag).setField(FieldKey.YEAR, year); + verify(audioFile).commit(); + } + + @Test + public void shouldNotWriteYearIfEmptyString() throws Exception { + assertFalse(metadataWriter.writeYear(StringUtils.EMPTY)); + } + + @Test + public void shouldWriteGenre() throws Exception { + String genre = "Minimal Techno"; + + metadataWriter.writeGenre(genre); + verify(tag).setField(FieldKey.GENRE, genre); + verify(audioFile).commit(); + } + + @Test + public void shouldNotWriteGenreIfEmptyString() throws Exception { + assertFalse(metadataWriter.writeGenre(StringUtils.EMPTY)); + } + + @Test + public void shouldRemoveCoverArt() throws Exception { + assertTrue(metadataWriter.removeCoverArt()); + + verify(tag).deleteArtworkField(); + verify(audioFile).commit(); + } } diff --git a/src/test/java/com/josdem/jmetadata/metadata/TestMp3Reader.java b/src/test/java/com/josdem/jmetadata/metadata/TestMp3Reader.java index 3ee1f2a..2a84fab 100644 --- a/src/test/java/com/josdem/jmetadata/metadata/TestMp3Reader.java +++ b/src/test/java/com/josdem/jmetadata/metadata/TestMp3Reader.java @@ -16,15 +16,22 @@ package com.josdem.jmetadata.metadata; -import org.apache.commons.lang3.StringUtils; -import org.asmatron.messengine.ControlEngine; -import org.asmatron.messengine.engines.support.ControlEngineConfigurator; -import org.asmatron.messengine.event.ValueEvent; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.mockito.Matchers.anyObject; +import static org.mockito.Mockito.*; + import com.josdem.jmetadata.collaborator.JAudioTaggerCollaborator; import com.josdem.jmetadata.event.Events; import com.josdem.jmetadata.helper.AudioFileHelper; import com.josdem.jmetadata.helper.ReaderHelper; import com.josdem.jmetadata.model.Metadata; +import java.awt.image.BufferedImage; +import java.io.File; +import org.apache.commons.lang3.StringUtils; +import org.asmatron.messengine.ControlEngine; +import org.asmatron.messengine.engines.support.ControlEngineConfigurator; +import org.asmatron.messengine.event.ValueEvent; import org.jaudiotagger.audio.AudioHeader; import org.jaudiotagger.audio.mp3.MP3File; import org.jaudiotagger.tag.FieldKey; @@ -37,289 +44,266 @@ import org.mockito.Mock; import org.mockito.MockitoAnnotations; -import java.awt.image.BufferedImage; -import java.io.File; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.mockito.Matchers.anyObject; -import static org.mockito.Mockito.*; - public class TestMp3Reader { - private static final String ARTIST = "Armin Van Buuren"; - private static final String TITLE = "Control Freak (Sander Van Doorn Remix)"; - private static final String YEAR = "2011"; - private static final String NULL = "null"; - - @InjectMocks - private Mp3Reader reader = new Mp3Reader(); - - @Mock - private MP3File audioFile; - @Mock - private File file; - @Mock - private Tag tag; - @Mock - private Artwork artwork; - @Mock - private AudioHeader header; - @Mock - private AudioFileHelper audioFileHelper; - @Mock - private BufferedImage bufferedImage; - @Mock - private ControlEngineConfigurator configurator; - @Mock - private ControlEngine controlEngine; - @Mock - private ReaderHelper readerHelper; - @Mock - private JAudioTaggerCollaborator jAudioTaggerCollaborator; - - @BeforeEach - public void setup() throws Exception { - MockitoAnnotations.initMocks(this); - when(audioFileHelper.read(file)).thenReturn(audioFile); - when(audioFile.getTag()).thenReturn(tag); - when(audioFile.getAudioHeader()).thenReturn(header); - when(artwork.getImage()).thenReturn(bufferedImage); - when(tag.getFirstArtwork()).thenReturn(artwork); - when(audioFile.hasID3v2Tag()).thenReturn(true); - when(header.getBitRate()).thenReturn("64"); - when(configurator.getControlEngine()).thenReturn(controlEngine); - when(jAudioTaggerCollaborator.isValid(tag, header)).thenReturn(true); - } - - @Test - public void shouldUpdateID3toV2() throws Exception { - when(audioFile.hasID3v2Tag()).thenReturn(false); - reader.getMetadata(file); - - ((MP3File) verify(audioFile)).setID3v2TagOnly((AbstractID3v2Tag) anyObject()); - ((MP3File) verify(audioFile)).commit(); - } - - @Test - public void shouldGetMetadata() throws Exception { - when(audioFile.hasID3v2Tag()).thenReturn(true); - reader.getMetadata(file); - - ((MP3File) verify(audioFile)).getTag(); - ((MP3File) verify(audioFile)).getAudioHeader(); - } - - @Test - public void shouldGetArtist() throws Exception { - when(tag.getFirst(FieldKey.ARTIST)).thenReturn(ARTIST); - Metadata metadata = reader.getMetadata(file); - - assertEquals(ARTIST, metadata.getArtist()); - } - - @Test - public void shouldGetTitle() throws Exception { - when(tag.getFirst(FieldKey.TITLE)).thenReturn(TITLE); - Metadata metadata = reader.getMetadata(file); - - assertEquals(TITLE, metadata.getTitle()); - } - - @Test - public void shouldGetAlbum() throws Exception { - String album = "Nobody Seems To Care / Murder Weapon"; - when(tag.getFirst(FieldKey.ALBUM)).thenReturn(album); - Metadata metadata = reader.getMetadata(file); - - assertEquals(album, metadata.getAlbum()); - } - - @Test - public void shouldGetGenre() throws Exception { - String genre = "Minimal Techno"; - when(tag.getFirst(FieldKey.GENRE)).thenReturn(genre); - when(readerHelper.getGenre(tag, genre)).thenReturn(genre); - - Metadata metadata = reader.getMetadata(file); - - assertEquals(genre, metadata.getGenre()); - } - - @Test - public void shouldGetGenreByCode() throws Exception { - String genreAsCode = "31"; - String genre = "Trance"; - when(tag.getFirst(FieldKey.GENRE)).thenReturn(genreAsCode); - Metadata metadata = reader.getMetadata(file); - - assertEquals(genre, metadata.getGenre()); - } - - @Test - public void shouldGetTrackNumber() throws Exception { - String trackNumber = "11"; - when(tag.getFirst(FieldKey.TRACK)).thenReturn(trackNumber); - Metadata metadata = reader.getMetadata(file); - - assertEquals(trackNumber, metadata.getTrackNumber()); - } - - @Test - public void shouldGetTotalTracks() throws Exception { - String totalTracks = "20"; - when(tag.getFirst(FieldKey.TRACK_TOTAL)).thenReturn(totalTracks); - Metadata metadata = reader.getMetadata(file); - - assertEquals(totalTracks, metadata.getTotalTracks()); - } - - @Test - public void shouldReturnZEROInTrackNumberWhenTagIsNull() throws Exception { - when(tag.getFirst(FieldKey.TRACK)).thenReturn(NULL); - Metadata metadata = reader.getMetadata(file); - - assertEquals(StringUtils.EMPTY, metadata.getTrackNumber()); - } - - @Test - public void shouldReturnZEROInTotalTracksWhenTagIsNull() throws Exception { - when(tag.getFirst(FieldKey.TRACK_TOTAL)).thenReturn(NULL); - Metadata metadata = reader.getMetadata(file); - - assertEquals(StringUtils.EMPTY, metadata.getTotalTracks()); - } - - @Test - public void shouldReturnZEROInTrackNumberWhenNullPointer() throws Exception { - when(tag.getFirst(FieldKey.TRACK)).thenThrow(new NullPointerException()); - Metadata metadata = reader.getMetadata(file); - - assertEquals(StringUtils.EMPTY, metadata.getTrackNumber()); - } - - @Test - public void shouldReturnZEROInTotalTracksWhenNullPointer() throws Exception { - when(tag.getFirst(FieldKey.TRACK_TOTAL)).thenThrow(new NullPointerException()); - Metadata metadata = reader.getMetadata(file); - - assertEquals(StringUtils.EMPTY, metadata.getTotalTracks()); - } - - @Test - public void shouldReturnZEROInGettingCdNumberWhenNullPointer() throws Exception { - when(tag.getFirst(FieldKey.DISC_NO)).thenThrow(new NullPointerException()); - Metadata metadata = reader.getMetadata(file); - - assertEquals(StringUtils.EMPTY, metadata.getCdNumber()); - } - - @Test - public void shouldReturnZEROInGettingTotalCdsWhenNullPointer() throws Exception { - when(tag.getFirst(FieldKey.DISC_TOTAL)).thenThrow(new NullPointerException()); - Metadata metadata = reader.getMetadata(file); - - assertEquals(StringUtils.EMPTY, metadata.getTotalCds()); - } - - @Test - public void shouldReturnZEROInCdNumberWhenTagIsNull() throws Exception { - when(tag.getFirst(FieldKey.DISC_NO)).thenReturn(NULL); - Metadata metadata = reader.getMetadata(file); - - assertEquals(StringUtils.EMPTY, metadata.getCdNumber()); - } - - @Test - public void shouldReturnZEROInTotalCdsWhenTagIsNull() throws Exception { - when(tag.getFirst(FieldKey.DISC_TOTAL)).thenReturn(NULL); - Metadata metadata = reader.getMetadata(file); - - assertEquals(StringUtils.EMPTY, metadata.getTotalCds()); - } - - @Test - public void shouldGetLength() throws Exception { - int length = 325; - when(header.getBitRate()).thenReturn("64"); - when(audioFile.hasID3v2Tag()).thenReturn(true); - when(header.getTrackLength()).thenReturn(length); - when(audioFile.getAudioHeader()).thenReturn(header); - - Metadata metadata = reader.getMetadata(file); - - assertEquals(length, metadata.getLength()); - } - - @Test - public void shouldGetArtwork() throws Exception { - reader.getMetadata(file); - verify(artwork).getImage(); - } - - @Test - public void shouldGetFile() throws Exception { - Metadata metadata = reader.getMetadata(file); - assertNotNull(metadata.getFile()); - } - - @Test - public void shouldGetYear() throws Exception { - when(tag.getFirst(FieldKey.YEAR)).thenReturn(YEAR); - Metadata metadata = reader.getMetadata(file); - assertEquals(YEAR, metadata.getYear()); - } - - @Test - public void shouldNotGetCoverArt() throws Exception { - when(tag.getFirstArtwork()).thenReturn(artwork); - when(artwork.getImage()).thenReturn(bufferedImage); - - Metadata metadata = reader.getMetadata(file); - - verify(tag).getFirstArtwork(); - assertEquals(bufferedImage, metadata.getCoverArt()); - } - - @Test - public void shouldNotGetCoverArtIfNull() throws Exception { - when(tag.getFirstArtwork()).thenReturn(null); - Metadata metadata = reader.getMetadata(file); - - verify(tag).getFirstArtwork(); - assertEquals(null, metadata.getCoverArt()); - } - - /** - * TODO: Bug in JAudioTagger null pointer exception when artwork.getImage() - */ - @Test - public void shouldNotGetCoverArtIfImageError() throws Exception { - when(tag.getFirstArtwork()).thenReturn(artwork); - when(artwork.getImage()).thenThrow(new NullPointerException()); - when(tag.getFirst(FieldKey.TITLE)).thenReturn(TITLE); - - reader.getMetadata(file); - - verify(tag).getFirstArtwork(); - verify(controlEngine).fireEvent(Events.LOAD_COVER_ART, new ValueEvent(TITLE)); - } - - @Test - public void shouldKnowWhenMp3IsNotANumberInsideParenthesis() throws Exception { - String genre = "(None)"; - when(tag.getFirst(FieldKey.GENRE)).thenReturn(genre); - reader.getMetadata(file); - verify(readerHelper).getGenre(tag, genre); - } - - @Test - public void shouldReturnNewMetadataWhenNoTagOrNoHeader() throws Exception { - when(jAudioTaggerCollaborator.isValid(tag, header)).thenReturn(false); - - reader.getMetadata(file); - - verify(tag, never()).getFirst(FieldKey.TITLE); - verify(header, never()).getTrackLength(); - } - + private static final String ARTIST = "Armin Van Buuren"; + private static final String TITLE = "Control Freak (Sander Van Doorn Remix)"; + private static final String YEAR = "2011"; + private static final String NULL = "null"; + + @InjectMocks private Mp3Reader reader = new Mp3Reader(); + + @Mock private MP3File audioFile; + @Mock private File file; + @Mock private Tag tag; + @Mock private Artwork artwork; + @Mock private AudioHeader header; + @Mock private AudioFileHelper audioFileHelper; + @Mock private BufferedImage bufferedImage; + @Mock private ControlEngineConfigurator configurator; + @Mock private ControlEngine controlEngine; + @Mock private ReaderHelper readerHelper; + @Mock private JAudioTaggerCollaborator jAudioTaggerCollaborator; + + @BeforeEach + public void setup() throws Exception { + MockitoAnnotations.initMocks(this); + when(audioFileHelper.read(file)).thenReturn(audioFile); + when(audioFile.getTag()).thenReturn(tag); + when(audioFile.getAudioHeader()).thenReturn(header); + when(artwork.getImage()).thenReturn(bufferedImage); + when(tag.getFirstArtwork()).thenReturn(artwork); + when(audioFile.hasID3v2Tag()).thenReturn(true); + when(header.getBitRate()).thenReturn("64"); + when(configurator.getControlEngine()).thenReturn(controlEngine); + when(jAudioTaggerCollaborator.isValid(tag, header)).thenReturn(true); + } + + @Test + public void shouldUpdateID3toV2() throws Exception { + when(audioFile.hasID3v2Tag()).thenReturn(false); + reader.getMetadata(file); + + ((MP3File) verify(audioFile)).setID3v2TagOnly((AbstractID3v2Tag) anyObject()); + ((MP3File) verify(audioFile)).commit(); + } + + @Test + public void shouldGetMetadata() throws Exception { + when(audioFile.hasID3v2Tag()).thenReturn(true); + reader.getMetadata(file); + + ((MP3File) verify(audioFile)).getTag(); + ((MP3File) verify(audioFile)).getAudioHeader(); + } + + @Test + public void shouldGetArtist() throws Exception { + when(tag.getFirst(FieldKey.ARTIST)).thenReturn(ARTIST); + Metadata metadata = reader.getMetadata(file); + + assertEquals(ARTIST, metadata.getArtist()); + } + + @Test + public void shouldGetTitle() throws Exception { + when(tag.getFirst(FieldKey.TITLE)).thenReturn(TITLE); + Metadata metadata = reader.getMetadata(file); + + assertEquals(TITLE, metadata.getTitle()); + } + + @Test + public void shouldGetAlbum() throws Exception { + String album = "Nobody Seems To Care / Murder Weapon"; + when(tag.getFirst(FieldKey.ALBUM)).thenReturn(album); + Metadata metadata = reader.getMetadata(file); + + assertEquals(album, metadata.getAlbum()); + } + + @Test + public void shouldGetGenre() throws Exception { + String genre = "Minimal Techno"; + when(tag.getFirst(FieldKey.GENRE)).thenReturn(genre); + when(readerHelper.getGenre(tag, genre)).thenReturn(genre); + + Metadata metadata = reader.getMetadata(file); + + assertEquals(genre, metadata.getGenre()); + } + + @Test + public void shouldGetGenreByCode() throws Exception { + String genreAsCode = "31"; + String genre = "Trance"; + when(tag.getFirst(FieldKey.GENRE)).thenReturn(genreAsCode); + Metadata metadata = reader.getMetadata(file); + + assertEquals(genre, metadata.getGenre()); + } + + @Test + public void shouldGetTrackNumber() throws Exception { + String trackNumber = "11"; + when(tag.getFirst(FieldKey.TRACK)).thenReturn(trackNumber); + Metadata metadata = reader.getMetadata(file); + + assertEquals(trackNumber, metadata.getTrackNumber()); + } + + @Test + public void shouldGetTotalTracks() throws Exception { + String totalTracks = "20"; + when(tag.getFirst(FieldKey.TRACK_TOTAL)).thenReturn(totalTracks); + Metadata metadata = reader.getMetadata(file); + + assertEquals(totalTracks, metadata.getTotalTracks()); + } + + @Test + public void shouldReturnZEROInTrackNumberWhenTagIsNull() throws Exception { + when(tag.getFirst(FieldKey.TRACK)).thenReturn(NULL); + Metadata metadata = reader.getMetadata(file); + + assertEquals(StringUtils.EMPTY, metadata.getTrackNumber()); + } + + @Test + public void shouldReturnZEROInTotalTracksWhenTagIsNull() throws Exception { + when(tag.getFirst(FieldKey.TRACK_TOTAL)).thenReturn(NULL); + Metadata metadata = reader.getMetadata(file); + + assertEquals(StringUtils.EMPTY, metadata.getTotalTracks()); + } + + @Test + public void shouldReturnZEROInTrackNumberWhenNullPointer() throws Exception { + when(tag.getFirst(FieldKey.TRACK)).thenThrow(new NullPointerException()); + Metadata metadata = reader.getMetadata(file); + + assertEquals(StringUtils.EMPTY, metadata.getTrackNumber()); + } + + @Test + public void shouldReturnZEROInTotalTracksWhenNullPointer() throws Exception { + when(tag.getFirst(FieldKey.TRACK_TOTAL)).thenThrow(new NullPointerException()); + Metadata metadata = reader.getMetadata(file); + + assertEquals(StringUtils.EMPTY, metadata.getTotalTracks()); + } + + @Test + public void shouldReturnZEROInGettingCdNumberWhenNullPointer() throws Exception { + when(tag.getFirst(FieldKey.DISC_NO)).thenThrow(new NullPointerException()); + Metadata metadata = reader.getMetadata(file); + + assertEquals(StringUtils.EMPTY, metadata.getCdNumber()); + } + + @Test + public void shouldReturnZEROInGettingTotalCdsWhenNullPointer() throws Exception { + when(tag.getFirst(FieldKey.DISC_TOTAL)).thenThrow(new NullPointerException()); + Metadata metadata = reader.getMetadata(file); + + assertEquals(StringUtils.EMPTY, metadata.getTotalCds()); + } + + @Test + public void shouldReturnZEROInCdNumberWhenTagIsNull() throws Exception { + when(tag.getFirst(FieldKey.DISC_NO)).thenReturn(NULL); + Metadata metadata = reader.getMetadata(file); + + assertEquals(StringUtils.EMPTY, metadata.getCdNumber()); + } + + @Test + public void shouldReturnZEROInTotalCdsWhenTagIsNull() throws Exception { + when(tag.getFirst(FieldKey.DISC_TOTAL)).thenReturn(NULL); + Metadata metadata = reader.getMetadata(file); + + assertEquals(StringUtils.EMPTY, metadata.getTotalCds()); + } + + @Test + public void shouldGetLength() throws Exception { + int length = 325; + when(header.getBitRate()).thenReturn("64"); + when(audioFile.hasID3v2Tag()).thenReturn(true); + when(header.getTrackLength()).thenReturn(length); + when(audioFile.getAudioHeader()).thenReturn(header); + + Metadata metadata = reader.getMetadata(file); + + assertEquals(length, metadata.getLength()); + } + + @Test + public void shouldGetArtwork() throws Exception { + reader.getMetadata(file); + verify(artwork).getImage(); + } + + @Test + public void shouldGetFile() throws Exception { + Metadata metadata = reader.getMetadata(file); + assertNotNull(metadata.getFile()); + } + + @Test + public void shouldGetYear() throws Exception { + when(tag.getFirst(FieldKey.YEAR)).thenReturn(YEAR); + Metadata metadata = reader.getMetadata(file); + assertEquals(YEAR, metadata.getYear()); + } + + @Test + public void shouldNotGetCoverArt() throws Exception { + when(tag.getFirstArtwork()).thenReturn(artwork); + when(artwork.getImage()).thenReturn(bufferedImage); + + Metadata metadata = reader.getMetadata(file); + + verify(tag).getFirstArtwork(); + assertEquals(bufferedImage, metadata.getCoverArt()); + } + + @Test + public void shouldNotGetCoverArtIfNull() throws Exception { + when(tag.getFirstArtwork()).thenReturn(null); + Metadata metadata = reader.getMetadata(file); + + verify(tag).getFirstArtwork(); + assertEquals(null, metadata.getCoverArt()); + } + + /** TODO: Bug in JAudioTagger null pointer exception when artwork.getImage() */ + @Test + public void shouldNotGetCoverArtIfImageError() throws Exception { + when(tag.getFirstArtwork()).thenReturn(artwork); + when(artwork.getImage()).thenThrow(new NullPointerException()); + when(tag.getFirst(FieldKey.TITLE)).thenReturn(TITLE); + + reader.getMetadata(file); + + verify(tag).getFirstArtwork(); + verify(controlEngine).fireEvent(Events.LOAD_COVER_ART, new ValueEvent(TITLE)); + } + + @Test + public void shouldKnowWhenMp3IsNotANumberInsideParenthesis() throws Exception { + String genre = "(None)"; + when(tag.getFirst(FieldKey.GENRE)).thenReturn(genre); + reader.getMetadata(file); + verify(readerHelper).getGenre(tag, genre); + } + + @Test + public void shouldReturnNewMetadataWhenNoTagOrNoHeader() throws Exception { + when(jAudioTaggerCollaborator.isValid(tag, header)).thenReturn(false); + + reader.getMetadata(file); + + verify(tag, never()).getFirst(FieldKey.TITLE); + verify(header, never()).getTrackLength(); + } } diff --git a/src/test/java/com/josdem/jmetadata/metadata/TestMp4Reader.java b/src/test/java/com/josdem/jmetadata/metadata/TestMp4Reader.java index e6a5f44..6ded6d3 100644 --- a/src/test/java/com/josdem/jmetadata/metadata/TestMp4Reader.java +++ b/src/test/java/com/josdem/jmetadata/metadata/TestMp4Reader.java @@ -16,13 +16,19 @@ package com.josdem.jmetadata.metadata; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import com.josdem.jmetadata.event.Events; +import com.josdem.jmetadata.helper.AudioFileHelper; +import com.josdem.jmetadata.model.Metadata; +import java.awt.image.BufferedImage; +import java.io.File; import org.apache.commons.lang3.StringUtils; import org.asmatron.messengine.ControlEngine; import org.asmatron.messengine.engines.support.ControlEngineConfigurator; import org.asmatron.messengine.event.ValueEvent; -import com.josdem.jmetadata.event.Events; -import com.josdem.jmetadata.helper.AudioFileHelper; -import com.josdem.jmetadata.model.Metadata; import org.jaudiotagger.audio.AudioFile; import org.jaudiotagger.audio.AudioHeader; import org.jaudiotagger.tag.FieldKey; @@ -34,217 +40,197 @@ import org.mockito.Mock; import org.mockito.MockitoAnnotations; -import java.awt.image.BufferedImage; -import java.io.File; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; - public class TestMp4Reader { - private static final String TITLE = "Control Freak (Sander Van Doorn Remix)"; - private static final String NULL = "null"; - - @InjectMocks - private final Mp4Reader reader = new Mp4Reader(); - - @Mock - private File file; - @Mock - private Mp4Tag tag; - @Mock - private AudioFile audioFile; - @Mock - private AudioHeader header; - @Mock - private Artwork artwork; - @Mock - private AudioFileHelper audioFileHelper; - @Mock - private BufferedImage bufferedImage; - @Mock - private ControlEngineConfigurator configurator; - @Mock - private ControlEngine controlEngine; - - @BeforeEach - public void setup() throws Exception { - MockitoAnnotations.initMocks(this); - when(audioFileHelper.read(file)).thenReturn(audioFile); - when(audioFile.getTag()).thenReturn(tag); - when(audioFile.getAudioHeader()).thenReturn(header); - when(artwork.getImage()).thenReturn(bufferedImage); - when(tag.getFirstArtwork()).thenReturn(artwork); - when(header.getBitRate()).thenReturn("64"); - when(configurator.getControlEngine()).thenReturn(controlEngine); - } - - @Test - public void shouldGetAlbum() throws Exception { - String album = "Simple Pleasures"; - when(tag.getFirst(FieldKey.ALBUM)).thenReturn(album); - Metadata metadata = reader.getMetadata(file); - - assertEquals(album, metadata.getAlbum()); - } - - @Test - public void shouldGetGenre() throws Exception { - String genre = "Minimal Techno"; - when(tag.getFirst(FieldKey.GENRE)).thenReturn(genre); - Metadata metadata = reader.getMetadata(file); - - assertEquals(genre, metadata.getGenre()); - } - - @Test - public void shouldGetArtist() throws Exception { - String artist = "Ferry Corsten"; - when(tag.getFirst(FieldKey.ARTIST)).thenReturn(artist); - Metadata metadata = reader.getMetadata(file); - - assertEquals(artist, metadata.getArtist()); - } - - @Test - public void shouldGetLength() throws Exception { - int length = 325; - when(header.getTrackLength()).thenReturn(length); - Metadata metadata = reader.getMetadata(file); - - assertEquals(length, metadata.getLength()); - } - - @Test - public void shouldGetTitle() throws Exception { - String title = "A Magical Moment"; - when(tag.getFirst(FieldKey.TITLE)).thenReturn(title); - Metadata metadata = reader.getMetadata(file); - - assertEquals(title, metadata.getTitle()); - } - - @Test - public void shouldGetTrackNumber() throws Exception { - String trackNumber = "11"; - when(tag.getFirst(FieldKey.TRACK)).thenReturn(trackNumber); - Metadata metadata = reader.getMetadata(file); - - assertEquals(trackNumber, metadata.getTrackNumber()); - } - - @Test - public void shouldGetTotalTracks() throws Exception { - String totalTracks = "20"; - when(tag.getFirst(FieldKey.TRACK_TOTAL)).thenReturn(totalTracks); - Metadata metadata = reader.getMetadata(file); - - assertEquals(totalTracks, metadata.getTotalTracks()); - } - - @Test - public void shouldReturnZEROInTrackNumberWhenTagIsNull() throws Exception { - when(tag.getFirst(FieldKey.TRACK)).thenReturn(NULL); - Metadata metadata = reader.getMetadata(file); - - assertEquals(StringUtils.EMPTY, metadata.getTrackNumber()); - } - - @Test - public void shouldReturnZEROInTotalTracksWhenTagIsNull() throws Exception { - when(tag.getFirst(FieldKey.TRACK_TOTAL)).thenReturn(NULL); - Metadata metadata = reader.getMetadata(file); - - assertEquals(StringUtils.EMPTY, metadata.getTotalTracks()); - } - - @Test - public void shouldReturnZEROInTrackNumberWhenNullPointer() throws Exception { - when(tag.getFirst(FieldKey.TRACK)).thenThrow(new NullPointerException()); - Metadata metadata = reader.getMetadata(file); - - assertEquals(StringUtils.EMPTY, metadata.getTrackNumber()); - } - - @Test - public void shouldReturnZEROInTotalTracksWhenNullPointer() throws Exception { - when(tag.getFirst(FieldKey.TRACK_TOTAL)).thenThrow(new NullPointerException()); - Metadata metadata = reader.getMetadata(file); - - assertEquals(StringUtils.EMPTY, metadata.getTotalTracks()); - } - - @Test - public void shouldReturnZEROInGettingCdNumberWhenNullPointer() throws Exception { - when(tag.getFirst(FieldKey.DISC_NO)).thenThrow(new NullPointerException()); - Metadata metadata = reader.getMetadata(file); - - assertEquals(StringUtils.EMPTY, metadata.getCdNumber()); - } - - @Test - public void shouldReturnZEROInGettingTotalCdsWhenNullPointer() throws Exception { - when(tag.getFirst(FieldKey.DISC_TOTAL)).thenThrow(new NullPointerException()); - Metadata metadata = reader.getMetadata(file); - - assertEquals(StringUtils.EMPTY, metadata.getTotalCds()); - } - - @Test - public void shouldReturnZEROInCdNumberWhenTagIsNull() throws Exception { - when(tag.getFirst(FieldKey.DISC_NO)).thenReturn(NULL); - Metadata metadata = reader.getMetadata(file); - - assertEquals(StringUtils.EMPTY, metadata.getCdNumber()); - } - - @Test - public void shouldReturnZEROInTotalCdsWhenTagIsNull() throws Exception { - when(tag.getFirst(FieldKey.DISC_TOTAL)).thenReturn(NULL); - Metadata metadata = reader.getMetadata(file); - - assertEquals(StringUtils.EMPTY, metadata.getTotalCds()); - } - - @Test - public void shouldGetArtwork() throws Exception { - reader.getMetadata(file); - verify(artwork).getImage(); - } - - @Test - public void shouldNotGetCoverArt() throws Exception { - when(tag.getFirstArtwork()).thenReturn(artwork); - when(artwork.getImage()).thenReturn(bufferedImage); - - Metadata metadata = reader.getMetadata(file); - - verify(tag).getFirstArtwork(); - assertEquals(bufferedImage, metadata.getCoverArt()); - } - - @Test - public void shouldNotGetCoverArtIfNull() throws Exception { - when(tag.getFirstArtwork()).thenReturn(null); - Metadata metadata = reader.getMetadata(file); - - verify(tag).getFirstArtwork(); - assertEquals(null, metadata.getCoverArt()); - } - - /** - * Bug in JAudioTagger null pointer exception when artwork.getImage() - */ - @Test - public void shouldNotGetCoverArtIfImageError() throws Exception { - when(tag.getFirstArtwork()).thenReturn(artwork); - when(artwork.getImage()).thenThrow(new NullPointerException()); - when(tag.getFirst(FieldKey.TITLE)).thenReturn(TITLE); - - reader.getMetadata(file); - - verify(tag).getFirstArtwork(); - verify(controlEngine).fireEvent(Events.LOAD_COVER_ART, new ValueEvent(TITLE)); - } + private static final String TITLE = "Control Freak (Sander Van Doorn Remix)"; + private static final String NULL = "null"; + + @InjectMocks private final Mp4Reader reader = new Mp4Reader(); + + @Mock private File file; + @Mock private Mp4Tag tag; + @Mock private AudioFile audioFile; + @Mock private AudioHeader header; + @Mock private Artwork artwork; + @Mock private AudioFileHelper audioFileHelper; + @Mock private BufferedImage bufferedImage; + @Mock private ControlEngineConfigurator configurator; + @Mock private ControlEngine controlEngine; + + @BeforeEach + public void setup() throws Exception { + MockitoAnnotations.initMocks(this); + when(audioFileHelper.read(file)).thenReturn(audioFile); + when(audioFile.getTag()).thenReturn(tag); + when(audioFile.getAudioHeader()).thenReturn(header); + when(artwork.getImage()).thenReturn(bufferedImage); + when(tag.getFirstArtwork()).thenReturn(artwork); + when(header.getBitRate()).thenReturn("64"); + when(configurator.getControlEngine()).thenReturn(controlEngine); + } + + @Test + public void shouldGetAlbum() throws Exception { + String album = "Simple Pleasures"; + when(tag.getFirst(FieldKey.ALBUM)).thenReturn(album); + Metadata metadata = reader.getMetadata(file); + + assertEquals(album, metadata.getAlbum()); + } + + @Test + public void shouldGetGenre() throws Exception { + String genre = "Minimal Techno"; + when(tag.getFirst(FieldKey.GENRE)).thenReturn(genre); + Metadata metadata = reader.getMetadata(file); + + assertEquals(genre, metadata.getGenre()); + } + + @Test + public void shouldGetArtist() throws Exception { + String artist = "Ferry Corsten"; + when(tag.getFirst(FieldKey.ARTIST)).thenReturn(artist); + Metadata metadata = reader.getMetadata(file); + + assertEquals(artist, metadata.getArtist()); + } + + @Test + public void shouldGetLength() throws Exception { + int length = 325; + when(header.getTrackLength()).thenReturn(length); + Metadata metadata = reader.getMetadata(file); + + assertEquals(length, metadata.getLength()); + } + + @Test + public void shouldGetTitle() throws Exception { + String title = "A Magical Moment"; + when(tag.getFirst(FieldKey.TITLE)).thenReturn(title); + Metadata metadata = reader.getMetadata(file); + + assertEquals(title, metadata.getTitle()); + } + + @Test + public void shouldGetTrackNumber() throws Exception { + String trackNumber = "11"; + when(tag.getFirst(FieldKey.TRACK)).thenReturn(trackNumber); + Metadata metadata = reader.getMetadata(file); + + assertEquals(trackNumber, metadata.getTrackNumber()); + } + + @Test + public void shouldGetTotalTracks() throws Exception { + String totalTracks = "20"; + when(tag.getFirst(FieldKey.TRACK_TOTAL)).thenReturn(totalTracks); + Metadata metadata = reader.getMetadata(file); + + assertEquals(totalTracks, metadata.getTotalTracks()); + } + + @Test + public void shouldReturnZEROInTrackNumberWhenTagIsNull() throws Exception { + when(tag.getFirst(FieldKey.TRACK)).thenReturn(NULL); + Metadata metadata = reader.getMetadata(file); + + assertEquals(StringUtils.EMPTY, metadata.getTrackNumber()); + } + + @Test + public void shouldReturnZEROInTotalTracksWhenTagIsNull() throws Exception { + when(tag.getFirst(FieldKey.TRACK_TOTAL)).thenReturn(NULL); + Metadata metadata = reader.getMetadata(file); + + assertEquals(StringUtils.EMPTY, metadata.getTotalTracks()); + } + + @Test + public void shouldReturnZEROInTrackNumberWhenNullPointer() throws Exception { + when(tag.getFirst(FieldKey.TRACK)).thenThrow(new NullPointerException()); + Metadata metadata = reader.getMetadata(file); + + assertEquals(StringUtils.EMPTY, metadata.getTrackNumber()); + } + + @Test + public void shouldReturnZEROInTotalTracksWhenNullPointer() throws Exception { + when(tag.getFirst(FieldKey.TRACK_TOTAL)).thenThrow(new NullPointerException()); + Metadata metadata = reader.getMetadata(file); + + assertEquals(StringUtils.EMPTY, metadata.getTotalTracks()); + } + + @Test + public void shouldReturnZEROInGettingCdNumberWhenNullPointer() throws Exception { + when(tag.getFirst(FieldKey.DISC_NO)).thenThrow(new NullPointerException()); + Metadata metadata = reader.getMetadata(file); + + assertEquals(StringUtils.EMPTY, metadata.getCdNumber()); + } + + @Test + public void shouldReturnZEROInGettingTotalCdsWhenNullPointer() throws Exception { + when(tag.getFirst(FieldKey.DISC_TOTAL)).thenThrow(new NullPointerException()); + Metadata metadata = reader.getMetadata(file); + + assertEquals(StringUtils.EMPTY, metadata.getTotalCds()); + } + + @Test + public void shouldReturnZEROInCdNumberWhenTagIsNull() throws Exception { + when(tag.getFirst(FieldKey.DISC_NO)).thenReturn(NULL); + Metadata metadata = reader.getMetadata(file); + + assertEquals(StringUtils.EMPTY, metadata.getCdNumber()); + } + + @Test + public void shouldReturnZEROInTotalCdsWhenTagIsNull() throws Exception { + when(tag.getFirst(FieldKey.DISC_TOTAL)).thenReturn(NULL); + Metadata metadata = reader.getMetadata(file); + + assertEquals(StringUtils.EMPTY, metadata.getTotalCds()); + } + + @Test + public void shouldGetArtwork() throws Exception { + reader.getMetadata(file); + verify(artwork).getImage(); + } + + @Test + public void shouldNotGetCoverArt() throws Exception { + when(tag.getFirstArtwork()).thenReturn(artwork); + when(artwork.getImage()).thenReturn(bufferedImage); + + Metadata metadata = reader.getMetadata(file); + + verify(tag).getFirstArtwork(); + assertEquals(bufferedImage, metadata.getCoverArt()); + } + + @Test + public void shouldNotGetCoverArtIfNull() throws Exception { + when(tag.getFirstArtwork()).thenReturn(null); + Metadata metadata = reader.getMetadata(file); + + verify(tag).getFirstArtwork(); + assertEquals(null, metadata.getCoverArt()); + } + + /** Bug in JAudioTagger null pointer exception when artwork.getImage() */ + @Test + public void shouldNotGetCoverArtIfImageError() throws Exception { + when(tag.getFirstArtwork()).thenReturn(artwork); + when(artwork.getImage()).thenThrow(new NullPointerException()); + when(tag.getFirst(FieldKey.TITLE)).thenReturn(TITLE); + reader.getMetadata(file); + + verify(tag).getFirstArtwork(); + verify(controlEngine).fireEvent(Events.LOAD_COVER_ART, new ValueEvent(TITLE)); + } } diff --git a/src/test/java/com/josdem/jmetadata/model/TestCoverArt.java b/src/test/java/com/josdem/jmetadata/model/TestCoverArt.java index 61afe1e..24cb05b 100644 --- a/src/test/java/com/josdem/jmetadata/model/TestCoverArt.java +++ b/src/test/java/com/josdem/jmetadata/model/TestCoverArt.java @@ -16,32 +16,27 @@ package com.josdem.jmetadata.model; +import static org.junit.jupiter.api.Assertions.assertEquals; +import java.awt.Image; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.mockito.Mock; import org.mockito.MockitoAnnotations; -import java.awt.Image; - -import static org.junit.jupiter.api.Assertions.assertEquals; - - class TestCoverArt { - @Mock - private Image imageIcon; - - @BeforeEach - public void setup() throws Exception { - MockitoAnnotations.initMocks(this); - } + @Mock private Image imageIcon; - @Test - public void shouldCreateAnCoverArt() throws Exception { - CoverArt coverArt = new CoverArt(imageIcon, CoverArtType.DRAG_AND_DROP); - assertEquals(imageIcon, coverArt.getImage()); - assertEquals(CoverArtType.DRAG_AND_DROP, coverArt.getType()); - } + @BeforeEach + public void setup() throws Exception { + MockitoAnnotations.initMocks(this); + } + @Test + public void shouldCreateAnCoverArt() throws Exception { + CoverArt coverArt = new CoverArt(imageIcon, CoverArtType.DRAG_AND_DROP); + assertEquals(imageIcon, coverArt.getImage()); + assertEquals(CoverArtType.DRAG_AND_DROP, coverArt.getType()); + } } diff --git a/src/test/java/com/josdem/jmetadata/model/TestCredentials.java b/src/test/java/com/josdem/jmetadata/model/TestCredentials.java index 08e6002..8c9c99a 100644 --- a/src/test/java/com/josdem/jmetadata/model/TestCredentials.java +++ b/src/test/java/com/josdem/jmetadata/model/TestCredentials.java @@ -16,20 +16,19 @@ package com.josdem.jmetadata.model; +import static org.junit.jupiter.api.Assertions.assertEquals; import org.junit.jupiter.api.Test; -import static org.junit.jupiter.api.Assertions.assertEquals; - class TestCredentials { - @Test - public void shouldCreateCredentials() throws Exception { - String username = "josdem"; - String password = "password"; - User credentials = new User(username, password); + @Test + public void shouldCreateCredentials() throws Exception { + String username = "josdem"; + String password = "password"; + User credentials = new User(username, password); - assertEquals(username, credentials.getUsername()); - assertEquals(password, credentials.getPassword()); - } + assertEquals(username, credentials.getUsername()); + assertEquals(password, credentials.getPassword()); + } } diff --git a/src/test/java/com/josdem/jmetadata/model/TestGenreTypes.java b/src/test/java/com/josdem/jmetadata/model/TestGenreTypes.java index b1461fa..531e8fe 100644 --- a/src/test/java/com/josdem/jmetadata/model/TestGenreTypes.java +++ b/src/test/java/com/josdem/jmetadata/model/TestGenreTypes.java @@ -16,57 +16,55 @@ package com.josdem.jmetadata.model; +import static org.junit.jupiter.api.Assertions.assertEquals; import org.apache.commons.lang3.StringUtils; import org.junit.jupiter.api.Test; -import static org.junit.jupiter.api.Assertions.assertEquals; - - class TestGenreTypes { - @Test - public void shouldGetMinimalAsGenre() throws Exception { - int minimalCode = 152; - assertEquals("Minimal", GenreTypes.getGenreByCode(minimalCode)); - } - - @Test - public void shouldGetHouseAsGenre() throws Exception { - int houseCode = 35; - assertEquals("House", GenreTypes.getGenreByCode(houseCode)); - } - - @Test - public void shouldReturnEmptyStringIfNoGenre() throws Exception { - int unknownCode = 500; - assertEquals(StringUtils.EMPTY, GenreTypes.getGenreByCode(unknownCode)); - } - - @Test - public void shouldGetGenreByCode() throws Exception { - int genreAsCode = 18; - String genre = "Techno"; - - String result = GenreTypes.getGenreByCode(genreAsCode); - assertEquals(genre, result); - } - - @Test - public void shouldGetCodeByGenre() throws Exception { - int genreAsCode = 18; - String genre = "Techno"; - - GenreTypes genreType = GenreTypes.getGenreByName(genre); - assertEquals(genreAsCode, genreType.getCode()); - } - - @Test - public void shouldGetUnknownCodeByGenre() throws Exception { - int genreAsCode = 148; - String genre = "Minimal Techno"; - - GenreTypes genreType = GenreTypes.getGenreByName(genre); - assertEquals(genreAsCode, genreType.getCode()); - } + @Test + public void shouldGetMinimalAsGenre() throws Exception { + int minimalCode = 152; + assertEquals("Minimal", GenreTypes.getGenreByCode(minimalCode)); + } + + @Test + public void shouldGetHouseAsGenre() throws Exception { + int houseCode = 35; + assertEquals("House", GenreTypes.getGenreByCode(houseCode)); + } + + @Test + public void shouldReturnEmptyStringIfNoGenre() throws Exception { + int unknownCode = 500; + assertEquals(StringUtils.EMPTY, GenreTypes.getGenreByCode(unknownCode)); + } + + @Test + public void shouldGetGenreByCode() throws Exception { + int genreAsCode = 18; + String genre = "Techno"; + + String result = GenreTypes.getGenreByCode(genreAsCode); + assertEquals(genre, result); + } + + @Test + public void shouldGetCodeByGenre() throws Exception { + int genreAsCode = 18; + String genre = "Techno"; + + GenreTypes genreType = GenreTypes.getGenreByName(genre); + assertEquals(genreAsCode, genreType.getCode()); + } + + @Test + public void shouldGetUnknownCodeByGenre() throws Exception { + int genreAsCode = 148; + String genre = "Minimal Techno"; + + GenreTypes genreType = GenreTypes.getGenreByName(genre); + assertEquals(genreAsCode, genreType.getCode()); + } } diff --git a/src/test/java/com/josdem/jmetadata/model/TestLastfmAlbum.java b/src/test/java/com/josdem/jmetadata/model/TestLastfmAlbum.java index 12b48b8..6e465c8 100644 --- a/src/test/java/com/josdem/jmetadata/model/TestLastfmAlbum.java +++ b/src/test/java/com/josdem/jmetadata/model/TestLastfmAlbum.java @@ -16,37 +16,34 @@ package com.josdem.jmetadata.model; +import static org.junit.jupiter.api.Assertions.assertEquals; +import java.awt.Image; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.mockito.Mock; import org.mockito.MockitoAnnotations; -import java.awt.Image; - -import static org.junit.jupiter.api.Assertions.assertEquals; - class TestLastfmAlbum { - @Mock - private Image imageIcon; - - @BeforeEach - public void setup() throws Exception { - MockitoAnnotations.initMocks(this); - } - - @Test - public void shouldCreateALastfmAlbum() throws Exception { - final String year = "2011"; - final String genre = "Minimal Techno"; - LastfmAlbum lastfmAlbum = new LastfmAlbum(); - lastfmAlbum.setYear(year); - lastfmAlbum.setGenre(genre); - lastfmAlbum.setImageIcon(imageIcon); - - assertEquals(year, lastfmAlbum.getYear()); - assertEquals(genre, lastfmAlbum.getGenre()); - assertEquals(imageIcon, lastfmAlbum.getImageIcon()); - } + @Mock private Image imageIcon; + + @BeforeEach + public void setup() throws Exception { + MockitoAnnotations.initMocks(this); + } + + @Test + public void shouldCreateALastfmAlbum() throws Exception { + final String year = "2011"; + final String genre = "Minimal Techno"; + LastfmAlbum lastfmAlbum = new LastfmAlbum(); + lastfmAlbum.setYear(year); + lastfmAlbum.setGenre(genre); + lastfmAlbum.setImageIcon(imageIcon); + + assertEquals(year, lastfmAlbum.getYear()); + assertEquals(genre, lastfmAlbum.getGenre()); + assertEquals(imageIcon, lastfmAlbum.getImageIcon()); + } } diff --git a/src/test/java/com/josdem/jmetadata/model/TestMetadata.java b/src/test/java/com/josdem/jmetadata/model/TestMetadata.java index d4df962..7e3a5e2 100644 --- a/src/test/java/com/josdem/jmetadata/model/TestMetadata.java +++ b/src/test/java/com/josdem/jmetadata/model/TestMetadata.java @@ -16,6 +16,7 @@ package com.josdem.jmetadata.model; +import static org.junit.jupiter.api.Assertions.assertEquals; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -25,59 +26,57 @@ import org.junit.jupiter.api.TestInfo; import org.mockito.MockitoAnnotations; -import static org.junit.jupiter.api.Assertions.assertEquals; - class TestMetadata { - private static final Log log = LogFactory.getLog(TestMetadata.class); - private final Metadata metadata = new Metadata(); - - private static final String trackNumber = "2"; - private static final boolean metadataFromFile = true; - - @BeforeEach - public void setup() throws Exception { - MockitoAnnotations.initMocks(this); - } - - @Test - @DisplayName("comparing with previous metadata") - public void shouldDetectPreviousMetadata(TestInfo testInfo) { - log.info("Running test: " + testInfo.getDisplayName()); - Metadata previousMetadata = new Metadata(); - previousMetadata.setTrackNumber("1"); - - metadata.setTrackNumber(trackNumber); - assertEquals(1, metadata.compareTo(previousMetadata)); - } - - @Test - @DisplayName("comparing with next metadata") - public void shouldDetectNextMetadata(TestInfo testInfo) { - log.info("Running test: " + testInfo.getDisplayName()); - Metadata nextMetadata = new Metadata(); - nextMetadata.setTrackNumber("3"); - - metadata.setTrackNumber(trackNumber); - assertEquals(-1, metadata.compareTo(nextMetadata)); - } - - @Test - @DisplayName("detecting track number bad format") - public void shouldRespondAtErrorInTrackNumber(TestInfo testInfo) { - log.info("Running test: " + testInfo.getDisplayName()); - Metadata weirdMetadata = new Metadata(); - weirdMetadata.setTrackNumber("somethingWrongFormat"); - - metadata.setTrackNumber(trackNumber); - assertEquals(0, metadata.compareTo(weirdMetadata)); - } - - @Test - @DisplayName("detecting metadata from file") - public void shouldKnowIfMetadataIsFromFile(TestInfo testInfo) { - log.info("Running test: " + testInfo.getDisplayName()); - metadata.setMetadataFromFile(metadataFromFile); - assertEquals(metadataFromFile, metadata.isMetadataFromFile()); - } + private static final Log log = LogFactory.getLog(TestMetadata.class); + private final Metadata metadata = new Metadata(); + + private static final String trackNumber = "2"; + private static final boolean metadataFromFile = true; + + @BeforeEach + public void setup() throws Exception { + MockitoAnnotations.initMocks(this); + } + + @Test + @DisplayName("comparing with previous metadata") + public void shouldDetectPreviousMetadata(TestInfo testInfo) { + log.info("Running test: " + testInfo.getDisplayName()); + Metadata previousMetadata = new Metadata(); + previousMetadata.setTrackNumber("1"); + + metadata.setTrackNumber(trackNumber); + assertEquals(1, metadata.compareTo(previousMetadata)); + } + + @Test + @DisplayName("comparing with next metadata") + public void shouldDetectNextMetadata(TestInfo testInfo) { + log.info("Running test: " + testInfo.getDisplayName()); + Metadata nextMetadata = new Metadata(); + nextMetadata.setTrackNumber("3"); + + metadata.setTrackNumber(trackNumber); + assertEquals(-1, metadata.compareTo(nextMetadata)); + } + + @Test + @DisplayName("detecting track number bad format") + public void shouldRespondAtErrorInTrackNumber(TestInfo testInfo) { + log.info("Running test: " + testInfo.getDisplayName()); + Metadata weirdMetadata = new Metadata(); + weirdMetadata.setTrackNumber("somethingWrongFormat"); + + metadata.setTrackNumber(trackNumber); + assertEquals(0, metadata.compareTo(weirdMetadata)); + } + + @Test + @DisplayName("detecting metadata from file") + public void shouldKnowIfMetadataIsFromFile(TestInfo testInfo) { + log.info("Running test: " + testInfo.getDisplayName()); + metadata.setMetadataFromFile(metadataFromFile); + assertEquals(metadataFromFile, metadata.isMetadataFromFile()); + } } diff --git a/src/test/java/com/josdem/jmetadata/model/TestMetadataAlbumValues.java b/src/test/java/com/josdem/jmetadata/model/TestMetadataAlbumValues.java index e9065e3..c05cc9f 100644 --- a/src/test/java/com/josdem/jmetadata/model/TestMetadataAlbumValues.java +++ b/src/test/java/com/josdem/jmetadata/model/TestMetadataAlbumValues.java @@ -16,47 +16,43 @@ package com.josdem.jmetadata.model; +import static org.junit.jupiter.api.Assertions.assertEquals; +import java.awt.Image; import org.junit.jupiter.api.Test; import org.mockito.Mock; -import java.awt.Image; - -import static org.junit.jupiter.api.Assertions.assertEquals; - public class TestMetadataAlbumValues { - private static final String GENRE = "Trance"; - private static final String ARTIST = "Cosmic Gate"; - private static final String ALBUM = "Sign Of The Times (Deluxe Edition)"; - private static final String YEAR = "2010"; - private static final String TRACKS = "34"; - private static final String CD = "1"; - private static final String CDS = "1"; - - private final MetadataAlbumValues metadataAlbumValues = new MetadataAlbumValues(); - - @Mock - private Image coverArt; - - @Test - public void shouldCreateAMetadataAlbumValues() { - metadataAlbumValues.setArtist(ARTIST); - metadataAlbumValues.setAlbum(ALBUM); - metadataAlbumValues.setGenre(GENRE); - metadataAlbumValues.setYear(YEAR); - metadataAlbumValues.setTracks(TRACKS); - metadataAlbumValues.setCd(CD); - metadataAlbumValues.setCds(CDS); - metadataAlbumValues.setCoverArt(coverArt); - - assertEquals(ARTIST, metadataAlbumValues.getArtist()); - assertEquals(ALBUM, metadataAlbumValues.getAlbum()); - assertEquals(GENRE, metadataAlbumValues.getGenre()); - assertEquals(YEAR, metadataAlbumValues.getYear()); - assertEquals(TRACKS, metadataAlbumValues.getTracks()); - assertEquals(CD, metadataAlbumValues.getCd()); - assertEquals(CDS, metadataAlbumValues.getCds()); - assertEquals(coverArt, metadataAlbumValues.getCoverArt()); - } - + private static final String GENRE = "Trance"; + private static final String ARTIST = "Cosmic Gate"; + private static final String ALBUM = "Sign Of The Times (Deluxe Edition)"; + private static final String YEAR = "2010"; + private static final String TRACKS = "34"; + private static final String CD = "1"; + private static final String CDS = "1"; + + private final MetadataAlbumValues metadataAlbumValues = new MetadataAlbumValues(); + + @Mock private Image coverArt; + + @Test + public void shouldCreateAMetadataAlbumValues() { + metadataAlbumValues.setArtist(ARTIST); + metadataAlbumValues.setAlbum(ALBUM); + metadataAlbumValues.setGenre(GENRE); + metadataAlbumValues.setYear(YEAR); + metadataAlbumValues.setTracks(TRACKS); + metadataAlbumValues.setCd(CD); + metadataAlbumValues.setCds(CDS); + metadataAlbumValues.setCoverArt(coverArt); + + assertEquals(ARTIST, metadataAlbumValues.getArtist()); + assertEquals(ALBUM, metadataAlbumValues.getAlbum()); + assertEquals(GENRE, metadataAlbumValues.getGenre()); + assertEquals(YEAR, metadataAlbumValues.getYear()); + assertEquals(TRACKS, metadataAlbumValues.getTracks()); + assertEquals(CD, metadataAlbumValues.getCd()); + assertEquals(CDS, metadataAlbumValues.getCds()); + assertEquals(coverArt, metadataAlbumValues.getCoverArt()); + } } diff --git a/src/test/java/com/josdem/jmetadata/model/TestUser.java b/src/test/java/com/josdem/jmetadata/model/TestUser.java index 555bef1..183dbd8 100644 --- a/src/test/java/com/josdem/jmetadata/model/TestUser.java +++ b/src/test/java/com/josdem/jmetadata/model/TestUser.java @@ -16,6 +16,7 @@ package com.josdem.jmetadata.model; +import static org.junit.jupiter.api.Assertions.assertEquals; import de.umass.lastfm.Session; import org.junit.jupiter.api.BeforeEach; @@ -23,32 +24,28 @@ import org.mockito.Mock; import org.mockito.MockitoAnnotations; -import static org.junit.jupiter.api.Assertions.assertEquals; - - class TestUser { - private User user; - private final String username = "josdem"; - private final String password = "password"; - - @Mock - private Session session; - - @BeforeEach - public void setup() throws Exception { - MockitoAnnotations.initMocks(this); - user = new User(username, password); - } - - @Test - public void shouldGetUsernameAndPassword() throws Exception { - assertEquals(username, user.getUsername()); - assertEquals(password, user.getPassword()); - } - - @Test - public void shouldGetSession() throws Exception { - user.setSession(session); - assertEquals(session, user.getSession()); - } + private User user; + private final String username = "josdem"; + private final String password = "password"; + + @Mock private Session session; + + @BeforeEach + public void setup() throws Exception { + MockitoAnnotations.initMocks(this); + user = new User(username, password); + } + + @Test + public void shouldGetUsernameAndPassword() throws Exception { + assertEquals(username, user.getUsername()); + assertEquals(password, user.getPassword()); + } + + @Test + public void shouldGetSession() throws Exception { + user.setSession(session); + assertEquals(session, user.getSession()); + } } diff --git a/src/test/java/com/josdem/jmetadata/service/MusicBrainzServiceTest.java b/src/test/java/com/josdem/jmetadata/service/MusicBrainzServiceTest.java index 6049693..2a117b0 100644 --- a/src/test/java/com/josdem/jmetadata/service/MusicBrainzServiceTest.java +++ b/src/test/java/com/josdem/jmetadata/service/MusicBrainzServiceTest.java @@ -16,12 +16,18 @@ package com.josdem.jmetadata.service; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.mockito.Mockito.when; + import com.josdem.jmetadata.exception.BusinessException; import com.josdem.jmetadata.model.Album; import com.josdem.jmetadata.model.MusicBrainzResponse; import com.josdem.jmetadata.model.Release; import com.josdem.jmetadata.service.impl.MusicBrainzServiceImpl; import com.josdem.jmetadata.util.ApplicationState; +import java.io.IOException; +import java.util.List; import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; @@ -33,64 +39,54 @@ import retrofit2.Call; import retrofit2.Response; -import java.io.IOException; -import java.util.List; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.mockito.Mockito.when; - @Slf4j public class MusicBrainzServiceTest { - private static final String ALBUM_NAME = "Night Life"; - private static final String ALBUM_ID = "b04558a9-b69c-45bd-a6f4-d65706067780"; - - @InjectMocks - private final MusicBrainzService musicBrainzService = new MusicBrainzServiceImpl(); - - @Mock - private RestService restService; - - @Mock - private Call call; - - @BeforeEach - void setup() { - MockitoAnnotations.openMocks(this); - MusicBrainzResponse musicBrainzResponse = getExpectedResponse(); - ApplicationState.cache.put("Night Life", musicBrainzResponse); - } - - @Test - @DisplayName("getting release id by name") - void shouldGetReleaseIdByName(TestInfo testInfo) throws Exception { - log.info(testInfo.getDisplayName()); - var expectedAlbum = new Album(); - expectedAlbum.setId(ALBUM_ID); - when(call.execute()).thenReturn(Response.success(expectedAlbum)); - when(restService.getRelease(ALBUM_ID)).thenReturn(call); - - var result = musicBrainzService.getAlbumByName(ALBUM_NAME); - assertEquals(ALBUM_ID, result.getId()); - } - - @Test - @DisplayName("not getting release id by name due to exception") - void shouldNotGetReleaseIdByNameDueToException(TestInfo testInfo) throws Exception { - log.info(testInfo.getDisplayName()); - when(call.execute()).thenThrow(new IOException("Error")); - when(restService.getRelease(ALBUM_ID)).thenReturn(call); - - assertThrows(BusinessException.class, () -> musicBrainzService.getAlbumByName(ALBUM_NAME)); - } - - private MusicBrainzResponse getExpectedResponse() { - var musicBrainzResponse = new MusicBrainzResponse(); - Release release = new Release(); - release.setId(ALBUM_ID); - var releases = List.of(release); - musicBrainzResponse.setReleases(releases); - return musicBrainzResponse; - } + private static final String ALBUM_NAME = "Night Life"; + private static final String ALBUM_ID = "b04558a9-b69c-45bd-a6f4-d65706067780"; + + @InjectMocks private final MusicBrainzService musicBrainzService = new MusicBrainzServiceImpl(); + + @Mock private RestService restService; + + @Mock private Call call; + + @BeforeEach + void setup() { + MockitoAnnotations.openMocks(this); + MusicBrainzResponse musicBrainzResponse = getExpectedResponse(); + ApplicationState.cache.put("Night Life", musicBrainzResponse); + } + + @Test + @DisplayName("getting release id by name") + void shouldGetReleaseIdByName(TestInfo testInfo) throws Exception { + log.info(testInfo.getDisplayName()); + var expectedAlbum = new Album(); + expectedAlbum.setId(ALBUM_ID); + when(call.execute()).thenReturn(Response.success(expectedAlbum)); + when(restService.getRelease(ALBUM_ID)).thenReturn(call); + + var result = musicBrainzService.getAlbumByName(ALBUM_NAME); + assertEquals(ALBUM_ID, result.getId()); + } + + @Test + @DisplayName("not getting release id by name due to exception") + void shouldNotGetReleaseIdByNameDueToException(TestInfo testInfo) throws Exception { + log.info(testInfo.getDisplayName()); + when(call.execute()).thenThrow(new IOException("Error")); + when(restService.getRelease(ALBUM_ID)).thenReturn(call); + + assertThrows(BusinessException.class, () -> musicBrainzService.getAlbumByName(ALBUM_NAME)); + } + + private MusicBrainzResponse getExpectedResponse() { + var musicBrainzResponse = new MusicBrainzResponse(); + Release release = new Release(); + release.setId(ALBUM_ID); + var releases = List.of(release); + musicBrainzResponse.setReleases(releases); + return musicBrainzResponse; + } } diff --git a/src/test/java/com/josdem/jmetadata/service/TestDefaultService.java b/src/test/java/com/josdem/jmetadata/service/TestDefaultService.java index f75f6c4..49bf6c7 100644 --- a/src/test/java/com/josdem/jmetadata/service/TestDefaultService.java +++ b/src/test/java/com/josdem/jmetadata/service/TestDefaultService.java @@ -16,11 +16,19 @@ package com.josdem.jmetadata.service; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import com.josdem.jmetadata.model.Metadata; +import com.josdem.jmetadata.service.impl.DefaultServiceImpl; +import java.util.ArrayList; +import java.util.List; import org.apache.commons.lang3.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import com.josdem.jmetadata.model.Metadata; -import com.josdem.jmetadata.service.impl.DefaultServiceImpl; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -29,157 +37,144 @@ import org.mockito.Mock; import org.mockito.MockitoAnnotations; -import java.util.ArrayList; -import java.util.List; - -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertTrue; -import static org.mockito.Mockito.never; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; - class TestDefaultService { - private static final String TOTAL_TRACKS = "2"; - private static final String TRACK_NUMBER_METADATA_ONE = "1"; - private static final String CD_NUMBER = "1"; - private static final String TOTAL_CD_NUMBER = "1"; - private static final Log log = LogFactory.getLog(TestDefaultService.class); - - @InjectMocks - private final DefaultService defaultService = new DefaultServiceImpl(); - - @Mock - private Metadata metadata_one; - @Mock - private Metadata metadata_two; - @Mock - private MetadataService metadataService; - - private final List metadatas = new ArrayList<>(); - - @BeforeEach - public void setup() throws Exception { - MockitoAnnotations.initMocks(this); - } - - @Test - @DisplayName("validating we can complete metadata due to we do not have total tracks") - public void shouldCompleteTotalTracks(TestInfo testInfo) throws Exception { - log.info("Running test: {}" + testInfo.getDisplayName()); - when(metadata_one.getCdNumber()).thenReturn(CD_NUMBER); - when(metadata_two.getCdNumber()).thenReturn(CD_NUMBER); - when(metadata_one.getTotalCds()).thenReturn(TOTAL_CD_NUMBER); - when(metadata_two.getTotalCds()).thenReturn(TOTAL_CD_NUMBER); - setTracksNumberExpectations(); - when(metadataService.isSameAlbum(metadatas)).thenReturn(true); - - assertTrue(defaultService.isCompletable(metadatas)); - } - - @Test - @DisplayName("validating we can complete metadata due to we do not have cd number") - public void shouldCompleteCdNumber(TestInfo testInfo) throws Exception { - log.info("Running test: {}" + testInfo.getDisplayName()); - when(metadata_one.getTotalTracks()).thenReturn(TOTAL_TRACKS); - when(metadata_two.getTotalTracks()).thenReturn(TOTAL_TRACKS); - when(metadata_one.getTotalCds()).thenReturn(TOTAL_CD_NUMBER); - when(metadata_two.getTotalCds()).thenReturn(TOTAL_CD_NUMBER); - setTracksNumberExpectations(); - when(metadataService.isSameAlbum(metadatas)).thenReturn(true); - - assertTrue(defaultService.isCompletable(metadatas)); - } - - @Test - @DisplayName("validating we can complete metadata due to we do not have total cds") - public void shouldCompleteTotalCds(TestInfo testInfo) throws Exception { - log.info("Running test: {}" + testInfo.getDisplayName()); - when(metadata_one.getTotalTracks()).thenReturn(TOTAL_TRACKS); - when(metadata_two.getTotalTracks()).thenReturn(TOTAL_TRACKS); - when(metadata_one.getCdNumber()).thenReturn(CD_NUMBER); - when(metadata_two.getCdNumber()).thenReturn(CD_NUMBER); - setTracksNumberExpectations(); - when(metadataService.isSameAlbum(metadatas)).thenReturn(true); - - assertTrue(defaultService.isCompletable(metadatas)); - } - - @Test - @DisplayName("validating we can not complete metadata due to we have one track") - public void shouldNotCompleteIfSingleTrack(TestInfo testInfo) throws Exception { - log.info("Running test: {}" + testInfo.getDisplayName()); - var metadatas = new ArrayList(); - - when(metadata_one.getCdNumber()).thenReturn(CD_NUMBER); - when(metadata_two.getCdNumber()).thenReturn(CD_NUMBER); - when(metadata_one.getTotalCds()).thenReturn(TOTAL_CD_NUMBER); - when(metadata_two.getTotalCds()).thenReturn(TOTAL_CD_NUMBER); - when(metadata_one.getTotalTracks()).thenReturn(TOTAL_TRACKS); - when(metadata_two.getTotalTracks()).thenReturn(TOTAL_TRACKS); - when(metadataService.isSameAlbum(metadatas)).thenReturn(true); - metadatas.add(metadata_one); - - defaultService.isCompletable(metadatas); - - verify(metadata_one, never()).setTotalTracks(TOTAL_TRACKS); - verify(metadata_one, never()).setCdNumber(CD_NUMBER); - verify(metadata_one, never()).setTotalCds(TOTAL_CD_NUMBER); - } - - @Test - @DisplayName("completing metadata") - public void shouldComplete(TestInfo testInfo) throws Exception { - log.info("Running test: {}" + testInfo.getDisplayName()); - when(metadataService.isSameAlbum(metadatas)).thenReturn(true); - setTracksNumberExpectations(); - - defaultService.complete(metadatas); - - verify(metadata_one).setTotalTracks(TOTAL_TRACKS); - verify(metadata_one).setCdNumber(CD_NUMBER); - verify(metadata_one).setTotalCds(TOTAL_CD_NUMBER); - verify(metadata_two).setTotalTracks(TOTAL_TRACKS); - verify(metadata_two).setCdNumber(CD_NUMBER); - verify(metadata_two).setTotalCds(TOTAL_CD_NUMBER); - } - - @Test - @DisplayName("validating we do not need to complete metadata") - public void shouldNotCompleteMetadataWhenNoNecessary(TestInfo testInfo) throws Exception { - log.info("Running test: {}" + testInfo.getDisplayName()); - when(metadata_one.getTotalTracks()).thenReturn(TOTAL_TRACKS); - when(metadata_two.getTotalTracks()).thenReturn(TOTAL_TRACKS); - when(metadata_one.getCdNumber()).thenReturn(CD_NUMBER); - when(metadata_two.getCdNumber()).thenReturn(CD_NUMBER); - when(metadata_one.getTotalCds()).thenReturn(TOTAL_CD_NUMBER); - when(metadata_two.getTotalCds()).thenReturn(TOTAL_CD_NUMBER); - when(metadataService.isSameAlbum(metadatas)).thenReturn(true); - - assertFalse(defaultService.isCompletable(metadatas)); - } - - @Test - @DisplayName("validating we cannot complete metadata due to not having track number") - public void shouldNotCompleteWhenNoTrackNumber(TestInfo testInfo) { - log.info("Running test: {}" + testInfo.getDisplayName()); - when(metadata_one.getTrackNumber()).thenReturn(StringUtils.EMPTY); - when(metadata_two.getTrackNumber()).thenReturn(StringUtils.EMPTY); - metadatas.add(metadata_one); - metadatas.add(metadata_two); - - defaultService.complete(metadatas); - - verify(metadata_one, never()).setCdNumber(CD_NUMBER); - verify(metadata_one, never()).setTotalCds(TOTAL_CD_NUMBER); - verify(metadata_two, never()).setCdNumber(CD_NUMBER); - verify(metadata_two, never()).setTotalCds(TOTAL_CD_NUMBER); - } - - private void setTracksNumberExpectations() { - when(metadata_one.getTrackNumber()).thenReturn(TRACK_NUMBER_METADATA_ONE); - when(metadata_two.getTrackNumber()).thenReturn(TOTAL_TRACKS); - metadatas.add(metadata_one); - metadatas.add(metadata_two); - } + private static final String TOTAL_TRACKS = "2"; + private static final String TRACK_NUMBER_METADATA_ONE = "1"; + private static final String CD_NUMBER = "1"; + private static final String TOTAL_CD_NUMBER = "1"; + private static final Log log = LogFactory.getLog(TestDefaultService.class); + + @InjectMocks private final DefaultService defaultService = new DefaultServiceImpl(); + + @Mock private Metadata metadata_one; + @Mock private Metadata metadata_two; + @Mock private MetadataService metadataService; + + private final List metadatas = new ArrayList<>(); + + @BeforeEach + public void setup() throws Exception { + MockitoAnnotations.initMocks(this); + } + + @Test + @DisplayName("validating we can complete metadata due to we do not have total tracks") + public void shouldCompleteTotalTracks(TestInfo testInfo) throws Exception { + log.info("Running test: {}" + testInfo.getDisplayName()); + when(metadata_one.getCdNumber()).thenReturn(CD_NUMBER); + when(metadata_two.getCdNumber()).thenReturn(CD_NUMBER); + when(metadata_one.getTotalCds()).thenReturn(TOTAL_CD_NUMBER); + when(metadata_two.getTotalCds()).thenReturn(TOTAL_CD_NUMBER); + setTracksNumberExpectations(); + when(metadataService.isSameAlbum(metadatas)).thenReturn(true); + + assertTrue(defaultService.isCompletable(metadatas)); + } + + @Test + @DisplayName("validating we can complete metadata due to we do not have cd number") + public void shouldCompleteCdNumber(TestInfo testInfo) throws Exception { + log.info("Running test: {}" + testInfo.getDisplayName()); + when(metadata_one.getTotalTracks()).thenReturn(TOTAL_TRACKS); + when(metadata_two.getTotalTracks()).thenReturn(TOTAL_TRACKS); + when(metadata_one.getTotalCds()).thenReturn(TOTAL_CD_NUMBER); + when(metadata_two.getTotalCds()).thenReturn(TOTAL_CD_NUMBER); + setTracksNumberExpectations(); + when(metadataService.isSameAlbum(metadatas)).thenReturn(true); + + assertTrue(defaultService.isCompletable(metadatas)); + } + + @Test + @DisplayName("validating we can complete metadata due to we do not have total cds") + public void shouldCompleteTotalCds(TestInfo testInfo) throws Exception { + log.info("Running test: {}" + testInfo.getDisplayName()); + when(metadata_one.getTotalTracks()).thenReturn(TOTAL_TRACKS); + when(metadata_two.getTotalTracks()).thenReturn(TOTAL_TRACKS); + when(metadata_one.getCdNumber()).thenReturn(CD_NUMBER); + when(metadata_two.getCdNumber()).thenReturn(CD_NUMBER); + setTracksNumberExpectations(); + when(metadataService.isSameAlbum(metadatas)).thenReturn(true); + + assertTrue(defaultService.isCompletable(metadatas)); + } + + @Test + @DisplayName("validating we can not complete metadata due to we have one track") + public void shouldNotCompleteIfSingleTrack(TestInfo testInfo) throws Exception { + log.info("Running test: {}" + testInfo.getDisplayName()); + var metadatas = new ArrayList(); + + when(metadata_one.getCdNumber()).thenReturn(CD_NUMBER); + when(metadata_two.getCdNumber()).thenReturn(CD_NUMBER); + when(metadata_one.getTotalCds()).thenReturn(TOTAL_CD_NUMBER); + when(metadata_two.getTotalCds()).thenReturn(TOTAL_CD_NUMBER); + when(metadata_one.getTotalTracks()).thenReturn(TOTAL_TRACKS); + when(metadata_two.getTotalTracks()).thenReturn(TOTAL_TRACKS); + when(metadataService.isSameAlbum(metadatas)).thenReturn(true); + metadatas.add(metadata_one); + + defaultService.isCompletable(metadatas); + + verify(metadata_one, never()).setTotalTracks(TOTAL_TRACKS); + verify(metadata_one, never()).setCdNumber(CD_NUMBER); + verify(metadata_one, never()).setTotalCds(TOTAL_CD_NUMBER); + } + + @Test + @DisplayName("completing metadata") + public void shouldComplete(TestInfo testInfo) throws Exception { + log.info("Running test: {}" + testInfo.getDisplayName()); + when(metadataService.isSameAlbum(metadatas)).thenReturn(true); + setTracksNumberExpectations(); + + defaultService.complete(metadatas); + + verify(metadata_one).setTotalTracks(TOTAL_TRACKS); + verify(metadata_one).setCdNumber(CD_NUMBER); + verify(metadata_one).setTotalCds(TOTAL_CD_NUMBER); + verify(metadata_two).setTotalTracks(TOTAL_TRACKS); + verify(metadata_two).setCdNumber(CD_NUMBER); + verify(metadata_two).setTotalCds(TOTAL_CD_NUMBER); + } + + @Test + @DisplayName("validating we do not need to complete metadata") + public void shouldNotCompleteMetadataWhenNoNecessary(TestInfo testInfo) throws Exception { + log.info("Running test: {}" + testInfo.getDisplayName()); + when(metadata_one.getTotalTracks()).thenReturn(TOTAL_TRACKS); + when(metadata_two.getTotalTracks()).thenReturn(TOTAL_TRACKS); + when(metadata_one.getCdNumber()).thenReturn(CD_NUMBER); + when(metadata_two.getCdNumber()).thenReturn(CD_NUMBER); + when(metadata_one.getTotalCds()).thenReturn(TOTAL_CD_NUMBER); + when(metadata_two.getTotalCds()).thenReturn(TOTAL_CD_NUMBER); + when(metadataService.isSameAlbum(metadatas)).thenReturn(true); + + assertFalse(defaultService.isCompletable(metadatas)); + } + + @Test + @DisplayName("validating we cannot complete metadata due to not having track number") + public void shouldNotCompleteWhenNoTrackNumber(TestInfo testInfo) { + log.info("Running test: {}" + testInfo.getDisplayName()); + when(metadata_one.getTrackNumber()).thenReturn(StringUtils.EMPTY); + when(metadata_two.getTrackNumber()).thenReturn(StringUtils.EMPTY); + metadatas.add(metadata_one); + metadatas.add(metadata_two); + + defaultService.complete(metadatas); + + verify(metadata_one, never()).setCdNumber(CD_NUMBER); + verify(metadata_one, never()).setTotalCds(TOTAL_CD_NUMBER); + verify(metadata_two, never()).setCdNumber(CD_NUMBER); + verify(metadata_two, never()).setTotalCds(TOTAL_CD_NUMBER); + } + + private void setTracksNumberExpectations() { + when(metadata_one.getTrackNumber()).thenReturn(TRACK_NUMBER_METADATA_ONE); + when(metadata_two.getTrackNumber()).thenReturn(TOTAL_TRACKS); + metadatas.add(metadata_one); + metadatas.add(metadata_two); + } } diff --git a/src/test/java/com/josdem/jmetadata/service/TestExtractService.java b/src/test/java/com/josdem/jmetadata/service/TestExtractService.java index ccd9e77..7a4f8c3 100644 --- a/src/test/java/com/josdem/jmetadata/service/TestExtractService.java +++ b/src/test/java/com/josdem/jmetadata/service/TestExtractService.java @@ -16,8 +16,13 @@ package com.josdem.jmetadata.service; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.Mockito.when; + import com.josdem.jmetadata.model.Metadata; import com.josdem.jmetadata.service.impl.ExtractServiceImpl; +import java.io.File; +import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -26,56 +31,44 @@ import org.mockito.Mock; import org.mockito.MockitoAnnotations; - -import java.io.File; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.mockito.Mockito.when; -import lombok.extern.slf4j.Slf4j; - @Slf4j - - class TestExtractService { - public static final String EXPECTED_ARTIST = "Jennifer Lopez"; - - @InjectMocks - private ExtractService extractService = new ExtractServiceImpl(); + public static final String EXPECTED_ARTIST = "Jennifer Lopez"; - @Mock - private File file; + @InjectMocks private ExtractService extractService = new ExtractServiceImpl(); - @BeforeEach - public void setup() throws Exception { - MockitoAnnotations.initMocks(this); - } + @Mock private File file; - @Test - @DisplayName("Should extract metadata from file when dash") - public void shouldExtractMetadataFromFileWhenDash(TestInfo testInfo) { - log.info(testInfo.getDisplayName()); - String filename = "Jennifer Lopez - 9A - 112.mp3"; - when(file.getName()).thenReturn(filename); + @BeforeEach + public void setup() throws Exception { + MockitoAnnotations.initMocks(this); + } - Metadata result = extractService.extractFromFileName(file); + @Test + @DisplayName("Should extract metadata from file when dash") + public void shouldExtractMetadataFromFileWhenDash(TestInfo testInfo) { + log.info(testInfo.getDisplayName()); + String filename = "Jennifer Lopez - 9A - 112.mp3"; + when(file.getName()).thenReturn(filename); - assertEquals(EXPECTED_ARTIST, result.getArtist()); - assertEquals("9A", result.getTitle()); - } + Metadata result = extractService.extractFromFileName(file); - @Test - @DisplayName("Should extract metadata from file when no dash") - public void shouldExtractMetadataFromFileWhenNoDash(TestInfo testInfo) { - log.info(testInfo.getDisplayName()); - String expectedName = EXPECTED_ARTIST; - String filename = "Jennifer Lopez.mp3"; - when(file.getName()).thenReturn(filename); + assertEquals(EXPECTED_ARTIST, result.getArtist()); + assertEquals("9A", result.getTitle()); + } - Metadata result = extractService.extractFromFileName(file); + @Test + @DisplayName("Should extract metadata from file when no dash") + public void shouldExtractMetadataFromFileWhenNoDash(TestInfo testInfo) { + log.info(testInfo.getDisplayName()); + String expectedName = EXPECTED_ARTIST; + String filename = "Jennifer Lopez.mp3"; + when(file.getName()).thenReturn(filename); - assertEquals(expectedName, result.getArtist()); - assertEquals(expectedName, result.getTitle()); - } + Metadata result = extractService.extractFromFileName(file); + assertEquals(expectedName, result.getArtist()); + assertEquals(expectedName, result.getTitle()); + } } diff --git a/src/test/java/com/josdem/jmetadata/service/TestFormatterService.java b/src/test/java/com/josdem/jmetadata/service/TestFormatterService.java index 4d9ab7d..b4b68f5 100644 --- a/src/test/java/com/josdem/jmetadata/service/TestFormatterService.java +++ b/src/test/java/com/josdem/jmetadata/service/TestFormatterService.java @@ -16,6 +16,10 @@ package com.josdem.jmetadata.service; +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; import com.josdem.jmetadata.helper.ApplicationContextSingleton; import com.josdem.jmetadata.helper.FormatterHelper; @@ -32,786 +36,770 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.ContextConfiguration; -import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.junit.jupiter.api.Assertions.assertTrue; - @Slf4j @SpringBootTest -@ContextConfiguration(classes = {ApplicationContextSingleton.class, FormatterServiceImpl.class, FormatterHelper.class}) +@ContextConfiguration( + classes = { + ApplicationContextSingleton.class, + FormatterServiceImpl.class, + FormatterHelper.class + }) @RequiredArgsConstructor(onConstructor_ = @Autowired) class TestFormatterService { - private final FormatterService formatter; - - private final String badFormatA = "¿Cuándo?"; - private final String badFormatAExpected = "¿Cuándo?"; - private final String badFormatE = "¿Qué?"; - private final String badFormatEExpected = "¿Qué?"; - private final String badFormatI = "mí"; - private final String badFormatIExpected = "mí"; - private final String badFormatO = "¿Cómo?"; - private final String bFormatOExpected = "¿Cómo?"; - private final String badFormatU = "tú"; - private final String badFormatUExpected = "tú"; - private final String badFormatAcute = "What´s The Time"; - private final String badFormatAcuteExpected = "What's The Time"; - private final String artist = "angel tears"; - private final String expectedArtist = "Angel Tears"; - private final String title = "legends of the fall"; - private final String expectedTitle = "Legends Of The Fall"; - private final String album = "vision"; - private final String expectedAlbum = "Vision"; - - private final Metadata metadata = new Metadata(); - - @BeforeEach - public void setup() throws Exception { - metadata.setArtist(artist); - metadata.setTitle(title); - metadata.setAlbum(album); - } - - @Test - @DisplayName("validating a accent mark title") - public void shouldDetectAaccentMarkTitle(TestInfo testInfo) { - log.info(testInfo.getDisplayName()); - metadata.setTitle(badFormatA); - - assertTrue(formatter.wasFormatted(metadata)); - assertEquals(badFormatAExpected, metadata.getTitle()); - - } - - @Test - @DisplayName("validating e accent mark title") - public void shouldDetectEaccentMarkTitle(TestInfo testInfo) { - log.info(testInfo.getDisplayName()); - metadata.setTitle(badFormatE); - - assertTrue(formatter.wasFormatted(metadata)); - assertEquals(badFormatEExpected, metadata.getTitle()); - - } - - @Test - @DisplayName("validating i accent mark title") - public void shouldDetectIaccentMarkTitle(TestInfo testInfo) { - log.info(testInfo.getDisplayName()); - metadata.setTitle(badFormatI); - - assertTrue(formatter.wasFormatted(metadata)); - assertEquals(badFormatIExpected, metadata.getTitle()); - - } - - @Test - @DisplayName("validating o accent mark title") - public void shouldDetectOaccentMarkTitle(TestInfo testInfo) { - log.info(testInfo.getDisplayName()); - metadata.setTitle(badFormatO); - - assertTrue(formatter.wasFormatted(metadata)); - assertEquals(bFormatOExpected, metadata.getTitle()); - - } - - @Test - @DisplayName("validating u accent mark title") - public void shouldDetectUaccentMarkTitle(TestInfo testInfo) { - log.info(testInfo.getDisplayName()); - metadata.setTitle(badFormatU); - - assertTrue(formatter.wasFormatted(metadata)); - assertEquals(badFormatUExpected, metadata.getTitle()); - - } - - @Test - @DisplayName("validating a accent mark artist") - public void shouldDetectAaccentMarkArtist(TestInfo testInfo) { - log.info(testInfo.getDisplayName()); - metadata.setArtist(badFormatA); - - assertTrue(formatter.wasFormatted(metadata)); - assertEquals(badFormatAExpected, metadata.getArtist()); - - } - - @Test - @DisplayName("validating e accent mark artist") - public void shouldDetectEaccentMarkArtist(TestInfo testInfo) { - log.info(testInfo.getDisplayName()); - metadata.setArtist(badFormatE); - - assertTrue(formatter.wasFormatted(metadata)); - assertEquals(badFormatEExpected, metadata.getArtist()); - - } - - @Test - @DisplayName("validating i accent mark artist") - public void shouldDetectIaccentMarkArtist(TestInfo testInfo) { - log.info(testInfo.getDisplayName()); - metadata.setArtist(badFormatI); - - assertTrue(formatter.wasFormatted(metadata)); - assertEquals(badFormatIExpected, metadata.getArtist()); - - } - - @Test - @DisplayName("validating o accent mark artist") - public void shouldDetectOaccentMarkArtist(TestInfo testInfo) { - log.info(testInfo.getDisplayName()); - metadata.setArtist(badFormatO); - - assertTrue(formatter.wasFormatted(metadata)); - assertEquals(bFormatOExpected, metadata.getArtist()); - - } - - @Test - @DisplayName("validating u accent mark artist") - public void shouldDetectUaccentMarkArtist(TestInfo testInfo) { - log.info(testInfo.getDisplayName()); - metadata.setArtist(badFormatU); - - assertTrue(formatter.wasFormatted(metadata)); - assertEquals(badFormatUExpected, metadata.getArtist()); - } - - @Test - @DisplayName("validating a accent mark album") - public void shouldDetectAaccentMarkAlbum(TestInfo testInfo) { - log.info(testInfo.getDisplayName()); - metadata.setAlbum(badFormatA); - - assertTrue(formatter.wasFormatted(metadata)); - assertEquals(badFormatAExpected, metadata.getAlbum()); - } - - @Test - @DisplayName("validating e accent mark album") - public void shouldDetectEaccentMarkAlbum(TestInfo testInfo) { - log.info(testInfo.getDisplayName()); - metadata.setAlbum(badFormatE); - - assertTrue(formatter.wasFormatted(metadata)); - assertEquals(badFormatEExpected, metadata.getAlbum()); - - } - - @Test - @DisplayName("validating i accent mark album") - public void shouldDetectIaccentMarkAlbum(TestInfo testInfo) { - log.info(testInfo.getDisplayName()); - metadata.setAlbum(badFormatI); - - assertTrue(formatter.wasFormatted(metadata)); - assertEquals(badFormatIExpected, metadata.getAlbum()); - - } - - @Test - @DisplayName("validating o accent mark album") - public void shouldDetectOaccentMarkAlbum(TestInfo testInfo) { - log.info(testInfo.getDisplayName()); - metadata.setAlbum(badFormatO); - - assertTrue(formatter.wasFormatted(metadata)); - assertEquals(bFormatOExpected, metadata.getAlbum()); - - } - - @Test - @DisplayName("validating u accent mark album") - public void shouldDetectUaccentMarkAlbum(TestInfo testInfo) { - log.info(testInfo.getDisplayName()); - metadata.setAlbum(badFormatU); - - assertTrue(formatter.wasFormatted(metadata)); - assertEquals(badFormatUExpected, metadata.getAlbum()); - - } - - @Test - @DisplayName("validating when title is without capital letters") - public void shouldCapitalizeTitle(TestInfo testInfo) { - log.info(testInfo.getDisplayName()); - metadata.setTitle(title); - - assertTrue(formatter.wasCamelized(metadata)); - assertEquals(expectedTitle, metadata.getTitle()); - } - - @Test - @DisplayName("validating when artist is without capital letters") - public void shouldCapitalizeArtist(TestInfo testInfo) { - log.info(testInfo.getDisplayName()); - metadata.setArtist(artist); - - assertTrue(formatter.wasCamelized(metadata)); - assertEquals(expectedArtist, metadata.getArtist()); - } - - @Test - @DisplayName("validating when album is without capital letters") - public void shouldCapitalizeAlbum(TestInfo testInfo) { - log.info(testInfo.getDisplayName()); - metadata.setAlbum(album); - - assertTrue(formatter.wasCamelized(metadata)); - assertEquals(expectedAlbum, metadata.getAlbum()); - } - - @Test - @DisplayName("validating when album is all in capital letters") - public void shouldCapitalizeAlbumWhenUppercase(TestInfo testInfo) { - log.info(testInfo.getDisplayName()); - metadata.setAlbum(album.toUpperCase()); - - assertTrue(formatter.wasCamelized(metadata)); - assertEquals(expectedAlbum, metadata.getAlbum()); - } - - @Test - @DisplayName("validating when title is all in capital letters") - public void shouldCapitalizeTitleWhenUppercase(TestInfo testInfo) { - log.info(testInfo.getDisplayName()); - metadata.setTitle(title.toUpperCase()); - - assertTrue(formatter.wasCamelized(metadata)); - assertEquals(expectedTitle, metadata.getTitle()); - } - - @Test - @DisplayName("validating when artist is all in capital letters") - public void shouldCapitalizeArtistWhenUppercase(TestInfo testInfo) { - log.info(testInfo.getDisplayName()); - metadata.setArtist(artist.toUpperCase()); - - assertTrue(formatter.wasCamelized(metadata)); - assertEquals(expectedArtist, metadata.getArtist()); - } - - @Test - @DisplayName("validating when artist has a dash") - public void shouldCapitalizeArtistWhenDash(TestInfo testInfo) { - log.info(testInfo.getDisplayName()); - var artist = "de-pazz"; - var artistExpected = "De-pazz"; - - metadata.setArtist(artist); - - assertTrue(formatter.wasCamelized(metadata)); - assertEquals(artistExpected, metadata.getArtist()); - } - - @Test - @DisplayName("validating when title has a dash") - public void shouldCapitalizeTitleWhenDash(TestInfo testInfo) { - log.info(testInfo.getDisplayName()); - var title = "blue-eyed"; - var titleExpected = "Blue-eyed"; - - metadata.setTitle(title); - - assertTrue(formatter.wasCamelized(metadata)); - assertEquals(titleExpected, metadata.getTitle()); - } - - @Test - @DisplayName("validating when album has a dash") - public void shouldCapitalizeAlbumWhenDash(TestInfo testInfo) { - log.info(testInfo.getDisplayName()); - var album = "blue-eyed"; - var albumExpected = "Blue-eyed"; - - metadata.setAlbum(album); - - assertTrue(formatter.wasCamelized(metadata)); - assertEquals(albumExpected, metadata.getAlbum()); - } - - @Test - @DisplayName("validating apostrophe in title") - public void shouldDetectAcuteMarkTitle(TestInfo testInfo) { - log.info(testInfo.getDisplayName()); - metadata.setTitle(badFormatAcute); - - assertTrue(formatter.wasFormatted(metadata)); - assertEquals(badFormatAcuteExpected, metadata.getTitle()); - - } - - @Test - @DisplayName("validating apostrophe in artist") - public void shouldDetectAcuteMarkArtist(TestInfo testInfo) { - log.info(testInfo.getDisplayName()); - metadata.setArtist(badFormatAcute); - - assertTrue(formatter.wasFormatted(metadata)); - assertEquals(badFormatAcuteExpected, metadata.getArtist()); - } - - @Test - @DisplayName("validating apostrophe in album") - public void shouldDetectAcuteMarkAlbum(TestInfo testInfo) { - log.info(testInfo.getDisplayName()); - metadata.setAlbum(badFormatAcute); - - assertTrue(formatter.wasFormatted(metadata)); - assertEquals(badFormatAcuteExpected, metadata.getAlbum()); - } - - @Test - @DisplayName("adding missing capital letters") - public void shouldAddCapitalLettersWhenParenthesis(TestInfo testInfo) { - log.info(testInfo.getDisplayName()); - var title = "as the rush comes (chillout mix)"; - var expectedTitle = "As The Rush Comes (chillout Mix)"; - - metadata.setTitle(title); - - assertTrue(formatter.wasCamelized(metadata)); - assertEquals(expectedTitle, metadata.getTitle()); - } - - @Test - @DisplayName("adding missing capital letters") - public void shouldAddCapitalLettersWhenNumbers(TestInfo testInfo) { - log.info(testInfo.getDisplayName()); - var title = "rabbit in your headlights (3d mix)"; - var expectedTitle = "Rabbit In Your Headlights (3d Mix)"; - - metadata.setTitle(title); - - assertTrue(formatter.wasCamelized(metadata)); - assertEquals(expectedTitle, metadata.getTitle()); - } - - @Test - @DisplayName("adding missing capital letters when apostrophe") - public void shouldAddCapitalLettersWhenApostrophe(TestInfo testInfo) { - log.info(testInfo.getDisplayName()); - var title = "jesu, joy of man's desiring"; - var expectedTitle = "Jesu, Joy Of Man's Desiring"; - - metadata.setTitle(title); - - assertTrue(formatter.wasCamelized(metadata)); - assertEquals(expectedTitle, metadata.getTitle()); - } - - @Test - @DisplayName("validating grave accent") - public void shouldDetectGraveAccent(TestInfo testInfo) { - log.info(testInfo.getDisplayName()); - var title = "Lumières De Skye"; - var expectedTitle = "Lumieres De Skye"; - - metadata.setTitle(title); - - assertTrue(formatter.wasFormatted(metadata)); - assertEquals(expectedTitle, metadata.getTitle()); - } - - @Test - @DisplayName("validating e acute accent") - public void shouldDetectAcuteAccent(TestInfo testInfo) { - log.info(testInfo.getDisplayName()); - var title = "Le Vent d'Écosse"; - var expectedTitle = "Le Vent d'Écosse"; - - metadata.setTitle(title); - - assertTrue(formatter.wasFormatted(metadata)); - assertEquals(expectedTitle, metadata.getTitle()); - } - - @Test - @DisplayName("validating e circum-flex accent") - public void shouldDetectCircumflexAccent(TestInfo testInfo) { - log.info(testInfo.getDisplayName()); - var title = "Entre-Nous... La fête"; - var expectedTitle = "Entre-Nous... La fête"; - - metadata.setTitle(title); - - assertTrue(formatter.wasFormatted(metadata)); - assertEquals(expectedTitle, metadata.getTitle()); - } - - @Test - @DisplayName("validating u uml accent in title") - public void shouldDetectUFormatInTitle(TestInfo testInfo) { - log.info(testInfo.getDisplayName()); - var title = "Blüchel & von Deylen"; - var expectedTitle = "Blüchel & von Deylen"; - - metadata.setTitle(title); - - assertTrue(formatter.wasFormatted(metadata)); - assertEquals(expectedTitle, metadata.getTitle()); - } - - @Test - @DisplayName("validating u uml accent in artist") - public void shouldDetectUFormatInArtist(TestInfo testInfo) { - log.info(testInfo.getDisplayName()); - var artist = "Blüchel & von Deylen"; - var expectedArtist = "Blüchel & von Deylen"; - - metadata.setArtist(artist); - - assertTrue(formatter.wasFormatted(metadata)); - assertEquals(expectedArtist, metadata.getArtist()); - } - - @Test - @DisplayName("validating u uml accent in album") - public void shouldDetectUFormatInAlbum(TestInfo testInfo) { - log.info(testInfo.getDisplayName()); - var album = "Blüchel & von Deylen"; - var expectedAlbum = "Blüchel & von Deylen"; - - metadata.setAlbum(album); - - assertTrue(formatter.wasFormatted(metadata)); - assertEquals(expectedAlbum, metadata.getAlbum()); - } - - @Test - @DisplayName("validating o uml accent in title") - public void shouldDetectOFormatInTitle(TestInfo testInfo) { - log.info(testInfo.getDisplayName()); - var title = "Popös"; - var expectedTitle = "Popös"; - - metadata.setTitle(title); - - assertTrue(formatter.wasFormatted(metadata)); - assertEquals(expectedTitle, metadata.getTitle()); - } - - @Test - @DisplayName("validating o uml accent in artist") - public void shouldDetectOFormatInArtist(TestInfo testInfo) { - log.info(testInfo.getDisplayName()); - var artist = "Popös"; - var expectedArtist = "Popös"; - - metadata.setArtist(artist); - - assertTrue(formatter.wasFormatted(metadata)); - assertEquals(expectedArtist, metadata.getArtist()); - } - - @Test - @DisplayName("validating o uml accent in album") - public void shouldDetectOFormatInAlbum(TestInfo testInfo) { - log.info(testInfo.getDisplayName()); - var album = "Popös"; - var expectedAlbum = "Popös"; - - metadata.setAlbum(album); - - assertTrue(formatter.wasFormatted(metadata)); - assertEquals(expectedAlbum, metadata.getAlbum()); - } - - @Test - @DisplayName("validating a grave accent in title") - public void shouldDetectAGraveFormatInTitle(TestInfo testInfo) { - log.info(testInfo.getDisplayName()); - var title = "Déjà Vu"; - var expectedTitle = "Déja Vu"; - - metadata.setTitle(title); - - assertTrue(formatter.wasFormatted(metadata)); - assertEquals(expectedTitle, metadata.getTitle()); - } - - @Test - @DisplayName("validating a grave accent in artist") - public void shouldDetectAGraveFormatInArtist(TestInfo testInfo) { - log.info(testInfo.getDisplayName()); - var artist = "Déjà Vu"; - var expectedArtist = "Déja Vu"; - - metadata.setArtist(artist); - - assertTrue(formatter.wasFormatted(metadata)); - assertEquals(expectedArtist, metadata.getArtist()); - } - - @Test - @DisplayName("validating a grave accent in album") - public void shouldDetectAGraveFormatInAlbum(TestInfo testInfo) { - log.info(testInfo.getDisplayName()); - var album = "Déjà Vu"; - var expectedAlbum = "Déja Vu"; - - metadata.setAlbum(album); - - assertTrue(formatter.wasFormatted(metadata)); - assertEquals(expectedAlbum, metadata.getAlbum()); - } - - @Test - @DisplayName("validating degree format in title") - public void shouldDetectDegreeFormatInTitle(TestInfo testInfo) { - log.info(testInfo.getDisplayName()); - var title = "Beatniks°"; - var expectedTitle = "Beatniks°"; - - metadata.setTitle(title); - - assertTrue(formatter.wasFormatted(metadata)); - assertEquals(expectedTitle, metadata.getTitle()); - } - - @Test - @DisplayName("validating degree format in artist") - public void shouldDetectDegreeFormatInArtist(TestInfo testInfo) { - log.info(testInfo.getDisplayName()); - var artist = "Beatniks°"; - var expectedArtist = "Beatniks°"; - - metadata.setArtist(artist); - - assertTrue(formatter.wasFormatted(metadata)); - assertEquals(expectedArtist, metadata.getArtist()); - } - - @Test - @DisplayName("validating degree format in album") - public void shouldDetectDegreeFormatInAlbum(TestInfo testInfo) { - log.info(testInfo.getDisplayName()); - var album = "Beatniks°"; - var expectedAlbum = "Beatniks°"; - - metadata.setAlbum(album); - - assertTrue(formatter.wasFormatted(metadata)); - assertEquals(expectedAlbum, metadata.getAlbum()); - } - - @Test - @DisplayName("validating n tilde in title") - public void shouldDetectEnTildeInTitle(TestInfo testInfo) { - var title = "Niña"; - var expectedTitle = "Niña"; - - metadata.setTitle(title); - - assertTrue(formatter.wasFormatted(metadata)); - assertEquals(expectedTitle, metadata.getTitle()); - } - - @Test - @DisplayName("validating n tilde in artist") - public void shouldDetectEnTildeInArtist(TestInfo testInfo) { - log.info(testInfo.getDisplayName()); - var artist = "Niña"; - var expectedArtist = "Niña"; - - metadata.setArtist(artist); - - assertTrue(formatter.wasFormatted(metadata)); - assertEquals(expectedArtist, metadata.getArtist()); - } - - @Test - @DisplayName("validating n tilde in album") - public void shouldDetectEnTildeInAlbum() { - var album = "Niña"; - var expectedAlbum = "Niña"; - - metadata.setAlbum(album); - - assertTrue(formatter.wasFormatted(metadata)); - assertEquals(expectedAlbum, metadata.getAlbum()); - } - - @Test - @DisplayName("validating a umlaut mark in title") - public void shouldDetectAUmlautMarkInTitle(TestInfo testInfo) { - log.info(testInfo.getDisplayName()); - var title = "Jähdytin"; - var expectedTitle = "Jähdytin"; - - metadata.setTitle(title); - - assertTrue(formatter.wasFormatted(metadata)); - assertEquals(expectedTitle, metadata.getTitle()); - } - - @Test - @DisplayName("validating a umlaut mark in artist") - public void shouldDetectAUmlautMarkInArtist(TestInfo testInfo) { - log.info(testInfo.getDisplayName()); - var artist = "Jähdytin"; - var expectedArtist = "Jähdytin"; - - metadata.setArtist(artist); - - assertTrue(formatter.wasFormatted(metadata)); - assertEquals(expectedArtist, metadata.getArtist()); - } - - @Test - @DisplayName("validating a umlaut mark in album") - public void shouldDetectAUmlautMarkInAlbum(TestInfo testInfo) { - log.info(testInfo.getDisplayName()); - var album = "Jähdytin"; - var expectedAlbum = "Jähdytin"; - - metadata.setAlbum(album); - - assertTrue(formatter.wasFormatted(metadata)); - assertEquals(expectedAlbum, metadata.getAlbum()); - } - - @Test - @DisplayName("validating metadata is analyzable") - public void shouldBeAnalyzable(TestInfo testInfo) { - log.info(testInfo.getDisplayName()); - var title = "Beatniks"; - var artist = "Jaytin"; - var album = "Nina"; - - metadata.setTitle(title); - metadata.setArtist(artist); - metadata.setAlbum(album); - - assertDoesNotThrow(() -> formatter.isAnalyzable(metadata)); - } - - @Test - @DisplayName("validating metadata is not analyzable due to album") - public void shouldNotBeAnalyzableDueToAlbum(TestInfo testInfo) { - log.info(testInfo.getDisplayName()); - var title = "Beatniks"; - var artist = "Jaytin"; - - metadata.setTitle(title); - metadata.setArtist(artist); - metadata.setAlbum(null); - - assertThrows(NullPointerException.class, () -> formatter.isAnalyzable(metadata)); - } - - @Test - @DisplayName("validating metadata is not analyzable due to artist") - public void shouldNotBeAnalyzableDueToArtist(TestInfo testInfo) { - log.info(testInfo.getDisplayName()); - var title = "Beatniks"; - var album = "Nina"; - - metadata.setTitle(title); - metadata.setArtist(null); - metadata.setAlbum(album); - - assertThrows(NullPointerException.class, () -> formatter.isAnalyzable(metadata)); - } - - @Test - @DisplayName("validating metadata is not analyzable due to title") - public void shouldNotBeAnalyzableDueToTitle(TestInfo testInfo) { - log.info(testInfo.getDisplayName()); - var artist = "Jaytin"; - var album = "Nina"; - - metadata.setTitle(null); - metadata.setArtist(artist); - metadata.setAlbum(album); - - assertThrows(NullPointerException.class, () -> formatter.isAnalyzable(metadata)); - } - - @Test - @DisplayName("validating a circle mark in title") - public void shouldDetectCircleInTitle(TestInfo testInfo) { - log.info(testInfo.getDisplayName()); - var title = "Jähdytin"; - var expectedTitle = "Jähdytin"; - - metadata.setTitle(title); - - assertTrue(formatter.wasFormatted(metadata)); - assertEquals(expectedTitle, metadata.getTitle()); - } - - @Test - @DisplayName("validating a circle mark in artist") - public void shouldDetectCircleInArtist(TestInfo testInfo) { - log.info(testInfo.getDisplayName()); - var artist = "Aganjû"; - var expectedArtist = "Aganjû"; - - metadata.setArtist(artist); - - assertTrue(formatter.wasFormatted(metadata)); - assertEquals(expectedArtist, metadata.getArtist()); - } - - @Test - @DisplayName("validating a circle mark in album") - public void shouldDetectCircleInAlbum(TestInfo testInfo) { - log.info(testInfo.getDisplayName()); - var album = "Aganjû"; - var expectedAlbum = "Aganjû"; - - metadata.setAlbum(album); - - assertTrue(formatter.wasFormatted(metadata)); - assertEquals(expectedAlbum, metadata.getAlbum()); - } - - @Test - @DisplayName("validating when title is empty") - public void shouldFormatTitleWhenEmpty(TestInfo testInfo) { - log.info(testInfo.getDisplayName()); - metadata.setArtist(badFormatA); - metadata.setTitle(StringUtils.EMPTY); - metadata.setAlbum(badFormatE); - - assertTrue(formatter.wasFormatted(metadata)); - } - - @Test - @DisplayName("validating when artist is empty") - public void shouldFormatArtistWhenEmpty(TestInfo testInfo) { - log.info(testInfo.getDisplayName()); - metadata.setArtist(StringUtils.EMPTY); - metadata.setTitle(badFormatA); - metadata.setAlbum(badFormatE); - - assertTrue(formatter.wasFormatted(metadata)); - } - - @Test - @DisplayName("validating when album is empty") - public void shouldFormatAlbumWhenEmpty(TestInfo testInfo) { - log.info(testInfo.getDisplayName()); - metadata.setArtist(badFormatA); - metadata.setTitle(badFormatE); - metadata.setAlbum(StringUtils.EMPTY); - - assertTrue(formatter.wasFormatted(metadata)); - } - - @Test - @DisplayName("getting duration from seconds") - public void shouldGetDuration(TestInfo testInfo) { - log.info(testInfo.getDisplayName()); - var length = 397; - var expectedDuration = "6:37"; - assertEquals(expectedDuration, formatter.getDuration(length)); - } + private final FormatterService formatter; + + private final String badFormatA = "¿Cuándo?"; + private final String badFormatAExpected = "¿Cuándo?"; + private final String badFormatE = "¿Qué?"; + private final String badFormatEExpected = "¿Qué?"; + private final String badFormatI = "mí"; + private final String badFormatIExpected = "mí"; + private final String badFormatO = "¿Cómo?"; + private final String bFormatOExpected = "¿Cómo?"; + private final String badFormatU = "tú"; + private final String badFormatUExpected = "tú"; + private final String badFormatAcute = "What´s The Time"; + private final String badFormatAcuteExpected = "What's The Time"; + private final String artist = "angel tears"; + private final String expectedArtist = "Angel Tears"; + private final String title = "legends of the fall"; + private final String expectedTitle = "Legends Of The Fall"; + private final String album = "vision"; + private final String expectedAlbum = "Vision"; + + private final Metadata metadata = new Metadata(); + + @BeforeEach + public void setup() throws Exception { + metadata.setArtist(artist); + metadata.setTitle(title); + metadata.setAlbum(album); + } + + @Test + @DisplayName("validating a accent mark title") + public void shouldDetectAaccentMarkTitle(TestInfo testInfo) { + log.info(testInfo.getDisplayName()); + metadata.setTitle(badFormatA); + + assertTrue(formatter.wasFormatted(metadata)); + assertEquals(badFormatAExpected, metadata.getTitle()); + } + + @Test + @DisplayName("validating e accent mark title") + public void shouldDetectEaccentMarkTitle(TestInfo testInfo) { + log.info(testInfo.getDisplayName()); + metadata.setTitle(badFormatE); + + assertTrue(formatter.wasFormatted(metadata)); + assertEquals(badFormatEExpected, metadata.getTitle()); + } + + @Test + @DisplayName("validating i accent mark title") + public void shouldDetectIaccentMarkTitle(TestInfo testInfo) { + log.info(testInfo.getDisplayName()); + metadata.setTitle(badFormatI); + + assertTrue(formatter.wasFormatted(metadata)); + assertEquals(badFormatIExpected, metadata.getTitle()); + } + + @Test + @DisplayName("validating o accent mark title") + public void shouldDetectOaccentMarkTitle(TestInfo testInfo) { + log.info(testInfo.getDisplayName()); + metadata.setTitle(badFormatO); + + assertTrue(formatter.wasFormatted(metadata)); + assertEquals(bFormatOExpected, metadata.getTitle()); + } + + @Test + @DisplayName("validating u accent mark title") + public void shouldDetectUaccentMarkTitle(TestInfo testInfo) { + log.info(testInfo.getDisplayName()); + metadata.setTitle(badFormatU); + + assertTrue(formatter.wasFormatted(metadata)); + assertEquals(badFormatUExpected, metadata.getTitle()); + } + + @Test + @DisplayName("validating a accent mark artist") + public void shouldDetectAaccentMarkArtist(TestInfo testInfo) { + log.info(testInfo.getDisplayName()); + metadata.setArtist(badFormatA); + + assertTrue(formatter.wasFormatted(metadata)); + assertEquals(badFormatAExpected, metadata.getArtist()); + } + + @Test + @DisplayName("validating e accent mark artist") + public void shouldDetectEaccentMarkArtist(TestInfo testInfo) { + log.info(testInfo.getDisplayName()); + metadata.setArtist(badFormatE); + + assertTrue(formatter.wasFormatted(metadata)); + assertEquals(badFormatEExpected, metadata.getArtist()); + } + + @Test + @DisplayName("validating i accent mark artist") + public void shouldDetectIaccentMarkArtist(TestInfo testInfo) { + log.info(testInfo.getDisplayName()); + metadata.setArtist(badFormatI); + + assertTrue(formatter.wasFormatted(metadata)); + assertEquals(badFormatIExpected, metadata.getArtist()); + } + + @Test + @DisplayName("validating o accent mark artist") + public void shouldDetectOaccentMarkArtist(TestInfo testInfo) { + log.info(testInfo.getDisplayName()); + metadata.setArtist(badFormatO); + + assertTrue(formatter.wasFormatted(metadata)); + assertEquals(bFormatOExpected, metadata.getArtist()); + } + + @Test + @DisplayName("validating u accent mark artist") + public void shouldDetectUaccentMarkArtist(TestInfo testInfo) { + log.info(testInfo.getDisplayName()); + metadata.setArtist(badFormatU); + + assertTrue(formatter.wasFormatted(metadata)); + assertEquals(badFormatUExpected, metadata.getArtist()); + } + + @Test + @DisplayName("validating a accent mark album") + public void shouldDetectAaccentMarkAlbum(TestInfo testInfo) { + log.info(testInfo.getDisplayName()); + metadata.setAlbum(badFormatA); + + assertTrue(formatter.wasFormatted(metadata)); + assertEquals(badFormatAExpected, metadata.getAlbum()); + } + + @Test + @DisplayName("validating e accent mark album") + public void shouldDetectEaccentMarkAlbum(TestInfo testInfo) { + log.info(testInfo.getDisplayName()); + metadata.setAlbum(badFormatE); + + assertTrue(formatter.wasFormatted(metadata)); + assertEquals(badFormatEExpected, metadata.getAlbum()); + } + + @Test + @DisplayName("validating i accent mark album") + public void shouldDetectIaccentMarkAlbum(TestInfo testInfo) { + log.info(testInfo.getDisplayName()); + metadata.setAlbum(badFormatI); + + assertTrue(formatter.wasFormatted(metadata)); + assertEquals(badFormatIExpected, metadata.getAlbum()); + } + + @Test + @DisplayName("validating o accent mark album") + public void shouldDetectOaccentMarkAlbum(TestInfo testInfo) { + log.info(testInfo.getDisplayName()); + metadata.setAlbum(badFormatO); + + assertTrue(formatter.wasFormatted(metadata)); + assertEquals(bFormatOExpected, metadata.getAlbum()); + } + + @Test + @DisplayName("validating u accent mark album") + public void shouldDetectUaccentMarkAlbum(TestInfo testInfo) { + log.info(testInfo.getDisplayName()); + metadata.setAlbum(badFormatU); + + assertTrue(formatter.wasFormatted(metadata)); + assertEquals(badFormatUExpected, metadata.getAlbum()); + } + + @Test + @DisplayName("validating when title is without capital letters") + public void shouldCapitalizeTitle(TestInfo testInfo) { + log.info(testInfo.getDisplayName()); + metadata.setTitle(title); + + assertTrue(formatter.wasCamelized(metadata)); + assertEquals(expectedTitle, metadata.getTitle()); + } + + @Test + @DisplayName("validating when artist is without capital letters") + public void shouldCapitalizeArtist(TestInfo testInfo) { + log.info(testInfo.getDisplayName()); + metadata.setArtist(artist); + + assertTrue(formatter.wasCamelized(metadata)); + assertEquals(expectedArtist, metadata.getArtist()); + } + + @Test + @DisplayName("validating when album is without capital letters") + public void shouldCapitalizeAlbum(TestInfo testInfo) { + log.info(testInfo.getDisplayName()); + metadata.setAlbum(album); + + assertTrue(formatter.wasCamelized(metadata)); + assertEquals(expectedAlbum, metadata.getAlbum()); + } + + @Test + @DisplayName("validating when album is all in capital letters") + public void shouldCapitalizeAlbumWhenUppercase(TestInfo testInfo) { + log.info(testInfo.getDisplayName()); + metadata.setAlbum(album.toUpperCase()); + + assertTrue(formatter.wasCamelized(metadata)); + assertEquals(expectedAlbum, metadata.getAlbum()); + } + + @Test + @DisplayName("validating when title is all in capital letters") + public void shouldCapitalizeTitleWhenUppercase(TestInfo testInfo) { + log.info(testInfo.getDisplayName()); + metadata.setTitle(title.toUpperCase()); + + assertTrue(formatter.wasCamelized(metadata)); + assertEquals(expectedTitle, metadata.getTitle()); + } + + @Test + @DisplayName("validating when artist is all in capital letters") + public void shouldCapitalizeArtistWhenUppercase(TestInfo testInfo) { + log.info(testInfo.getDisplayName()); + metadata.setArtist(artist.toUpperCase()); + + assertTrue(formatter.wasCamelized(metadata)); + assertEquals(expectedArtist, metadata.getArtist()); + } + + @Test + @DisplayName("validating when artist has a dash") + public void shouldCapitalizeArtistWhenDash(TestInfo testInfo) { + log.info(testInfo.getDisplayName()); + var artist = "de-pazz"; + var artistExpected = "De-pazz"; + + metadata.setArtist(artist); + + assertTrue(formatter.wasCamelized(metadata)); + assertEquals(artistExpected, metadata.getArtist()); + } + + @Test + @DisplayName("validating when title has a dash") + public void shouldCapitalizeTitleWhenDash(TestInfo testInfo) { + log.info(testInfo.getDisplayName()); + var title = "blue-eyed"; + var titleExpected = "Blue-eyed"; + + metadata.setTitle(title); + + assertTrue(formatter.wasCamelized(metadata)); + assertEquals(titleExpected, metadata.getTitle()); + } + + @Test + @DisplayName("validating when album has a dash") + public void shouldCapitalizeAlbumWhenDash(TestInfo testInfo) { + log.info(testInfo.getDisplayName()); + var album = "blue-eyed"; + var albumExpected = "Blue-eyed"; + + metadata.setAlbum(album); + + assertTrue(formatter.wasCamelized(metadata)); + assertEquals(albumExpected, metadata.getAlbum()); + } + + @Test + @DisplayName("validating apostrophe in title") + public void shouldDetectAcuteMarkTitle(TestInfo testInfo) { + log.info(testInfo.getDisplayName()); + metadata.setTitle(badFormatAcute); + + assertTrue(formatter.wasFormatted(metadata)); + assertEquals(badFormatAcuteExpected, metadata.getTitle()); + } + + @Test + @DisplayName("validating apostrophe in artist") + public void shouldDetectAcuteMarkArtist(TestInfo testInfo) { + log.info(testInfo.getDisplayName()); + metadata.setArtist(badFormatAcute); + + assertTrue(formatter.wasFormatted(metadata)); + assertEquals(badFormatAcuteExpected, metadata.getArtist()); + } + + @Test + @DisplayName("validating apostrophe in album") + public void shouldDetectAcuteMarkAlbum(TestInfo testInfo) { + log.info(testInfo.getDisplayName()); + metadata.setAlbum(badFormatAcute); + + assertTrue(formatter.wasFormatted(metadata)); + assertEquals(badFormatAcuteExpected, metadata.getAlbum()); + } + + @Test + @DisplayName("adding missing capital letters") + public void shouldAddCapitalLettersWhenParenthesis(TestInfo testInfo) { + log.info(testInfo.getDisplayName()); + var title = "as the rush comes (chillout mix)"; + var expectedTitle = "As The Rush Comes (chillout Mix)"; + + metadata.setTitle(title); + + assertTrue(formatter.wasCamelized(metadata)); + assertEquals(expectedTitle, metadata.getTitle()); + } + + @Test + @DisplayName("adding missing capital letters") + public void shouldAddCapitalLettersWhenNumbers(TestInfo testInfo) { + log.info(testInfo.getDisplayName()); + var title = "rabbit in your headlights (3d mix)"; + var expectedTitle = "Rabbit In Your Headlights (3d Mix)"; + + metadata.setTitle(title); + + assertTrue(formatter.wasCamelized(metadata)); + assertEquals(expectedTitle, metadata.getTitle()); + } + + @Test + @DisplayName("adding missing capital letters when apostrophe") + public void shouldAddCapitalLettersWhenApostrophe(TestInfo testInfo) { + log.info(testInfo.getDisplayName()); + var title = "jesu, joy of man's desiring"; + var expectedTitle = "Jesu, Joy Of Man's Desiring"; + + metadata.setTitle(title); + + assertTrue(formatter.wasCamelized(metadata)); + assertEquals(expectedTitle, metadata.getTitle()); + } + + @Test + @DisplayName("validating grave accent") + public void shouldDetectGraveAccent(TestInfo testInfo) { + log.info(testInfo.getDisplayName()); + var title = "Lumières De Skye"; + var expectedTitle = "Lumieres De Skye"; + + metadata.setTitle(title); + + assertTrue(formatter.wasFormatted(metadata)); + assertEquals(expectedTitle, metadata.getTitle()); + } + + @Test + @DisplayName("validating e acute accent") + public void shouldDetectAcuteAccent(TestInfo testInfo) { + log.info(testInfo.getDisplayName()); + var title = "Le Vent d'Écosse"; + var expectedTitle = "Le Vent d'Écosse"; + + metadata.setTitle(title); + + assertTrue(formatter.wasFormatted(metadata)); + assertEquals(expectedTitle, metadata.getTitle()); + } + + @Test + @DisplayName("validating e circum-flex accent") + public void shouldDetectCircumflexAccent(TestInfo testInfo) { + log.info(testInfo.getDisplayName()); + var title = "Entre-Nous... La fête"; + var expectedTitle = "Entre-Nous... La fête"; + + metadata.setTitle(title); + + assertTrue(formatter.wasFormatted(metadata)); + assertEquals(expectedTitle, metadata.getTitle()); + } + + @Test + @DisplayName("validating u uml accent in title") + public void shouldDetectUFormatInTitle(TestInfo testInfo) { + log.info(testInfo.getDisplayName()); + var title = "Blüchel & von Deylen"; + var expectedTitle = "Blüchel & von Deylen"; + + metadata.setTitle(title); + + assertTrue(formatter.wasFormatted(metadata)); + assertEquals(expectedTitle, metadata.getTitle()); + } + + @Test + @DisplayName("validating u uml accent in artist") + public void shouldDetectUFormatInArtist(TestInfo testInfo) { + log.info(testInfo.getDisplayName()); + var artist = "Blüchel & von Deylen"; + var expectedArtist = "Blüchel & von Deylen"; + + metadata.setArtist(artist); + + assertTrue(formatter.wasFormatted(metadata)); + assertEquals(expectedArtist, metadata.getArtist()); + } + + @Test + @DisplayName("validating u uml accent in album") + public void shouldDetectUFormatInAlbum(TestInfo testInfo) { + log.info(testInfo.getDisplayName()); + var album = "Blüchel & von Deylen"; + var expectedAlbum = "Blüchel & von Deylen"; + + metadata.setAlbum(album); + + assertTrue(formatter.wasFormatted(metadata)); + assertEquals(expectedAlbum, metadata.getAlbum()); + } + + @Test + @DisplayName("validating o uml accent in title") + public void shouldDetectOFormatInTitle(TestInfo testInfo) { + log.info(testInfo.getDisplayName()); + var title = "Popös"; + var expectedTitle = "Popös"; + + metadata.setTitle(title); + + assertTrue(formatter.wasFormatted(metadata)); + assertEquals(expectedTitle, metadata.getTitle()); + } + + @Test + @DisplayName("validating o uml accent in artist") + public void shouldDetectOFormatInArtist(TestInfo testInfo) { + log.info(testInfo.getDisplayName()); + var artist = "Popös"; + var expectedArtist = "Popös"; + + metadata.setArtist(artist); + + assertTrue(formatter.wasFormatted(metadata)); + assertEquals(expectedArtist, metadata.getArtist()); + } + + @Test + @DisplayName("validating o uml accent in album") + public void shouldDetectOFormatInAlbum(TestInfo testInfo) { + log.info(testInfo.getDisplayName()); + var album = "Popös"; + var expectedAlbum = "Popös"; + + metadata.setAlbum(album); + + assertTrue(formatter.wasFormatted(metadata)); + assertEquals(expectedAlbum, metadata.getAlbum()); + } + + @Test + @DisplayName("validating a grave accent in title") + public void shouldDetectAGraveFormatInTitle(TestInfo testInfo) { + log.info(testInfo.getDisplayName()); + var title = "Déjà Vu"; + var expectedTitle = "Déja Vu"; + + metadata.setTitle(title); + + assertTrue(formatter.wasFormatted(metadata)); + assertEquals(expectedTitle, metadata.getTitle()); + } + + @Test + @DisplayName("validating a grave accent in artist") + public void shouldDetectAGraveFormatInArtist(TestInfo testInfo) { + log.info(testInfo.getDisplayName()); + var artist = "Déjà Vu"; + var expectedArtist = "Déja Vu"; + + metadata.setArtist(artist); + + assertTrue(formatter.wasFormatted(metadata)); + assertEquals(expectedArtist, metadata.getArtist()); + } + + @Test + @DisplayName("validating a grave accent in album") + public void shouldDetectAGraveFormatInAlbum(TestInfo testInfo) { + log.info(testInfo.getDisplayName()); + var album = "Déjà Vu"; + var expectedAlbum = "Déja Vu"; + + metadata.setAlbum(album); + + assertTrue(formatter.wasFormatted(metadata)); + assertEquals(expectedAlbum, metadata.getAlbum()); + } + + @Test + @DisplayName("validating degree format in title") + public void shouldDetectDegreeFormatInTitle(TestInfo testInfo) { + log.info(testInfo.getDisplayName()); + var title = "Beatniks°"; + var expectedTitle = "Beatniks°"; + + metadata.setTitle(title); + + assertTrue(formatter.wasFormatted(metadata)); + assertEquals(expectedTitle, metadata.getTitle()); + } + + @Test + @DisplayName("validating degree format in artist") + public void shouldDetectDegreeFormatInArtist(TestInfo testInfo) { + log.info(testInfo.getDisplayName()); + var artist = "Beatniks°"; + var expectedArtist = "Beatniks°"; + + metadata.setArtist(artist); + + assertTrue(formatter.wasFormatted(metadata)); + assertEquals(expectedArtist, metadata.getArtist()); + } + + @Test + @DisplayName("validating degree format in album") + public void shouldDetectDegreeFormatInAlbum(TestInfo testInfo) { + log.info(testInfo.getDisplayName()); + var album = "Beatniks°"; + var expectedAlbum = "Beatniks°"; + + metadata.setAlbum(album); + + assertTrue(formatter.wasFormatted(metadata)); + assertEquals(expectedAlbum, metadata.getAlbum()); + } + + @Test + @DisplayName("validating n tilde in title") + public void shouldDetectEnTildeInTitle(TestInfo testInfo) { + var title = "Niña"; + var expectedTitle = "Niña"; + + metadata.setTitle(title); + + assertTrue(formatter.wasFormatted(metadata)); + assertEquals(expectedTitle, metadata.getTitle()); + } + + @Test + @DisplayName("validating n tilde in artist") + public void shouldDetectEnTildeInArtist(TestInfo testInfo) { + log.info(testInfo.getDisplayName()); + var artist = "Niña"; + var expectedArtist = "Niña"; + + metadata.setArtist(artist); + + assertTrue(formatter.wasFormatted(metadata)); + assertEquals(expectedArtist, metadata.getArtist()); + } + + @Test + @DisplayName("validating n tilde in album") + public void shouldDetectEnTildeInAlbum() { + var album = "Niña"; + var expectedAlbum = "Niña"; + + metadata.setAlbum(album); + + assertTrue(formatter.wasFormatted(metadata)); + assertEquals(expectedAlbum, metadata.getAlbum()); + } + + @Test + @DisplayName("validating a umlaut mark in title") + public void shouldDetectAUmlautMarkInTitle(TestInfo testInfo) { + log.info(testInfo.getDisplayName()); + var title = "Jähdytin"; + var expectedTitle = "Jähdytin"; + + metadata.setTitle(title); + + assertTrue(formatter.wasFormatted(metadata)); + assertEquals(expectedTitle, metadata.getTitle()); + } + + @Test + @DisplayName("validating a umlaut mark in artist") + public void shouldDetectAUmlautMarkInArtist(TestInfo testInfo) { + log.info(testInfo.getDisplayName()); + var artist = "Jähdytin"; + var expectedArtist = "Jähdytin"; + + metadata.setArtist(artist); + + assertTrue(formatter.wasFormatted(metadata)); + assertEquals(expectedArtist, metadata.getArtist()); + } + + @Test + @DisplayName("validating a umlaut mark in album") + public void shouldDetectAUmlautMarkInAlbum(TestInfo testInfo) { + log.info(testInfo.getDisplayName()); + var album = "Jähdytin"; + var expectedAlbum = "Jähdytin"; + + metadata.setAlbum(album); + + assertTrue(formatter.wasFormatted(metadata)); + assertEquals(expectedAlbum, metadata.getAlbum()); + } + + @Test + @DisplayName("validating metadata is analyzable") + public void shouldBeAnalyzable(TestInfo testInfo) { + log.info(testInfo.getDisplayName()); + var title = "Beatniks"; + var artist = "Jaytin"; + var album = "Nina"; + + metadata.setTitle(title); + metadata.setArtist(artist); + metadata.setAlbum(album); + + assertDoesNotThrow(() -> formatter.isAnalyzable(metadata)); + } + + @Test + @DisplayName("validating metadata is not analyzable due to album") + public void shouldNotBeAnalyzableDueToAlbum(TestInfo testInfo) { + log.info(testInfo.getDisplayName()); + var title = "Beatniks"; + var artist = "Jaytin"; + + metadata.setTitle(title); + metadata.setArtist(artist); + metadata.setAlbum(null); + + assertThrows(NullPointerException.class, () -> formatter.isAnalyzable(metadata)); + } + + @Test + @DisplayName("validating metadata is not analyzable due to artist") + public void shouldNotBeAnalyzableDueToArtist(TestInfo testInfo) { + log.info(testInfo.getDisplayName()); + var title = "Beatniks"; + var album = "Nina"; + + metadata.setTitle(title); + metadata.setArtist(null); + metadata.setAlbum(album); + + assertThrows(NullPointerException.class, () -> formatter.isAnalyzable(metadata)); + } + + @Test + @DisplayName("validating metadata is not analyzable due to title") + public void shouldNotBeAnalyzableDueToTitle(TestInfo testInfo) { + log.info(testInfo.getDisplayName()); + var artist = "Jaytin"; + var album = "Nina"; + + metadata.setTitle(null); + metadata.setArtist(artist); + metadata.setAlbum(album); + + assertThrows(NullPointerException.class, () -> formatter.isAnalyzable(metadata)); + } + + @Test + @DisplayName("validating a circle mark in title") + public void shouldDetectCircleInTitle(TestInfo testInfo) { + log.info(testInfo.getDisplayName()); + var title = "Jähdytin"; + var expectedTitle = "Jähdytin"; + + metadata.setTitle(title); + + assertTrue(formatter.wasFormatted(metadata)); + assertEquals(expectedTitle, metadata.getTitle()); + } + + @Test + @DisplayName("validating a circle mark in artist") + public void shouldDetectCircleInArtist(TestInfo testInfo) { + log.info(testInfo.getDisplayName()); + var artist = "Aganjû"; + var expectedArtist = "Aganjû"; + + metadata.setArtist(artist); + + assertTrue(formatter.wasFormatted(metadata)); + assertEquals(expectedArtist, metadata.getArtist()); + } + + @Test + @DisplayName("validating a circle mark in album") + public void shouldDetectCircleInAlbum(TestInfo testInfo) { + log.info(testInfo.getDisplayName()); + var album = "Aganjû"; + var expectedAlbum = "Aganjû"; + + metadata.setAlbum(album); + + assertTrue(formatter.wasFormatted(metadata)); + assertEquals(expectedAlbum, metadata.getAlbum()); + } + + @Test + @DisplayName("validating when title is empty") + public void shouldFormatTitleWhenEmpty(TestInfo testInfo) { + log.info(testInfo.getDisplayName()); + metadata.setArtist(badFormatA); + metadata.setTitle(StringUtils.EMPTY); + metadata.setAlbum(badFormatE); + + assertTrue(formatter.wasFormatted(metadata)); + } + + @Test + @DisplayName("validating when artist is empty") + public void shouldFormatArtistWhenEmpty(TestInfo testInfo) { + log.info(testInfo.getDisplayName()); + metadata.setArtist(StringUtils.EMPTY); + metadata.setTitle(badFormatA); + metadata.setAlbum(badFormatE); + + assertTrue(formatter.wasFormatted(metadata)); + } + + @Test + @DisplayName("validating when album is empty") + public void shouldFormatAlbumWhenEmpty(TestInfo testInfo) { + log.info(testInfo.getDisplayName()); + metadata.setArtist(badFormatA); + metadata.setTitle(badFormatE); + metadata.setAlbum(StringUtils.EMPTY); + + assertTrue(formatter.wasFormatted(metadata)); + } + + @Test + @DisplayName("getting duration from seconds") + public void shouldGetDuration(TestInfo testInfo) { + log.info(testInfo.getDisplayName()); + var length = 397; + var expectedDuration = "6:37"; + assertEquals(expectedDuration, formatter.getDuration(length)); + } } - - diff --git a/src/test/java/com/josdem/jmetadata/service/TestLastFMCompleteService.java b/src/test/java/com/josdem/jmetadata/service/TestLastFMCompleteService.java index b423217..e3bb884 100644 --- a/src/test/java/com/josdem/jmetadata/service/TestLastFMCompleteService.java +++ b/src/test/java/com/josdem/jmetadata/service/TestLastFMCompleteService.java @@ -16,280 +16,267 @@ package com.josdem.jmetadata.service; +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.Mockito.*; -import de.umass.lastfm.Album; -import de.umass.lastfm.ImageSize; -import org.apache.commons.lang3.StringUtils; import com.josdem.jmetadata.action.ActionResult; import com.josdem.jmetadata.helper.LastFMAlbumHelper; import com.josdem.jmetadata.model.LastfmAlbum; import com.josdem.jmetadata.model.Metadata; import com.josdem.jmetadata.service.impl.LastFMCompleteServiceImpl; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.MockitoAnnotations; - +import de.umass.lastfm.Album; +import de.umass.lastfm.ImageSize; import java.awt.*; import java.io.IOException; import java.net.MalformedURLException; import java.util.Date; import java.util.HashMap; - -import static org.junit.jupiter.api.Assertions.*; -import static org.mockito.Mockito.*; - +import org.apache.commons.lang3.StringUtils; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; public class TestLastFMCompleteService { - @InjectMocks - private LastFMCompleteService completeService = new LastFMCompleteServiceImpl(); - @Mock - private Metadata metadata; - @Mock - private LastfmAlbum lastfmAlbum; - @Mock - private LastFMAlbumHelper lastfmHelper; - @Mock - private ImageService imageService; - @Mock - private Album albumFromLastFM; - @Mock - private Image image; - @Mock - private HashMap cachedAlbums; - - private final String year = "2011"; - private final String genre = "Minimal Techno"; - private final String artist = "Linas"; - private final String album = "Time Lapse"; - private final String imageURL = "http://userserve-ak.last.fm/serve/300x300/35560281.png"; - - @BeforeEach - public void setup() throws Exception { - MockitoAnnotations.initMocks(this); - when(lastfmHelper.getAlbum(artist, album)).thenReturn(albumFromLastFM); - } - - private void setArtistAndAlbumExpectations() { - when(metadata.getArtist()).thenReturn(artist); - when(metadata.getAlbum()).thenReturn(album); - } - - @Test - public void shouldCompleteIfNoMetadata() throws Exception { - setArtistAndAlbumExpectations(); - - assertTrue(completeService.canLastFMHelpToComplete(metadata)); - verify(lastfmHelper).getAlbum(artist, album); - } - - - @Test - public void shouldCompleteIfNoCoverArt() throws Exception { - setArtistAndAlbumExpectations(); - when(metadata.getYear()).thenReturn(year); - when(metadata.getGenre()).thenReturn(genre); - - assertTrue(completeService.canLastFMHelpToComplete(metadata)); - verify(lastfmHelper).getAlbum(artist, album); - } - - @Test - public void shouldCompleteIfNoGenre() throws Exception { - setArtistAndAlbumExpectations(); - when(metadata.getCoverArt()).thenReturn(image); - when(metadata.getYear()).thenReturn(year); - - assertTrue(completeService.canLastFMHelpToComplete(metadata)); - verify(lastfmHelper).getAlbum(artist, album); - } - - @Test - public void shouldCompleteIfNoYear() throws Exception { - setArtistAndAlbumExpectations(); - when(metadata.getCoverArt()).thenReturn(image); - when(metadata.getGenre()).thenReturn(genre); - - assertTrue(completeService.canLastFMHelpToComplete(metadata)); - verify(lastfmHelper).getAlbum(artist, album); - } - - private void setYearGenreCoverExpectations() { - when(metadata.getCoverArt()).thenReturn(image); - when(metadata.getYear()).thenReturn(year); - when(metadata.getGenre()).thenReturn(genre); - } - - @Test - public void shouldNotCompleteIfMetadataIsComplete() throws Exception { - setArtistAndAlbumExpectations(); - setYearGenreCoverExpectations(); - - assertFalse(completeService.canLastFMHelpToComplete(metadata)); - } - - @Test - public void shouldNotCompleteIfNoArtist() throws Exception { - setYearGenreCoverExpectations(); - when(metadata.getAlbum()).thenReturn(album); - - assertFalse(completeService.canLastFMHelpToComplete(metadata)); - } - - @Test - public void shouldNotCompleteIfNoAlbum() throws Exception { - when(metadata.getArtist()).thenReturn(artist); - setYearGenreCoverExpectations(); - - assertFalse(completeService.canLastFMHelpToComplete(metadata)); - } - - @Test - public void shouldGetLastfm() throws Exception { - setYearAndGenreExpectations(); - setImageExpectations(); - - LastfmAlbum lastFMalbum = completeService.getLastFM(metadata); - - assertEquals(year, lastFMalbum.getYear()); - assertEquals(genre, lastFMalbum.getGenre()); - assertEquals(image, lastFMalbum.getImageIcon()); - } - - @Test - public void shouldNotGetGenreFromCache() throws Exception { - setGenreExpectations(); - when(cachedAlbums.get(album)).thenReturn(albumFromLastFM); - - LastfmAlbum lastfmAlbum = completeService.getLastFM(metadata); - - verify(lastfmHelper).getGenre(albumFromLastFM); - assertEquals(genre, lastfmAlbum.getGenre()); - } - - - private void setGenreExpectations() { - Date date = new Date(); - when(metadata.getAlbum()).thenReturn(album); - when(albumFromLastFM.getReleaseDate()).thenReturn(date); - when(lastfmHelper.getYear(date)).thenReturn(year); - when(lastfmHelper.getGenre(albumFromLastFM)).thenReturn(genre); - } - - @Test - public void shouldGetLastfmEvenThoughThereisNoCoverArt() throws Exception { - setYearAndGenreExpectations(); - - LastfmAlbum lastFMalbum = completeService.getLastFM(metadata); - - assertEquals(year, lastFMalbum.getYear()); - assertEquals(genre, lastFMalbum.getGenre()); - assertNull(lastFMalbum.getImageIcon()); - } - - private void setYearAndGenreExpectations() { - Date date = new Date(); - when(metadata.getAlbum()).thenReturn(album); - when(cachedAlbums.get(album)).thenReturn(albumFromLastFM); - when(albumFromLastFM.getReleaseDate()).thenReturn(date); - when(lastfmHelper.getYear(date)).thenReturn(year); - when(lastfmHelper.getGenre(albumFromLastFM)).thenReturn(genre); - } - - @Test - public void shouldDetectWhenNothingChanged() throws Exception { - ActionResult actionResult = completeService.isSomethingNew(lastfmAlbum, metadata); - assertEquals(ActionResult.Ready, actionResult); - } - - @Test - public void shouldDetectLastfmHasNewValues() throws Exception { - when(lastfmAlbum.getYear()).thenReturn(year); - ActionResult actionResult = completeService.isSomethingNew(lastfmAlbum, metadata); - assertEquals(ActionResult.New, actionResult); - } - - @Test - public void shouldNotSetCoverArtIfAnyInFile() throws Exception { - when(metadata.getCoverArt()).thenReturn(image); - when(metadata.getAlbum()).thenReturn(album); - when(cachedAlbums.get(album)).thenReturn(albumFromLastFM); - setImageExpectations(); - - LastfmAlbum lastFMalbum = completeService.getLastFM(metadata); - - assertNull(lastFMalbum.getImageIcon()); - } - - private void setImageExpectations() throws MalformedURLException, IOException { - when(albumFromLastFM.getImageURL(ImageSize.EXTRALARGE)).thenReturn(imageURL); - when(imageService.readImage(imageURL)).thenReturn(image); - } - - @Test - public void shouldNotAskForGenreIfAlreadyHasOne() throws Exception { - when(metadata.getAlbum()).thenReturn(album); - when(cachedAlbums.get(album)).thenReturn(albumFromLastFM); - when(metadata.getGenre()).thenReturn(genre); - - LastfmAlbum lastFMalbum = completeService.getLastFM(metadata); - - verify(lastfmHelper, never()).getGenre(albumFromLastFM); - assertTrue(StringUtils.isEmpty(lastFMalbum.getGenre())); - } - - @Test - public void shouldNotAskForYearIfAlreadyHasOne() throws Exception { - when(metadata.getYear()).thenReturn(year); - - LastfmAlbum lastFMalbum = completeService.getLastFM(metadata); - - verify(albumFromLastFM, never()).getReleaseDate(); - assertTrue(StringUtils.isEmpty(lastFMalbum.getYear())); - } - - @Test - public void shouldReturnACachedAlbum() throws Exception { - setArtistAndAlbumExpectations(); - when(cachedAlbums.get(album)).thenReturn(albumFromLastFM); - - boolean result = completeService.canLastFMHelpToComplete(metadata); - - assertTrue(result); - } - - @Test - public void shouldReturnAlbumFromLastFM() throws Exception { - setArtistAndAlbumExpectations(); - when(lastfmHelper.getAlbum(artist, album)).thenReturn(null); - - boolean result = completeService.canLastFMHelpToComplete(metadata); - - assertFalse(result); - verify(lastfmHelper).getAlbum(artist, album); - } - - @Test - public void shouldSetACachedAlbumInTheMap() throws Exception { - setArtistAndAlbumExpectations(); - when(albumFromLastFM.getImageURL(ImageSize.EXTRALARGE)).thenReturn(imageURL); - - completeService.canLastFMHelpToComplete(metadata); + @InjectMocks private LastFMCompleteService completeService = new LastFMCompleteServiceImpl(); + @Mock private Metadata metadata; + @Mock private LastfmAlbum lastfmAlbum; + @Mock private LastFMAlbumHelper lastfmHelper; + @Mock private ImageService imageService; + @Mock private Album albumFromLastFM; + @Mock private Image image; + @Mock private HashMap cachedAlbums; + + private final String year = "2011"; + private final String genre = "Minimal Techno"; + private final String artist = "Linas"; + private final String album = "Time Lapse"; + private final String imageURL = "http://userserve-ak.last.fm/serve/300x300/35560281.png"; + + @BeforeEach + public void setup() throws Exception { + MockitoAnnotations.initMocks(this); + when(lastfmHelper.getAlbum(artist, album)).thenReturn(albumFromLastFM); + } + + private void setArtistAndAlbumExpectations() { + when(metadata.getArtist()).thenReturn(artist); + when(metadata.getAlbum()).thenReturn(album); + } + + @Test + public void shouldCompleteIfNoMetadata() throws Exception { + setArtistAndAlbumExpectations(); + + assertTrue(completeService.canLastFMHelpToComplete(metadata)); + verify(lastfmHelper).getAlbum(artist, album); + } + + @Test + public void shouldCompleteIfNoCoverArt() throws Exception { + setArtistAndAlbumExpectations(); + when(metadata.getYear()).thenReturn(year); + when(metadata.getGenre()).thenReturn(genre); + + assertTrue(completeService.canLastFMHelpToComplete(metadata)); + verify(lastfmHelper).getAlbum(artist, album); + } + + @Test + public void shouldCompleteIfNoGenre() throws Exception { + setArtistAndAlbumExpectations(); + when(metadata.getCoverArt()).thenReturn(image); + when(metadata.getYear()).thenReturn(year); + + assertTrue(completeService.canLastFMHelpToComplete(metadata)); + verify(lastfmHelper).getAlbum(artist, album); + } + + @Test + public void shouldCompleteIfNoYear() throws Exception { + setArtistAndAlbumExpectations(); + when(metadata.getCoverArt()).thenReturn(image); + when(metadata.getGenre()).thenReturn(genre); + + assertTrue(completeService.canLastFMHelpToComplete(metadata)); + verify(lastfmHelper).getAlbum(artist, album); + } + + private void setYearGenreCoverExpectations() { + when(metadata.getCoverArt()).thenReturn(image); + when(metadata.getYear()).thenReturn(year); + when(metadata.getGenre()).thenReturn(genre); + } + + @Test + public void shouldNotCompleteIfMetadataIsComplete() throws Exception { + setArtistAndAlbumExpectations(); + setYearGenreCoverExpectations(); + + assertFalse(completeService.canLastFMHelpToComplete(metadata)); + } + + @Test + public void shouldNotCompleteIfNoArtist() throws Exception { + setYearGenreCoverExpectations(); + when(metadata.getAlbum()).thenReturn(album); + + assertFalse(completeService.canLastFMHelpToComplete(metadata)); + } + + @Test + public void shouldNotCompleteIfNoAlbum() throws Exception { + when(metadata.getArtist()).thenReturn(artist); + setYearGenreCoverExpectations(); + + assertFalse(completeService.canLastFMHelpToComplete(metadata)); + } + + @Test + public void shouldGetLastfm() throws Exception { + setYearAndGenreExpectations(); + setImageExpectations(); + + LastfmAlbum lastFMalbum = completeService.getLastFM(metadata); + + assertEquals(year, lastFMalbum.getYear()); + assertEquals(genre, lastFMalbum.getGenre()); + assertEquals(image, lastFMalbum.getImageIcon()); + } + + @Test + public void shouldNotGetGenreFromCache() throws Exception { + setGenreExpectations(); + when(cachedAlbums.get(album)).thenReturn(albumFromLastFM); + + LastfmAlbum lastfmAlbum = completeService.getLastFM(metadata); + + verify(lastfmHelper).getGenre(albumFromLastFM); + assertEquals(genre, lastfmAlbum.getGenre()); + } + + private void setGenreExpectations() { + Date date = new Date(); + when(metadata.getAlbum()).thenReturn(album); + when(albumFromLastFM.getReleaseDate()).thenReturn(date); + when(lastfmHelper.getYear(date)).thenReturn(year); + when(lastfmHelper.getGenre(albumFromLastFM)).thenReturn(genre); + } + + @Test + public void shouldGetLastfmEvenThoughThereisNoCoverArt() throws Exception { + setYearAndGenreExpectations(); + + LastfmAlbum lastFMalbum = completeService.getLastFM(metadata); + + assertEquals(year, lastFMalbum.getYear()); + assertEquals(genre, lastFMalbum.getGenre()); + assertNull(lastFMalbum.getImageIcon()); + } + + private void setYearAndGenreExpectations() { + Date date = new Date(); + when(metadata.getAlbum()).thenReturn(album); + when(cachedAlbums.get(album)).thenReturn(albumFromLastFM); + when(albumFromLastFM.getReleaseDate()).thenReturn(date); + when(lastfmHelper.getYear(date)).thenReturn(year); + when(lastfmHelper.getGenre(albumFromLastFM)).thenReturn(genre); + } + + @Test + public void shouldDetectWhenNothingChanged() throws Exception { + ActionResult actionResult = completeService.isSomethingNew(lastfmAlbum, metadata); + assertEquals(ActionResult.Ready, actionResult); + } + + @Test + public void shouldDetectLastfmHasNewValues() throws Exception { + when(lastfmAlbum.getYear()).thenReturn(year); + ActionResult actionResult = completeService.isSomethingNew(lastfmAlbum, metadata); + assertEquals(ActionResult.New, actionResult); + } + + @Test + public void shouldNotSetCoverArtIfAnyInFile() throws Exception { + when(metadata.getCoverArt()).thenReturn(image); + when(metadata.getAlbum()).thenReturn(album); + when(cachedAlbums.get(album)).thenReturn(albumFromLastFM); + setImageExpectations(); + + LastfmAlbum lastFMalbum = completeService.getLastFM(metadata); + + assertNull(lastFMalbum.getImageIcon()); + } + + private void setImageExpectations() throws MalformedURLException, IOException { + when(albumFromLastFM.getImageURL(ImageSize.EXTRALARGE)).thenReturn(imageURL); + when(imageService.readImage(imageURL)).thenReturn(image); + } + + @Test + public void shouldNotAskForGenreIfAlreadyHasOne() throws Exception { + when(metadata.getAlbum()).thenReturn(album); + when(cachedAlbums.get(album)).thenReturn(albumFromLastFM); + when(metadata.getGenre()).thenReturn(genre); + + LastfmAlbum lastFMalbum = completeService.getLastFM(metadata); + + verify(lastfmHelper, never()).getGenre(albumFromLastFM); + assertTrue(StringUtils.isEmpty(lastFMalbum.getGenre())); + } + + @Test + public void shouldNotAskForYearIfAlreadyHasOne() throws Exception { + when(metadata.getYear()).thenReturn(year); + + LastfmAlbum lastFMalbum = completeService.getLastFM(metadata); + + verify(albumFromLastFM, never()).getReleaseDate(); + assertTrue(StringUtils.isEmpty(lastFMalbum.getYear())); + } + + @Test + public void shouldReturnACachedAlbum() throws Exception { + setArtistAndAlbumExpectations(); + when(cachedAlbums.get(album)).thenReturn(albumFromLastFM); + + boolean result = completeService.canLastFMHelpToComplete(metadata); + + assertTrue(result); + } + + @Test + public void shouldReturnAlbumFromLastFM() throws Exception { + setArtistAndAlbumExpectations(); + when(lastfmHelper.getAlbum(artist, album)).thenReturn(null); + + boolean result = completeService.canLastFMHelpToComplete(metadata); + + assertFalse(result); + verify(lastfmHelper).getAlbum(artist, album); + } + + @Test + public void shouldSetACachedAlbumInTheMap() throws Exception { + setArtistAndAlbumExpectations(); + when(albumFromLastFM.getImageURL(ImageSize.EXTRALARGE)).thenReturn(imageURL); + + completeService.canLastFMHelpToComplete(metadata); - verify(cachedAlbums).put(album, albumFromLastFM); - } - - @Test - public void shouldNotCompleteBecauseNotAlbumFound() throws Exception { - completeService.getLastFM(metadata); - - verify(lastfmHelper, never()).getGenre(null); - } - - @Test - public void shouldCanNotCompleteLastFMDueToHasNoAlbumAndArtist() throws Exception { - assertFalse(completeService.canLastFMHelpToComplete(metadata)); - } + verify(cachedAlbums).put(album, albumFromLastFM); + } + + @Test + public void shouldNotCompleteBecauseNotAlbumFound() throws Exception { + completeService.getLastFM(metadata); + + verify(lastfmHelper, never()).getGenre(null); + } + + @Test + public void shouldCanNotCompleteLastFMDueToHasNoAlbumAndArtist() throws Exception { + assertFalse(completeService.canLastFMHelpToComplete(metadata)); + } } diff --git a/src/test/java/com/josdem/jmetadata/service/TestLastfmService.java b/src/test/java/com/josdem/jmetadata/service/TestLastfmService.java index cbf3ea4..96a80e1 100644 --- a/src/test/java/com/josdem/jmetadata/service/TestLastfmService.java +++ b/src/test/java/com/josdem/jmetadata/service/TestLastfmService.java @@ -16,117 +16,109 @@ package com.josdem.jmetadata.service; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.Matchers.isA; +import static org.mockito.Mockito.*; + import com.josdem.jmetadata.action.ActionResult; import com.josdem.jmetadata.model.LastfmAlbum; import com.josdem.jmetadata.model.Metadata; import com.josdem.jmetadata.service.impl.LastfmServiceImpl; +import java.awt.*; +import java.io.IOException; +import java.net.MalformedURLException; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.MockitoAnnotations; -import java.awt.*; -import java.io.IOException; -import java.net.MalformedURLException; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.mockito.Matchers.isA; -import static org.mockito.Mockito.*; - public class TestLastfmService { - @InjectMocks - private LastfmService lastfmService = new LastfmServiceImpl(); - - @Mock - private Metadata metadata; - @Mock - private Image imageIcon; - @Mock - private LastFMCompleteService completeService; - @Mock - private LastfmAlbum lastfmAlbum; + @InjectMocks private LastfmService lastfmService = new LastfmServiceImpl(); - private String genre = "Minimal Techno"; + @Mock private Metadata metadata; + @Mock private Image imageIcon; + @Mock private LastFMCompleteService completeService; + @Mock private LastfmAlbum lastfmAlbum; - @BeforeEach - public void setup() throws Exception { - MockitoAnnotations.initMocks(this); - when(completeService.canLastFMHelpToComplete(metadata)).thenReturn(true); - } + private String genre = "Minimal Techno"; - @Test - public void shouldCompleteMetadataFromLastfm() throws Exception { - setCompleteHelperExpectations(); - when(lastfmAlbum.getImageIcon()).thenReturn(imageIcon); - when(completeService.isSomethingNew(lastfmAlbum, metadata)).thenReturn(ActionResult.New); + @BeforeEach + public void setup() throws Exception { + MockitoAnnotations.initMocks(this); + when(completeService.canLastFMHelpToComplete(metadata)).thenReturn(true); + } - ActionResult result = lastfmService.completeLastFM(metadata); + @Test + public void shouldCompleteMetadataFromLastfm() throws Exception { + setCompleteHelperExpectations(); + when(lastfmAlbum.getImageIcon()).thenReturn(imageIcon); + when(completeService.isSomethingNew(lastfmAlbum, metadata)).thenReturn(ActionResult.New); - verify(completeService).isSomethingNew(lastfmAlbum, metadata); - assertEquals(ActionResult.New, result); - } + ActionResult result = lastfmService.completeLastFM(metadata); - @Test - public void shouldNotCompleteLastfmCoverArtMetadataDueToMetadataComplete() throws Exception { - when(completeService.canLastFMHelpToComplete(metadata)).thenReturn(false); + verify(completeService).isSomethingNew(lastfmAlbum, metadata); + assertEquals(ActionResult.New, result); + } - ActionResult result = lastfmService.completeLastFM(metadata); - assertEquals(ActionResult.Ready, result); - } + @Test + public void shouldNotCompleteLastfmCoverArtMetadataDueToMetadataComplete() throws Exception { + when(completeService.canLastFMHelpToComplete(metadata)).thenReturn(false); - @Test - public void shouldNotCompleteGenreIfAlredyHasOne() throws Exception { - setCompleteHelperExpectations(); - when(metadata.getGenre()).thenReturn(genre); + ActionResult result = lastfmService.completeLastFM(metadata); + assertEquals(ActionResult.Ready, result); + } - lastfmService.completeLastFM(metadata); + @Test + public void shouldNotCompleteGenreIfAlredyHasOne() throws Exception { + setCompleteHelperExpectations(); + when(metadata.getGenre()).thenReturn(genre); - verify(metadata, never()).setGenre(isA(String.class)); - } + lastfmService.completeLastFM(metadata); - @Test - public void shouldReturnMetadataCompleteIfLastfmHasNotNewValues() throws Exception { - setCompleteHelperExpectations(); - when(completeService.isSomethingNew(lastfmAlbum, metadata)).thenReturn(ActionResult.Ready); + verify(metadata, never()).setGenre(isA(String.class)); + } - ActionResult result = lastfmService.completeLastFM(metadata); - assertEquals(ActionResult.Ready, result); - } + @Test + public void shouldReturnMetadataCompleteIfLastfmHasNotNewValues() throws Exception { + setCompleteHelperExpectations(); + when(completeService.isSomethingNew(lastfmAlbum, metadata)).thenReturn(ActionResult.Ready); - @Test - public void shouldReturnSomethingnewValueIfNoBadFormatAndCapitalized() throws Exception { - setCompleteHelperExpectations(); - when(completeService.isSomethingNew(lastfmAlbum, metadata)).thenReturn(ActionResult.New); + ActionResult result = lastfmService.completeLastFM(metadata); + assertEquals(ActionResult.Ready, result); + } - ActionResult result = lastfmService.completeLastFM(metadata); + @Test + public void shouldReturnSomethingnewValueIfNoBadFormatAndCapitalized() throws Exception { + setCompleteHelperExpectations(); + when(completeService.isSomethingNew(lastfmAlbum, metadata)).thenReturn(ActionResult.New); - assertEquals(ActionResult.New, result); - } + ActionResult result = lastfmService.completeLastFM(metadata); - private void setCompleteHelperExpectations() throws MalformedURLException, - IOException { - when(completeService.canLastFMHelpToComplete(metadata)).thenReturn(true); - when(completeService.getLastFM(metadata)).thenReturn(lastfmAlbum); - } + assertEquals(ActionResult.New, result); + } - @Test - public void shouldCatchMalformedURLException() throws Exception { - when(completeService.getLastFM(metadata)).thenThrow(new MalformedURLException()); + private void setCompleteHelperExpectations() throws MalformedURLException, IOException { + when(completeService.canLastFMHelpToComplete(metadata)).thenReturn(true); + when(completeService.getLastFM(metadata)).thenReturn(lastfmAlbum); + } - ActionResult result = lastfmService.completeLastFM(metadata); + @Test + public void shouldCatchMalformedURLException() throws Exception { + when(completeService.getLastFM(metadata)).thenThrow(new MalformedURLException()); - assertEquals(ActionResult.Error, result); - } + ActionResult result = lastfmService.completeLastFM(metadata); - @Test - public void shouldCatchIOException() throws Exception { - when(completeService.getLastFM(metadata)).thenThrow(new IOException()); + assertEquals(ActionResult.Error, result); + } - ActionResult result = lastfmService.completeLastFM(metadata); + @Test + public void shouldCatchIOException() throws Exception { + when(completeService.getLastFM(metadata)).thenThrow(new IOException()); - assertEquals(ActionResult.Error, result); - } + ActionResult result = lastfmService.completeLastFM(metadata); + assertEquals(ActionResult.Error, result); + } } diff --git a/src/test/java/com/josdem/jmetadata/service/TestMetadataService.java b/src/test/java/com/josdem/jmetadata/service/TestMetadataService.java index 0d30c5a..590d6c4 100644 --- a/src/test/java/com/josdem/jmetadata/service/TestMetadataService.java +++ b/src/test/java/com/josdem/jmetadata/service/TestMetadataService.java @@ -16,9 +16,14 @@ package com.josdem.jmetadata.service; -import org.apache.commons.lang3.StringUtils; -import org.asmatron.messengine.ControlEngine; -import org.asmatron.messengine.engines.support.ControlEngineConfigurator; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + import com.josdem.jmetadata.exception.MetadataException; import com.josdem.jmetadata.exception.TooMuchFilesException; import com.josdem.jmetadata.helper.MetadataHelper; @@ -27,6 +32,16 @@ import com.josdem.jmetadata.model.Metadata; import com.josdem.jmetadata.service.impl.MetadataServiceImpl; import com.josdem.jmetadata.util.FileUtils; +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.Properties; +import java.util.Set; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.asmatron.messengine.ControlEngine; +import org.asmatron.messengine.engines.support.ControlEngineConfigurator; import org.jaudiotagger.audio.exceptions.CannotReadException; import org.jaudiotagger.audio.exceptions.InvalidAudioFrameException; import org.jaudiotagger.audio.exceptions.ReadOnlyFileException; @@ -39,279 +54,253 @@ import org.mockito.Mock; import org.mockito.MockitoAnnotations; -import java.io.File; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; -import java.util.Properties; -import java.util.Set; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.junit.jupiter.api.Assertions.assertTrue; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; -import lombok.extern.slf4j.Slf4j; - @Slf4j - - class TestMetadataService { - @InjectMocks - private final MetadataService metadataService = new MetadataServiceImpl(); - - @Mock - private FileUtils fileUtils; - @Mock - private File root; - @Mock - private ControlEngineConfigurator configurator; - @Mock - private ControlEngine controlEngine; - @Mock - private MetadataHelper metadataHelper; - @Mock - private ExtractService extractService; - @Mock - private Mp3Reader mp3Reader; - @Mock - private Mp4Reader mp4Reader; - @Mock - private Metadata metadata; - @Mock - private Metadata anotherMetadata; - @Mock - private Set filesWithoutMinimumMetadata; - @Mock - private File pepeGarden; - @Mock - private File checkStyleFile; - @Mock - private File file; - @Mock - private Properties properties; - - private final Integer maxFilesAllowed = 50; - - private final List metadatas = new ArrayList(); - private final List fileList = new ArrayList<>(); - - private static final String ALBUM = "Lemon Flavored Kiss"; - private static final String MY_REMIXES = "My Remixes"; - private static final String ARTIST = "Raul Islas"; - - - @BeforeEach - public void setup() throws Exception { - MockitoAnnotations.initMocks(this); - when(configurator.getControlEngine()).thenReturn(controlEngine); - when(properties.getProperty("max.files.allowed")).thenReturn(maxFilesAllowed.toString()); - } - - @Test - @DisplayName("extracting metadata when mp3") - public void shouldExtractMetadataWhenMp3(TestInfo testInfo) throws Exception { - log.info(testInfo.getDisplayName()); - setMp3Expectations(); - setFileListExpectations(); - - List metadatas = metadataService.extractMetadata(root); - Metadata metadata = metadatas.getFirst(); - - verifyExpectations(metadatas, metadata); - } - - @Test - @DisplayName("extracting metadata when mp4") - public void shouldExtractMetadataWhenMp4(TestInfo testInfo) throws Exception { - log.info(testInfo.getDisplayName()); - setMp4Expectations(); - setFileListExpectations(); - - List metadatas = metadataService.extractMetadata(root); - Metadata metadata = metadatas.getFirst(); - - verifyExpectations(metadatas, metadata); - } - - @Test - @DisplayName("not extracting metadata due to not having a valid audio file") - public void shouldDetectANotValidAudioFile(TestInfo testInfo) throws Exception { - log.info(testInfo.getDisplayName()); - fileList.add(checkStyleFile); - when(fileUtils.getFileList(root)).thenReturn(fileList); - - List metadatas = metadataService.extractMetadata(root); - - assertTrue(metadatas.isEmpty(), "should be empty due to not valid audio file"); - } - - @Test - @DisplayName("cleaning metadata list") - public void shouldCleanMetadataList(TestInfo testInfo) throws Exception { - log.info(testInfo.getDisplayName()); - setMp4Expectations(); - setFileListExpectations(); - - List metadatas = metadataService.extractMetadata(root); - - assertEquals(1, metadatas.size()); - - metadatas = metadataService.extractMetadata(root); - - assertEquals(1, metadatas.size()); - } - - @Test - @DisplayName("extracting metadata from file name") - public void shouldDetectAFileWithoutMinimumMetadata(TestInfo testInfo) throws Exception { - log.info(testInfo.getDisplayName()); - setMp3Expectations(); - fileList.add(pepeGarden); - - when(metadataHelper.createHashSet()).thenReturn(filesWithoutMinimumMetadata); - when(fileUtils.getFileList(root)).thenReturn(fileList); - - List metadatas = metadataService.extractMetadata(root); - - assertEquals(1, metadatas.size()); - verify(extractService).extractFromFileName(pepeGarden); - verify(filesWithoutMinimumMetadata).add(pepeGarden); - } - - @Test - @DisplayName("validating same album") - public void shouldKnowSameAlbum(TestInfo testInfo) { - log.info(testInfo.getDisplayName()); - when(metadata.getAlbum()).thenReturn(ALBUM); - when(anotherMetadata.getAlbum()).thenReturn(ALBUM); - - addMetadatas(); - assertTrue(metadataService.isSameAlbum(metadatas)); - } - - @Test - @DisplayName("validating different album") - public void shouldKnowDifferentAlbum(TestInfo testInfo) { - log.info(testInfo.getDisplayName()); - when(metadata.getAlbum()).thenReturn(ALBUM); - when(anotherMetadata.getAlbum()).thenReturn(MY_REMIXES); - - addMetadatas(); - - assertFalse(metadataService.isSameAlbum(metadatas)); - } - - @Test - @DisplayName("validating empty album") - public void shouldKnowWhenMetadataDoesNotHaveAlbum(TestInfo testInfo) { - log.info(testInfo.getDisplayName()); - when(metadata.getAlbum()).thenReturn(StringUtils.EMPTY); - when(anotherMetadata.getAlbum()).thenReturn(MY_REMIXES); - - addMetadatas(); - - assertFalse(metadataService.isSameAlbum(metadatas)); - } - - @Test - @DisplayName("validating not the same album if empty") - public void shouldKnowNotSameAlbumIfEmpty(TestInfo testInfo) { - log.info(testInfo.getDisplayName()); - when(metadata.getAlbum()).thenReturn(StringUtils.EMPTY); - when(anotherMetadata.getAlbum()).thenReturn(StringUtils.EMPTY); - - addMetadatas(); - assertFalse(metadataService.isSameAlbum(metadatas)); - } - - @Test - @DisplayName("validating same artist") - public void shouldKnowSameArtist(TestInfo testInfo) { - log.info(testInfo.getDisplayName()); - when(metadata.getArtist()).thenReturn(ARTIST); - when(anotherMetadata.getArtist()).thenReturn(ARTIST); - - addMetadatas(); - assertTrue(metadataService.isSameArtist(metadatas)); - } - - @Test - @DisplayName("validating different artist") - public void shouldKnowDifferentArtist(TestInfo testInfo) { - log.info(testInfo.getDisplayName()); - when(metadata.getArtist()).thenReturn(ARTIST); - when(anotherMetadata.getArtist()).thenReturn("Paul Van Dyk"); - - addMetadatas(); - - assertFalse(metadataService.isSameArtist(metadatas)); - } - - @Test - @DisplayName("validating empty artist") - public void shouldKnowWhenMetadataDoesNotHaveArtist(TestInfo testInfo) { - log.info(testInfo.getDisplayName()); - when(metadata.getArtist()).thenReturn(StringUtils.EMPTY); - when(anotherMetadata.getArtist()).thenReturn(ARTIST); - - addMetadatas(); - - assertFalse(metadataService.isSameArtist(metadatas)); - } - - @Test - @DisplayName("validating not the same artist if empty") - public void shouldKnowNotSameArtistIfEmpty(TestInfo testInfo) { - log.info(testInfo.getDisplayName()); - when(metadata.getArtist()).thenReturn(StringUtils.EMPTY); - when(anotherMetadata.getArtist()).thenReturn(StringUtils.EMPTY); - - addMetadatas(); - assertFalse(metadataService.isSameArtist(metadatas)); - } - - @Test - @DisplayName("not extracting metadata when too much files") - public void shouldNotExtractWhenTooMuchFiles(TestInfo testInfo) { - log.info(testInfo.getDisplayName()); - List fileList = mock(List.class); - - when(fileList.size()).thenReturn(maxFilesAllowed + 1); - when(fileUtils.getFileList(root)).thenReturn(fileList); - - assertThrows(TooMuchFilesException.class, () -> metadataService.extractMetadata(root)); - } - - private void setMp3Expectations() throws CannotReadException, IOException, TagException, ReadOnlyFileException, MetadataException { - when(fileUtils.isMp3File(pepeGarden)).thenReturn(true); - when(mp3Reader.getMetadata(pepeGarden)).thenReturn(metadata); - } - - private void setMp4Expectations() throws IOException, TagException, ReadOnlyFileException, InvalidAudioFrameException, MetadataException { - when(fileUtils.isM4aFile(pepeGarden)).thenReturn(true); - when(mp4Reader.getMetadata(pepeGarden)).thenReturn(metadata); - } - - private void setFileListExpectations() { - when(metadata.getArtist()).thenReturn("Jaytech"); - when(metadata.getTitle()).thenReturn("Pepe Garden (Original Mix)"); - fileList.add(pepeGarden); - when(fileUtils.getFileList(root)).thenReturn(fileList); - } - - private void verifyExpectations(List metadatas, Metadata metadata) { - assertEquals(1, metadatas.size()); - verify(fileUtils).getFileList(root); - assertEquals("Jaytech", metadata.getArtist()); - } - - private void addMetadatas() { - metadatas.add(metadata); - metadatas.add(anotherMetadata); - } - + @InjectMocks private final MetadataService metadataService = new MetadataServiceImpl(); + + @Mock private FileUtils fileUtils; + @Mock private File root; + @Mock private ControlEngineConfigurator configurator; + @Mock private ControlEngine controlEngine; + @Mock private MetadataHelper metadataHelper; + @Mock private ExtractService extractService; + @Mock private Mp3Reader mp3Reader; + @Mock private Mp4Reader mp4Reader; + @Mock private Metadata metadata; + @Mock private Metadata anotherMetadata; + @Mock private Set filesWithoutMinimumMetadata; + @Mock private File pepeGarden; + @Mock private File checkStyleFile; + @Mock private File file; + @Mock private Properties properties; + + private final Integer maxFilesAllowed = 50; + + private final List metadatas = new ArrayList(); + private final List fileList = new ArrayList<>(); + + private static final String ALBUM = "Lemon Flavored Kiss"; + private static final String MY_REMIXES = "My Remixes"; + private static final String ARTIST = "Raul Islas"; + + @BeforeEach + public void setup() throws Exception { + MockitoAnnotations.initMocks(this); + when(configurator.getControlEngine()).thenReturn(controlEngine); + when(properties.getProperty("max.files.allowed")).thenReturn(maxFilesAllowed.toString()); + } + + @Test + @DisplayName("extracting metadata when mp3") + public void shouldExtractMetadataWhenMp3(TestInfo testInfo) throws Exception { + log.info(testInfo.getDisplayName()); + setMp3Expectations(); + setFileListExpectations(); + + List metadatas = metadataService.extractMetadata(root); + Metadata metadata = metadatas.getFirst(); + + verifyExpectations(metadatas, metadata); + } + + @Test + @DisplayName("extracting metadata when mp4") + public void shouldExtractMetadataWhenMp4(TestInfo testInfo) throws Exception { + log.info(testInfo.getDisplayName()); + setMp4Expectations(); + setFileListExpectations(); + + List metadatas = metadataService.extractMetadata(root); + Metadata metadata = metadatas.getFirst(); + + verifyExpectations(metadatas, metadata); + } + + @Test + @DisplayName("not extracting metadata due to not having a valid audio file") + public void shouldDetectANotValidAudioFile(TestInfo testInfo) throws Exception { + log.info(testInfo.getDisplayName()); + fileList.add(checkStyleFile); + when(fileUtils.getFileList(root)).thenReturn(fileList); + + List metadatas = metadataService.extractMetadata(root); + + assertTrue(metadatas.isEmpty(), "should be empty due to not valid audio file"); + } + + @Test + @DisplayName("cleaning metadata list") + public void shouldCleanMetadataList(TestInfo testInfo) throws Exception { + log.info(testInfo.getDisplayName()); + setMp4Expectations(); + setFileListExpectations(); + + List metadatas = metadataService.extractMetadata(root); + + assertEquals(1, metadatas.size()); + + metadatas = metadataService.extractMetadata(root); + + assertEquals(1, metadatas.size()); + } + + @Test + @DisplayName("extracting metadata from file name") + public void shouldDetectAFileWithoutMinimumMetadata(TestInfo testInfo) throws Exception { + log.info(testInfo.getDisplayName()); + setMp3Expectations(); + fileList.add(pepeGarden); + + when(metadataHelper.createHashSet()).thenReturn(filesWithoutMinimumMetadata); + when(fileUtils.getFileList(root)).thenReturn(fileList); + + List metadatas = metadataService.extractMetadata(root); + + assertEquals(1, metadatas.size()); + verify(extractService).extractFromFileName(pepeGarden); + verify(filesWithoutMinimumMetadata).add(pepeGarden); + } + + @Test + @DisplayName("validating same album") + public void shouldKnowSameAlbum(TestInfo testInfo) { + log.info(testInfo.getDisplayName()); + when(metadata.getAlbum()).thenReturn(ALBUM); + when(anotherMetadata.getAlbum()).thenReturn(ALBUM); + + addMetadatas(); + assertTrue(metadataService.isSameAlbum(metadatas)); + } + + @Test + @DisplayName("validating different album") + public void shouldKnowDifferentAlbum(TestInfo testInfo) { + log.info(testInfo.getDisplayName()); + when(metadata.getAlbum()).thenReturn(ALBUM); + when(anotherMetadata.getAlbum()).thenReturn(MY_REMIXES); + + addMetadatas(); + + assertFalse(metadataService.isSameAlbum(metadatas)); + } + + @Test + @DisplayName("validating empty album") + public void shouldKnowWhenMetadataDoesNotHaveAlbum(TestInfo testInfo) { + log.info(testInfo.getDisplayName()); + when(metadata.getAlbum()).thenReturn(StringUtils.EMPTY); + when(anotherMetadata.getAlbum()).thenReturn(MY_REMIXES); + + addMetadatas(); + + assertFalse(metadataService.isSameAlbum(metadatas)); + } + + @Test + @DisplayName("validating not the same album if empty") + public void shouldKnowNotSameAlbumIfEmpty(TestInfo testInfo) { + log.info(testInfo.getDisplayName()); + when(metadata.getAlbum()).thenReturn(StringUtils.EMPTY); + when(anotherMetadata.getAlbum()).thenReturn(StringUtils.EMPTY); + + addMetadatas(); + assertFalse(metadataService.isSameAlbum(metadatas)); + } + + @Test + @DisplayName("validating same artist") + public void shouldKnowSameArtist(TestInfo testInfo) { + log.info(testInfo.getDisplayName()); + when(metadata.getArtist()).thenReturn(ARTIST); + when(anotherMetadata.getArtist()).thenReturn(ARTIST); + + addMetadatas(); + assertTrue(metadataService.isSameArtist(metadatas)); + } + + @Test + @DisplayName("validating different artist") + public void shouldKnowDifferentArtist(TestInfo testInfo) { + log.info(testInfo.getDisplayName()); + when(metadata.getArtist()).thenReturn(ARTIST); + when(anotherMetadata.getArtist()).thenReturn("Paul Van Dyk"); + + addMetadatas(); + + assertFalse(metadataService.isSameArtist(metadatas)); + } + + @Test + @DisplayName("validating empty artist") + public void shouldKnowWhenMetadataDoesNotHaveArtist(TestInfo testInfo) { + log.info(testInfo.getDisplayName()); + when(metadata.getArtist()).thenReturn(StringUtils.EMPTY); + when(anotherMetadata.getArtist()).thenReturn(ARTIST); + + addMetadatas(); + + assertFalse(metadataService.isSameArtist(metadatas)); + } + + @Test + @DisplayName("validating not the same artist if empty") + public void shouldKnowNotSameArtistIfEmpty(TestInfo testInfo) { + log.info(testInfo.getDisplayName()); + when(metadata.getArtist()).thenReturn(StringUtils.EMPTY); + when(anotherMetadata.getArtist()).thenReturn(StringUtils.EMPTY); + + addMetadatas(); + assertFalse(metadataService.isSameArtist(metadatas)); + } + + @Test + @DisplayName("not extracting metadata when too much files") + public void shouldNotExtractWhenTooMuchFiles(TestInfo testInfo) { + log.info(testInfo.getDisplayName()); + List fileList = mock(List.class); + + when(fileList.size()).thenReturn(maxFilesAllowed + 1); + when(fileUtils.getFileList(root)).thenReturn(fileList); + + assertThrows(TooMuchFilesException.class, () -> metadataService.extractMetadata(root)); + } + + private void setMp3Expectations() + throws CannotReadException, + IOException, + TagException, + ReadOnlyFileException, + MetadataException { + when(fileUtils.isMp3File(pepeGarden)).thenReturn(true); + when(mp3Reader.getMetadata(pepeGarden)).thenReturn(metadata); + } + + private void setMp4Expectations() + throws IOException, + TagException, + ReadOnlyFileException, + InvalidAudioFrameException, + MetadataException { + when(fileUtils.isM4aFile(pepeGarden)).thenReturn(true); + when(mp4Reader.getMetadata(pepeGarden)).thenReturn(metadata); + } + + private void setFileListExpectations() { + when(metadata.getArtist()).thenReturn("Jaytech"); + when(metadata.getTitle()).thenReturn("Pepe Garden (Original Mix)"); + fileList.add(pepeGarden); + when(fileUtils.getFileList(root)).thenReturn(fileList); + } + + private void verifyExpectations(List metadatas, Metadata metadata) { + assertEquals(1, metadatas.size()); + verify(fileUtils).getFileList(root); + assertEquals("Jaytech", metadata.getArtist()); + } + + private void addMetadatas() { + metadatas.add(metadata); + metadatas.add(anotherMetadata); + } } diff --git a/src/test/java/com/josdem/jmetadata/util/TestFileUtils.java b/src/test/java/com/josdem/jmetadata/util/TestFileUtils.java index e13da1c..c524576 100644 --- a/src/test/java/com/josdem/jmetadata/util/TestFileUtils.java +++ b/src/test/java/com/josdem/jmetadata/util/TestFileUtils.java @@ -16,8 +16,13 @@ package com.josdem.jmetadata.util; -import org.apache.commons.lang3.StringUtils; +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.Mockito.when; + import com.josdem.jmetadata.ApplicationConstants; +import java.io.File; +import java.util.logging.Logger; +import org.apache.commons.lang3.StringUtils; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -27,121 +32,112 @@ import org.mockito.MockitoAnnotations; import org.springframework.lang.NonNull; -import java.io.File; -import java.util.logging.Logger; - -import static org.junit.jupiter.api.Assertions.*; -import static org.mockito.Mockito.when; - class TestFileUtils { - private static final String ONLY_DIGITS_REGEX = "[0-9]+"; - - @InjectMocks - private final FileUtils fileUtils = new FileUtils(); - - @Mock - private File file; - - private final File root = new File("src/test/resources/audio"); - - private final Logger log = Logger.getLogger(this.getClass().getName()); - - @BeforeEach - public void setup() throws Exception { - MockitoAnnotations.initMocks(this); - } - - @Test - @DisplayName("scanning a directory") - public void shouldScanADirectory(TestInfo testInfo) { - log.info(() -> "Running test: " + testInfo.getDisplayName()); - var root = new MockFile("root"); - var fileList = fileUtils.getFileList(root); - assertEquals(2, fileList.size()); - } - - @Test - @DisplayName("creating a temp file for image file") - public void shouldCreateFileForImage(TestInfo testInfo) throws Exception { - log.info(() -> "Running test: " + testInfo.getDisplayName()); - var result = fileUtils.createFile(root, StringUtils.EMPTY, ApplicationConstants.IMAGE_EXT); - assertTrue(result.getName().matches("JMetadata_" + ONLY_DIGITS_REGEX + ".png")); - } - - @Test - @DisplayName("getting mp3 file") - public void shouldKnowIfIsMp3File(TestInfo testInfo) { - log.info(() -> "Running test: " + testInfo.getDisplayName()); - when(file.getPath()).thenReturn("somePath.mp3"); - assertTrue(fileUtils.isMp3File(file)); + private static final String ONLY_DIGITS_REGEX = "[0-9]+"; + + @InjectMocks private final FileUtils fileUtils = new FileUtils(); + + @Mock private File file; + + private final File root = new File("src/test/resources/audio"); + + private final Logger log = Logger.getLogger(this.getClass().getName()); + + @BeforeEach + public void setup() throws Exception { + MockitoAnnotations.initMocks(this); + } + + @Test + @DisplayName("scanning a directory") + public void shouldScanADirectory(TestInfo testInfo) { + log.info(() -> "Running test: " + testInfo.getDisplayName()); + var root = new MockFile("root"); + var fileList = fileUtils.getFileList(root); + assertEquals(2, fileList.size()); + } + + @Test + @DisplayName("creating a temp file for image file") + public void shouldCreateFileForImage(TestInfo testInfo) throws Exception { + log.info(() -> "Running test: " + testInfo.getDisplayName()); + var result = fileUtils.createFile(root, StringUtils.EMPTY, ApplicationConstants.IMAGE_EXT); + assertTrue(result.getName().matches("JMetadata_" + ONLY_DIGITS_REGEX + ".png")); + } + + @Test + @DisplayName("getting mp3 file") + public void shouldKnowIfIsMp3File(TestInfo testInfo) { + log.info(() -> "Running test: " + testInfo.getDisplayName()); + when(file.getPath()).thenReturn("somePath.mp3"); + assertTrue(fileUtils.isMp3File(file)); + } + + @Test + @DisplayName("not getting mp3 file") + public void shouldKnowIfIsNotMp3File(TestInfo testInfo) { + log.info(() -> "Running test: " + testInfo.getDisplayName()); + when(file.getPath()).thenReturn("somePath.wma"); + assertFalse(fileUtils.isMp3File(file)); + } + + @Test + @DisplayName("getting mp4 file") + public void shouldKnowIfIsMp4File(TestInfo testInfo) { + log.info(() -> "Running test: " + testInfo.getDisplayName()); + when(file.getPath()).thenReturn("somePath.m4a"); + assertTrue(fileUtils.isM4aFile(file)); + } + + @Test + @DisplayName("not getting mp4 file") + public void shouldKnowIfIsNotMp4File(TestInfo testInfo) { + log.info(() -> "Running test: " + testInfo.getDisplayName()); + when(file.getPath()).thenReturn("somePath.wma"); + assertFalse(fileUtils.isM4aFile(file)); + } + + @Test + @DisplayName("creating a temp file") + public void shouldCreateTempFile(TestInfo testInfo) throws Exception { + log.info(() -> "Running test: " + testInfo.getDisplayName()); + File tempFile = fileUtils.createTempFile(); + assertTrue(tempFile.getName().startsWith(ApplicationConstants.PREFIX)); + assertTrue(tempFile.getName().endsWith(ApplicationConstants.FILE_EXT)); + } + + @Test + @DisplayName("creating a temp file as text file") + public void shouldCreateFileForFile(TestInfo testInfo) { + log.info(() -> "Running test: " + testInfo.getDisplayName()); + File result = fileUtils.createFile(root, StringUtils.EMPTY, ApplicationConstants.FILE_EXT); + assertTrue(result.getName().matches("JMetadata_" + ONLY_DIGITS_REGEX + ".txt")); + } + + @Test + @DisplayName("creating a temp file as text file with prefix") + public void shouldCreateFileForFileWithPrefix(TestInfo testInfo) { + log.info(() -> "Running test: " + testInfo.getDisplayName()); + String prefix = "MIRI_"; + File result = fileUtils.createFile(root, prefix, ApplicationConstants.FILE_EXT); + assertTrue(result.getName().matches(prefix + ONLY_DIGITS_REGEX + ".txt")); + } + + private static class MockFile extends File { + String path = "src\\test\\resources"; + + public MockFile(String pathname) { + super(pathname); } - @Test - @DisplayName("not getting mp3 file") - public void shouldKnowIfIsNotMp3File(TestInfo testInfo) { - log.info(() -> "Running test: " + testInfo.getDisplayName()); - when(file.getPath()).thenReturn("somePath.wma"); - assertFalse(fileUtils.isMp3File(file)); + public String[] list() { + return new String[] {"fileNameOne", "fileNameTwo"}; } - @Test - @DisplayName("getting mp4 file") - public void shouldKnowIfIsMp4File(TestInfo testInfo) { - log.info(() -> "Running test: " + testInfo.getDisplayName()); - when(file.getPath()).thenReturn("somePath.m4a"); - assertTrue(fileUtils.isM4aFile(file)); + @NonNull + public String getAbsolutePath() { + return path; } - - @Test - @DisplayName("not getting mp4 file") - public void shouldKnowIfIsNotMp4File(TestInfo testInfo) { - log.info(() -> "Running test: " + testInfo.getDisplayName()); - when(file.getPath()).thenReturn("somePath.wma"); - assertFalse(fileUtils.isM4aFile(file)); - } - - @Test - @DisplayName("creating a temp file") - public void shouldCreateTempFile(TestInfo testInfo) throws Exception { - log.info(() -> "Running test: " + testInfo.getDisplayName()); - File tempFile = fileUtils.createTempFile(); - assertTrue(tempFile.getName().startsWith(ApplicationConstants.PREFIX)); - assertTrue(tempFile.getName().endsWith(ApplicationConstants.FILE_EXT)); - } - - @Test - @DisplayName("creating a temp file as text file") - public void shouldCreateFileForFile(TestInfo testInfo) { - log.info(() -> "Running test: " + testInfo.getDisplayName()); - File result = fileUtils.createFile(root, StringUtils.EMPTY, ApplicationConstants.FILE_EXT); - assertTrue(result.getName().matches("JMetadata_" + ONLY_DIGITS_REGEX + ".txt")); - } - - @Test - @DisplayName("creating a temp file as text file with prefix") - public void shouldCreateFileForFileWithPrefix(TestInfo testInfo) { - log.info(() -> "Running test: " + testInfo.getDisplayName()); - String prefix = "MIRI_"; - File result = fileUtils.createFile(root, prefix, ApplicationConstants.FILE_EXT); - assertTrue(result.getName().matches(prefix + ONLY_DIGITS_REGEX + ".txt")); - } - - private static class MockFile extends File { - String path = "src\\test\\resources"; - - public MockFile(String pathname) { - super(pathname); - } - - public String[] list() { - return new String[]{"fileNameOne", "fileNameTwo"}; - } - - @NonNull - public String getAbsolutePath() { - return path; - } - } - + } } diff --git a/src/test/java/com/josdem/jmetadata/util/TestImageUtils.java b/src/test/java/com/josdem/jmetadata/util/TestImageUtils.java index 7d2937a..cccc288 100644 --- a/src/test/java/com/josdem/jmetadata/util/TestImageUtils.java +++ b/src/test/java/com/josdem/jmetadata/util/TestImageUtils.java @@ -16,9 +16,18 @@ package com.josdem.jmetadata.util; -import org.apache.commons.lang3.StringUtils; +import static org.mockito.Matchers.isA; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + import com.josdem.jmetadata.ApplicationConstants; import com.josdem.jmetadata.service.ImageService; +import java.awt.*; +import java.awt.image.ImageObserver; +import java.io.File; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -27,85 +36,65 @@ import org.mockito.Mock; import org.mockito.MockitoAnnotations; -import java.awt.*; -import java.awt.image.ImageObserver; -import java.io.File; - -import static org.mockito.Matchers.isA; -import static org.mockito.Mockito.never; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; -import lombok.extern.slf4j.Slf4j; - @Slf4j - - public class TestImageUtils { - private static final Integer THREE_HUNDRED = 300; - - @InjectMocks - private final ImageUtils imageUtils = new ImageUtils(); - - @Mock - private ImageService imageService; - @Mock - private Image image; - @Mock - private File file; - @Mock - private FileUtils fileUtils; - @Mock - private File root; + private static final Integer THREE_HUNDRED = 300; + @InjectMocks private final ImageUtils imageUtils = new ImageUtils(); - @BeforeEach - public void setup() throws Exception { - MockitoAnnotations.initMocks(this); - } + @Mock private ImageService imageService; + @Mock private Image image; + @Mock private File file; + @Mock private FileUtils fileUtils; + @Mock private File root; - @Test - @DisplayName("saving cover art to file") - public void shouldSaveCoverArtToFile(TestInfo testInfo) throws Exception { - log.info(testInfo.getDisplayName()); - when(imageService.createTempFile()).thenReturn(file); - when(image.getHeight(isA(ImageObserver.class))).thenReturn(300); + @BeforeEach + public void setup() throws Exception { + MockitoAnnotations.initMocks(this); + } - imageUtils.saveCoverArtToFile(image); + @Test + @DisplayName("saving cover art to file") + public void shouldSaveCoverArtToFile(TestInfo testInfo) throws Exception { + log.info(testInfo.getDisplayName()); + when(imageService.createTempFile()).thenReturn(file); + when(image.getHeight(isA(ImageObserver.class))).thenReturn(300); - verify(imageService).write(image, file); - } + imageUtils.saveCoverArtToFile(image); - @Test - @DisplayName("not saving cover art if no image") - public void shouldNotSaveCoverArtIfNoImage(TestInfo testInfo) throws Exception { - log.info(testInfo.getDisplayName()); - imageUtils.saveCoverArtToFile(null); + verify(imageService).write(image, file); + } - verify(imageService, never()).createTempFile(); - } + @Test + @DisplayName("not saving cover art if no image") + public void shouldNotSaveCoverArtIfNoImage(TestInfo testInfo) throws Exception { + log.info(testInfo.getDisplayName()); + imageUtils.saveCoverArtToFile(null); - @Test - @DisplayName("not saving cover art if no root file") - public void shouldNotSaveCoverArtIfRootAndNoImage(TestInfo testInfo) throws Exception { - log.info(testInfo.getDisplayName()); - imageUtils.saveCoverArtToFile(null, file, StringUtils.EMPTY); + verify(imageService, never()).createTempFile(); + } - verify(fileUtils, never()).createFile(file, StringUtils.EMPTY, ApplicationConstants.IMAGE_EXT); - } + @Test + @DisplayName("not saving cover art if no root file") + public void shouldNotSaveCoverArtIfRootAndNoImage(TestInfo testInfo) throws Exception { + log.info(testInfo.getDisplayName()); + imageUtils.saveCoverArtToFile(null, file, StringUtils.EMPTY); - @Test - @DisplayName("saving cover art to file with custom prefix and path") - public void shouldSaveImageToFile() throws Exception { - var prefix = "MIRI_"; - var path = "PATH"; - when(fileUtils.createFile(root, prefix, ApplicationConstants.IMAGE_EXT)).thenReturn(file); - when(file.getAbsolutePath()).thenReturn(path); - when(image.getHeight(isA(ImageObserver.class))).thenReturn(THREE_HUNDRED); + verify(fileUtils, never()).createFile(file, StringUtils.EMPTY, ApplicationConstants.IMAGE_EXT); + } - imageUtils.saveCoverArtToFile(image, root, prefix); + @Test + @DisplayName("saving cover art to file with custom prefix and path") + public void shouldSaveImageToFile() throws Exception { + var prefix = "MIRI_"; + var path = "PATH"; + when(fileUtils.createFile(root, prefix, ApplicationConstants.IMAGE_EXT)).thenReturn(file); + when(file.getAbsolutePath()).thenReturn(path); + when(image.getHeight(isA(ImageObserver.class))).thenReturn(THREE_HUNDRED); - verify(fileUtils).createFile(root, prefix, ApplicationConstants.IMAGE_EXT); - } + imageUtils.saveCoverArtToFile(image, root, prefix); + verify(fileUtils).createFile(root, prefix, ApplicationConstants.IMAGE_EXT); + } }