blob: 5a694529f67a7e2409c2fabe7415d2e33cf3d015 [file] [log] [blame]
package org.qi4j.tools.shell.model;
import java.io.File;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import org.qi4j.api.injection.scope.Service;
import org.qi4j.api.injection.scope.Structure;
import org.qi4j.api.unitofwork.UnitOfWork;
import org.qi4j.api.unitofwork.UnitOfWorkFactory;
import org.qi4j.api.unitofwork.concern.UnitOfWorkPropagation;
import org.qi4j.tools.shell.FileUtils;
public interface ProjectDescriptorByProperties
{
void parse( String projectName, File propertiesFile );
Project findProject( String projectName );
public class Mixin
implements ProjectDescriptorByProperties
{
@Service
private Model model;
@Structure
private UnitOfWorkFactory uowf;
public void parse( String projectName, File file )
{
Map<String, String> props = FileUtils.readPropertiesFile( file );
Project project = findProject( projectName );
int layers = Integer.parseInt( props.get( "layers" ) );
for( int i = 0; i < layers; i++ )
{
String layerName = props.get( "layer." + i + ".name" );
project.createLayer( layerName );
Layer layer = project.findLayer( layerName );
for( String use : extractUses( props, i ) )
{
layer.usesLayer( use );
}
int modules = Integer.parseInt( props.get( "layer." + i + ".modules" ) );
for( int j = 0; j < modules; j++ )
{
String moduleName = props.get( "layer." + i + ".module." + j + ".name" );
layer.createModule( moduleName );
}
}
}
private List<String> extractUses( Map<String, String> props, int i )
{
String uses = props.get( "layer." + i + ".uses" );
if( uses == null )
{
return Collections.emptyList();
}
return Arrays.asList( uses.split( "," ) );
}
@UnitOfWorkPropagation
public Project findProject( String projectName )
{
UnitOfWork uow = uowf.currentUnitOfWork();
Project project = Project.Support.get( uow, projectName );
if( project == null )
{
try
{
model.createProject( projectName );
}
catch( ProjectAlreadyExistsException e )
{
// Can not happen
e.printStackTrace();
}
}
return project;
}
}
}