/******************************************************************************* * Copyright (c) 2004, 2016 Intel 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: * Intel Corporation - Initial API and implementation * IBM Corporation *******************************************************************************/ package org.eclipse.cdt.managedbuilder.internal.core; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import org.eclipse.cdt.core.settings.model.ICStorageElement; import org.eclipse.cdt.core.settings.model.extension.CTargetPlatformData; import org.eclipse.cdt.core.settings.model.util.CDataUtil; import org.eclipse.cdt.internal.core.SafeStringInterner; import org.eclipse.cdt.managedbuilder.core.IBuildObject; import org.eclipse.cdt.managedbuilder.core.IManagedConfigElement; import org.eclipse.cdt.managedbuilder.core.IProjectType; import org.eclipse.cdt.managedbuilder.core.ITargetPlatform; import org.eclipse.cdt.managedbuilder.core.IToolChain; import org.eclipse.cdt.managedbuilder.core.ManagedBuildManager; import org.eclipse.cdt.managedbuilder.internal.dataprovider.BuildTargetPlatformData; import org.osgi.framework.Version; public class TargetPlatform extends BuildObject implements ITargetPlatform { private static final String EMPTY_STRING = ""; //$NON-NLS-1$ // Superclass private ITargetPlatform superClass; private String superClassId; // Parent and children private IToolChain parent; // Managed Build model attributes private String unusedChildren; private String errorParserIds; private Boolean isAbstract; private List<String> osList; private List<String> archList; private List<String> binaryParserList; // Miscellaneous private boolean isExtensionTargetPlatform = false; private boolean isDirty = false; private boolean resolved = true; private BuildTargetPlatformData fTargetPlatformData; /* * C O N S T R U C T O R S */ /** * This constructor is called to create a TargetPlatform defined by an * extension point in a plugin manifest file, or returned by a dynamic element provider * * @param parent The IToolChain parent of this TargetPlatform, or <code>null</code> if * defined at the top level * @param element The TargetPlatform definition from the manifest file or a dynamic element * provider * @param managedBuildRevision the fileVersion of Managed Build System */ public TargetPlatform(IToolChain parent, IManagedConfigElement element, String managedBuildRevision) { this.parent = parent; isExtensionTargetPlatform = true; // setup for resolving resolved = false; setManagedBuildRevision(managedBuildRevision); loadFromManifest(element); // Hook me up to the Managed Build Manager ManagedBuildManager.addExtensionTargetPlatform(this); } /** * This constructor is called to create a TargetPlatform whose attributes and children will be * added by separate calls. * * @param parent The parent of the builder, if any * @param superClass The superClass, if any * @param Id The id for the new tool chain * @param name The name for the new tool chain * @param isExtensionElement Indicates whether this is an extension element or a managed project element */ public TargetPlatform(ToolChain parent, ITargetPlatform superClass, String Id, String name, boolean isExtensionElement) { this.parent = parent; this.superClass = superClass; setManagedBuildRevision(parent.getManagedBuildRevision()); if (this.superClass != null) { superClassId = this.superClass.getId(); } setId(Id); setName(name); isExtensionTargetPlatform = isExtensionElement; if (isExtensionElement) { // Hook me up to the Managed Build Manager ManagedBuildManager.addExtensionTargetPlatform(this); } else { fTargetPlatformData = new BuildTargetPlatformData(this); setDirty(true); } } /** * Create a <code>TargetPlatform</code> based on the specification stored in the * project file (.cdtbuild). * * @param parent The <code>IToolChain</code> the TargetPlatform will be added to. * @param element The XML element that contains the TargetPlatform settings. * @param managedBuildRevision the fileVersion of Managed Build System */ public TargetPlatform(IToolChain parent, ICStorageElement element, String managedBuildRevision) { this.parent = parent; isExtensionTargetPlatform = false; fTargetPlatformData = new BuildTargetPlatformData(this); setManagedBuildRevision(managedBuildRevision); // Initialize from the XML attributes loadFromProject(element); } /** * Create a <code>TargetPlatform</code> based upon an existing TargetPlatform. * * @param parent The <code>IToolChain</code> the TargetPlatform will be added to. * @param targetPlatform The existing TargetPlatform to clone. */ public TargetPlatform(IToolChain parent, String Id, String name, TargetPlatform targetPlatform) { this.parent = parent; superClass = targetPlatform.isExtensionTargetPlatform ? targetPlatform : targetPlatform.superClass; if (superClass != null) { // if (targetPlatform.superClassId != null) { superClassId = superClass.getId();// targetPlatform.superClassId; // } } setId(Id); setName(name); isExtensionTargetPlatform = false; fTargetPlatformData = new BuildTargetPlatformData(this); setManagedBuildRevision(targetPlatform.getManagedBuildRevision()); // Copy the remaining attributes if (targetPlatform.unusedChildren != null) { unusedChildren = targetPlatform.unusedChildren; } if (targetPlatform.errorParserIds != null) { errorParserIds = targetPlatform.errorParserIds; } if (targetPlatform.isAbstract != null) { isAbstract = targetPlatform.isAbstract; } if (targetPlatform.osList != null) { osList = new ArrayList<String>(targetPlatform.osList); } if (targetPlatform.archList != null) { archList = new ArrayList<String>(targetPlatform.archList); } if (targetPlatform.binaryParserList != null) { binaryParserList = new ArrayList<String>(targetPlatform.binaryParserList); } setDirty(true); } /* * E L E M E N T A T T R I B U T E R E A D E R S A N D W R I T E R S */ /* (non-Javadoc) * Loads the target platform information from the ManagedConfigElement specified in the * argument. * * @param element Contains the tool-chain information */ protected void loadFromManifest(IManagedConfigElement element) { ManagedBuildManager.putConfigElement(this, element); // id setId(SafeStringInterner.safeIntern(element.getAttribute(IBuildObject.ID))); // Get the name setName(SafeStringInterner.safeIntern(element.getAttribute(IBuildObject.NAME))); // superClass superClassId = SafeStringInterner.safeIntern(element.getAttribute(IProjectType.SUPERCLASS)); // Get the unused children, if any unusedChildren = SafeStringInterner.safeIntern(element.getAttribute(IProjectType.UNUSED_CHILDREN)); // isAbstract String isAbs = element.getAttribute(IProjectType.IS_ABSTRACT); if (isAbs != null){ isAbstract = Boolean.parseBoolean(isAbs); } // Get the comma-separated list of valid OS String os = element.getAttribute(OS_LIST); if (os != null) { osList = new ArrayList<String>(); String[] osTokens = os.split(","); //$NON-NLS-1$ for (int i = 0; i < osTokens.length; ++i) { osList.add(osTokens[i].trim()); } } // Get the comma-separated list of valid Architectures String arch = element.getAttribute(ARCH_LIST); if (arch != null) { archList = new ArrayList<String>(); String[] archTokens = arch.split(","); //$NON-NLS-1$ for (int j = 0; j < archTokens.length; ++j) { archList.add(SafeStringInterner.safeIntern(archTokens[j].trim())); } } // Get the IDs of the binary parsers from a semi-colon-separated list. String bpars = element.getAttribute(BINARY_PARSER); if (bpars != null) { binaryParserList = new ArrayList<String>(); String[] bparsTokens = CDataUtil.stringToArray(bpars, ";"); //$NON-NLS-1$ for (int j = 0; j < bparsTokens.length; ++j) { binaryParserList.add(SafeStringInterner.safeIntern(bparsTokens[j].trim())); } } } /* (non-Javadoc) * Initialize the target platform information from the XML element * specified in the argument * * @param element An XML element containing the target platform information */ protected void loadFromProject(ICStorageElement element) { // id (unique, do not intern) setId(element.getAttribute(IBuildObject.ID)); // name if (element.getAttribute(IBuildObject.NAME) != null) { setName(SafeStringInterner.safeIntern(element.getAttribute(IBuildObject.NAME))); } // superClass superClassId = SafeStringInterner.safeIntern(element.getAttribute(IProjectType.SUPERCLASS)); if (superClassId != null && superClassId.length() > 0) { superClass = ManagedBuildManager.getExtensionTargetPlatform(superClassId); if (superClass == null) { // TODO: Report error } } // Get the unused children, if any if (element.getAttribute(IProjectType.UNUSED_CHILDREN) != null) { unusedChildren = SafeStringInterner.safeIntern(element.getAttribute(IProjectType.UNUSED_CHILDREN)); } // isAbstract if (element.getAttribute(IProjectType.IS_ABSTRACT) != null) { String isAbs = element.getAttribute(IProjectType.IS_ABSTRACT); if (isAbs != null){ isAbstract = Boolean.parseBoolean(isAbs); } } // Get the comma-separated list of valid OS if (element.getAttribute(OS_LIST) != null) { String os = element.getAttribute(OS_LIST); if (os != null) { osList = new ArrayList<String>(); String[] osTokens = os.split(","); //$NON-NLS-1$ for (int i = 0; i < osTokens.length; ++i) { osList.add(SafeStringInterner.safeIntern(osTokens[i].trim())); } } } // Get the comma-separated list of valid Architectures if (element.getAttribute(ARCH_LIST) != null) { String arch = element.getAttribute(ARCH_LIST); if (arch != null) { archList = new ArrayList<String>(); String[] archTokens = arch.split(","); //$NON-NLS-1$ for (int j = 0; j < archTokens.length; ++j) { archList.add(SafeStringInterner.safeIntern(archTokens[j].trim())); } } } // Get the semi-colon-separated list of binaryParserIds if (element.getAttribute(BINARY_PARSER) != null) { String bpars = element.getAttribute(BINARY_PARSER); if (bpars != null) { binaryParserList = new ArrayList<String>(); String[] bparsTokens = CDataUtil.stringToArray(bpars, ";"); //$NON-NLS-1$ for (int j = 0; j < bparsTokens.length; ++j) { binaryParserList.add(SafeStringInterner.safeIntern(bparsTokens[j].trim())); } } } } /** * Persist the target platform to the project file. */ public void serialize(ICStorageElement element) { if (superClass != null) element.setAttribute(IProjectType.SUPERCLASS, superClass.getId()); element.setAttribute(IBuildObject.ID, id); if (name != null) { element.setAttribute(IBuildObject.NAME, name); } if (unusedChildren != null) { element.setAttribute(IProjectType.UNUSED_CHILDREN, unusedChildren); } if (isAbstract != null) { element.setAttribute(IProjectType.IS_ABSTRACT, isAbstract.toString()); } if (binaryParserList != null) { Iterator<String> bparsIter = binaryParserList.listIterator(); String listValue = EMPTY_STRING; while (bparsIter.hasNext()) { String current = bparsIter.next(); listValue += current; if ((bparsIter.hasNext())) { listValue += ";"; //$NON-NLS-1$ } } element.setAttribute(BINARY_PARSER, listValue); } if (osList != null) { Iterator<String> osIter = osList.listIterator(); String listValue = EMPTY_STRING; while (osIter.hasNext()) { String current = osIter.next(); listValue += current; if ((osIter.hasNext())) { listValue += ","; //$NON-NLS-1$ } } element.setAttribute(OS_LIST, listValue); } if (archList != null) { Iterator<String> archIter = archList.listIterator(); String listValue = EMPTY_STRING; while (archIter.hasNext()) { String current = archIter.next(); listValue += current; if ((archIter.hasNext())) { listValue += ","; //$NON-NLS-1$ } } element.setAttribute(ARCH_LIST, listValue); } // I am clean now isDirty = false; } /* * P A R E N T A N D C H I L D H A N D L I N G */ /* (non-Javadoc) * @see org.eclipse.cdt.core.build.managed.ITargetPlatform#getParent() */ @Override public IToolChain getParent() { return parent; } /* * M O D E L A T T R I B U T E A C C E S S O R S */ /* (non-Javadoc) * @see org.eclipse.cdt.managedbuilder.core.ITargetPlatform#getSuperClass() */ @Override public ITargetPlatform getSuperClass() { return superClass; } /* (non-Javadoc) * @see org.eclipse.cdt.core.build.managed.ITargetPlatform#getName() */ @Override public String getName() { return (name == null && superClass != null) ? superClass.getName() : name; } /* (non-Javadoc) * @see org.eclipse.cdt.core.build.managed.ITargetPlatform#isAbstract() */ @Override public boolean isAbstract() { if (isAbstract != null) { return isAbstract.booleanValue(); } else { return false; // Note: no inheritance from superClass } } /* (non-Javadoc) * @see org.eclipse.cdt.core.build.managed.ITargetPlatform#getUnusedChildren() */ @Override public String getUnusedChildren() { if (unusedChildren != null) { return unusedChildren; } else return EMPTY_STRING; // Note: no inheritance from superClass } /* (non-Javadoc) * @see org.eclipse.cdt.core.build.managed.ITargetPlatform#getBinaryParserId() * @deprecated */ @Override public String getBinaryParserId() { String[] ids = getBinaryParserList(); if (ids.length > 0) return ids[0]; return EMPTY_STRING; } /* (non-Javadoc) * @see org.eclipse.cdt.core.build.managed.ITargetPlatform#getBinaryParserList() */ @Override public String[] getBinaryParserList() { if (binaryParserList == null) { // If I have a superClass, ask it if (superClass != null) { return superClass.getBinaryParserList(); } else { return new String[0]; } } return binaryParserList.toArray(new String[binaryParserList.size()]); } /* (non-Javadoc) * @see org.eclipse.cdt.managedbuilder.core.ITargetPlatform#getArchList() */ @Override public String[] getArchList() { if (archList == null) { // Ask superClass for its list if (superClass != null) { return superClass.getArchList(); } else { // I have no superClass and no defined list return new String[] {"all"}; //$NON-NLS-1$ } } return archList.toArray(new String[archList.size()]); } /* (non-Javadoc) * @see org.eclipse.cdt.managedbuilder.core.ITargetPlatform#getOSList() */ @Override public String[] getOSList() { if (osList == null) { // Ask superClass for its list if (superClass != null) { return superClass.getOSList(); } else { // I have no superClass and no defined filter list return new String[] {"all"}; //$NON-NLS-1$ } } return osList.toArray(new String[osList.size()]); } /* (non-Javadoc) * @see org.eclipse.cdt.core.build.managed.IBuilder#setBinaryParserId(String) * @deprecated */ @Override public void setBinaryParserId(String id) { if (id == null) { setBinaryParserList(new String[0]); } else { setBinaryParserList(new String[]{id}); } } /* (non-Javadoc) * @see org.eclipse.cdt.core.build.managed.IBuilder#setBinaryParserList(String[]) */ @Override public void setBinaryParserList(String[] ids) { if(ids != null){ if (binaryParserList == null) { binaryParserList = new ArrayList<String>(); } else { binaryParserList.clear(); } for (int i = 0; i < ids.length; i++) { binaryParserList.add(ids[i]); } } else { binaryParserList = null; } setDirty(true); } /* (non-Javadoc) * Sets the isAbstract attribute */ @Override public void setIsAbstract(boolean b) { isAbstract = b; setDirty(true); } /* (non-Javadoc) * Sets the OS list. * * @param String[] The list of OS names */ @Override public void setOSList(String[] OSs) { if (osList == null) { osList = new ArrayList<String>(); } else { osList.clear(); } for (int i = 0; i < OSs.length; i++) { osList.add(OSs[i]); } setDirty(true); } /* (non-Javadoc) * Sets the architecture list. * * @param String[] The list of OS names */ @Override public void setArchList(String[] archs) { if (archList == null) { archList = new ArrayList<String>(); } else { archList.clear(); } for (int i = 0; i < archs.length; i++) { archList.add(archs[i]); } setDirty(true); } /* * O B J E C T S T A T E M A I N T E N A N C E */ /* (non-Javadoc) * @see org.eclipse.cdt.managedbuilder.core.IBuilder#isExtensionElement() */ @Override public boolean isExtensionElement() { return isExtensionTargetPlatform; } /* (non-Javadoc) * @see org.eclipse.cdt.managedbuilder.core.IBuilder#isDirty() */ @Override public boolean isDirty() { // This shouldn't be called for an extension Builder if (isExtensionTargetPlatform) return false; return isDirty; } /* (non-Javadoc) * @see org.eclipse.cdt.managedbuilder.core.IBuilder#setDirty(boolean) */ @Override public void setDirty(boolean isDirty) { this.isDirty = isDirty; } /* (non-Javadoc) * Resolve the element IDs to interface references */ public void resolveReferences() { if (!resolved) { resolved = true; // Resolve superClass if (superClassId != null && superClassId.length() > 0) { superClass = ManagedBuildManager.getExtensionTargetPlatform(superClassId); if (superClass == null) { // Report error ManagedBuildManager.outputResolveError( "superClass", //$NON-NLS-1$ superClassId, "targetPlatform", //$NON-NLS-1$ getId()); } } } } /** * @return Returns the version. */ @Override public Version getVersion() { if ( version == null) { if ( getParent() != null) { return getParent().getVersion(); } } return version; } @Override public void setVersion(Version version) { // Do nothing } @Override public CTargetPlatformData getTargetPlatformData() { return fTargetPlatformData; } }