blob: 17765ef02b17cd3741472f02eb120b7e59d05c50 [file] [log] [blame]
package org.apache.maven.index.reader;
/*
* 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.
*/
import org.apache.maven.index.reader.Record.Type;
import java.util.HashMap;
import java.util.Map;
import static org.apache.maven.index.reader.Utils.FIELD_SEPARATOR;
import static org.apache.maven.index.reader.Utils.INFO;
import static org.apache.maven.index.reader.Utils.UINFO;
import static org.apache.maven.index.reader.Utils.nvl;
/**
* Maven 2 Index record transformer, that transforms {@link Record}s into "native" Maven Indexer records.
*
* @since 5.1.2
*/
public class RecordCompactor
{
/**
* Compacts {@link Record} into low level MI record with all the encoded fields as physically present in MI binary
* chunk.
*/
public Map<String, String> apply( final Record record )
{
if ( Type.DESCRIPTOR == record.getType() )
{
return compactDescriptor( record );
}
else if ( Type.ALL_GROUPS == record.getType() )
{
return compactAllGroups( record );
}
else if ( Type.ROOT_GROUPS == record.getType() )
{
return compactRootGroups( record );
}
else if ( Type.ARTIFACT_REMOVE == record.getType() )
{
return compactDeletedArtifact( record );
}
else if ( Type.ARTIFACT_ADD == record.getType() )
{
return compactAddedArtifact( record );
}
else
{
throw new IllegalArgumentException( "Unknown record: " + record );
}
}
private static Map<String, String> compactDescriptor( final Record record )
{
final Map<String, String> result = new HashMap<String, String>();
result.put( "DESCRIPTOR", "NexusIndex" );
result.put( "IDXINFO", "1.0|" + record.get( Record.REPOSITORY_ID ) );
return result;
}
private static Map<String, String> compactAllGroups( final Record record )
{
final Map<String, String> result = new HashMap<String, String>();
result.put( "allGroups", "allGroups" );
putIfNotNullAsStringArray( record.get( Record.ALL_GROUPS ), result, "allGroupsList" );
return result;
}
private static Map<String, String> compactRootGroups( final Record record )
{
final Map<String, String> result = new HashMap<String, String>();
result.put( "rootGroups", "allGroups" );
putIfNotNullAsStringArray( record.get( Record.ROOT_GROUPS ), result, "rootGroupsList" );
return result;
}
private static Map<String, String> compactDeletedArtifact( final Record record )
{
final Map<String, String> result = new HashMap<String, String>();
putIfNotNullTS( record.get( Record.REC_MODIFIED ), result, "m" );
result.put( "del", compactUinfo( record ) );
return result;
}
/**
* Expands the "encoded" Maven Indexer record by splitting the synthetic fields and applying expanded field naming.
*/
private static Map<String, String> compactAddedArtifact( final Record record )
{
final Map<String, String> result = new HashMap<String, String>();
// Minimal
result.put( UINFO, compactUinfo( record ) );
StringBuilder info = new StringBuilder();
info.append( nvl( record.get( Record.PACKAGING ) ) );
info.append( FIELD_SEPARATOR );
info.append( record.get( Record.FILE_MODIFIED ) );
info.append( FIELD_SEPARATOR );
info.append( record.get( Record.FILE_SIZE ) );
info.append( FIELD_SEPARATOR );
info.append( record.get( Record.HAS_SOURCES ) ? "1" : "0" );
info.append( FIELD_SEPARATOR );
info.append( record.get( Record.HAS_JAVADOC ) ? "1" : "0" );
info.append( FIELD_SEPARATOR );
info.append( record.get( Record.HAS_SIGNATURE ) ? "1" : "0" );
info.append( FIELD_SEPARATOR );
info.append( nvl( record.get( Record.FILE_EXTENSION ) ) );
result.put( INFO, info.toString() );
putIfNotNullTS( record.get( Record.REC_MODIFIED ), result, "m" );
putIfNotNull( record.get( Record.NAME ), result, "n" );
putIfNotNull( record.get( Record.DESCRIPTION ), result, "d" );
putIfNotNull( record.get( Record.SHA1 ), result, "1" );
// Jar file contents (optional)
putIfNotNullAsStringArray( record.get( Record.CLASSNAMES ), result, "classnames" );
// Maven Plugin (optional)
putIfNotNull( record.get( Record.PLUGIN_PREFIX ), result, "px" );
putIfNotNullAsStringArray( record.get( Record.PLUGIN_GOALS ), result, "gx" );
// OSGi (optional)
putIfNotNull( record.get( Record.OSGI_BUNDLE_SYMBOLIC_NAME ), result, "Bundle-SymbolicName" );
putIfNotNull( record.get( Record.OSGI_BUNDLE_VERSION ), result, "Bundle-Version" );
putIfNotNull( record.get( Record.OSGI_EXPORT_PACKAGE ), result, "Export-Package" );
putIfNotNull( record.get( Record.OSGI_EXPORT_SERVICE ), result, "Export-Service" );
putIfNotNull( record.get( Record.OSGI_BUNDLE_DESCRIPTION ), result, "Bundle-Description" );
putIfNotNull( record.get( Record.OSGI_BUNDLE_NAME ), result, "Bundle-Name" );
putIfNotNull( record.get( Record.OSGI_BUNDLE_LICENSE ), result, "Bundle-License" );
putIfNotNull( record.get( Record.OSGI_EXPORT_DOCURL ), result, "Bundle-DocURL" );
putIfNotNull( record.get( Record.OSGI_IMPORT_PACKAGE ), result, "Import-Package" );
putIfNotNull( record.get( Record.OSGI_REQUIRE_BUNDLE ), result, "Require-Bundle" );
putIfNotNull( record.get( Record.OSGI_PROVIDE_CAPABILITY ), result, "Provide-Capability" );
putIfNotNull( record.get( Record.OSGI_REQUIRE_CAPABILITY ), result, "Require-Capability" );
putIfNotNull( record.get( Record.OSGI_FRAGMENT_HOST ), result, "Fragment-Host" );
putIfNotNull( record.get( Record.OSGI_BREE ), result, "Bundle-RequiredExecutionEnvironment" );
putIfNotNull( record.get( Record.SHA_256 ), result, "sha256" );
return result;
}
/**
* Creates UINFO synthetic field.
*/
private static String compactUinfo( final Record record )
{
final String classifier = record.get( Record.CLASSIFIER );
StringBuilder sb = new StringBuilder();
sb.append( record.get( Record.GROUP_ID ) ).append( FIELD_SEPARATOR ).append(
record.get( Record.ARTIFACT_ID ) ).append( FIELD_SEPARATOR ).append( record.get( Record.VERSION ) ).append(
FIELD_SEPARATOR ).append( nvl( classifier ) );
if ( classifier != null )
{
sb.append( FIELD_SEPARATOR ).append( record.get( Record.FILE_EXTENSION ) );
}
return sb.toString();
}
/**
* Helper to put a value from source map into target map, if not null.
*/
private static void putIfNotNull( final String source, final Map<String, String> target, final String targetName )
{
if ( source != null )
{
target.put( targetName, source );
}
}
/**
* Helper to put a {@link Long} value from source map into target map, if not null.
*/
private static void putIfNotNullTS( final Long source, final Map<String, String> target, final String targetName )
{
if ( source != null )
{
target.put( targetName, String.valueOf( source ) );
}
}
/**
* Helper to put a array value from source map into target map joined with {@link Utils#FIELD_SEPARATOR}, if not
* null.
*/
private static void putIfNotNullAsStringArray( final String[] source, final Map<String, String> target,
final String targetName )
{
if ( source != null && source.length > 0 )
{
StringBuilder sb = new StringBuilder();
sb.append( source[0] );
for ( int i = 1; i < source.length; i++ )
{
sb.append( FIELD_SEPARATOR ).append( source[i] );
}
target.put( targetName, sb.toString() );
}
}
}