/*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.f1x.log.file;
import org.f1x.api.session.SessionID;
import org.f1x.log.MessageLog;
import org.f1x.log.SimpleLogFormatter;
import java.io.File;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
/**
* Factory for {@link RollingFileMessageLog}.
*/
public class RollingFileMessageLogFactory extends PeriodicFlushingMessageLogFactory {
private int maxNumberOfFiles;
private long bytesPerFile;
public RollingFileMessageLogFactory (File logDir, int maxNumberOfFiles, long bytesPerFile) {
super(logDir, new RollingFileNameGenerator(), new BufferedOutputStreamFactory(DEFAULT_FILE_BUFFER_SIZE, false));
this.maxNumberOfFiles = maxNumberOfFiles;
this.bytesPerFile = bytesPerFile;
}
@Override
public MessageLog create(SessionID sessionID) {
if (logFormatter == null)
logFormatter = new SimpleLogFormatter(timeSource);
File [] files = new File[maxNumberOfFiles];
for(int i=0; i < maxNumberOfFiles; i++)
files[i] = new File(logDir, fileNameGenerator.getLogFile(sessionID));
RollingFileMessageLog result = new RollingFileMessageLog(files, streamFactory, logFormatter, bytesPerFile);
result.start(sessionID, timeSource, flushPeriod);
return result;
}
/** @return Logger will roll to the next file once current log file size exceeds this limit (in bytes). */
public long getBytesPerFile() {
return bytesPerFile;
}
public int getMaxNumberOfFiles() {
return maxNumberOfFiles;
}
/** @param bytesPerFile Logger will roll to the next file once current log file size exceeds this limit (in bytes). */
public void setBytesPerFile(long bytesPerFile) {
this.bytesPerFile = bytesPerFile;
}
public void setMaxNumberOfFiles(int maxNumberOfFiles) {
this.maxNumberOfFiles = maxNumberOfFiles;
}
public static class RollingFileNameGenerator implements FileNameGenerator {
private int fileCounter;
@Override
public String getLogFile(SessionID sessionID) {
StringBuilder sb = new StringBuilder();
sb.append (sessionID.getSenderCompId().toString());
sb.append ('-');
sb.append (sessionID.getTargetCompId().toString());
sb.append('.');
sb.append(++fileCounter);
sb.append(".log");
try {
return URLEncoder.encode(sb.toString(), "US-ASCII");
} catch (UnsupportedEncodingException e) {
throw new RuntimeException(e);
}
}
}
}