/**
* Copyright (c) 2002-2012 "Neo Technology,"
* Network Engine for Objects in Lund AB [http://neotechnology.com]
*
* This file is part of Neo4j.
*
* Neo4j is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.neo4j.server.enterprise;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
import org.apache.commons.configuration.Configuration;
import org.neo4j.kernel.ha.HaSettings;
import org.neo4j.server.configuration.Configurator;
import org.neo4j.server.preflight.EnsureNeo4jPropertiesExist;
public class EnsureEnterpriseNeo4jPropertiesExist extends EnsureNeo4jPropertiesExist
{
public static final String CONFIG_KEY_OLD_SERVER_ID = "ha.machine_id";
public static final String CONFIG_KEY_OLD_COORDINATORS = "ha.zoo_keeper_servers";
public EnsureEnterpriseNeo4jPropertiesExist( Configuration config )
{
super( config );
}
// TODO: This validation should be done by the settings classes in HA
// and by the enterprise server settings, once we have refactored them
// to use the new config scheme.
@Override
protected boolean validateProperties( Properties configProperties )
{
String dbMode = configProperties.getProperty( Configurator.DB_MODE_KEY,
EnterpriseDatabase.DatabaseMode.SINGLE.name() );
dbMode = dbMode.toUpperCase();
if ( dbMode.equals( EnterpriseDatabase.DatabaseMode.SINGLE.name() ) )
{
return true;
}
if ( !dbMode.equals( EnterpriseDatabase.DatabaseMode.HA.name() ) )
{
failureMessage = String.format( "Illegal value for %s \"%s\" in %s", Configurator.DB_MODE_KEY, dbMode,
Configurator.NEO_SERVER_CONFIG_FILE_KEY );
return false;
}
String dbTuningFilename = configProperties.getProperty( Configurator.DB_TUNING_PROPERTY_FILE_KEY );
if ( dbTuningFilename == null )
{
failureMessage = String.format( "High-Availability mode requires %s to be set in %s",
Configurator.DB_TUNING_PROPERTY_FILE_KEY, Configurator.NEO_SERVER_CONFIG_FILE_KEY );
return false;
}
else
{
File dbTuningFile = new File( dbTuningFilename );
if ( !dbTuningFile.exists() )
{
failureMessage = String.format( "No database tuning file at [%s]", dbTuningFile.getAbsoluteFile() );
return false;
}
else
{
Properties dbTuning = new Properties();
try
{
InputStream tuningStream = new FileInputStream( dbTuningFile );
try
{
dbTuning.load( tuningStream );
}
finally
{
tuningStream.close();
}
}
catch ( IOException e )
{
// Shouldn't happen, we already covered those cases
failureMessage = e.getMessage();
return false;
}
String machineId = null;
try
{
machineId = getSinglePropertyFromCandidates( dbTuning, HaSettings.server_id.name(),
CONFIG_KEY_OLD_SERVER_ID, "<not set>" );
if ( Integer.parseInt( machineId ) < 0 )
{
throw new NumberFormatException();
}
}
catch ( NumberFormatException e )
{
failureMessage = String.format( "%s in %s needs to be a non-negative integer, not %s",
HaSettings.server_id.name(), dbTuningFilename, machineId );
return false;
}
catch ( IllegalArgumentException e )
{
failureMessage = String.format( "%s in %s", e.getMessage(), dbTuningFilename );
return false;
}
}
}
return true;
}
private String getSinglePropertyFromCandidates( Properties dbTuning, String first,
String other, String defaultValue )
{
String firstValue = dbTuning.getProperty( first );
String otherValue = dbTuning.getProperty( other );
if ( firstValue == null && otherValue == null )
{
return defaultValue;
}
// Perhaps not a correct use of IllegalArgumentException
if ( firstValue != null && otherValue != null )
{
throw new IllegalArgumentException( "Multiple configuration values set for the same logical property [" +
first + "," + other + "]" );
}
return firstValue != null ? firstValue : otherValue;
}
}