package com.abiquo.appliancemanager; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.net.URI; import java.util.LinkedList; import java.util.List; import java.util.Set; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.abiquo.appliancemanager.exceptions.InvalidRepositorySpace; import com.abiquo.appliancemanager.xml.OVFSerializer; import com.abiquo.ovfindex.RepositorySpace; public class OVFIndexPersist { private final static Logger log = LoggerFactory.getLogger(OVFIndexPersist.class); /*** * Save to an XML document file the content of the master RepositorySpace, also store the * attached URI form all its RepositorySpaces. TODO param * * @see repositoryPath, where is save. TODO throws exception */ public static void saveRepository(RepositorySpace repository, URI repositoryURI, Set<URI> attachedRepositories) { File fileRepo = new File(repositoryURI); File fileUris = new File(repositoryURI + ".attachedURI"); FileOutputStream writeRepo; BufferedWriter writeUri; try { writeRepo = new FileOutputStream(fileRepo); OVFSerializer.getInstance().writeXML(repository, writeRepo); writeRepo.close(); } catch (Exception e) // FileNotFoundException XMLException IOException { // TODO throw ??? final String msg = "The ovfindex.xml can not be saved"; log.error(msg); } try { writeUri = new BufferedWriter(new FileWriter(fileUris)); for (URI uri : attachedRepositories) { try { writeUri.write(uri.toASCIIString()); writeUri.newLine(); } catch (IOException e) { final String msg = "Repository " + uri.toASCIIString() + " can not be persisted"; log.error(msg); } } writeUri.close(); } catch (IOException e1) // can create w { // TODO throw ??? final String msg = "The attachedURI file can not be created"; log.debug(msg); } } /** * Load form an XML document file the content of the master RepositorySpace. Also update all the * attached RepositorySpaces. * * @todo why is first reading the resume and then update ? .... simply update ? * @todo check the read repositoryURI */ public static OVFIndex restoreRepository(boolean isUpdateFormURIs, URI repositoryURI) throws InvalidRepositorySpace { OVFIndex index; RepositorySpace repository; File fileRepo = new File(repositoryURI); File fileUris = new File(repositoryURI + ".attachedURI"); FileInputStream readRepo; BufferedReader readUri; try { index = new OVFIndex(repositoryURI); readRepo = new FileInputStream(fileRepo); repository = OVFSerializer.getInstance().readXMLRepositorySpace(readRepo); index.setRepositorySpace(repository); } catch (Exception e) // FileNotFoundException XMLException { final String msg = "The repository can not be restored form " + repositoryURI; throw new InvalidRepositorySpace(msg, e); } if (isUpdateFormURIs) { List<URI> uris = new LinkedList<URI>(); String line; URI repoURI; try { readUri = new BufferedReader(new FileReader(fileUris)); line = readUri.readLine(); while (line != null) { repoURI = new URI(line); uris.add(repoURI); line = readUri.readLine(); } } catch (Exception e) // IOException FileNotFoundException { final String msg = "The attached repository URIs file can not be restored form " + repositoryURI + ".attachedURI"; log.error(msg); // TODO throws ? } for (URI uri : uris) { index.updateIndex(uri); } }// update from URI return index; } }