/**
* Crea un dominio clonado del dominio MODEL
@param DomainId GUID del nuevo dominio (si "" entonces se calcula uno aleatorio entre 1670 y 524287 )
@param DomainNm nm_domain del nuevo dominio
* Parametros respuesta
//param sCodError codigo de error (0->ok, 1->ko)
//param sIdObjetoOK id_domain del nuevo dominio si sCodError = 0 sino ""
//param sMessage Mensaje de exito si sCodError = 0 o de error si sCodError = 1
//param sGuUserAdmin gu_user del administrador del dominio
**/
import java.sql.SQLException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.util.Properties;
import java.lang.Math;
import java.lang.Number;
import com.knowgate.dataobjs.DB;
import com.knowgate.dataobjs.DBAudit;
import com.knowgate.dataobjs.DBBind;
import com.knowgate.dataobjs.DBSubset;
import com.knowgate.datacopy.DataStruct;
import com.knowgate.acl.ACLDomain;
import com.knowgate.misc.Environment;
import com.knowgate.hipergate.datamodel.ModelManager;
// Dominio Modelo a clonar (no cambiar)
int MODEL = 1025;
// Parametros del nuevo dominio
//String NewDomainId = "1032" ; // NO PONER AQU� 1024 NI 1025 O TE CARGAS LOS DOMINIOS BUENOS
//String NewDomainNm = "TEST5";
String NewDomainId = String.valueOf( DBBind.nextVal(AlternativeConnection, "seq_k_domains") );
String NewDomainNm = DomainNm;
/* C�digo antiguo de generaci�n autom�tica
double iRandValue = Math.random();
//valores tomados de k_sequences
//int iMinValue = 1026;
//ponemos un numero suficientemente grande para que no pise los dominios anteriores
int iMinValue = 1670;
int iMaxValue = 524287;
//calculo del id_domain aleatorio entre iMinValue e iMaxValue
double iNewDomainId = Math.round( iRandValue * (iMaxValue-iMinValue) ) + iMinValue ;
//to do : hay que evitar colisiones
//Valores por defecto si se recibe null
if (0 == NewDomainId.length())
NewDomainId = String.valueOf( (int) iNewDomainId);
//NewDomainId = "524288";
*/
//valor de retorno
ReturnValue = new Properties();
ReturnValue.put("sCodError", "0");
ReturnValue.put("sMessage", "Dominio (" + NewDomainId + "," + NewDomainNm + ") creado con exito.");
ReturnValue.put("sIdObjetoOK", NewDomainId);
Integer iSourceDomain = new Integer(MODEL);
//Integer iTargetDomain = new Integer(NewDomainId);
Integer iTargetDomain = new Integer(NewDomainId);
Object[] oPKOr = { iSourceDomain };
Object[] oPKTr = { iTargetDomain };
String sStorage = Environment.getProfileVar("hipergate", "storage");
Properties oParams = new Properties();
oParams.put("DomainId", iTargetDomain.toString());
oParams.put("DomainNm", NewDomainNm);
DataStruct oDS = new DataStruct();
//oDS.parse(sStorage + "/scripts/domain_clon.xml", oParams);
oDS.parse(ModelManager.getResourceAsString("scripts/domain_clon.xml"), oParams);
try {
DefaultConnection.setReadOnly(true);
DefaultConnection.setTransactionIsolation(Connection.TRANSACTION_READ_UNCOMMITTED);
// C�digo de acceso a datos
oDS.setOriginConnection(DefaultConnection);
oDS.setTargetConnection(AlternativeConnection);
AlternativeConnection.setAutoCommit (false);
oDS.insert(oPKOr, oPKTr, 1);
// *****************************************************
// C�digo para asignar ls categor�as home a cada usuario
PreparedStatement oStmt;
DBSubset oCategories;
int iCategories;
int iUnderscore;
String sCatName;
String sNickName;
// Leer todas las categor�as del nuevo dominio
oCategories = new DBSubset(DB.k_categories,
DB.gu_category + "," + DB.nm_category,
DB.gu_owner + " IN (SELECT " + DB.gu_user + " FROM " + DB.k_users + " WHERE " + DB.id_domain + "=" + iTargetDomain.toString() + ") ", 4);
iCategories = oCategories.load(AlternativeConnection);
// Para cada categor�a buscar un usuario cuyo nick coincida con el final del nombre de la categoria
// Es decir, el matching entre las categor�as creadas y los usuarios creados se hace usando el
// convenio del campo nm_category de tener la forma DOMINIO_usuario_categoria
oStmt = AlternativeConnection.prepareStatement("UPDATE " + DB.k_users + " SET " + DB.gu_category + "=? WHERE " + DB.id_domain + "=" + iTargetDomain.toString() + " AND " + DB.tx_nickname + "=?");
for (int c=0; c<iCategories; c++) {
sCatName = oCategories.getString(1,c);
iUnderscore = sCatName.indexOf("_");
if (iUnderscore>0) {
sNickName = sCatName.substring(iUnderscore+1);
oStmt.setString(1, oCategories.getString(0,c));
oStmt.setString(2, sNickName);
oStmt.executeUpdate();
} // fi()
} // next (c)
oStmt.close();
// *****************************************************
//Calculo del usuario admin del nuevo dominio y pasarlo en ReturnValue
//Necesario para la creaci�n de accounts
DBSubset oDomains;
int iDomains;
oDomains = new DBSubset(DB.k_domains,
DB.gu_owner ,
DB.id_domain + "=" + NewDomainId , 4);
iUsers = oDomains.load(AlternativeConnection);
String sGuUserAdmin = oDomains.getString(0,0);
ReturnValue.put("sGuUserAdmin", sGuUserAdmin);
DBAudit.log(AlternativeConnection, ACLDomain.ClassId, "NDOM", "unknown", "0", null, 0, 0, null, null);
}
catch (SQLException e) {
//ReturnValue = "ERROR: " + e.getMessage();
ReturnValue.put("sCodError", "1");
ReturnValue.put("sMessage", "ERROR: " + e.getMessage());
ReturnValue.put("sIdObjetoOK", "");
}