/**
* CopyRight by Chinamobile
*
* GraphDataForBDB.java
*/
package com.chinamobile.bcbsp.graph;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import com.chinamobile.bcbsp.api.Edge;
import com.chinamobile.bcbsp.api.Vertex;
import com.chinamobile.bcbsp.bspstaff.Staff;
import com.chinamobile.bcbsp.comm.BDBMap;
import com.chinamobile.bcbsp.examples.PRVertex;
import com.chinamobile.bcbsp.util.BSPJob;
import com.chinamobile.bcbsp.util.BSPJobID;
/**
* GraphDataForBDB implements GraphDataInterface for
* storage of the graph data.Graph data manager for BerkeleyDB JE supported.
*
* @author
* @version
*/
public class GraphDataForBDB implements GraphDataInterface {
private static final Log LOG = LogFactory.getLog(GraphDataForBDB.class);
private File fileRoot;
private File graphDataFile;
@SuppressWarnings("unused")
private BDBMap<Integer, String> headMap = null;
private BDBList graphdata = null;
private List<Boolean> activeFlags = new ArrayList<Boolean>();
private int totalHeadNodes = 0;
private int globalIndex = 0;
private int edgeSize = 0;
private BSPJobID jobID;
private int partitionID;
private Class<? extends Vertex<?,?,?>> vertexClass;
@SuppressWarnings("unused")
private Class<? extends Edge<?,?>> edgeClass;
private Staff staff;
public void setStaff(Staff staff){
this.staff = staff;
}
public void initialize(){
int partitionID = this.staff.getPartition();
BSPJob job = staff.getConf();
initialize(job, partitionID);
}
/**
*
* @param job
*/
public void initialize(BSPJob job, int partitionID){
this.jobID = job.getJobID();
this.partitionID = partitionID;
this.fileRoot = new File("/tmp/bcbsp/graphdata" + this.jobID.toString() + "/"
+ "partition-" + this.partitionID);
this.graphDataFile = new File(this.fileRoot + "/" + "GraphData");
if(!fileRoot.exists()){
fileRoot.mkdirs();
}
if(!graphDataFile.exists()){
graphDataFile.mkdirs();
}
graphdata = new BDBList(graphDataFile.toString(), "headnodes");
}
@SuppressWarnings("unchecked")
@Override
public void addForAll(Vertex vertex){
try {
edgeSize += vertex.getEdgesNum();
graphdata.push(vertex.intoString());
activeFlags.add(true);
} catch (IOException e) {
LOG.error("[addForAll]", e);
}
}
@SuppressWarnings("unchecked")
@Override
public Vertex get(int index) {//index's arrange is [0, headMap.size)
@SuppressWarnings("unused")
Vertex<?,?,?> tmpVertex = null;
try {
tmpVertex = this.vertexClass.newInstance();
} catch (InstantiationException e) {
LOG.error("[GraphDataForBDB] caught: ", e);
} catch (IllegalAccessException e) {
LOG.error("[GraphDataForBDB] caught: ", e);
}
PRVertex vertex = new PRVertex();
String vertexValue ;
do {
if (activeFlags.get(globalIndex)) {
try {
vertexValue = graphdata.getElement(index);
vertex.fromString(vertexValue);
break;
} catch (Exception e) {
LOG.error("[get]", e);
}
}
globalIndex++;
} while (globalIndex < totalHeadNodes);
return vertex;
}
@SuppressWarnings("unchecked")
@Override
public Vertex getForAll(int index) {//index's arrange is [0, headMap.size)
PRVertex vertex = new PRVertex();
try {
vertex.fromString(graphdata.getElement(index));
} catch (Exception e) {
LOG.error("[getForAll]", e);
}
return vertex;
}
@SuppressWarnings("unchecked")
@Override
public void set(int index, Vertex vertex, boolean activeFlag) {
graphdata.setEelment(index, vertex.intoString());
activeFlags.set(index, activeFlag);
globalIndex++;
if (globalIndex >= totalHeadNodes) {
resetGlobalIndex();
}
}
@Override
public int size() {
updateTotalHeadNodes();
return (int)getActiveCounter();
}
@Override
public int sizeForAll() {
updateTotalHeadNodes();
return totalHeadNodes;
}
@Override
public void clean() {
if(this.totalHeadNodes != 0)
graphdata.clean();
}
@Override
public void finishAdd() {
// For memory-only version, do nothing.
}
@Override
public long getActiveCounter() {
long counter = 0;
for (boolean flag : activeFlags) {
if (flag) {
counter++;
}
}
return counter;
}
private void resetGlobalIndex() {
globalIndex = 0;
}
private void updateTotalHeadNodes() {
totalHeadNodes = ( int ) graphdata.size();
}
@Override
public boolean getActiveFlagForAll(int index) {
return activeFlags.get(index);
}
@Override
public void showMemoryInfo() {
// TODO Auto-generated method stub
}
@Override
public int getEdgeSize() {
return edgeSize;
}
}