/* See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * Esri Inc. licenses this file to You 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 com.esri.gpt.agp.sync; import com.esri.gpt.agp.client.AgpClient; import com.esri.gpt.agp.client.AgpConnection; import com.esri.gpt.agp.client.AgpDPart; import com.esri.gpt.agp.client.AgpItem; import com.esri.gpt.agp.client.AgpProperties; import com.esri.gpt.agp.client.AgpUtil; import com.esri.gpt.agp.multipart2.MultipartProvider; import com.esri.gpt.framework.http.StringHandler; import com.esri.gpt.framework.http.StringProvider; import org.json.JSONArray; import org.json.JSONObject; /** * Multi-part helper functions for the AgpPush synchronizer. */ public class AgpPartHelper { /** instance variables ====================================================== */ private AgpItemHelper itemHelper = new AgpItemHelper(); /** constructors ============================================================ */ /** Default constructor. */ public AgpPartHelper() {} /** methods ================================================================= */ /** * Adds the data part to a multiipart request for item * addition or update. * @param provider the multi-part request provider * @param source the synchronization source * @param sourceItem the synchronization source item * @param destination the synchronization destination * @param destItem the synchronization destination item * @throws Exception if an exception occurs */ protected void addDataPart(MultipartProvider provider, AgpSource source, AgpItem sourceItem, AgpDestination destination, AgpItem destItem) throws Exception { AgpConnection con = source.getConnection(); String sId = sourceItem.getProperties().getValue("id"); String sUrl = con.makeSharingUrl()+"/content/items"; sUrl += "/"+AgpUtil.encodeURIComponent(sId); sUrl += "/data"; // this is probably not necessary, -1 seems to work, // search?q= results return size=-1, // you need an items/[id] request to get the actual size String sDataSize = sourceItem.getProperties().getValue("size"); long nDataSize = -1; try { nDataSize = Long.valueOf(sDataSize); } catch (NumberFormatException nfe) { nDataSize = -1; nfe.printStackTrace(System.err); } //System.err.println("nnnnDataSize="+nDataSize); String sFileName = null; String sPartName = "text"; // TODO is this correct? String sItem = sourceItem.getProperties().get("item").getValue(); String sItemType = sourceItem.getProperties().getValue("itemType"); String sType = sourceItem.getProperties().getValue("type"); if ((sItemType != null) && sItemType.equals("file")) { sPartName = "file"; sFileName = sItem; // TODO is this correct? provider.add("item",sItem); // TODO is this correct? provider.add(new AgpDPart(con,sourceItem,sUrl,sPartName,sFileName,nDataSize)); } else if ((sItemType != null) && sItemType.equals("url")) { // Content-Type: text/plain; charset=utf-8 sPartName = "text"; sFileName = null; provider.add("item",sItem); // TODO is this correct? provider.add(new AgpDPart(con,sourceItem,sUrl,sPartName,sFileName,nDataSize)); } else if ((sItemType != null) && sItemType.equals("text")) { sPartName = "text"; sFileName = null; if (!sType.equals("Web Map")) { provider.add("item",sItem); // TODO is this correct? provider.add(new AgpDPart(con,sourceItem,sUrl,sPartName,sFileName,nDataSize)); } else { provider.add("item",sItem); // TODO is this correct? String sCType = "application/x-www-form-urlencoded"; StringBuilder params = new StringBuilder(); con.appendToken(params); AgpProperties hdr = con.makeRequestHeaderProperties(); AgpClient client = con.ensureClient(); StringProvider prov = new StringProvider(params.toString(),sCType); StringHandler handler = new StringHandler();; client.executeRequest(sUrl,hdr,prov,handler); String sWebMapJson = handler.getContent(); /* web map "operationalLayers":[ { "url":"http://irwinags/arcgis/rest/services/IRWIN/MapServer", "id":"IRWIN_8147", "visibility":true, "opacity":1, "title":"IRWIN", "itemId":"0d635c1158a844d4a19c048c854345df" }, */ AgpConnection con2 = destination.getConnection(); boolean bMod = false; JSONObject jso = new JSONObject(sWebMapJson); String sProp = "operationalLayers"; if (jso.has(sProp) && (!jso.isNull(sProp))) { JSONArray jsoLayers = jso.getJSONArray(sProp); int n = jsoLayers.length(); for (int i=0;i<n;i++) { JSONObject jsoLayer = jsoLayers.getJSONObject(i); if (jsoLayer.has("itemId") && (!jsoLayer.isNull("itemId"))) { String sItemId = jsoLayer.getString("itemId"); //System.err.println("itemId="+sItemId); String sSyncKey = this.itemHelper.makeSyncKey(sItemId); String sDestQuery = "typekeywords:"+sSyncKey; AgpItem qItem = this.itemHelper.querySingleItem(con2,sDestQuery); if (qItem == null) { // TODO: is this query ok? sDestQuery = "id:"+sId; qItem = this.itemHelper.querySingleItem(con2,sDestQuery); } if (qItem == null) { // TODO: is this query ok? //System.err.println("------- removing webmap rel id "+sId); jsoLayer.remove("itemId"); bMod = true; } else { String sDestId = qItem.getProperties().getValue("id"); //System.err.println("------- putting webmap rel id "+sDestId); //jsoLayer.remove("itemId"); jsoLayer.put("itemId",sDestId); bMod = true; } } } } if (bMod) { sWebMapJson = jso.toString(); } provider.add("text",sWebMapJson); } } } /** * Adds the thumbnail part to a multiipart request for item * addition or update. * @param provider the multi-part request provider * @param source the synchronization source * @param sourceItem the synchronization source item * @param destination the synchronization destination * @param destItem the synchronization destination item * @throws Exception if an exception occurs */ protected void addThumbnailPart(MultipartProvider provider, AgpSource source, AgpItem sourceItem, AgpDestination destination, AgpItem destItem) throws Exception { AgpConnection con = source.getConnection(); String sThumbnail = sourceItem.getProperties().getValue("thumbnail"); if (sThumbnail != null) { int n = sThumbnail.indexOf("thumbnail/"); if (n == 0) { String sFileName = sThumbnail.substring(10); if ((sFileName.length() > 0) && (sFileName.indexOf("/") == -1)) { String sId = sourceItem.getProperties().getValue("id"); String sUrl = con.makeSharingUrl()+"/content/items"; sUrl += "/"+AgpUtil.encodeURIComponent(sId); sUrl += "/info/thumbnail/"+sFileName; provider.add(new AgpDPart( con,sourceItem,sUrl,"thumbnail",sFileName,-1)); } } } } }