pass a HashMap by reference - java

I have a multiple-multi-dimensional HashMap() instances, I am using them to store hierarchical data from a database;
HashMap<String, HashMap<String, ArrayList<String>>>
I add to them with 3 primary methods that we'll refer to as addTop(), addMid() and addLow(). The methods all accept parameters that match their data group and a string, each method returns the next dimension of the HashMap();
public static HashMap<String, ArrayList<String>> addTop(HashMap<String, HashMap<String, ArrayList<String>>> data, String val) { ... };
public static ArrayList<String> addMid(HashMap<String, ArrayList<String>> data, String val) { ... };
public static String addLow(ArrayList<String> data, String val) { ... };
I call these, usually, in sequence in between a few checks and perform additional checks inside the methods. Essentially all these methods do is add val to data then return an empty HashMap();
out = new HashMap();
data.put(val, out);
return out;
When I check at the end of the loop/data-population all of the data from addMid() & addLow() is missing. Why is this?
I thought Java worked by reference when dealing with complex objects, such as HashMap().
What can I do to ensure that addMid() and addLow() update the master HashMap()?
EDIT: Included code. It compiles and runs but there are other problems, I have stripped out as much as I can to demonstrate whats happening, except the SQL stuff, that won't compile, sorry. the method that is run at start is sqlToArray();
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
public class Av2 {
protected class AvailLookup {
private Integer key;
private String value;
public AvailLookup(Integer inKey, String inValue) {
key = inKey;
value = inValue;
}
public void updateName(String name) {
value = name;
}
public Integer getKey() {
return key;
}
public String getValue() {
return value;
}
public String toString() {
return value;
}
}
private static HashMap<AvailLookup, HashMap<AvailLookup, ArrayList<AvailLookup>>> data = new HashMap<AvailLookup, HashMap<AvailLookup, ArrayList<AvailLookup>>>();
private static Sql sql = new Sql("PlantAvail");
public static HashMap<AvailLookup, ArrayList<AvailLookup>> getChannel(HashMap<AvailLookup, HashMap<AvailLookup, ArrayList<AvailLookup>>> inArray, Integer channel) {
HashMap<AvailLookup, ArrayList<AvailLookup>> out = null;
if (inArray != null ) {
for (AvailLookup lookup : inArray.keySet()) {
if (lookup.getKey() == channel) {
out = inArray.get(lookup);
System.out.println("Channel: " + channel + " found");
break;
}
}
if (out == null) {
System.out.println("Channel: " + channel + " not found");
}
}
return out;
}
public static HashMap<AvailLookup, ArrayList<AvailLookup>> getChannel(HashMap<AvailLookup, HashMap<AvailLookup, ArrayList<AvailLookup>>> inArray, String channel) {
HashMap<AvailLookup, ArrayList<AvailLookup>> out = null;
if (inArray != null ) {
for (AvailLookup lookup : inArray.keySet()) {
if (lookup.getValue() != null) {
if (lookup.getValue().equalsIgnoreCase(channel)) {
out = inArray.get(lookup);
System.out.println("Channel: " + channel + " found");
break;
}
}
}
if (out == null) {
System.out.println("Channel: " + channel + " not found");
}
}
return out;
}
public static HashMap<AvailLookup, ArrayList<AvailLookup>> addChannel(HashMap<AvailLookup, HashMap<AvailLookup, ArrayList<AvailLookup>>> inArray, Integer id, String name) {
HashMap<AvailLookup, ArrayList<AvailLookup>> out = null;
if (inArray != null ) {
if (getChannel(inArray, id) == null) {
out = new HashMap<AvailLookup, ArrayList<AvailLookup>>();
inArray.put(new AvailLookup(id, name), new HashMap<AvailLookup, ArrayList<AvailLookup>>());
System.out.println("Channel: added " + id);
} else {
System.out.println("Channel: " + id + " already exists");
}
} else {
System.out.println("Channel: " + id + " already exists");
}
return out;
}
public static void removeChannel(HashMap<AvailLookup, HashMap<AvailLookup, ArrayList<AvailLookup>>> inArray, Integer channel) {
boolean pass = false;
HashMap<AvailLookup, ArrayList<AvailLookup>> channelLookup = getChannel(inArray, channel);
for (AvailLookup lookup : channelLookup.keySet()) {
if (lookup.getKey() == channel) {
inArray.remove(channel);
System.out.println("Channel: " + channel + " removed");
pass = true;
break;
}
}
if (!pass) {
System.out.println("Channel: " + channel + " cannot be removed");
}
}
public static ArrayList<AvailLookup> getDevice(HashMap<AvailLookup, ArrayList<AvailLookup>> channel, Integer device) {
ArrayList<AvailLookup> out = null;
for(AvailLookup lookup : channel.keySet()) {
if (lookup.getKey() == device) {
out = channel.get(device);
System.out.println("Device: " + device + " found");
break;
}
}
if (out == null) {
System.out.println("Device: " + device + " not found");
}
return out;
}
public static ArrayList<AvailLookup> getDevice(HashMap<AvailLookup, ArrayList<AvailLookup>> channel, String device) {
ArrayList<AvailLookup> out = null;
for(AvailLookup lookup : channel.keySet()) {
if (lookup.getValue() == device) {
out = channel.get(device);
System.out.println("Device: " + device + " found");
break;
}
}
if (out == null) {
System.out.println("Device: " + device + " not found");
}
return out;
}
public static ArrayList<AvailLookup> addDevice(HashMap<AvailLookup, ArrayList<AvailLookup>> channel, Integer id, String value) {
ArrayList<AvailLookup> out = null;
if (getDevice(channel, id) == null) {
out = new ArrayList<AvailLookup>();
channel.put(new AvailLookup(id, value), new ArrayList<AvailLookup>());
System.out.println("Device: added " + id);
} else {
System.out.println("Device: " + id + " already exists");
}
return out;
}
public static void removeDevice(HashMap<AvailLookup, ArrayList<AvailLookup>> channel, Integer device) {
boolean pass = false;
ArrayList<AvailLookup> deviceLookup = getDevice(channel,device);
for (AvailLookup lookup : deviceLookup) {
if (lookup.getKey() == device) {
channel.remove(device);
System.out.println("Device: " + device + " removed");
pass = true;
break;
}
}
if (!pass) {
System.out.println("Device: " + device + " cannot be removed");
}
}
public static AvailLookup getHost(ArrayList<AvailLookup> hosts, Integer host) {
AvailLookup out = null;
for (AvailLookup hostLookup : hosts) {
if (hostLookup.getKey() == host) {
out = hostLookup;
System.out.println("Host: " + host + " found");
}
}
if (hosts.contains(host)) {
} else {
System.out.println("Host: " + host + " not found");
}
return out;
}
public static AvailLookup getHost(ArrayList<AvailLookup> hosts, String host) {
AvailLookup out = null;
for (AvailLookup hostLookup : hosts) {
if (hostLookup.getValue() == host) {
out = hostLookup;
System.out.println("Host: " + host + " found");
}
}
if (hosts.contains(host)) {
} else {
System.out.println("Host: " + host + " not found");
}
return out;
}
public static AvailLookup addHost(ArrayList<AvailLookup> hosts, Integer id, String value) {
AvailLookup out = null;
for (AvailLookup hostLookup : hosts) {
if (hostLookup.getKey() == id) {
out = hosts.set(id, new AvailLookup(id, value));
System.out.println("Host: " + id + " found");
break;
}
}
if (out == null) {
System.out.println("Host: " + id + " not found");
}
return out;
}
public static void removeHost(ArrayList<AvailLookup> hosts, Integer host) {
boolean pass = false;
for (AvailLookup hostLookup : hosts) {
if (hostLookup.getKey() == host) {
hosts.remove(hostLookup);
System.out.println("Host: " + host + " removed");
pass = true;
}
}
if (!pass) {
System.out.println("Host: " + host + " cannot be removed");
}
}
public static ArrayList<AvailLookup> otherHosts(ArrayList<AvailLookup> hosts, Integer key, String value) {
ArrayList<AvailLookup> out = null;
for (AvailLookup host : hosts) {
if (host.getKey() != key) {
if (out == null) {
out = new ArrayList<AvailLookup>();
}
out.add(new AvailLookup(key, value));
}
}
if (out != null) {
if (out.size() > 1) {
System.out.println("Host: generated other hosts");
}
}
return out;
}
public static AvailLookup nextHost(ArrayList<AvailLookup> otherHosts) {
AvailLookup out = null;
if (otherHosts != null) {
out = otherHosts.get(0);
System.out.println("Host: getting next host");
} else {
System.out.println("Host: no other host");
}
return out;
}
public static void sqlToArray() {
HashMap<AvailLookup, HashMap<AvailLookup, ArrayList<AvailLookup>>> tempData = new HashMap<AvailLookup, HashMap<AvailLookup, ArrayList<AvailLookup>>>();
Integer iHost = null;
Integer iDevice = null;
Integer iChannel = null;
String sHost = null;
String sDevice = null;
String sChannel = null;
HashMap<AvailLookup, ArrayList<AvailLookup>> channel = null;
ArrayList<AvailLookup> device = null;
Sql obj = new Sql("plantavail");
obj.query("select j_channel.id as channelid, j_channel.name as channelname, j_device.id as deviceid, j_device.name as devicename, j_io.id as hostid, j_io.host as hostname, alias"
+ " from j_io"
+ " left join j_channel on j_io.id = j_channel.iofk"
+ " left join j_device on j_channel.iofk = j_device.id");
try {
while(obj.getResult().next()) {
sChannel = obj.getResult().getString("channelname");
sDevice = obj.getResult().getString("devicename");
sHost = obj.getResult().getString("hostname");
iChannel = obj.getResult().getInt("channelid");
iDevice = obj.getResult().getInt("deviceid");
iHost = obj.getResult().getInt("hostid");
channel = addChannel(tempData, iChannel, sChannel);
if (channel != null) {
device = addDevice(channel, iDevice, sDevice);
if (device != null) {
addHost(device, iHost, sHost);
}
}
}
} catch (SQLException e1) {
e1.printStackTrace();
}
data = tempData;
}
}

Be careful with accidentally overriding your existing map values. If you use java 8 you can use:
map.computeIfAbsent("entry", s -> new ArrayList<>());
Before Java 8 you need to check if the value is null:
List<String> list = map.get("entry");
if(list == null){
list = map.put("entry", new ArrayList<String>());
}
Also you need to make sure that you update your map correctly:
A little example:
Map<String, String> map = new HashMap<>();
String a = "a";
String b = "b";
map.put(a, b);
System.out.println(map.get(a));
b = "c";
System.out.println(map.get(a));
System.out.println(b);
The output is:
b
b
c
So you see if you update b the map does not get updated. Now the same thing with a map in a map:
final String a = "a";
final String b = "b";
Map<String, Map<String, String>> topMap = new HashMap<>();
Map<String, String> middleMap = topMap.getOrDefault(a, new HashMap<>());
middleMap.put(b, "c");
topMap.put("a", middleMap);
System.out.println(topMap.get(a).get(b));
middleMap.replace(b, "d");
System.out.println(topMap.get(a).get(b));
topMap.put("a", middleMap);
System.out.println(topMap.get(a).get(b));
The output is:
c
d
d
But why? Shouldn't it be 'c c d'? NO! Because a String in Java is immutable, but a Map is not. If you consider this you should be able to solve your problem.

You need to check if there is already a map for this key:
Map<...> result = data.get(val);
if(null == result) {
result = new HashMap();
data.put(val, result);
}
return out;
Without this, the second attempt to add values to the same key will overwrite the existing map instead of appending to it.

Related

Combining attributes in a class

I have the following custom class
class rollingD {
private String settDate;
private String publishingPeriodCommencingTime;
private String fuelTypeGeneration;
public String getSettDate() {
return settDate;
}
public void setSettDate(String settDate) {
this.settDate = settDate;
}
public String getPublishingPeriodCommencingTime() {
return publishingPeriodCommencingTime;
}
public void setPublishingPeriodCommencingTime(String publishingPeriodCommencingTime) {
this.publishingPeriodCommencingTime = publishingPeriodCommencingTime ;
}
public String getFuelTypeGeneration() {
return fuelTypeGeneration;
}
public void setFuelTypeGeneration(String fuelTypeGeneration) {
this.fuelTypeGeneration = fuelTypeGeneration;
}
#Override
public String toString() {
return String.format("%s,%s,%s",
settDate,
publishingPeriodCommencingTime,
fuelTypeGeneration);
}}
The items add to my array list as below
ArrayList<rollingD> aList = new ArrayList<>();
The attributes
settDate
and
publishingPeriodCommencingTime
are separate entities
01/04/2020
and
21:34:26
What i would like to do is within my class i want to combine my attributes before adding them to the array list
so i would end up with
01/04/2020 21:34:26
as a single attribute
I would therefore only have 2 attributes in my arraylist which i can then sort etc
Can someone provide assistance please.
I have tried streaming a map afterwards and combining the streams after but i realised that is not an ideal solution as i need to then work with the arraylist further down the line and ideally with datetimestamp and the value as my only two items
This is the code for parsing the API
while(parser.hasNext()) {
XMLEvent event = parser.nextEvent();
switch(event.getEventType()) {
case XMLStreamConstants.START_ELEMENT:
StartElement startElement = event.asStartElement();
String qName = startElement.getName().getLocalPart();
if (qName.equalsIgnoreCase("settDate")) {
rD = new rollingD(null,null,null);
bMarks = true;
} else if (qName.equalsIgnoreCase("publishingPeriodCommencingTime")) {
bLastName = true;
} else if (qName.equalsIgnoreCase("fuelTypeGeneration")) {
bNickName = true;
aList.add(rD);
}
break;
case XMLStreamConstants.CHARACTERS:
Characters characters = event.asCharacters();
if(bMarks) {
// System.out.println("settDate: " + characters.getData());
rD.getTimeStamp(characters.getData(),null,null);
bMarks = false;
}
if(bLastName) {
// System.out.println("publishingPeriodCommencingTime: " + characters.getData());
rD.getTimeStamp(null,characters.getData(),null);
bLastName = false;
}
if(bNickName) {
// System.out.println("fuelTypeGeneration: " + characters.getData());
rD.getTimeStamp(null,null,characters.getData());
bNickName = false;
}
break;
case XMLStreamConstants.END_ELEMENT:
EndElement endElement = event.asEndElement();
//List<String> namesList = aList.stream()
//.map(x->x.getSettDate()+" "+ x.getPublishingPeriodCommencingTime()+","+ x.getFuelTypeGeneration())
//.collect(Collectors.toList());
//Collections.sort(namesList);
//
//for (String name : namesList) {
//System.out.println(name);
//}
if(endElement.getName().getLocalPart().equalsIgnoreCase("item")) {
System.out.println();
}
break;
}
}
Do it as follows:
class RollingD {
private String settDate;
private String publishingPeriodCommencingTime;
private String fuelTypeGeneration;
private String timeStamp;
public RollingD(String settDate, String publishingPeriodCommencingTime, String fuelTypeGeneration) {
this.settDate = settDate;
this.publishingPeriodCommencingTime = publishingPeriodCommencingTime;
this.fuelTypeGeneration = fuelTypeGeneration;
timeStamp = settDate != null && publishingPeriodCommencingTime != null && !settDate.isEmpty()
&& !publishingPeriodCommencingTime.isEmpty() ? settDate + " " + publishingPeriodCommencingTime : "";
}
public String getTimeStamp() {
return settDate != null && publishingPeriodCommencingTime != null && !settDate.isEmpty()
&& !publishingPeriodCommencingTime.isEmpty() ? settDate + " " + publishingPeriodCommencingTime : "";
}
// ..Do not create any setter for timeStamp
// ..Other getters and setters
#Override
public String toString() {
return "RollingD [settDate=" + settDate + ", publishingPeriodCommencingTime=" + publishingPeriodCommencingTime
+ ", fuelTypeGeneration=" + fuelTypeGeneration + ", timeStamp=" + timeStamp + "]";
}
}
Demo:
public class Main {
public static void main(String[] args) {
RollingD rd1 = new RollingD("", "", "G");
System.out.println(rd1);
RollingD rd2 = new RollingD("01/04/2020", "", "G");
System.out.println(rd2);
RollingD rd3 = new RollingD("", "21:34:26", "G");
System.out.println(rd3);
RollingD rd4 = new RollingD("01/04/2020", "21:34:26", "G");
System.out.println(rd4);
}
}
Output:
RollingD [settDate=, publishingPeriodCommencingTime=, fuelTypeGeneration=G, timeStamp=]
RollingD [settDate=01/04/2020, publishingPeriodCommencingTime=, fuelTypeGeneration=G, timeStamp=]
RollingD [settDate=, publishingPeriodCommencingTime=21:34:26, fuelTypeGeneration=G, timeStamp=]
RollingD [settDate=01/04/2020, publishingPeriodCommencingTime=21:34:26, fuelTypeGeneration=G, timeStamp=01/04/2020 21:34:26]
The are some miss-concepts on your approach.
Do not need to do any combinations of parameters inside base object(or before adding to).
Just added as you did the objects on List Data Structure
Your issues is maybe: How to process further the list, based on stored-objects
properties.(eg: sorting based on names, date_hours,etc)
Here I strongly advise to search on List methods capabilities.(using a comparator, etc)

Xpages: send html email via java using backend document

I found this great Java Bean that allows you to send an html email including attachments via a managed java bean. It works as described when I use it directly form an Xpage.
However, I would like to use this in the backend in a scheduled agent. The problem I have run into is when I try to pass a document to the java bean. The bean is expecting (I think) an XSP document, which I don't have when in the back end, so it throws an error.
I thought I would just send the UNID of the document that I want and then change it so it would work with this bean, however, when I try to set the UNID I get an error:
Unknown member 'setUNID' in Java class 'com.scoular.utls.Email'
I am confused. Seems like this has something to do with a wrapped document, but don't understand.
Here is the faces-config:
<faces-config>
<managed-bean>
<managed-bean-name>Email</managed-bean-name>
<managed-bean-class>com.scoular.utls.Email</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
<managed-property>
<property-name>debugMode</property-name>
<value>true</value>
</managed-property>
</managed-bean>
</faces-config>
Here is a button I am using to test calling the method:
//Need to get email document
var emlView = database.getView("xpViewEmailsAll");
var emlDoc = emlView.getFirstDocument();
if (emlDoc != null) {
//try{
var subject = ""
var senderEmail = supEml
var senderName = supNme
Email.setSendTo("John");
Email.setSubject("subject");
Email.setSenderEmail("John#gmal.com");
Email.setUNID = emlDoc.getUniversalID();
Email.setSenderName("Sender");
//Email.setBackEndDocument(emlDoc);
Email.setFieldName("Body");
Email.send();
//}catch(e){
//print(e.getMessage());
//}
}
And here is the bean:
package com.scoular.utls;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.faces.context.FacesContext;
import lotus.domino.Database;
import lotus.domino.Document;
import lotus.domino.EmbeddedObject;
import lotus.domino.MIMEEntity;
import lotus.domino.MIMEHeader;
import lotus.domino.NotesException;
import lotus.domino.Session;
import lotus.domino.Stream;
import com.ibm.commons.util.NotImplementedException;
import com.ibm.domino.xsp.module.nsf.NotesContext;
import com.ibm.xsp.model.FileRowData;
import com.ibm.xsp.model.domino.wrapped.DominoDocument;
import com.ibm.xsp.model.domino.wrapped.DominoRichTextItem;
import com.ibm.xsp.model.domino.wrapped.DominoDocument.AttachmentValueHolder;
import com.ibm.xsp.persistence.PersistedContent;
public class Email {
private ArrayList<String> sendTo;
private ArrayList<String> ccList;
private ArrayList<String> bccList;
private String senderEmail;
private String senderName;
private String subject;
private DominoDocument document;
private String fieldName;
private String bannerHTML;
private String footerHTML;
private String unid;
private boolean debugMode = false;
private static final Pattern imgRegExp = Pattern.compile("<img[^>]+src\\s*=\\s*['\"]([^'\"]+)['\"][^>]*>");
// -------------------------------------------------------------------------
public Email() {
this.subject = "";
this.sendTo = new ArrayList<String>();
this.ccList = new ArrayList<String>();
this.bccList = new ArrayList<String>();
}
// -------------------------------------------------------------------------
public String getSendTo() {
if (this.isDebugMode()) {
System.out.println("getSendTo() : " + this.sendTo.toString());
}
return this.sendTo.toString().replace("[", "").replace("]", "");
}
public void setSendTo(final String sendTo) {
this.sendTo.add(sendTo);
}
// -------------------------------------------------------------------------
public String getCcList() {
if (this.isDebugMode()) {
System.out.println("getCcList() : " + this.ccList.toString());
}
return this.ccList.toString().replace("[", "").replace("]", "");
}
public void setCcList(final String ccList) {
this.ccList.add(ccList);
}
// -------------------------------------------------------------------------
public String getBccList() {
if (this.isDebugMode()) {
System.out.println("getBccList() : " + this.bccList.toString());
}
return this.bccList.toString().replace("[", "").replace("]", "");
}
public void setBccList(final String bccList) {
this.bccList.add(bccList);
}
// -------------------------------------------------------------------------
public String getSenderEmail() {
return this.senderEmail;
}
public void setSenderEmail(final String senderEmail) {
this.senderEmail = senderEmail;
}
// -------------------------------------------------------------------------
public String getSenderName() {
return this.senderName;
}
public void setSenderName(final String senderName) {
this.senderName = senderName;
}
// -------------------------------------------------------------------------
public String getSubject() {
return this.subject;
}
public void setSubject(final String subject) {
this.subject = subject;
}
// -------------------------------------------------------------------------
public boolean isDebugMode() {
return this.debugMode;
}
public void setDebugMode(final boolean debugMode) {
this.debugMode = debugMode;
}
// -------------------------------------------------------------------------
private Session getCurrentSession() {
NotesContext nc = NotesContext.getCurrentUnchecked();
return (null != nc) ? nc.getCurrentSession() : null;
}
// -------------------------------------------------------------------------
private Database getCurrentDatabase() {
NotesContext nc = NotesContext.getCurrentUnchecked();
return (null != nc) ? nc.getCurrentDatabase() : null;
}
// -------------------------------------------------------------------------
public void send() throws NotesException, IOException, Exception {
Session session = getCurrentSession();
Database database = getCurrentDatabase();
if (null != session && null != database && null != this.sendTo && null != this.subject
&& null != this.senderEmail) {
try {
if (this.isDebugMode()) {
System.out.println("Started send()");
}
session.setConvertMime(false);
Document emailDocument = database.createDocument();
MIMEEntity emailRoot = emailDocument.createMIMEEntity("Body");
if (null != emailRoot) {
MIMEHeader emailHeader = emailRoot.createHeader("Reply-To");
emailHeader.setHeaderVal(this.getSenderEmail());
emailHeader = emailRoot.createHeader("Return-Path");
emailHeader.setHeaderVal(this.getSenderEmail());
final String fromSender = (null == this.getSenderName()) ? this.getSenderEmail() : "\""
+ this.getSenderName() + "\" <" + this.getSenderEmail() + ">";
emailHeader = emailRoot.createHeader("From");
emailHeader.setHeaderVal(fromSender);
emailHeader = emailRoot.createHeader("Sender");
emailHeader.setHeaderVal(fromSender);
emailHeader = emailRoot.createHeader("To");
emailHeader.setHeaderVal(this.getSendTo());
if (!this.ccList.isEmpty()) {
emailHeader = emailRoot.createHeader("CC");
emailHeader.setHeaderVal(this.getCcList());
}
if (!this.bccList.isEmpty()) {
emailHeader = emailRoot.createHeader("BCC");
emailHeader.setHeaderVal(this.getBccList());
}
emailHeader = emailRoot.createHeader("Subject");
emailHeader.setHeaderVal(this.getSubject());
MIMEEntity emailRootChild = emailRoot.createChildEntity();
if (null != emailRootChild) {
final String boundary = System.currentTimeMillis() + "-" + this.document.getDocumentId();
emailHeader = emailRootChild.createHeader("Content-Type");
emailHeader.setHeaderVal("multipart/alternative; boundary=\"" + boundary + "\"");
MIMEEntity emailChild = emailRootChild.createChildEntity();
if (null != emailChild) {
final String contentAsText = this.document.getRichTextItem(this.fieldName)
.getContentAsText();
Stream stream = session.createStream();
stream.writeText(contentAsText);
emailChild.setContentFromText(stream, "text/plain; charset=\"UTF-8\"", MIMEEntity.ENC_NONE);
stream.close();
emailChild = emailRootChild.createChildEntity();
stream = session.createStream();
stream.writeText(this.getHTML());
emailChild.setContentFromText(stream, "text/html; charset=\"UTF-8\"", MIMEEntity.ENC_NONE);
stream.close();
stream.recycle();
stream = null;
}
// add embedded images....
final List<FileRowData> embeddedImages = this.getEmbeddedImagesList();
if (null != embeddedImages && !embeddedImages.isEmpty()) {
if (this.isDebugMode()) {
System.out.println("Adding Embedded Images...");
}
for (FileRowData embeddedImage : embeddedImages) {
emailRootChild = emailRoot.createChildEntity();
if (null != emailRootChild && embeddedImage instanceof AttachmentValueHolder) {
InputStream is = null;
try {
String persistentName = ((AttachmentValueHolder) embeddedImage)
.getPersistentName();
String cid = ((AttachmentValueHolder) embeddedImage).getCID();
emailHeader = emailRootChild.createHeader("Content-Disposition");
emailHeader.setHeaderVal("inline; filename=\"" + persistentName + "\"");
emailHeader = emailRootChild.createHeader("Content-ID");
emailHeader.setHeaderVal("<" + cid + ">");
is = this.getEmbeddedImageStream(persistentName);
Stream stream = session.createStream();
stream.setContents(is);
emailRootChild.setContentFromBytes(stream, embeddedImage.getType(),
MIMEEntity.ENC_IDENTITY_BINARY);
if (this.isDebugMode()) {
System.out.println("Added Embedded Image : " + persistentName);
}
} catch (IOException e) {
if (this.isDebugMode()) {
System.out.println("Adding Embedded Image failed : " + e.getMessage());
}
throw e;
} finally {
if (null != is) {
is.close();
is = null;
}
}
}
}
if (this.isDebugMode()) {
System.out.println("Completed Adding Embedded Images");
}
}
// add attachments....
final List<FileRowData> attachments = this.getDocument().getAttachmentList(this.getFieldName());
if (null != attachments && !attachments.isEmpty()) {
if (this.isDebugMode()) {
System.out.println("Adding Attachments...");
}
for (FileRowData attachment : attachments) {
emailRootChild = emailRoot.createChildEntity();
if (null != emailRootChild && attachment instanceof AttachmentValueHolder) {
InputStream is = null;
try {
String persistentName = ((AttachmentValueHolder) attachment)
.getPersistentName();
String cid = ((AttachmentValueHolder) attachment).getCID();
EmbeddedObject eo = this.getDocument().getDocument().getAttachment(
persistentName);
if (null != eo) {
emailHeader = emailRootChild.createHeader("Content-Disposition");
emailHeader.setHeaderVal("attachment; filename=\"" + persistentName + "\"");
emailHeader = emailRootChild.createHeader("Content-ID");
emailHeader.setHeaderVal("<" + cid + ">");
is = eo.getInputStream();
Stream stream = session.createStream();
stream.setContents(is);
emailRootChild.setContentFromBytes(stream, attachment.getType(),
MIMEEntity.ENC_IDENTITY_BINARY);
if (this.isDebugMode()) {
System.out.println("Added Attachment : " + persistentName);
}
}
} catch (Exception e) {
if (this.isDebugMode()) {
System.out.println("Adding Attachment failed : " + e.getMessage());
}
throw e;
} finally {
if (null != is) {
is.close();
is = null;
}
}
}
}
if (this.isDebugMode()) {
System.out.println("Completed Adding Attachments");
}
}
}
}
emailDocument.send();
session.setConvertMime(true);
if (this.isDebugMode()) {
System.out.println("Completed send()");
}
} catch (NotesException e) {
if (this.isDebugMode()) {
System.out.println("Failed send() with NotesException" + e.getMessage());
}
throw e;
} catch (IOException e) {
if (this.isDebugMode()) {
System.out.println("Failed send() with IOException" + e.getMessage());
}
throw e;
} catch (Exception e) {
if (this.isDebugMode()) {
System.out.println("Failed send() with Exception" + e.getMessage());
}
throw e;
}
}
}
// -------------------------------------------------------------------------
public DominoDocument getDocument() {
return this.document;
}
public void setDocument(final DominoDocument document) {
this.document = document;
}
// -------------------------------------------------------------------------
// -------------------------------------------------------------------------
public String getFieldName() {
return this.fieldName;
}
public void setFieldName(final String fieldName) {
this.fieldName = fieldName;
}
// -------------------------------------------------------------------------
public List<FileRowData> getEmbeddedImagesList() throws NotesException {
if (null != document && null != fieldName) {
return document.getEmbeddedImagesList(fieldName);
}
return null;
}
// -------------------------------------------------------------------------
private InputStream getEmbeddedImageStream(final String fileName) throws NotesException, IOException {
if (null != document && null != fieldName && null != fileName) {
final DominoRichTextItem drti = document.getRichTextItem(fieldName);
if (null != drti) {
final PersistedContent pc = drti.getPersistedContent(FacesContext.getCurrentInstance(), fieldName,
fileName);
if (null != pc) {
return pc.getInputStream();
}
}
}
return null;
}
// -------------------------------------------------------------------------
public String getHTML() {
StringBuffer html = new StringBuffer();
html.append(getBannerHTML());
html.append(getBodyHTML());
html.append(getFooterHTML());
return html.toString();
}
// -------------------------------------------------------------------------
public String getBannerHTML() {
return this.bannerHTML;
}
public void setBannerHTML(final String bannerHTML) {
this.bannerHTML = bannerHTML;
}
// -------------------------------------------------------------------------
public String getBodyHTML() {
if (null != document && null != fieldName) {
if (this.isDebugMode()) {
System.out.println("Started getBodyHTML()");
}
final DominoRichTextItem drti = document.getRichTextItem(fieldName);
if (null != drti) {
try {
String html = drti.getHTML();
if (null != html) {
final List<FileRowData> fileRowDataList = document.getEmbeddedImagesList(fieldName);
if (null != fileRowDataList) {
final Matcher matcher = imgRegExp.matcher(html);
while (matcher.find()) {
String src = matcher.group();
final String srcToken = "src=\"";
final int x = src.indexOf(srcToken);
final int y = src.indexOf("\"", x + srcToken.length());
final String srcText = src.substring(x + srcToken.length(), y);
for (FileRowData fileRowData : fileRowDataList) {
final String srcImage = fileRowData.getHref();
final String cidImage = ((AttachmentValueHolder) fileRowData).getCID();
if (srcText.endsWith(srcImage)) {
final String newSrc = src.replace(srcText, "cid:" + cidImage);
html = html.replace(src, newSrc);
if (this.isDebugMode()) {
System.out.println("CID referenced image: " + srcText + " with CID:"
+ cidImage);
}
}
}
}
}
}
if (this.isDebugMode()) {
System.out.println("Completed getBodyHTML() : " + html);
}
return html;
} catch (Exception e) {
if (this.isDebugMode()) {
System.out.println("Failed getBodyHTML() : " + e.getMessage());
}
}
}
}
return null;
}
public void setBodyHTML(final String bodyHTML) throws NotImplementedException {
if (this.isDebugMode()) {
System.out.println("Method setBodyHTML(string) is not permitted");
}
throw new NotImplementedException();
}
// -------------------------------------------------------------------------
public String getFooterHTML() {
return this.footerHTML;
}
public void setFooterHTML(final String footerHTML) {
this.footerHTML = footerHTML;
}
public String getUnid() {
return unid;
}
public void setUnid(final String unid) {
this.unid = unid;
}
// -------------------------------------------------------------------------
} // end EmailBean
The Email.setUNID statement is wrong. Try:
Email.setUnid(emlDoc.getUniversalID());

Having Error while recurssing though A list of Objects that contains another List

I have a class in Java which has an object
List<GroupNavigationItemSRO> children
Now Every GroupNaviagationItemSRO has the same List
List<GroupNavigationItemSRO> children
NOw i want to iterate through every GroupNavigationSRO and populate a List of String . Currently i am trying to do that like this
void getNavItems(List<GroupNavigationItemSRO> items,List<String> nitems){
System.out.println("PRINT");
for(GroupNavigationItemSRO item : items) {
nitems.add(item.getUrl());
System.out.println(item.getUrl());
// g.add(item.getUrl());
System.out.println("PRINT");
List<GroupNavigationItemSRO> nextItem = item.getChildren();
if (nextItem != null && nextItem.size()>0) {
getNavItems(nextItem,nitems);
}
}
}
When i only print the objects ,it doesn't give any errors But as soon as i try and add to the List the recurssion stops
nitems.add(item.getUrl())
Why is this happening . Here's the entire java file in case its helpful
#Service("labelSearchService")
public class LabelSearchServiceImpl extends AbstractSearchService {
private static final String version = SearchVersion.VERSION_2.getValue();
private static final Logger LOG = LoggerFactory.getLogger(LabelSearchServiceImpl.class);
private static final String EXPIRY_SET = "expiry";
private static final String DATA_SET = "data";
#Autowired
#Qualifier("searchServiceFactory")
private ISearchServiceFactory searchServiceFactory;
#Autowired
IAerospikeTopSellingBrandsCacheService topSellingBrandsCacheService;
#Autowired
private LabelSearchCacheServiceImplFactory labelSearchCacheServiceImplFactory;
#Autowired
AerospikeGuidedResponse aerospikeGuidedResponse ;
List<String> g = null;
#Override
public SearchSRO getSolrResponse(KeyGenerator keyGenerator, String queryFromBrowser, String searchTerm, Integer productCategoryId, int start, int number, String sortBy,
String userZone, String vertical, String clickSrc, boolean isSpellCheckEnabled, String categoryURL, boolean isNested) throws SearchException, ShardNotFoundException, IllegalAccessException {
String originalKeyword = searchTerm;
searchTerm = SearchUtils.modifySearchTerm(searchTerm);
SearchSRO sro = new SearchSRO();
boolean isPartialSearch = SearchUtils.isPartialSearchEnabled();
keyGenerator.setPartialSearch(SearchUtils.isPartialSearchEnabled());
LabelNodeSRO labelNode = SearchUtils.getLabelNodeByNodePath(categoryURL);
// for 'ALL' categories labelNode would be null.
LOG.info("categoryURL : " + categoryURL);
if (ALL.equals(categoryURL)) {
if (number == 0 && !CacheManager.getInstance().getCache(SearchConfigurationCache.class).getBooleanProperty(SearchProperty.ALLOW_ZERO_RESULT_REQUESTS)) {
return new SearchSRO();
}
sro = labelSearchCacheServiceImplFactory.getSearchCacheServiceImpl().getSearchBinResultsForAllLabels(keyGenerator, queryFromBrowser, searchTerm, labelNode, start, number, sortBy, userZone, vertical,
isPartialSearch, isSpellCheckEnabled, originalKeyword, false, isNested);
} else if (labelNode != null) {
sro = getSearchProducts(keyGenerator, queryFromBrowser, searchTerm, null, null, labelNode, start, number, sortBy, userZone, isPartialSearch, isSpellCheckEnabled,
originalKeyword, isNested, false,categoryURL);
} else {
throw new SearchException("Search was hit without selecting any category");
}
// this is the minimum number to results that should match for results to be shown on 'people who search this bought this widget'
SearchConfigurationCache cache = CacheManager.getInstance().getCache(SearchConfigurationCache.class);
if ((ClickSourceType.PWSTBT_WIDGET.getValue()).equalsIgnoreCase(clickSrc) && sro.getNoOfMatches() < cache.getIntegerProperty(SearchProperty.BEST_SELLER_MINIMUM_RESULTS)) {
LOG.info("The minimum number of results to match for PWSTBT widget are " + cache.getIntegerProperty(SearchProperty.BEST_SELLER_MINIMUM_RESULTS)
+ " but number of matched results are " + sro.getNoOfMatches());
sro = new SearchSRO();
}
return sro;
}
#Override
public SearchSRO getSolrResponseForMobile(KeyGenerator keyGenerator, String queryFromBrowser, String searchTerm, Integer productCategoryId, int start, int number,
String sortBy, String userZone, String vertical, String clickSrc, boolean isBinSearch, int noOfResultsPerBin, boolean isSpellCheckEnabled, boolean isPartialSearch,
String categoryURL) throws SearchException, ShardNotFoundException, IllegalAccessException {
String originalKeyword = searchTerm;
searchTerm = SearchUtils.modifySearchTerm(searchTerm);
SearchSRO sro = new SearchSRO();
isPartialSearch = isPartialSearch && SearchUtils.isPartialSearchEnabled();
// this is to disable partial search in case of PWSTBT
if (ClickSourceType.PWSTBT_WIDGET.getValue().equalsIgnoreCase(clickSrc)) {
isPartialSearch = false;
}
LabelNodeSRO labelNode = SearchUtils.getLabelNodeByNodePath(categoryURL);
// for 'ALL' categories labelNode would be null
if (ALL.equals(categoryURL)) {
if (number == 0 && !CacheManager.getInstance().getCache(SearchConfigurationCache.class).getBooleanProperty(SearchProperty.ALLOW_ZERO_RESULT_REQUESTS)) {
return new SearchSRO();
}
// Response for Search result page in mobile - same as web.
sro = labelSearchCacheServiceImplFactory.getSearchCacheServiceImpl().getSearchBinResultsForAllLabels(keyGenerator, queryFromBrowser, searchTerm, labelNode, start, number, sortBy, userZone, vertical,
isPartialSearch, isSpellCheckEnabled, originalKeyword, true, false);
} else if (labelNode != null) {
sro = getSearchProducts(keyGenerator, queryFromBrowser, searchTerm, null, null, labelNode, start, number, sortBy, userZone, isPartialSearch, isSpellCheckEnabled,
originalKeyword, false, true,categoryURL);
} else {
throw new SearchException("Search was hit without selecting any category");
}
// this is the minimum number to results that should match for results to be shown on 'people who search this bought this widget'
SearchConfigurationCache cache = CacheManager.getInstance().getCache(SearchConfigurationCache.class);
if ((ClickSourceType.PWSTBT_WIDGET.getValue()).equalsIgnoreCase(clickSrc) && sro.getNoOfMatches() < cache.getIntegerProperty(SearchProperty.BEST_SELLER_MINIMUM_RESULTS)) {
LOG.info("The minimum number of results to match for PWSTBT widget are " + cache.getIntegerProperty(SearchProperty.BEST_SELLER_MINIMUM_RESULTS)
+ " but number of matched results are " + sro.getNoOfMatches());
sro = new SearchSRO();
}
return sro;
}
#Autowired
private IUserPersonaSegmentService personaSegmentService;
#Autowired
private IContextHolder<SearchRequestContext> ctxProvider;
private boolean isClientPersonaEnabled(SearchRequestContext ctx) {
SearchConfigurationCache cache = CacheManager.getInstance().getCache(SearchConfigurationCache.class);
String clientsEnabled = cache.getProperty(SearchProperty.PERSONA_CLIENTS_ENABLED);
String client = ctx.req.getContextSRO().getAppIdent();
return !StringUtils.isEmpty(client) && !StringUtils.isEmpty(clientsEnabled) && Pattern.matches("(?i).*\\b" + client + "\\b.*", clientsEnabled);
}
protected UserSegmentDTO setupPersonalizationContext(LabelNodeSRO labelNode, String searchTerm, String sortBy) {
SearchRequestContext ctx = ctxProvider.getContext();
if (ctx == null || ctx.req == null) {
LOG.warn("No Request Context found");
return null;
}
SearchConfigurationCache cache = CacheManager.getInstance().getCache(SearchConfigurationCache.class);
// check if Personalization is enabled
if (labelNode == null || !cache.getBooleanProperty(SearchProperty.PERSONA_SEARCH_ENABLED) || StringUtils.isEmpty(searchTerm)
|| !SolrSortCategory.RELEVANCY.getValue().equalsIgnoreCase(sortBy) || !isClientPersonaEnabled(ctx)) {
LOG.debug("Personalization not enabled");
return null;
}
LOG.info("Trying to set up personalization context");
// setup the context for later use
ctx.personaSegments = personaSegmentService.getUserSegments(ctx.req.getUserTrackingId(), labelNode.getNodePath());
return ctx.personaSegments;
}
#Override
public SearchSRO getSearchProducts(KeyGenerator keyGenerator, String queryFromBrowser, String searchTerm, Integer campaignId, ProductCategorySRO pc, LabelNodeSRO labelNode,
int start, int number, String sortBy, String userZone, boolean isPartialSearch, boolean isSpellCheckEnabled, String originalKeyword, boolean isNested, boolean isMobile,String categoryURL)
throws SearchException, ShardNotFoundException, IllegalAccessException {
LOG.info("------------------Product category page---------------");
// build cache key considering campaign id
keyGenerator.setCampaignId(String.valueOf(campaignId));
// Search results will vary based on isNested flag even for exact same keywords hence, when we cache
// we cache both results with different key
keyGenerator.setNested(isNested);
SearchConfigurationCache cache = CacheManager.getInstance().getCache(SearchConfigurationCache.class);
LOG.info("sortBy : " + sortBy + ", personalization Enabled : " + cache.getBooleanProperty(SearchProperty.PERSONA_SEARCH_ENABLED) + ", labelNode : " + labelNode);
// try to set persona context
keyGenerator.setPersonaSegment(setupPersonalizationContext(labelNode, searchTerm, sortBy));
SearchSRO searchSRO = labelSearchCacheServiceImplFactory.getSearchCacheServiceImpl().getSearchProducts(keyGenerator, queryFromBrowser, searchTerm, campaignId, pc, labelNode, start, number, sortBy, userZone, isPartialSearch,
isSpellCheckEnabled, originalKeyword, isNested, isMobile,categoryURL);
/*SearchCoreContext coreContext = CoreContextHolderThreadLocal.getContext();
if (coreContext != null) {
if (coreContext.getCategoryUrlUsed().equalsIgnoreCase("ALL")) {
String cacheKey = keyGenerator.buildKey();
try {
final AerospikeClient aClient = AerospikeClientFactory.getInstance();
LOG.info("Clearing Cache as Category redirected was ambiguous so redirected to ALL and removing key " + cacheKey);
aClient.delete(null, new Key("search", EXPIRY_SET, cacheKey));
aClient.delete(null, new Key("search", DATA_SET, cacheKey));
} catch (AerospikeException e) {
e.printStackTrace();
}
}
}*/
return searchSRO;
}
#Override
public FilterListSRO getFiltersForProducts(Integer categoryId, Integer campaignId, String q, String keyword, boolean partialSearch, boolean isBrand, String categoryUrl,
String userZone, HyperlocalCriteria hyperlocalCriteria, Set<Integer> pinCodes, GetFiltersRequest request) throws SearchException, ShardNotFoundException {
String key = new KeyGenerator(String.valueOf(categoryId), String.valueOf(campaignId), q, keyword, partialSearch, null, categoryUrl, version, userZone, hyperlocalCriteria, pinCodes).buildFilterKey();
if (campaignId != null) {
LOG.info("Get Filters for Campaign Products wrt : " + key);
}
FilterListSRO filterListSRO = labelSearchCacheServiceImplFactory.getSearchCacheServiceImpl().getFiltersForProducts(key, categoryId, campaignId, q, keyword, partialSearch, isBrand, categoryUrl, userZone, hyperlocalCriteria, pinCodes,request);
return filterListSRO;
}
#Override
public FilterListSRO getFiltersForProducts(Integer categoryId, Integer campaignId, String q, String keyword,
boolean partialSearch, boolean isBrand, String categoryUrl, String userZone,
HyperlocalCriteria hyperlocalCriteria, Set<Integer> pinCodes)
throws SearchException, ShardNotFoundException {
return getFiltersForProducts(categoryId, campaignId, q, keyword, partialSearch, isBrand, categoryUrl, userZone, hyperlocalCriteria, pinCodes,null);
}
#Override
public FilterListSRO getFilterValuesForFilter(String categoryId, String campaignId, String q, String keyword, boolean partialSearch, String filterName, String fullQ,
String categoryUrl, String[] filtersToFetch, String userZone, HyperlocalCriteria hyperlocalCriteria, Set<Integer> pinCodes) throws SearchException, NumberFormatException, ShardNotFoundException {
String uniqueFilterKey = new KeyGenerator(categoryId, campaignId, q, keyword, partialSearch, filterName, categoryUrl, version, userZone, hyperlocalCriteria, pinCodes).buildFilterKey();
String[] filterNames = filterName.split(",");
FilterListSRO filterListSRO = labelSearchCacheServiceImplFactory.getSearchCacheServiceImpl().getFilterValuesForFilter(uniqueFilterKey, categoryId, campaignId, q, keyword, partialSearch, filterNames, categoryUrl, filtersToFetch,
userZone, hyperlocalCriteria, pinCodes);
/*SearchCoreContext coreContext = CoreContextHolderThreadLocal.getContext();
if (coreContext != null) {
if (coreContext.getCategoryUrlUsed().equalsIgnoreCase("ALL")) {
String cacheKey = uniqueFilterKey.concat(".FilterSRO");
try {
final AerospikeClient aClient = AerospikeClientFactory.getInstance();
LOG.info("Clearing Cache as Category redirected was ambiguous so redirected to ALL and removing key " + cacheKey);
aClient.delete(null, new Key("search", EXPIRY_SET, cacheKey));
aClient.delete(null, new Key("search", DATA_SET, cacheKey));
} catch (AerospikeException e) {
e.printStackTrace();
}
}
}*/
return filterListSRO;
}
#Override
public GroupNavigationSRO getGroupNavigation(KeyGenerator keyGenerator, String keyword, String q, String categoryUrl, Integer campaignId, boolean isSpellCheck, String userZone) throws IllegalAccessException {
GroupNavigationSRO sro = new GroupNavigationSRO();
try {
ProductCategoryCache categoryCache = CacheManager.getInstance().getCache(ProductCategoryCache.class);
LabelNodeSRO labelNode = ALL.equals(categoryUrl) ? null : categoryCache.getLabelForLabelPath(categoryUrl);
if (!ALL.equals(categoryUrl) && labelNode == null) {
LOG.error("Invalid label : " + categoryUrl);
return null;
}
// try to setup persona context - using sort to relevancy since group left nav doesn't change with sortBy
keyGenerator.setPersonaSegment(setupPersonalizationContext(labelNode, keyword, SolrSortCategory.RELEVANCY.getValue()));
sro = labelSearchCacheServiceImplFactory.getSearchCacheServiceImpl().getGroupNavigation(keyGenerator, keyword, q, categoryUrl, campaignId, isSpellCheck, userZone);
/*SearchCoreContext coreContext = CoreContextHolderThreadLocal.getContext();
if (coreContext != null) {
if (coreContext.getCategoryUrlUsed().equalsIgnoreCase("ALL")) {
String cacheKey = keyGenerator.buildKey().concat(".GroupNavigationSRO");
try {
final AerospikeClient aClient = AerospikeClientFactory.getInstance();
LOG.info("Clearing Cache as Category redirected was ambiguous so redirected to ALL and removing key " + cacheKey);
aClient.delete(null, new Key("search", EXPIRY_SET, cacheKey));
aClient.delete(null, new Key("search", DATA_SET, cacheKey));
} catch (AerospikeException e) {
e.printStackTrace();
}
}
}*/
} catch (SearchException e) {
LOG.error("Error in fetching GroupSRO: ", e);
}
return sro;
}
#Override
public QueryResponse setCategoryFilterQueryAndExecute(SearchCriteria sc, Integer id) throws SearchException {
labelSearchCacheServiceImplFactory.getSearchCacheServiceImpl().setCategoryFilterQuery(sc, id);
return labelSearchCacheServiceImplFactory.getSearchCacheServiceImpl().executeQuery(sc.buildQuery(), id);
}
#Override
public Long getProductCategoryCount(Integer categoryId, String categoryUrl) {
Long count = CacheManager.getInstance().getCache(ProductCategoryCache.class).getCategoryCountByUrl(categoryUrl);
if (count == null) {
count = new Long(0);
}
LOG.info("Product Category Counts for CategoryUrl: " + categoryUrl + " = " + count);
return count;
}
#Override
public List<TopSellingProductCategorySRO> getTopSellingProductsforCategories(List<Integer> categoryIds, List<String> categoryUrls) {
List<TopSellingProductCategorySRO> topSellingProductCategorySROs = new ArrayList<TopSellingProductCategorySRO>();
for (String categoryUrl : categoryUrls) {
try {
TopSellingProductCategorySRO topSellingProductCategorySRO = null;
Integer searchId = ShardResolverService.getSearchIdByLabel(categoryUrl);
QueryResponse rsp = searchServiceFactory.getSearchService(SearchVersion.VERSION_2.getValue()).getTopProductsInfoById(searchId,
CacheManager.getInstance().getCache(SearchConfigurationCache.class).getIntegerProperty(SearchProperty.MAX_TOP_SELLING_PRODUCTS_PER_CATEGORY));
List<Long> pogIds = SearchUtils.extractTopProductsByCategoryId(rsp);
if (pogIds != null && !pogIds.isEmpty()) {
topSellingProductCategorySRO = new TopSellingProductCategorySRO(categoryUrl, pogIds);
topSellingProductCategorySROs.add(topSellingProductCategorySRO);
}
} catch (Exception e) {
LOG.error("Unable to get Top Selling Products for categoryId: " + categoryUrl + ", Exception:" + e.getMessage());
}
}
return topSellingProductCategorySROs;
}
#Override
public List<TopSellingBrandSRO> getTopSellingBrandsforCategories(List<Integer> categoryIds, List<String> categoryUrls) {
List<TopSellingBrandSRO> topSellingBrandSROs = new ArrayList<TopSellingBrandSRO>();
for (String categoryUrl : categoryUrls) {
TopSellingBrandSRO topSellingBrandSRO = topSellingBrandsCacheService.getTopSellingBrandsByUrl(categoryUrl);
if (topSellingBrandSRO != null) {
topSellingBrandSROs.add(topSellingBrandSRO);
}
}
return topSellingBrandSROs;
}
#Override
public List<TopSellingBrandSRO> getAllTopSellingProducts(){
List<TopSellingBrandSRO> topSellingBrandSROs = topSellingBrandsCacheService.getAllTopSellingProducts();
return topSellingBrandSROs;
}
#Override
public FacetSRO getFacets(String cachekey, String keyword, String queryFieldName, String[] facetFields, Map<String, List<String>> filterMap, int number) throws SearchException {
// update values for mainCategoryXpath & categoryXpath fields
/*if(SolrFields.CATEGORY_XPATH.equals(queryFieldName) || SolrFields.MAIN_CATEGORY_XPATH.equals(queryFieldName)) {
String labelPath = SearchUtils.getLabelPathByUrl(keyword);
keyword = String.valueOf(ShardResolverService.getSearchIdByLabel(labelPath));
}*/
for (String filterField : filterMap.keySet()) {
if (SolrFields.CATEGORY_XPATH.equals(filterField) || SolrFields.MAIN_CATEGORY_XPATH.equals(filterField)) {
List<String> searchIds = new ArrayList<String>();
for (String val : filterMap.get(filterField)) {
String labelPath = SearchUtils.getLabelPathByUrl(val);
searchIds.add(String.valueOf(ShardResolverService.getSearchIdByLabel(labelPath)));
}
filterMap.put(filterField, searchIds);
}
}
return labelSearchCacheServiceImplFactory.getSearchCacheServiceImpl().getFacets(cachekey, keyword, queryFieldName, facetFields, filterMap, number);
}
#Override
public FilterListSRO getSRPFilters(KeyGenerator keyGenerator, String q, String keyword, boolean partialSearch, String categoryUrl, String userZone, HyperlocalCriteria hyperlocalCriteria, Set<Integer> pinCodes) throws SearchException {
if (StringUtils.isEmpty(keyword)) {
LOG.error("Invalid parameters.");
return null;
}
keyword = SearchUtils.modifySearchTerm(keyword);
if (StringUtils.isEmpty(keyword)) {
LOG.info(" Returning empty filters for empty keyword.");
return new FilterListSRO();
}
return labelSearchCacheServiceImplFactory.getSearchCacheServiceImpl().getSRPFilters(keyGenerator.buildKey(), q, keyword, partialSearch, categoryUrl, userZone, hyperlocalCriteria, pinCodes);
}
#Override
public SearchSRO getSearchProducts(KeyGenerator keyGenerator, String queryFromBrowser, String searchTerm,
Integer campaignId, ProductCategorySRO pc, LabelNodeSRO labelNode, int start, int number, String sortBy,
String userZone, boolean isPartialSearch, boolean isSpellCheckEnabled, String originalKeyword,
boolean isNested, boolean isMobile) throws SearchException, ShardNotFoundException, IllegalAccessException {
// TODO Auto-generated method stub
return getSearchProducts(keyGenerator, queryFromBrowser, searchTerm, campaignId, pc, labelNode, start, number, sortBy, userZone, isPartialSearch, isSpellCheckEnabled, originalKeyword, isNested, isMobile, null);
}
#Override
public String getmodelSearch(String query, String type) throws SearchException {
return labelSearchCacheServiceImplFactory.getSearchCacheServiceImpl().getmodelSearch(query, type);
}
#Override
public String classifierResponse(String query, String type) throws SearchException {
try {
return labelSearchCacheServiceImplFactory.getSearchCacheServiceImpl().getClassifierResponse(query, type);
} catch (JsonGenerationException e) {
return e.getMessage();
} catch (JsonMappingException e) {
return e.getMessage();
} catch (IOException e) {
return e.getMessage();
}
}
public GetGuidedSearchResponse getGuides(String query, String url) {
if(!StringUtils.isEmpty(query) && !StringUtils.isEmpty(url) && url.equalsIgnoreCase("ALL"))
{
KeyGenerator keyGenerator = new KeyGenerator();
keyGenerator.setQ("sNapDeAl.sEarcH.getGuides=" +"##"+ query+ "##"+ url);
return labelSearchCacheServiceImplFactory.getSearchCacheServiceImpl().getGuides(keyGenerator, query, url);
}
return null;
}
public GetGuidedSearchResponse getFilteredGuides(String query ,GetGroupLeftNavResponse leftNavBarResponse) {
g=null;
GroupNavigationSRO groups = leftNavBarResponse.getGroups();
List<GroupNavigationItemSRO> items = groups.getItems() ;
// List<String> nitems = getNavItems(items);
List<String> nitems = null;
getNavItems(items,nitems);
System.out.println("SIZE" + nitems.size());
List<String> navItems = new ArrayList<String>();
System.out.println("GETTING GUIDED FILE FROM AEROSPIKE");
List<String> guideItems = aerospikeGuidedResponse.getGuides(query);
//HashMap<String,String> nodeUrlMapping = new HashMap<String,String>();
if(guideItems.isEmpty())
{
System.out.println("\n\n\n\n" + "EMPTY GUIDED" + " \n\n\n\n\n");
}
guideItems.set(0, guideItems.get(0).trim());
System.out.println("GUIDED RESPONSE");
for(int i=0 ; i < guideItems.size() ;i ++)
{
System.out.println(guideItems.get(i));
}
/*for (int i =0 ;i < items.size() ;i++) {
List<GroupNavigationItemSRO> children_items = items.get(i).getChildren();
String s = items.get(i).getNodePath();
String m = items.get(i).getUrl();
System.out.println(s + " " + m);
navItems.add(m);
//nodeUrlMapping.put(s,m);
for (int j=0;j<children_items.size();j++) {
String r = children_items.get(j).getNodePath();
String n = children_items.get(j).getUrl();
System.out.println(r +" " + n);
// nodeUrlMapping.put(r,n);
navItems.add(n);
}
}*/
System.out.println("ITEM RESPONSE");
//navItems = g ;
for(int i=0 ; i < navItems.size() ;i ++)
{
System.out.println(navItems.get(i));
}
List<String> filteredGuides = new ArrayList<String>();
for(int i=0 ; i < guideItems.size() ;i++)
{
if(navItems.contains(guideItems.get(i)))
filteredGuides.add(guideItems.get(i));
else {
}
}
System.out.println("NAV ITEMS" + navItems.size() + navItems.toString());
System.out.println("GUIDE ITEMS" + filteredGuides.size() + filteredGuides.toString());
List<WidgetEntity> entities = new ArrayList<WidgetEntity>();
/* Iterator it = nodeUrlMapping.entrySet().iterator();
while (it.hasNext()) {
Map.Entry pair = (Map.Entry)it.next();
System.out.println(pair.getKey() + " = " + pair.getValue());
}*/
for(int i=0;i<filteredGuides.size();i++)
{
String guide = filteredGuides.get(i);
guide = guide.trim();
System.out.println(guide);
LabelNodeSRO labelSRO = getLableSRO(guide);
System.out.println(labelSRO.toString() + guide);
WidgetEntity entity = new WidgetEntity();
entity.setId(labelSRO.getUrl());
entity.setName(labelSRO.getDisplayName());
entity.setType("category");
entities.add(entity);
}
System.out.println("ENTITIES DEtails" );
GetGuidedSearchResponse response = new GetGuidedSearchResponse();
for(int i =0 ;i<entities.size();i++)
{
System.out.println(entities.get(i).getId() + entities.get(i).getName() + entities.get(i).getType());
// System.out.println(nodeUrlMapping.get(entities.get(i).getId()));
}
response.setEntities(entities);
return response;
}
LabelNodeSRO getLableSRO(String guide)
{
System.out.println(guide + "GET");
LabelNodeSRO label =SearchUtils.getLabelNodeByNodePath(guide);
return label;
}
void getNavItems(List<GroupNavigationItemSRO> items,List<String> nitems){
System.out.println("PRINT");
for(GroupNavigationItemSRO item : items) {
nitems.add(item.getUrl());
System.out.println(item.getUrl());
// g.add(item.getUrl());
System.out.println("PRINT");
List<GroupNavigationItemSRO> nextItem = item.getChildren();
if (nextItem != null && nextItem.size()>0) {
getNavItems(nextItem,nitems);
}
}
}
}
You could try something like this, when you return a list with all Strings, and if there are no more elments stop the recursivity and returns an empty list
List<String> getNavItems(List<GroupNavigationItemSRO> items){
List<String> results = new ArrayList();
System.out.println("PRINT");
if(items != null && !items.isEmpty()){
for(GroupNavigationItemSRO item : items) {
results.add(item.getUrl());
System.out.println(item.getUrl());
// g.add(item.getUrl());
System.out.println("PRINT");
results.addAll(getNavItems(item.getChildren()));
}
}
}
return results;
}
In getFilteredGuides() method you're passing nitems as null and this would cause NullPointerException.
Just Pass it as the following:
List<String> nitems = new ArrayList<String>();
getNavItems(items,nitems);
Or you can add a check for null inside getNavItems() method and initialize it accordingly:
void getNavItems(List<GroupNavigationItemSRO> items,List<String> nitems){
if(nitems == null)
{
nitems = new ArrayList<String>();
}
System.out.println("PRINT");
for(GroupNavigationItemSRO item : items) {
nitems.add(item.getUrl());
System.out.println(item.getUrl());
// g.add(item.getUrl());
System.out.println("PRINT");
List<GroupNavigationItemSRO> nextItem = item.getChildren();
if (nextItem != null && nextItem.size()>0) {
getNavItems(nextItem,nitems);
}
}
}

Getting exception on PostUrlBuilder when build post URL for Volley Custom post request with array parameter with normal param

I am trying to build a post URL for Volley custom request to post some data to server using post method with normal param and array param. But I get some exception when build the post url for request. I am getting exception before make a request with volley custom request.
Map<String, String> params = new HashMap<>();
params.put(API.Parameter.ANDROID_DEVICE_ID, appManager.getDeviceId());
params.put(API.Parameter.ANDROID_APP_VERSION, appManager.getAppVersion());
params.put("trip_no", MainActivity.temp_trip_id);
Map<String, List<String>> arrayParams = new HashMap<>();
arrayParams.put("ticket_id",ticket_id);
arrayParams.put("ticket_name",ticket_name);
arrayParams.put("ticket_price_each",ticket_price_each);
PostUrlBuilder urlBuilder = new PostUrlBuilder(API.BOOK_TRIP_API_URL, params, arrayParams);
String Url = urlBuilder.getQueryUrl();
ObjectRequest<OnlineUserData> onlineUserDataObjectRequest = new ObjectRequest<OnlineUserData>(Request.Method.POST, Url, null,
new Response.Listener<OnlineUserData>() {
#Override
public void onResponse(OnlineUserData response) {
}
}, new Response.ErrorListener() {
#Override
public void onErrorResponse(VolleyError error) {
}
}, OnlineUserData.class);
AppController.getInstance().addToRequestQueue(onlineUserDataObjectRequest);
My PostUrlBuilder.java class is:
public class PostUrlBuilder {
private static final String TAG = PostUrlBuilder.class.getSimpleName();
private String url;
private Map<String, String> parameters;
private Map<String, List<String>> arrayParameters;
private String queryUrl;
public PostUrlBuilder() {
}
public PostUrlBuilder(String url, Map<String, String> parameters, Map<String, List<String>> arrayParameters) {
this.url = url;
this.parameters = parameters;
this.arrayParameters = arrayParameters;
buildQueryUrl();
}
public PostUrlBuilder(Map<String, String> parameters, String url) {
this.parameters = parameters;
this.url = url;
}
private void buildQueryUrl() {
StringBuilder urlBuilder = new StringBuilder(url);
if (parameters != null && parameters.size() != 0) {
urlBuilder.append("?");
int i = 0;
for (String key : parameters.keySet()) {
String value = parameters.get(key);
Log.d(TAG, "key= " + key + " & " + "value=" + value);
try {
urlBuilder.append(String.format("%s=%s", key, URLEncoder.encode(value, "UTf-8")));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
i++;
if (i != parameters.size()) {
urlBuilder.append("&");
}
}
}
if (arrayParameters != null && arrayParameters.size() != 0) {
if (parameters != null && parameters.size() != 0) {
urlBuilder.append("&");
} else {
urlBuilder.append("?");
}
int i = 0;
for (String key : arrayParameters.keySet()) {
List<String> values = arrayParameters.get(key);
int j = 0;
for (String value : values) {
Log.d(TAG, "size = " + values.size() + " j = " + j + " key= " + key + " & " + "value=" + value);
try {
urlBuilder.append(String.format("%s[]=%s", key, URLEncoder.encode(value, "UTf-8")));
j++;
if (j != values.size()) {
urlBuilder.append("&");
}
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
i++;
if (i != arrayParameters.size()) {
urlBuilder.append("&");
}
}
}
queryUrl = urlBuilder.toString();
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public Map<String, String> getParameters() {
return parameters;
}
public void setParameters(Map<String, String> parameters) {
this.parameters = parameters;
}
public String getQueryUrl() {
return queryUrl;
}
public void setQueryUrl(String queryUrl) {
this.queryUrl = queryUrl;
}
public Map<String, List<String>> getArrayParameters() {
return arrayParameters;
}
public void setArrayParameters(Map<String, List<String>> arrayParameters) {
this.arrayParameters = arrayParameters;
}
#Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof PostUrlBuilder)) return false;
PostUrlBuilder that = (PostUrlBuilder) o;
return this.getUrl().equals(that.getUrl())
&& this.getParameters().equals(that.getParameters())
&& this.getArrayParameters().equals(that.getArrayParameters())
&& this.getQueryUrl().equals(that.getQueryUrl());
}
#Override
public int hashCode() {
int result = getUrl().hashCode();
result = 31 * result + getParameters().hashCode();
result = 31 * result + getArrayParameters().hashCode();
result = 31 * result + getQueryUrl().hashCode();
return result;
}
#Override
public String toString() {
return "GetUrlBuilder{" +
"url='" + url + '\'' +
", parameters=" + parameters +
", queryUrl='" + queryUrl + '\'' +
'}';
}
}
I am getting exception in line below:
urlBuilder.append(String.format("%s[]=%s", key, URLEncoder.encode(value, "UTf-8")));
Error Log-cat shows errors below :
FATAL EXCEPTION: main
Process: com.shohoz.launch.cabin, PID: 12230
java.lang.NullPointerException
at libcore.net.UriCodec.encode(UriCodec.java:132)
at java.net.URLEncoder.encode(URLEncoder.java:57)
at com.shohoz.launch.cabin.toolbox.PostUrlBuilder.buildQueryUrl(PostUrlBuilder.java:70)
at com.shohoz.launch.cabin.toolbox.PostUrlBuilder.<init>(PostUrlBuilder.java:29)
at com.shohoz.launch.cabin.fragment.RightFullSeatLayoutFragment.onlineCreateAndInsertIntoConfirm(RightFullSeatLayoutFragment.java:1105)
at com.shohoz.launch.cabin.fragment.RightFullSeatLayoutFragment$15.onClick(RightFullSeatLayoutFragment.java:857)
at android.support.v7.app.AlertController$ButtonHandler.handleMessage(AlertController.java:157)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5398)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:864)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:680)
at dalvik.system.NativeStart.main(Native Method)
Thanks in advance.
I've Figured out arrayParams.put("ticket_price_each",ticket_price_each); sending null value. That's why app was crashed.

parse recursively unknown json input structure in java

I'm trying to parse recursively unknown json input structure in java like the format below and trying to rewrite the same structure in another json.
Meanwhile I need to validate each & every json key/values while parsing.
{"Verbs":[{
"aaaa":"30d", "type":"ed", "rel":1.0, "id":"80", "spoken":"en", "ct":"on", "sps":null
},{
"aaaa":"31", "type":"cc", "rel":3.0, "id":"10", "spoken":"en", "ct":"off", "sps":null
},{
"aaaa":"81", "type":"nn", "rel":3.0, "id":"60", "spoken":"en", "ct":"on", "sps":null
}]}
Please advice which json parser I can use for reading and writing unknown json content.
This way you can recursively parse JSON object:
import com.eclipsesource.json.JsonArray;
import com.eclipsesource.json.JsonObject;
import com.eclipsesource.json.JsonValue;
public class JsonQuestion {
public static void main(String[] args) {
String input = "{\"Verbs\":[{\n" +
" \"aaaa\":\"30d\", \"type\":\"ed\", \"rel\":1.0, \"id\":\"80\", \"spoken\":\"en\", \"ct\":\"on\", \"sps\":null\n" +
"},{\n" +
" \"aaaa\":\"31\", \"type\":\"cc\", \"rel\":3.0, \"id\":\"10\", \"spoken\":\"en\", \"ct\":\"off\", \"sps\":null\n" +
"},{\n" +
" \"aaaa\":\"81\", \"type\":\"nn\", \"rel\":3.0, \"id\":\"60\", \"spoken\":\"en\", \"ct\":\"on\", \"sps\":null\n" +
"}]}";
JsonObject jsonObject = JsonObject.readFrom(input);
handleObject(jsonObject);
}
private static void handleValue(JsonObject.Member member, JsonValue value) {
if (value.isArray()) {
if (member != null) {
System.out.print("name = " + member.getName());
}
System.out.println("array value ");
recurseArray(value.asArray());
} else if (value.isBoolean()) {
if (member != null) {
System.out.print("name = " + member.getName());
}
System.out.println(", boolean value = " + value.asBoolean());
} else if (value.isNull()) {
if (member != null) {
System.out.print("name = " + member.getName());
}
System.out.println(", null value");
} else if (value.isNumber()) {
if (member != null) {
System.out.print("name = " + member.getName());
}
System.out.println(", number value = " + value.asDouble());
} else if (value.isObject()) {
if (member != null) {
System.out.print("name = " + member.getName());
}
System.out.println(", object value ");
handleObject(value.asObject());
} else if (value.isString()) {
if (member != null) {
System.out.print("name = " + member.getName());
}
System.out.println(", string value = " + value.asString());
}
}
private static void handleObject(JsonObject object) {
for (JsonObject.Member next : object) {
JsonValue value = next.getValue();
handleValue(next, value);
}
}
private static void recurseArray(JsonArray array) {
for (JsonValue value : array) {
handleValue(null, value);
}
}
}
Using gson library
https://sites.google.com/site/gson/gson-user-guide
public void parseJson() {
String jsonStr = "";//input json String.
JsonParser parser = new JsonParser();
JsonElement jsonElement = parser.parse(jsonStr);
processJsonElement(jsonElement);
}
private void processJsonElement(JsonElement e) {
if (e.isJsonArray()) {
processJsonArray(e.getAsJsonArray());
} else if (e.isJsonNull()) {
processJsonNull(e.getAsJsonNull());
} else if (e.isJsonObject()) {
processJsonObject(e.getAsJsonObject());
} else if (e.isJsonPrimitive()) {
processJsonPrimitive(e.getAsJsonPrimitive());
}
}
private void processJsonArray(JsonArray a) {
for (JsonElement e : a) {
processJsonElement(e);
}
}
private void processJsonNull(JsonNull n) {
System.out.println("null || : " + n);
}
private void processJsonObject(JsonObject o) {
Set<Map.Entry<String, JsonElement>> members= o.entrySet();
for (Map.Entry<String, JsonElement> e : members) {
System.out.println("Processing object member: " + e.getKey());
processJsonElement(e.getValue());
}
}
private void processJsonPrimitive(JsonPrimitive p) {
System.out.println("Primitive || :" + p);
}
Or Jackson
public void processJson() {
ObjectMapper objectMapper = new ObjectMapper();
try {
JsonNode node = objectMapper.readTree(jsonStr);
System.out.println(node);
processNode(node);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
private void processNode(JsonNode n) {
if (n.isContainerNode()) {
processJsonContainer(n.iterator());
} else if (n.isNull()) {
System.out.println("Null || :" + n);
} else if (n.isNumber()) {
System.out.println("Number || :" + n.asDouble());
} else if (n.isBoolean()) {
System.out.println("Boolean || :" + n.asBoolean());
} else if (n.isTextual()) {
System.out.println("Text || :" + n.asText());
}
}
private void processJsonContainer(Iterator<JsonNode> iterator) {
while (iterator.hasNext()) {
processNode(iterator.next());
}
}

Categories