/**
* Licensed to Neo Technology under one or more contributor
* license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright
* ownership. Neo Technology licenses this file to you 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 org.neo4j.neoclipse.connection;
import java.io.File;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import org.dom4j.Element;
import org.dom4j.tree.DefaultElement;
import org.neo4j.neoclipse.util.ApplicationUtil;
/**
* Our Neo4JConnection, which adds the connection to our GraphDatabaseService
* object
*
* @author Radhakrishna Kalyan
*
*/
public class Alias
{
/*package*/static final String ALIASES = "aliases";
/*package*/static final String ALIAS = "alias";
/*package*/static final String NAME = "name";
/*package*/static final String URI = "uri";
/*package*/static final String USER_NAME = "user-name";
/*package*/static final String PASSWORD = "password";
/*package*/static final String CONFIGURATIONS = "configurations";
/*package*/static final String CONFIG = "config";
/*package*/static final String CONFIG_NAME = "name";
/*package*/static final String CONFIG_VALUE = "value";
private final String name;
private String uri;
private String userName;
private String password;
private long createdTime;
private ConnectionMode connectionMode;
private final Map<String, String> configurationMap = new HashMap<String, String>();
public Alias( String aliasName, String dbPath, String user, String pass )
{
name = aliasName;
uri = dbPath;
connectionMode = ConnectionMode.getValue( dbPath );
if ( connectionMode == ConnectionMode.LOCAL )
{
File dir = new File( uri );
if ( !dir.exists() )
{
if ( !dir.mkdirs() )
{
throw new IllegalArgumentException( "Could not create directory: " + dir );
}
uri = dir.getAbsolutePath();
}
if ( !dir.isDirectory() )
{
throw new IllegalArgumentException( "The database location is not a directory." );
}
if ( !dir.canWrite() )
{
throw new IllegalAccessError( "Permission Denied for write to the database location." );
}
}
if ( !ApplicationUtil.isBlank( user ) )
{
userName = user;
}
if ( !ApplicationUtil.isBlank( user ) )
{
password = pass;
}
createdTime = System.currentTimeMillis();
}
/**
* Constructs an Alias from XML, previously obtained from describeAsXml()
*
* @param root
*/
public Alias( Element root )
{
name = root.elementText( NAME );
uri = root.elementText( URI );
connectionMode = ConnectionMode.getValue( uri );
String user = root.elementText( USER_NAME );
String pass = root.elementText( PASSWORD );
if ( !ApplicationUtil.isBlank( user ) )
{
userName = user;
}
if ( !ApplicationUtil.isBlank( pass ) )
{
password = pass;
}
Element configurationsElement = root.element( CONFIGURATIONS );
if ( configurationsElement != null )
{
List<Element> elements = configurationsElement.elements( CONFIG );
for ( Element config : elements )
{
String configName = config.attributeValue( CONFIG_NAME );
String configValue = config.attributeValue( CONFIG_VALUE );
addConfiguration( configName, configValue );
}
}
}
public long getCreatedTime()
{
return createdTime;
}
public String getName()
{
return name;
}
public String getUri()
{
return uri;
}
public String getUserName()
{
return userName;
}
public String getPassword()
{
return password;
}
public ConnectionMode getConnectionMode()
{
return connectionMode;
}
/**
* Describes this alias in XML; the result can be passed to the
* Alias(Element) constructor to refabricate it
*
* @return
*/
public Element describeAsXml()
{
DefaultElement root = new DefaultElement( ALIAS );
root.addElement( NAME ).setText( ApplicationUtil.returnEmptyIfBlank( name ) );
root.addElement( URI ).setText( ApplicationUtil.returnEmptyIfBlank( uri ) );
root.addElement( USER_NAME ).setText( ApplicationUtil.returnEmptyIfBlank( userName ) );
root.addElement( PASSWORD ).setText( ApplicationUtil.returnEmptyIfBlank( password ) );
if ( !configurationMap.isEmpty() )
{
Element configElement = root.addElement( CONFIGURATIONS );
Set<Entry<String, String>> entrySet = configurationMap.entrySet();
for ( Entry<String, String> entry : entrySet )
{
DefaultElement config = new DefaultElement( CONFIG );
config.addAttribute( CONFIG_NAME, ApplicationUtil.returnEmptyIfBlank( entry.getKey() ) );
config.addAttribute( CONFIG_VALUE, ApplicationUtil.returnEmptyIfBlank( entry.getValue() ) );
configElement.add( config );
}
}
return root;
}
public Map<String, String> getConfigurationMap()
{
return configurationMap;
}
public void addConfiguration( String key, String value )
{
configurationMap.put( key, value );
}
@Override
public int hashCode()
{
final int prime = 31;
int result = 1;
result = prime * result + ( ( name == null ) ? 0 : name.hashCode() );
result = prime * result + ( ( uri == null ) ? 0 : uri.hashCode() );
return result;
}
@Override
public boolean equals( Object obj )
{
if ( this == obj )
{
return true;
}
if ( obj == null )
{
return false;
}
if ( getClass() != obj.getClass() )
{
return false;
}
Alias other = (Alias) obj;
if ( name == null )
{
if ( other.name != null )
{
return false;
}
}
else if ( !name.equals( other.name ) )
{
return false;
}
if ( uri == null )
{
if ( other.uri != null )
{
return false;
}
}
else if ( !uri.equals( other.uri ) )
{
return false;
}
return true;
}
public String getConfigurationByKey( String key )
{
return configurationMap.get( key );
}
}