/* $Id$ */ /** * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF 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 org.apache.manifoldcf.core.tests; import org.apache.manifoldcf.core.interfaces.*; import org.apache.manifoldcf.core.system.ManifoldCF; import java.io.*; import java.nio.charset.StandardCharsets; import java.util.*; import org.junit.*; /** This is a testing base class that is the base class of all ManifoldCF testing classes, at least the ones * that manage configuration files and database setup. */ public class Base { protected File currentPath = null; protected File configFile = null; protected File loggingFile = null; protected File logOutputFile = null; protected File connectorFile = null; protected void initialize() throws Exception { if (currentPath == null) { currentPath = new File(".").getCanonicalFile(); // First, write a properties file and a logging file, in the current directory. configFile = new File("properties.xml").getCanonicalFile(); loggingFile = new File("logging.xml").getCanonicalFile(); logOutputFile = new File("manifoldcf.log").getCanonicalFile(); connectorFile = new File("connectors.xml").getCanonicalFile(); // Set a system property that will point us to the proper place to find the properties file System.setProperty("org.apache.manifoldcf.configfile",configFile.getCanonicalFile().getAbsolutePath()); } } protected boolean isInitialized() { return configFile.exists(); } @Before public void setUp() throws Exception { initializeSystem(); try { localReset(); } catch (Exception e) { System.out.println("Warning: Preclean error: "+e.getMessage()); } try { localSetUp(); } catch (Exception e) { e.printStackTrace(); throw e; } } /** Method to write the logging.ini contents. * Override this method if you want different contents, or you want to your own stuff. */ protected void writeLoggingIni(StringBuilder output) throws Exception { output.append( "<Configuration status=\"warn\" name=\"ManifoldCF\" packages=\"\">\n"+ " <Appenders>\n"+ " <File name=\"MyFile\" fileName=\""+logOutputFile.getAbsolutePath().replaceAll("\\\\","/")+"\">\n"+ " <PatternLayout>\n"+ " <Pattern>%5p %d{ISO8601} (%t) - %m%n</Pattern>\n"+ " </PatternLayout>\n"+ " </File>\n"+ " </Appenders>\n"+ " <Loggers>\n"+ " <Root level=\"error\">\n"+ " <AppenderRef ref=\"MyFile\"/>\n"+ " </Root>\n"+ " </Loggers>\n"+ "</Configuration>\n" ); } /** Method to write the properties.xml contents. * Override this method if you want dto replace everything * with your own stuff. */ protected void writePropertiesXML(StringBuilder output) throws Exception { output.append( "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n" + "<configuration>\n" ); writeProperties(output); output.append( "</configuration>\n" ); } /** Method to add properties to properties.xml contents. * Override this method to add properties clauses to the property file. */ protected void writeProperties(StringBuilder output) throws Exception { output.append( " <property name=\"org.apache.manifoldcf.logconfigfile\" value=\""+loggingFile.getAbsolutePath().replaceAll("\\\\","/")+"\"/>\n"+ " <property name=\"org.apache.manifoldcf.connectorsconfigurationfile\" value=\""+connectorFile.getAbsolutePath().replaceAll("\\\\","/")+"\"/>\n"+ " <property name=\"org.apache.manifoldcf.diagnostics\" value=\"DEBUG\"/>\n" ); } /** Method to write the connectors.xml contents. * Override to replace everything. */ protected void writeConnectorsXML(StringBuilder output) throws Exception { output.append( "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n" + "<connectors>\n" ); writeConnectors(output); output.append( "</connectors>\n" ); } /** Method to add connectors to connectors.xml contents. * Override this method to add connector clauses to the connectors file. */ protected void writeConnectors(StringBuilder output) throws Exception { } /** Method to get database superuser name. */ protected String getDatabaseSuperuserName() throws Exception { return ""; } /** Method to get database superuser password. */ protected String getDatabaseSuperuserPassword() throws Exception { return ""; } protected void initializeSystem() throws Exception { initialize(); StringBuilder loggingIniContents = new StringBuilder(); writeLoggingIni(loggingIniContents); writeFile(loggingFile,loggingIniContents.toString()); StringBuilder propertiesXMLContents = new StringBuilder(); writePropertiesXML(propertiesXMLContents); writeFile(configFile,propertiesXMLContents.toString()); StringBuilder connectorsXMLContents = new StringBuilder(); writeConnectorsXML(connectorsXMLContents); writeFile(connectorFile,connectorsXMLContents.toString()); ManifoldCF.initializeEnvironment(ThreadContextFactory.make()); } protected void localSetUp() throws Exception { IThreadContext tc = ThreadContextFactory.make(); // Create the database ManifoldCF.createSystemDatabase(tc,getDatabaseSuperuserName(),getDatabaseSuperuserPassword()); } @After public void cleanUp() throws Exception { try { localCleanUp(); } catch (Exception e) { e.printStackTrace(); throw e; } cleanupSystem(); } protected void cleanupSystem() throws Exception { initialize(); if (isInitialized()) { // Get rid of the property and logging files. logOutputFile.delete(); configFile.delete(); loggingFile.delete(); connectorFile.delete(); IThreadContext threadContext = ThreadContextFactory.make(); ManifoldCF.cleanUpEnvironment(threadContext); // Just in case we're not synchronized... ManifoldCF.resetEnvironment(threadContext); } } protected void localReset() throws Exception { IThreadContext tc = ThreadContextFactory.make(); // Remove the database ManifoldCF.dropSystemDatabase(tc,getDatabaseSuperuserName(),getDatabaseSuperuserPassword()); } protected void localCleanUp() throws Exception { localReset(); } protected static void writeFile(File f, String fileContents) throws IOException { OutputStream os = new FileOutputStream(f); try { Writer w = new OutputStreamWriter(os, StandardCharsets.UTF_8); try { w.write(fileContents); } finally { w.close(); } } finally { os.close(); } } }