/**
* CopyRight by Chinamobile
*
* StringVertex.java
*/
package com.chinamobile.bcbsp.examples;
import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;
import org.apache.hadoop.io.Text;
import com.chinamobile.bcbsp.Constants;
import com.chinamobile.bcbsp.api.Vertex;
/**
* Vertex implementation with type of String.
*
* @author Bai Qiushi
* @version 1.0
*/
public class StringVertex extends Vertex<String, String, StringEdge> {
String vertexID = null;
String vertexValue = null;
List<StringEdge> edgesList = new ArrayList<StringEdge>();
@Override
public void addEdge(StringEdge edge) {
this.edgesList.add(edge);
}
@Override
public void fromString(String vertexData) throws Exception {
String[] buffer = new String[2];
StringTokenizer str = new StringTokenizer(vertexData,
Constants.KV_SPLIT_FLAG);
if (str.countTokens() != 2) {
throw new Exception();
}
buffer[0] = str.nextToken();
buffer[1] = str.nextToken();
str = new StringTokenizer(buffer[0], Constants.SPLIT_FLAG);
if (str.countTokens() != 2) {
throw new Exception();
}
this.vertexID = str.nextToken();
this.vertexValue = str.nextToken();
if (buffer.length > 1) { // There has edges.
str = new StringTokenizer(buffer[1], Constants.SPACE_SPLIT_FLAG);
while (str.hasMoreTokens()) {
StringEdge edge = new StringEdge();
edge.fromString(str.nextToken());
this.edgesList.add(edge);
}
}
}
@Override
public List<StringEdge> getAllEdges() {
return this.edgesList;
}
@Override
public String getVertexID() {
return this.vertexID;
}
@Override
public String getVertexValue() {
return this.vertexValue;
}
@Override
public String intoString() {
String buffer = vertexID + Constants.SPLIT_FLAG + vertexValue;
buffer = buffer + Constants.KV_SPLIT_FLAG;
int numEdges = edgesList.size();
if (numEdges != 0) {
buffer = buffer + edgesList.get(0).intoString();
}
for (int i = 1; i < numEdges; i++) {
buffer = buffer + Constants.SPACE_SPLIT_FLAG
+ edgesList.get(i).intoString();
}
return buffer;
}
@Override
public void removeEdge(StringEdge edge) {
this.edgesList.remove(edge);
}
@Override
public void setVertexID(String vertexID) {
this.vertexID = vertexID;
}
@Override
public void setVertexValue(String vertexValue) {
this.vertexValue = vertexValue;
}
@Override
public void updateEdge(StringEdge edge) {
removeEdge(edge);
this.edgesList.add(edge);
}
@Override
public void readFields(DataInput in) throws IOException {
this.vertexID = Text.readString(in);
this.vertexValue = Text.readString(in);
this.edgesList.clear();
int numEdges = in.readInt();
StringEdge edge;
for (int i = 0; i < numEdges; i++) {
edge = new StringEdge();
edge.readFields(in);
this.edgesList.add(edge);
}
}
@Override
public void write(DataOutput out) throws IOException {
Text.writeString(out, this.vertexID);
Text.writeString(out, this.vertexValue);
out.writeInt(this.edgesList.size());
for (StringEdge edge : edgesList) {
edge.write(out);
}
}
@Override
public int hashCode() {
return vertexID.hashCode();
}
@Override
public int getEdgesNum() {
return this.edgesList.size();
}
}