/** * Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.masterdb.convention; import java.util.EnumMap; import com.opengamma.core.convention.ConventionType; import com.opengamma.master.convention.ConventionDocument; import com.opengamma.master.convention.ConventionHistoryRequest; import com.opengamma.master.convention.ConventionHistoryResult; import com.opengamma.master.convention.ConventionMaster; import com.opengamma.master.convention.ConventionMetaDataRequest; import com.opengamma.master.convention.ConventionMetaDataResult; import com.opengamma.master.convention.ConventionSearchRequest; import com.opengamma.master.convention.ConventionSearchResult; import com.opengamma.master.convention.ConventionSearchSortOrder; import com.opengamma.master.convention.ManageableConvention; 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 convention master implementation based on Joda-Beans using a database for persistence. * <p> * This is a full implementation of the convention master using an SQL database. * Data is stored based on the Joda-Beans API. * Full details of the API are in {@link ConventionMaster}. * <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 DbConventionBeanMaster extends AbstractDelegatingBeanMaster<ConventionDocument, ManageableConvention> implements ConventionMaster, ConfigurableDbChangeProvidingMaster { /** * The default scheme for unique identifiers. */ public static final String IDENTIFIER_SCHEME_DEFAULT = "DbCnv"; /** * The default callback. */ public static final DbConventionBeanMasterCallback DEFAULT_CALLBACK = new DefaultDbConventionBeanMasterCallback(); /** * SQL order by. */ protected static final EnumMap<ConventionSearchSortOrder, String> ORDER_BY_MAP = new EnumMap<>(ConventionSearchSortOrder.class); static { ORDER_BY_MAP.put(ConventionSearchSortOrder.OBJECT_ID_ASC, "oid ASC"); ORDER_BY_MAP.put(ConventionSearchSortOrder.OBJECT_ID_DESC, "oid DESC"); ORDER_BY_MAP.put(ConventionSearchSortOrder.VERSION_FROM_INSTANT_ASC, "ver_from_instant ASC"); ORDER_BY_MAP.put(ConventionSearchSortOrder.VERSION_FROM_INSTANT_DESC, "ver_from_instant DESC"); ORDER_BY_MAP.put(ConventionSearchSortOrder.NAME_ASC, "name ASC"); ORDER_BY_MAP.put(ConventionSearchSortOrder.NAME_DESC, "name DESC"); ORDER_BY_MAP.put(ConventionSearchSortOrder.CONVENTION_TYPE_ASC, "sub_type ASC"); ORDER_BY_MAP.put(ConventionSearchSortOrder.CONVENTION_TYPE_DESC, "sub_type DESC"); } /** * The callback. */ private final DbConventionBeanMasterCallback _callback; /** * Creates an instance. * * @param dbConnector the database connector, not null */ public DbConventionBeanMaster(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 DbConventionBeanMaster(final DbConnector dbConnector, DbConventionBeanMasterCallback callback) { super(new DbBeanMaster<>(dbConnector, IDENTIFIER_SCHEME_DEFAULT, callback)); _callback = callback; } //------------------------------------------------------------------------- /** * Gets the callback object. * * @return the callback object, not null */ protected DbConventionBeanMasterCallback getCallback() { return _callback; } //------------------------------------------------------------------------- @Override public ConventionMetaDataResult metaData(ConventionMetaDataRequest request) { ConventionMetaDataResult result = new ConventionMetaDataResult(); if (request.isConventionTypes()) { for (String type : getDelegate().getAllSubTypes()) { result.getConventionTypes().add(ConventionType.of(type)); } } if (request.isSchemaVersion()) { result.setSchemaVersion(getDelegate().getSchemaVersionString()); } return result; } @Override public ConventionSearchResult search(ConventionSearchRequest 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.getConventionType() != null ? request.getConventionType().getName() : null); delegatedRequest.setSortOrderSql(ORDER_BY_MAP.get(request.getSortOrder())); getCallback().buildIndexedPropertiesSearch(delegatedRequest, request); return getDelegate().search(delegatedRequest, new ConventionSearchResult()); } @Override public ConventionHistoryResult history(ConventionHistoryRequest request) { return getDelegate().history(request, new ConventionHistoryResult()); } }