/* * 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.usergrid.tools; import java.io.File; import java.io.IOException; import java.io.PrintWriter; import java.util.UUID; import com.fasterxml.jackson.core.JsonFactory; import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.core.util.DefaultPrettyPrinter; import com.fasterxml.jackson.databind.ObjectMapper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.apache.usergrid.utils.ConversionUtils; import org.apache.commons.cli.CommandLine; import org.apache.commons.cli.Option; import org.apache.commons.cli.OptionBuilder; import org.apache.commons.cli.Options; /** * Base class for ToolBase implementations that write output to an output directory and file. * * @author zznate */ public abstract class ExportingToolBase extends ToolBase { protected Logger logger = LoggerFactory.getLogger( ExportingToolBase.class ); protected static File outputDir; /** Output dir option: -outputDir */ protected static final String OUTPUT_DIR = "outputDir"; protected String baseOutputDirName = "export"; protected UUID orgId; JsonFactory jsonFactory = new JsonFactory(); protected long startTime = System.currentTimeMillis(); @Override @SuppressWarnings("static-access") public Options createOptions() { Options options = super.createOptions(); Option outputDir = OptionBuilder.hasArg().withDescription( "output file name -outputDir" ).create( OUTPUT_DIR ); Option orgId = OptionBuilder.hasArg().withDescription( "Use a specific organization -orgId" ).create( "orgId" ); options.addOption( outputDir ); options.addOption( orgId ); return options; } protected void prepareBaseOutputFileName( CommandLine line ) { boolean hasOutputDir = line.hasOption( OUTPUT_DIR ); if ( hasOutputDir ) { baseOutputDirName = line.getOptionValue( OUTPUT_DIR ); } } protected void applyOrgId( CommandLine line ) { if ( line.hasOption( "orgId" ) ) { orgId = ConversionUtils.uuid( line.getOptionValue( "orgId" ) ); } } /** * Write the string onto the writer and check if verbose is enabled to log also an echo of what is being written to * the writer. * * @param out PrintWriter * @param content string to be written */ @SuppressWarnings("unused") protected void writeOutput( PrintWriter out, String content ) { echo( content ); out.print( content ); } protected File createOutputParentDir() { return createDir( baseOutputDirName ); } protected File createOutputFile( String type, String name ) { return new File( outputDir, prepareOutputFileName( type, name ) ); } protected File createOutputFile( File parent, String type, String name ) { return new File( parent, prepareOutputFileName( type, name ) ); } protected File createCollectionsDir( String applicationName ) { return createDir( String.format( "%s/%s.applicationName.collections", outputDir, applicationName ) ); } protected File createDir( String dirName ) { File file = new File( dirName ); if ( file.exists() ) { if ( file.isDirectory() ) { return file; } else { throw new RuntimeException( String.format( "Unable to create directory %s. It already exists as a file", dirName ) ); } } if ( !file.mkdirs() ) { throw new RuntimeException( String.format( "Unable to create directory %s", dirName ) ); } return file; } /** * @param type just a label such us: organization, application. * * @return the file name concatenated with the type and the name of the collection */ protected String prepareOutputFileName( String type, String name ) { name = name.replace( "/", PATH_REPLACEMENT ); // Add application and timestamp StringBuilder str = new StringBuilder(); // str.append(baseOutputFileName); // str.append("."); str.append( type ); str.append( "." ); str.append( name ); str.append( "." ); str.append( startTime ); str.append( ".json" ); String outputFileName = str.toString(); logger.info( "Creating output filename:" + outputFileName ); return outputFileName; } protected JsonGenerator getJsonGenerator(String outFile ) throws IOException { return getJsonGenerator( new File( outputDir, outFile ) ); } protected JsonGenerator getJsonGenerator( File outFile ) throws IOException { PrintWriter out = new PrintWriter( outFile, "UTF-8" ); JsonGenerator jg = jsonFactory.createJsonGenerator( out ); jg.setPrettyPrinter( new DefaultPrettyPrinter() ); jg.setCodec( new ObjectMapper() ); return jg; } }