package LinGUIne.model; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.IOException; import java.lang.reflect.InvocationTargetException; import java.nio.charset.Charset; import java.nio.file.Files; import LinGUIne.utilities.ClassUtils; /** * Single Result type for all Visualizations which should be saved. Supports all * contents objects which extend VisualResultContents. * * @author Kyle Mullins */ public class VisualResult extends Result { private VisualResultContents contents; /** * Creates a new VisualResult for the given File in the workspace. */ public VisualResult(File file) { super(file); } @Override public IProjectDataContents getContents() { if(contents == null){ try(BufferedReader reader = Files.newBufferedReader( resultFile.toPath(), Charset.defaultCharset())){ VisualResultContents newContents = null; if(reader.ready()){ String className = reader.readLine(); //Read the VisualResultContents class name and attempt to //create an instance of it try { Class<?> clazz = ClassUtils.deserializeClassName(className); newContents = (VisualResultContents)clazz. getDeclaredConstructor().newInstance(); } catch(InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException | NoSuchMethodException | SecurityException | ClassNotFoundException e) { e.printStackTrace(); return null; } } if(newContents != null && newContents.parse(reader)){ contents = newContents; } else{ return null; } } catch(IOException e){ return null; } } return contents.copy(); } @Override public boolean updateContents(IProjectDataContents newContents) { if(newContents == null){ contents = null; } else if(newContents instanceof VisualResultContents){ VisualResultContents newVisualContents = (VisualResultContents)newContents; if(contents == null || contents.compareTo(newVisualContents) != 0){ try(BufferedWriter writer = Files.newBufferedWriter( resultFile.toPath(), Charset.defaultCharset())){ //Write the VisualResultContents class name as the first //line of the file writer.write(ClassUtils.serializeClassName( newVisualContents.getClass()) + "\n"); if(!newVisualContents.compose(writer)){ return false; } } catch(IOException e) { return false; } } contents = (VisualResultContents)newVisualContents.copy(); return true; } return false; } }