Showing posts with label java. Show all posts
Showing posts with label java. Show all posts

Thursday, February 14, 2013

Java - String comparison

Does it give you a bellyache?
String gg1 = "goldengate";
String gg2 = "goldengate"; //s2 is stored in a string pool.
String gg3 = new String("goldengate");
System.out.println(gg1==gg2); //is true, because they share
//the same memory addr
System.out.println(gg1==gg3); //false, because of 'new'
view raw StringPool.java hosted with ❤ by GitHub
Never mind, you can compare them like this-

System.out.println(gg1.compareTo(gg3));

Friday, February 1, 2013

GWT - Highchart export request - Read multipart/form-data parameters

Getting multipart-form-data request parameters in java servlet-

@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws IOException, ServletException {
if (!ServletFileUpload.isMultipartContent(req)) {
throw new ServletException("Not a file upload request");
}
ServletFileUpload upload = new ServletFileUpload();
FileItemIterator iter;
iter = upload.getItemIterator(req);
while (iter.hasNext()) {
FileItemStream item = iter.next();
InputStream stream = item.openStream();
if (item.isFormField()) {
if (item.getFieldName().equalsIgnoreCase("svg")) {
svg = Streams.asString(stream);
}
...
...
}
}
}

Monday, January 21, 2013

Hadoop - OutOfMemoryError: Java heap space

I was writing a hadoop job which processes many files and creates multiple files from each file. I was using "MultipleOutputs" to write them. It worked fine for a small number of files but I was getting the following error for large number of files. I tried increasing the ulimit and -Xmx but to no avail.

2013-01-15 13:44:05,154 FATAL org.apache.hadoop.mapred.Child: Error running child : java.lang.OutOfMemoryError: Java heap space
    at org.apache.hadoop.hdfs.DFSOutputStream$Packet.(DFSOutputStream.java:201)
    at org.apache.hadoop.hdfs.DFSOutputStream.writeChunk(DFSOutputStream.java:1423)
    at org.apache.hadoop.fs.FSOutputSummer.writeChecksumChunk(FSOutputSummer.java:161)
    at org.apache.hadoop.fs.FSOutputSummer.flushBuffer(FSOutputSummer.java:136)
    at org.apache.hadoop.fs.FSOutputSummer.flushBuffer(FSOutputSummer.java:125)
    at org.apache.hadoop.fs.FSOutputSummer.write1(FSOutputSummer.java:116)
    at org.apache.hadoop.fs.FSOutputSummer.write(FSOutputSummer.java:90)
    at org.apache.hadoop.fs.FSDataOutputStream$PositionCache.write(FSDataOutputStream.java:54)
    at java.io.DataOutputStream.write(DataOutputStream.java:90)
    at org.apache.hadoop.mapreduce.lib.output.TextOutputFormat$LineRecordWriter. writeObject( TextOutputFormat.java:78)
    at org.apache.hadoop.mapreduce.lib.output.TextOutputFormat$LineRecordWriter. write(TextOutputFormat.java:99)
    **at org.apache.hadoop.mapreduce.lib.output.MultipleOutputs.write( MultipleOutputs.java:386)
    at com.demoapp.collector.MPReducer.reduce(MPReducer.java:298)
    at com.demoapp.collector.MPReducer.reduce(MPReducer.java:28)**
    at org.apache.hadoop.mapreduce.Reducer.run(Reducer.java:164)
    at org.apache.hadoop.mapred.ReduceTask.runNewReducer(ReduceTask.java:595)
    at org.apache.hadoop.mapred.ReduceTask.run(ReduceTask.java:433)
    at org.apache.hadoop.mapred.Child$4.run(Child.java:268)
    at java.security.AccessController.doPrivileged(Native Method)
    at javax.security.auth.Subject.doAs(Subject.java:396)
    at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1332)
    at org.apache.hadoop.mapred.Child.main(Child.java:262)


Solution:
I used the following configuration values to resolve it-
OPTS="-Dmapred.reduce.tasks=8 -Dio.sort.mb=640 -Dmapred.task.timeout=1200000"
hadoop jar ${JAR} ${OPTS} -src ${SRC} -dest ${DST}









Sunday, August 26, 2012

GWT Celltable - Add multiple anchors to a cell



I am trying to insert multiple anchors in a single celltable cell. This is how it would look like-
The cars column has multiple cars, each car link can be clicked to perform different actions.
I have extended a MultipleAnchorCell class from AbstractSafeHtmlCell like this-

import java.util.List;
import com.google.gwt.cell.client.AbstractSafeHtmlCell;
import com.google.gwt.core.client.GWT;
import com.google.gwt.dom.client.NativeEvent;
import com.google.gwt.safehtml.client.SafeHtmlTemplates;
import com.google.gwt.safehtml.shared.SafeHtml;
import com.google.gwt.text.shared.SafeHtmlRenderer;
import com.google.gwt.text.shared.SimpleSafeHtmlRenderer;
import com.google.gwt.cell.client.ValueUpdater;
import com.google.gwt.dom.client.Element;
import com.google.gwt.dom.client.EventTarget;
import com.google.gwt.safehtml.shared.SafeHtmlBuilder;
public class MultipleAnchorCell extends AbstractSafeHtmlCell {
interface Templates extends SafeHtmlTemplates {
@Template(" {0} ")
SafeHtml alink(String text);
}
private final List items;
public void clear() {
this.items.clear();
}
public void addLink(String newOp) {
String item = new String(newOp);
items.add(item);
}
public MultipleAnchorCell(List items) {
super(SimpleSafeHtmlRenderer.getInstance(), "click", "keydown");
this.items = items;
}
public MultipleAnchorCell(SafeHtmlRenderer renderer,
List items) {
super(renderer, "click", "keydown");
this.items = items;
}
private static Templates templates = GWT.create(Templates.class);
@Override
public void onBrowserEvent(Context context, Element parent, String value,
NativeEvent event,
com.google.gwt.cell.client.ValueUpdater valueUpdater) {
super.onBrowserEvent(context, parent, value, event, valueUpdater);
// Handle the click event.
if ("click".equals(event.getType())) {
EventTarget eventTarget = event.getEventTarget();
if (parent.isOrHasChild(Element.as(eventTarget))) {
Element el = Element.as(eventTarget);
if (el.getNodeName().equalsIgnoreCase("a")) {
doAction(el.getAttribute("aid"), valueUpdater);
}
}
}
};
@Override
protected void onEnterKeyDown(Context context, Element parent,
String value, NativeEvent event, ValueUpdater valueUpdater) {
doAction(value, valueUpdater);
}
private void doAction(String value, ValueUpdater valueUpdater) {
if (valueUpdater != null)
valueUpdater.update(value);
}
@Override
protected void render(com.google.gwt.cell.client.Cell.Context context,
SafeHtml data, SafeHtmlBuilder sb) {
if (data == null) {
return;
}
for (String item : items) {
sb.append(templates.alink(item));
}
}
}


And then I use this cell in a celltable to create a column. My User class contains comma separated values of cars in a class variable.

List linkNames = new ArrayList();
final MultipleAnchorCell linksCell = new MultipleAnchorCell(linkNames);
Column carColumn = new Column(
linksCell) {
@Override
public String getValue(User object) {
String currentVal = "";
linksCell.clear();
if (object.getLinksToShow() != null
&& object.getLinksToShow().length() > 0) {
for (String hg : object.getLinksToShow().split(",")) {
if (hg.trim().length() > 0) {
linksCell.addLink(hg);
currentVal = hg;
}
}
}
return currentVal;
}
};
carColumn.setFieldUpdater(new FieldUpdater() {
@Override
public void update(int index, User object, String value) {
if (value != null && value.length() > 0) {
Window.alert(value);
}
}
});
      

       

I am still learning GWT and it took me a while to figure this out.

Comments/feedback is welcome.
===============================================================

Saturday, October 15, 2011

Executing Postgres crosstab query as a prepared statement


I was executing a crosstab query as a prepared statement in Java(in a GWT app) and getting the following error -

PSQLException - Can't use query methods that take a query string on a PreparedStatement.

With some helpful folks from stackflow, I was able to resolve the error with the following code -

String query = "SELECT * FROM crosstab(
                      'SELECT rowid, a_name, value
                       FROM test WHERE a_name = ''att2''
                                    OR a_name = ''att3''
                      ORDER BY 1,2'
) AS ct(row_name text, cat_1 text, cat_2 text, cat_3 text);";

PreparedStatement stat = conn.prepareStatement(query);
ResultSet rs = stat.getResultSet();

//Note that, it is executeQuery() and not executeQuery(query)
stat.executeQuery();
rs = stat.getResultSet();
while (rs.next()) {
    //TODO
}





Thanks!