/*
* Copyright 2015 Nokia Solutions and Networks
* Licensed under the Apache License, Version 2.0,
* see license.txt file for details.
*/
package org.robotframework.ide.eclipse.main.plugin.model;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import org.eclipse.core.runtime.content.IContentDescriber;
import org.rf.ide.core.project.ImportSearchPaths.PathsProvider;
import org.rf.ide.core.testdata.RobotParser;
import org.rf.ide.core.testdata.model.RobotFileOutput;
import org.rf.ide.core.testdata.model.RobotProjectHolder;
import org.robotframework.ide.eclipse.main.plugin.RedPlugin;
import org.robotframework.ide.eclipse.main.plugin.project.ASuiteFileDescriber;
import org.robotframework.ide.eclipse.main.plugin.project.RobotSuiteFileDescriber;
import org.robotframework.ide.eclipse.main.plugin.project.TsvRobotSuiteFileDescriber;
public class RobotSuiteStreamFile extends RobotSuiteFile {
private final String name;
private final InputStream input;
private final boolean readOnly;
public RobotSuiteStreamFile(final String name, final InputStream input, final boolean readOnly) {
super(null, null);
this.name = name;
this.input = input;
this.readOnly = readOnly;
}
@Override
public String getFileExtension() {
return name.contains(".") ? name.substring(name.lastIndexOf('.') + 1) : null;
}
@Override
protected String getContentTypeId() {
final String id = super.getContentTypeId();
if (id != null) {
return id;
}
contentTypeId = null;
if (input != null) {
if ("__init__.robot".equals(name) || "__init__.tsv".equals(name) || "__init__.txt".equals(name)) {
contentTypeId = ASuiteFileDescriber.INIT_FILE_CONTENT_ID;
return contentTypeId;
}
int validationResult;
try {
final String fileExt = getFileExtension();
final ASuiteFileDescriber desc = fileExt.toLowerCase().equals("tsv") ? new TsvRobotSuiteFileDescriber()
: new RobotSuiteFileDescriber();
validationResult = desc.describe(input, null);
if (validationResult == IContentDescriber.VALID) {
contentTypeId = ASuiteFileDescriber.SUITE_FILE_CONTENT_ID;
} else {
contentTypeId = ASuiteFileDescriber.RESOURCE_FILE_CONTENT_ID;
}
} catch (final IOException e) {
// null will be returned
}
}
return contentTypeId;
}
@Override
public List<RobotSuiteFileSection> getSections() {
return getSections(new ParsingStrategy() {
@Override
public RobotFileOutput parse() {
final RobotParser parser = RobotParser.create(
new RobotProjectHolder(RedPlugin.getDefault().getActiveRobotInstallation()),
(PathsProvider) null);
return parser.parseEditorContent("", new File(name));
}
});
}
@Override
protected ParsingStrategy createReparsingStrategy(final String newContent) {
return new ParsingStrategy() {
@Override
public RobotFileOutput parse() {
final RobotParser parser = RobotParser.create(
new RobotProjectHolder(RedPlugin.getDefault().getActiveRobotInstallation()),
(PathsProvider) null);
return parser.parseEditorContent(newContent, new File(name));
}
};
}
@Override
public String getName() {
return name;
}
@Override
public boolean isEditable() {
return !readOnly;
}
@Override
public void refreshOnFileChange() {
// do nothing
}
}