blob: fb1d9dfbe90004a89536b4263b309dd9ac5abe1c [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.apache.flex.swc.catalog;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;
import javax.xml.stream.StreamFilter;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamConstants;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamReader;
import org.apache.flex.compiler.common.DependencyType;
import org.apache.flex.compiler.internal.config.QNameNormalization;
import org.apache.flex.compiler.problems.ComponentTagWithoutURIProblem;
import org.apache.flex.compiler.problems.FileInLibraryIOProblem;
import org.apache.flex.swc.ISWCVersion;
import org.apache.flex.swc.SWC;
import org.apache.flex.swc.SWCComponent;
import org.apache.flex.swc.SWCDigest;
import org.apache.flex.swc.SWCLibrary;
import org.apache.flex.swc.SWCScript;
import org.apache.flex.swc.io.SWCReader;
import org.apache.flex.utils.FilenameNormalization;
/**
* A StAX implementation to parse catalog.xml in a SWC.
*/
public class StAXCatalogReader implements ICatalogXMLConstants
{
public StAXCatalogReader(final InputStream in, final SWC swc) throws XMLStreamException
{
if (swc == null)
throw new NullPointerException("SWC model can't be null");
if (in == null)
throw new NullPointerException("InputStream can't be null.");
this.swc = swc;
this.timeStamps = new HashMap<String, String>();
this.componentIndex = new HashMap<String, SWCComponent>();
// A filter only keeps start and end XML elements.
final StreamFilter filter = new StreamFilter()
{
@Override
public boolean accept(XMLStreamReader reader)
{
return reader.isStartElement();
}
};
// Configure the XML factory.
final XMLInputFactory factory = XMLInputFactory.newInstance();
assert factory != null : "Null XMLInputFactory";
// Create Stream XML reader.
final XMLStreamReader xmlStreamReader = factory.createXMLStreamReader(in);
reader = factory.createFilteredReader(xmlStreamReader, filter);
}
private final XMLStreamReader reader;
private final SWC swc;
private final Map<String, String> timeStamps;
private final Map<String, SWCComponent> componentIndex;
private SWCLibrary currentLibrary;
private SWCScript currentScript;
/**
* Close the StAX parser and the underlying {@code InputStream}.
*/
public void close() throws IOException
{
try
{
reader.close();
}
catch (XMLStreamException e)
{
throw new IOException(e.getMessage());
}
}
public void parse()
{
final String containingSWCFile = FilenameNormalization.normalize(swc.getSWCFile().getAbsolutePath());
try
{
while (reader.hasNext())
{
final int next = reader.next();
if (next != XMLStreamConstants.START_ELEMENT)
continue;
final String tagName = reader.getName().getLocalPart();
if (tagName.equals(TAG_LIBRARY))
{
final String path = reader.getAttributeValue(null, ATTR_PATH);
currentLibrary = new SWCLibrary(path);
swc.addLibrary(currentLibrary);
}
else if (tagName.equals(TAG_COMPONENT))
{
String className = reader.getAttributeValue(null, ATTR_CLASS_NAME);
className = QNameNormalization.normalize(className);
final String componentName = reader.getAttributeValue(null, ATTR_NAME);
final String uri = reader.getAttributeValue(null, ATTR_URI);
if (uri == null || uri.isEmpty())
{
swc.addProblem(new ComponentTagWithoutURIProblem(componentName, SWCReader.CATALOG_XML, containingSWCFile));
continue;
}
final String icon = reader.getAttributeValue(null, ATTR_ICON);
final String preview = reader.getAttributeValue(null, ATTR_PREVIEW);
final SWCComponent component = new SWCComponent();
if (className != null)
component.setQName(className.intern());
if (componentName != null)
component.setName(componentName.intern());
// uri is null-checked already
component.setURI(uri.intern());
if (icon != null)
component.setIcon(icon.intern());
if (preview != null)
component.setPreview(preview.intern());
swc.addComponent(component);
componentIndex.put(className, component);
}
else if (tagName.equals(TAG_SCRIPT))
{
String name = reader.getAttributeValue(null, ATTR_NAME);
String mod = reader.getAttributeValue(null, ATTR_MOD);
String signatureChecksum = reader.getAttributeValue(null, ATTR_SIGNATURE_CHECKSUM);
currentScript = new SWCScript();
if (name != null)
currentScript.setName(name.intern());
if (mod != null)
currentScript.setLastModified(Long.parseLong(mod));
if (signatureChecksum != null)
currentScript.setSignatureChecksum(signatureChecksum);
currentLibrary.addScript(currentScript);
timeStamps.put(name, mod);
}
else if (tagName.equals(TAG_FLEX))
{
final String flexVersion = reader.getAttributeValue(null, ATTR_VERSION);
final String minSupportedVersion = reader.getAttributeValue(null, ATTR_MINIMUM_SUPPORTED_VERSION);
final String flexBuild = reader.getAttributeValue(null, ATTR_BUILD);
ISWCVersion swcVersion = swc.getVersion();
swcVersion.setFlexVersion(flexVersion);
swcVersion.setFlexMinSupportedVersion(minSupportedVersion);
swcVersion.setFlexBuild(flexBuild);
}
else if (tagName.equals(TAG_SWC))
{
final String swcVersion = reader.getAttributeValue(null, ATTR_VERSION);
swc.getVersion().setSWCVersion(swcVersion);
}
else if (tagName.equals(TAG_DEF))
{
String id = reader.getAttributeValue(null, ATTR_ID);
id = QNameNormalization.normalize(id);
currentScript.addDefinition(id);
final SWCComponent component = componentIndex.get(id);
if (component != null)
component.setScript(currentScript);
}
else if (tagName.equals(TAG_DEP))
{
String id = reader.getAttributeValue(null, ATTR_ID);
id = QNameNormalization.normalize(id);
final String type = reader.getAttributeValue(null, ATTR_TYPE);
assert type.length() == 1;
currentScript.addDependency(id, DependencyType.get(type.charAt(0)));
}
else if (tagName.equals(TAG_FILE))
{
String path = reader.getAttributeValue(null, ATTR_PATH);
String modString = reader.getAttributeValue(null, ATTR_MOD);
long mod = 0;
if (modString != null)
mod = Long.parseLong(modString);
SWCFileEntry fileEntry = new SWCFileEntry(containingSWCFile, path, mod);
swc.addFile(fileEntry);
}
else if (tagName.equals(TAG_DIGEST))
{
String type = reader.getAttributeValue(null, ATTR_TYPE);
String value = reader.getAttributeValue(null, ATTR_VALUE);
boolean isSigned = Boolean.parseBoolean(reader.getAttributeValue(null, ATTR_SIGNED));
SWCDigest swcDigest = new SWCDigest();
swcDigest.setType(type);
swcDigest.setValue(value);
swcDigest.setSigned(isSigned);
currentLibrary.addDigest(swcDigest);
}
else if (tagName.equals(TAG_METADATA))
{
String metadataName = reader.getAttributeValue(null, ATTR_NAME);
currentLibrary.addNameToKeepAS3MetadataSet(metadataName);
}
else if (tagName.equals(TAG_COMPILER))
{
final String compilerName = reader.getAttributeValue(null, ATTR_NAME);
final String compilerVersion = reader.getAttributeValue(null, ATTR_VERSION);
final String compilerBuild = reader.getAttributeValue(null, ATTR_BUILD);
ISWCVersion swcVersion = swc.getVersion();
swcVersion.setCompilerName(compilerName);
swcVersion.setCompilerVersion(compilerVersion);
swcVersion.setCompilerBuild(compilerBuild);
}
}
}
catch (XMLStreamException e)
{
swc.addProblem(new FileInLibraryIOProblem(SWCReader.CATALOG_XML,
containingSWCFile,
e.getLocalizedMessage()));
}
}
}