blob: 76fc1e522d1cc07038b1a96abfa02f7a0b135f69 [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 java.util.HashMap;
import java.util.Map;
import org.apache.maven.index.reader.Record.Type;
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");
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());
}
}
}