/*******************************************************************************
* Copyright 2014 Miami-Dade County
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
******************************************************************************/
package org.sharegov.cirm.legacy;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.Properties;
import org.semanticweb.owlapi.model.IRI;
import org.semanticweb.owlapi.model.OWLLiteral;
import org.sharegov.cirm.OWL;
import org.sharegov.cirm.utils.ThreadLocalStopwatch;
import mjson.Json;
public class ParticipantResolver implements VariableResolver
{
public static boolean DBG = true;
//COM used variables:
public static final String VAR1_APLICANT_PHONE = "$$APLICANT_PHONE$$"; // Phone number of APLICAN //missing P intended
public static final String VAR2_APPLICANT_ADDRESS1 = "$$APPLICANT_ADDRESS1$$"; //FullAddress of APPLICAN
public static final String VAR3_APPLICANT_ADDRESS2 = "$$APPLICANT_ADDRESS2$$"; // City StateCode Zipcode of APPLICAN
public static final String VAR4_APPLICANT_NAME = "$$APPLICANT_NAME$$"; //First Middle LastName of APPLICAN
public static final String VAR5_CITIZENS_ADDRESS1 = "$$CITIZENS_ADDRESS1$$"; //FullAddress of CITIZEN
public static final String VAR6_CITIZENS_ADDRESS2 = "$$CITIZENS_ADDRESS2$$"; //City StateCode Zipcode of CITIZEN
public static final String VAR7_CITIZENS_EMAIL = "$$CITIZENS_EMAIL$$"; // Email of Citizen
public static final String VAR8_CITIZENS_NAME = "$$CITIZENS_NAME$$"; //First Middle LastName of CITIZEN
public static final String VAR9_CITIZENS_PHONE = "$$CITIZENS_PHONE$$"; // Phone number of CITIZEN
//Resolved Later:
//PHONE NUMBER - will resolve to a txt formatted table of all supplied phone numbers, if more than one.
public static final String VAR10_CITIZENS_PHONE_NTYPE = "$$CITIZENS_PHONE_NTYPE$$"; // Phone number of CITIZEN
public static final String VAR11_CITIZENS_PHONE_NTYPED1 = "$$CITIZENS_PHONE_NTYPED1$$"; // Phone number of CITIZEN
public static final String VAR12_CITIZENS_PHONE_NTYPED4 = "$$CITIZENS_PHONE_NTYPED4$$"; // Phone number of CITIZEN
public static final String VAR13_CITIZENS_PHONE_NTYPED5 = "$$CITIZENS_PHONE_NTYPED5$$"; // Phone number of CITIZEN
// For BACKWARD COMPATIBIULITY
//DETAILS (used to be extension, or some string or cell number in legacy)
public static final String VAR14_CITIZENS_PHONE_NTYPE_DET = "$$CITIZENS_PHONE_NTYPE_DET"; // Phone number of CITIZEN
public static final String VAR15_CITIZENS_PHONE_NTYPE_DETD1 = "$$CITIZENS_PHONE_NTYPE_DETD1$$"; // Phone number of CITIZEN
public static final String VAR16_CITIZENS_PHONE_NTYPE_DETD4 = "$$CITIZENS_PHONE_NTYPE_DETD4$$"; // Phone number of CITIZEN
public static final String VAR17_CITIZENS_PHONE_NTYPE_DETD5 = "$$CITIZENS_PHONE_NTYPE_DETD5$$"; // Phone number of CITIZEN
//PHONE TYPE CODE
public static final String VAR18_CITIZENS_PHONE_NTYPE_SEL = "$$CITIZENS_PHONE_NTYPE_SEL$$"; // Phone number of CITIZEN
public static final String VAR19_CITIZENS_PHONE_NTYPE_SELD1 = "$$CITIZENS_PHONE_NTYPE_SELD1$$"; // Phone number of CITIZEN
public static final String VAR20_CITIZENS_PHONE_NTYPE_SELD4 = "$$CITIZENS_PHONE_NTYPE_SELD4$$"; // Phone number of CITIZEN
public static final String VAR21_CITIZENS_PHONE_NTYPE_SELD5 = "$$CITIZENS_PHONE_NTYPE_SELD5$$"; // Phone number of CITIZEN
private enum ActorEnum {
CITIZEN, APPLICAN
}
@Override
public String resolve(String variableName, Json sr, Properties properties)
{
String result;
if (VAR1_APLICANT_PHONE.equals(variableName))
result = getActorPhonesMultiLine(getActorJson(sr, ActorEnum.APPLICAN));
else if (VAR2_APPLICANT_ADDRESS1.equals(variableName))
result = getActorAddress1(getActorJson(sr, ActorEnum.APPLICAN));
else if (VAR3_APPLICANT_ADDRESS2.equals(variableName))
result = getActorAddress2(getActorJson(sr, ActorEnum.APPLICAN));
else if (VAR4_APPLICANT_NAME.equals(variableName))
result = getActorName(getActorJson(sr, ActorEnum.APPLICAN));
else if (VAR5_CITIZENS_ADDRESS1.equals(variableName))
result = getActorAddress1(getActorJson(sr, ActorEnum.CITIZEN));
else if (VAR6_CITIZENS_ADDRESS2.equals(variableName))
result = getActorAddress2(getActorJson(sr, ActorEnum.CITIZEN));
else if (VAR7_CITIZENS_EMAIL.equals(variableName))
result = getActorEmail(getActorJson(sr, ActorEnum.CITIZEN));
else if (VAR8_CITIZENS_NAME.equals(variableName))
result = getActorName(getActorJson(sr, ActorEnum.CITIZEN));
else if (VAR9_CITIZENS_PHONE.equals(variableName)
|| VAR10_CITIZENS_PHONE_NTYPE.equals(variableName)
|| VAR11_CITIZENS_PHONE_NTYPED1.equals(variableName)
|| VAR12_CITIZENS_PHONE_NTYPED4.equals(variableName)
|| VAR13_CITIZENS_PHONE_NTYPED5.equals(variableName)
)
{
result = getActorPhonesMultiLine(getActorJson(sr, ActorEnum.CITIZEN));
}
else if (VAR14_CITIZENS_PHONE_NTYPE_DET.equals(variableName)
|| VAR15_CITIZENS_PHONE_NTYPE_DETD1.equals(variableName)
|| VAR16_CITIZENS_PHONE_NTYPE_DETD4.equals(variableName)
|| VAR17_CITIZENS_PHONE_NTYPE_DETD5.equals(variableName)
|| VAR18_CITIZENS_PHONE_NTYPE_SEL.equals(variableName)
|| VAR19_CITIZENS_PHONE_NTYPE_SELD1.equals(variableName)
|| VAR20_CITIZENS_PHONE_NTYPE_SELD4.equals(variableName)
|| VAR21_CITIZENS_PHONE_NTYPE_SELD5.equals(variableName)
)
{
// Not needed anymode, returning an empty string for backward compatibility.
result = "";
}
else
result = null;
if (DBG)
{
System.out.println("ParticipantResolver: Var: " + variableName + "result: " + result);
}
return result;
}
/**
* Returns a multi-line string with each line containing phone type + phone number for each entered actor's phone.
* No newline will be added, if only one line is returned.
* (Multiple phone numbers of same type will be comma separated strings in the actor json: e.g. "1112223333#123,1112223333#222")
* @param actorJsonObj
* @return
*/
public static String getActorPhonesMultiLine(Json actorJsonObj)
{
int found = 0;
String result = "";
if (actorJsonObj.has("HomePhoneNumber"))
{
found++;
result += "Home: " + actorJsonObj.at("HomePhoneNumber").asString();
}
if (actorJsonObj.has("CellPhoneNumber"))
{
if (found > 0) result = result + "\r\n";
found++;
result += "Cell: " + actorJsonObj.at("CellPhoneNumber").asString();
}
if (actorJsonObj.has("BusinessPhoneNumber"))
{
if (found > 0) result = result + "\r\n";
found++;
result += "Biz: " + actorJsonObj.at("BusinessPhoneNumber").asString();
}
if (actorJsonObj.has("OtherPhoneNumber"))
{
if (found > 0) result = result + "\r\n";
found++;
result += "Other:" + actorJsonObj.at("OtherPhoneNumber").asString();
}
if (actorJsonObj.has("FaxNumber"))
{
if (found > 0) result = result + "\r\n";
found++;
result += "Fax: " + actorJsonObj.at("FaxNumber").asString();
}
if (found > 1)
return result + "\r\n";
else if (found > 0)
return result;
else
return "N/A";
}
public String getActorAddress1(Json actorJsonObj)
{
if (actorJsonObj.has("atAddress"))
return actorJsonObj.at("atAddress").at("fullAddress", "").asString();
else
return "N/A";
}
public static String getActorAddress2(Json actorJsonObj)
{
try {
if (actorJsonObj.has("atAddress"))
{
//City StateCode Zipcode
Json cityJson = actorJsonObj.at("atAddress").at("Street_Address_City", Json.object());
Json stateJson = actorJsonObj.at("atAddress").at("Street_Address_State", Json.object());
if (cityJson.isObject()) cityJson = cityJson.at("iri","owl:Nothing");
if (stateJson.isObject()) stateJson = stateJson.at("iri", "owl:Nothing");
IRI cityIRI = IRI.create(cityJson.isString()? cityJson.asString() : "owl:Nothing");
IRI stateIRI = IRI.create(stateJson.isString()? stateJson.asString() : "owl:Nothing");
String zipCode = actorJsonObj.at("atAddress").at("Zip_Code", "N/A").asString();
String cityLabel = OWL.getEntityLabel(OWL.individual(cityIRI));
if (cityLabel == null) cityLabel = "N/A";
String stateCode = "";
Iterator<OWLLiteral> stateCodeIt = OWL.dataProperties(OWL.individual(stateIRI), "mdc:USPS_Abbreviation").iterator();
if (stateCodeIt.hasNext()) stateCode = stateCodeIt.next().getLiteral();
if (stateCode == null) stateCode = "N/A";
return cityLabel + " " + stateCode + " " + zipCode;
}
else
return "N/A";
} catch(Exception e)
{
ThreadLocalStopwatch.getWatch().time("ParticipantEmailResolver: getActorAddress2: Error on resolve: " + e.toString() + " resuming.");
e.printStackTrace();
return "N-A";
}
}
/**
*
* @param actorJson
* @return String First [Middle] Last name
*/
public static String getActorName(Json actorJsonObj)
{
String first = actorJsonObj.at("Name", "").asString();
String last = actorJsonObj.at("LastName", "").asString();
if (!first.isEmpty() || !last.isEmpty())
return first + " " + last;
else
return "N/A";
}
private String getActorEmail(Json actorJsonObj)
{
String emailIRI = actorJsonObj.at("hasEmailAddress", Json.object()).at("iri", "").asString();
if (emailIRI.length() > 1)
return emailIRI.substring("mailto:".length());
else
return "N/A";
}
/**
* Finds the first actor in the sr json by ActorEnum and returns it's Json object.
* @param sr
* @param citizen
* @return the actor json or an empty json object
*/
private static Json getActorJson(Json sr, ActorEnum citizen)
{
//sr = sr.at("properties", Json.object());
if (!sr.has("hasServiceCaseActor")) return Json.object();
List<Json> serviceCaseActors = (sr.at("hasServiceCaseActor").isArray()) ? sr.at("hasServiceCaseActor").asJsonList() : Collections.singletonList(sr.at("hasServiceCaseActor"));
for (Json actor : serviceCaseActors)
{
if (!actor.isObject()) continue;
String actorTypeIRI = actor.at("hasServiceActor", Json.object()).at("iri", "").asString();
//e.g. http://www.miamidade.gov/cirm/legacy#CITIZEN
if (actorTypeIRI.endsWith(citizen.name()))
return actor;
}
return Json.object();
}
}