package com.bagri.client.hazelcast.impl; import static com.bagri.core.Constants.*; import static com.bagri.support.util.PropUtils.setProperty; import java.util.Properties; import java.util.UUID; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.bagri.core.api.DocumentManagement; import com.bagri.core.api.HealthCheckState; import com.bagri.core.api.QueryManagement; import com.bagri.core.api.SchemaRepository; import com.bagri.core.api.TransactionManagement; import com.bagri.core.api.impl.SchemaRepositoryBase; import com.hazelcast.core.HazelcastInstance; public class SchemaRepositoryImpl extends SchemaRepositoryBase implements SchemaRepository { private final static Logger logger = LoggerFactory.getLogger(SchemaRepositoryImpl.class); private String clientId; private String schemaName; private ClientManagementImpl clientMgr; private HazelcastInstance hzClient; public SchemaRepositoryImpl() { initializeFromProperties(getSystemProps()); } public SchemaRepositoryImpl(Properties props) { initializeFromProperties(getConvertedProps(props)); } public SchemaRepositoryImpl(HazelcastInstance hzInstance) { this.hzClient = hzInstance; com.hazelcast.client.impl.HazelcastClientProxy proxy = (com.hazelcast.client.impl.HazelcastClientProxy) hzClient; schemaName = proxy.getClientConfig().getGroupConfig().getName(); //clientId = proxy.getLocalEndpoint().getUuid(); clientMgr = new ClientManagementImpl(); clientId = UUID.randomUUID().toString(); clientMgr.connect(clientId, proxy); logger.debug("<init>; connected to HZ server as: {}; {}", clientId, proxy); initializeServices(null); } private static Properties getSystemProps() { Properties props = new Properties(); setProperty(props, pn_schema_name, null); // "schema" setProperty(props, pn_schema_address, null); //"address" setProperty(props, pn_schema_user, null); //"user" setProperty(props, pn_schema_password, null); //"password" setProperty(props, pn_client_smart, null); //"smart" setProperty(props, pn_client_loginTimeout, null); //"loginTimeout" setProperty(props, pn_client_bufferSize, null); setProperty(props, pn_client_connectAttempts, "3"); setProperty(props, pn_client_poolSize, "5"); setProperty(props, pn_client_healthCheck, null); setProperty(props, pn_client_queryCache, null); setProperty(props, pn_client_txTimeout, null); setProperty(props, pn_client_customAuth, null); return props; } private static Properties getConvertedProps(Properties original) { Properties props = new Properties(); setProperty(original, props, pn_schema_name, "schema"); setProperty(original, props, pn_schema_address, "address"); setProperty(original, props, pn_schema_user, "user"); setProperty(original, props, pn_schema_password, "password"); setProperty(original, props, pn_client_loginTimeout, "loginTimeout"); setProperty(original, props, pn_client_bufferSize, null); setProperty(original, props, pn_client_connectAttempts, null); Object factory = original.get(pn_client_dataFactory); if (factory != null) { props.put(pn_client_dataFactory, factory); } setProperty(props, pn_client_smart, null); setProperty(props, pn_client_poolSize, null); setProperty(props, pn_client_healthCheck, null); setProperty(props, pn_client_queryCache, null); setProperty(props, pn_client_txTimeout, null); setProperty(props, pn_client_customAuth, null); return props; } private void initializeFromProperties(Properties props) { clientMgr = new ClientManagementImpl(); clientId = UUID.randomUUID().toString(); hzClient = clientMgr.connect(clientId, props); com.hazelcast.client.impl.HazelcastClientProxy proxy = (com.hazelcast.client.impl.HazelcastClientProxy) hzClient; schemaName = proxy.getClientConfig().getGroupConfig().getName(); initializeServices(props); } private void initializeServices(Properties props) { //execService = hzClient.getExecutorService(PN_XDM_SCHEMA_POOL); setAccessManagement(new AccessManagementImpl()); setBindingManagement(new BindingManagementImpl()); setDocumentManagement(new DocumentManagementImpl()); setHealthManagement(new HealthManagementImpl(hzClient)); setQueryManagement(new QueryManagementImpl()); setTxManagement(new TransactionManagementImpl()); hzClient.getUserContext().put("xdmRepo", this); if (props != null) { String value = props.getProperty(pn_client_healthCheck); if (value != null) { getHealthManagement().setCheckSate(HealthCheckState.valueOf(value)); } value = props.getProperty(pn_client_queryCache); if (value != null) { ((QueryManagementImpl) getQueryManagement()).setQueryCache(Boolean.parseBoolean(value)); } } } @Override public int hashCode() { return clientId.hashCode(); } @Override public void setDocumentManagement(DocumentManagement docMgr) { super.setDocumentManagement(docMgr); ((DocumentManagementImpl) docMgr).initialize(this); } @Override public void setQueryManagement(QueryManagement queryMgr) { super.setQueryManagement(queryMgr); ((QueryManagementImpl) queryMgr).initialize(this); } @Override public void setTxManagement(TransactionManagement txMgr) { super.setTxManagement(txMgr); ((TransactionManagementImpl) txMgr).initialize(this); } @Override public void close() { logger.trace("close.enter;"); clientMgr.disconnect(clientId); logger.trace("close.exit;"); } @Override public String getClientId() { return clientId; } @Override public String getUserName() { return clientMgr.getUserName(clientId); } @Override public String toString() { return "SchemaRepositoryImpl[" + clientId + "]"; } HazelcastInstance getHazelcastClient() { return hzClient; } String getSchemaName() { return schemaName; } long getTransactionId() { return ((TransactionManagementImpl) this.getTxManagement()).getTxId(); } }