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; } }