package com.microsoft.bingads.v10.bulk.entities;
import com.microsoft.bingads.v10.internal.bulk.StringTable;
import com.microsoft.bingads.v10.internal.bulk.BulkObject;
import com.microsoft.bingads.v10.internal.bulk.BulkObjectFactory;
import com.microsoft.bingads.v10.internal.bulk.Creator;
import com.microsoft.bingads.v10.internal.bulk.RowValues;
import com.microsoft.bingads.v10.internal.bulk.entities.BulkAdGroupNegativeSitesIdentifier;
import com.microsoft.bingads.v10.internal.bulk.entities.BulkCampaignNegativeSitesIdentifier;
import com.microsoft.bingads.v10.internal.bulk.entities.BulkEntityIdentifier;
import com.microsoft.bingads.v10.internal.bulk.entities.SingleRecordBulkEntity;
import com.microsoft.bingads.v10.internal.bulk.entities.SiteLinkAdExtensionIdentifier;
import com.microsoft.bingads.v10.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<Class, Map<Class, String>> TARGET_IDENTIFIER_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("Campaign Age Target", new EntityInfo(new Creator<SingleRecordBulkEntity>() {
@Override
public SingleRecordBulkEntity create() {
return new BulkCampaignAgeTargetBid();
}
}, StringTable.Target, new Creator<BulkEntityIdentifier>() {
@Override
public BulkEntityIdentifier create() {
return new BulkCampaignTargetIdentifier(BulkCampaignAgeTargetBid.class);
}
}));
m.put("Campaign DayTime Target", new EntityInfo(new Creator<SingleRecordBulkEntity>() {
@Override
public SingleRecordBulkEntity create() {
return new BulkCampaignDayTimeTargetBid();
}
}, StringTable.Target, new Creator<BulkEntityIdentifier>() {
@Override
public BulkEntityIdentifier create() {
return new BulkCampaignTargetIdentifier(BulkCampaignDayTimeTargetBid.class);
}
}));
m.put("Campaign DeviceOS Target", new EntityInfo(new Creator<SingleRecordBulkEntity>() {
@Override
public SingleRecordBulkEntity create() {
return new BulkCampaignDeviceOsTargetBid();
}
}, StringTable.Target, new Creator<BulkEntityIdentifier>() {
@Override
public BulkEntityIdentifier create() {
return new BulkCampaignTargetIdentifier(BulkCampaignDeviceOsTargetBid.class);
}
}));
m.put("Campaign Gender Target", new EntityInfo(new Creator<SingleRecordBulkEntity>() {
@Override
public SingleRecordBulkEntity create() {
return new BulkCampaignGenderTargetBid();
}
}, StringTable.Target, new Creator<BulkEntityIdentifier>() {
@Override
public BulkEntityIdentifier create() {
return new BulkCampaignTargetIdentifier(BulkCampaignGenderTargetBid.class);
}
}));
m.put("Campaign Location Target", new EntityInfo(new Creator<SingleRecordBulkEntity>() {
@Override
public SingleRecordBulkEntity create() {
return new BulkCampaignLocationTargetBid();
}
}, StringTable.Target, new Creator<BulkEntityIdentifier>() {
@Override
public BulkEntityIdentifier create() {
return new BulkCampaignTargetIdentifier(BulkCampaignLocationTargetBid.class);
}
}));
m.put("Campaign Negative Location Target", new EntityInfo(new Creator<SingleRecordBulkEntity>() {
@Override
public SingleRecordBulkEntity create() {
return new BulkCampaignNegativeLocationTargetBid();
}
}, StringTable.Target, new Creator<BulkEntityIdentifier>() {
@Override
public BulkEntityIdentifier create() {
return new BulkCampaignTargetIdentifier(BulkCampaignNegativeLocationTargetBid.class);
}
}));
m.put("Campaign Radius Target", new EntityInfo(new Creator<SingleRecordBulkEntity>() {
@Override
public SingleRecordBulkEntity create() {
return new BulkCampaignRadiusTargetBid();
}
}, StringTable.Target, new Creator<BulkEntityIdentifier>() {
@Override
public BulkEntityIdentifier create() {
return new BulkCampaignTargetIdentifier(BulkCampaignRadiusTargetBid.class);
}
}));
m.put("Ad Group Age Target", new EntityInfo(new Creator<SingleRecordBulkEntity>() {
@Override
public SingleRecordBulkEntity create() {
return new BulkAdGroupAgeTargetBid();
}
}, StringTable.Target, new Creator<BulkEntityIdentifier>() {
@Override
public BulkEntityIdentifier create() {
return new BulkAdGroupTargetIdentifier(BulkAdGroupAgeTargetBid.class);
}
}));
m.put("Ad Group DayTime Target", new EntityInfo(new Creator<SingleRecordBulkEntity>() {
@Override
public SingleRecordBulkEntity create() {
return new BulkAdGroupDayTimeTargetBid();
}
}, StringTable.Target, new Creator<BulkEntityIdentifier>() {
@Override
public BulkEntityIdentifier create() {
return new BulkAdGroupTargetIdentifier(BulkAdGroupDayTimeTargetBid.class);
}
}));
m.put("Ad Group DeviceOS Target", new EntityInfo(new Creator<SingleRecordBulkEntity>() {
@Override
public SingleRecordBulkEntity create() {
return new BulkAdGroupDeviceOsTargetBid();
}
}, StringTable.Target, new Creator<BulkEntityIdentifier>() {
@Override
public BulkEntityIdentifier create() {
return new BulkAdGroupTargetIdentifier(BulkAdGroupDeviceOsTargetBid.class);
}
}));
m.put("Ad Group Gender Target", new EntityInfo(new Creator<SingleRecordBulkEntity>() {
@Override
public SingleRecordBulkEntity create() {
return new BulkAdGroupGenderTargetBid();
}
}, StringTable.Target, new Creator<BulkEntityIdentifier>() {
@Override
public BulkEntityIdentifier create() {
return new BulkAdGroupTargetIdentifier(BulkAdGroupGenderTargetBid.class);
}
}));
m.put("Ad Group Location Target", new EntityInfo(new Creator<SingleRecordBulkEntity>() {
@Override
public SingleRecordBulkEntity create() {
return new BulkAdGroupLocationTargetBid();
}
}, StringTable.Target, new Creator<BulkEntityIdentifier>() {
@Override
public BulkEntityIdentifier create() {
return new BulkAdGroupTargetIdentifier(BulkAdGroupLocationTargetBid.class);
}
}));
m.put("Ad Group Negative Location Target", new EntityInfo(new Creator<SingleRecordBulkEntity>() {
@Override
public SingleRecordBulkEntity create() {
return new BulkAdGroupNegativeLocationTargetBid();
}
}, StringTable.Target, new Creator<BulkEntityIdentifier>() {
@Override
public BulkEntityIdentifier create() {
return new BulkAdGroupTargetIdentifier(BulkAdGroupNegativeLocationTargetBid.class);
}
}));
m.put("Ad Group Radius Target", new EntityInfo(new Creator<SingleRecordBulkEntity>() {
@Override
public SingleRecordBulkEntity create() {
return new BulkAdGroupRadiusTargetBid();
}
}, StringTable.Target, new Creator<BulkEntityIdentifier>() {
@Override
public BulkEntityIdentifier create() {
return new BulkAdGroupTargetIdentifier(BulkAdGroupRadiusTargetBid.class);
}
}));
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();
}
}));
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>();
Map<Class, Map<Class, String>> targetIdentifierTypeReverseMap = new HashMap<Class, Map<Class, 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();
if (identifier instanceof BulkTargetIdentifier) {
if (!targetIdentifierTypeReverseMap.containsKey(identifier.getClass())) {
targetIdentifierTypeReverseMap.put(identifier.getClass(), new HashMap<Class, String>());
}
targetIdentifierTypeReverseMap.get(identifier.getClass()).put(((BulkTargetIdentifier) identifier).getTargetBidType(), entry.getKey());
} else {
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);
TARGET_IDENTIFIER_TYPE_REVERSE_MAP = Collections.unmodifiableMap(targetIdentifierTypeReverseMap);
}
@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";
}
if (bulkObject instanceof BulkTargetIdentifier) {
BulkTargetIdentifier identifier = (BulkTargetIdentifier) bulkObject;
return TARGET_IDENTIFIER_TYPE_REVERSE_MAP.get(identifier.getClass()).get(identifier.getTargetBidType());
}
return TYPE_REVERSE_MAP.get(bulkObject.getClass());
}
}