/* * 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.axis2.util; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.PrintStream; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.util.Properties; /** * Tidies up the java source code using Jalopy. * This is used by both ADB and Codegen hence needs to be in the * commons rather than a specific module */ public class PrettyPrinter { private static final Log log = LogFactory.getLog(PrettyPrinter.class); /** * Pretty prints contents of the java source file. * * @param file */ public static void prettify(File file) { // If the user has set "axis2.jalopy=false" on the system property, // then just return back to caller String property = System.getProperty("axis2.jalopy"); if((property != null) && !JavaUtils.isTrueExplicitly(property)){ return; } PrintStream backupOutputStream = System.out; PrintStream backupErrorStream = System.err; System.setOut(new PrintStream(new ByteArrayOutputStream())); System.setErr(new PrintStream(new ByteArrayOutputStream())); try { Class<?> clazzConfigurator = Loader.loadClass("org.apache.log4j.PropertyConfigurator"); Method configure = clazzConfigurator.getMethod("configure", new Class[]{Properties.class}); Properties properties = new Properties(); properties.setProperty("log4j.logger.de.hunsicker.jalopy.io", System.getProperty("log4j.logger.de.hunsicker.jalopy.io", "FATAL")); configure.invoke(null, new Object[]{properties}); // Create an instance of the Jalopy bean Class<?> clazz = Loader.loadClass("de.hunsicker.jalopy.Jalopy"); Object prettifier = clazz.newInstance(); // Set the input file Method input = clazz.getMethod("setInput", new Class[]{File.class}); input.invoke(prettifier, new Object[]{file}); // Set the output file Method output = clazz.getMethod("setOutput", new Class[]{File.class}); output.invoke(prettifier, new Object[]{file}); Class<?> clazz2 = Loader.loadClass("de.hunsicker.jalopy.storage.Convention"); Method instance = clazz2.getMethod("getInstance", new Class[]{}); Object settings = instance.invoke(null, new Object[]{}); Class<?> clazz3 = Loader.loadClass("de.hunsicker.jalopy.storage.ConventionKeys"); Field field = clazz3.getField("COMMENT_FORMAT_MULTI_LINE"); Object key = field.get(null); Method put = clazz2.getMethod("put", new Class[]{key.getClass(), String.class}); put.invoke(settings, new Object[]{key, "true"}); // format and overwrite the given input file Method format = clazz.getMethod("format", new Class[]{}); format.invoke(prettifier, new Object[]{}); log.debug("Pretty printed file : " + file); } catch (ClassNotFoundException e) { log.debug("Jalopy/Log4j not found - unable to pretty print " + file); } catch (Exception e) { log.warn("Exception occurred while trying to pretty print file " + file, e); } catch (Throwable t) { log.debug("Exception occurred while trying to pretty print file " + file, t); } finally { System.setOut(backupOutputStream); System.setErr(backupErrorStream); } } }