package com.owera.xaps.base.db;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import com.owera.common.db.NoAvailableConnectionException;
import com.owera.xaps.base.Log;
import com.owera.xaps.dbi.DBI;
import com.owera.xaps.dbi.Profile;
import com.owera.xaps.dbi.Unit;
import com.owera.xaps.dbi.UnitParameter;
import com.owera.xaps.dbi.Unittype;
import com.owera.xaps.dbi.Unittype.ProvisioningProtocol;
import com.owera.xaps.dbi.UnittypeParameter;
import com.owera.xaps.dbi.XAPS;
import com.owera.xaps.dbi.XAPSUnit;
import com.owera.xaps.dbi.util.SystemParameters;
import com.owera.xaps.tr069.SessionData;
import com.owera.xaps.tr069.exception.TR069DatabaseException;
import com.owera.xaps.tr069.exception.TR069Exception;
import com.owera.xaps.tr069.exception.TR069ExceptionShortMessage;
import com.owera.xaps.tr069.xml.ParameterValueStruct;
public class DBAccessSessionTR069 {
private XAPS xaps;
private DBAccessSession dbAccessSession;
public DBAccessSessionTR069(DBI dbi, DBAccessSession dbAccessSession) {
this.xaps = dbi.getXaps();
this.dbAccessSession = dbAccessSession;
}
private static void debug(String message) {
Log.debug(DBAccessSessionTR069.class, message);
}
public void writeUnittypeProfileUnit(SessionData sessionData, String unittypeName, String unitId) throws TR069Exception {
// If no product class is specified in the inform:
if (unittypeName == null || unittypeName.trim().equals(""))
unittypeName = "OUI-" + unitId.substring(0, 6);
try {
Unittype ut = xaps.getUnittype(unittypeName);
if (ut == null) {
sessionData.setUnittypeCreated(false);
ut = new Unittype(unittypeName, unittypeName, "Auto-generated", ProvisioningProtocol.TR069);
xaps.getUnittypes().addOrChangeUnittype(ut, xaps);
debug("Have created a unittype with the name " + unittypeName +" in discovery mode");
} else {
sessionData.setUnittypeCreated(true);
debug("Unittype " + unittypeName + " already exists, no need to create it in discovery mode");
}
// List<UnittypeParameter> unittypeParameters = new ArrayList<UnittypeParameter>();
// for (Entry<String, UnittypeParameterFlag> entry : SystemParameters.commonParameters.entrySet()) {
// UnittypeParameter utp = ut.getUnittypeParameters().getByName(entry.getKey());
// if (utp == null) {
// utp = new UnittypeParameter(ut, entry.getKey(), entry.getValue());
// unittypeParameters.add(utp);
// }
// }
// UnittypeParameter[] crParams = new UnittypeParameter[3];
// CPEParameters cpeParams = sessionData.getCpeParameters();
//
// crParams[0] = new UnittypeParameter(ut, cpeParams.CONNECTION_URL, new UnittypeParameterFlag("ADR"));
// crParams[1] = new UnittypeParameter(ut, cpeParams.CONNECTION_USERNAME, new UnittypeParameterFlag("RW"));
// crParams[2] = new UnittypeParameter(ut, cpeParams.CONNECTION_PASSWORD, new UnittypeParameterFlag("RW"));
// for (UnittypeParameter crParam : crParams) {
// UnittypeParameter utp = ut.getUnittypeParameters().getByName(crParam.getName());
// if (utp == null) {
// unittypeParameters.add(crParam);
// }
// }
// ut.getUnittypeParameters().addOrChangeUnittypeParameters(unittypeParameters, xaps);
Profile pr = ut.getProfiles().getByName("Default");
if (pr == null) {
pr = new Profile("Default", ut);
ut.getProfiles().addOrChangeProfile(pr, xaps);
debug("Have created a profile with the name " + pr.getName() + " in discovery mode");
}
// ProfileParameter ppUser = pr.getProfileParameters().getByName(cpeParams.CONNECTION_USERNAME);
// if (ppUser == null) {
// ppUser = new ProfileParameter(pr, ut.getUnittypeParameters().getByName(cpeParams.CONNECTION_USERNAME), "username");
// pr.getProfileParameters().addOrChangeProfileParameter(ppUser, xaps);
// }
// ProfileParameter ppPass = pr.getProfileParameters().getByName(cpeParams.CONNECTION_PASSWORD);
// if (ppPass == null) {
// ppPass = new ProfileParameter(pr, ut.getUnittypeParameters().getByName(cpeParams.CONNECTION_PASSWORD), "password");
// pr.getProfileParameters().addOrChangeProfileParameter(ppPass, xaps);
// }
sessionData.setUnittype(ut);
sessionData.setProfile(pr);
XAPSUnit xapsUnit = DBAccess.getXAPSUnit(xaps);
List<String> unitIds = new ArrayList<String>();
unitIds.add(unitId);
xapsUnit.addUnits(unitIds, pr);
List<UnitParameter> unitParameters = new ArrayList<UnitParameter>();
UnittypeParameter secretUtp = ut.getUnittypeParameters().getByName(SystemParameters.SECRET);
UnitParameter up = new UnitParameter(secretUtp, unitId, sessionData.getSecret(), pr);
unitParameters.add(up);
xapsUnit.addOrChangeUnitParameters(unitParameters, pr);
Unit unit = dbAccessSession.readUnit(sessionData.getUnitId());
sessionData.setUnit(unit);
debug("Have created a unit:" + unitId + " with the obtained secret");
} catch (Throwable t) {
String errorMsg = "Exception while auto-generating unittype/profile/unit";
if (t instanceof NoAvailableConnectionException || t instanceof SQLException) {
throw new TR069DatabaseException(errorMsg, t);
} else {
throw new TR069Exception(errorMsg, TR069ExceptionShortMessage.MISC, t);
}
}
}
public void writeUnitSessionParams(SessionData sessionData) throws TR069DatabaseException {
try {
List<ParameterValueStruct> parameterValuesToDB = sessionData.getToDB();
Unittype unittype = sessionData.getUnittype();
Profile profile = sessionData.getProfile();
List<UnitParameter> unitSessionParameters = new ArrayList<UnitParameter>();
for (ParameterValueStruct pvs : parameterValuesToDB) {
UnittypeParameter utp = unittype.getUnittypeParameters().getByName(pvs.getName());
if (utp != null) {
UnitParameter up = new UnitParameter(utp, sessionData.getUnitId(), pvs.getValue(), profile);
if (utp.getName().startsWith("Device.") || utp.getName().startsWith("InternetGatewayDevice."))
unitSessionParameters.add(up);
} else
Log.warn(DBAccessSession.class, "\t" + pvs.getName() + " : does not exist, cannot write session value " + pvs.getValue());
}
if (unitSessionParameters.size() > 0) {
XAPSUnit xapsUnit = DBAccess.getXAPSUnit(xaps);
xapsUnit.addOrChangeSessionUnitParameters(unitSessionParameters, profile);
}
} catch (SQLException sqle) {
throw new TR069DatabaseException("Not possible to write session parameters to database", sqle);
}
}
public static void writeUnitParams(SessionData sessionData) {
List<ParameterValueStruct> parameterValuesToDB = sessionData.getToDB();
List<UnitParameter> unitParameters = new ArrayList<UnitParameter>();
Unittype unittype = sessionData.getUnittype();
Profile profile = sessionData.getProfile();
Unit unit = sessionData.getUnit();
for (ParameterValueStruct pvs : parameterValuesToDB) {
UnittypeParameter utp = unittype.getUnittypeParameters().getByName(pvs.getName());
if (utp != null) {
unitParameters.add(new UnitParameter(utp, sessionData.getUnitId(), pvs.getValue(), profile));
} else
Log.warn(DBAccessSession.class, "\t" + pvs.getName() + " : does not exist, cannot write value " + pvs.getValue());
}
DBAccessStatic.queueUnitParameters(unit, unitParameters, profile);
}
}