package com.microsoft.bingads.v11.bulk.entities;
import com.microsoft.bingads.v11.internal.bulk.StringTable;
import com.microsoft.bingads.v11.internal.bulk.BulkObject;
import com.microsoft.bingads.v11.internal.bulk.BulkObjectFactory;
import com.microsoft.bingads.v11.internal.bulk.Creator;
import com.microsoft.bingads.v11.internal.bulk.RowValues;
import com.microsoft.bingads.v11.internal.bulk.entities.BulkAdGroupNegativeSitesIdentifier;
import com.microsoft.bingads.v11.internal.bulk.entities.BulkCampaignNegativeSitesIdentifier;
import com.microsoft.bingads.v11.internal.bulk.entities.BulkEntityIdentifier;
import com.microsoft.bingads.v11.internal.bulk.entities.SingleRecordBulkEntity;
import com.microsoft.bingads.v11.internal.bulk.entities.SiteLinkAdExtensionIdentifier;
import com.microsoft.bingads.v11.internal.bulk.FormatVersion;
import com.microsoft.bingads.internal.functionalinterfaces.Supplier;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
/**
* Reserved for internal use.
*
*/
public class StaticBulkObjectFactory implements BulkObjectFactory {
private static final Map<Class<? extends BulkObject>, String> TYPE_REVERSE_MAP;
private static final Map<String, EntityInfo> INDIVIDUAL_ENTITY_MAP;
private static final Map<String, Supplier<BulkObject>> ADDITIONAL_OBJECT_MAP;
static {
//List of entities creatable by the factory
Map<String, EntityInfo> m = new HashMap<String, EntityInfo>();
m.put(StringTable.Account, new EntityInfo(new Creator<SingleRecordBulkEntity>() {
@Override
public SingleRecordBulkEntity create() {
return new BulkAccount();
}
}));
m.put(StringTable.Campaign, new EntityInfo(new Creator<SingleRecordBulkEntity>() {
@Override
public SingleRecordBulkEntity create() {
return new BulkCampaign();
}
}));
m.put(StringTable.AdGroup, new EntityInfo(new Creator<SingleRecordBulkEntity>() {
@Override
public SingleRecordBulkEntity create() {
return new BulkAdGroup();
}
}));
m.put(StringTable.ProductAd, new EntityInfo(new Creator<SingleRecordBulkEntity>() {
@Override
public SingleRecordBulkEntity create() {
return new BulkProductAd();
}
}));
m.put(StringTable.TextAd, new EntityInfo(new Creator<SingleRecordBulkEntity>() {
@Override
public SingleRecordBulkEntity create() {
return new BulkTextAd();
}
}));
m.put(StringTable.AppInstallAd, new EntityInfo(new Creator<SingleRecordBulkEntity>() {
@Override
public SingleRecordBulkEntity create() {
return new BulkAppInstallAd();
}
}));
m.put(StringTable.ExpandedTextAd, new EntityInfo(new Creator<SingleRecordBulkEntity>() {
@Override
public SingleRecordBulkEntity create() {
return new BulkExpandedTextAd();
}
}));
m.put(StringTable.DynamicSearchAd, new EntityInfo(new Creator<SingleRecordBulkEntity>() {
@Override
public SingleRecordBulkEntity create() {
return new BulkDynamicSearchAd();
}
}));
m.put(StringTable.CampaignNegativeDynamicSearchAdTarget, new EntityInfo(new Creator<SingleRecordBulkEntity>() {
@Override
public SingleRecordBulkEntity create() {
return new BulkCampaignNegativeDynamicSearchAdTarget();
}
}));
m.put(StringTable.AdGroupNegativeDynamicSearchAdTarget, new EntityInfo(new Creator<SingleRecordBulkEntity>() {
@Override
public SingleRecordBulkEntity create() {
return new BulkAdGroupNegativeDynamicSearchAdTarget();
}
}));
m.put(StringTable.AdGroupDynamicSearchAdTarget, new EntityInfo(new Creator<SingleRecordBulkEntity>() {
@Override
public SingleRecordBulkEntity create() {
return new BulkAdGroupDynamicSearchAdTarget();
}
}));
m.put(StringTable.Keyword, new EntityInfo(new Creator<SingleRecordBulkEntity>() {
@Override
public SingleRecordBulkEntity create() {
return new BulkKeyword();
}
}));
m.put(StringTable.SiteLinksAdExtension, new EntityInfo(new Creator<SingleRecordBulkEntity>() {
@Override
public SingleRecordBulkEntity create() {
return new BulkSiteLink();
}
}, StringTable.SiteLinkExtensionOrder, new Creator<BulkEntityIdentifier>() {
@Override
public BulkEntityIdentifier create() {
return new SiteLinkAdExtensionIdentifier();
}
}));
m.put(StringTable.CampaignSiteLinksAdExtension, new EntityInfo(new Creator<SingleRecordBulkEntity>() {
@Override
public SingleRecordBulkEntity create() {
return new BulkCampaignSiteLinkAdExtension();
}
}));
m.put(StringTable.AdGroupSiteLinksAdExtension, new EntityInfo(new Creator<SingleRecordBulkEntity>() {
@Override
public SingleRecordBulkEntity create() {
return new BulkAdGroupSiteLinkAdExtension();
}
}));
m.put(StringTable.ImageAdExtension, new EntityInfo(new Creator<SingleRecordBulkEntity>() {
@Override
public SingleRecordBulkEntity create() {
return new BulkImageAdExtension();
}
}));
m.put(StringTable.CampaignImageAdExtension, new EntityInfo(new Creator<SingleRecordBulkEntity>() {
@Override
public SingleRecordBulkEntity create() {
return new BulkCampaignImageAdExtension();
}
}));
m.put(StringTable.AdGroupImageAdExtension, new EntityInfo(new Creator<SingleRecordBulkEntity>() {
@Override
public SingleRecordBulkEntity create() {
return new BulkAdGroupImageAdExtension();
}
}));
m.put(StringTable.LocationAdExtension, new EntityInfo(new Creator<SingleRecordBulkEntity>() {
@Override
public SingleRecordBulkEntity create() {
return new BulkLocationAdExtension();
}
}));
m.put(StringTable.CampaignLocationAdExtension, new EntityInfo(new Creator<SingleRecordBulkEntity>() {
@Override
public SingleRecordBulkEntity create() {
return new BulkCampaignLocationAdExtension();
}
}));
m.put(StringTable.CallAdExtension, new EntityInfo(new Creator<SingleRecordBulkEntity>() {
@Override
public SingleRecordBulkEntity create() {
return new BulkCallAdExtension();
}
}));
m.put(StringTable.CampaignCallAdExtension, new EntityInfo(new Creator<SingleRecordBulkEntity>() {
@Override
public SingleRecordBulkEntity create() {
return new BulkCampaignCallAdExtension();
}
}));
m.put(StringTable.AppAdExtension, new EntityInfo(new Creator<SingleRecordBulkEntity>() {
@Override
public SingleRecordBulkEntity create() {
return new BulkAppAdExtension();
}
}));
m.put(StringTable.CampaignAppAdExtension, new EntityInfo(new Creator<SingleRecordBulkEntity>() {
@Override
public SingleRecordBulkEntity create() {
return new BulkCampaignAppAdExtension();
}
}));
m.put(StringTable.AdGroupAppAdExtension, new EntityInfo(new Creator<SingleRecordBulkEntity>() {
@Override
public SingleRecordBulkEntity create() {
return new BulkAdGroupAppAdExtension();
}
}));
m.put(StringTable.CalloutAdExtension, new EntityInfo(new Creator<SingleRecordBulkEntity>() {
@Override
public SingleRecordBulkEntity create() {
return new BulkCalloutAdExtension();
}
}));
m.put(StringTable.CampaignCalloutAdExtension, new EntityInfo(new Creator<SingleRecordBulkEntity>() {
@Override
public SingleRecordBulkEntity create() {
return new BulkCampaignCalloutAdExtension();
}
}));
m.put(StringTable.AdGroupCalloutAdExtension, new EntityInfo(new Creator<SingleRecordBulkEntity>() {
@Override
public SingleRecordBulkEntity create() {
return new BulkAdGroupCalloutAdExtension();
}
}));
m.put(StringTable.ReviewAdExtension, new EntityInfo(new Creator<SingleRecordBulkEntity>() {
@Override
public SingleRecordBulkEntity create() {
return new BulkReviewAdExtension();
}
}));
m.put(StringTable.CampaignReviewAdExtension, new EntityInfo(new Creator<SingleRecordBulkEntity>() {
@Override
public SingleRecordBulkEntity create() {
return new BulkCampaignReviewAdExtension();
}
}));
m.put(StringTable.AdGroupReviewAdExtension, new EntityInfo(new Creator<SingleRecordBulkEntity>() {
@Override
public SingleRecordBulkEntity create() {
return new BulkAdGroupReviewAdExtension();
}
}));
m.put(StringTable.StructuredSnippetAdExtension, new EntityInfo(new Creator<SingleRecordBulkEntity>() {
@Override
public SingleRecordBulkEntity create() {
return new BulkStructuredSnippetAdExtension();
}
}));
m.put(StringTable.CampaignStructuredSnippetAdExtension, new EntityInfo(new Creator<SingleRecordBulkEntity>() {
@Override
public SingleRecordBulkEntity create() {
return new BulkCampaignStructuredSnippetAdExtension();
}
}));
m.put(StringTable.AdGroupStructuredSnippetAdExtension, new EntityInfo(new Creator<SingleRecordBulkEntity>() {
@Override
public SingleRecordBulkEntity create() {
return new BulkAdGroupStructuredSnippetAdExtension();
}
}));
m.put(StringTable.CampaignNegativeSite, new EntityInfo(new Creator<SingleRecordBulkEntity>() {
@Override
public SingleRecordBulkEntity create() {
return new BulkCampaignNegativeSite();
}
}, StringTable.Website, new Creator<BulkEntityIdentifier>() {
@Override
public BulkEntityIdentifier create() {
return new BulkCampaignNegativeSitesIdentifier();
}
}));
m.put(StringTable.AdGroupNegativeSite, new EntityInfo(new Creator<SingleRecordBulkEntity>() {
@Override
public SingleRecordBulkEntity create() {
return new BulkAdGroupNegativeSite();
}
}, StringTable.Website, new Creator<BulkEntityIdentifier>() {
@Override
public BulkEntityIdentifier create() {
return new BulkAdGroupNegativeSitesIdentifier();
}
}));
m.put("Campaign Product Scope", new EntityInfo(new Creator<SingleRecordBulkEntity>() {
@Override
public SingleRecordBulkEntity create() {
return new BulkCampaignProductScope();
}
}));
m.put("Ad Group Product Partition", new EntityInfo(new Creator<SingleRecordBulkEntity>() {
@Override
public SingleRecordBulkEntity create() {
return new BulkAdGroupProductPartition();
}
}));
m.put(StringTable.CampaignNegativeKeyword, new EntityInfo(new Creator<SingleRecordBulkEntity>() {
@Override
public SingleRecordBulkEntity create() {
return new BulkCampaignNegativeKeyword();
}
}));
m.put(StringTable.AdGroupNegativeKeyword, new EntityInfo(new Creator<SingleRecordBulkEntity>() {
@Override
public SingleRecordBulkEntity create() {
return new BulkAdGroupNegativeKeyword();
}
}));
m.put(StringTable.NegativeKeywordList, new EntityInfo(new Creator<SingleRecordBulkEntity>() {
@Override
public SingleRecordBulkEntity create() {
return new BulkNegativeKeywordList();
}
}));
m.put(StringTable.ListNegativeKeyword, new EntityInfo(new Creator<SingleRecordBulkEntity>() {
@Override
public SingleRecordBulkEntity create() {
return new BulkSharedNegativeKeyword();
}
}));
m.put(StringTable.CampaignNegativeKeywordList, new EntityInfo(new Creator<SingleRecordBulkEntity>() {
@Override
public SingleRecordBulkEntity create() {
return new BulkCampaignNegativeKeywordList();
}
}));
m.put(StringTable.RemarketingList, new EntityInfo(new Creator<SingleRecordBulkEntity>() {
@Override
public SingleRecordBulkEntity create() {
return new BulkRemarketingList();
}
}));
m.put(StringTable.AdGroupRemarketingListAssociation, new EntityInfo(new Creator<SingleRecordBulkEntity>() {
@Override
public SingleRecordBulkEntity create() {
return new BulkAdGroupRemarketingListAssociation();
}
}));
m.put(StringTable.Budget, new EntityInfo(new Creator<SingleRecordBulkEntity>() {
@Override
public SingleRecordBulkEntity create() {
return new BulkBudget();
}
}));
m.put(StringTable.Sitelink2AdExtension, new EntityInfo(new Creator<SingleRecordBulkEntity>() {
@Override
public SingleRecordBulkEntity create() {
return new BulkSitelink2AdExtension();
}
}));
m.put(StringTable.CampaignSitelink2AdExtension, new EntityInfo(new Creator<SingleRecordBulkEntity>() {
@Override
public SingleRecordBulkEntity create() {
return new BulkCampaignSitelink2AdExtension();
}
}));
m.put(StringTable.AdGroupSitelink2AdExtension, new EntityInfo(new Creator<SingleRecordBulkEntity>() {
@Override
public SingleRecordBulkEntity create() {
return new BulkAdGroupSitelink2AdExtension();
}
}));
m.put(StringTable.AdGroupAgeCriterion, new EntityInfo(new Creator<SingleRecordBulkEntity>() {
@Override
public SingleRecordBulkEntity create() {
return new BulkAdGroupAgeCriterion();
}
}));
m.put(StringTable.AdGroupDeviceCriterion, new EntityInfo(new Creator<SingleRecordBulkEntity>() {
@Override
public SingleRecordBulkEntity create() {
return new BulkAdGroupDeviceCriterion();
}
}));
m.put(StringTable.AdGroupDayTimeCriterion, new EntityInfo(new Creator<SingleRecordBulkEntity>() {
@Override
public SingleRecordBulkEntity create() {
return new BulkAdGroupDayTimeCriterion();
}
}));
m.put(StringTable.AdGroupRadiusCriterion, new EntityInfo(new Creator<SingleRecordBulkEntity>() {
@Override
public SingleRecordBulkEntity create() {
return new BulkAdGroupRadiusCriterion();
}
}));
m.put(StringTable.AdGroupGenderCriterion, new EntityInfo(new Creator<SingleRecordBulkEntity>() {
@Override
public SingleRecordBulkEntity create() {
return new BulkAdGroupGenderCriterion();
}
}));
m.put(StringTable.AdGroupLocationCriterion, new EntityInfo(new Creator<SingleRecordBulkEntity>() {
@Override
public SingleRecordBulkEntity create() {
return new BulkAdGroupLocationCriterion();
}
}));
m.put(StringTable.AdGroupLocationIntentCriterion, new EntityInfo(new Creator<SingleRecordBulkEntity>() {
@Override
public SingleRecordBulkEntity create() {
return new BulkAdGroupLocationIntentCriterion();
}
}));
m.put(StringTable.AdGroupNegativeLocationCriterion, new EntityInfo(new Creator<SingleRecordBulkEntity>() {
@Override
public SingleRecordBulkEntity create() {
return new BulkAdGroupNegativeLocationCriterion();
}
}));
m.put(StringTable.CampaignAgeCriterion, new EntityInfo(new Creator<SingleRecordBulkEntity>() {
@Override
public SingleRecordBulkEntity create() {
return new BulkCampaignAgeCriterion();
}
}));
m.put(StringTable.CampaignDeviceCriterion, new EntityInfo(new Creator<SingleRecordBulkEntity>() {
@Override
public SingleRecordBulkEntity create() {
return new BulkCampaignDeviceCriterion();
}
}));
m.put(StringTable.CampaignDayTimeCriterion, new EntityInfo(new Creator<SingleRecordBulkEntity>() {
@Override
public SingleRecordBulkEntity create() {
return new BulkCampaignDayTimeCriterion();
}
}));
m.put(StringTable.CampaignRadiusCriterion, new EntityInfo(new Creator<SingleRecordBulkEntity>() {
@Override
public SingleRecordBulkEntity create() {
return new BulkCampaignRadiusCriterion();
}
}));
m.put(StringTable.CampaignGenderCriterion, new EntityInfo(new Creator<SingleRecordBulkEntity>() {
@Override
public SingleRecordBulkEntity create() {
return new BulkCampaignGenderCriterion();
}
}));
m.put(StringTable.CampaignLocationCriterion, new EntityInfo(new Creator<SingleRecordBulkEntity>() {
@Override
public SingleRecordBulkEntity create() {
return new BulkCampaignLocationCriterion();
}
}));
m.put(StringTable.CampaignLocationIntentCriterion, new EntityInfo(new Creator<SingleRecordBulkEntity>() {
@Override
public SingleRecordBulkEntity create() {
return new BulkCampaignLocationIntentCriterion();
}
}));
m.put(StringTable.CampaignNegativeLocationCriterion, new EntityInfo(new Creator<SingleRecordBulkEntity>() {
@Override
public SingleRecordBulkEntity create() {
return new BulkCampaignNegativeLocationCriterion();
}
}));
INDIVIDUAL_ENTITY_MAP = Collections.unmodifiableMap(m);
Map<String, Supplier<BulkObject>> addl = new HashMap<String, Supplier<BulkObject>>();
addl.put(StringTable.KeywordBestPositionBidType, new Supplier<BulkObject>() {
@Override
public BulkObject get() {
return new BulkKeywordBestPositionBid();
}
});
addl.put(StringTable.KeywordMainLineBidType, new Supplier<BulkObject>() {
@Override
public BulkObject get() {
return new BulkKeywordMainLineBid();
}
});
addl.put(StringTable.KeywordFirstPageBidType, new Supplier<BulkObject>() {
@Override
public BulkObject get() {
return new BulkKeywordFirstPageBid();
}
});
addl.put(StringTable.SemanticVersion, new Supplier<BulkObject>() {
@Override
public BulkObject get() {
return new FormatVersion();
}
});
ADDITIONAL_OBJECT_MAP = Collections.unmodifiableMap(addl);
//Create reverse map
Map<Class<? extends BulkObject>, String> c = new HashMap<Class<? extends BulkObject>, String>();
for (Entry<String, EntityInfo> entry : INDIVIDUAL_ENTITY_MAP.entrySet()) {
c.put(entry.getValue().getCreator().create().getClass(), entry.getKey());
if (entry.getValue().getIdentifierCreator() != null) {
BulkEntityIdentifier identifier = entry.getValue().getIdentifierCreator().create();
c.put(identifier.getClass(), entry.getKey());
}
}
for (Entry<String, Supplier<BulkObject>> entry : ADDITIONAL_OBJECT_MAP.entrySet()) {
c.put(entry.getValue().get().getClass(), entry.getKey());
}
TYPE_REVERSE_MAP = Collections.unmodifiableMap(c);
}
@Override
public BulkObject createBulkObject(RowValues values) {
String type = values.get(StringTable.Type);
if (type.endsWith("Error")) {
return new BulkError();
}
if (ADDITIONAL_OBJECT_MAP.containsKey(type)) {
return ADDITIONAL_OBJECT_MAP.get(type).get();
}
if (!INDIVIDUAL_ENTITY_MAP.containsKey(type)) {
return new UnknownBulkEntity();
}
EntityInfo info = INDIVIDUAL_ENTITY_MAP.get(type);
if ("Deleted".equals(values.get(StringTable.Status))
&& !(info.getDeleteAllColumnName() == null || info.getDeleteAllColumnName().isEmpty())
&& (values.get(info.getDeleteAllColumnName()) == null || values.get(info.getDeleteAllColumnName()).isEmpty())) {
return info.getIdentifierCreator().create();
}
return info.getCreator().create();
}
@Override
public String getBulkRowType(BulkObject bulkObject) {
if (bulkObject instanceof BulkError) {
BulkError error = (BulkError)bulkObject;
return getBulkRowType(error.getEntity()) + " Error";
}
return TYPE_REVERSE_MAP.get(bulkObject.getClass());
}
}