package org.jumpmind.symmetric; import java.io.BufferedReader; import java.io.IOException; import java.net.URL; import java.util.List; import org.jumpmind.db.model.Table; import org.jumpmind.db.util.BinaryEncoding; import org.jumpmind.exception.IoException; import org.jumpmind.symmetric.common.Constants; import org.jumpmind.symmetric.io.data.Batch; import org.jumpmind.symmetric.io.data.Batch.BatchType; import org.jumpmind.symmetric.io.data.CsvData; import org.jumpmind.symmetric.io.data.DataEventType; import org.jumpmind.symmetric.io.data.writer.ProtocolDataWriter; import org.jumpmind.symmetric.model.BatchAck; import org.jumpmind.symmetric.transport.http.HttpOutgoingTransport; import org.jumpmind.symmetric.transport.http.HttpTransportManager; import org.jumpmind.symmetric.web.WebConstants; import org.jumpmind.util.AppUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class SymmetricPushClient { protected static final Logger log = LoggerFactory.getLogger(SymmetricPushClient.class); protected String nodeId; protected String securityToken; protected String syncUrl; protected HttpOutgoingTransport transport; protected ProtocolDataWriter writer; protected Batch batch; public SymmetricPushClient(String nodeId, String securityToken, String syncUrl) { super(); this.nodeId = nodeId; this.securityToken = securityToken; this.syncUrl = syncUrl; batch = new Batch(BatchType.EXTRACT, Constants.VIRTUAL_BATCH_FOR_REGISTRATION, "default", BinaryEncoding.BASE64, nodeId, null, false); } public void open() { try { transport = new HttpOutgoingTransport(new URL(buildUrl()), 30000, true, 0, -1, null, null, false, -1, false); writer = new ProtocolDataWriter(nodeId, transport.openWriter(), false); writer.start(batch); } catch (Exception ex) { throw new IoException(ex); } } public BatchAck close() { try { writer.end(batch, false); BufferedReader reader = transport.readResponse(); String ackString = reader.readLine(); String ackExtendedString = reader.readLine(); log.debug("Reading ack: {}", ackString); log.debug("Reading extend ack: {}", ackExtendedString); List<BatchAck> batchAcks = new HttpTransportManager().readAcknowledgement(ackString, ackExtendedString); if (batchAcks.size() > 0) { return batchAcks.get(0); } else { return null; } } catch (IOException ex) { throw new IoException(ex); } finally { transport.close(); } } public void insert(Table table, String[] data) { writer.start(table); writer.write(new CsvData(DataEventType.INSERT, data)); writer.end(table); } public void update(Table table, String[] data, String[] pkData) { writer.start(table); writer.write(new CsvData(DataEventType.INSERT, pkData, data)); writer.end(table); } public void delete(Table table, String[] pkData) { writer.start(table); writer.write(new CsvData(DataEventType.DELETE, pkData, null)); writer.end(table); } protected String buildUrl() { StringBuilder sb = new StringBuilder(syncUrl); sb.append("/push?"); sb.append(WebConstants.NODE_ID); sb.append("="); sb.append(nodeId); sb.append("&"); sb.append(WebConstants.SECURITY_TOKEN); sb.append("="); sb.append(securityToken); sb.append("&"); sb.append(WebConstants.HOST_NAME); sb.append("="); sb.append(AppUtils.getHostName()); sb.append("&"); sb.append(WebConstants.IP_ADDRESS); sb.append("="); sb.append(AppUtils.getIpAddress()); return sb.toString(); } }