package com.owera.xaps.tr069.methods;
import java.security.NoSuchAlgorithmException;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import com.owera.common.db.NoAvailableConnectionException;
import com.owera.xaps.base.Log;
import com.owera.xaps.dbi.FileType;
import com.owera.xaps.dbi.UnittypeParameters;
import com.owera.xaps.dbi.tr069.TestCaseParameter;
import com.owera.xaps.dbi.tr069.TestCaseParameter.TestCaseParameterType;
import com.owera.xaps.dbi.util.ProvisioningMessage;
import com.owera.xaps.dbi.util.SystemParameters;
import com.owera.xaps.dbi.util.ProvisioningMessage.ProvOutput;
import com.owera.xaps.dbi.util.ProvisioningMode;
import com.owera.xaps.tr069.CPEParameters;
import com.owera.xaps.tr069.HTTPReqResData;
import com.owera.xaps.tr069.ParameterKey;
import com.owera.xaps.tr069.Properties;
import com.owera.xaps.tr069.SessionData;
import com.owera.xaps.tr069.SessionData.Download;
import com.owera.xaps.tr069.exception.TR069Exception;
import com.owera.xaps.tr069.exception.TR069ExceptionShortMessage;
import com.owera.xaps.tr069.test.system2.TestUnit;
import com.owera.xaps.tr069.test.system2.TestUnitCache;
import com.owera.xaps.tr069.test.system2.Util;
import com.owera.xaps.tr069.xml.Body;
import com.owera.xaps.tr069.xml.EmptyResponse;
import com.owera.xaps.tr069.xml.Header;
import com.owera.xaps.tr069.xml.ParameterAttributeStruct;
import com.owera.xaps.tr069.xml.ParameterList;
import com.owera.xaps.tr069.xml.ParameterValueStruct;
import com.owera.xaps.tr069.xml.ParameterValueStructComparator;
import com.owera.xaps.tr069.xml.Response;
import com.owera.xaps.tr069.xml.TR069TransactionID;
/**
* The class is responsible for creating a suitable response to the CPE. This
* response could be a TR-069 request or a TR-069 response.
*
* @author morten
*
*/
public class HTTPResponseCreator {
@SuppressWarnings(value = { "unused" })
private static Response buildEM(HTTPReqResData reqRes) {
return new EmptyResponse();
}
@SuppressWarnings(value = { "unused" })
private static Response buildRE(HTTPReqResData reqRes) {
if (reqRes.getTR069TransactionID() == null)
reqRes.setTR069TransactionID(new TR069TransactionID("OWERA-" + System.currentTimeMillis()));
TR069TransactionID tr069ID = reqRes.getTR069TransactionID();
Header header = new Header(tr069ID, null, null);
Body body = new REreq();
return new Response(header, body);
}
@SuppressWarnings(value = { "unused" })
private static Response buildFR(HTTPReqResData reqRes) {
if (reqRes.getTR069TransactionID() == null)
reqRes.setTR069TransactionID(new TR069TransactionID("OWERA-" + System.currentTimeMillis()));
TR069TransactionID tr069ID = reqRes.getTR069TransactionID();
Header header = new Header(tr069ID, null, null);
Body body = new FRreq();
return new Response(header, body);
}
@SuppressWarnings(value = { "unused" })
private static Response buildTC(HTTPReqResData reqRes) {
TR069TransactionID tr069ID = reqRes.getTR069TransactionID();
Header header = new Header(tr069ID, null, null);
Body body = new TCres();
return new Response(header, body);
}
@SuppressWarnings(value = { "unused" })
private static Response buildIN(HTTPReqResData reqRes) {
TR069TransactionID tr069ID = reqRes.getTR069TransactionID();
Header header = new Header(tr069ID, null, null);
Body body = new INres();
return new Response(header, body);
}
@SuppressWarnings(value = { "unused" })
private static Response buildGRMReq(HTTPReqResData reqRes) {
TR069TransactionID tr069ID = reqRes.getTR069TransactionID();
Header header = new Header(tr069ID, null, null);
Body body = new GRMreq();
return new Response(header, body);
}
@SuppressWarnings(value = { "unused" })
private static Response buildGRMRes(HTTPReqResData reqRes) {
TR069TransactionID tr069ID = reqRes.getTR069TransactionID();
Header header = new Header(tr069ID, null, null);
Body body = new GRMres();
return new Response(header, body);
}
@SuppressWarnings(value = { "unused" })
private static Response buildCU(HTTPReqResData reqRes) {
TR069TransactionID tr069ID = reqRes.getTR069TransactionID();
if (reqRes.getTR069TransactionID() == null)
reqRes.setTR069TransactionID(new TR069TransactionID("OWERA-" + System.currentTimeMillis()));
Header header = new Header(reqRes.getTR069TransactionID(), null, null);
SessionData sessionData = reqRes.getSessionData();
String keyRoot = sessionData.getKeyRoot();
String unitId = sessionData.getUnitId();
Body body = new CUreq(keyRoot, unitId);
return new Response(header, body);
}
@SuppressWarnings(value = { "unused" })
private static Response buildGPN(HTTPReqResData reqRes) {
if (reqRes.getTR069TransactionID() == null)
reqRes.setTR069TransactionID(new TR069TransactionID("OWERA-" + System.currentTimeMillis()));
Header header = new Header(reqRes.getTR069TransactionID(), null, null);
String keyRoot = reqRes.getSessionData().getKeyRoot();
Body body = new GPNreq(keyRoot, Properties.isNextLevel0InGPN(reqRes.getSessionData()));
return new Response(header, body);
}
@SuppressWarnings(value = { "unused" })
private static Response buildGPA(HTTPReqResData reqRes) {
if (reqRes.getTR069TransactionID() == null)
reqRes.setTR069TransactionID(new TR069TransactionID("OWERA-" + System.currentTimeMillis()));
Header header = new Header(reqRes.getTR069TransactionID(), null, null);
String keyRoot = reqRes.getSessionData().getKeyRoot();
List<ParameterAttributeStruct> parameterAttributeList = new ArrayList<ParameterAttributeStruct>();
if (Util.testEnabled(reqRes, false)) {
// TODO:TF - build GPA - completed
TestUnit tu = TestUnitCache.get(reqRes.getSessionData().getUnitId());
if (tu != null) {
List<TestCaseParameter> params = tu.getCurrentCase().getParams();
for (TestCaseParameter param : params) {
if (param.getType() == TestCaseParameterType.GET) {
parameterAttributeList.add(new ParameterAttributeStruct(param.getUnittypeParameter().getName(), param.getNotification()));
}
}
}
}
Body body = new GPAreq(parameterAttributeList);
return new Response(header, body);
}
private static boolean isOldPingcomDevice(String unitId) {
if (unitId.contains("NPA201E"))
return true;
if (unitId.contains("RGW208EN"))
return true;
if (unitId.contains("NPA101E"))
return true;
return false;
}
private static void addCPEParameters(SessionData sessionData) {
Map<String, ParameterValueStruct> paramValueMap = sessionData.getFromDB();
CPEParameters cpeParams = sessionData.getCpeParameters();
UnittypeParameters utps = sessionData.getUnittype().getUnittypeParameters();
// If device is not old Ping Communication device (NPA201E or RGW208EN) and
// vendor config file is not explicitely turned off,
// then we may ask for VendorConfigFile object.
boolean useVendorConfigFile = !isOldPingcomDevice(sessionData.getUnitId()) && !Properties.isIgnoreVendorConfigFile(sessionData);
if (useVendorConfigFile)
Log.debug(HTTPResponseCreator.class, "VendorConfigFile object will be requested (default behavior)");
else
Log.debug(HTTPResponseCreator.class, "VendorConfigFile object will not be requested. (quirk behavior: old Pingcom device or quirk enabled)");
int counter = 0;
for (String key : cpeParams.getCpeParams().keySet()) {
if (key.endsWith(".") && useVendorConfigFile) {
paramValueMap.put(key, new ParameterValueStruct(key, "ExtraCPEParam"));
counter++;
} else if (paramValueMap.get(key) == null && utps.getByName(key) != null) {
paramValueMap.put(key, new ParameterValueStruct(key, "ExtraCPEParam"));
counter++;
}
}
Log.debug(HTTPResponseCreator.class, counter + " cpe-param (not found in database, but of special interest to ACS) added to the GPV-request");
}
/**
* Special treatment for PeriodicInformInterval, we want to get that parameter
* from the CPE, regardless of what parameteres we have in the database.
* That's because we have 2 different ways to set it in the database, the
* standard and the Owera-way.
*
* @throws NoAvailableConnectionException
* @throws SQLException
*/
@SuppressWarnings(value = { "unused" })
private static Response buildGPV(HTTPReqResData reqRes) throws SQLException, NoAvailableConnectionException {
if (reqRes.getTR069TransactionID() == null)
reqRes.setTR069TransactionID(new TR069TransactionID("OWERA-" + System.currentTimeMillis()));
Header header = new Header(reqRes.getTR069TransactionID(), null, null);
SessionData sessionData = reqRes.getSessionData();
ProvisioningMode mode = sessionData.getUnit().getProvisioningMode();
List<ParameterValueStruct> parameterValueList = new ArrayList<ParameterValueStruct>();
if (Util.testEnabled(reqRes, false)) {
// TODO:TF - build GPV - completed
TestUnit tu = TestUnitCache.get(sessionData.getUnitId());
if (tu != null) {
List<TestCaseParameter> params = tu.getCurrentCase().getParams();
for (TestCaseParameter param : params) {
if (param.getType() == TestCaseParameterType.GET) {
ParameterValueStruct pvs = new ParameterValueStruct(param.getUnittypeParameter().getName(), "");
parameterValueList.add(pvs);
}
}
}
// } else if (mode == ProvisioningMode.INSPECTION) {
// UnittypeParameters utps =
// sessionData.getUnittype().getUnittypeParameters();
// Map<String, ParameterValueStruct> paramValueMap =
// sessionData.getFromDB();
// addCPEParameters(sessionData);
// int inspectionCount = 0;
// for (UnittypeParameter utp : utps.getUnittypeParameters()) {
// if (utp.getFlag().isInspection() || paramValueMap.get(utp.getName()) !=
// null) {
// inspectionCount++;
// ParameterValueStruct pvs = new ParameterValueStruct(utp.getName(), "");
// parameterValueList.add(pvs);
// }
// }
// Log.debug(HTTPResponseCreator.class, "Added " + inspectionCount +
// " inspection params to GPV-req");
// Log.debug(HTTPResponseCreator.class, "Asks for " +
// parameterValueList.size() + " parameters in GPV-req");
// Collections.sort(parameterValueList, new
// ParameterValueStructComparator());
// } else if (mode == ProvisioningMode.EXTRACTION) {
} else if (mode == ProvisioningMode.READALL) {
Log.debug(HTTPResponseCreator.class, "Asks for all params (" + sessionData.getKeyRoot() + "), since in " + ProvisioningMode.READALL.toString() + " mode");
ParameterValueStruct pvs = new ParameterValueStruct(sessionData.getKeyRoot(), "");
parameterValueList.add(pvs);
} else { // mode == ProvisioningMode.PERIODIC
// List<RequestResponseData> reqResList = sessionData.getReqResList();
String previousMethod = sessionData.getPreviousResponseMethod();
if (Properties.isUnitDiscovery(sessionData) || previousMethod.equals(TR069Method.GET_PARAMETER_VALUES)) {
Log.debug(HTTPResponseCreator.class, "Asks for all params (" + sessionData.getKeyRoot() + "), either because unitdiscovery-quirk or prev. GPV failed");
ParameterValueStruct pvs = new ParameterValueStruct(sessionData.getKeyRoot(), "");
parameterValueList.add(pvs);
} else {
Map<String, ParameterValueStruct> paramValueMap = sessionData.getFromDB();
UnittypeParameters utps = sessionData.getUnittype().getUnittypeParameters();
addCPEParameters(sessionData);
for (Entry<String, ParameterValueStruct> entry : paramValueMap.entrySet()) {
// if (utps.getByName(entry.getKey()) != null) {
parameterValueList.add(entry.getValue());
// } else {
// Log.debug(HTTPResponseCreator.class, "Skipped " + entry.getKey() +
// " in GPV, since the unittype parameter did not exist");
// }
}
Log.debug(HTTPResponseCreator.class, "Asks for " + parameterValueList.size() + " parameters in GPV-req");
Collections.sort(parameterValueList, new ParameterValueStructComparator());
}
}
sessionData.setRequestedCPE(parameterValueList);
Body body = new GPVreq(parameterValueList);
return new Response(header, body);
}
@SuppressWarnings(value = { "unused" })
private static Response buildSPV(HTTPReqResData reqRes) throws NoSuchAlgorithmException, SQLException, NoAvailableConnectionException {
if (reqRes.getTR069TransactionID() == null)
reqRes.setTR069TransactionID(new TR069TransactionID("OWERA-" + System.currentTimeMillis()));
Header header = new Header(reqRes.getTR069TransactionID(), null, null);
Body body = null;
ParameterList paramList = new ParameterList();
if (Util.testEnabled(reqRes, false)) {
// TODO:TF - build SPV - completed
TestUnit tu = TestUnitCache.get(reqRes.getSessionData().getUnitId());
if (tu != null) {
List<TestCaseParameter> params = tu.getCurrentCase().getParams();
for (TestCaseParameter param : params) {
if (param.getType() == TestCaseParameterType.SET) {
ParameterValueStruct pvs = new ParameterValueStruct(param.getUnittypeParameter().getName(), param.getValue());
if (param.getDataModelParameter() == null)
Log.error(HTTPResponseCreator.class, "Could not find datamodel parameter for " + param.getUnittypeParameter().getName());
else
pvs.setType(param.getDataModelParameter().getDatatype().getXsdType());
paramList.addParameterValueStruct(pvs);
}
}
reqRes.getSessionData().setToCPE(paramList);
}
}
paramList = reqRes.getSessionData().getToCPE();
ParameterKey pk = new ParameterKey();
if (!Properties.isParameterkeyQuirk(reqRes.getSessionData()))
pk.setServerKey(reqRes);
body = new SPVreq(paramList.getParameterValueList(), pk.getServerKey());
Log.notice(HTTPResponseCreator.class, "Sent to CPE: " + paramList.getParameterValueList().size() + " parameters.");
reqRes.getSessionData().getProvisioningMessage().setParamsWritten(paramList.getParameterValueList().size());
return new Response(header, body);
}
@SuppressWarnings(value = { "unused" })
private static Response buildDO(HTTPReqResData reqRes) throws SQLException, NoAvailableConnectionException {
if (reqRes.getTR069TransactionID() == null)
reqRes.setTR069TransactionID(new TR069TransactionID("OWERA-" + System.currentTimeMillis()));
Header header = new Header(reqRes.getTR069TransactionID(), null, null);
SessionData sessionData = reqRes.getSessionData();
Download download = sessionData.getDownload();
ProvisioningMessage pm = sessionData.getProvisioningMessage();
String downloadType = null;
String tn = download.getFile().getTargetName();
String commandKey = download.getFile().getVersion();
if (download.getFile().getType() == FileType.SOFTWARE) {
downloadType = DOreq.FILE_TYPE_FIRMWARE;
pm.setProvOutput(ProvOutput.SOFTWARE);
}
if (download.getFile().getType() == FileType.TR069_SCRIPT) {
downloadType = DOreq.FILE_TYPE_CONFIG;
pm.setProvOutput(ProvOutput.SCRIPT);
// String tfnPN =
// SystemParameters.getTR069ScriptParameterName(download.getFile().getTargetName(),
// TR069ScriptType.TargetFileName);
// tfn = sessionData.getOweraParameters().getValue(tfnPN);
// commandKey = download.getFile().getVersion();
}
String version = download.getFile().getVersion();
pm.setFileVersion(version);
String username = sessionData.getUnitId();
String password = sessionData.getOweraParameters().getValue(SystemParameters.SECRET);
Body body = new DOreq(download.getUrl(), downloadType, tn, download.getFile().getLength(), commandKey, username, password);
return new Response(header, body);
}
public static void createResponse(HTTPReqResData reqRes) throws TR069Exception {
try {
String methodName = reqRes.getResponse().getMethod();
Response response = null;
HTTPResponseAction resAction = TR069Method.responseMap.get(methodName);
if (resAction != null)
response = (Response) resAction.getCreateResponseMethod().invoke(null, reqRes);
else {
response = new EmptyResponse();
Log.error(HTTPResponseCreator.class, "The methodName " + methodName + " has no corresponding ResponseAction-method");
}
String responseStr = response.toXml();
Log.conversation(reqRes.getSessionData(), "=============== FROM ACS ============\n" + responseStr + "\n");
reqRes.getResponse().setXml(responseStr);
} catch (Throwable t) {
throw new TR069Exception("Not possible to create HTTP-response (to the TR-069 client)", TR069ExceptionShortMessage.MISC, t);
// reqRes.setThrowable(t);
// Log.error(HTTPResponseCreator.class, "The response with methodname " +
// reqRes.getResponse().getMethod() + " failed, return EmptyResponse", t);
// reqRes.getResponse().setXml("");
}
}
@SuppressWarnings(value = { "unused" })
private static Response buildSPA(HTTPReqResData reqRes) throws NoSuchAlgorithmException, SQLException, NoAvailableConnectionException {
if (reqRes.getTR069TransactionID() == null)
reqRes.setTR069TransactionID(new TR069TransactionID("OWERA-" + System.currentTimeMillis()));
Header header = new Header(reqRes.getTR069TransactionID(), null, null);
Body body = null;
List<ParameterAttributeStruct> attributes = new ArrayList<ParameterAttributeStruct>();
if (Util.testEnabled(reqRes, false)) {
// TODO:TF - build SPA - completed
TestUnit tu = TestUnitCache.get(reqRes.getSessionData().getUnitId());
if (tu != null) {
List<TestCaseParameter> params = tu.getCurrentCase().getParams();
for (TestCaseParameter param : params) {
if (param.getType() == TestCaseParameterType.SET) {
attributes.add(new ParameterAttributeStruct(param.getUnittypeParameter().getName(), param.getNotification()));
}
}
reqRes.getSessionData().setAttributesToCPE(attributes);
}
}
attributes = reqRes.getSessionData().getAttributesToCPE();
body = new SPAreq(attributes);
Log.notice(HTTPResponseCreator.class, "Sent to CPE: " + attributes.size() + " attributes.");
for (ParameterAttributeStruct pvs : attributes)
Log.notice(HTTPResponseCreator.class, "\t" + pvs.getName() + " : " + pvs.getNotifcation());
return new Response(header, body);
}
}