WIP #34: added channel map manager and new editor window. Removed a

number of unused classes.  Removed playlist manager from a number of
classes and replaced with the alias, channel and channel map models.
Updated playlist manager to no longer retain a playlist except for when
loading to models or when storing from models.  Extracted version 1 to
version 2 playlist conversion and changed playlist manager to keep the
original version 1 playlist and create a new version 2 (playlist_v2.xml)
file.  On startup, try to load a v2, and if not, look for a v1 to
convert.  Otherwise, don't create a playlist and one will be created
once the user adds items to the models.
This commit is contained in:
denny
2016-03-06 07:48:14 -05:00
parent 8aebdd1c26
commit 2394ac2fa9
75 changed files with 2154 additions and 5008 deletions

View File

@@ -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
@@ -19,21 +19,17 @@ package alias;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlSeeAlso;
import module.decode.lj1200.LJ1200Message.Function;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import alias.action.AliasAction;
import alias.action.beep.BeepAction;
import alias.action.clip.ClipAction;
import alias.action.script.ScriptAction;
import sample.Listener;
import alias.id.AliasID;
import alias.id.esn.Esn;
import alias.id.fleetsync.FleetsyncID;
@@ -41,48 +37,17 @@ import alias.id.lojack.LoJackFunctionAndID;
import alias.id.mdc.MDC1200ID;
import alias.id.mobileID.Min;
import alias.id.mpt1327.MPT1327ID;
import alias.id.nonrecordable.NonRecordable;
import alias.id.priority.Priority;
import alias.id.siteID.SiteID;
import alias.id.status.StatusID;
import alias.id.talkgroup.TalkgroupID;
import alias.id.uniqueID.UniqueID;
import audio.metadata.MetadataType;
@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 } )
@XmlRootElement( name = "alias_list" )
public class AliasList implements Comparable<AliasList>
public class AliasList implements Listener<AliasEvent>
{
private final static Logger mLog = LoggerFactory.getLogger( AliasList.class );
private String mName;
private ArrayList<Group> mGroups = new ArrayList<Group>();
private List<Alias> mAliases = new ArrayList<>();
private Map<String,Alias> mESN = new HashMap<>();
private Map<String,Alias> mFleetsync = new HashMap<>();
private Map<LoJackFunctionAndID,Alias> mLoJack = new HashMap<>();
@@ -102,167 +67,326 @@ public class AliasList implements Comparable<AliasList>
private boolean mSiteWildcard = false;
private boolean mTalkgroupWildcard = false;
public AliasList()
{
this( null );
}
private String mName;
/**
* List of aliases where all aliases share the same list name. Contains
* several methods for alias lookup from identifier values, like talkgroups.
*
* Responds to alias change events to keep the internal alias list updated.
*/
public AliasList( String name )
{
mName = name;
update();
}
/**
* Load/Reload all lookup hashmaps
* Adds the alias to this list
*/
public void update()
public void addAlias( Alias alias )
{
//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 )
if( alias != null )
{
for( Alias alias: group.getAlias() )
mAliases.add( alias );
for( AliasID aliasID: alias.getId() )
{
for( AliasID id: alias.getId() )
addAliasID( aliasID, alias );
}
}
}
/**
* Adds the alias and alias identifier to the internal type mapping.
*/
private void addAliasID( AliasID id, Alias alias )
{
switch( id.getType() )
{
case ESN:
Esn esn = (Esn)id;
if( esn.getEsn().contains( "*" ) )
{
switch( id.getType() )
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( "*" ) )
{
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 LTRNetUID:
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 NonRecordable:
case Priority:
//We don't maintain lookups for these items
break;
default:
mLog.warn( "Unrecognized Alias ID Type:" + id.getType().name() );
break;
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 LTRNetUID:
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 NonRecordable:
case Priority:
//We don't maintain lookups for these items
break;
default:
mLog.warn( "Unrecognized Alias ID Type:" + id.getType().name() );
break;
}
}
/**
* Removes the alias from this list
*/
public void removeAlias( Alias alias )
{
if( alias != null )
{
for( AliasID aliasID: alias.getId() )
{
removeAliasID( aliasID, alias );
}
mAliases.remove( alias );
}
}
/**
* Removes the alias and alias identifier from internal mappings.
*/
private void removeAliasID( AliasID id, Alias alias )
{
switch( id.getType() )
{
case ESN:
Esn esn = (Esn)id;
if( mESN.containsKey( esn.getEsn() ) )
{
Alias esnAlias = mESN.get( esn.getEsn() );
if( esnAlias != null && esnAlias == alias )
{
mESN.remove( esn.getEsn() );
}
}
break;
case Fleetsync:
FleetsyncID fs = (FleetsyncID)id;
if( mFleetsync.containsKey( fs.getIdent() ) )
{
Alias fsAlias = mFleetsync.get( fs.getIdent() );
if( fsAlias != null && fsAlias == alias )
{
mFleetsync.remove( fs.getIdent() );
}
}
break;
case LoJack:
LoJackFunctionAndID lj = (LoJackFunctionAndID)id;
if( mLoJack.containsKey( lj ) )
{
Alias ljAlias = mLoJack.get( lj );
if( ljAlias != null && ljAlias == alias )
{
mLoJack.remove( lj );
}
}
break;
case MDC1200:
MDC1200ID mdc = (MDC1200ID)id;
if( mMDC1200.containsKey( mdc.getIdent() ) )
{
Alias mdcAlias = mMDC1200.get( mdc.getIdent() );
if( mdcAlias != null && mdcAlias == alias )
{
mMDC1200.remove( mdc.getIdent() );
}
}
break;
case MPT1327:
MPT1327ID mpt = (MPT1327ID)id;
if( mMPT1327.containsKey( mpt.getIdent() ) )
{
Alias mptAlias = mMDC1200.get( mpt.getIdent() );
if( mptAlias != null && mptAlias == alias )
{
mMPT1327.remove( mpt.getIdent() );
}
}
break;
case MIN:
Min min = (Min)id;
if( mMobileID.containsKey( min.getMin() ) )
{
Alias minAlias = mMobileID.get( min.getMin() );
if( minAlias != null && minAlias == alias )
{
mMobileID.remove( min.getMin() );
}
}
break;
case LTRNetUID:
UniqueID uid = (UniqueID)id;
if( mUniqueID.containsKey( uid.getUid() ) )
{
Alias uidAlias = mUniqueID.get( uid.getUid() );
if( uidAlias != null && uidAlias == alias )
{
mUniqueID.remove( uid.getUid() );
}
}
break;
case Site:
SiteID sid = (SiteID)id;
if( mSiteID.containsKey( sid.getSite() ) )
{
Alias sidAlias = mSiteID.get( sid.getSite() );
if( sidAlias != null && sidAlias == alias )
{
mSiteID.remove( sid.getSite() );
}
}
break;
case Status:
StatusID stat = (StatusID)id;
if( mStatus.containsKey( stat.getStatus() ) )
{
Alias statAlias = mStatus.get( stat.getStatus() );
if( statAlias != null && statAlias == alias )
{
mStatus.remove( stat.getStatus() );
}
}
break;
case Talkgroup:
TalkgroupID tg = (TalkgroupID)id;
if( mTalkgroup.containsKey( tg.getTalkgroup() ) )
{
Alias tgAlias = mTalkgroup.get( tg.getTalkgroup() );
if( tgAlias != null && tgAlias == alias )
{
mTalkgroup.remove( tg.getTalkgroup() );
}
}
break;
case NonRecordable:
case Priority:
//We don't maintain lookups for these items
break;
default:
mLog.warn( "Unrecognized Alias ID Type:" + id.getType().name() );
break;
}
}
@@ -279,7 +403,10 @@ public class AliasList implements Comparable<AliasList>
return value;
}
/**
* Lookup alias by site ID
*/
public Alias getSiteID( String siteID )
{
if( siteID != null )
@@ -302,17 +429,26 @@ public class AliasList implements Comparable<AliasList>
return null;
}
/**
* Lookup alias by status ID
*/
public Alias getStatus( int status )
{
return mStatus.get( status );
}
/**
* Lookup alias by Unique ID (UID)
*/
public Alias getUniqueID( int uniqueID )
{
return mUniqueID.get( uniqueID );
}
/**
* Lookup alias by ESN
*/
public Alias getESNAlias( String esn )
{
if( esn != null )
@@ -336,7 +472,9 @@ public class AliasList implements Comparable<AliasList>
return null;
}
/**
* Lookup alias by fleetsync ID
*/
public Alias getFleetsyncAlias( String ident )
{
if( ident != null )
@@ -360,6 +498,9 @@ public class AliasList implements Comparable<AliasList>
return null;
}
/**
* Lookup alias by lojack function and ID
*/
public Alias getLoJackAlias( Function function, String id )
{
if( id != null )
@@ -376,6 +517,9 @@ public class AliasList implements Comparable<AliasList>
return null;
}
/**
* Lookup alias by MDC1200 ID
*/
public Alias getMDC1200Alias( String ident )
{
if( ident != null )
@@ -399,6 +543,9 @@ public class AliasList implements Comparable<AliasList>
return null;
}
/**
* Lookup alias by MPT1327 Ident
*/
public Alias getMPT1327Alias( String ident )
{
if( ident != null )
@@ -422,22 +569,9 @@ public class AliasList implements Comparable<AliasList>
return null;
}
public Group getGroup( Alias alias )
{
if( alias != null )
{
for( Group group: mGroups )
{
if( group.contains( alias ) )
{
return group;
}
}
}
return null;
}
/**
* Lookup alias by Mobile ID Number (MIN)
*/
public Alias getMobileIDNumberAlias( String ident )
{
if( ident != null )
@@ -461,6 +595,9 @@ public class AliasList implements Comparable<AliasList>
return null;
}
/**
* Lookup alias by talkgroup
*/
public Alias getTalkgroupAlias( String tgid )
{
if( tgid != null )
@@ -483,49 +620,27 @@ public class AliasList implements Comparable<AliasList>
return null;
}
/**
* Alias list name
*/
public String toString()
{
return mName;
}
/**
* Alias list name
*/
@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( AliasList otherAliasList )
{
return getName().compareTo( otherAliasList.getName() );
}
/**
* Lookup an alias by metadata type and string value
*/
public Alias getAlias( String value, MetadataType type )
{
switch( type )
@@ -577,5 +692,48 @@ public class AliasList implements Comparable<AliasList>
return null;
}
/**
* Receive alias change event notifications and modify this list accordingly
*/
@Override
public void receive( AliasEvent event )
{
Alias alias = event.getAlias();
switch( event.getEvent() )
{
case ADD:
if( alias.getList() != null &&
getName().equalsIgnoreCase( alias.getList() ) )
{
addAlias( alias );
}
break;
case CHANGE:
if( alias.getList() != null &&
getName().equalsIgnoreCase( alias.getList() ) )
{
if( !mAliases.contains( alias ) )
{
//Alias was moved to this list - add it
addAlias( alias );
}
}
else if( mAliases.contains( alias ) )
{
//An alias in this list was moved to another list
removeAlias( alias );
}
break;
case DELETE:
if( mAliases.contains( alias ) )
{
removeAlias( alias );
}
break;
default:
break;
}
}
}