/******************************************************************************* * Copyright (c) 2000, 2006 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.update.internal.model; import java.net.*; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import org.eclipse.update.core.*; import org.eclipse.update.core.model.*; import org.eclipse.update.internal.core.*; /** * */ public class ConfigurationPolicyModel extends ModelObject { private int policy; private Map /* of FeatureReferenceModel */configuredFeatureReferences; private Map /* of FeatureReferenceModel */unconfiguredFeatureReferences; // since 2.0.2 private ConfiguredSiteModel configuredSiteModel; // since 2.1 private boolean enable; /** * Constructor for ConfigurationPolicyModel. */ public ConfigurationPolicyModel() { super(); enable = true; configuredFeatureReferences = new HashMap(); // unconfiguredFeatureReferences = new HashMap(); } /** * @since 2.0 */ public int getPolicy() { return policy; } /** * Sets the policy. * @param policy The policy to set */ public void setPolicy(int policy) { assertIsWriteable(); this.policy = policy; } /** * @since 2.0 */ public FeatureReferenceModel[] getConfiguredFeaturesModel() { if (configuredFeatureReferences==null || configuredFeatureReferences.isEmpty()) return new FeatureReferenceModel[0]; return (FeatureReferenceModel[]) configuredFeatureReferences.keySet().toArray(arrayTypeFor(configuredFeatureReferences.keySet())); } /** * @since 2.0 */ public FeatureReferenceModel[] getUnconfiguredFeaturesModel() { // obtain unconfigured features by comparing configured ones with those installed if (unconfiguredFeatureReferences == null && configuredSiteModel != null && configuredSiteModel.getSiteModel() != null) { ISite site = (ISite) configuredSiteModel.getSiteModel(); ISiteFeatureReference[] siteFeatures = site.getFeatureReferences(); if (siteFeatures.length > getConfiguredFeaturesModel().length) { for (int i=0; i<siteFeatures.length; i++) { if (!(siteFeatures[i] instanceof SiteFeatureReference)) continue; Iterator iterator = configuredFeatureReferences.keySet().iterator(); boolean found = false; while(!found && iterator.hasNext()) { FeatureReferenceModel f = (FeatureReferenceModel)iterator.next(); if (UpdateManagerUtils.sameURL(f.getURL(), siteFeatures[i].getURL())) found = true; } if (!found) addUnconfiguredFeatureReference((SiteFeatureReference)siteFeatures[i]); } } } if (unconfiguredFeatureReferences == null || unconfiguredFeatureReferences.isEmpty()) return new FeatureReferenceModel[0]; return (FeatureReferenceModel[]) unconfiguredFeatureReferences.keySet() .toArray(arrayTypeFor(unconfiguredFeatureReferences.keySet())); } /** * Gets the configuredSiteModel. * @return Returns a ConfiguredSiteModel * @since 2.0.2 */ public ConfiguredSiteModel getConfiguredSiteModel() { return configuredSiteModel; } /** * Sets the configuredSiteModel. * @param configuredSiteModel The configuredSiteModel to set * @since 2.0.2 */ public void setConfiguredSiteModel(ConfiguredSiteModel configuredSiteModel) { this.configuredSiteModel = configuredSiteModel; } /** * */ private boolean remove(FeatureReferenceModel feature, Map list) { URL featureURL = feature.getURL(); boolean found = false; Iterator iter = list.keySet().iterator(); while (iter.hasNext() && !found) { FeatureReferenceModel element = (FeatureReferenceModel) iter.next(); if (UpdateManagerUtils.sameURL(element.getURL(),featureURL)) { list.remove(element); found = true; } } return found; } /** * returns an array of string corresponding to plugins file */ /*package*/ /** * */ private void add(FeatureReferenceModel feature, Map list) { URL featureURL = feature.getURL(); boolean found = false; Iterator iter = list.keySet().iterator(); while (iter.hasNext() && !found) { FeatureReferenceModel element = (FeatureReferenceModel) iter.next(); if (UpdateManagerUtils.sameURL(element.getURL(),featureURL)) { found = true; } } if (!found) { list.put(feature,null); } else { UpdateCore.warn("Feature Reference :"+feature+" already part of the list."); //$NON-NLS-1$ //$NON-NLS-2$ } } /** * adds a feature in the configuredReference list * also used by the parser to avoid creating another activity */ public void addConfiguredFeatureReference(FeatureReferenceModel feature) { assertIsWriteable(); if (configuredFeatureReferences == null) this.configuredFeatureReferences = new HashMap(); if (!configuredFeatureReferences.containsKey(feature)){ //DEBUG: if (UpdateCore.DEBUG && UpdateCore.DEBUG_SHOW_CONFIGURATION){ UpdateCore.debug("Configuring "+feature.getURLString()); //$NON-NLS-1$ } this.add(feature, configuredFeatureReferences); } // when user configure a feature, // we have to remove it from unconfigured feature if it exists // because the user doesn't know... if (unconfiguredFeatureReferences != null) { boolean success = remove(feature, unconfiguredFeatureReferences); if (!success) UpdateCore.warn("Feature not part of Unconfigured list: "+feature.getURLString()); //$NON-NLS-1$ } } /** * adds a feature in the list * also used by the parser to avoid creating another activity */ public void addUnconfiguredFeatureReference(FeatureReferenceModel feature) { assertIsWriteable(); if (unconfiguredFeatureReferences == null) this.unconfiguredFeatureReferences = new HashMap(); if (!unconfiguredFeatureReferences.containsKey(feature)){ if (UpdateCore.DEBUG && UpdateCore.DEBUG_SHOW_CONFIGURATION){ UpdateCore.debug("Unconfiguring "+feature.getURLString()); //$NON-NLS-1$ } this.add(feature, unconfiguredFeatureReferences); } // an unconfigured feature is always from a configured one no ? // unless it was parsed right ? if (configuredFeatureReferences != null) { boolean success = remove(feature, configuredFeatureReferences); if (!success) UpdateCore.warn("Feature not part of Configured list: "+feature.getURLString()); //$NON-NLS-1$ } } /** * removes a feature from any list */ public void removeFeatureReference(FeatureReferenceModel feature) { assertIsWriteable(); if (unconfiguredFeatureReferences!=null){ boolean success = remove(feature, unconfiguredFeatureReferences); if (!success) UpdateCore.warn(feature.getURLString()+" not part of unconfigured list."); //$NON-NLS-1$ } if (configuredFeatureReferences != null) { boolean success = remove(feature, configuredFeatureReferences); if (!success) UpdateCore.warn(feature.getURLString()+" not part of configured list."); //$NON-NLS-1$ } } /** * Sets the unconfiguredFeatureReferences. * @param featureReferences The unconfiguredFeatureReferences to set */ protected void setUnconfiguredFeatureReferences(IFeatureReference[] featureReferences) { unconfiguredFeatureReferences = new HashMap(); for (int i = 0; i < featureReferences.length; i++) { unconfiguredFeatureReferences.put(featureReferences[i],null); } } /** * Sets the configuredFeatureReferences. * @param featureReferences The configuredFeatureReferences to set */ protected void setConfiguredFeatureReferences(IFeatureReference[] featureReferences) { configuredFeatureReferences = new HashMap(); for (int i = 0; i < featureReferences.length; i++) { configuredFeatureReferences.put(featureReferences[i],null); } } /** * @return boolean */ public boolean isEnabled() { return enable; } /** * @param value */ public void setEnabled(boolean value) { enable = value; } }