package org.objectstyle.wolips.eomodeler.core.model;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import org.objectstyle.wolips.baseforplugins.util.ComparisonUtils;
import org.objectstyle.wolips.eomodeler.core.Messages;
import org.objectstyle.wolips.eomodeler.core.utils.NotificationMap;
public class EODatabaseConfig extends EOModelObject<EOModel> {
public static final String JDBC_ADAPTOR_NAME = "JDBC";
public static final String JNDI_ADAPTOR_NAME = "JNDI";
public static final String MEMORY_ADAPTOR_NAME = "Memory";
public static final String REST_ADAPTOR_NAME = "REST";
public static final String NONE_AUTHENTICATION_METHOD = "None";
public static final String SIMPLE_AUTHENTICATION_METHOD = "Simple";
public static final String OBJECT_SCOPE = "Object";
public static final String SUBTREE_SCOPE = "Subtree";
public static final String ONE_LEVEL_SCOPE = "One Level";
public static final String USERNAME = "username";
public static final String PASSWORD = "password";
public static final String URL = "URL";
public static final String DRIVER = "driver";
public static final String PLUGIN = "plugin";
public static final String CONNECTION_DICTIONARY = "connectionDictionary";
public static final String NAME = "name";
public static final String PROTOTYPE = "prototype";
public static final String ADAPTOR_NAME = "adaptorName";
public static final String AUTHENTICATION_METHOD = "authenticationMethod";
public static final String INITIAL_CONTEXT_FACTORY = "initialContextFactory";
public static final String SCOPE = "scope";
public static final String TIMEOUT = "timeout";
public static final String PRIORITY = "priority";
public static final String DEPLOYMENT_PROFILE = "deploymentProfile";
private EOModel myModel;
private String myAdaptorName;
private String myName;
private String myPrototypeName;
private EOEntity myCachedPrototype;
private NotificationMap<Object, Object> myConnectionDictionary;
private PropertyChangeRepeater myConnectionDictionaryRepeater;
private EOModelMap myDatabaseConfigMap;
public EODatabaseConfig() {
myConnectionDictionaryRepeater = new PropertyChangeRepeater(EODatabaseConfig.CONNECTION_DICTIONARY);
myDatabaseConfigMap = new EOModelMap();
myAdaptorName = EODatabaseConfig.JDBC_ADAPTOR_NAME;
setConnectionDictionary(new NotificationMap<Object, Object>(), false);
}
public EODatabaseConfig(String _name) {
this();
myName = _name;
}
public boolean isActive() {
return (myModel != null && myModel.getActiveDatabaseConfig() == this);
}
public void setActive() {
if (myModel != null) {
myModel.setActiveDatabaseConfig(this);
}
}
// public boolean equals(Object _obj) {
// return (_obj instanceof EODatabaseConfig && ComparisonUtils.equals(myName, ((EODatabaseConfig) _obj).myName));
// }
//
// public int hashCode() {
// return (myName == null) ? super.hashCode() : myName.hashCode();
// }
public boolean isEquivalent(EODatabaseConfig config, boolean comparePrototypes) {
boolean equivalent = false;
if (config != null) {
equivalent = (myConnectionDictionary != null && config.myConnectionDictionary != null);
if (equivalent) {
equivalent = ComparisonUtils.equals(myAdaptorName, config.myAdaptorName);
}
if (equivalent) {
equivalent = ComparisonUtils.equals(myConnectionDictionary.get("URL"), config.myConnectionDictionary.get("URL"));
}
if (equivalent) {
equivalent = ComparisonUtils.equals(myConnectionDictionary.get("username"), config.myConnectionDictionary.get("username"));
}
if (equivalent) {
equivalent = ComparisonUtils.equals(myConnectionDictionary.get("password"), config.myConnectionDictionary.get("password"));
}
if (equivalent) {
equivalent = ComparisonUtils.equals(myConnectionDictionary.get("plugin"), config.myConnectionDictionary.get("plugin"));
}
if (equivalent) {
equivalent = ComparisonUtils.equals(myConnectionDictionary.get("driver"), config.myConnectionDictionary.get("driver"));
}
if (equivalent) {
equivalent = ComparisonUtils.equals(myConnectionDictionary.get("serverUrl"), config.myConnectionDictionary.get("serverUrl"));
}
if (equivalent) {
equivalent = ComparisonUtils.equals(myConnectionDictionary.get("initialContextFactory"), config.myConnectionDictionary.get("initialContextFactory"));
}
if (equivalent) {
equivalent = ComparisonUtils.equals(myConnectionDictionary.get("authenticationMethod"), config.myConnectionDictionary.get("authenticationMethod"));
}
if (equivalent) {
equivalent = ComparisonUtils.equals(myConnectionDictionary.get("plugInClassName"), config.myConnectionDictionary.get("plugInClassName"));
}
if (equivalent) {
equivalent = ComparisonUtils.equals(myConnectionDictionary.get("scope"), config.myConnectionDictionary.get("scope"));
}
if (equivalent && comparePrototypes) {
equivalent = myPrototypeName == null || config.myPrototypeName == null || myPrototypeName.length() == 0 || config.myPrototypeName.length() == 0 || ComparisonUtils.equals(myPrototypeName, config.myPrototypeName);
}
}
return equivalent;
}
public void pasted() {
// DO NOTHING
}
public void _setModel(EOModel _model) {
myModel = _model;
}
public EOModel getModel() {
return myModel;
}
protected void _propertyChanged(String _propertyName, Object _oldValue, Object _newValue) {
if (myModel != null) {
myModel._databaseConfigChanged(this, _propertyName, _oldValue, _newValue);
}
}
public String getName() {
return myName;
}
public void setAdaptorName(String _adaptorName) {
String oldAdaptorName = myAdaptorName;
myAdaptorName = _adaptorName;
if (EODatabaseConfig.JNDI_ADAPTOR_NAME.equals(myAdaptorName)) {
if (getPlugin() == null || getPlugin().length() == 0) {
setPlugin("com.webobjects.jndiadaptor.LDAPPlugIn");
}
if (getInitialContextFactory() == null || getInitialContextFactory().length() == 0) {
setInitialContextFactory("com.sun.jndi.ldap.LdapCtxFactory");
}
if (getTimeout() == null) {
setTimeout(Integer.valueOf(3600));
}
if (getScope() == null || getScope().length() ==0) {
setScope(EODatabaseConfig.SUBTREE_SCOPE);
}
if (getAuthenticationMethod() == null || getAuthenticationMethod().length() ==0) {
setAuthenticationMethod(EODatabaseConfig.NONE_AUTHENTICATION_METHOD);
}
}
firePropertyChange(EODatabaseConfig.ADAPTOR_NAME, oldAdaptorName, myAdaptorName);
}
public String getAdaptorName() {
return myAdaptorName;
}
public void setName(String _name) throws DuplicateDatabaseConfigNameException {
setName(_name, true);
}
public void setName(String _name, boolean _fireEvents) throws DuplicateDatabaseConfigNameException {
if (_name == null) {
throw new NullPointerException(Messages.getString("EODatabaseConfig.noBlankDatabaseConfigNames"));
}
String oldName = myName;
if (myModel != null) {
myModel._checkForDuplicateDatabaseConfigName(this, _name, null);
}
myName = _name;
if (_fireEvents) {
firePropertyChange(EODatabaseConfig.NAME, oldName, myName);
}
}
public EOEntity getPrototype() {
if (myCachedPrototype == null && myModel != null) {
myCachedPrototype = myModel.getModelGroup().getEntityNamed(myPrototypeName);
}
return myCachedPrototype;
}
public void setPrototype(EOEntity _prototype) {
EOEntity oldPrototype = getPrototype();
if (_prototype == null) {
myPrototypeName = null;
myCachedPrototype = null;
} else {
myPrototypeName = _prototype.getName();
myCachedPrototype = null;
}
EOEntity newPrototype = getPrototype();
firePropertyChange(EODatabaseConfig.PROTOTYPE, oldPrototype, newPrototype);
if (newPrototype != null) {
Map<String, Object> exampleConnectionDictionary = (Map<String, Object>)newPrototype.getUserInfo().get("exampleConnectionDictionary");
if (exampleConnectionDictionary != null) {
for (Map.Entry<String, Object> entry : exampleConnectionDictionary.entrySet()) {
Object oldValue = getConnectionDictionary().get(entry.getKey());
getConnectionDictionary().put(entry.getKey(), entry.getValue());
firePropertyChange(entry.getKey(), oldValue, entry.getValue());
}
}
}
}
public void setUsername(String _userName) {
getConnectionDictionary().put(EODatabaseConfig.USERNAME, _userName);
}
public String getUsername() {
return (String) getConnectionDictionary().get(EODatabaseConfig.USERNAME);
}
public void setPassword(String _password) {
getConnectionDictionary().put(EODatabaseConfig.PASSWORD, _password);
}
public String getPassword() {
return (String) getConnectionDictionary().get(EODatabaseConfig.PASSWORD);
}
public void setPlugin(String _plugin) {
if (EODatabaseConfig.JNDI_ADAPTOR_NAME.equals(myAdaptorName)) {
getConnectionDictionary().put("plugInClassName", _plugin.trim());
}
else {
getConnectionDictionary().put(EODatabaseConfig.PLUGIN, _plugin.trim());
}
}
public String getPlugin() {
String plugin;
if (EODatabaseConfig.JNDI_ADAPTOR_NAME.equals(myAdaptorName)) {
plugin = (String) getConnectionDictionary().get("plugInClassName");
}
else {
plugin = (String) getConnectionDictionary().get(EODatabaseConfig.PLUGIN);
}
return plugin;
}
public void setDriver(String _driver) {
getConnectionDictionary().put(EODatabaseConfig.DRIVER, _driver.trim());
}
public String getDriver() {
return (String) getConnectionDictionary().get(EODatabaseConfig.DRIVER);
}
public void setURL(String _url) {
if (EODatabaseConfig.JNDI_ADAPTOR_NAME.equals(myAdaptorName)) {
getConnectionDictionary().put("serverUrl", _url.trim());
}
else {
getConnectionDictionary().put(EODatabaseConfig.URL, _url.trim());
}
}
public String getURL() {
String url;
if (EODatabaseConfig.JNDI_ADAPTOR_NAME.equals(myAdaptorName)) {
url = (String) getConnectionDictionary().get("serverUrl");
}
else {
url = (String) getConnectionDictionary().get(EODatabaseConfig.URL);
}
return url;
}
public void setTimeout(Integer _timeout) {
getConnectionDictionary().put(EODatabaseConfig.TIMEOUT, _timeout);
}
public Integer getTimeout() {
return (Integer) getConnectionDictionary().get(EODatabaseConfig.TIMEOUT);
}
public void setInitialContextFactory(String _initialContextFactory) {
getConnectionDictionary().put(EODatabaseConfig.INITIAL_CONTEXT_FACTORY, _initialContextFactory);
}
public String getInitialContextFactory() {
return (String) getConnectionDictionary().get(EODatabaseConfig.INITIAL_CONTEXT_FACTORY);
}
public void setAuthenticationMethod(String _authenticationMethod) {
getConnectionDictionary().put(EODatabaseConfig.AUTHENTICATION_METHOD, _authenticationMethod);
}
public String getAuthenticationMethod() {
return (String) getConnectionDictionary().get(EODatabaseConfig.AUTHENTICATION_METHOD);
}
public void setScope(String _scope) {
getConnectionDictionary().put(EODatabaseConfig.SCOPE, _scope);
}
public String getScope() {
return (String) getConnectionDictionary().get(EODatabaseConfig.SCOPE);
}
public void setPriority(Integer priority) {
getConnectionDictionary().put(EODatabaseConfig.PRIORITY, priority);
}
public Integer getPriority() {
return (Integer) getConnectionDictionary().get(EODatabaseConfig.PRIORITY);
}
public void setDeploymentProfile(String deploymentProfile) {
getConnectionDictionary().put(EODatabaseConfig.DEPLOYMENT_PROFILE, deploymentProfile);
}
public String getDeploymentProfile() {
return (String) getConnectionDictionary().get(EODatabaseConfig.DEPLOYMENT_PROFILE);
}
public void setConnectionDictionary(Map<Object, Object> _connectionDictionary) {
setConnectionDictionary(_connectionDictionary, true);
}
public void setConnectionDictionary(Map<Object, Object> _connectionDictionary, boolean _fireEvents) {
Map oldConnectionDictionary = myConnectionDictionary;
if (_connectionDictionary != null) {
Object password = _connectionDictionary.get(EODatabaseConfig.PASSWORD);
if (password != null && !(password instanceof String)) {
_connectionDictionary.put(EODatabaseConfig.PASSWORD, String.valueOf(password));
}
}
myConnectionDictionary = mapChanged(myConnectionDictionary, _connectionDictionary, myConnectionDictionaryRepeater, false);
if (_fireEvents) {
firePropertyChange(myConnectionDictionaryRepeater.getPropertyName(), oldConnectionDictionary, myConnectionDictionary);
}
}
public Map<Object, Object> getConnectionDictionary() {
return myConnectionDictionary;
}
public String getFullyQualifiedName() {
return ((myModel == null) ? "?" : myModel.getFullyQualifiedName()) + "/dbconfig: " + myName;
}
@SuppressWarnings("unused")
public void resolve(Set<EOModelVerificationFailure> _failures) {
// DO NOTHING
}
public void verify(Set<EOModelVerificationFailure> _failures) {
if (myPrototypeName != null && myPrototypeName.length() > 0 && getPrototype() == null) {
_failures.add(new EOModelVerificationFailure(getModel(), this, "The database config " + getName() + " references the prototype entity '" + myPrototypeName + "' which no longer appears to exist.", true));
}
}
public Set<EOModelReferenceFailure> getReferenceFailures() {
return new HashSet<EOModelReferenceFailure>();
}
@SuppressWarnings("unused")
public void loadFromMap(EOModelMap _map, Set<EOModelVerificationFailure> _failures) {
myDatabaseConfigMap = _map;
myAdaptorName = _map.getString("adaptorName", true);
if (myAdaptorName == null) {
myAdaptorName = EODatabaseConfig.JDBC_ADAPTOR_NAME;
}
myPrototypeName = _map.getString("prototypeEntityName", true);
setConnectionDictionary(_map.getMap("connectionDictionary", true), false);
}
public EOModelMap toMap() {
EOModelMap modelMap = myDatabaseConfigMap.cloneModelMap();
if (myAdaptorName == null) {
modelMap.setString("adaptorName", EODatabaseConfig.JDBC_ADAPTOR_NAME, true);
} else {
modelMap.setString("adaptorName", myAdaptorName, true);
}
modelMap.setString("prototypeEntityName", myPrototypeName, true);
Map connectionDictionary = new HashMap(getConnectionDictionary());
if (EODatabaseConfig.JNDI_ADAPTOR_NAME.equals(myAdaptorName)) {
connectionDictionary.remove("URL");
connectionDictionary.remove("plugin");
connectionDictionary.remove("driver");
}
else if (EODatabaseConfig.JDBC_ADAPTOR_NAME.equals(myAdaptorName) || myAdaptorName == null) {
connectionDictionary.remove("serverUrl");
connectionDictionary.remove("plugInClassName");
connectionDictionary.remove("initialContextFactory");
connectionDictionary.remove("authenticationMethod");
connectionDictionary.remove("scope");
connectionDictionary.remove("timeout");
}
modelMap.setMap("connectionDictionary", connectionDictionary, true);
return modelMap;
}
@Override
public EODatabaseConfig _cloneModelObject() {
EODatabaseConfig databaseConfig = new EODatabaseConfig(myName);
databaseConfig.myAdaptorName = myAdaptorName;
databaseConfig.myPrototypeName = myPrototypeName;
databaseConfig.setConnectionDictionary(new HashMap<Object, Object>(myConnectionDictionary));
return databaseConfig;
}
@Override
public Class<EOModel> _getModelParentType() {
return EOModel.class;
}
public EOModel _getModelParent() {
return getModel();
}
public void _removeFromModelParent(Set<EOModelVerificationFailure> failures) {
getModel().removeDatabaseConfig(this);
}
public void _addToModelParent(EOModel modelParent, boolean findUniqueName, Set<EOModelVerificationFailure> failures) throws EOModelException {
if (findUniqueName) {
setName(modelParent.findUnusedDatabaseConfigName(getName()));
}
modelParent.addDatabaseConfig(this);
}
public boolean canConvertToConnectionDictionary() {
return getPrototype() == null;
}
}