package doser.entitydisambiguation.table.celldisambiguation;
import java.io.IOException;
import java.util.LinkedList;
import java.util.List;
import org.apache.http.Header;
import org.apache.http.entity.ByteArrayEntity;
import org.apache.http.entity.ContentType;
import org.apache.http.message.BasicHeader;
import org.apache.log4j.Logger;
import org.codehaus.jackson.JsonParseException;
import org.codehaus.jackson.map.JsonMappingException;
import org.codehaus.jackson.map.ObjectMapper;
import doser.entitydisambiguation.dpo.DisambiguatedEntity;
import doser.entitydisambiguation.dpo.DisambiguationRequest;
import doser.entitydisambiguation.dpo.DisambiguationResponse;
import doser.entitydisambiguation.dpo.EntityDisambiguationDPO;
import doser.entitydisambiguation.dpo.Response;
import doser.entitydisambiguation.table.logic.TableCell;
import doser.entitydisambiguation.table.logic.TableColumn;
import doser.tools.ServiceQueries;
/**
* Class that performs TableCell disambiguation on specialized domain (i.e.
* custom generated Computer Science Table Disambiguation Index)
*
* @author Stefan Zwicklbauer
*/
public final class CellDisAlgorithm_CSDomain implements
CellDisambiguationInterface {
// private final static String DISPROXYURL =
// "http://theseus.dimis.fim.uni-passau.de:8080/code-disambiguationserver/disambiguation/disambiguate-proxy";
private final static String DISPROXYURL = "http://localhost:8080/code-disambiguationserver/disambiguation/disambiguate-proxy";
private static CellDisAlgorithm_CSDomain instance;
public synchronized static CellDisAlgorithm_CSDomain getInstance() {
if (instance == null) {
instance = new CellDisAlgorithm_CSDomain();
}
return instance;
}
private CellDisAlgorithm_CSDomain() {
super();
}
@Override
public void disambiguateCells(final TableColumn col) {
final List<TableCell> cellList = col.getCellList();
// 1. Step
// Disambiguate TableCells
final DisambiguationResponse response = queryDisService(cellList);
// 2. Step
// Set disambiguated content
for (int j = 0; j < cellList.size(); j++) {
final TableCell cell = cellList.get(j);
final Response entResponse = response
.getTasks().get(j);
final List<DisambiguatedEntity> entList = entResponse
.getDisEntities();
if (!entList.isEmpty()) {
cell.setDisambiguatedContent(entResponse.getDisEntities()
.get(0).getEntityUri());
cell.setDisambigutedContentString(entResponse.getDisEntities()
.get(0).getText());
}
cell.setDisambiguatedEntities(entList);
}
}
private DisambiguationResponse queryDisService(
final List<TableCell> tableCells) {
DisambiguationResponse res = new DisambiguationResponse();
final DisambiguationRequest disRequest = new DisambiguationRequest();
disRequest.setDocumentUri("tableDisambiguationCSIndex");
final List<EntityDisambiguationDPO> lst = new LinkedList<EntityDisambiguationDPO>();
for (final TableCell cell : tableCells) {
final EntityDisambiguationDPO ent = new EntityDisambiguationDPO();
ent.setSetting("CSTable");
String sfs = cell.getCellContent();
ent.setSelectedText(sfs);
ent.setStartPosition(-1);
lst.add(ent);
}
disRequest.setSurfaceFormsToDisambiguate(lst);
final ObjectMapper mapper = new ObjectMapper();
String json = null;
byte[] jsonByteString = null;
try {
json = mapper.writeValueAsString(disRequest);
jsonByteString = json.getBytes("UTF-8");
} catch (final JsonParseException e) {
Logger.getRootLogger().error(e.getStackTrace());
} catch (final JsonMappingException e1) {
Logger.getRootLogger().error(e1.getStackTrace());
} catch (final IOException e2) {
Logger.getRootLogger().error(e2.getStackTrace());
}
Header[] headers = { new BasicHeader("Accept", "application/json"),
new BasicHeader("content-type", "application/json") };
ByteArrayEntity ent = new ByteArrayEntity(jsonByteString,
ContentType.create("application/json"));
String resStr = ServiceQueries.httpPostRequest(DISPROXYURL, ent,
headers);
try {
res = mapper.readValue(resStr, DisambiguationResponse.class);
} catch (final JsonParseException e) {
Logger.getRootLogger().error(e.getStackTrace());
} catch (final JsonMappingException e1) {
Logger.getRootLogger().error(e1.getStackTrace());
} catch (final IOException e2) {
Logger.getRootLogger().error(e2.getStackTrace());
}
return res;
}
}