rrenkert@243: /*
rrenkert@243:  * Copyright (c) 2011 by Intevation GmbH, Germany <info@intevation.de>
rrenkert@243:  *
rrenkert@243:  * This file is part of MXD2map.
rrenkert@243:  *
rrenkert@243:  * This program is free software under the LGPL (>=v2.1)
rrenkert@243:  * Read the file LICENCE.txt coming with the software for details
rrenkert@243:  * or visit http://www.gnu.org/licenses/ if it does not exist.
rrenkert@243:  *
rrenkert@243:  * MXD2map has been developed on behalf of the
rrenkert@243:  * Bundesamt fuer Seeschifffahrt und Hydrographie (BSH) in Hamburg
rrenkert@243:  * by Intevation GmbH.
rrenkert@243:  *
rrenkert@243:  * Authors:
rrenkert@243:  * Raimund Renkert <raimund.renkert@intevation.de>
rrenkert@243:  * Bjoern Schilberg <bjoern.schilberg@intevation.de>
rrenkert@243:  * Stephan Holl <stephan.holl@intevation.de>
rrenkert@243:  */
rrenkert@243: 
rrenkert@33: package de.intevation.mxd;
rrenkert@25: 
rrenkert@25: import java.io.IOException;
rrenkert@103: import java.io.File;
vc11884admin@111: import java.lang.reflect.Method;
vc11884admin@111: import java.net.URL;
vc11884admin@111: import java.net.URLClassLoader;
rrenkert@103: 
rrenkert@103: import org.apache.log4j.Logger;
rrenkert@25: 
rrenkert@25: import com.esri.arcgis.system.AoInitialize;
rrenkert@25: import com.esri.arcgis.system.EngineInitializer;
rrenkert@25: import com.esri.arcgis.system.esriLicenseProductCode;
rrenkert@25: import com.esri.arcgis.system.esriLicenseStatus;
rrenkert@25: 
rrenkert@25: /**
rrenkert@25:  * Initializes the ArcGIS Engine and Objects.
rrenkert@25:  *
rrenkert@25:  * @author <a href="mailto:raimund.renkert@intevation.de">Raimund Renkert</a>
rrenkert@25:  */
rrenkert@43: public class ArcGISInitializer {
rrenkert@25: 
rrenkert@43:     /**
rrenkert@103:      * The Logger.
rrenkert@103:      */
rrenkert@103:     private static final Logger logger = Logger.getLogger(ArcGISInitializer.class);
rrenkert@103: 
rrenkert@103:     /**
rrenkert@43:      * Private member.
rrenkert@43:      */
rrenkert@25:     private AoInitialize    aoInit;
rrenkert@25:     private String          engineInstallDir = "";
rrenkert@25: 
rrenkert@25: 
rrenkert@25:     /**
rrenkert@25:      * Init ArcGIS Java Objects.
rrenkert@25:      */
rrenkert@43:     public boolean initArcGIS ()
rrenkert@43:     throws IOException {
rrenkert@103:         logger.debug("initArcGIS()");
vc11884admin@111: 
vc11884admin@111:         String engineInstallDir    = System.getenv("AGSENGINEJAVA");
rrenkert@180:         if(engineInstallDir == null) {
rrenkert@103:             engineInstallDir = System.getenv("AGSDESKTOPJAVA");
rrenkert@180:             if(engineInstallDir == null) {
rrenkert@103:                 logger.error("Could not find ArcGIS Environment. \n" +
rrenkert@103:                              "AGSENGINEJAVA or AGSDESKTOPJAVA not set.");
rrenkert@180:                 return false;
rrenkert@180:             }
rrenkert@180:         }
vc11884admin@111: 
rrenkert@180:         //Obtain the relative path to the arcobjects.jar file
vc11884admin@111:         String jarPath = engineInstallDir + "java" + File.separator + "lib" +
rrenkert@180:                          File.separator + "arcobjects.jar";
vc11884admin@111: 
vc11884admin@111:         //Create a new file
vc11884admin@111:         File jarFile = new File(jarPath);
rrenkert@180: 
vc11884admin@111:         //Test for file existence
vc11884admin@111:         if(!jarFile.exists()){
rrenkert@180:                 logger.error("The arcobjects.jar was not found in the" +
rrenkert@180:                              " following location: " + jarFile.getParent());
rrenkert@180:                 logger.error("Verify that arcobjects.jar can" +
rrenkert@180:                              " be located in the specified folder.");
rrenkert@180:                 logger.error("If not present, try uninstalling your" +
rrenkert@180:                              " ArcGIS software and reinstalling it.");
vc11884admin@111:                 System.exit(0);
rrenkert@103:         }
vc11884admin@111: 
vc11884admin@111:         //Helps load classes and resources from a search path of URLs
rrenkert@180:         URLClassLoader sysloader =
rrenkert@180:             (URLClassLoader) ClassLoader.getSystemClassLoader();
vc11884admin@111:         Class<URLClassLoader> sysclass = URLClassLoader.class;
vc11884admin@111: 
vc11884admin@111:         try {
rrenkert@180:             Method method = sysclass.getDeclaredMethod("addURL",
rrenkert@180:                                                        new Class[]{URL.class});
vc11884admin@111:             method.setAccessible(true);
vc11884admin@111:             method.invoke(sysloader, new Object[]{jarFile.toURI().toURL()});
rrenkert@103:         }
rrenkert@180:         catch (Throwable throwable) {
vc11884admin@111:             throwable.printStackTrace();
vc11884admin@111:             logger.error("Could not add arcobjects.jar to system classloader");
vc11884admin@111:             System.exit(0);
vc11884admin@111:         }
rrenkert@180: 
rrenkert@180:         EngineInitializer.initializeEngine();
rrenkert@180: 
rrenkert@180:         aoInit = new AoInitialize();
rrenkert@25:         return true;
rrenkert@25:     }
rrenkert@25: 
rrenkert@25:     /**
rrenkert@25:      * Init ArcGIS License.
rrenkert@25:      */
rrenkert@103:     public boolean initArcGISLicenses()
rrenkert@43:     throws IOException {
rrenkert@103:         logger.debug("initArcGISLicenses()");
rrenkert@25:         if(aoInit.isProductCodeAvailable
rrenkert@25:            (esriLicenseProductCode.esriLicenseProductCodeEngine) ==
rrenkert@43:            esriLicenseStatus.esriLicenseAvailable) {
rrenkert@25:            aoInit.initialize
rrenkert@25:                (esriLicenseProductCode.esriLicenseProductCodeEngine);
rrenkert@25:         }
rrenkert@25:         else if (aoInit.isProductCodeAvailable
rrenkert@25:                  (esriLicenseProductCode.esriLicenseProductCodeArcView) ==
rrenkert@43:                  esriLicenseStatus.esriLicenseAvailable) {
rrenkert@25:                  aoInit.initialize
rrenkert@25:                      (esriLicenseProductCode.esriLicenseProductCodeArcView);
rrenkert@25:         }
rrenkert@43:         else {
rrenkert@103:             logger.error("Engine Runtime or ArcView" +
rrenkert@103:                          " license not initialized.\n" +
rrenkert@103:                          "Please install an ArcGIS product and set the" +
rrenkert@103:                          " PATH-variable correctly.");
rrenkert@103:             return false;
rrenkert@25:         }
rrenkert@103:         return true;
rrenkert@25:     }
rrenkert@25: 
rrenkert@25:     /**
rrenkert@25:      * Shutdown the ArcGIS Objects.
rrenkert@25:      */
rrenkert@43:     public boolean shutdownArcGIS()
rrenkert@43:     throws IOException {
rrenkert@43:         if(aoInit != null) {
rrenkert@25:             aoInit.shutdown();
rrenkert@25:             return true;
rrenkert@25:         }
rrenkert@43:         else {
rrenkert@25:             return false;
rrenkert@25:         }
rrenkert@25:     }
rrenkert@25: 
rrenkert@25:     /**
rrenkert@25:      * Get the ArcGIS Engine Directory.
rrenkert@25:      */
rrenkert@43:     public String getEngineDirectory()
rrenkert@43:     throws Exception {
rrenkert@43:         if(engineInstallDir == "") {
rrenkert@25:             throw new Exception("Call initArcGIS() first!");
rrenkert@43:         }
rrenkert@43:         else {
rrenkert@25:             return engineInstallDir;
rrenkert@43:         }
rrenkert@25:     }
rrenkert@25: }