package org.glassfish.pfl.basic.tools.file ;
import org.glassfish.pfl.basic.func.BinaryFunction;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
public class BlockParser {
private BlockParser() {}
public static Block getBlock( final FileWrapper fw ) throws IOException {
fw.open( FileWrapper.OpenMode.READ ) ;
try {
final List<String> data = new ArrayList<String>() ;
String line = fw.readLine() ;
while (line != null) {
data.add( line ) ;
line = fw.readLine() ;
}
return new Block( data ) ;
} finally {
fw.close() ;
}
}
public static final String = "CommentBlock" ;
public static List<Block> parseBlocks( final FileWrapper fw,
final String prefix ) throws IOException {
boolean inComment = false ;
final List<Block> result = new ArrayList<Block>() ;
fw.open( FileWrapper.OpenMode.READ ) ;
try {
List<String> data = new ArrayList<String>() ;
BinaryFunction<List<String>,String,List<String>> newBlock =
new BinaryFunction<List<String>,String,List<String>>() {
@Override
public List<String> evaluate( List<String> data,
String tag ) {
if (data.isEmpty()) {
return data;
}
final Block bl = new Block( data ) ;
if (tag != null) {
bl.addTag(tag);
}
result.add( bl ) ;
return new ArrayList<String>() ;
}
} ;
String line = fw.readLine() ;
while (line != null) {
if (inComment) {
if (!line.startsWith( prefix )) {
inComment = false ;
data = newBlock.evaluate( data, COMMENT_BLOCK_TAG ) ;
}
} else {
if (line.startsWith( prefix )) {
inComment = true ;
data = newBlock.evaluate( data, null ) ;
}
}
data.add( line ) ;
line = fw.readLine() ;
}
Block bl = new Block( data ) ;
if (inComment) {
bl.addTag(COMMENT_BLOCK_TAG);
}
result.add( bl ) ;
return result ;
} finally {
fw.close() ;
}
}
public static List<Block> parseBlocks( final FileWrapper fw,
final String start, final String end ) throws IOException {
boolean inComment = false ;
final List<Block> result = new ArrayList<Block>() ;
fw.open( FileWrapper.OpenMode.READ ) ;
try {
List<String> data = new ArrayList<String>() ;
BinaryFunction<List<String>,String,List<String>> newBlock =
new BinaryFunction<List<String>,String,List<String>>() {
@Override
public List<String> evaluate( List<String> data, String tag ) {
if (data.isEmpty()) {
return data;
}
final Block bl = new Block( data ) ;
if (tag != null) {
bl.addTag(tag);
}
result.add( bl ) ;
return new ArrayList<String>() ;
}
} ;
String line = fw.readLine() ;
while (line != null) {
if (inComment) {
data.add( line ) ;
if (line.contains( end )) {
inComment = false ;
data = newBlock.evaluate( data, COMMENT_BLOCK_TAG ) ;
}
} else {
if (line.contains( start )) {
inComment = true ;
data = newBlock.evaluate( data, null ) ;
}
data.add( line ) ;
if (line.contains( end)) {
inComment = false ;
data = newBlock.evaluate( data, COMMENT_BLOCK_TAG ) ;
}
}
line = fw.readLine() ;
}
Block bl = new Block( data ) ;
if (inComment) {
bl.addTag(COMMENT_BLOCK_TAG);
}
result.add( bl ) ;
return result ;
} finally {
fw.close() ;
}
}
}