00001
00002
00003
00004
00005
00006
00007 #include "String.h"
00008 #include <vector>
00009 #include <algorithm>
00010 #include <sys/types.h>
00011 #include <dirent.h>
00012 #include <stdio.h>
00013
00014 #include "BinaryFileDatumReader.h"
00015 #include "Destroyer.h"
00016 #include "FileProducerFactory.h"
00017 #include "FileObjectReader.h"
00018 #include "FileUtil.h"
00019 #include "ObjectProducer.h"
00020 #include "SplitFileReader.h"
00021 #include "SplitMergePairFileReader.h"
00022 #include "TextFileDatumReader.h"
00023
00024
00025 FileProducerFactory * FileProducerFactory::s_instance = 0;
00026 DestroyerDeclare(FileProducerFactory)
00027
00028
00029 ObjectProducer * FileProducerFactory::createProducer(char * dir,
00030 char * name,
00031 bool isBinary,
00032 bool isMerge,
00033 bool isLarge,
00034 double maxSD)
00035 {
00036 ObjectProducer * prod = 0;
00037 if (dir == 0 || strcmp(dir, "0") == 0)
00038 {
00039 prod = createProducer(name, isBinary, isLarge, false, 1, maxSD);
00040 }
00041 else
00042 {
00043 prod = createSplitProducer(dir, name, isBinary, isMerge, isLarge, false, 1, maxSD);
00044 }
00045
00046 return prod;
00047 }
00048
00049 ObjectProducer * FileProducerFactory::createProducer(char * dir,
00050 char * name,
00051 bool isBinary,
00052 bool isMerge,
00053 bool isLarge,
00054 double orthoSD,
00055 double decSD)
00056 {
00057 ObjectProducer * prod = 0;
00058 if (dir == 0 || strcmp(dir, "0") == 0)
00059 {
00060 prod = createProducer(name, isBinary, false, isLarge, 2, 0.0, orthoSD, decSD);
00061 }
00062 else
00063 {
00064 prod = createSplitProducer(dir, name, isBinary, isMerge, isLarge, false, 2, 0.0, orthoSD, decSD);
00065 }
00066
00067 return prod;
00068 }
00069
00070 ObjectProducer * FileProducerFactory::createProducer(char * dir,
00071 char * name,
00072 bool isBinary,
00073 bool isMerge,
00074 bool isLarge,
00075 bool setMaxSDs)
00076 {
00077 ObjectProducer * prod = 0;
00078 if (dir == 0 || strcmp(dir, "0") == 0)
00079 {
00080 prod = createProducer(name, isBinary, isLarge, setMaxSDs);
00081 }
00082 else
00083 {
00084 prod = createSplitProducer(dir, name, isBinary, isMerge, isLarge, setMaxSDs);
00085 }
00086
00087 return prod;
00088 }
00089
00090 ObjectProducer * FileProducerFactory::createSplitProducer(char * dir,
00091 char * prefix,
00092 bool isBinary,
00093 bool isMerge,
00094 bool isLarge,
00095 bool setMaxSDs,
00096 unsigned short numSDs,
00097 double maxSD,
00098 double orthoSD,
00099 double decSD)
00100 {
00101 ObjectProducer * pp = 0;
00102
00103 std::vector<String> fileNames;
00104 FileUtil::instance()->readDir(fileNames, dir, prefix);
00105
00106 FileObjectReader * fileObj =
00107 (isBinary) ? (FileObjectReader *) new BinaryFileDatumReader()
00108 : (FileObjectReader *) new TextFileDatumReader();
00109 ObjectReader * objReader = (isMerge) ? new SplitMergePairFileReader(fileObj, fileNames, isLarge)
00110 : new SplitFileReader(fileObj, fileNames, isLarge);
00111
00112 if (numSDs == 0)
00113 pp = new ObjectProducer(objReader, setMaxSDs);
00114 else if (numSDs == 1)
00115 pp = new ObjectProducer(objReader, maxSD);
00116 else
00117 pp = new ObjectProducer(objReader, orthoSD, decSD);
00118
00119 return pp;
00120 }
00121
00122 ObjectProducer * FileProducerFactory::createProducer(char * name,
00123 bool isBinary,
00124 bool isLarge,
00125 bool setMaxSDs,
00126 unsigned short numSDs,
00127 double maxSD,
00128 double orthoSD,
00129 double decSD)
00130 {
00131 ObjectProducer * pp = 0;
00132
00133 FileObjectReader * fileObj =
00134 (isBinary) ? (FileObjectReader *) new BinaryFileDatumReader()
00135 : (FileObjectReader *) new TextFileDatumReader();
00136 ObjectReader * objReader = new FileReader(fileObj, name, isLarge);
00137
00138 if (numSDs == 0)
00139 pp = new ObjectProducer(objReader, setMaxSDs);
00140 else if (numSDs == 1)
00141 pp = new ObjectProducer(objReader, maxSD);
00142 else
00143 pp = new ObjectProducer(objReader, orthoSD, decSD);
00144
00145 return pp;
00146 }