From 15edcdebe66f09404c34653db8eef05df17a7249 Mon Sep 17 00:00:00 2001 From: denny Date: Sun, 24 Jan 2016 13:45:29 -0500 Subject: [PATCH] Adds AliasModel and AliasEvent and support for conversion from legacy playlist format. Renames PlaylistEditor to ChannelController --- src/alias/Alias.java | 36 ++- src/alias/AliasDirectory.java | 5 + src/alias/AliasEvent.java | 55 ++++ src/alias/AliasModel.java | 273 ++++++++++++++++++ src/alias/id/talkgroup/TalkgroupID.java | 5 - src/alias/id/talkgroup/TalkgroupIDEditor.java | 4 + src/controller/ControllerPanel.java | 6 +- .../channel/ChannelController.java} | 15 +- src/controller/channel/ChannelEvent.java | 2 +- src/controller/channel/ChannelModel.java | 6 +- src/gui/SDRTrunk.java | 6 +- src/instrument/gui/DecoderSelectionFrame.java | 4 +- src/playlist/Playlist.java | 21 ++ src/playlist/PlaylistManager.java | 181 +++++++----- 14 files changed, 526 insertions(+), 93 deletions(-) create mode 100644 src/alias/AliasEvent.java create mode 100644 src/alias/AliasModel.java rename src/{playlist/PlaylistEditor.java => controller/channel/ChannelController.java} (94%) diff --git a/src/alias/Alias.java b/src/alias/Alias.java index 6bb82983..76fca7a1 100644 --- a/src/alias/Alias.java +++ b/src/alias/Alias.java @@ -29,6 +29,8 @@ import audio.inverted.AudioType; public class Alias { + private String mList; + private String mGroup; private String mName; private int mColor; private String mIconName; @@ -44,7 +46,7 @@ public class Alias return getName(); } - @XmlAttribute + @XmlAttribute( name="name" ) public String getName() { return mName; @@ -55,6 +57,38 @@ public class Alias mName = name; } + @XmlAttribute( name="list" ) + public String getList() + { + return mList; + } + + public void setList( String list ) + { + mList = list; + } + + public boolean hasList() + { + return mList != null; + } + + @XmlAttribute( name="group" ) + public String getGroup() + { + return mGroup; + } + + public void setGroup( String group ) + { + mGroup = group; + } + + public boolean hasGroup() + { + return mGroup != null; + } + @XmlAttribute public int getColor() { diff --git a/src/alias/AliasDirectory.java b/src/alias/AliasDirectory.java index 0e6003ec..34202b2f 100644 --- a/src/alias/AliasDirectory.java +++ b/src/alias/AliasDirectory.java @@ -40,6 +40,11 @@ public class AliasDirectory list.update(); } } + + public void clearAliasLists() + { + mAliasList.clear(); + } @XmlElement( name = "alias_list" ) public ArrayList getAliasList() diff --git a/src/alias/AliasEvent.java b/src/alias/AliasEvent.java new file mode 100644 index 00000000..c1cacd74 --- /dev/null +++ b/src/alias/AliasEvent.java @@ -0,0 +1,55 @@ +/******************************************************************************* + * SDR Trunk + * Copyright (C) 2014-2016 Dennis Sheirer + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + ******************************************************************************/ +package alias; + +public class AliasEvent +{ + private Alias mAlias; + private Event mEvent; + + /** + * AliasEvent - event describing any changes to an alias + * @param alias - alias that changed + * @param event - change event + */ + public AliasEvent( Alias alias, Event event ) + { + mAlias = alias; + mEvent = event; + } + + public Alias getAlias() + { + return mAlias; + } + + public Event getEvent() + { + return mEvent; + } + + /** + * Channel events to describe the specific event + */ + public enum Event + { + ADD, + CHANGE, + DELETE; + } +} diff --git a/src/alias/AliasModel.java b/src/alias/AliasModel.java new file mode 100644 index 00000000..a9fe2540 --- /dev/null +++ b/src/alias/AliasModel.java @@ -0,0 +1,273 @@ +/******************************************************************************* + * SDR Trunk + * Copyright (C) 2014-2016 Dennis Sheirer + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + ******************************************************************************/ +package alias; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.concurrent.CopyOnWriteArrayList; + +import javax.swing.event.TableModelEvent; +import javax.swing.event.TableModelListener; +import javax.swing.table.TableModel; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import alias.AliasEvent.Event; +import sample.Broadcaster; +import sample.Listener; + +/** + * Alias Model + */ +public class AliasModel implements TableModel +{ + private final static Logger mLog = LoggerFactory.getLogger( AliasModel.class ); + + private List mAliases = new ArrayList<>(); + private List mTableModelListeners = new CopyOnWriteArrayList<>(); + private Broadcaster mAliasEventBroadcaster = new Broadcaster<>(); + + public AliasModel() + { + } + + /** + * Unmodifiable list of all aliases currently in the model + */ + public List getAliases() + { + return Collections.unmodifiableList( mAliases ); + } + + public Alias getAliasAtIndex( int row ) + { + if( mAliases.size() >= row ) + { + return mAliases.get( row ); + } + + return null; + } + + /** + * Returns a list of unique alias list names from across the alias set + */ + public List getListNames() + { + List listNames = new ArrayList<>(); + + for( Alias alias: mAliases ) + { + if( alias.hasList() && !listNames.contains( alias.getList() ) ) + { + listNames.add( alias.getList() ); + } + } + + Collections.sort( listNames ); + + return listNames; + } + + /** + * Returns a list of alias group names for all aliases that have a matching + * list name value + */ + public List getGroupNames( String listName ) + { + List groupNames = new ArrayList<>(); + + if( listName != null ) + { + for( Alias alias: mAliases ) + { + if( alias.hasList() && + alias.hasGroup() && + listName.equals( alias.getList() ) && + !groupNames.contains( alias.getGroup() ) ) + { + groupNames.add( alias.getGroup() ); + } + } + } + + Collections.sort( groupNames ); + + return groupNames; + } + + /** + * Bulk loading of aliases + */ + public void addAliases( List aliases ) + { + for( Alias alias: aliases ) + { + addAlias( alias ); + } + } + + /** + * Adds the alias to the model + */ + public int addAlias( Alias alias ) + { + if( alias != null ) + { + mAliases.add( alias ); + + int index = mAliases.size() - 1; + + broadcast( new TableModelEvent( this, index, index, + TableModelEvent.ALL_COLUMNS, TableModelEvent.INSERT ) ); + + broadcast( new AliasEvent( alias, Event.ADD ) ); + + return index; + } + + return -1; + } + + /** + * Removes the channel from the model and broadcasts a channel remove event + */ + public void removeAlias( Alias alias ) + { + if( alias != null ) + { + int index = mAliases.indexOf( alias ); + + mAliases.remove( alias ); + + broadcast( new TableModelEvent( this, index, index, + TableModelEvent.ALL_COLUMNS, TableModelEvent.DELETE ) ); + + broadcast( new AliasEvent( alias, Event.DELETE ) ); + } + } + + @Override + public int getRowCount() + { + return mAliases.size(); + } + + @Override + public int getColumnCount() + { + return 5; + } + + @Override + public String getColumnName( int columnIndex ) + { + switch( columnIndex ) + { + case 0: + return "List"; + case 1: + return "Group"; + case 2: + return "Name"; + case 3: + return "Icon"; + case 4: + return "Color"; + } + + return null; + } + + @Override + public Class getColumnClass( int columnIndex ) + { + return String.class; + } + + @Override + public boolean isCellEditable( int rowIndex, int columnIndex ) + { + return false; + } + + @Override + public Object getValueAt( int rowIndex, int columnIndex ) + { + Alias alias = mAliases.get( rowIndex ); + + switch( columnIndex ) + { + case 0: + return alias.getList(); + case 1: + return alias.getGroup(); + case 2: + return alias.getName(); + case 3: + return alias.getIconName(); + case 4: + return alias.getColor(); + } + + return null; + } + + @Override + public void setValueAt( Object aValue, int rowIndex, int columnIndex ) + { + throw new IllegalArgumentException( "Not yet implemented" ); + } + + private void broadcast( TableModelEvent event ) + { + for( TableModelListener listener: mTableModelListeners ) + { + listener.tableChanged( event ); + } + } + + @Override + public void addTableModelListener( TableModelListener listener ) + { + mTableModelListeners.add( listener ); + } + + @Override + public void removeTableModelListener( TableModelListener listener ) + { + mTableModelListeners.remove( listener ); + } + + public void broadcast( AliasEvent event ) + { + mAliasEventBroadcaster.broadcast( event ); + } + + public void addAliasEventListener( Listener listener ) + { + mAliasEventBroadcaster.addListener( listener ); + } + + public void removeAliasEventListener( Listener listener ) + { + mAliasEventBroadcaster.removeListener( listener ); + } +} diff --git a/src/alias/id/talkgroup/TalkgroupID.java b/src/alias/id/talkgroup/TalkgroupID.java index 5ca1df8a..2d8da48c 100644 --- a/src/alias/id/talkgroup/TalkgroupID.java +++ b/src/alias/id/talkgroup/TalkgroupID.java @@ -43,11 +43,6 @@ public class TalkgroupID extends AliasID mTalkgroup = talkgroup; } - public boolean hasAudioType() - { - return false; - } - public String toString() { StringBuilder sb = new StringBuilder(); diff --git a/src/alias/id/talkgroup/TalkgroupIDEditor.java b/src/alias/id/talkgroup/TalkgroupIDEditor.java index 1feda866..feec6d2d 100644 --- a/src/alias/id/talkgroup/TalkgroupIDEditor.java +++ b/src/alias/id/talkgroup/TalkgroupIDEditor.java @@ -36,6 +36,10 @@ public class TalkgroupIDEditor extends JPanel implements ActionListener private TalkgroupIDNode mTalkgroupIDNode; private JTextField mTextTalkgroupID; +<<<<<<< Upstream, based on origin/master +======= + private JLabel mLabelAudio; +>>>>>>> 92e63f7 Adds AliasModel and AliasEvent and support for conversion from legacy playlist format. private String mHelpText = "Enter a formatted talkgroup identifier.\n\n" + "P25 Talkgroup Format: hexadecimal value, 4 characters for " diff --git a/src/controller/ControllerPanel.java b/src/controller/ControllerPanel.java index bbe7273b..8cb4232c 100644 --- a/src/controller/ControllerPanel.java +++ b/src/controller/ControllerPanel.java @@ -33,7 +33,6 @@ import module.decode.event.CallEventPanel; import module.decode.event.MessageActivityPanel; import module.decode.state.ChannelList; import net.miginfocom.swing.MigLayout; -import playlist.PlaylistEditor; import playlist.PlaylistManager; import settings.SettingsManager; import source.SourceManager; @@ -44,6 +43,7 @@ import audio.AudioPanel; import com.jidesoft.swing.JideSplitPane; import com.jidesoft.swing.JideTabbedPane; +import controller.channel.ChannelController; import controller.channel.ChannelModel; import controller.channel.ChannelProcessingManager; @@ -59,7 +59,7 @@ public class ControllerPanel extends JPanel private ChannelSpectrumPanel mChannelSpectrumPanel; - private PlaylistEditor mPlaylistEditor; + private ChannelController mPlaylistEditor; private JideTabbedPane mTabbedPane; @@ -103,7 +103,7 @@ public class ControllerPanel extends JPanel mChannelStateList = new ChannelList( channelModel, channelProcessingManager, playlistManager, mSettingsManager ); - mPlaylistEditor = new PlaylistEditor( channelModel, playlistManager, sourceManager ); + mPlaylistEditor = new ChannelController( channelModel, playlistManager, sourceManager ); init(); } diff --git a/src/playlist/PlaylistEditor.java b/src/controller/channel/ChannelController.java similarity index 94% rename from src/playlist/PlaylistEditor.java rename to src/controller/channel/ChannelController.java index f48212cf..dbddfe84 100644 --- a/src/playlist/PlaylistEditor.java +++ b/src/controller/channel/ChannelController.java @@ -1,4 +1,4 @@ -package playlist; +package controller.channel; import java.awt.Rectangle; import java.awt.event.ActionEvent; @@ -20,19 +20,16 @@ import net.miginfocom.swing.MigLayout; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import playlist.PlaylistManager; import source.SourceManager; import com.jidesoft.swing.JideSplitPane; -import controller.channel.Channel; -import controller.channel.ChannelEditor; -import controller.channel.ChannelModel; - -public class PlaylistEditor extends JPanel +public class ChannelController extends JPanel implements ActionListener, ListSelectionListener { private static final long serialVersionUID = 1L; - private final static Logger mLog = LoggerFactory.getLogger( PlaylistEditor.class ); + private final static Logger mLog = LoggerFactory.getLogger( ChannelController.class ); private ChannelModel mChannelModel; private JTable mChannelTable; @@ -47,7 +44,7 @@ public class PlaylistEditor extends JPanel private JButton mCopyChannelButton = new JButton( COPY_CHANNEL ); private JButton mDeleteChannelButton = new JButton( DELETE_CHANNEL ); - public PlaylistEditor( ChannelModel channelModel, + public ChannelController( ChannelModel channelModel, PlaylistManager playlistManager, SourceManager sourceManager ) { @@ -205,7 +202,7 @@ public class PlaylistEditor extends JPanel if( toDelete != null ) { - int choice = JOptionPane.showConfirmDialog( PlaylistEditor.this, + int choice = JOptionPane.showConfirmDialog( ChannelController.this, "Do you want to delete this channel?", "Delete Channel?", JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE ); diff --git a/src/controller/channel/ChannelEvent.java b/src/controller/channel/ChannelEvent.java index a4166a2d..b71b5c94 100644 --- a/src/controller/channel/ChannelEvent.java +++ b/src/controller/channel/ChannelEvent.java @@ -1,6 +1,6 @@ /******************************************************************************* * SDR Trunk - * Copyright (C) 2014,2015 Dennis Sheirer + * Copyright (C) 2014-2016 Dennis Sheirer * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/controller/channel/ChannelModel.java b/src/controller/channel/ChannelModel.java index ab1e3a88..0ec88eb9 100644 --- a/src/controller/channel/ChannelModel.java +++ b/src/controller/channel/ChannelModel.java @@ -1,6 +1,6 @@ /******************************************************************************* * SDR Trunk - * Copyright (C) 2015 Dennis Sheirer + * Copyright (C) 2014-2016 Dennis Sheirer * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -26,11 +26,11 @@ import javax.swing.event.TableModelEvent; import javax.swing.event.TableModelListener; import javax.swing.table.TableModel; +import module.decode.DecoderType; + import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import playlist.PlaylistEditor; -import module.decode.DecoderType; import controller.channel.Channel.ChannelType; import controller.channel.ChannelEvent.Event; diff --git a/src/gui/SDRTrunk.java b/src/gui/SDRTrunk.java index 4447562f..41f5987e 100644 --- a/src/gui/SDRTrunk.java +++ b/src/gui/SDRTrunk.java @@ -60,6 +60,7 @@ import source.tuner.Tuner; import source.tuner.TunerSelectionListener; import spectrum.SpectralDisplayPanel; import util.TimeStamp; +import alias.AliasModel; import alias.action.AliasActionManager; import audio.AudioManager; @@ -118,9 +119,12 @@ public class SDRTrunk SourceManager sourceManager = new SourceManager( mSettingsManager, threadPoolManager ); + AliasModel aliasModel = new AliasModel(); + ChannelModel channelModel = new ChannelModel(); - PlaylistManager playlistManager = new PlaylistManager( threadPoolManager, channelModel ); + PlaylistManager playlistManager = new PlaylistManager( threadPoolManager, + aliasModel, channelModel ); RecorderManager recorderManager = new RecorderManager( threadPoolManager ); diff --git a/src/instrument/gui/DecoderSelectionFrame.java b/src/instrument/gui/DecoderSelectionFrame.java index 8c242b66..d96020b1 100644 --- a/src/instrument/gui/DecoderSelectionFrame.java +++ b/src/instrument/gui/DecoderSelectionFrame.java @@ -13,6 +13,7 @@ import module.decode.config.DecodeConfiguration; import net.miginfocom.swing.MigLayout; import playlist.PlaylistManager; import source.IControllableFileSource; +import alias.AliasModel; import controller.ThreadPoolManager; import controller.channel.ChannelModel; @@ -29,11 +30,12 @@ public class DecoderSelectionFrame extends JInternalFrame public DecoderSelectionFrame( JDesktopPane desktop, IControllableFileSource source ) { + AliasModel aliasModel = new AliasModel(); ChannelModel channelModel = new ChannelModel(); ThreadPoolManager tpm = new ThreadPoolManager(); - mPlaylistManager = new PlaylistManager( tpm, channelModel ); + mPlaylistManager = new PlaylistManager( tpm, aliasModel, channelModel ); mDesktop = desktop; mSource = source; diff --git a/src/playlist/Playlist.java b/src/playlist/Playlist.java index 0d63153f..d4ae9d0c 100644 --- a/src/playlist/Playlist.java +++ b/src/playlist/Playlist.java @@ -24,12 +24,14 @@ import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlSeeAlso; +import alias.Alias; import alias.AliasDirectory; import controller.channel.Channel; import controller.channel.map.ChannelMapList; import controller.system.SystemList; @XmlSeeAlso( { AliasDirectory.class, + Alias.class, Channel.class, ChannelMapList.class, SystemList.class } ) @@ -40,12 +42,24 @@ public class Playlist private AliasDirectory mAliasDirectory = new AliasDirectory(); private ChannelMapList mChannelMapList = new ChannelMapList(); private SystemList mSystemList = new SystemList(); + private List mAliases = new ArrayList<>(); private List mChannels = new ArrayList<>(); public Playlist() { } + @XmlElement( name = "alias" ) + public List getAliases() + { + return mAliases; + } + + public void setAliases( List aliases ) + { + mAliases = aliases; + } + @XmlElement( name = "channel" ) public List getChannels() { @@ -70,6 +84,13 @@ public class Playlist mAliasDirectory = directory; } + public boolean hasAliasDirectory() + { + return mAliasDirectory != null && + mAliasDirectory.getAliasList() != null && + !mAliasDirectory.getAliasList().isEmpty(); + } + @XmlElement( name = "system_list" ) public SystemList getSystemList() { diff --git a/src/playlist/PlaylistManager.java b/src/playlist/PlaylistManager.java index c8b4498e..ae97cfbb 100644 --- a/src/playlist/PlaylistManager.java +++ b/src/playlist/PlaylistManager.java @@ -37,10 +37,11 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import properties.SystemProperties; -import controller.channel.Channel; -import controller.channel.ChannelModel; -import controller.site.Site; -import controller.system.SystemList; +import alias.Alias; +import alias.AliasDirectory; +import alias.AliasList; +import alias.AliasModel; +import alias.Group; import controller.ThreadPoolManager; import controller.channel.Channel; import controller.channel.Channel.ChannelType; @@ -57,10 +58,8 @@ public class PlaylistManager implements ChannelEventListener private Playlist mPlaylist = new Playlist(); - private ChannelModel mChannelModel; - - public PlaylistManager( ChannelModel channelModel ) private ThreadPoolManager mThreadPoolManager; + private AliasModel mAliasModel; private ChannelModel mChannelModel; private AtomicBoolean mPlaylistSavePending = new AtomicBoolean(); @@ -76,10 +75,12 @@ public class PlaylistManager implements ChannelEventListener * @param threadPoolManager * @param channelModel */ - public PlaylistManager( ThreadPoolManager threadPoolManager, + public PlaylistManager( ThreadPoolManager threadPoolManager, + AliasModel aliasModel, ChannelModel channelModel ) { mThreadPoolManager = threadPoolManager; + mAliasModel = aliasModel; mChannelModel = channelModel; //Register for channel events so that we can save the playlist when @@ -101,7 +102,8 @@ public class PlaylistManager implements ChannelEventListener //all of the data mPlaylistLoading = true; - + + mAliasModel.addAliases( mPlaylist.getAliases() ); mChannelModel.addChannels( mPlaylist.getChannels() ); mPlaylistLoading = false; @@ -168,11 +170,57 @@ public class PlaylistManager implements ChannelEventListener } } + /** + * Channel event listener method. Monitors channel events for events that + * indicate that the playlist has changed and queues automatic playlist + * saving. + */ + @Override + public void channelChanged( ChannelEvent event ) + { + //Only save playlist for changes to standard channels (not traffic) + if( event.getChannel().getChannelType() == ChannelType.STANDARD ) + { + switch( event.getEvent() ) + { + case NOTIFICATION_ADD: + case NOTIFICATION_CONFIGURATION_CHANGE: + case NOTIFICATION_DELETE: + case NOTIFICATION_PROCESSING_START: + case NOTIFICATION_PROCESSING_STOP: + schedulePlaylistSave(); + break; + case NOTIFICATION_ENABLE_REJECTED: + case NOTIFICATION_SELECTION_CHANGE: + case NOTIFICATION_STATE_RESET: + case REQUEST_DELETE: + case REQUEST_DESELECT: + case REQUEST_DISABLE: + case REQUEST_ENABLE: + case REQUEST_SELECT: + //Do nothing for these event types + break; + default: + //When a new event enum entry is added and received, throw an + //exception here to ensure developer adds support for the + //use case + throw new IllegalArgumentException( "Unrecognized Channel " + + "Event [" + event.getEvent().name() + "]" ); + } + } + } + public void save() { //TODO: recreate the playlist and load values from each of the models + mLog.debug( "Aliases in model:" + mAliasModel.getAliases().size() ); + mPlaylist.setAliases( mAliasModel.getAliases() ); + mLog.debug( "Aliases in playlist:" + mPlaylist.getAliases().size() ); + + mLog.debug( "Channels in model:" + mChannelModel.getChannels().size() ); mPlaylist.setChannels( mChannelModel.getChannels() ); + mLog.debug( "Channels in playlist:" + mPlaylist.getChannels().size() ); JAXBContext context = null; @@ -370,16 +418,27 @@ public class PlaylistManager implements ChannelEventListener playlistPath.toString() + "]" ); } + boolean saveRequired = false; + if( mPlaylist == null ) { mPlaylist = new Playlist(); - save(); + saveRequired = true; } + //Check for and convert from legacy play list format - if( mPlaylist.hasSystemList() ) + if( mPlaylist.hasSystemList() || mPlaylist.hasAliasDirectory() ) { convertPlaylistFormat(); + saveRequired = true; + } + + transferPlaylistToModels(); + + if( saveRequired ) + { + save(); } } @@ -388,35 +447,60 @@ public class PlaylistManager implements ChannelEventListener */ private void convertPlaylistFormat() { - mLog.info( "Legacy playlist format detected - converting ..." ); + mLog.info( "Legacy playlist format detected - converting" ); createBackupPlaylist(); //Playlist version 1 to version 2 format conversion. In order to keep //backwards compatibility, transfer all of the System-Site-Channel //objects over to the new channel list format - SystemList systemList = mPlaylist.getSystemList(); - - for( controller.system.System system: systemList.getSystem() ) + if( mPlaylist.hasSystemList() ) { - for( Site site: system.getSite() ) + SystemList systemList = mPlaylist.getSystemList(); + + for( controller.system.System system: systemList.getSystem() ) { - for( Channel channel: site.getChannel() ) + for( Site site: system.getSite() ) { - channel.setSystem( system.getName() ); - channel.setSite( site.getName() ); - - mPlaylist.getChannels().add( channel ); + for( Channel channel: site.getChannel() ) + { + channel.setSystem( system.getName() ); + channel.setSite( site.getName() ); + + mPlaylist.getChannels().add( channel ); + } } } + + mPlaylist.getSystemList().clearSystems(); + + mLog.info( "Converted [" + mPlaylist.getChannels().size() + + "] channels to new playlist format" ); + } + + if( mPlaylist.hasAliasDirectory() ) + { + AliasDirectory aliasDirectory = mPlaylist.getAliasDirectory(); + + for( AliasList list: aliasDirectory.getAliasList() ) + { + for( Group group: list.getGroup() ) + { + for( Alias alias: group.getAlias() ) + { + alias.setList( list.getName() ); + alias.setGroup( group.getName() ); + + mPlaylist.getAliases().add( alias ); + } + } + } + + mPlaylist.getAliasDirectory().clearAliasLists(); + + mLog.info( "Converted [" + mPlaylist.getAliases().size() + + "] aliases to new playlist format" ); } - - mPlaylist.getSystemList().clearSystems(); - - mLog.info( "Converted [" + mPlaylist.getChannels().size() + - "] channels to new playlist format" ); - - save(); } /** @@ -448,46 +532,5 @@ public class PlaylistManager implements ChannelEventListener mPlaylistSavePending.set( false ); } - - //Check for and convert from legacy play list format - if( mPlaylist.hasSystemList() ) - { - convertPlaylistFormat(); - } - } - - /** - * Converts playlist data over to new format - */ - private void convertPlaylistFormat() - { - mLog.info( "Legacy playlist format detected - converting ..." ); - - createBackupPlaylist(); - - //Playlist version 1 to version 2 format conversion. In order to keep - //backwards compatibility, transfer all of the System-Site-Channel - //objects over to the new channel list format - SystemList systemList = mPlaylist.getSystemList(); - - for( controller.system.System system: systemList.getSystem() ) - { - for( Site site: system.getSite() ) - { - for( Channel channel: site.getChannel() ) - { - channel.setSystem( system.getName() ); - channel.setSite( site.getName() ); - - mPlaylist.getChannels().add( channel ); - } - } - } - - mPlaylist.getSystemList().clearSystems(); - - mLog.info( "Converted [" + mPlaylist.getChannels().size() + "] channels to new playlist format" ); - - save(); } }