package com.linkedin.databus2.schemas;
/*
*
* Copyright 2013 LinkedIn Corp. All rights reserved
*
* 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.
*
*/
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import org.apache.log4j.Logger;
import com.linkedin.databus.core.data_model.LogicalSource;
import com.linkedin.databus.core.util.IdNamePair;
/** Keeps a bi-directional mapping from a source name to and from source id. */
public class SourceIdNameRegistry
{
public static final String MODULE = SourceIdNameRegistry.class.getName();
public static final Logger LOG = Logger.getLogger(MODULE);
// NOTE: Any method using _nameIndex or _idIndex has to be synchronized.
private volatile HashMap<String, LogicalSource> _nameIndex;
private volatile HashMap<Integer, LogicalSource> _idIndex;
public SourceIdNameRegistry()
{
_nameIndex = new HashMap<String, LogicalSource>();
_idIndex = new HashMap<Integer, LogicalSource>();
}
public SourceIdNameRegistry(Collection<LogicalSource> initPairs)
{
this();
update(initPairs);
}
public static SourceIdNameRegistry createFromIdNamePairs(Collection<IdNamePair> idNamePairs)
{
SourceIdNameRegistry result = new SourceIdNameRegistry();
result.updateFromIdNamePairs(idNamePairs);
return result;
}
/** Return the id associated with the name or null if none exists */
public synchronized Integer getSourceId(String sourceName)
{
LogicalSource pair = _nameIndex.get(sourceName);
return null != pair ? pair.getId() : null;
}
public synchronized String getSourceName(Integer id)
{
LogicalSource pair = _idIndex.get(id);
return null != pair ? pair.getName() : null;
}
public synchronized LogicalSource getSource(Integer id)
{
return _idIndex.get(id);
}
public synchronized LogicalSource getSource(String sourceName)
{
return _nameIndex.get(sourceName);
}
public synchronized Collection<LogicalSource> getAllSources()
{
return _idIndex.values();
}
public void updateFromIdNamePairs(Collection<IdNamePair> newPairs)
{
ArrayList<LogicalSource> srcCollection = new ArrayList<LogicalSource>(newPairs.size());
for (IdNamePair pair: newPairs) srcCollection.add(new LogicalSource(pair.getId().intValue(),
pair.getName()));
update(srcCollection);
}
public void add(Collection<LogicalSource> newPairs)
{
synchronized (this)
{
for (LogicalSource pair: newPairs)
{
_nameIndex.put(pair.getName(), pair);
_idIndex.put(pair.getId(), pair);
}
}
}
// TODO Rename this method to 'replace'
public void update(Collection<LogicalSource> newPairs)
{
HashMap<String, LogicalSource> newNameIndex = new HashMap<String, LogicalSource>((int)(newPairs.size() * 1.3));
HashMap<Integer, LogicalSource> newIdIndex = new HashMap<Integer, LogicalSource>((int)(newPairs.size() * 1.3));
for (LogicalSource pair: newPairs)
{
newNameIndex.put(pair.getName(), pair);
newIdIndex.put(pair.getId(), pair);
}
synchronized (this)
{
_nameIndex = newNameIndex;
_idIndex = newIdIndex;
if (LOG.isDebugEnabled())
{
LOG.debug("sources updated: " + _idIndex.values());
}
}
}
}