Add Source Task
com\esri\arcgis\sample\AddSourceSample\AddSourceTask.java
/* Copyright 2012 ESRI
* 
* All rights reserved under the copyright laws of the United States
* and applicable international laws, treaties, and conventions.
* 
* You may freely redistribute and use this sample code, with or
* without modification, provided you include the original copyright
* notice and use restrictions.
* 
* See the use restrictions.
* 
*/
package com.esri.arcgis.sample.AddSourceSample;

import java.lang.Throwable;
import java.io.Serializable;
import java.net.URL;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.faces.el.ValueBinding;

import com.esri.adf.web.ags.data.AGSLocalConnection;
import com.esri.adf.web.ags.data.AGSLocalMapResource;
import com.esri.adf.web.ags.data.AGSMapResource;
import com.esri.adf.web.ags.data.AGSUser;
import com.esri.adf.web.aims.data.AIMSMapResource;
import com.esri.adf.web.data.WebContext;
import com.esri.adf.web.data.WebMap;
import com.esri.adf.web.data.tasks.SimpleTaskInfo;
import com.esri.adf.web.faces.component.ContextControl;
import com.esri.adf.web.faces.event.TaskEvent;
import com.esri.adf.web.wms.data.WMSMapResource;
import com.esri.aims.mtier.io.ConnectionProxy;
import com.esri.aims.mtier.model.service.Services;
import com.esri.arcgis.server.IEnumServerObjectConfigurationInfo;
import com.esri.arcgis.server.IEnumServerObjectConfigurationInfoProxy;
import com.esri.arcgis.server.IServerObjectConfigurationInfo;
import com.esri.arcgis.server.IServerObjectManager;
import com.esri.arcgisws.ServiceCatalogBindingStub;
import com.esri.arcgisws.ServiceDescription;

public class AddSourceTask  implements Serializable{
  ContextControl contextControl;
  LinkedHashMap<String, String> servicesList = null;

  private String serverType = "", serverTypeLbl = "Select the server type: ";
  private String serverType1 = "ARCGIS_SERVER_LOCAL";
  private String serverType2 = "ARCGIS_SERVER_INTERNET";
  private String serverType3 = "ARCIMS";
  private String serverType5 = "ARCWMS";

  // ags local
  private String agsServerName = "", agsServerNameLbl = "Server name: ";
  private String agsDomain = "", agsDomainLbl = "Domain: ";
  private String agsUserName = "", agsUserNameLbl = "User name: ";
  private String ags_password = "", agsPasswordLbl = "Password: ";
  private String agsObjectName = "", agsObjectNameLbl = "Select the object: ";

  // ags internet
  private String agsInternetCatalogURL = "", agsInternetCatalogURLLbl = "Catalog URL: ";
  private String agsInternetURL = "", agsInternetURLLbl = "Select the map URL: ";

  // aims
  private String aimsHost = "", aimsHostLbl = "Server name: ";
  private String aimsPort = "", aimsPortLbl = "Port number: ";
  private String aimsUsername = "", aimsUsernameLbl = "User name: ";
  private String aims_password = "", aimsPasswordLbl = "Password: ";
  private String aimsService = "", aimsServiceLbl = "Select the service: ";
  private String aimsResourceType = "ImageService";

  // wms
  private String wmsURL = "", wmsURLLbl = "URL: ";
  private String wmsType = "";
  private ArrayList m_dataSources;

  private AddSourceTaskInfo taskInfo = new AddSourceTaskInfo();

  public String addAgsLocalSource(TaskEvent event) {
    // get current instance
    FacesContext fc = FacesContext.getCurrentInstance();
    if (agsServerName == "" || agsDomain == "" || agsUserName == ""
        || ags_password == "" || agsObjectName == "") {
      fc.addMessage(contextControl.getClientId(fc), new FacesMessage(
          "Cannot add source with no value."));
      return null;
    }
    AGSLocalMapResource ags = null;
    WebContext mctx = null;
    try{
    // get current web context
    mctx = event.getWebContext();

    // create and init the new ags souce now


      ValueBinding vb = fc.getApplication().createValueBinding("#{ags}");
      ags = (AGSLocalMapResource) vb.getValue(fc);

      // user and object
      AGSUser user = new AGSUser(agsDomain, agsUserName, ags_password,
          false);
      ags.setUser(user);
      ags.setServerObjectName(agsObjectName);

      // server
      List<String> hosts = new ArrayList<String>();
      hosts.add(agsServerName);
      ags.setHosts(hosts);
      ags.setAlias(agsObjectName);

      // refresh map and restore the extent
      WebMap mmap = (WebMap) mctx.getWebMap();
      mmap.setInitExtent(mmap.getCurrentExtent());
      mctx.addResource("ags" + (mctx.getResources().size() + 1), ags, 0);
      mmap.update(mctx, null);
      return "success";
    } catch (Throwable e) {
      e.printStackTrace();

      fc.addMessage(contextControl.getClientId(fc), new FacesMessage(
          "Unable to add source: " + agsObjectName + "@"
              + agsServerName));
      agsObjectName = "";

      if (ags != null)
        mctx.removeResource(ags);
      return "failure";
    }

  }

  public String addAgsInternetSource(TaskEvent event) {
    FacesContext fc = FacesContext.getCurrentInstance();
    // WebContext mctx = (WebContext) contextControl.getWebContext();
    WebContext mctx = event.getWebContext();
    AGSMapResource agsWeb = null;
    if (agsInternetURL == null)
      return null;
    try {
      ValueBinding vb = fc.getApplication().createValueBinding(
          "#{agsweb}");
      agsWeb = (AGSMapResource) vb.getValue(fc);
      agsWeb.setEndPointURL(agsInternetURL);
      agsWeb.setAlias(agsInternetURL);
      WebMap mmap = (WebMap) mctx.getWebMap();
      mmap.setInitExtent(mmap.getCurrentExtent());
      mctx.addResource("agsweb" + (mctx.getResources().size() + 1),
          agsWeb, 0);
      mmap.update(mctx, null);
      return "success";
    } catch (Exception e) {
      fc.addMessage(contextControl.getClientId(fc), new FacesMessage(
          "Unable to add AGSWeb source: " + agsInternetURL));
      e.printStackTrace();
      if (agsWeb != null)
        mctx.removeResource(agsWeb);
    }
    return "failure";
  }

  public String addAimsSource(TaskEvent event) {
    FacesContext fc = FacesContext.getCurrentInstance();
    // check the input here
    // WebContext mctx = (WebContext) contextControl.getWebContext();
    WebContext mctx = event.getWebContext();
    AIMSMapResource aims = null;

    try {
      ValueBinding vb = fc.getApplication().createValueBinding("#{aims}");
      aims = (AIMSMapResource) vb.getValue(fc);

      aims.setHostName(aimsHost);
      aims.setServiceName(aimsService);
      if (aimsPort != "")
        aims.setPort(Integer.valueOf(aimsPort));
      aims.setPassword(aims_password);
      aims.setUserName(aimsUsername);
      aims.setAlias(aimsService);

      WebMap mmap = mctx.getWebMap();
      mmap.setInitExtent(mmap.getCurrentExtent());
      mctx.addResource("aims" + mctx.getResources().size() + 1, aims, 0);
      mmap.update(mctx, null);
      return "success";
    } catch (Exception e) {
      System.out.println("!!!!!!!!!!!!!!!!!!!!!!!!");
      fc.addMessage(contextControl.getClientId(fc), new FacesMessage(
          "Unable to connect to aims"));
      aimsService = "";
      e.printStackTrace();
      if (aims != null)
        mctx.removeResource(aims);
      return "failure";
    }
  }


  public String addWMSSource(TaskEvent event) {
    FacesContext fc = FacesContext.getCurrentInstance();
    // WebContext mctx = (WebContext) contextControl.getWebContext();
    WebContext mctx = event.getWebContext();
    WMSMapResource wms = null;
    try {
      ValueBinding vb = fc.getApplication().createValueBinding("#{wms}");
      wms = (WMSMapResource) vb.getValue(fc);
      wms.setWmsURL(wmsURL);
      wms.setAlias(wmsURL);
      WebMap mmap = (WebMap) mctx.getWebMap();
      mmap.setInitExtent(mmap.getCurrentExtent());
      mctx.addResource("wms" + (mctx.getResources().size() + 1), wms, 0);
      mmap.update(mctx, null);
      return "success";
    } catch (Exception e) {
      fc.addMessage(contextControl.getClientId(fc), new FacesMessage(
          "Unable to add WMS source: " + wmsURL));
      wmsURL = "";
      e.printStackTrace();
      if (wms != null)
        mctx.removeResource(wms);
    }
    return "failure";
  }

  public SimpleTaskInfo getTaskInfo() {
    return this.taskInfo;
  }

  public ContextControl getContextControl() {
    return contextControl;
  }

  public void setContextControl(ContextControl contextControl) {
    this.contextControl = contextControl;
  }

  public String getAgsDomain() {
    return agsDomain;
  }

  public void setAgsDomain(String agsDomain) {
    this.agsDomain = agsDomain;
  }

  public String getAgsObjectName() {
    return agsObjectName;
  }

  public void setAgsObjectName(String agsObjectName) {
    this.agsObjectName = agsObjectName;
  }

  public String getAgsServerName() {
    return agsServerName;
  }

  public void setAgsServerName(String agsServerName) {
    this.agsServerName = agsServerName;
  }

  public String getAgsUserName() {
    return agsUserName;
  }

  public void setAgsUserName(String agsUserName) {
    this.agsUserName = agsUserName;
  }

  public String getAimsHost() {
    return aimsHost;
  }

  public void setAimsHost(String aimsHost) {
    this.aimsHost = aimsHost;
  }

  public String getAimsPort() {
    return aimsPort;
  }

  public void setAimsPort(String aimsPort) {
    this.aimsPort = aimsPort;
  }

  public String getAimsResourceType() {
    return aimsResourceType;
  }

  public void setAimsResourceType(String aimsResourceType) {
    this.aimsResourceType = aimsResourceType;
  }

  public String getAimsService() {
    return aimsService;
  }

  public void setAimsService(String aimsService) {
    this.aimsService = aimsService;
  }

  public String getAimsUsername() {
    return aimsUsername;
  }

  public void setAimsUsername(String aimsUsername) {
    this.aimsUsername = aimsUsername;
  }

  public String getWmsType() {
    return wmsType;
  }

  public void setWmsType(String wmsType) {
    this.wmsType = wmsType;
  }

  public String getAgsInternetCatalogURL() {
    return agsInternetCatalogURL;
  }

  public void setAgsInternetCatalogURL(String agsInternetCatalogURL) {
    this.agsInternetCatalogURL = agsInternetCatalogURL;
  }

  public String getAgsInternetURL() {
    return agsInternetURL;
  }

  public void setAgsInternetURL(String agsInternetURL) {
    this.agsInternetURL = agsInternetURL;
  }

  public ArrayList getM_dataSources() {
    return m_dataSources;
  }

  public void setM_dataSources(ArrayList sources) {
    m_dataSources = sources;
  }

  public String getWmsURL() {
    return wmsURL;
  }

  public void setWmsURL(String wmsURL) {
    this.wmsURL = wmsURL;
  }

  public String getServerType() {
    return serverType;
  }

  public void setServerType(String serverType) {
    this.serverType = serverType;
  }

  public Map getServerTypeList() {
    LinkedHashMap<String, String> serverTypeList = new LinkedHashMap<String, String>();
    serverTypeList.put(serverType1, "ArcGIS Server[Local]");
    serverTypeList.put(serverType2, "ArcGIS Server[Internet]");
    serverTypeList.put(serverType3, "ArcIMS");
    serverTypeList.put(serverType5, "WMS");
    return serverTypeList;
  }

  public void setAddSourceUI() {
    this.servicesList = new LinkedHashMap<String, String>();
    this.servicesList.put("---- Select a service ----", "---- Select a service ----");

    if (serverType.equals(serverType1)) {
      ags_password = "";
      agsObjectName = "";
      taskInfo.setUI(serverType1);
    }
    if (serverType.equals(serverType2)) {
      agsInternetURL = "";
      taskInfo.setUI(serverType2);
    }
    if (serverType.equals(serverType3)) {
      aimsService = "";
      aims_password = "";
      taskInfo.setUI(serverType3);
    }
    if (serverType.equals(serverType5)) {
      taskInfo.setUI(serverType5);
    }
  }

  public void connectToFetchList() {
    this.servicesList = new LinkedHashMap<String, String>();
    this.servicesList.put("---- Select a service ----", "---- Select a service ----");

    if (serverType.equals(serverType1)) {
      this.getAgsServicesList();
      taskInfo.setUI(serverType1);
    }
    if (serverType.equals(serverType2)) {
      this.getAgsWebURLs();
      taskInfo.setUI(serverType2);
    }
    if (serverType.equals(serverType3)) {
      this.getAimsServicesList();
      taskInfo.setUI(serverType3);
    }

  }

  public void getAgsServicesList() {
    String server = agsServerName, domain = agsDomain, username = agsUserName, password = ags_password;

    AGSLocalConnection ags = null;
    List<String> host = new ArrayList<String>();
    host.add(server);
    // setMessage("");
    try {
      AGSUser agsUser = new AGSUser(domain, username, password, false);
      ags = new AGSLocalConnection("", host, "", "none", agsUser);
      ags.initResource();
      IServerObjectManager mgr = ags.getServerObjectManager();
      IEnumServerObjectConfigurationInfo SOCollection = new IEnumServerObjectConfigurationInfoProxy(
          mgr.getConfigurationInfos());
      // agsServices[0] = "-- Select a Service --";
      // if (agsServices.length == 0) setMessage("No services available");
      for (int j = 0; j < SOCollection.getCount(); j++) {
        IServerObjectConfigurationInfo srvObj = SOCollection.next();
        servicesList.put(srvObj.getName(), srvObj.getName());
      }
    } catch (Exception e) {
      // setMessage("Invalid connection parameters.");
      e.printStackTrace();
    } finally {
      if (ags != null)
        ags.passivateResource();
    }
    // return null;
  }

  public void getAgsWebURLs() {
    String catalogURL = agsInternetCatalogURL;
    int svcCount = 0;
    try {
      URL url = new URL(catalogURL);
      String strURL = url.toString();
      ServiceCatalogBindingStub servicecatalog = new ServiceCatalogBindingStub(strURL);
      ServiceDescription sd[] = servicecatalog.getServiceDescriptions();

      for (int i = 0; i < sd.length; i++) {
        if (sd[i].getType().equalsIgnoreCase("MapServer")) {
          svcCount++;
        }
      }

      // if (svcCount == 0) setMessage("No service available.");

      int m = 0;
      for (int i = 0; i < sd.length; i++) {
        if (sd[i].getType().equalsIgnoreCase("MapServer")) {
          servicesList.put(sd[i].getUrl(), sd[i].getUrl());
          m++;
        }
      }
    } catch (Exception e) {
      // setMessage("Invalid connection parameters.");
      e.printStackTrace();
    }

  }

  public void getAimsServicesList() {
    String host = aimsHost;
    Integer port = null;
    if (aimsPort != "")
      port = Integer.valueOf(aimsPort);
    String username = aimsUsername;
    String password = aims_password;

    int svcCount = 0;
    try {
      // setMessage("");
      ConnectionProxy connection = new ConnectionProxy();
      Services svc = new Services();
      if (username != null)
        connection.setUsername(username);

      if (password != null)
        connection.setPassword(password);

      if (host != null && !host.toLowerCase().startsWith("http")) {
        svc.getServices(host, port, username, password);
      } else if (host != null && host.toLowerCase().startsWith("http")) {
        URL url = new URL(host);
        svc.getServices(url, username, password);
      } else {
        // setMessage("Invalid connection parameters.");
      }

      for (int i = 0; i < svc.getServicesCount(); i++) {
        if (svc.getService(i).getType().equalsIgnoreCase("imageServer")
            || svc.getService(i).getType().equalsIgnoreCase(
                "ArcMapServer")) {
          svcCount++;
        }
      }
      // if (svcCount == 0) setMessage("No service available.");
      int m = 0;
      for (int j = 0; j < svc.getServicesCount(); j++) {
        if (svc.getService(j).getType().equalsIgnoreCase("imageServer")
            || svc.getService(j).getType().equalsIgnoreCase(
                "ArcMapServer")) {
          servicesList.put(svc.getService(j).getName(), svc
              .getService(j).getName());
          m++;
        }
      }
    } catch (Exception e) {
      // setMessage("Invalid connection parameters");
      e.printStackTrace();
    }
  }

  public void refreshTask() {
    agsServerName = "";
    agsDomain = "";
    agsUserName = "";
    ags_password = "";
    agsObjectName = "";
    agsInternetCatalogURL = "";
    agsInternetURL = "";
    aimsHost = "";
    aimsPort = "";
    aimsUsername = "";
    aims_password = "";
    aimsService = "";
    wmsURL = "";
    taskInfo = new AddSourceTaskInfo();
  }

  public void setServicesList(LinkedHashMap<String, String> servicesList) {
    this.servicesList = servicesList;
  }

  public Map getServicesList() {
    return this.servicesList;
  }

  public String getAgsDomainLbl() {
    return agsDomainLbl;
  }

  public String getAgsInternetCatalogURLLbl() {
    return agsInternetCatalogURLLbl;
  }

  public String getAgsInternetURLLbl() {
    return agsInternetURLLbl;
  }

  public String getAgsObjectNameLbl() {
    return agsObjectNameLbl;
  }

  public String getAgsPasswordLbl() {
    return agsPasswordLbl;
  }

  public String getAgsServerNameLbl() {
    return agsServerNameLbl;
  }

  public String getAgsUserNameLbl() {
    return agsUserNameLbl;
  }

  public String getAimsHostLbl() {
    return aimsHostLbl;
  }

  public String getAimsPasswordLbl() {
    return aimsPasswordLbl;
  }

  public String getAimsPortLbl() {
    return aimsPortLbl;
  }

  public String getAimsServiceLbl() {
    return aimsServiceLbl;
  }

  public String getAimsUsernameLbl() {
    return aimsUsernameLbl;
  }

  public String getWmsURLLbl() {
    return wmsURLLbl;
  }

  public String getServerTypeLbl() {
    return serverTypeLbl;
  }

  public String getAgs_password() {
    return ags_password;
  }

  public void setAgs_password(String ags_password) {
    this.ags_password = ags_password;
  }

  public String getAims_password() {
    return aims_password;
  }

  public void setAims_password(String aims_password) {
    this.aims_password = aims_password;
  }

}