Updates pull request from Roman Tsypuk to convert the build system from

ant to gradle.  Removes linux and windows application launch scripts and
produces an executable jar with all resources included.
This commit is contained in:
Denny
2017-12-17 07:28:03 -05:00
parent a1535c4157
commit 9316599dec
981 changed files with 8368 additions and 9049 deletions

View File

@@ -0,0 +1,453 @@
/*******************************************************************************
* SDR Trunk
* Copyright (C) 2014-2017 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 <http://www.gnu.org/licenses/>
******************************************************************************/
package io.github.dsheirer.playlist;
import io.github.dsheirer.alias.AliasEvent;
import io.github.dsheirer.alias.AliasModel;
import io.github.dsheirer.audio.broadcast.BroadcastEvent;
import io.github.dsheirer.audio.broadcast.BroadcastModel;
import io.github.dsheirer.controller.channel.Channel.ChannelType;
import io.github.dsheirer.controller.channel.ChannelEvent;
import io.github.dsheirer.controller.channel.ChannelEventListener;
import io.github.dsheirer.controller.channel.ChannelModel;
import io.github.dsheirer.controller.channel.map.ChannelMapEvent;
import io.github.dsheirer.controller.channel.map.ChannelMapModel;
import io.github.dsheirer.playlist.version1.PlaylistConverterV1ToV2;
import io.github.dsheirer.properties.SystemProperties;
import io.github.dsheirer.sample.Listener;
import io.github.dsheirer.util.ThreadPool;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.StandardCopyOption;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicBoolean;
public class PlaylistManager implements ChannelEventListener
{
private final static Logger mLog = LoggerFactory.getLogger(PlaylistManager.class);
private AliasModel mAliasModel;
private BroadcastModel mBroadcastModel;
private ChannelModel mChannelModel;
private ChannelMapModel mChannelMapModel;
private Path mPlaylistFolderPath;
private Path mPlaylistCurrentPath;
private Path mPlaylistBackupPath;
private Path mPlaylistLockPath;
private AtomicBoolean mPlaylistSavePending = new AtomicBoolean();
private boolean mPlaylistLoading = false;
/**
* Playlist manager - manages all channel configurations, channel maps, and
* alias lists and handles loading or persisting to a playlist.xml file
*
* Monitors playlist changes to automatically save configuration changes
* after they occur.
*
* @param channelModel
*/
public PlaylistManager(AliasModel aliasModel, BroadcastModel broadcastModel, ChannelModel channelModel, ChannelMapModel channelMapModel)
{
mAliasModel = aliasModel;
mBroadcastModel = broadcastModel;
mChannelModel = channelModel;
mChannelMapModel = channelMapModel;
//Register for alias, channel and channel map events so that we can
//save the playlist when there are any changes
mChannelModel.addListener(this);
mAliasModel.addListener(new Listener<AliasEvent>()
{
@Override
public void receive(AliasEvent t)
{
//Save the playlist for all alias events
schedulePlaylistSave();
}
});
mChannelMapModel.addListener(new Listener<ChannelMapEvent>()
{
@Override
public void receive(ChannelMapEvent t)
{
//Save the playlist for all channel map events
schedulePlaylistSave();
}
});
mBroadcastModel.addListener(new Listener<BroadcastEvent>()
{
@Override
public void receive(BroadcastEvent broadcastEvent)
{
switch(broadcastEvent.getEvent())
{
case CONFIGURATION_ADD:
case CONFIGURATION_CHANGE:
case CONFIGURATION_DELETE:
schedulePlaylistSave();
break;
case BROADCASTER_ADD:
case BROADCASTER_QUEUE_CHANGE:
case BROADCASTER_STATE_CHANGE:
case BROADCASTER_STREAMED_COUNT_CHANGE:
case BROADCASTER_AGED_OFF_COUNT_CHANGE:
case BROADCASTER_DELETE:
default:
//Do nothing
break;
}
}
});
}
/**
* Loads playlist from the current playlist file, or the default playlist file,
* as specified in the current SDRTRunk system settings
*/
public void init()
{
PlaylistV2 playlist = load();
boolean saveRequired = false;
if(playlist == null)
{
mLog.info("Couldn't find version 2 playlist - looking for version 1 playlist to convert");
Path playlistV1Path = getPlaylistFolderPath().resolve("playlist.xml");
PlaylistConverterV1ToV2 converter = new PlaylistConverterV1ToV2(playlistV1Path);
if(converter.hasErrorMessages())
{
mLog.error("Playlist version 1 conversion errors: " + converter.getErrorMessages());
}
playlist = converter.getConvertedPlaylist();
saveRequired = true;
}
transferPlaylistToModels(playlist);
if(saveRequired)
{
schedulePlaylistSave();
}
}
/**
* Transfers data from persisted playlist into system models
*/
private void transferPlaylistToModels(PlaylistV2 playlist)
{
if(playlist != null)
{
mPlaylistLoading = true;
mAliasModel.addAliases(playlist.getAliases());
mBroadcastModel.addBroadcastConfigurations(playlist.getBroadcastConfigurations());
mChannelMapModel.addChannelMaps(playlist.getChannelMaps());
//Channel model has to be loaded last since it will auto-start channels that are enabled
mChannelModel.addChannels(playlist.getChannels());
mPlaylistLoading = false;
}
}
/**
* 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:
schedulePlaylistSave();
break;
}
}
}
/**
* Folder where playlist, backup and lock file are stored
*/
private Path getPlaylistFolderPath()
{
if(mPlaylistFolderPath == null)
{
SystemProperties props = SystemProperties.getInstance();
mPlaylistFolderPath = props.getApplicationFolder("playlist");
}
return mPlaylistFolderPath;
}
/**
* Path to current playlist
*/
private Path getPlaylistPath()
{
if(mPlaylistCurrentPath == null)
{
//Temporarily removed and hard-coding the V2 playlist name. Will be reimplemented with future
//enhancement that allows multiple playlists.
// SystemProperties props = SystemProperties.getInstance();
// String playlistDefault = props.get("playlist.defaultfilename", "playlist_v2.xml");
// String playlistCurrent = props.get("playlist.currentfilename", playlistDefault);
mPlaylistCurrentPath = getPlaylistFolderPath().resolve("playlist_v2.xml");
}
return mPlaylistCurrentPath;
}
/**
* Path to most recent playlist backup
*/
private Path getPlaylistBackupPath()
{
if(mPlaylistBackupPath == null)
{
SystemProperties props = SystemProperties.getInstance();
String playlistDefault = props.get("playlist.defaultfilename", "playlist_v2.xml");
String playlistCurrent = props.get("playlist.currentfilename", playlistDefault);
String playlistBackup = playlistCurrent.replace(".xml", ".bak");
mPlaylistBackupPath = getPlaylistFolderPath().resolve(playlistBackup);
}
return mPlaylistBackupPath;
}
/**
* Path to playlist lock file that is created prior to saving a playlist and removed immediately thereafter.
* Presence of a lock file indicates an incomplete or corrupt playlist file on startup.
*/
private Path getPlaylistLockPath()
{
if(mPlaylistLockPath == null)
{
SystemProperties props = SystemProperties.getInstance();
String playlistDefault = props.get("playlist.defaultfilename", "playlist_v2.xml");
String playlistCurrent = props.get("playlist.currentfilename", playlistDefault);
String playlistLock = playlistCurrent.replace(".xml", ".lock");
mPlaylistLockPath = getPlaylistFolderPath().resolve(playlistLock);
}
return mPlaylistLockPath;
}
/**
* Saves the current playlist
*/
private void save()
{
PlaylistV2 playlist = new PlaylistV2();
playlist.setAliases(mAliasModel.getAliases());
playlist.setBroadcastConfigurations(mBroadcastModel.getBroadcastConfigurations());
playlist.setChannels(mChannelModel.getChannels());
playlist.setChannelMaps(mChannelMapModel.getChannelMaps());
JAXBContext context = null;
//Create a backup copy of the current playlist
if(Files.exists(getPlaylistPath()))
{
try
{
Files.copy(getPlaylistPath(), getPlaylistBackupPath(), StandardCopyOption.REPLACE_EXISTING);
}
catch(Exception e)
{
mLog.error("Error creating backup copy of current playlist prior to saving updates [" +
getPlaylistPath().toString() + "]", e);
}
}
//Create a temporary lock file to signify that we're in the process of updating the playlist
if(!Files.exists(getPlaylistLockPath()))
{
try
{
Files.createFile(getPlaylistLockPath());
}
catch(IOException e)
{
mLog.error("Error creating temporary lock file prior to saving playlist [" +
getPlaylistLockPath().toString() + "]", e);
}
}
try(OutputStream out = Files.newOutputStream(getPlaylistPath()))
{
context = JAXBContext.newInstance(PlaylistV2.class);
Marshaller m = context.createMarshaller();
m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
m.marshal(playlist, out);
out.flush();
//Remove the playlist lock file to indicate that we successfully saved the file
if(Files.exists(getPlaylistLockPath()))
{
Files.delete(getPlaylistLockPath());
}
}
catch(JAXBException je)
{
mLog.error("JAXB exception while serializing the playlist to a file [" + getPlaylistPath().toString() +
"]", je);
}
catch(IOException ioe)
{
mLog.error("IO error while writing the playlist to a file [" + getPlaylistPath().toString() + "]", ioe);
}
catch(Exception e)
{
mLog.error("Error while saving playlist [" + getPlaylistPath().toString() + "]", e);
}
}
/**
* Loads a version 2 playlist
*/
public PlaylistV2 load()
{
mLog.info("Attempting to load version 2 playlist file [" + getPlaylistPath().toString() + "]");
PlaylistV2 playlist = null;
//Check for a lock file that indicates the previous save attempt was incomplete or had an error
if(Files.exists(getPlaylistLockPath()))
{
try
{
//Remove the previous playlist
Files.delete(getPlaylistPath());
//Copy the backup file to restore the previous playlist
if(Files.exists(getPlaylistBackupPath()))
{
Files.copy(getPlaylistBackupPath(), getPlaylistPath());
}
//Remove the lock file
Files.delete(getPlaylistLockPath());
}
catch(IOException ioe)
{
mLog.error("Previous playlist save attempt was incomplete and there was an error restoring the " +
"playlist backup file", ioe);
}
}
if(Files.exists(getPlaylistPath()))
{
JAXBContext context = null;
try(InputStream in = Files.newInputStream(getPlaylistPath()))
{
context = JAXBContext.newInstance(PlaylistV2.class);
Unmarshaller m = context.createUnmarshaller();
playlist = (PlaylistV2) m.unmarshal(in);
}
catch(JAXBException je)
{
mLog.error("JAXB exception while loading/unmarshalling playlist", je);
}
catch(IOException ioe)
{
mLog.error("IO error while reading playlist file", ioe);
}
}
else
{
mLog.info("PlaylistManager - playlist not found at [" + getPlaylistPath().toString() + "]");
}
return playlist;
}
/**
* Schedules a playlist save task. Subsequent calls to this method will be ignored until the save event occurs,
* thus limiting repetitive playlist saving to a minimum.
*/
private void schedulePlaylistSave()
{
if(!mPlaylistLoading)
{
if(mPlaylistSavePending.compareAndSet(false, true))
{
ThreadPool.SCHEDULED.schedule(new PlaylistSaveTask(), 2, TimeUnit.SECONDS);
}
}
}
/**
* Resets the playlist save pending flag to false and proceeds to save the playlist.
*/
public class PlaylistSaveTask implements Runnable
{
@Override
public void run()
{
save();
mPlaylistSavePending.set(false);
}
}
}

View File

@@ -0,0 +1,87 @@
/*******************************************************************************
* 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 <http://www.gnu.org/licenses/>
******************************************************************************/
package io.github.dsheirer.playlist;
import io.github.dsheirer.alias.Alias;
import io.github.dsheirer.audio.broadcast.BroadcastConfiguration;
import io.github.dsheirer.controller.channel.Channel;
import io.github.dsheirer.controller.channel.map.ChannelMap;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlSeeAlso;
import java.util.ArrayList;
import java.util.List;
@XmlSeeAlso( { Alias.class,Channel.class,ChannelMap.class,BroadcastConfiguration.class} )
@XmlRootElement( name = "playlist")
public class PlaylistV2
{
private List<Alias> mAliases = new ArrayList<>();
private List<BroadcastConfiguration> mBroadcastConfigurations = new ArrayList<>();
private List<Channel> mChannels = new ArrayList<>();
private List<ChannelMap> mChannelMaps = new ArrayList<>();
public PlaylistV2()
{
}
@XmlElement( name = "alias" )
public List<Alias> getAliases()
{
return mAliases;
}
public void setAliases( List<Alias> aliases )
{
mAliases = aliases;
}
@XmlElement( name = "channel" )
public List<Channel> getChannels()
{
return mChannels;
}
public void setChannels( List<Channel> channels )
{
mChannels = channels;
}
@XmlElement( name = "channel_map" )
public List<ChannelMap> getChannelMaps()
{
return mChannelMaps;
}
public void setChannelMaps( List<ChannelMap> channelMaps )
{
mChannelMaps = channelMaps;
}
@XmlElement(name = "stream")
public List<BroadcastConfiguration> getBroadcastConfigurations()
{
return mBroadcastConfigurations;
}
public void setBroadcastConfigurations(List<BroadcastConfiguration> configurations)
{
mBroadcastConfigurations = configurations;
}
}

View File

@@ -0,0 +1,90 @@
/*******************************************************************************
* SDR Trunk
* Copyright (C) 2014 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 <http://www.gnu.org/licenses/>
******************************************************************************/
package io.github.dsheirer.playlist.version1;
import io.github.dsheirer.alias.AliasList;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlSeeAlso;
import java.util.ArrayList;
@XmlSeeAlso( { AliasList.class} )
@XmlRootElement( name = "alias_directory" )
@Deprecated
public class AliasDirectory
{
private ArrayList<AliasListOld> mAliasList = new ArrayList<>();
public AliasDirectory()
{
}
public void refresh()
{
}
public void clearAliasLists()
{
mAliasList.clear();
}
@XmlElement( name = "alias_list" )
public ArrayList<AliasListOld> getAliasList()
{
return mAliasList;
}
public void setAliasList( ArrayList<AliasListOld> lists )
{
mAliasList = lists;
if( mAliasList == null )
{
mAliasList = new ArrayList<AliasListOld>();
}
}
public void addAliasList( AliasListOld list )
{
mAliasList.add( list );
}
public void removeAliasList( AliasListOld list )
{
mAliasList.remove( list );
}
/**
* Gets the named alias list, or returns an empty alias list
*/
public AliasListOld getAliasList( String name )
{
AliasListOld retVal = new AliasListOld( name );
for( AliasListOld list: mAliasList )
{
if( list.getName().equalsIgnoreCase( name ) )
{
return list;
}
}
return retVal;
}
}

View File

@@ -0,0 +1,526 @@
/*******************************************************************************
* SDR Trunk
* Copyright (C) 2014,2015 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 <http://www.gnu.org/licenses/>
******************************************************************************/
package io.github.dsheirer.playlist.version1;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import io.github.dsheirer.alias.Alias;
import io.github.dsheirer.alias.action.AliasAction;
import io.github.dsheirer.alias.action.beep.BeepAction;
import io.github.dsheirer.alias.action.clip.ClipAction;
import io.github.dsheirer.alias.action.script.ScriptAction;
import io.github.dsheirer.alias.id.AliasID;
import io.github.dsheirer.alias.id.esn.Esn;
import io.github.dsheirer.alias.id.fleetsync.FleetsyncID;
import io.github.dsheirer.alias.id.lojack.LoJackFunctionAndID;
import io.github.dsheirer.alias.id.mdc.MDC1200ID;
import io.github.dsheirer.alias.id.mobileID.Min;
import io.github.dsheirer.alias.id.mpt1327.MPT1327ID;
import io.github.dsheirer.alias.id.nonrecordable.NonRecordable;
import io.github.dsheirer.alias.id.priority.Priority;
import io.github.dsheirer.alias.id.siteID.SiteID;
import io.github.dsheirer.alias.id.status.StatusID;
import io.github.dsheirer.alias.id.talkgroup.TalkgroupID;
import io.github.dsheirer.alias.id.uniqueID.UniqueID;
import io.github.dsheirer.module.decode.lj1200.LJ1200Message.Function;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlSeeAlso;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
@XmlSeeAlso({Alias.class,
/* Alias ID's */
AliasID.class,
FleetsyncID.class,
Esn.class,
Group.class,
LoJackFunctionAndID.class,
MDC1200ID.class,
Min.class,
MPT1327ID.class,
UniqueID.class,
SiteID.class,
StatusID.class,
TalkgroupID.class,
/* Alias Attributes */
NonRecordable.class,
Priority.class,
/* Alias Actions */
AliasAction.class,
BeepAction.class,
ClipAction.class,
ScriptAction.class})
@Deprecated
@XmlRootElement(name = "alias_list")
public class AliasListOld implements Comparable<AliasListOld>
{
private final static Logger mLog = LoggerFactory.getLogger(AliasListOld.class);
private String mName;
private ArrayList<Group> mGroups = new ArrayList<Group>();
private Map<String,Alias> mESN = new HashMap<>();
private Map<String,Alias> mFleetsync = new HashMap<>();
private Map<LoJackFunctionAndID,Alias> mLoJack = new HashMap<>();
private Map<String,Alias> mMDC1200 = new HashMap<>();
private Map<String,Alias> mMobileID = new HashMap<>();
private Map<String,Alias> mMPT1327 = new HashMap<>();
private Map<String,Alias> mSiteID = new HashMap<>();
private Map<Integer,Alias> mStatus = new HashMap<>();
private Map<String,Alias> mTalkgroup = new HashMap<>();
private Map<Integer,Alias> mUniqueID = new HashMap<>();
private boolean mESNWildcard = false;
private boolean mMobileIDWildcard = false;
private boolean mFleetsyncWildcard = false;
private boolean mMDC1200Wildcard = false;
private boolean mMPT1327Wildcard = false;
private boolean mSiteWildcard = false;
private boolean mTalkgroupWildcard = false;
public AliasListOld()
{
this(null);
}
public AliasListOld(String name)
{
mName = name;
update();
}
/**
* Load/Reload all lookup hashmaps
*/
public void update()
{
//Clear hashmaps
mESN.clear();
mFleetsync.clear();
mLoJack.clear();
mMDC1200.clear();
mMobileID.clear();
mMPT1327.clear();
mSiteID.clear();
mStatus.clear();
mTalkgroup.clear();
mUniqueID.clear();
for(Group group : mGroups)
{
for(Alias alias : group.getAlias())
{
for(AliasID id : alias.getId())
{
switch(id.getType())
{
case ESN:
Esn esn = (Esn) id;
if(esn.getEsn().contains("*"))
{
mESNWildcard = true;
mESN.put(fixWildcard(esn.getEsn()), alias);
}
else
{
mESN.put(esn.getEsn(), alias);
}
break;
case FLEETSYNC:
FleetsyncID fs = (FleetsyncID) id;
if(fs.getIdent().contains("*"))
{
mFleetsyncWildcard = true;
mFleetsync.put(fixWildcard(fs.getIdent()), alias);
}
else
{
mFleetsync.put(fs.getIdent(), alias);
}
break;
case LOJACK:
mLoJack.put((LoJackFunctionAndID) id, alias);
break;
case MDC1200:
MDC1200ID mdc = (MDC1200ID) id;
if(mdc.getIdent().contains("*"))
{
mMDC1200Wildcard = true;
//Replace (*) wildcard with regex wildcard (.)
mMDC1200.put(fixWildcard(mdc.getIdent()), alias);
}
else
{
mMDC1200.put(mdc.getIdent(), alias);
}
break;
case MPT1327:
MPT1327ID mpt = (MPT1327ID) id;
String ident = mpt.getIdent();
if(ident != null)
{
if(ident.contains("*"))
{
mMPT1327Wildcard = true;
//Replace (*) wildcard with regex wildcard (.)
mMPT1327.put(fixWildcard(ident), alias);
}
else
{
mMPT1327.put(ident, alias);
}
}
break;
case MIN:
Min min = (Min) id;
if(min.getMin().contains("*"))
{
mMobileIDWildcard = true;
mMobileID.put(fixWildcard(min.getMin()), alias);
}
else
{
mMobileID.put(min.getMin(), alias);
}
break;
case LTR_NET_UID:
UniqueID uid = (UniqueID) id;
mUniqueID.put(uid.getUid(), alias);
break;
case SITE:
SiteID siteID = (SiteID) id;
if(siteID.getSite().contains("*"))
{
mSiteWildcard = true;
mSiteID.put(fixWildcard(siteID.getSite()), alias);
}
else
{
mSiteID.put(siteID.getSite(), alias);
}
break;
case STATUS:
mStatus.put(((StatusID) id).getStatus(), alias);
break;
case TALKGROUP:
TalkgroupID tgid = (TalkgroupID) id;
if(tgid.getTalkgroup().contains("*"))
{
mTalkgroupWildcard = true;
//Replace (*) wildcard with regex wildcard (.)
mTalkgroup.put(fixWildcard(tgid.getTalkgroup()), alias);
}
else
{
mTalkgroup.put(tgid.getTalkgroup(), alias);
}
break;
case NON_RECORDABLE:
case PRIORITY:
//We don't maintain lookups for these items
break;
default:
mLog.warn("Unrecognized Alias ID Type:" + id.getType().name());
break;
}
}
}
}
}
/**
* Converts user wildcard character (*) to regex single character wildcard (.)
* but ignores a regex multi-character wildcard (.*)
*/
private String fixWildcard(String value)
{
if(value.contains("*") && !value.contains(".*"))
{
return value.replace("*", ".");
}
return value;
}
public Alias getSiteID(String siteID)
{
if(siteID != null)
{
if(mSiteWildcard)
{
for(String regex : mSiteID.keySet())
{
if(siteID.matches(regex))
{
return mSiteID.get(regex);
}
}
}
else
{
return mSiteID.get(siteID);
}
}
return null;
}
public Alias getStatus(int status)
{
return mStatus.get(status);
}
public Alias getUniqueID(int uniqueID)
{
return mUniqueID.get(uniqueID);
}
public Alias getESNAlias(String esn)
{
if(esn != null)
{
if(mESNWildcard)
{
for(String regex : mESN.keySet())
{
if(esn.matches(regex))
{
return mESN.get(regex);
}
}
}
else
{
return mESN.get(esn);
}
}
return null;
}
public Alias getFleetsyncAlias(String ident)
{
if(ident != null)
{
if(mFleetsyncWildcard)
{
for(String regex : mFleetsync.keySet())
{
if(ident.matches(regex))
{
return mFleetsync.get(regex);
}
}
}
else
{
return mFleetsync.get(ident);
}
}
return null;
}
public Alias getLoJackAlias(Function function, String id)
{
if(id != null)
{
for(LoJackFunctionAndID lojack : mLoJack.keySet())
{
if(lojack.matches(function, id))
{
return mLoJack.get(lojack);
}
}
}
return null;
}
public Alias getMDC1200Alias(String ident)
{
if(ident != null)
{
if(mMDC1200Wildcard)
{
for(String regex : mMDC1200.keySet())
{
if(ident.matches(regex))
{
return mMDC1200.get(regex);
}
}
}
else
{
return mMDC1200.get(ident);
}
}
return null;
}
public Alias getMPT1327Alias(String ident)
{
if(ident != null)
{
if(mMPT1327Wildcard)
{
for(String regex : mMPT1327.keySet())
{
if(ident.matches(regex))
{
return mMPT1327.get(regex);
}
}
}
else
{
return mMPT1327.get(ident);
}
}
return null;
}
public Group getGroup(Alias alias)
{
if(alias != null)
{
for(Group group : mGroups)
{
if(group.contains(alias))
{
return group;
}
}
}
return null;
}
public Alias getMobileIDNumberAlias(String ident)
{
if(ident != null)
{
if(mMobileIDWildcard)
{
for(String regex : mMobileID.keySet())
{
if(ident.matches(regex))
{
return mMobileID.get(regex);
}
}
}
else
{
return mMobileID.get(ident);
}
}
return null;
}
public Alias getTalkgroupAlias(String tgid)
{
if(tgid != null)
{
if(mTalkgroupWildcard)
{
for(String regex : mTalkgroup.keySet())
{
if(tgid.matches(regex))
{
return mTalkgroup.get(regex);
}
}
}
else
{
return mTalkgroup.get(tgid);
}
}
return null;
}
public String toString()
{
return mName;
}
@XmlAttribute
public String getName()
{
return mName;
}
public void setName(String name)
{
mName = name;
}
public ArrayList<Group> getGroup()
{
return mGroups;
}
public void setGroup(ArrayList<Group> groups)
{
mGroups = groups;
}
public void addGroup(Group group)
{
mGroups.add(group);
}
public void removeGroup(Group group)
{
mGroups.remove(group);
}
@Override
public int compareTo(AliasListOld otherAliasList)
{
return getName().compareTo(otherAliasList.getName());
}
}

View File

@@ -0,0 +1,78 @@
/*******************************************************************************
* SDR Trunk
* Copyright (C) 2014 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 <http://www.gnu.org/licenses/>
******************************************************************************/
package io.github.dsheirer.playlist.version1;
import io.github.dsheirer.controller.channel.map.ChannelMap;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlSeeAlso;
import java.util.ArrayList;
@XmlSeeAlso( ChannelMap.class )
@Deprecated
public class ChannelMapList
{
private ArrayList<ChannelMap> mChannelMap = new ArrayList<ChannelMap>();
public ChannelMapList()
{
/* Empty constructor for JAXB */
}
@XmlElement( name = "channel_map" )
public ArrayList<ChannelMap> getChannelMap()
{
return mChannelMap;
}
public void setChannelMap( ArrayList<ChannelMap> ChannelMaps )
{
mChannelMap = ChannelMaps;
}
public void addChannelMap( ChannelMap ChannelMap )
{
mChannelMap.add( ChannelMap );
}
public void removeChannelMap( ChannelMap ChannelMap )
{
mChannelMap.remove( ChannelMap );
}
public void clearChannelMaps()
{
mChannelMap.clear();
}
/**
* Gets the named channel map, or returns an empty map
*/
public ChannelMap getChannelMap( String name )
{
for( ChannelMap map: mChannelMap )
{
if( map.getName().equalsIgnoreCase( name ) )
{
return map;
}
}
return new ChannelMap();
}
}

View File

@@ -0,0 +1,75 @@
/*******************************************************************************
* SDR Trunk
* Copyright (C) 2014 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 <http://www.gnu.org/licenses/>
******************************************************************************/
package io.github.dsheirer.playlist.version1;
import io.github.dsheirer.alias.Alias;
import javax.xml.bind.annotation.XmlAttribute;
import java.util.ArrayList;
@Deprecated
public class Group
{
private String mName;
private ArrayList<Alias> mAliases = new ArrayList<Alias>();
public Group()
{
}
public String toString()
{
return "Group: " + mName;
}
@XmlAttribute
public String getName()
{
return mName;
}
public void setName( String name )
{
mName = name;
}
public ArrayList<Alias> getAlias()
{
return mAliases;
}
public void setAlias( ArrayList<Alias> aliases )
{
mAliases = aliases;
}
public void addAlias( Alias alias )
{
mAliases.add( alias );
}
public void removeAlias( Alias alias )
{
mAliases.remove( alias );
}
public boolean contains( Alias alias )
{
return mAliases.contains( alias );
}
}

View File

@@ -0,0 +1,166 @@
package io.github.dsheirer.playlist.version1;
import io.github.dsheirer.controller.channel.Channel;
import io.github.dsheirer.controller.channel.map.ChannelMap;
import io.github.dsheirer.playlist.PlaylistV2;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import io.github.dsheirer.alias.Alias;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.List;
public class PlaylistConverterV1ToV2
{
private final static Logger mLog =
LoggerFactory.getLogger( PlaylistConverterV1ToV2.class );
private PlaylistV2 mConvertedPlaylist;
private List<String> mErrors = new ArrayList<>();
@SuppressWarnings( "deprecation" )
public PlaylistConverterV1ToV2( Path path )
{
PlaylistV1 playlistVersion1 = null;
if( path != null && Files.exists( path ) )
{
mLog.info( "attempting playlist v1 to v2 conversion [" +
path.toString() + "]" );
JAXBContext context = null;
InputStream in = null;
try
{
in = new FileInputStream( path.toString() );
try
{
context = JAXBContext.newInstance( PlaylistV1.class );
Unmarshaller m = context.createUnmarshaller();
playlistVersion1 = (PlaylistV1)m.unmarshal( in );
}
catch ( JAXBException e )
{
mErrors.add( "Couldn't unmarshall version 1 playlist - " +
e.getLocalizedMessage() );
}
}
catch ( Exception e )
{
mErrors.add( "Couldn't open version 1 playlist - [" +
path.toString() + "] - " + e.getLocalizedMessage() );
}
finally
{
if( in != null )
{
try
{
in.close();
}
catch ( IOException e )
{
mLog.error( "exception while closing " +
"the playlist file inputstream reader", e );
}
}
}
}
else
{
mErrors.add( "version 1 playlist is null or not found [" +
path.toString() + "]" );
}
if( playlistVersion1 != null )
{
mConvertedPlaylist = new PlaylistV2();
if( playlistVersion1.hasSystemList() )
{
SystemList systemList = playlistVersion1.getSystemList();
for( System system: systemList.getSystem() )
{
for( Site site: system.getSite() )
{
for( Channel channel: site.getChannel() )
{
channel.setSystem( system.getName() );
channel.setSite( site.getName() );
mConvertedPlaylist.getChannels().add( channel );
}
}
}
}
if( playlistVersion1.hasAliasDirectory() )
{
AliasDirectory aliasDirectory = playlistVersion1.getAliasDirectory();
for( AliasListOld list: aliasDirectory.getAliasList() )
{
for( Group group: list.getGroup() )
{
for( Alias alias: group.getAlias() )
{
alias.setList( list.getName() );
alias.setGroup( group.getName() );
mConvertedPlaylist.getAliases().add( alias );
}
}
}
}
if( playlistVersion1.hasChannelMapList() )
{
//Move the channel maps out of the channel map list
ChannelMapList channelMapList = playlistVersion1.getChannelMapList();
List<ChannelMap> channelMaps = channelMapList.getChannelMap();
if( channelMaps != null && !channelMaps.isEmpty() )
{
mConvertedPlaylist.getChannelMaps().addAll( channelMaps );
}
}
mLog.info( "Converted [" + mConvertedPlaylist.getChannels().size() +
"] channels to new playlist format" );
mLog.info( "Converted [" + mConvertedPlaylist.getAliases().size() +
"] aliases to new playlist format" );
mLog.info( "Converted [" + mConvertedPlaylist.getChannelMaps().size() +
"] channel maps to new playlist format" );
}
}
public PlaylistV2 getConvertedPlaylist()
{
return mConvertedPlaylist;
}
public List<String> getErrorMessages()
{
return mErrors;
}
public boolean hasErrorMessages()
{
return !mErrors.isEmpty();
}
}

View File

@@ -0,0 +1,106 @@
/*******************************************************************************
* SDR Trunk
* Copyright (C) 2014 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 <http://www.gnu.org/licenses/>
******************************************************************************/
package io.github.dsheirer.playlist.version1;
import io.github.dsheirer.controller.channel.Channel;
import io.github.dsheirer.alias.Alias;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlSeeAlso;
@XmlSeeAlso( { AliasDirectory.class,
Alias.class,
Channel.class,
ChannelMapList.class,
SystemList.class } )
@Deprecated
@XmlRootElement( name = "playlist")
public class PlaylistV1
{
//Note: these are for legacy version 1 format playlists
private AliasDirectory mAliasDirectory = new AliasDirectory();
private ChannelMapList mChannelMapList = new ChannelMapList();
private SystemList mSystemList = new SystemList();
public PlaylistV1()
{
}
@XmlElement( name = "alias_directory" )
public AliasDirectory getAliasDirectory()
{
mAliasDirectory.refresh();
return mAliasDirectory;
}
public void setAliasDirectory( AliasDirectory directory )
{
mAliasDirectory = directory;
}
public boolean hasAliasDirectory()
{
return mAliasDirectory != null &&
mAliasDirectory.getAliasList() != null &&
!mAliasDirectory.getAliasList().isEmpty();
}
@XmlElement( name = "system_list" )
public SystemList getSystemList()
{
return mSystemList;
}
public void setSystemList( SystemList list )
{
mSystemList = list;
}
public boolean hasSystemList()
{
return mSystemList != null &&
mSystemList.getSystem() != null &&
!mSystemList.getSystem().isEmpty();
}
@XmlElement( name = "channel_maps" )
public ChannelMapList getChannelMapList()
{
return mChannelMapList;
}
public boolean hasChannelMapList()
{
return mChannelMapList != null &&
mChannelMapList.getChannelMap() != null &&
!mChannelMapList.getChannelMap().isEmpty();
}
public void setChannelMapList( ChannelMapList list )
{
mChannelMapList = list;
}
}

View File

@@ -0,0 +1,86 @@
/*******************************************************************************
* SDR Trunk
* Copyright (C) 2014 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 <http://www.gnu.org/licenses/>
******************************************************************************/
package io.github.dsheirer.playlist.version1;
import io.github.dsheirer.controller.channel.Channel;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlSeeAlso;
import java.util.ArrayList;
@XmlSeeAlso( { Channel.class } )
@XmlRootElement( name = "site" )
@Deprecated
public class Site
{
private String mName;
private ArrayList<Channel> mChannel = new ArrayList<Channel>();
public Site()
{
this( "New Site" );
}
public Site( String name )
{
mName = name;
}
public String toString()
{
return mName;
}
@XmlAttribute
public String getName()
{
return mName;
}
public void setName( String name )
{
mName = name;
}
public ArrayList<Channel> getChannel()
{
return mChannel;
}
public void setChannel( ArrayList<Channel> configs )
{
mChannel = configs;
}
public void addChannel( Channel channel )
{
mChannel.add( channel );
}
public void removeChannel( Channel channel )
{
mChannel.remove( channel );
}
public void removeAllChannels()
{
mChannel.clear();
}
}

View File

@@ -0,0 +1,83 @@
/*******************************************************************************
* SDR Trunk
* Copyright (C) 2014 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 <http://www.gnu.org/licenses/>
******************************************************************************/
package io.github.dsheirer.playlist.version1;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlSeeAlso;
import java.util.ArrayList;
@XmlSeeAlso( { Site.class } )
@XmlRootElement( name = "system" )
@Deprecated
public class System
{
private String mName;
private ArrayList<Site> mSite = new ArrayList<Site>();
public System()
{
this( "New System" );
}
public System( String name )
{
mName = name;
}
@XmlAttribute
public String getName()
{
return mName;
}
public void setName( String name )
{
mName = name;
}
public ArrayList<Site> getSite()
{
return mSite;
}
public void setSite( ArrayList<Site> sites )
{
mSite = sites;
}
public void addSite( Site site )
{
mSite.add( site );
}
public void removeSite( Site site )
{
mSite.remove( site );
}
public void clearSites()
{
mSite.clear();
}
public String toString()
{
return mName;
}
}

View File

@@ -0,0 +1,61 @@
/*******************************************************************************
* SDR Trunk
* Copyright (C) 2014 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 <http://www.gnu.org/licenses/>
******************************************************************************/
package io.github.dsheirer.playlist.version1;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlSeeAlso;
import java.util.ArrayList;
@SuppressWarnings( "deprecation" )
@XmlSeeAlso( { System.class } )
@XmlRootElement( name = "system_list" )
@Deprecated
public class SystemList
{
private ArrayList<System> mSystem = new ArrayList<System>();
public SystemList()
{
}
public ArrayList<System> getSystem()
{
return mSystem;
}
public void setSystem( ArrayList<System> systems )
{
mSystem = systems;
}
public void addSystem( System system )
{
mSystem.add( system );
}
public void removeSystem( System system )
{
mSystem.remove( system );
}
public void clearSystems()
{
mSystem.clear();
}
}