package mediawiki.info.wikibase;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import mediawiki.JSONizable;
import mediawiki.MediaWikiUtil;
import mediawiki.XMLRepresented;
import javat.xml.Element;
public class Reference implements Iterable<Claim>, XMLRepresented, JSONizable{
private String hash = null;
private ArrayList<Claim> claims = new ArrayList<>();
public Reference(){
}
public Reference(String hash){
setHash(hash);
}
public Reference(Element e) throws Exception {
super();
claims = new ArrayList<>();
convert(e);
}
public Reference(Property p, ValueSnak<?> s){
this(new Claim(p,s));
}
public Reference(Claim a) {
claims = new ArrayList<>();
claims.add(a);
}
public String getHash() {
return hash;
}
public void setHash(String hash) {
this.hash = hash;
}
public void addClaim(Claim a){
claims.add(a);
}
public void convert(Element e) throws Exception{ // ab reference
setHash(e.getAttribute("hash").getValue());
for(Element p : e.getChildren("snaks").get(0).getChildren("property")){
Claim a = new Claim(p.getChildren("snak").get(0));
addClaim(a);
}
}
@Override
public Iterator<Claim> iterator() {
return claims.iterator();
}
@Override
public String toString() {
return getClass().getCanonicalName()+"@"+getHash()+claims;
}
@Override
public JSONObject toJSONObject() throws JSONException {
JSONObject o = new JSONObject();
if(hash != null)
o.put("hash", hash);
Map<Property, List<Claim>> m = MediaWikiUtil.groupByProperty(claims);
JSONObject snaks = new JSONObject();
for(Entry<Property, List<Claim>> e : m.entrySet()){
JSONArray p = new JSONArray();
for(Claim c : e.getValue())
p.put(c.toJSONObject());
snaks.put("P"+e.getKey().getID(), p);
}
o.put("snaks", snaks);
JSONArray order = new JSONArray();
for(Property p : MediaWikiUtil.listByProperty(claims))
order.put("P"+p.getID());
o.put("snaks-order", order);
return o;
}
@Override
public boolean equals(Object obj) {
if(obj == null)
return false;
if(!(obj instanceof Reference))
return false;
Reference r = (Reference) obj;
if(getHash() != null && ! hash.equals(r.hash))
return false;
if(! claims.equals(r.claims))
return false;
return true;
}
}