/*
 * Copyright (C) 2009 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.exoplatform.services.jcr.ext.hierarchy.impl;

import org.exoplatform.services.jcr.access.PermissionType;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * Created by The eXo Platform SAS Author : Dang Van Minh minh.dang@exoplatform.com Nov 15, 2007
 * 2:06:42 PM
 */
public class HierarchyConfig
{

   private String repository;

   private List<String> workspaces = new ArrayList<String>(5);

   private List<JcrPath> jcrPaths = new ArrayList<JcrPath>(5);

   private List<JcrLink> jcrLinks = new ArrayList<JcrLink>();

   public String getRepository()
   {
      return repository;
   }

   public void setRepository(String rp)
   {
      repository = rp;
   }

   public List<JcrPath> getJcrPaths()
   {
      return jcrPaths;
   }

   public void setJcrPaths(List<JcrPath> s)
   {
      this.jcrPaths = s;
   }

   public List<JcrLink> getJcrLinks() {
    return jcrLinks;
   }

   public void setJcrLinks(List<JcrLink> jcrLinks) {
    this.jcrLinks = jcrLinks;
   }

   public List<String> getWorkspaces()
   {
      return this.workspaces;
   }

   public void setWorksapces(List<String> list)
   {
      this.workspaces = list;
   }

   static public class JcrPath
   {
      private String alias;

      private String path;

      private String nodeType;

      private List<String> mixinTypes = new ArrayList<String>();

      private List<Permission> permissions = new ArrayList<Permission>(4);

      public String getAlias()
      {
         return alias;
      }

      public void setAlias(String alias)
      {
         this.alias = alias;
      }

      public String getPath()
      {
         return path;
      }

      public void setPath(String path)
      {
         this.path = path;
      }

      public List<Permission> getPermissions()
      {
         return this.permissions;
      }

      public Map<String, String[]> getPermissions(String identityToAdd)
      {
         Map<String, String[]> permissionsMap = new HashMap<String, String[]>();
         if (identityToAdd != null && !identityToAdd.isEmpty())
         {
            permissionsMap.put(identityToAdd, PermissionType.ALL);            
         }
         for (Permission permission : permissions)
         {
            List<String> lPermissions = new ArrayList<String>(4);
            if ("true".equalsIgnoreCase(permission.getRead()))
               lPermissions.add(PermissionType.READ);
            if ("true".equalsIgnoreCase(permission.getAddNode()))
               lPermissions.add(PermissionType.ADD_NODE);
            if ("true".equalsIgnoreCase(permission.getSetProperty()))
               lPermissions.add(PermissionType.SET_PROPERTY);
            if ("true".equalsIgnoreCase(permission.getRemove()))
               lPermissions.add(PermissionType.REMOVE);
            permissionsMap.put(permission.getIdentity(),
               (String[])lPermissions.toArray(new String[lPermissions.size()]));
         }
         return permissionsMap;
      }
      
      public void setPermissions(List<Permission> list)
      {
         this.permissions = list;
      }

      public String getNodeType()
      {
         return this.nodeType;
      }

      public void setNodeType(String nodetype)
      {
         this.nodeType = nodetype;
      }

      public List<String> getMixinTypes()
      {
         return mixinTypes;
      }

      public void setMixinTypes(List<String> mixinTypes)
      {
         this.mixinTypes = mixinTypes;
      }
   }

  static public class JcrLink {
    private String targetPath;
  
    private String sourcePath;
  
    public String getTargetPath() {
      return targetPath;
    }
  
    public void setTargetPath(String targetPath) {
      this.targetPath = targetPath;
    }
  
    public String getSourcePath() {
      return sourcePath;
    }
  
    public void setSourcePath(String sourcePath) {
      this.sourcePath = sourcePath;
    }
  }

   static public class Permission
   {
      private String identity;

      private String read;

      private String addNode;

      private String setProperty;

      private String remove;

      public String getIdentity()
      {
         return identity;
      }

      public void setIdentity(String identity)
      {
         this.identity = identity;
      }

      public String getAddNode()
      {
         return addNode;
      }

      public void setAddNode(String addNode)
      {
         this.addNode = addNode;
      }

      public String getRead()
      {
         return read;
      }

      public void setRead(String read)
      {
         this.read = read;
      }

      public String getRemove()
      {
         return remove;
      }

      public void setRemove(String remove)
      {
         this.remove = remove;
      }

      public String getSetProperty()
      {
         return setProperty;
      }

      public void setSetProperty(String setProperty)
      {
         this.setProperty = setProperty;
      }
   }
}
