Java tutorial
/** * Copyright 2013 Spanish Minister of Education, Culture and Sport * * written by MasMedios * * Licensed under the EUPL, Version 1.1 or as soon they will be approved by the European Commission - subsequent versions of the EUPL (the "Licence"); * * You may not use this work except in compliance with the License. You may obtain a copy of the License at: * * http://ec.europa.eu/idabc/servlets/Docbb6d.pdf?id=31979 * * 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 org.dspace.installer_edm; import org.apache.commons.cli.*; import org.dspace.core.ConfigurationManager; import org.dspace.servicemanager.DSpaceKernelImpl; import org.dspace.servicemanager.DSpaceKernelInit; import java.io.File; import java.io.IOException; /** * @class InstallerEDM * * Clase principal que es invicada con la ejecucin del jar. * Recoge los argumentos y ejecuta los pasos del instalador. * Muestra el men principal con los pasos. * hereda de la clase base {@link InstallerEDMBase} con las variables estticas comunes y mtodos comunes. * */ public class InstallerEDM extends InstallerEDMBase { /** * Nmero del paso que viene como parmetro en el jar */ private static int iniStep = 0; /** * Kernel de dspace que se incia en esta clase */ private static DSpaceKernelImpl kernelImpl; /** * Clase {@link MyShutdown} para gestionar el cierre de la aplicacin por la captura de una seal de terminacin */ final private MyShutdown mySH; /** * Clase {@link MySignalHandler} que captura las seales */ private MySignalHandler sh = null; /** * Clase {@link InstallerEDMAskosi} para instalar el servicio de Askosi */ private InstallerEDMAskosi installerEDMAskosi; /** * Clase {@link InstallerEDMCreateAuth} para crear las autoridades en dspace */ private InstallerEDMCreateAuth installerEDMCreateAuth = null; /** * Clase {@link InstallerEDMConf} para configurar dspace con Askosi */ private InstallerEDMConf installerEDMConf = null; /** * Clase {@link InstallerEDMConfEDMExport} para configurar el servicio EDMExport */ private InstallerEDMConfEDMExport installerEDMConfEDMExport = null; /** * Clase {@link InstallerManagerCrosswalk} para configurar el plugin en java de OAI para mostrar elementos en un formato */ private InstallerManagerCrosswalk installerManagerCrosswalk = null; /** * Clase {@link InstallerEDMCrosswalkXSL} para configurar el plugin en XSL de OAI para mostrar elementos en formato EDM */ private InstallerEDMCrosswalkXSL installerEDMCrosswalkXSL = null; /** * Clase {@link InstallerEDMFillItems} para enlazar los items de dspace con las autoridades creadas */ private InstallerEDMFillItems installerEDMFillItems = null; /** * * Llamada principal del jar. * Se inicia el kernel de dspace * Se recogen los parmetros pasadaos al jar * Se llama al mostrar el men principal * * @param args argumentos pasados al jar */ public static void main(String[] args) { // Crea la clase principal del instalador InstallerEDM installerEDM = new InstallerEDM(); // Ha de existir parmetros if (args.length < 1) { installerEDM.getInstallerEDMDisplay().showQuestion(0, "error.commands"); System.exit(1); } // Se incia el kernel de dspace try { kernelImpl = DSpaceKernelInit.getKernel(null); if (!kernelImpl.isRunning()) { kernelImpl.start(ConfigurationManager.getProperty("dspace.dir")); } } catch (Exception e) { try { kernelImpl.destroy(); } catch (Exception e1) { } String message = getInstallerEDMDisplay().getQuestion(0, "error.fail.init", new String[] { e.getMessage() }); getInstallerEDMDisplay().showMessage(message + ":" + e); throw new IllegalStateException(message, e); } // Se recogen los parmetros try { CommandLineParser parser = new PosixParser(); Options options = new Options(); options.addOption("d", "dspace_dir", true, getInstallerEDMDisplay().getQuestion(0, "dspace_dir.option")); options.addOption("h", "help", false, getInstallerEDMDisplay().getQuestion(0, "help.option")); options.addOption("j", "java", false, ""); options.addOption("g", "debug", false, getInstallerEDMDisplay().getQuestion(0, "debug.option")); options.addOption("l", "language", true, getInstallerEDMDisplay().getQuestion(0, "language.option")); options.addOption("m", "terminal", false, getInstallerEDMDisplay().getQuestion(0, "terminal.option")); options.addOption("s", "step", true, getInstallerEDMDisplay().getQuestion(0, "step.option")); options.addOption("t", "tomcat_base", true, getInstallerEDMDisplay().getQuestion(0, "tomcat_base.option")); options.addOption("v", "verbose", false, getInstallerEDMDisplay().getQuestion(0, "verbose.option")); CommandLine line = parser.parse(options, args); // mostrar la ayuda if (line.hasOption('h')) { installerEDM.HelpInstallerEDM(options); } // directorio donde est ubicado el dspace desplegado if (line.hasOption('d')) { installerEDM.setDspaceDir(line.getOptionValue('d') + System.getProperty("file.separator")); } // directorio base del servidor de servlets (Tomcat) if (line.hasOption('t')) { installerEDM.setTomcatBase(line.getOptionValue('t') + System.getProperty("file.separator")); } // paso que ejecutar if (line.hasOption('s')) { iniStep = Integer.parseInt(line.getOptionValue('s').trim()); } // idioma con el que trabajar los elementos dc y los mensajes a mostrar. Se soporta es y en if (line.hasOption('l')) { installerEDM.setLanguage(line.getOptionValue('l').trim()); installerEDMDisplay.reloadFileDisplayMessages(language); } // terminal con el que mostrar los mensajes. if (line.hasOption('m')) { getInstallerEDMDisplay().setIsTerminal(true); } // si se pasa el parmetro j de la ruta de java if (line.hasOption('j')) { } // debug, muestra mucha informacin if (line.hasOption('g')) { installerEDM.setDebug(true); } // verbose, muesta ms informacin if (line.hasOption('v')) { installerEDM.setVerbose(true); } // ha de tener directorio de dspace if (DspaceDir == null) { getInstallerEDMDisplay().getQuestion(0, "error.dspace.dir"); installerEDM.HelpInstallerEDM(options); } // ha de tener directorio de tomcat if (TomcatBase == null) { getInstallerEDMDisplay().getQuestion(0, "error.tomcat.base"); installerEDM.HelpInstallerEDM(options); } // llamar al men de pasos installerEDM.installEDM(); } catch (Exception e) { System.out.println(""); e.printStackTrace(); } finally { installerEDM.finishInstaller(); } } /** * Constructor de la clase que muestra el men principal y lanza los pasos */ public InstallerEDM() { super(); setInstallerEDMBase(this); // captura la seal de terminacin sh = new MySignalHandler(); sh.addObserver(this); sh.handleSignal("INT"); mySH = new MyShutdown(this); Runtime.getRuntime().addShutdownHook(mySH); } /** * Se sale limpiamente del terminal */ public void finishInstaller() { try { ((InstallerEDMDisplayImpl) installerEDMDisplay).exitTerminal(); } catch (Exception e) { System.out.println(""); e.printStackTrace(); } } /** * Se recogen los pasos que existe de los fichero messages * Se recogen los elementos DC en dspace * Se llama al men principal */ private void installEDM() { try { String[] stepsDisplay = installerEDMDisplay.getQuestion(0, "steps").split(","); for (String stepDisplay : stepsDisplay) { stepsSet.add(Integer.parseInt(stepDisplay.trim())); } checkDspaceMetadataDC(); } catch (Exception e) { showException(e); finishInstaller(); } installerEDMAskosi = new InstallerEDMAskosi( Integer.parseInt(installerEDMDisplay.getQuestion(0, "step.askosi"))); sh.addObserver(installerEDMAskosi); installEDM(iniStep); } /** * Se muestra el menr principal y se recoge el paso que se introduce para lanzarlo * * @param step paso a lanzar */ private void installEDM(int step) { File dirPackage; // se ha elegido un paso correcto if (step > 0) { // instalar Askosi if (step == Integer.parseInt(installerEDMDisplay.getQuestion(0, "step.askosi"))) { installerEDMDisplay.showLn(); installerEDMDisplay.showTitle(step); installerEDMDisplay.showLn(); installerEDMDisplay.showQuestion(step, "summary"); installerEDMDisplay.showLn(); if (!proceed()) { installEDM(0); return; } if ((dirPackage = installerEDMAskosi.checkPackages()) != null && installerEDMAskosi.installPackages(dirPackage)) { installerEDMDisplay.showLn(); installerEDMDisplay.showQuestion(step, "ok"); } else { installerEDMDisplay.showLn(); installerEDMDisplay.showQuestion(step, "fail"); } } // configurar dspace para usar Askosi if (step == Integer.parseInt(installerEDMDisplay.getQuestion(0, "step.conf_dspace"))) { installerEDMDisplay.showLn(); installerEDMDisplay.showTitle(step); installerEDMDisplay.showLn(); installerEDMDisplay.showQuestion(step, "summary"); installerEDMDisplay.showLn(); if (!proceed()) { installEDM(0); return; } installerEDMConf = new InstallerEDMConf( Integer.parseInt(installerEDMDisplay.getQuestion(0, "step.conf_dspace"))); installerEDMConf.configureAll("dspace.cfg"); } // crear las autoridades en dspace if (step == Integer.parseInt(installerEDMDisplay.getQuestion(0, "step.auth_item"))) { installerEDMDisplay.showLn(); installerEDMDisplay.showTitle(step); installerEDMDisplay.showLn(); installerEDMDisplay.showQuestion(step, "summary"); installerEDMDisplay.showLn(); if (!proceed()) { installEDM(0); return; } installerEDMCreateAuth = new InstallerEDMCreateAuth( Integer.parseInt(installerEDMDisplay.getQuestion(0, "step.auth_item"))); sh.addObserver(installerEDMCreateAuth); if (!installerEDMCreateAuth.configure()) { installerEDMDisplay.showLn(); installerEDMDisplay.showQuestion(step, "fail"); } } // configurar los input-form.xml para las autoridades y Askosi if (step == Integer.parseInt(installerEDMDisplay.getQuestion(0, "step.input_forms"))) { installerEDMDisplay.showLn(); installerEDMDisplay.showTitle(step); installerEDMDisplay.showLn(); installerEDMDisplay.showQuestion(step, "summary"); installerEDMDisplay.showLn(); if (!proceed()) { installEDM(0); return; } installerEDMConf = new InstallerEDMConf( Integer.parseInt(installerEDMDisplay.getQuestion(0, "step.input_forms"))); installerEDMConf.configureAll(""); } // configurar el servicio EDMExport if (step == Integer.parseInt(installerEDMDisplay.getQuestion(0, "step.edmexport"))) { installerEDMDisplay.showLn(); installerEDMDisplay.showTitle(step); installerEDMDisplay.showLn(); installerEDMDisplay.showQuestion(step, "summary"); installerEDMDisplay.showLn(); if (!proceed()) { installEDM(0); return; } installerEDMConfEDMExport = new InstallerEDMConfEDMExport( Integer.parseInt(installerEDMDisplay.getQuestion(0, "step.edmexport")), myInstallerDirPath + fileSeparator + "packages" + fileSeparator + "EDMExport.war"); installerEDMConfEDMExport.configure(); } // configurar el plugin en java del oai para EDM if (step == Integer.parseInt(installerEDMDisplay.getQuestion(0, "step.edmcrosswalk"))) { installerEDMDisplay.showLn(); installerEDMDisplay.showTitle(step); installerEDMDisplay.showLn(); installerEDMDisplay.showQuestion(step, "summary"); installerEDMDisplay.showLn(); if (!proceed()) { installEDM(0); return; } installerManagerCrosswalk = new InstallerManagerCrosswalk( Integer.parseInt(installerEDMDisplay.getQuestion(0, "step.edmcrosswalk"))); installerManagerCrosswalk.configure(); } // configurar el plugin en xsl del oai para EDM if (step == Integer.parseInt(installerEDMDisplay.getQuestion(0, "step.edmcrosswalkxsl"))) { installerEDMDisplay.showLn(); installerEDMDisplay.showTitle(step); installerEDMDisplay.showLn(); installerEDMDisplay.showQuestion(step, "summary"); installerEDMDisplay.showLn(); if (!proceed()) { installEDM(0); return; } installerEDMCrosswalkXSL = new InstallerEDMCrosswalkXSL( Integer.parseInt(installerEDMDisplay.getQuestion(0, "step.edmcrosswalkxsl"))); installerEDMCrosswalkXSL.configure(); } // enlazar los items de dspace con las autoridades if (step == Integer.parseInt(installerEDMDisplay.getQuestion(0, "step.fillitems"))) { installerEDMDisplay.showLn(); installerEDMDisplay.showTitle(step); installerEDMDisplay.showLn(); installerEDMDisplay.showQuestion(step, "summary"); installerEDMDisplay.showLn(); if (!proceed()) { installEDM(0); return; } installerEDMFillItems = new InstallerEDMFillItems(step); installerEDMFillItems.configure(); } // salir if (step == Integer.parseInt(installerEDMDisplay.getQuestion(0, "step.exit"))) { System.exit(0); } else { installEDM(0); return; } } else { // bucle para esperar un paso correcto installerEDMDisplay.showLn(); installerEDMDisplay.showLn(); installerEDMDisplay.showTitle(0); while (true) { installerEDMDisplay.showLn(); installerEDMDisplay.showMenu(0); installerEDMDisplay.showLn(); installerEDMDisplay.showQuestion(0, "option.step"); String response = null; try { response = br.readLine(); } catch (IOException e) { showException(e); } if ((response != null) && !response.isEmpty() && stepsSet.contains(Integer.decode(response))) { response = response.trim(); installEDM(Integer.parseInt(response)); } } } } /** * Pregunta para confirmar lanzamiento del paso * * @return si se procede con el paso elegido */ private boolean proceed() { String response = null; while (true) { installerEDMDisplay.showQuestion(0, "proceed"); try { response = br.readLine(); } catch (IOException e) { showException(e); } if (response == null) continue; response = response.trim(); if (!response.isEmpty()) { if (response.equalsIgnoreCase("n")) { return false; } else if (response.equalsIgnoreCase(answerYes)) break; } else break; } return true; } /** * Mostrar la ayuda * * @param options parmetros del jar */ private void HelpInstallerEDM(Options options) { HelpFormatter myhelp = new HelpFormatter(); myhelp.printHelp("InstallerEDM\n", options); System.exit(0); } /** * Devuelve la verbosidad * * @return verbosidad */ public boolean getVerbose() { return verbose; } /** * Devuelve el kernel de dspace * * @return kernel de dspace */ static public DSpaceKernelImpl getKernelImpl() { return kernelImpl; } /** * Devuelve la clase que instala Askosi {@link InstallerEDMAskosi} * * @return clase que instala Askosi */ public InstallerEDMAskosi getInstallerEDMAskosi() { return installerEDMAskosi; } /** * Devuelve la clase que crea las autoridades {@link InstallerEDMCreateAuth} * * @return clase que crea las autoridades */ public InstallerEDMCreateAuth getInstallerEDMCreateAuth() { return installerEDMCreateAuth; } /** * Devuelve la clase que configura dspace para usar Askosi {@link InstallerEDMConf} * * @return clase que configura dspace para usar Askosi */ public InstallerEDMConf getInstallerEDMConf() { return installerEDMConf; } } /** * */ class MyShutdown extends Thread { private InstallerEDM installerEDM; /** * * @param installerEDM */ public MyShutdown(InstallerEDM installerEDM) { this.installerEDM = installerEDM; } /** * */ @Override public void run() { if (installerEDM.getVerbose()) InstallerEDMBase.getInstallerEDMDisplay().showQuestion(0, "shutdown.hook"); DSpaceKernelImpl kernelImpl = InstallerEDM.getKernelImpl(); if (kernelImpl != null) kernelImpl.destroy(); installerEDM.finishInstaller(); } }