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"); 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()); } } }