/**
* Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.masterdb.security;
import java.util.EnumMap;
import com.opengamma.master.security.ManageableSecurity;
import com.opengamma.master.security.SecurityDocument;
import com.opengamma.master.security.SecurityHistoryRequest;
import com.opengamma.master.security.SecurityHistoryResult;
import com.opengamma.master.security.SecurityMaster;
import com.opengamma.master.security.SecurityMetaDataRequest;
import com.opengamma.master.security.SecurityMetaDataResult;
import com.opengamma.master.security.SecuritySearchRequest;
import com.opengamma.master.security.SecuritySearchResult;
import com.opengamma.master.security.SecuritySearchSortOrder;
import com.opengamma.masterdb.ConfigurableDbChangeProvidingMaster;
import com.opengamma.masterdb.bean.AbstractDelegatingBeanMaster;
import com.opengamma.masterdb.bean.BeanMasterSearchRequest;
import com.opengamma.masterdb.bean.DbBeanMaster;
import com.opengamma.util.db.DbConnector;
/**
* A security master implementation based on Joda-Beans using a database for persistence.
* <p>
* This is a full implementation of the security master using an SQL database.
* Data is stored based on the Joda-Beans API.
* Full details of the API are in {@link SecurityMaster}.
* <p>
* Applications can configure this master using the callback class passed in.
* <p>
* This class is mutable but must be treated as immutable after configuration.
*/
public class DbSecurityBeanMaster
extends AbstractDelegatingBeanMaster<SecurityDocument, ManageableSecurity>
implements SecurityMaster, ConfigurableDbChangeProvidingMaster {
/**
* The default scheme for unique identifiers.
*/
public static final String IDENTIFIER_SCHEME_DEFAULT = "DbSec";
/**
* The default callback.
*/
public static final DbSecurityBeanMasterCallback DEFAULT_CALLBACK = new DefaultDbSecurityBeanMasterCallback();
/**
* SQL order by.
*/
protected static final EnumMap<SecuritySearchSortOrder, String> ORDER_BY_MAP = new EnumMap<SecuritySearchSortOrder, String>(SecuritySearchSortOrder.class);
static {
ORDER_BY_MAP.put(SecuritySearchSortOrder.OBJECT_ID_ASC, "oid ASC");
ORDER_BY_MAP.put(SecuritySearchSortOrder.OBJECT_ID_DESC, "oid DESC");
ORDER_BY_MAP.put(SecuritySearchSortOrder.VERSION_FROM_INSTANT_ASC, "ver_from_instant ASC");
ORDER_BY_MAP.put(SecuritySearchSortOrder.VERSION_FROM_INSTANT_DESC, "ver_from_instant DESC");
ORDER_BY_MAP.put(SecuritySearchSortOrder.NAME_ASC, "name ASC");
ORDER_BY_MAP.put(SecuritySearchSortOrder.NAME_DESC, "name DESC");
ORDER_BY_MAP.put(SecuritySearchSortOrder.SECURITY_TYPE_ASC, "sub_type ASC");
ORDER_BY_MAP.put(SecuritySearchSortOrder.SECURITY_TYPE_DESC, "sub_type DESC");
}
/**
* The callback.
*/
private final DbSecurityBeanMasterCallback _callback;
/**
* Creates an instance.
*
* @param dbConnector the database connector, not null
*/
public DbSecurityBeanMaster(final DbConnector dbConnector) {
this(dbConnector, DEFAULT_CALLBACK);
}
/**
* Creates an instance.
*
* @param dbConnector the database connector, not null
* @param callback the callback used to configure the master, not null
*/
public DbSecurityBeanMaster(final DbConnector dbConnector, DbSecurityBeanMasterCallback callback) {
super(new DbBeanMaster<>(dbConnector, IDENTIFIER_SCHEME_DEFAULT, callback));
_callback = callback;
}
//-------------------------------------------------------------------------
/**
* Gets the callback object.
*
* @return the callback object, not null
*/
protected DbSecurityBeanMasterCallback getCallback() {
return _callback;
}
//-------------------------------------------------------------------------
@Override
public SecurityMetaDataResult metaData(SecurityMetaDataRequest request) {
SecurityMetaDataResult result = new SecurityMetaDataResult();
if (request.isSecurityTypes()) {
result.setSecurityTypes(getDelegate().getAllSubTypes());
}
if (request.isSchemaVersion()) {
result.setSchemaVersion(getDelegate().getSchemaVersionString());
}
return result;
}
@Override
public SecuritySearchResult search(SecuritySearchRequest request) {
BeanMasterSearchRequest delegatedRequest = new BeanMasterSearchRequest();
delegatedRequest.setPagingRequest(request.getPagingRequest());
delegatedRequest.setVersionCorrection(request.getVersionCorrection());
delegatedRequest.setObjectIds(request.getObjectIds());
delegatedRequest.setExternalIdSearch(request.getExternalIdSearch());
delegatedRequest.setExternalIdValue(request.getExternalIdValue());
delegatedRequest.setExternalIdScheme(request.getExternalIdScheme());
delegatedRequest.setAttributes(request.getAttributes());
delegatedRequest.setName(request.getName());
delegatedRequest.setSubType(request.getSecurityType());
delegatedRequest.setSortOrderSql(ORDER_BY_MAP.get(request.getSortOrder()));
getCallback().buildIndexedPropertiesSearch(delegatedRequest, request);
return getDelegate().search(delegatedRequest, new SecuritySearchResult());
}
@Override
public SecurityHistoryResult history(SecurityHistoryRequest request) {
return getDelegate().history(request, new SecurityHistoryResult());
}
}