blob: 561e8bf50bb2b293456936dd578aab00b92c59ce [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2010, 2015 Sonatype, Inc.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Stuart McCulloch (Sonatype, Inc.) - initial API and implementation
*******************************************************************************/
package org.eclipse.sisu.space;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.Reader;
import java.io.Writer;
import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
/**
* Skeleton class that generates a qualified class index.
*/
abstract class AbstractSisuIndex
{
// ----------------------------------------------------------------------
// Constants
// ----------------------------------------------------------------------
static final String INDEX_FOLDER = "META-INF/sisu/";
static final String QUALIFIER = "javax.inject.Qualifier";
static final String NAMED = "javax.inject.Named";
// ----------------------------------------------------------------------
// Implementation fields
// ----------------------------------------------------------------------
private final Map<Object, Set<String>> index = new LinkedHashMap<Object, Set<String>>();
// ----------------------------------------------------------------------
// Common methods
// ----------------------------------------------------------------------
/**
* Adds a new annotated class entry to the index.
*
* @param anno The annotation name
* @param clazz The class name
*/
protected final synchronized void addClassToIndex( final Object anno, final Object clazz )
{
Set<String> table = index.get( anno );
if ( null == table )
{
table = readTable( anno );
index.put( anno, table );
}
table.add( String.valueOf( clazz ) );
}
/**
* Writes the current index as a series of tables.
*/
protected final synchronized void flushIndex()
{
for ( final Entry<Object, Set<String>> entry : index.entrySet() )
{
writeTable( entry.getKey(), entry.getValue() );
}
}
// ----------------------------------------------------------------------
// Customizable methods
// ----------------------------------------------------------------------
/**
* Reports an informational message.
*
* @param message The message
*/
protected abstract void info( final String message );
/**
* Reports a warning message.
*
* @param message The message
*/
protected abstract void warn( final String message );
/**
* Creates a new reader for the given input path.
*
* @param path The input path
* @return The relevant reader
*/
protected abstract Reader getReader( final String path )
throws IOException;
/**
* Creates a new writer for the given output path.
*
* @param path The output path
* @return The relevant writer
*/
protected abstract Writer getWriter( final String path )
throws IOException;
// ----------------------------------------------------------------------
// Implementation methods
// ----------------------------------------------------------------------
/**
* Reads the given index table from disk to memory.
*
* @param name The table name
* @return Table elements
*/
private Set<String> readTable( final Object name )
{
final Set<String> table = new LinkedHashSet<String>();
try
{
final BufferedReader reader = new BufferedReader( getReader( INDEX_FOLDER + name ) );
try
{
for ( String line = reader.readLine(); line != null; line = reader.readLine() )
{
table.add( line );
}
}
finally
{
reader.close();
}
}
catch ( final IOException e ) // NOPMD
{
// ignore missing index
}
return table;
}
/**
* Writes the given index table from memory to disk.
*
* @param name The table name
* @param table The elements
*/
private void writeTable( final Object name, final Set<String> table )
{
try
{
final BufferedWriter writer = new BufferedWriter( getWriter( INDEX_FOLDER + name ) );
try
{
for ( final String line : table )
{
writer.write( line );
writer.newLine();
}
}
finally
{
writer.close();
}
}
catch ( final IOException e )
{
warn( e.toString() );
}
}
}