2014-11-14 12:02:52 +01:00
/ *
* This file is part of Applied Energistics 2 .
* Copyright ( c ) 2013 - 2014 , AlgorithmX2 , All rights reserved .
*
* Applied Energistics 2 is free software : you can redistribute it and / or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation , either version 3 of the License , or
* ( at your option ) any later version .
*
* Applied Energistics 2 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 Lesser General Public License for more details .
*
* You should have received a copy of the GNU Lesser General Public License
* along with Applied Energistics 2 . If not , see < http : //www.gnu.org/licenses/lgpl>.
* /
2014-09-24 02:26:27 +02:00
package appeng.integration ;
2014-11-28 04:36:46 +01:00
2014-09-24 02:26:27 +02:00
import java.lang.reflect.Field ;
2014-11-28 04:36:46 +01:00
import cpw.mods.fml.common.Loader ;
2015-04-13 19:28:53 +02:00
import cpw.mods.fml.common.ModAPIManager ;
2014-11-28 04:36:46 +01:00
2014-09-24 02:26:27 +02:00
import appeng.api.exceptions.ModNotInstalled ;
import appeng.core.AEConfig ;
import appeng.core.AELog ;
2015-04-03 08:54:31 +02:00
2015-04-13 19:28:53 +02:00
public final class IntegrationNode
2014-09-24 02:26:27 +02:00
{
2014-09-29 09:54:34 +02:00
final String displayName ;
final String modID ;
final IntegrationType shortName ;
2015-04-03 08:54:31 +02:00
IntegrationStage state = IntegrationStage . PRE_INIT ;
IntegrationStage failedStage = IntegrationStage . PRE_INIT ;
Throwable exception = null ;
2014-09-24 02:26:27 +02:00
String name = null ;
Class classValue = null ;
Object instance ;
IIntegrationModule mod = null ;
2015-04-03 08:54:31 +02:00
public IntegrationNode ( String displayName , String modID , IntegrationType shortName , String name )
{
2014-09-28 11:47:17 +02:00
this . displayName = displayName ;
this . shortName = shortName ;
this . modID = modID ;
this . name = name ;
2014-09-24 02:26:27 +02:00
}
@Override
public String toString ( )
{
2014-12-29 15:13:47 +01:00
return this . shortName . name ( ) + ':' + this . state . name ( ) ;
2014-09-24 02:26:27 +02:00
}
2015-04-03 08:54:31 +02:00
public boolean isActive ( )
2014-09-24 02:26:27 +02:00
{
2015-04-03 08:54:31 +02:00
if ( this . state = = IntegrationStage . PRE_INIT )
2015-04-13 19:28:53 +02:00
this . call ( IntegrationStage . PRE_INIT ) ;
2015-04-03 08:54:31 +02:00
return this . state ! = IntegrationStage . FAILED ;
}
2015-04-13 19:28:53 +02:00
void call ( IntegrationStage stage )
2015-04-03 08:54:31 +02:00
{
if ( this . state ! = IntegrationStage . FAILED )
2014-09-24 02:26:27 +02:00
{
2015-04-03 08:54:31 +02:00
if ( this . state . ordinal ( ) > stage . ordinal ( ) )
2014-09-24 02:26:27 +02:00
return ;
try
{
2015-04-03 08:54:31 +02:00
switch ( stage )
2014-09-24 02:26:27 +02:00
{
2015-04-03 08:54:31 +02:00
case PRE_INIT :
2015-04-13 19:28:53 +02:00
final ModAPIManager apiManager = ModAPIManager . INSTANCE ;
boolean enabled = this . modID = = null | | Loader . isModLoaded ( this . modID ) | | apiManager . hasAPI ( this . modID ) ;
2015-04-03 08:54:31 +02:00
AEConfig . instance . addCustomCategoryComment ( " ModIntegration " , " Valid Values are 'AUTO', 'ON', or 'OFF' - defaults to 'AUTO' ; Suggested that you leave this alone unless your experiencing an issue, or wish to disable the integration for a reason. " ) ;
2015-04-13 19:28:53 +02:00
String mode = AEConfig . instance . get ( " ModIntegration " , this . displayName . replace ( " " , " " ) , " AUTO " ) . getString ( ) ;
2015-04-03 08:54:31 +02:00
2015-04-13 19:28:53 +02:00
if ( mode . toUpperCase ( ) . equals ( " ON " ) )
2015-04-03 08:54:31 +02:00
enabled = true ;
2015-04-13 19:28:53 +02:00
if ( mode . toUpperCase ( ) . equals ( " OFF " ) )
2015-04-03 08:54:31 +02:00
enabled = false ;
if ( enabled )
{
this . classValue = this . getClass ( ) . getClassLoader ( ) . loadClass ( this . name ) ;
this . mod = ( IIntegrationModule ) this . classValue . getConstructor ( ) . newInstance ( ) ;
Field f = this . classValue . getField ( " instance " ) ;
f . set ( this . classValue , this . instance = this . mod ) ;
}
else
throw new ModNotInstalled ( this . modID ) ;
this . state = IntegrationStage . INIT ;
break ;
case INIT :
this . mod . init ( ) ;
this . state = IntegrationStage . POST_INIT ;
break ;
case POST_INIT :
this . mod . postInit ( ) ;
this . state = IntegrationStage . READY ;
break ;
case FAILED :
default :
break ;
2014-09-24 02:26:27 +02:00
}
}
2015-04-03 08:54:31 +02:00
catch ( Throwable t )
2014-09-24 02:26:27 +02:00
{
2014-12-29 15:13:47 +01:00
this . failedStage = stage ;
this . exception = t ;
this . state = IntegrationStage . FAILED ;
2014-09-24 02:26:27 +02:00
}
}
2015-04-03 08:54:31 +02:00
if ( stage = = IntegrationStage . POST_INIT )
2014-09-24 02:26:27 +02:00
{
2015-04-03 08:54:31 +02:00
if ( this . state = = IntegrationStage . FAILED )
2014-09-24 02:26:27 +02:00
{
2014-12-29 15:13:47 +01:00
AELog . info ( this . displayName + " - Integration Disabled " ) ;
2015-04-03 08:54:31 +02:00
if ( ! ( this . exception instanceof ModNotInstalled ) )
2014-12-29 15:13:47 +01:00
AELog . integration ( this . exception ) ;
2014-09-24 02:26:27 +02:00
}
else
{
2014-12-29 15:13:47 +01:00
AELog . info ( this . displayName + " - Integration Enable " ) ;
2014-09-24 02:26:27 +02:00
}
}
}
}