package com.trywildcard.pair.model;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.trywildcard.pair.Pair;
import com.trywildcard.pair.exception.CardBuilderException;
import com.trywildcard.pair.extraction.MetaTagExtractor;
import com.trywildcard.pair.extraction.MetaTagModel;
import com.trywildcard.pair.model.creator.Creator;
import com.trywildcard.pair.util.CardSerializer;
import com.trywildcard.pair.validation.ValidationTool;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.List;
/**
* Generic class for cards.
*/
public abstract class AbstractCard implements Card {
protected final String pairVersion = Pair.getInstance().getVersion();
protected CardType cardType;
protected URL webUrl;
protected List<String> keywords;
protected String appLinkIos;
protected String appLinkAndroid;
private Creator creator;
@JsonIgnore
protected MetaTagModel metaTagModel;
@JsonIgnore
protected ValidationTool v = new ValidationTool();
public AbstractCard(String webUrl) throws CardBuilderException {
webUrl(webUrl);
MetaTagModel metaTagModel = MetaTagExtractor.getMetaTags(this.webUrl);
setAppLinkIos(metaTagModel.getAppLinkIos());
setAppLinkAndroid(metaTagModel.getAppLinkAndroid());
setMetaTagModel(metaTagModel);
}
protected AbstractCard() {
}
public void setKeywords(List<String> keywords) throws CardBuilderException {
boolean isValid = v.optional(v.notNull(keywords), "Keywords cannot be null.");
if (isValid) {
this.keywords = keywords;
}
}
protected void webUrl(String webUrl) throws CardBuilderException {
boolean isValid = v.required(v.notNullOrEmpty(webUrl), "Must specify a card webUrl.");
if (isValid) {
try {
this.webUrl = new URL(webUrl);
} catch (MalformedURLException e) {
v.required(v.fail(), "Could not parse URL from webUrl string.");
}
}
}
public void setAppLinkIos(String appLinkIos) {
boolean isValid = v.optional(v.notNullOrEmpty(appLinkIos), "App Link Ios cannot be blank.");
if (isValid) {
this.appLinkIos = appLinkIos;
}
}
public void setAppLinkAndroid(String appLinkAndroid) {
boolean isValid = v.optional(v.notNullOrEmpty(appLinkAndroid), "App Link Android cannot be blank.");
if (isValid) {
this.appLinkAndroid = appLinkAndroid;
}
}
public void setCreator(Creator creator) throws CardBuilderException {
boolean isValid = v.optional(v.notNull(creator), "creator cannot be null");
if (isValid) {
this.creator = creator;
}
}
private void setMetaTagModel(MetaTagModel metaTagModel) {
this.metaTagModel = metaTagModel;
}
@JsonIgnore
protected MetaTagModel getMetaTagModel() {
return metaTagModel;
}
public String getPairVersion() {
return pairVersion;
}
public CardType getCardType() {
return cardType;
}
public URL getWebUrl() {
return webUrl;
}
public List<String> getKeywords() { return keywords; }
public String getAppLinkIos() {
return appLinkIos;
}
public String getAppLinkAndroid() {
return appLinkAndroid;
}
public Creator getCreator() { return creator; }
/**
* Serialize fields in the Wildcard card format.
* @return the string representation of this card.
* @throws java.io.IOException
*/
public String writeAsJsonString() throws IOException {
return new CardSerializer().writeCard(this);
}
}