blob: 056302ccb9f1671f7de30b253e83609da8b8c9ba [file] [log] [blame]
/*
* 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.openide.util.lookup.implspi;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.Reader;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import java.util.SortedSet;
/**
* One entry in a {@code META-INF/services/*} file.
* For purposes of collections, all lines with the same impl class are equal,
* and lines with lower position sort first (else by class name).
*/
final class ServiceLoaderLine implements Comparable<ServiceLoaderLine> {
private static final String POSITION = "#position="; // NOI18N
private static final String SUPERSEDE = "#-"; // NOI18N
private final String impl;
private final int position;
private final String[] supersedes;
public ServiceLoaderLine(String impl, int position, String[] supersedes) {
this.impl = impl;
this.position = position;
this.supersedes = supersedes;
}
public @Override int compareTo(ServiceLoaderLine o) {
if (impl.equals(o.impl)) {
return 0;
}
int r = position - o.position;
return r != 0 ? r : impl.compareTo(o.impl);
}
public @Override boolean equals(Object o) {
return o instanceof ServiceLoaderLine && impl.equals(((ServiceLoaderLine) o).impl);
}
public @Override int hashCode() {
return impl.hashCode();
}
public void write(PrintWriter w) {
w.println(impl);
if (position != Integer.MAX_VALUE) {
w.println(POSITION + position);
}
for (String exclude : supersedes) {
w.println(SUPERSEDE + exclude);
}
}
public static void parse(Reader r, SortedSet<ServiceLoaderLine> lines) throws IOException {
BufferedReader br = new BufferedReader(r);
String line;
String impl = null;
int position = Integer.MAX_VALUE;
List<String> supersedes = new ArrayList<String>();
while ((line = br.readLine()) != null) {
if (line.startsWith(POSITION)) {
position = Integer.parseInt(line.substring(POSITION.length()));
} else if (line.startsWith(SUPERSEDE)) {
supersedes.add(line.substring(SUPERSEDE.length()));
} else {
finalize(lines, impl, position, supersedes);
impl = line;
position = Integer.MAX_VALUE;
supersedes.clear();
}
}
finalize(lines, impl, position, supersedes);
}
private static void finalize(Set<ServiceLoaderLine> lines, String impl, int position, List<String> supersedes) {
if (impl != null) {
lines.add(new ServiceLoaderLine(impl, position, supersedes.toArray(new String[supersedes.size()])));
}
}
}