io.termd.core.term.TermInfoBuilder Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of termd-core Show documentation
Show all versions of termd-core Show documentation
An open source terminal daemon library providing terminal handling in Java,
back ported to Alibaba by core engine team to support running on JDK 6+.
/*
* Copyright 2015 Julien Viet
*
* Licensed 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 io.termd.core.term;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
/**
* @author Julien Viet
*/
public class TermInfoBuilder extends ParserHandler {
static class Entry {
final List names = new ArrayList();
final List> features = new ArrayList>();
final List uses = new ArrayList();
boolean resolving;
Device resolved;
}
private Entry entry;
private final List entries = new ArrayList();
@Override
public void beginHeaderLine(String name) {
entry = new Entry();
entry.names.add(name);
}
@Override
public void addHeader(String name) {
entry.names.add(name);
}
@Override
public void endHeaderLine() {
}
@Override
public void addBooleanFeature(String name, boolean value) {
entry.features.add(Feature.create(name, value));
}
@Override
public void addStringFeature(String name, Sequence value) {
if ("use".equals(name)) {
entry.uses.add(value.toString());
} else {
entry.features.add(Feature.create(name, value));
}
}
@Override
public void addNumericFeature(String name, int value) {
entry.features.add(Feature.create(name, value));
}
@Override
public void endDevice() {
entries.add(entry);
entry = null;
}
@Override
public void endDatabase() {
}
public TermInfo build() {
Map entryMap = new HashMap();
for (Entry entry : entries) {
for (String alias : entry.names) {
entryMap.put(alias, entry);
}
}
Map devices = new LinkedHashMap();
for (Entry entry : entryMap.values()) {
Device resolved = resolve(entryMap, entry.names.get(0));
devices.put(resolved.name, resolved);
for (String synonym : resolved.synonyms) {
devices.put(synonym, resolved);
}
}
return new TermInfo(devices);
}
private Device resolve(
Map entryMap,
String name) {
Entry entry = entryMap.get(name);
if (entry == null) {
throw new IllegalStateException("Entry not found " + name);
}
if (entry.resolved != null) {
return entry.resolved;
}
if (entry.resolving) {
throw new IllegalStateException("Detected cycle in term info dependencies");
}
entry.resolving = true;
Device result = new Device(entry.names);
for (String use : entry.uses) {
Device useEntry = resolve(entryMap, use);
result.addFeatures(useEntry.getFeatures());
}
result.addFeatures(entry.features);
entry.resolving = false;
entry.resolved = result;
return result;
}
}