package com.telefonica.euro_iaas.placement.helper; import java.beans.XMLDecoder; import java.beans.XMLEncoder; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStreamReader; import java.util.HashSet; import java.util.PropertyResourceBundle; import java.util.Set; import java.util.logging.Level; import java.util.logging.Logger; import javax.activation.UnsupportedDataTypeException; import com.telefonica.euro_iaas.placement.model.provider.CloudProvider; import com.telefonica.euro_iaas.placement.model.provider.VEE; public class XmlCloudProviderHelper { /** * */ private final static Logger log=Logger.getLogger(XmlCloudProviderHelper.class.getName()); /** * Nombre de fichero de CloudProviders por defecto. */ private String cloudProvidersFileName="/tmp/mf.xml"; /** * */ private static XmlCloudProviderHelper xmlHelper=null; /** * Constructor por defecto */ private XmlCloudProviderHelper() { try { PropertyResourceBundle prb=new PropertyResourceBundle( new InputStreamReader(getClass().getClassLoader().getResourceAsStream("placement.properties"))); cloudProvidersFileName=prb.getString("placement.context.vdcFileName"); } catch (Exception e) { log.log(Level.WARNING,"Usando configuracion por defecto:{0} por {1}", new String [] {cloudProvidersFileName, e.getMessage()}); } } /** * * @return */ public static XmlCloudProviderHelper getInstance() { if (xmlHelper==null) { xmlHelper=new XmlCloudProviderHelper(); log.log(Level.INFO, "Fichero de configuracion: {0}", xmlHelper.cloudProvidersFileName); } return xmlHelper; } /** * Para leer un fichero codificado de CloudProviders y obtener una lista. * @return * @throws FileNotFoundException * @throws UnsupportedDataTypeException */ public Set<CloudProvider> decode() throws FileNotFoundException, UnsupportedDataTypeException { HashSet<CloudProvider> set=new HashSet<CloudProvider>(); XMLDecoder decoder=new XMLDecoder(new BufferedInputStream( new FileInputStream(cloudProvidersFileName))); CloudProvider cp=null; VEE vee; try { while (true) { Object o = decoder.readObject(); if (o instanceof CloudProvider) { cp=(CloudProvider)o; cp.setVees(new HashSet<VEE>()); set.add(cp); } else if (o instanceof VEE) { vee=(VEE)o; vee.setCloudProvider(cp); cp.getVees().add(vee); } else { throw new UnsupportedDataTypeException("Unexpected " + o.getClass().getName() + " found"); } } } catch (ArrayIndexOutOfBoundsException aiob) {} finally { decoder.close(); } return set; } /** * Para Codificar un conjunto de CloudProviders * * @param cps * @throws FileNotFoundException */ public void encode(Set<CloudProvider> cps) throws FileNotFoundException { XMLEncoder encoder=new XMLEncoder( new BufferedOutputStream( new FileOutputStream(cloudProvidersFileName))); for (CloudProvider cp : cps) { encoder.writeObject(cp); Set<VEE> veeSet=cp.getVees(); for (VEE vee : veeSet) { encoder.writeObject(vee); } } encoder.close(); } }