/*******************************************************************************
* Copyright (c) 2014 EURA NOVA.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the GNU Public License v2.0
* which accompanies this distribution, and is available at
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
*
* Contributors:
* Aldemar Reynaga - initial API and implementation
* Salim Jouili - initial API and implementation
******************************************************************************/
package com.steffi.model;
import gnu.trove.map.hash.TIntObjectHashMap;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
/**
* @author Aldemar Reynaga
* Implements a group of indexed edges classifying the edges by type and label using maps
*/
public class SteffiMapEdges implements Serializable, SteffiIndexedEdges {
/**
*
*/
private static final long serialVersionUID = -43000510074768611L;
private TIntObjectHashMap<ArrayList<SteffiEdge>> edgeMap;
private ArrayList<SteffiEdge> edges;
public SteffiMapEdges() {
edgeMap = new TIntObjectHashMap<ArrayList<SteffiEdge>>();
edges = new ArrayList<SteffiEdge>();
}
private int calculateTypeNameMapIndex(int edgeCode, int nameIndex) {
if (nameIndex < 0)
return 0;
return edgeCode + (nameIndex+1)*4;
}
private int calculateNameMapIndex(int nameIndex) {
if (nameIndex < 0)
return 0;
return (nameIndex + 1) * -1;
}
private void addEdgeByKey(SteffiEdge edge, int index) {
ArrayList<SteffiEdge> edges = edgeMap.get(index);
if (edges == null) {
edges = new ArrayList<SteffiEdge>();
edgeMap.put(index, edges);
}
edges.add(edge);
}
/* (non-Javadoc)
* @see com.imgraph.model.ImgIndexedEdges#addEdge(com.imgraph.model.ImgEdge)
*/
@Override
public void addEdge(SteffiEdge edge) {
int typeCode = edge.getEdgeType().getCode();
edges.add(edge);
addEdgeByKey(edge, typeCode);
if (edge.getName()!=null && !edge.getName().trim().equals("")) {
int nameIndex = SteffiGraph.getInstance().getItemNameIndex(edge.getName());
addEdgeByKey(edge, calculateNameMapIndex(nameIndex));
addEdgeByKey(edge, calculateTypeNameMapIndex(typeCode, nameIndex));
}
}
/* (non-Javadoc)
* @see com.imgraph.model.ImgIndexedEdges#getEdgesByTypeName(com.imgraph.model.EdgeType, java.lang.String)
*/
@Override
public List<SteffiEdge> getEdgesByTypeName(EdgeType edgeType, String name) {
if (name!=null && !name.trim().equals(""))
return edgeMap.get(calculateTypeNameMapIndex(edgeType.getCode(),
SteffiGraph.getInstance().getItemNameIndex(name)));
else
return getEdgesByType(edgeType);
}
/* (non-Javadoc)
* @see com.imgraph.model.ImgIndexedEdges#getEdgesByType(com.imgraph.model.EdgeType)
*/
@Override
public List<SteffiEdge> getEdgesByType(EdgeType edgeType) {
return edgeMap.get(edgeType.getCode());
}
/* (non-Javadoc)
* @see com.imgraph.model.ImgIndexedEdges#getEdgesByName(java.lang.String)
*/
@Override
public List<SteffiEdge> getEdgesByName(String name) {
if (name==null || name.trim().equals(""))
return getAllEdges();
return edgeMap.get(calculateNameMapIndex(SteffiGraph.getInstance().getItemNameIndex(name)));
}
/* (non-Javadoc)
* @see com.imgraph.model.ImgIndexedEdges#getAllEdges()
*/
@Override
public List<SteffiEdge> getAllEdges() {
return edges;
}
/* (non-Javadoc)
* @see com.imgraph.model.ImgIndexedEdges#clear()
*/
@Override
public void clear() {
for (List<SteffiEdge> edgeSet : edgeMap.valueCollection())
edgeSet.clear();
edgeMap.clear();
edges.clear();
}
/* (non-Javadoc)
* @see com.imgraph.model.ImgIndexedEdges#remove(com.imgraph.model.ImgEdge)
*/
@Override
public void remove(SteffiEdge edge) {
int typeCode = edge.getEdgeType().getCode();
SteffiEdge.removeEdgeFromCollection(edge, edges);
SteffiEdge.removeEdgeFromCollection(edge, edgeMap.get(typeCode));
if (edge.getName() != null) {
int nameIndex = SteffiGraph.getInstance().getItemNameIndex(edge.getName());
SteffiEdge.removeEdgeFromCollection(edge, edgeMap.get(calculateNameMapIndex(nameIndex)));
SteffiEdge.removeEdgeFromCollection(edge, edgeMap.get(calculateTypeNameMapIndex(typeCode, nameIndex)));
}
}
/* (non-Javadoc)
* @see com.imgraph.model.ImgIndexedEdges#isEmpty()
*/
@Override
public boolean isEmpty() {
return edges.isEmpty();
}
/* (non-Javadoc)
* @see com.imgraph.model.ImgIndexedEdges#hasMoreThanOneEdge()
*/
@Override
public boolean hasMoreThanOneEdge() {
return edges.size()>1;
}
/* (non-Javadoc)
* @see com.imgraph.model.ImgIndexedEdges#trimToSize()
*/
@Override
public void trimToSize() {
for (ArrayList<SteffiEdge> edges : edgeMap.valueCollection())
edges.trimToSize();
edges.trimToSize();
edgeMap.compact();
}
}