/******************************************************************************* * Copyright (c) 2007, 2010 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/ package org.eclipse.equinox.internal.p2.engine; import java.util.LinkedHashMap; import java.util.Map; import org.eclipse.equinox.internal.p2.metadata.repository.io.MetadataParser; import org.eclipse.equinox.p2.metadata.IInstallableUnit; import org.eclipse.equinox.p2.metadata.Version; import org.osgi.framework.BundleContext; import org.xml.sax.Attributes; /** * An abstract XML parser class for parsing profiles as written by the ProfileWriter. */ public abstract class ProfileParser extends MetadataParser implements ProfileXMLConstants { public ProfileParser(BundleContext context, String bundleId) { super(context, bundleId); } protected class ProfileHandler extends RootHandler { private final String[] required = new String[] {ID_ATTRIBUTE}; private String profileId; private String parentId; private String timestamp; private PropertiesHandler propertiesHandler; private InstallableUnitsHandler unitsHandler; private IUsPropertiesHandler iusPropertiesHandler; public ProfileHandler() { // default } protected ProfileHandler(String profileId) { this.profileId = profileId; } protected void handleRootAttributes(Attributes attributes) { profileId = parseRequiredAttributes(attributes, required)[0]; parentId = parseOptionalAttribute(attributes, PARENT_ID_ATTRIBUTE); timestamp = parseOptionalAttribute(attributes, TIMESTAMP_ATTRIBUTE); } public void startElement(String name, Attributes attributes) { if (PROPERTIES_ELEMENT.equals(name)) { if (propertiesHandler == null) { propertiesHandler = new PropertiesHandler(this, attributes); } else { duplicateElement(this, name, attributes); } } else if (INSTALLABLE_UNITS_ELEMENT.equals(name)) { if (unitsHandler == null) { unitsHandler = new InstallableUnitsHandler(this, attributes); } else { duplicateElement(this, name, attributes); } } else if (IUS_PROPERTIES_ELEMENT.equals(name)) { if (iusPropertiesHandler == null) { iusPropertiesHandler = new IUsPropertiesHandler(this, attributes); } else { duplicateElement(this, name, attributes); } } else { invalidElement(name, attributes); } } public String getProfileId() { return profileId; } public String getParentId() { return parentId; } public long getTimestamp() { if (timestamp != null) { try { return Long.parseLong(timestamp); } catch (NumberFormatException e) { // TODO: log } } return 0; } public Map<String, String> getProperties() { if (propertiesHandler == null) return null; return propertiesHandler.getProperties(); } public IInstallableUnit[] getInstallableUnits() { if (unitsHandler == null) return null; return unitsHandler.getUnits(); } public Map<String, String> getIUProperties(IInstallableUnit iu) { if (iusPropertiesHandler == null) return null; Map<String, Map<String, String>> iusPropertiesMap = iusPropertiesHandler.getIUsPropertiesMap(); if (iusPropertiesMap == null) return null; String iuIdentity = iu.getId() + "_" + iu.getVersion().toString(); //$NON-NLS-1$ return iusPropertiesMap.get(iuIdentity); } } protected class IUPropertiesHandler extends AbstractHandler { private final String[] required = new String[] {ID_ATTRIBUTE, VERSION_ATTRIBUTE}; private String iuIdentity; private Map<String, Map<String, String>> iusPropertiesMap; private PropertiesHandler propertiesHandler; public IUPropertiesHandler(AbstractHandler parentHandler, Attributes attributes, Map<String, Map<String, String>> iusPropertiesMap) { super(parentHandler, IU_PROPERTIES_ELEMENT); this.iusPropertiesMap = iusPropertiesMap; String values[] = parseRequiredAttributes(attributes, required); String id = values[0]; Version version = checkVersion(IU_PROPERTIES_ELEMENT, VERSION_ATTRIBUTE, values[1]); iuIdentity = id + "_" + version.toString(); //$NON-NLS-1$ } protected void finished() { if (isValidXML() && iuIdentity != null && propertiesHandler != null) { iusPropertiesMap.put(iuIdentity, propertiesHandler.getProperties()); } } public void startElement(String name, Attributes attributes) { if (name.equals(PROPERTIES_ELEMENT)) { propertiesHandler = new PropertiesHandler(this, attributes); } else { invalidElement(name, attributes); } } } protected class IUsPropertiesHandler extends AbstractHandler { private Map<String, Map<String, String>> iusPropertiesMap; public IUsPropertiesHandler(AbstractHandler parentHandler, Attributes attributes) { super(parentHandler, IUS_PROPERTIES_ELEMENT); String sizeStr = parseOptionalAttribute(attributes, COLLECTION_SIZE_ATTRIBUTE); int size = (sizeStr != null ? new Integer(sizeStr).intValue() : 4); iusPropertiesMap = new LinkedHashMap<String, Map<String, String>>(size); } public Map<String, Map<String, String>> getIUsPropertiesMap() { return iusPropertiesMap; } public void startElement(String name, Attributes attributes) { if (name.equals(IU_PROPERTIES_ELEMENT)) { new IUPropertiesHandler(this, attributes, iusPropertiesMap); } else { invalidElement(name, attributes); } } } }