Package com.knowgate.acl

Source Code of com.knowgate.acl.ACLDomain

/*
  Copyright (C) 2003  Know Gate S.L. All rights reserved.
                      C/Oña, 107 1ยบ2 28050 Madrid (Spain)

  Redistribution and use in source and binary forms, with or without
  modification, are permitted provided that the following conditions
  are met:

  1. Redistributions of source code must retain the above copyright
     notice, this list of conditions and the following disclaimer.

  2. The end-user documentation included with the redistribution,
     if any, must include the following acknowledgment:
     "This product includes software parts from hipergate
     (http://www.hipergate.org/)."
     Alternately, this acknowledgment may appear in the software itself,
     if and wherever such third-party acknowledgments normally appear.

  3. The name hipergate must not be used to endorse or promote products
     derived from this software without prior written permission.
     Products derived from this software may not be called hipergate,
     nor may hipergate appear in their name, without prior written
     permission.

  This library 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.

  You should have received a copy of hipergate License with this code;
  if not, visit http://www.hipergate.org or mail to info@hipergate.org
*/

package com.knowgate.acl;

import java.io.IOException;

import java.sql.Connection;
import java.sql.SQLException;
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.Statement;
import java.sql.ResultSet;

import com.knowgate.debug.DebugFile;
import com.knowgate.jdc.JDCConnection;
import com.knowgate.dataobjs.DB;
import com.knowgate.dataobjs.DBBind;
import com.knowgate.dataobjs.DBPersist;
import com.knowgate.dataobjs.DBSubset;

import com.knowgate.workareas.WorkArea;
import com.knowgate.hipergate.Category;

/**
*
* <p>Security Domain Management Functions</p>
* @author Sergio Montoro Ten
* @version 2.1
*/

public final class ACLDomain extends DBPersist {

  /**
   * Default constructor
   */
  public ACLDomain() {
    super(DB.k_domains, "ACLDomain");
  }

  // ----------------------------------------------------------

  /**
   * <p>Constructs ACLDomain and load attributes from k_domains table</p>
   * @param oConn Database Connection
   * @param iIdDomain Domain Identifier (id_domain field at k_domains table)
   * @throws SQLException
   */
  public ACLDomain(JDCConnection oConn, int iIdDomain) throws SQLException {
    super(DB.k_domains, "ACLDomain");

    Object aDom[] = { new Integer(iIdDomain) };

    load (oConn,aDom);
  }

  // ----------------------------------------------------------

  /**
   * @see DBPersist#store(JDCConnection)
   */
  public boolean store(JDCConnection oConn) throws SQLException {

    if (!AllVals.containsKey(DB.id_domain)) {
      put(DB.id_domain, DBBind.nextVal(oConn, "seq_" + DB.k_domains));
    }

    return super.store(oConn);
  } // store

  // ----------------------------------------------------------

  /**
   * @see ACLDomain#delete(JDCConnection,int)
   */
  public boolean delete(JDCConnection oConn) throws SQLException {
    try {
      return ACLDomain.delete(oConn, getInt(DB.id_domain));
    } catch (IOException ioe) {
      throw new SQLException ("IOException " + ioe.getMessage());
    }
  }

  /**
   * <p>Fully delete a domain and ALL its associated data</p>
   * <p>This method will perform the following actions<br>
   * 1. Delete WorkAreas from this domain<br>
   * 2. Delete categories owned by users of this domain<br>
   * 3. Delete Security groups from domain<br>
   * 4. Delete domain users<br>
   * @param oConn Database Connection
   * @param iDomainId Domain Identifier
   * @return
   * @throws SQLException
   * @throws IOException
   * @see com.knowgate.acl.ACLUser#delete(JDCConnection,String)
   * @see com.knowgate.hipergate.Category#delete(JDCConnection,String)
   * @see com.knowgate.workareas.WorkArea#delete(JDCConnection,String)
   */
  public static boolean delete(JDCConnection oConn, int iDomainId) throws SQLException,IOException {
    PreparedStatement oStmt;
    DBSubset oWrks, oCats, oGrps, oUsrs;
    int iWrks, iCats, iGrps, iUsrs;
    int iAffected;

    if (DebugFile.trace) {
      DebugFile.writeln("Begin ACLDomain.delete([Connection], " + String.valueOf(iDomainId) + ")");
      DebugFile.incIdent();
    }

    // Delete workareas associated with domain
    if (DBBind.exists(oConn, DB.k_workareas,"U")) {
      oWrks = new DBSubset(DB.k_workareas, DB.gu_workarea, DB.id_domain + "=" + String.valueOf(iDomainId), 8);
      iWrks = oWrks.load(oConn);

      for (int w=0; w<iWrks; w++)
        WorkArea.delete(oConn, oWrks.getString(0,w));

      oWrks = null;
    } // fi(exists(DB.k_workareas))

  // Delete black lists from this domain
    if (DBBind.exists(oConn, DB.k_global_black_list, "U")) {
      oStmt = oConn.prepareStatement("DELETE FROM " + DB.k_global_black_list + " WHERE " + DB.id_domain + "=?");
      oStmt.setInt(1, iDomainId);
      oStmt.executeUpdate();
      oStmt.close();
    }
 
    // Delete thesauri entries from this domain
    if (DBBind.exists(oConn, DB.k_thesauri, "U")) {

      // Delete synonyms first
      if (DebugFile.trace)
        DebugFile.writeln("Connection.prepareStatement(DELETE FROM " + DB.k_thesauri + " WHERE " + DB.bo_mainterm + "=0 AND " + DB.gu_rootterm + " IN (SELECT " + DB.gu_rootterm + " FROM " + DB.k_thesauri_root + " WHERE " + DB.id_domain + "=" + String.valueOf(iDomainId) + "))");

      oStmt = oConn.prepareStatement("DELETE FROM " + DB.k_thesauri + " WHERE " + DB.bo_mainterm + "=0 AND " + DB.gu_rootterm + " IN (SELECT " + DB.gu_rootterm + " FROM " + DB.k_thesauri_root + " WHERE " + DB.id_domain + "=?)");
      oStmt.setInt(1, iDomainId);
      oStmt.executeUpdate();
      oStmt.close();

      // Then delete rest of main terms
      if (DebugFile.trace)
        DebugFile.writeln("Connection.prepareStatement(DELETE FROM " + DB.k_thesauri + " WHERE " + DB.gu_rootterm + " IN (SELECT " + DB.gu_rootterm + " FROM " + DB.k_thesauri_root + " WHERE " + DB.id_domain + "=" + String.valueOf(iDomainId) + "))");

      oStmt = oConn.prepareStatement("DELETE FROM " + DB.k_thesauri + " WHERE " + DB.gu_rootterm + " IN (SELECT " + DB.gu_rootterm + " FROM " + DB.k_thesauri_root + " WHERE " + DB.id_domain + "=?)");
      oStmt.setInt(1, iDomainId);
      oStmt.executeUpdate();
      oStmt.close();

      // Delete root terms
      if (DebugFile.trace)
        DebugFile.writeln("Connection.prepareStatement(DELETE FROM " + DB.k_thesauri_root + " WHERE " + DB.id_domain + "=?)");

      oStmt = oConn.prepareStatement("DELETE FROM " + DB.k_thesauri_root + " WHERE " + DB.id_domain + "=?");
      oStmt.setInt(1, iDomainId);
      oStmt.executeUpdate();
      oStmt.close();
    }

    // Delete all categories owned by users of this domain
    if (DBBind.exists(oConn, DB.k_categories,"U")) {

      oCats = new DBSubset(DB.k_categories + " c," + DB.k_users + " u" , "c." + DB.gu_category,
                           "u."+ DB.id_domain + "=" + String.valueOf(iDomainId) + " AND c." + DB.gu_owner + "=u." + DB.gu_user, 8);

      iCats = oCats.load(oConn);

      for (int c=0; c<iCats; c++)
        Category.delete(oConn, oCats.getString(0,c));

      oCats = null;
    } // fi(exists(DB.k_categories))

  // New for v4.0, delete events
    if (DBBind.exists(oConn, DB.k_events, "U")) {
      if (DebugFile.trace)
        DebugFile.writeln("Connection.prepareStatement(DELETE FROM " + DB.k_events + " WHERE " + DB.id_domain + "="+String.valueOf(iDomainId)+")");
      oStmt = oConn.prepareStatement("DELETE FROM " + DB.k_events + " WHERE " + DB.id_domain + "=?");
      oStmt.setInt(1, iDomainId);
      oStmt.executeUpdate();
      oStmt.close();     
    }
     
    // Prevent foreign key violations on deleting administrator user and groups
    oStmt = oConn.prepareStatement("UPDATE " + DB.k_domains + " SET " + DB.gu_owner + "=NULL," + DB.gu_admins + "=NULL WHERE " + DB.id_domain + "=?");
    oStmt.setInt(1, iDomainId);
    oStmt.executeUpdate();
    oStmt.close();

    // Delete security groups
    if (DBBind.exists(oConn, DB.k_acl_groups,"U")) {
      oGrps = new DBSubset(DB.k_acl_groups, DB.gu_acl_group, DB.id_domain + "=" + String.valueOf(iDomainId), 8);
      iGrps = oGrps.load(oConn);

      for (int g=0; g<iGrps; g++)
        ACLGroup.delete(oConn, oGrps.getString(0,g));

      oGrps = null;
    } // fi(exists(DB.k_acl_groups))

    // Delete user
    if (DBBind.exists(oConn, DB.k_users,"U")) {

      oUsrs = new DBSubset(DB.k_users, DB.gu_user, DB.id_domain + "=" + String.valueOf(iDomainId), 8);
      iUsrs = oUsrs.load(oConn);

      for (int g=0; g<iUsrs; g++)
        ACLUser.delete(oConn, oUsrs.getString(0,g));

      oUsrs = null;
    } // fi(exists(DB.k_users))

    if (DebugFile.trace)
      DebugFile.writeln("Connection.prepareStatement(DELETE FROM " + DB.k_domains + " WHERE " + DB.id_domain + "=" + String.valueOf(iDomainId));

    oStmt = oConn.prepareStatement("DELETE FROM " + DB.k_domains + " WHERE " + DB.id_domain + "=?");
    oStmt.setInt(1, iDomainId);
    iAffected = oStmt.executeUpdate();
    oStmt.close();
    oStmt = null;

    if (DebugFile.trace) {
      DebugFile.decIdent();
      DebugFile.writeln("End ACLDomain.delete() : " + String.valueOf(iAffected>0 ? true : false));
    }

    return iAffected>0 ? true : false;
  } // delete()

  // ----------------------------------------------------------

  /**
   * Get Domain to which a given WorkArea belongs
   * @param oConn JDCConnection
   * @param sWorkAreaId String WorkArea GUID
   * @return Integer Domain Id. or <b>null</b> if no WorkArea with such GUID was found
   * @throws SQLException
   */
  public static Integer forWorkArea(Connection oConn, String sWorkAreaId)
      throws SQLException {

    Integer iDom;
    PreparedStatement oStmt = oConn.prepareStatement("SELECT "+DB.id_domain+" FROM "+DB.k_workareas+" WHERE "+DB.gu_workarea+"=?",
                                                     ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
    oStmt.setString(1, sWorkAreaId);
    ResultSet oRSet = oStmt.executeQuery();
    if (oRSet.next())
      iDom = new Integer(oRSet.getObject(1).toString());
    else
      iDom = null;
    oRSet.close();
    oStmt.close();
    return iDom;
  } // forWorkArea

  // ----------------------------------------------------------

  /**
   * Get Domain to which a given WorkArea belongs
   * @param oConn JDCConnection
   * @param sWorkAreaId String WorkArea GUID
   * @return Integer Domain Id. or <b>null</b> if no WorkArea with such GUID was found
   * @throws SQLException
   */
  public static Integer forWorkArea(JDCConnection oConn, String sWorkAreaId)
    throws SQLException {
    return forWorkArea((Connection) oConn, sWorkAreaId);
  } // forWorkArea

  // ----------------------------------------------------------

  /**
   * <p>Gets domain identifier given its name</p>
   * <p>Calls k_get_domain_id stored procedure and gets id_domaingiven nm_domain
   * @param oConn Database Connection
   * @param sDomainNm Domain name (nm_domain from k_domains table)
   * @return Domain Identifier
   * @throws SQLException
   */
  public static int getIdFromName(JDCConnection oConn, String sDomainNm) throws SQLException {
    CallableStatement oCall;
    PreparedStatement oStmt;
    ResultSet oRSet;
    int iDomainId;

    switch (oConn.getDataBaseProduct()) {

      case JDCConnection.DBMS_MYSQL:
      case JDCConnection.DBMS_MSSQL:
      case JDCConnection.DBMS_ORACLE:
        oCall = oConn.prepareCall("{call k_get_domain_id (?,?)}");
        oCall.setString(1, sDomainNm);
        oCall.registerOutParameter(2, java.sql.Types.INTEGER);
        oCall.execute();
        iDomainId = oCall.getInt(2);
        oCall.close();
        oCall = null;
        break;

      default:
        oStmt = oConn.prepareStatement("SELECT " + DB.id_domain + " FROM " + DB.k_domains + " WHERE " + DB.nm_domain + "=?", ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
        oStmt.setString(1, sDomainNm);
        oRSet = oStmt.executeQuery();
        if (oRSet.next())
          iDomainId = oRSet.getInt(1);
        else
          iDomainId = 0;
        oRSet.close();
        oStmt.close();
    } // end switch()

    return iDomainId;
  }

  // ---------------------------------------------------------------------------

  private static void printUsage() {
    System.out.println("");
    System.out.println("Usage:");
    System.out.println("ACLDomain list emails id_domain");
  }

  public static void main(String[] argv)
      throws SQLException, NumberFormatException {

    if (argv.length!=3) {
      printUsage();
    }
    else if (!argv[1].equalsIgnoreCase("list") || !argv[1].equalsIgnoreCase("emails")) {
      printUsage();
    }
    else {
      DBBind oDBB = new DBBind();
      JDCConnection oCon = oDBB.getConnection("ACLDomain_main");
      Statement oStm = oCon.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
      ResultSet oRst = oStm.executeQuery("SELECT " + DB.tx_main_email + " FROM " + DB.k_users + " WHERE " + DB.id_domain + "=" + argv[2] + " AND " + DB.bo_active + "<>0");

      while (oRst.next()) {
        System.out.println(oRst.getString(1));
      } // wend

      oRst.close();
      oStm.close();
      oCon.close("ACLDomain_main");

      oDBB.connectionPool().close();
      oDBB = null;
    }
  } // main

  // ---------------------------------------------------------------------------

  public static final short ClassId = 1;

} // ACLDomain
TOP

Related Classes of com.knowgate.acl.ACLDomain

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.