com.themodernway.server.mongodb.support.spring.MongoDBDescriptor Maven / Gradle / Ivy
/*
* Copyright (c) 2018, The Modern Way. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.themodernway.server.mongodb.support.spring;
import java.io.IOException;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import com.mongodb.MongoClientOptions;
import com.mongodb.MongoCredential;
import com.mongodb.ServerAddress;
import com.themodernway.common.api.java.util.CommonOps;
import com.themodernway.common.api.java.util.StringOps;
import com.themodernway.common.api.types.Activatable;
import com.themodernway.server.core.support.spring.IPropertiesResolver;
import com.themodernway.server.core.support.spring.ServerContextInstance;
import com.themodernway.server.mongodb.MongoDB;
public class MongoDBDescriptor extends Activatable implements IMongoDBDescriptor
{
private String m_name;
private MongoDB m_mongo_db;
private boolean m_createid = false;
private boolean m_replicas = false;
private int m_poolsize = 100;
private int m_multiple = 100;
private int m_ctimeout = 10000;
private String m_defaultd;
private MongoClientOptions m_coptions;
private ArrayList m_addrlist;
private ArrayList m_authlist;
private LinkedHashMap m_doptions;
private String m_baseprop;
public MongoDBDescriptor()
{
m_baseprop = null;
}
public MongoDBDescriptor(final String baseprop)
{
m_baseprop = StringOps.requireTrimOrNull(baseprop);
}
@Override
public boolean setActive(final boolean active)
{
if ((null == m_addrlist) && (false == init()))
{
return false;
}
return super.setActive(active);
}
private final boolean init()
{
if (null == m_baseprop)
{
m_baseprop = MongoDBContextInstance.getMongoDBContextInstance().getMongoDBProvider().getMongoDBDefaultPropertiesBase();
}
final IPropertiesResolver prop = ServerContextInstance.getServerContextInstance().getPropertiesResolver();
setName(prop.getPropertyByName(m_baseprop + ".name"));
setDefaultDB(prop.getPropertyByName(m_baseprop + ".db"));
setReplicas(Boolean.valueOf(prop.getPropertyByName(m_baseprop + ".replicas", "false")));
setCreateID(Boolean.valueOf(prop.getPropertyByName(m_baseprop + ".createid", "false")));
final ArrayList addrlist = new ArrayList<>();
for (String name : StringOps.requireTrimOrNull(prop.getPropertyByName(m_baseprop + ".host.list")).split(","))
{
name = StringOps.toTrimOrNull(name);
if (null != name)
{
final String addr = StringOps.requireTrimOrNull(prop.getPropertyByName(m_baseprop + ".host." + name + ".addr"));
final String port = StringOps.requireTrimOrNull(prop.getPropertyByName(m_baseprop + ".host." + name + ".port"));
addrlist.add(new ServerAddress(addr, Integer.parseInt(port)));
}
}
if (addrlist.isEmpty())
{
throw new IllegalArgumentException("no MongoDB server address");
}
m_addrlist = addrlist;
m_authlist = new ArrayList<>();
final String temp = StringOps.toTrimOrNull(prop.getPropertyByName(m_baseprop + ".auth.list"));
if (null != temp)
{
for (String name : temp.split(","))
{
name = StringOps.toTrimOrNull(name);
if (null != name)
{
final String user = StringOps.requireTrimOrNull(prop.getPropertyByName(m_baseprop + ".auth." + name + ".user"));
final String pass = StringOps.requireTrimOrNull(prop.getPropertyByName(m_baseprop + ".auth." + name + ".pass"));
final String data = StringOps.requireTrimOrNull(prop.getPropertyByName(m_baseprop + ".auth." + name + ".db"));
m_authlist.add(MongoCredential.createCredential(user, data, pass.toCharArray()));
}
}
}
if (null == getClientOptions())
{
setClientOptions(MongoClientOptions.builder().connectionsPerHost(getConnectionPoolSize()).threadsAllowedToBlockForConnectionMultiplier(getConnectionMultiplier()).connectTimeout(getConnectionTimeout()).build());
}
m_doptions = new LinkedHashMap<>();
final String conf = StringOps.toTrimOrNull(prop.getPropertyByName(m_baseprop + ".dbconfig.list"));
if (null != conf)
{
for (String name : conf.split(","))
{
name = StringOps.toTrimOrNull(name);
if ((null != name) && (null == m_doptions.get(name)))
{
boolean doid = isCreateID();
final ArrayList list = new ArrayList<>();
final String dbid = StringOps.toTrimOrNull(prop.getPropertyByName(m_baseprop + ".dbconfig." + name + ".createid"));
if (null != dbid)
{
doid = Boolean.valueOf(dbid);
}
final String base = m_baseprop + ".dbconfig." + name + ".collections";
final String cols = StringOps.toTrimOrNull(prop.getPropertyByName(base));
if (null != cols)
{
for (String coln : cols.split(","))
{
coln = StringOps.toTrimOrNull(coln);
if (null != coln)
{
final String icid = StringOps.toTrimOrNull(prop.getPropertyByName(base + "." + coln + ".createid"));
if (null != icid)
{
list.add(new MongoDBCollectionOptions(coln, Boolean.valueOf(icid)));
}
else
{
list.add(new MongoDBCollectionOptions(coln, doid));
}
}
}
}
m_doptions.put(name, new MongoDBOptions(name, doid, list));
}
}
}
return true;
}
@Override
public boolean isCreateID()
{
return m_createid;
}
private final void setCreateID(final boolean createid)
{
m_createid = createid;
}
@Override
public void close() throws IOException
{
if (null != m_mongo_db)
{
m_mongo_db.close();
}
}
@Override
public String getName()
{
return m_name;
}
private final void setName(final String name)
{
m_name = CommonOps.requireNonNull(StringOps.toTrimOrNull(name), "MongoDBDescriptor name is null or empty");
}
@Override
public synchronized MongoDB getMongoDB()
{
if (null == m_mongo_db)
{
m_mongo_db = new MongoDB(getAddresses(), getCredentials(), getClientOptions(), isReplicas(), getDefaultDB(), isCreateID(), getDBOptions());
}
return m_mongo_db;
}
@Override
public int getConnectionTimeout()
{
return m_ctimeout;
}
@Override
public int getConnectionMultiplier()
{
return m_multiple;
}
@Override
public int getConnectionPoolSize()
{
return m_poolsize;
}
public void setConnectionTimeout(final int timeout)
{
m_ctimeout = Math.max(0, timeout);
}
public void setConnectionMultiplier(final int multiplier)
{
m_multiple = Math.max(0, multiplier);
}
public void setConnectionPoolSize(final int poolsize)
{
m_poolsize = Math.max(1, poolsize);
}
@Override
public String getDefaultDB()
{
return m_defaultd;
}
public void setDefaultDB(final String name)
{
m_defaultd = CommonOps.requireNonNull(StringOps.toTrimOrNull(name), "DefaultDB is null or empty");
}
@Override
public List getCredentials()
{
return CommonOps.toUnmodifiableList(m_authlist);
}
@Override
public boolean isReplicas()
{
return m_replicas;
}
public void setReplicas(final boolean replicas)
{
m_replicas = replicas;
}
@Override
public List getAddresses()
{
return CommonOps.toUnmodifiableList(m_addrlist);
}
public void setClientOptions(final MongoClientOptions coptions)
{
m_coptions = CommonOps.requireNonNull(coptions);
}
@Override
public MongoClientOptions getClientOptions()
{
return m_coptions;
}
@Override
public Map getDBOptions()
{
return CommonOps.toUnmodifiableMap(m_doptions);
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy