Applied-Energistics-2-tiler.../src/main/java/appeng/core/worlddata/StorageData.java
thatsIch d1e4ea6579 Improves the message generated when generating the folder for the compass data.
Outsources the encoding of the compass data into the file name
Written tests for the encoding
Did some internal cleaning of the class
2015-06-13 16:05:59 +02:00

167 lines
4.9 KiB
Java

/*
* This file is part of Applied Energistics 2.
* Copyright (c) 2013 - 2015, 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>.
*/
package appeng.core.worlddata;
import java.io.File;
import java.lang.ref.WeakReference;
import java.util.Map;
import java.util.WeakHashMap;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import com.google.common.base.Preconditions;
import net.minecraftforge.common.config.Configuration;
import net.minecraftforge.common.config.Property;
import appeng.core.AELog;
import appeng.me.GridStorage;
import appeng.me.GridStorageSearch;
/**
* @author thatsIch
* @version rv3 - 30.05.2015
* @since rv3 30.05.2015
*/
final class StorageData implements IWorldGridStorageData, IOnWorldStartable, IOnWorldStoppable
{
private static final String LAST_GRID_STORAGE_CATEGORY = "Counters";
private static final String LAST_GRID_STORAGE_KEY = "lastGridStorage";
private static final int LAST_GRID_STORAGE_DEFAULT = 0;
private static final String GRID_STORAGE_CATEGORY = "gridstorage";
private final Map<GridStorageSearch, WeakReference<GridStorageSearch>> loadedStorage = new WeakHashMap<GridStorageSearch, WeakReference<GridStorageSearch>>( 10 );
private final Configuration config;
private long lastGridStorage;
public StorageData( @Nonnull final File settingsFile, @Nonnull final String version )
{
Preconditions.checkNotNull( settingsFile );
Preconditions.checkArgument( settingsFile.isFile() );
Preconditions.checkNotNull( version );
Preconditions.checkArgument( !version.isEmpty() );
this.config = new Configuration( settingsFile, version );
}
/**
* lazy loading, can load any id, even ones that don't exist anymore.
*
* @param storageID ID of grid storage
*
* @return corresponding grid storage
*/
@Nullable
@Override
public GridStorage getGridStorage( long storageID )
{
GridStorageSearch gss = new GridStorageSearch( storageID );
WeakReference<GridStorageSearch> result = this.loadedStorage.get( gss );
if( result == null || result.get() == null )
{
String id = String.valueOf( storageID );
String data = this.config.get( "gridstorage", id, "" ).getString();
GridStorage thisStorage = new GridStorage( data, storageID, gss );
gss.gridStorage = new WeakReference<GridStorage>( thisStorage );
this.loadedStorage.put( gss, new WeakReference<GridStorageSearch>( gss ) );
return thisStorage;
}
return result.get().gridStorage.get();
}
/**
* create a new storage
*/
@Nonnull
@Override
public GridStorage getNewGridStorage()
{
long storageID = this.nextGridStorage();
GridStorageSearch gss = new GridStorageSearch( storageID );
GridStorage newStorage = new GridStorage( storageID, gss );
gss.gridStorage = new WeakReference<GridStorage>( newStorage );
this.loadedStorage.put( gss, new WeakReference<GridStorageSearch>( gss ) );
return newStorage;
}
@Override
public long nextGridStorage()
{
long r = this.lastGridStorage;
this.lastGridStorage++;
this.config.get( "Counters", "lastGridStorage", this.lastGridStorage ).set( Long.toString( this.lastGridStorage ) );
return r;
}
@Override
public void destroyGridStorage( long id )
{
String stringID = String.valueOf( id );
this.config.getCategory( "gridstorage" ).remove( stringID );
}
@Override
public int getNextOrderedValue( String name )
{
Property p = this.config.get( "orderedValues", name, 0 );
int myValue = p.getInt();
p.set( myValue + 1 );
return myValue;
}
@Override
public void onWorldStart()
{
final String lastString = this.config.get( LAST_GRID_STORAGE_CATEGORY, LAST_GRID_STORAGE_KEY, LAST_GRID_STORAGE_DEFAULT ).getString();
try
{
this.lastGridStorage = Long.parseLong( lastString );
}
catch( NumberFormatException err )
{
AELog.warning( "The config contained a value which was not represented as a Long: %s", lastString );
this.lastGridStorage = 0;
}
}
@Override
public void onWorldStop()
{
// populate new data
for( GridStorageSearch gs : this.loadedStorage.keySet() )
{
GridStorage thisStorage = gs.gridStorage.get();
if( thisStorage != null && thisStorage.getGrid() != null && !thisStorage.getGrid().isEmpty() )
{
String value = thisStorage.getValue();
this.config.get( GRID_STORAGE_CATEGORY, String.valueOf( thisStorage.getID() ), value ).set( value );
}
}
}
}