/**
 * Copyright (C) 2010 eXo Platform SAS.
 *
 * This is free software; you can redistribute it and/or modify it
 * under the terms of the GNU Lesser General Public License as
 * published by the Free Software Foundation; either version 2.1 of
 * the License, or (at your option) any later version.
 *
 * This software is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this software; if not, write to the Free
 * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
 * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
 */

package org.xcmis.sp.inmemory.tck;

import org.xcmis.spi.CmisRegistry;
import org.xcmis.spi.CmisRegistryFactory;
import org.xcmis.spi.RenditionManager;
import org.xcmis.spi.utils.Logger;

import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.Properties;

/**
 * @author <a href="mailto:andrew00x@gmail.com">Andrey Parfonov</a>
 * @version $Id: InmemoryCmisRegistryFactory.java 1500 2010-08-05 09:00:58Z
 *          andrew00x $
 */
public class InmemoryCmisRegistryFactory implements CmisRegistryFactory
{

   private static final Logger LOG = Logger.getLogger(InmemoryCmisRegistryFactory.class);

   private CmisRegistry reg = new CmisRegistry();

   public InmemoryCmisRegistryFactory()
   {
      ClassLoader cl = null;
      try
      {
         cl = Thread.currentThread().getContextClassLoader();
      }
      catch (Exception e)
      {
         LOG.error("Unable get context class loader. " + e.getMessage());
      }

      boolean fconfig = false;
      if (cl != null)
      {
         InputStream in = cl.getResourceAsStream("xcmis-storage.properties");
         Properties properties = new Properties();
         if (in != null)
         {
            try
            {
               properties.load(new BufferedInputStream(in));
               fconfig = true;
            }
            catch (IOException ioe)
            {
               LOG.error(ioe.getMessage(), ioe);
            }
         }

         String renditionProvider = (String)properties.get("org.xcmis.storage.renditionProvider");
         if (renditionProvider != null)
         {
            RenditionManager renditionManager = RenditionManager.getInstance();
            renditionManager.addRenditionProviders(Arrays.asList(renditionProvider.split(",")));
         }

         String sids = (String)properties.get("org.xcmis.storage.id");
         if (sids != null)
         {
            for (String s : sids.split(","))
            {
               String id = s.trim();
               if (id.length() > 0)
               {
                  String name = (String)properties.get("org.xcmis.storage." + id + ".name");
                  String description = (String)properties.get("org.xcmis.storage." + id + ".description");
                  String sMaxItemsNum = (String)properties.get("org.xcmis.storage." + id + ".maxItemsNum");
                  long maxItemsNum = -1;
                  if (sMaxItemsNum != null && sMaxItemsNum.length() > 0)
                  {
                     try
                     {
                        maxItemsNum = Long.parseLong(sMaxItemsNum);
                     }
                     catch (NumberFormatException ne)
                     {
                        LOG.error("Unable convert '" + sMaxItemsNum + "' to long. ");
                     }
                  }
                  String sMaxMem = (String)properties.get("org.xcmis.storage." + id + ".maxMem");
                  long maxMem = -1;
                  if (sMaxMem != null && sMaxMem.length() > 0)
                  {
                     try
                     {
                        maxMem = Long.parseLong(sMaxMem);
                     }
                     catch (NumberFormatException ne)
                     {
                        LOG.error("Unable convert '" + sMaxMem + "' to long. ");
                     }
                  }
                  reg.addStorage(new org.xcmis.sp.inmemory.StorageProviderImpl(id, //
                     name != null && name.length() > 0 ? name : id, //
                     description != null && description.length() > 0 ? description : id, //
                     maxMem, //
                     maxItemsNum));
                  LOG.info("Register storage " + id);
               }
            }
         }
      }
      if (!fconfig)
      {
         // Default
         reg.addStorage(new org.xcmis.sp.inmemory.StorageProviderImpl("cmis1", "cmis1", "", -1L, -1L));
      }
   }

   public CmisRegistry getRegistry()
   {
      return reg;
   }

}
