package mediawiki.info.wikibase;
import javat.xml.Element;
import mediawiki.JSONizable;
import mediawiki.XMLRepresented;
import mediawiki.info.wikibase.snaks.CommonsSnak;
import mediawiki.info.wikibase.snaks.CoordinateSnak;
import mediawiki.info.wikibase.snaks.DateSnak;
import mediawiki.info.wikibase.snaks.ItemSnak;
import mediawiki.info.wikibase.snaks.MonolingualTextSnak;
import mediawiki.info.wikibase.snaks.PropertySnak;
import mediawiki.info.wikibase.snaks.QuantitySnak;
import mediawiki.info.wikibase.snaks.StringSnak;
import mediawiki.info.wikibase.snaks.URLSnak;
import org.json.JSONException;
public abstract class ValueSnak<T> extends Snak implements XMLRepresented, JSONizable {
private T value;
public ValueSnak(T value){
setValue(value);
}
abstract public Object toReferenceRepresentation() throws JSONException;
abstract public Object toClaimRepresentation() throws JSONException;
/**
* @param element Element auf datavalue-Ebene
* @throws Exception
*/
@Override
abstract public void convert(Element element) throws Exception;
/**
*
* @param datatype Datentyp aus datatyp auf snak/mainsnak-Ebene
* @return
*/
public static ValueSnak<?> createByDatatype(String datatype){
switch(datatype){
case "wikibase-item" : return new ItemSnak(0);
case "wikibase-property": return new PropertySnak(0);
case "string" : return new StringSnak(null);
case "url" : return new URLSnak(null);
case "time" : return new DateSnak(null);
case "commonsMedia" : return new CommonsSnak(null);
case "globe-coordinate" : return new CoordinateSnak(null);
case "quantity" : return new QuantitySnak(null);
case "monolingualtext" : return new MonolingualTextSnak(null);
}
throw new UnsupportedSnakTypeException(datatype);
}
public abstract String getDatatype();
public void setValue(T value) {
this.value = value;
}
public T getValue() {
return value;
}
@Override
public String toString() {
return getClass().getSimpleName()+"["+getValue()+"]";
}
@Override
public boolean equals(Object obj) {
if(obj == null)
return false;
if(! (obj instanceof ValueSnak<?>))
return false;
return ((ValueSnak<?>) obj).getValue().equals(getValue());
}
@Override
public SnakType getSnakType() {
return SnakType.VALUE;
}
}