blob: 7237aa9db6e5f7a93759fe79bb61293f42016027 [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
*
* https://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.apache.ivy.osgi.p2;
import java.io.IOException;
import java.io.InputStream;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
import javax.xml.parsers.ParserConfigurationException;
import org.apache.ivy.osgi.util.DelegatingHandler;
import org.apache.ivy.util.XMLHelper;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
public class P2CompositeParser implements XMLInputParser {
private Set<String> childLocations = new LinkedHashSet<>();
public Set<String> getChildLocations() {
return childLocations;
}
public void parse(InputStream in) throws IOException, ParseException, SAXException {
RepositoryHandler handler = new RepositoryHandler();
try {
XMLHelper.parse(in, null, handler, null);
} catch (ParserConfigurationException e) {
throw new SAXException(e);
}
childLocations.addAll(handler.childLocations);
}
private static class RepositoryHandler extends DelegatingHandler {
private static final String REPOSITORY = "repository";
// private static final String NAME = "name";
//
// private static final String TYPE = "type";
//
// private static final String VERSION = "version";
List<String> childLocations = Collections.emptyList();
public RepositoryHandler() {
super(REPOSITORY);
addChild(new ChildrenHandler(), new ChildElementHandler<ChildrenHandler>() {
@Override
public void childHandled(ChildrenHandler child) {
childLocations = child.childLocations;
}
});
}
// protected void handleAttributes(Attributes atts) {
// String name = atts.getValue(NAME);
// String type = atts.getValue(TYPE);
// String version = atts.getValue(VERSION);
// }
}
private static class ChildrenHandler extends DelegatingHandler {
private static final String CHILDREN = "children";
private static final String SIZE = "size";
List<String> childLocations;
public ChildrenHandler() {
super(CHILDREN);
addChild(new ChildHandler(), new ChildElementHandler<ChildHandler>() {
@Override
public void childHandled(ChildHandler child) {
childLocations.add(child.location);
}
});
}
@Override
protected void handleAttributes(Attributes atts) {
int size = Integer.parseInt(atts.getValue(SIZE));
childLocations = new ArrayList<>(size);
}
}
private static class ChildHandler extends DelegatingHandler {
private static final String CHILD = "child";
private static final String LOCATION = "location";
String location;
public ChildHandler() {
super(CHILD);
}
@Override
protected void handleAttributes(Attributes atts) {
location = atts.getValue(LOCATION);
}
}
}