package gov.nih.ncgc.bard.resourcemgr.util;
import gov.nih.ncgc.bard.resourcemgr.BardExternalResource;
import gov.nih.ncgc.bard.resourcemgr.BardResourceService;
import gov.nih.ncgc.bard.resourcemgr.BardResourceService.CompressionTypes;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
public class BardServiceParser {
public BardServiceParser() { }
public ArrayList <BardResourceService> parseServices(String serviceFilePath) {
ArrayList <BardResourceService> services = new ArrayList <BardResourceService>();
try {
BufferedReader br = new BufferedReader(new FileReader(serviceFilePath));
String line = "";
String buffer = "";
String lineDelim = "///";
BardResourceService service;
while((line = br.readLine())!= null) {
if(line.contains(lineDelim)) {
service = parseService(buffer);
services.add(service);
buffer = "";
} else if (!line.startsWith("#") && line.trim().length() > 0) {
buffer += line+"|";
}
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return services;
}
private BardResourceService parseService(String data) {
BardResourceService service = new BardResourceService();
String [] toks = data.split("\\|");
String [] keyVal;
for(String tok : toks) {
keyVal = tok.split("\t");
System.out.println("keyval length="+keyVal.length);
if(keyVal.length == 2) {
if(keyVal[0].equals(BardResourceService.ServiceFields.SERVICE_KEY.name())) {
service.setServiceKey(keyVal[1].trim());
} else if(keyVal[0].equals(BardResourceService.ServiceFields.SERVICE_NAME.name())) {
service.setServiceName(keyVal[1].trim());
} else if(keyVal[0].equals(BardResourceService.ServiceFields.SERVICE_DESCR.name())) {
service.setServiceDescr(keyVal[1].trim());
} else if(keyVal[0].equals(BardResourceService.ServiceFields.EXT_RESOURCE.name())) {
System.out.println("Hey, processing ext resource");
service.addExtResource(processExternalResourceSpec(keyVal[1].trim()));
} else if(keyVal[0].equals(BardResourceService.ServiceFields.LOCAL_RESOURCE_PATH.name())) {
service.setLocalResPath(keyVal[1].trim());
} else if(keyVal[0].equals(BardResourceService.ServiceFields.LOADER_CLASS.name())) {
service.setLoaderClass(keyVal[1].trim());
} else if(keyVal[0].equals(BardResourceService.ServiceFields.DB_URL.name())) {
service.setDbURL(keyVal[1].trim());
}
}
}
return service;
}
private BardExternalResource processExternalResourceSpec(String resourceSpec) {
BardExternalResource resource =new BardExternalResource();
// fixed arrangement
//[rsc_key][rsc_protocol(FTP|HTTP)][file_name][file_comression(NONE|GZIP|ZIP|TAR_GZIP|TAR_ZIP)][rsc_uri]
String [] toks = resourceSpec.split("]");
if(toks.length < 8) {
System.out.println("External resource has fewer than 8 tokens");
return null;
}
int itemCnt = 0;
for(String tok : toks) {
tok = tok.replace("[", "").trim();
// ass|u|me the fields are in the proper order.
if(itemCnt == 0) {
resource.setResourceKey(tok);
} else if (itemCnt == 1) {
if(tok.equals(BardResourceService.ResourceProtocolTypes.FTP.name())) {
resource.setResourceProtocolType(BardResourceService.ResourceProtocolTypes.FTP.ordinal());
} else {
resource.setResourceProtocolType(BardResourceService.ResourceProtocolTypes.HTTP.ordinal());
}
} else if (itemCnt == 2) {
resource.setFileName(tok);
} else if (itemCnt == 3) {
CompressionTypes [] compType = BardResourceService.CompressionTypes.values();
for(int i = 0; i < compType.length; i++) {
if(compType[i].name().equals(tok)) {
resource.setCompressionType(compType[i].ordinal());
}
}
} else if (itemCnt == 4) {
resource.setResourceServer(tok);
} else if (itemCnt == 5) {
resource.setResourcePath(tok);
} else if (itemCnt == 6) {
resource.setResourceUserName(tok);
} else if (itemCnt == 7) {
resource.setResourcePassword(tok);
}
itemCnt++;
}
return resource;
}
}