diff options
Diffstat (limited to 'core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command')
45 files changed, 3589 insertions, 0 deletions
diff --git a/core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/CommandFactory.java b/core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/CommandFactory.java new file mode 100644 index 000000000..8ad8dec72 --- /dev/null +++ b/core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/CommandFactory.java @@ -0,0 +1,26 @@ +/******************************************************************************* + * Copyright (c) 2004, 2005 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.wst.command.internal.env.core; + +import org.eclipse.wst.common.frameworks.datamodel.AbstractDataModelOperation; + +/** + * This interface is used to create Command objects. + * + */ +public interface CommandFactory +{ + /** + * + * @return returns a created Command object. + */ + public AbstractDataModelOperation create(); +} diff --git a/core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/CommandManager.java b/core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/CommandManager.java new file mode 100644 index 000000000..4b946d299 --- /dev/null +++ b/core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/CommandManager.java @@ -0,0 +1,33 @@ +/******************************************************************************* + * Copyright (c) 2004, 2005 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.wst.command.internal.env.core; + +import org.eclipse.wst.command.internal.env.core.data.DataMappingRegistry; + +/** + * CommandManagers help manage the lifecycle of Commands. + */ +public interface CommandManager +{ + /** + * Returns true if this CommandManager is capable of undoing + * Commands. Some CommandManagers and Environments may be of + * a sort that will never undo() Commands. Command.execute() + * methods should take advantage of this method to optimize + * out any caching logic whenever this method returns false. + */ + public boolean isUndoEnabled (); + + // There's probably more, like factory methods for creating + // Undo/Redo stacks and stuff like that. + + public DataMappingRegistry getMappingRegistry(); +} diff --git a/core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/EnvironmentCore.properties b/core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/EnvironmentCore.properties new file mode 100644 index 000000000..c11d8c020 --- /dev/null +++ b/core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/EnvironmentCore.properties @@ -0,0 +1,22 @@ +############################################################################### +# Copyright (c) 2001, 2007 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 +# yyyymmdd bug Email and other contact information +# -------- -------- ----------------------------------------------------------- +# 20070418 177005 pmoogk@ca.ibm.com - Peter Moogk +############################################################################### + +# +# Common Messages +# +MSG_ERROR_UNEXPECTED_ERROR=IWAB0014E Unexpected exception occurred. + +TITLE_WARNING=Warning: +TITLE_ERROR=Error: +TITLE_INFO=Info: diff --git a/core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/EnvironmentCoreMessages.java b/core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/EnvironmentCoreMessages.java new file mode 100644 index 000000000..94581af68 --- /dev/null +++ b/core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/EnvironmentCoreMessages.java @@ -0,0 +1,31 @@ +/******************************************************************************* + * Copyright (c) 2000, 2005 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.wst.command.internal.env.core; + +import org.eclipse.osgi.util.NLS; + +public final class EnvironmentCoreMessages extends NLS { + + private static final String BUNDLE_NAME = "org.eclipse.wst.command.internal.env.core.EnvironmentCore";//$NON-NLS-1$ + + private EnvironmentCoreMessages() { + // Do not instantiate + } + + public static String MSG_ERROR_UNEXPECTED_ERROR; + public static String TITLE_WARNING; + public static String TITLE_ERROR; + public static String TITLE_INFO; + + static { + NLS.initializeMessages(BUNDLE_NAME, EnvironmentCoreMessages.class); + } +}
\ No newline at end of file diff --git a/core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/ICommandFactory.java b/core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/ICommandFactory.java new file mode 100644 index 000000000..182a28b10 --- /dev/null +++ b/core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/ICommandFactory.java @@ -0,0 +1,30 @@ +/******************************************************************************* + * Copyright (c) 2005 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.wst.command.internal.env.core; + +import java.util.Iterator; +import org.eclipse.wst.common.frameworks.datamodel.AbstractDataModelOperation; + + +/** + * + * This class is used to return a sequence of Commands. + * + */ +public interface ICommandFactory extends Iterator +{ + /** + * + * @return returns the next Command in the sequence. + */ + public AbstractDataModelOperation getNextCommand(); +} diff --git a/core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/SimpleCommandFactory.java b/core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/SimpleCommandFactory.java new file mode 100644 index 000000000..75fdc4a52 --- /dev/null +++ b/core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/SimpleCommandFactory.java @@ -0,0 +1,49 @@ +/******************************************************************************* + * Copyright (c) 2005 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.wst.command.internal.env.core; + +import java.util.Vector; +import org.eclipse.wst.common.frameworks.datamodel.AbstractDataModelOperation; + + +public class SimpleCommandFactory implements ICommandFactory +{ + private Vector commands_; + private int index_; + + public SimpleCommandFactory( Vector commands ) + { + commands_ = commands; + index_ = 0; + } + + public AbstractDataModelOperation getNextCommand() + { + return (AbstractDataModelOperation)next(); + } + + public void remove() + { + throw new UnsupportedOperationException(); + } + + public boolean hasNext() + { + return index_ < commands_.size(); + } + + public Object next() + { + return commands_.elementAt(index_++); + } + +} diff --git a/core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/common/Condition.java b/core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/common/Condition.java new file mode 100644 index 000000000..c612cf769 --- /dev/null +++ b/core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/common/Condition.java @@ -0,0 +1,22 @@ +/******************************************************************************* + * Copyright (c) 2001, 2005 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.wst.command.internal.env.core.common; + +/** + * This interface defines a boolean condition that can be evaluated for any object. + */ +public interface Condition +{ + /** + * This returns whether the given object passes this condition. + */ + public boolean evaluate(); +} diff --git a/core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/common/Evaluate.java b/core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/common/Evaluate.java new file mode 100644 index 000000000..fafa804c8 --- /dev/null +++ b/core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/common/Evaluate.java @@ -0,0 +1,22 @@ +/******************************************************************************* + * Copyright (c) 2004, 2005 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.wst.command.internal.env.core.common; + +/** + * This interface can be used when a conditional object needs to be returned. +**/ +public interface Evaluate +{ + /** + * @return returns an object based on some evaluated condition. + **/ + public Object evaluate(); +} diff --git a/core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/common/MessageUtils.java b/core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/common/MessageUtils.java new file mode 100644 index 000000000..c72cd47bd --- /dev/null +++ b/core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/common/MessageUtils.java @@ -0,0 +1,88 @@ +/******************************************************************************* + * Copyright (c) 2001, 2005 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.wst.command.internal.env.core.common; + +import java.text.MessageFormat; +import java.util.Hashtable; +import java.util.Locale; +import java.util.ResourceBundle; + +/** + * This class provides a convienent way to access resource bundles and + * retieve translated strings. + * + * + */ +public class MessageUtils +{ + private ResourceBundle resource_; + + private static Hashtable bundles_ = new Hashtable(); + + /** + * + * @param bundleId the resource bundle ID. + * @param object the class loader for this object will be used to retrieve + * the resource bundle. + */ + public MessageUtils( String bundleId, Object object ) + { + this( bundleId, object.getClass().getClassLoader() ); + } + + /** + * + * @param bundleId the resource bundle ID. + * @param loader the class loader that will be used to retrieve + * the resource bundle. + */ + public MessageUtils( String bundleId, ClassLoader loader ) + { + resource_ = (ResourceBundle)bundles_.get( bundleId ); + + if( resource_ == null ) + { + resource_ = ResourceBundle.getBundle( bundleId, Locale.getDefault(), loader ); + bundles_.put( bundleId, resource_ ); + } + } + + /** + * + * @param key the key for the string to retrieve. + * @return returns the translated string. + */ + public String getMessage ( String key ) + { + String value = key; + + try + { + value = resource_.getString( key ); + } + catch( Throwable exc ) + { + } + + return value; + } + + /** + * + * @param key the key for the string to retrieve. + * @param args These arguments will be substituted into the translated string. + * @return returns the translated string with any substitutions. + */ + public String getMessage ( String key, Object[] args ) + { + return MessageFormat.format( getMessage(key),args ); + } +} diff --git a/core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/common/ProgressUtils.java b/core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/common/ProgressUtils.java new file mode 100644 index 000000000..4028caa12 --- /dev/null +++ b/core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/common/ProgressUtils.java @@ -0,0 +1,22 @@ +/*************************************************************************************************** + * Copyright (c) 2003, 2005 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.wst.command.internal.env.core.common; + +import org.eclipse.core.runtime.IProgressMonitor; + +public class ProgressUtils +{ + static public void report( IProgressMonitor monitor, String message ) + { + if( monitor != null ) + { + monitor.beginTask( message, IProgressMonitor.UNKNOWN ); + } + } +} diff --git a/core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/common/Range.java b/core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/common/Range.java new file mode 100644 index 000000000..29224f4a9 --- /dev/null +++ b/core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/common/Range.java @@ -0,0 +1,62 @@ +/******************************************************************************* + * Copyright (c) 2004, 2005 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.wst.command.internal.env.core.common; + +import org.eclipse.wst.common.environment.uri.IURI; + +/** + * Carries position information within a resource. + */ +public interface Range +{ + public static final int UNKNOWN = -1; + + /** + * Returns the identifier of the resource the range applies to. + */ + public IURI getURI (); + + /** + * Returns the index, zero-indexed, of the first line + * of the range. + */ + public int getStartingLineNumber (); + + /** + * Returns the index, zero-indexed, of the first character + * of the range relative to the beginning of the line. + */ + public int getStartingCharNumberInLine (); + + /** + * Returns the index, zero-indexed, of the first character + * of the range relative to the beginning of the file. + */ + public int getStartingCharNumberInURI (); + + /** + * Returns the index, zero-indexed, of the last line + * of the range. + */ + public int getEndingLineNumber (); + + /** + * Returns the offset, zero-indexed, of the last character + * of the range relative to the beginning of the line. + */ + public int getEndingCharNumberInLine (); + + /** + * Returns the index, zero-indexed, of the last character + * of the range relative to the beginning of the file. + */ + public int getEndingCharNumberInURI (); +} diff --git a/core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/common/RangeVector.java b/core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/common/RangeVector.java new file mode 100644 index 000000000..7f460baf5 --- /dev/null +++ b/core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/common/RangeVector.java @@ -0,0 +1,30 @@ +/******************************************************************************* + * Copyright (c) 2004, 2005 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.wst.command.internal.env.core.common; + +import java.util.Vector; + +/** + * This Vector makes the protected method removeRange public. + * + */ +public class RangeVector extends Vector +{ + /** + * Comment for <code>serialVersionUID</code> + */ + private static final long serialVersionUID = 4048793476659230773L; + + public void removeRange( int start, int end ) + { + super.removeRange( start, end ); + } +} diff --git a/core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/common/StatusUtils.java b/core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/common/StatusUtils.java new file mode 100644 index 000000000..a03a57201 --- /dev/null +++ b/core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/common/StatusUtils.java @@ -0,0 +1,58 @@ +/*************************************************************************************************** + * Copyright (c) 2003, 2005 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.wst.command.internal.env.core.common; + +import org.eclipse.core.runtime.IStatus; +import org.eclipse.core.runtime.MultiStatus; +import org.eclipse.core.runtime.Status; + +public class StatusUtils +{ + public static IStatus errorStatus( String errorMessage ) + { + return new Status( IStatus.ERROR, "id", 0, errorMessage, null ); + } + + public static IStatus errorStatus( Throwable exc ) + { + String message = exc.getMessage(); + + return new Status( IStatus.ERROR, "id", 0, message == null ? "" : message, exc ); + } + + public static IStatus errorStatus( String message, Throwable exc ) + { + return new Status( IStatus.ERROR, "id", 0, message, exc ); + } + + public static MultiStatus multiStatus( String message, IStatus[] children, Throwable exc ) + { + return new MultiStatus( "id", 0, children, message, exc ); + } + + public static MultiStatus multiStatus( String message, IStatus[] children ) + { + return new MultiStatus( "id", 0, children, message, null ); + } + + public static IStatus warningStatus( String warningMessage ) + { + return new Status( IStatus.WARNING, "id", 0, warningMessage, null ); + } + + public static IStatus warningStatus( String warningMessage, Throwable exc ) + { + return new Status( IStatus.WARNING, "id", 0, warningMessage, exc ); + } + + public static IStatus infoStatus( String infoMessage ) + { + return new Status( IStatus.INFO, "id", 0, infoMessage, null ); + } +} diff --git a/core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/context/Context.java b/core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/context/Context.java new file mode 100644 index 000000000..e9726a0b5 --- /dev/null +++ b/core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/context/Context.java @@ -0,0 +1,87 @@ +/******************************************************************************* + * Copyright (c) 2004, 2005 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.wst.command.internal.env.core.context; + +/** + * This interface provides a way to get and set preference information. + * + */ +public interface Context +{ + /** + * Loads the preference data into this Context object. + * + */ + public void load(); + + /** + * Sets the default for a boolean preference. + * @param name the preference name. + * @param value the preference value. + */ + public void setDefault (String name, boolean value); + + /** + * Sets the default for a string preference. + * @param name the preference name. + * @param value the preference value. + */ + public void setDefault (String name, String value); + + /** + * Sets the default for a int preference. + * @param name the preference name. + * @param value the preference value. + */ + public void setDefault (String name, int value); + + /** + * Sets the value for a string preference. + * @param name the preference name. + * @param value the preference value. + */ + public void setValue (String name, String value); + + /** + * Sets the value for a boolean preference. + * @param name the preference name. + * @param value the preference value. + */ + public void setValue (String name, boolean value); + + /** + * Sets the value for a int preference. + * @param name the preference name. + * @param value the preference value. + */ + public void setValue (String name, int value); + + /** + * Gets the value for a string preference. + * @param name the preference name. + * @return the preference value. + */ + public String getValueAsString ( String name); + + /** + * Gets the value for a boolean preference. + * @param name the preference name. + * @return the preference value. + */ + public boolean getValueAsBoolean ( String name); + + /** + * Gets the value for a int preference. + * @param name the preference name. + * @return the preference value. + */ + public int getValueAsInt ( String name); +} diff --git a/core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/context/ResourceContext.java b/core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/context/ResourceContext.java new file mode 100644 index 000000000..405c75a6a --- /dev/null +++ b/core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/context/ResourceContext.java @@ -0,0 +1,74 @@ +/******************************************************************************* + * Copyright (c) 2001, 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.wst.command.internal.env.core.context; + +public interface ResourceContext +{ + /** + * This constant string is used to lookup the overwrite files general preference from + * the plugins local preferences store. + **/ + public static final String PREFERENCE_OVERWRITE = "filesOverwrite"; + + /** + * This constant string is used to lookup the create folders general preference from + * the plugins local preferences store. + **/ + public static final String PREFERENCE_CREATE_FOLDERS = "createFolders"; + + /** + * This constant string is used to lookup the checkout files general preference from + * the plugins local preferences store. + **/ + public static final String PREFERENCE_CHECKOUT = "filesCheckout"; + + /** + * + * @param enable set whether overwriting of files is enabled. + */ + public void setOverwriteFilesEnabled ( boolean enable); + + /** + * + * @return returns whether overwriting of files is enabled. + */ + public boolean isOverwriteFilesEnabled(); + + /** + * + * @param enable set whether creation of folders is enabled. + */ + public void setCreateFoldersEnabled( boolean enable); + + /** + * + * @return returns whether creation of folders is enabled. + */ + public boolean isCreateFoldersEnabled(); + + /** + * + * @param enable sets whether automatic checkout of files is enabled. + */ + public void setCheckoutFilesEnabled( boolean enable); + + /** + * + * @return returns whether automatic checkout of files is enabled. + */ + public boolean isCheckoutFilesEnabled(); + + /** + * + * @return returns a copy of this ResourceContext. + */ + public ResourceContext copy(); +} diff --git a/core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/context/ResourceDefaults.java b/core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/context/ResourceDefaults.java new file mode 100644 index 000000000..5f134419b --- /dev/null +++ b/core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/context/ResourceDefaults.java @@ -0,0 +1,45 @@ +/******************************************************************************* + * Copyright (c) 2001, 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.wst.command.internal.env.core.context; + +public class ResourceDefaults +{ + private static final boolean PREFERENCE_OVERWRITE_DEFAULT = false; + private static final boolean PREFERENCE_CREATE_FOLDERS_DEFAULT = true; + private static final boolean PREFERENCE_CHECKOUT_DEFAULT = false; + + /** + * + * @return returns the default setting for overwriting files. + */ + public static boolean getOverwriteFilesDefault () + { + return PREFERENCE_OVERWRITE_DEFAULT; + } + + /** + * + * @return returns the default setting ofr creating folders. + */ + public static boolean getCreateFoldersDefault () + { + return PREFERENCE_CREATE_FOLDERS_DEFAULT; + } + + /** + * + * @return returns the default setting for checking out files. + */ + public static boolean getCheckoutFilesDefault() + { + return PREFERENCE_CHECKOUT_DEFAULT; + } +} diff --git a/core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/context/TransientResourceContext.java b/core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/context/TransientResourceContext.java new file mode 100644 index 000000000..fb0ba3f6d --- /dev/null +++ b/core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/context/TransientResourceContext.java @@ -0,0 +1,82 @@ +/******************************************************************************* + * Copyright (c) 2001, 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.wst.command.internal.env.core.context; + +/** + * This class implements a ResourceContext interface where the state + * of the context data is transient. + * + */ +public class TransientResourceContext implements ResourceContext +{ + private boolean overWriteFiles; + private boolean createFolders; + private boolean checkOutFiles; + + public TransientResourceContext() { + setOverwriteFilesEnabled(ResourceDefaults.getOverwriteFilesDefault()); + setCreateFoldersEnabled(ResourceDefaults.getCreateFoldersDefault()); + setCheckoutFilesEnabled(ResourceDefaults.getCheckoutFilesDefault()); + } + + /** + * @see org.eclipse.wst.command.internal.env.core.context.ResourceContext#setOverwriteFilesEnabled(boolean) + */ + public void setOverwriteFilesEnabled(boolean enable) { + overWriteFiles = enable; + } + + /** + * @see org.eclipse.wst.command.internal.env.core.context.ResourceContext#isOverwriteFilesEnabled() + */ + public boolean isOverwriteFilesEnabled() { + return overWriteFiles; + } + + /** + * @see org.eclipse.wst.command.internal.env.core.context.ResourceContext#setCreateFoldersEnabled(boolean) + */ + public void setCreateFoldersEnabled(boolean enable) { + createFolders = enable; + } + + /** + * @see org.eclipse.wst.command.internal.env.core.context.ResourceContext#isCreateFoldersEnabled() + */ + public boolean isCreateFoldersEnabled() { + return createFolders; + } + + /** + * @see org.eclipse.wst.command.internal.env.core.context.ResourceContext#setCheckoutFilesEnabled(boolean) + */ + public void setCheckoutFilesEnabled(boolean enable) { + checkOutFiles = enable; + } + + /** + * @see org.eclipse.wst.command.internal.env.core.context.ResourceContext#isCheckoutFilesEnabled() + */ + public boolean isCheckoutFilesEnabled() { + return checkOutFiles; + } + + /** + * @see org.eclipse.wst.command.internal.env.core.context.ResourceContext#copy() + */ + public ResourceContext copy() { + ResourceContext cc = new TransientResourceContext(); + cc.setOverwriteFilesEnabled(isOverwriteFilesEnabled()); + cc.setCreateFoldersEnabled(isCreateFoldersEnabled()); + cc.setCheckoutFilesEnabled(isCheckoutFilesEnabled()); + return cc; + } +} diff --git a/core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/data/BeanModifier.java b/core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/data/BeanModifier.java new file mode 100644 index 000000000..d56fc66c0 --- /dev/null +++ b/core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/data/BeanModifier.java @@ -0,0 +1,22 @@ +/******************************************************************************* + * Copyright (c) 2005 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.wst.command.internal.env.core.data; + +public interface BeanModifier { + + /** + * Performs modification on bean properties using data provided + * @param bean The bean to be modified + * @param propertyHolder The data to use to make the modification + */ + public void modify(Object bean, Object propertyHolder); + +} diff --git a/core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/data/ClassEntry.java b/core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/data/ClassEntry.java new file mode 100644 index 000000000..41e5c5664 --- /dev/null +++ b/core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/data/ClassEntry.java @@ -0,0 +1,77 @@ +/******************************************************************************* + * Copyright (c) 2004, 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 + * yyyymmdd bug Email and other contact information + * -------- -------- ----------------------------------------------------------- + * 20060313 130958 pmoogk@ca.ibm.com - Peter Moogk + *******************************************************************************/ + +package org.eclipse.wst.command.internal.env.core.data; + +import java.util.Vector; + +public class ClassEntry +{ + // A list of getter methods for a particular class. + public Vector getterList_; + + // A list of setter methods for a particular class. + public Vector setterList_; + + // A list of instance objects for this class. Only the last entry + // should be looked at. + private Vector objectList_ = new Vector(); + + // A list of Interger objects that represent an ordering of objects. + // The number of entries in the objectList vector and the orderList vector + // should be the same. Each entry in the objectList vector is + // corelated with each entry in the orderList vector. + private Vector orderList_ = new Vector(); + + public void addObject( Object object, int order ) + { + objectList_.add(object); + orderList_.add( new Integer(order) ); + } + + public Object getLastObject() + { + Object result = null; + + if( objectList_.size() > 0 ) + { + result = objectList_.lastElement(); + } + + return result; + } + + public int getLastOrder() + { + int result = -1; + + if( orderList_.size() > 0 ) + { + result = ((Integer)orderList_.lastElement()).intValue(); + } + + return result; + } + + public void removeObject( Object object ) + { + int removalIndex = objectList_.indexOf(object); + + if( removalIndex != -1 ) + { + objectList_.remove(removalIndex); + orderList_.remove(removalIndex); + } + } +} diff --git a/core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/data/DataFlowManager.java b/core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/data/DataFlowManager.java new file mode 100644 index 000000000..e7ffe03f8 --- /dev/null +++ b/core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/data/DataFlowManager.java @@ -0,0 +1,293 @@ +/******************************************************************************* + * Copyright (c) 2004, 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 + * yyyymmdd bug Email and other contact information + * -------- -------- ----------------------------------------------------------- + * 20060313 130958 pmoogk@ca.ibm.com - Peter Moogk + *******************************************************************************/ +package org.eclipse.wst.command.internal.env.core.data; + +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.lang.reflect.Modifier; +import java.util.Hashtable; +import java.util.Vector; +import org.eclipse.wst.common.environment.IEnvironment; +import org.eclipse.wst.common.environment.ILog; + + +public class DataFlowManager +{ + private DataMappingRegistryImpl registry_; + private Hashtable classTable_; + private int order_; + private IEnvironment environment_; + + public DataFlowManager( DataMappingRegistryImpl registry, IEnvironment environment ) + { + registry_ = registry; + classTable_ = new Hashtable(); + order_ = 0; + environment_ = environment; + } + + public DataMappingRegistry getMappingRegistry() + { + return registry_; + } + + // Remove this instance object from the mapping table. + public void unprocess( Object object ) + { + String objectType = object.getClass().getName(); + ClassEntry classEntry = (ClassEntry)classTable_.get( objectType ); + + if( classEntry != null ) + { + classEntry.removeObject(object); + } + } + + // Add this object to our mapping table and call the setters + // that have corresponding getter objects. + public void process( Object object ) + { + // Add this object to the classTable_ if required. + String objectType = object.getClass().getName(); + ClassEntry classEntry = (ClassEntry)classTable_.get( objectType ); + + environment_.getLog().log(ILog.INFO, "data", 5004, this, "process", "Processing: " + objectType ); + + if( classEntry == null ) + { + classEntry = new ClassEntry(); + classTable_.put( objectType, classEntry ); + } + + classEntry.addObject(object, order_++ ); + + // Now process the setters for this object + Vector ruleEntries = registry_.getRuleEntries( objectType ); + + if( ruleEntries != null ) + { + if( classEntry.setterList_ == null ) + { + classEntry.setterList_ = getSetterList( object ); + } + + // For each setter in this object try to find a rule. + for( int setterIndex = 0; setterIndex < classEntry.setterList_.size(); setterIndex++ ) + { + ObjectMethod currentObjectMethod = new ObjectMethod(); + Method setterMethod = (Method)classEntry.setterList_.elementAt( setterIndex ); + RuleEntry currentRuleEntry = null; + + currentObjectMethod.order = -1; + + // Find rules that match this setter. Note: there can be more than one rule + // that matches this setter. In this case we use the most recent, which is + // defined by the order field. + for( int index = 0; index < ruleEntries.size(); index++ ) + { + RuleEntry ruleEntry = (RuleEntry)ruleEntries.elementAt( index ); + + if( setterMethod.getName().equals( "set" + ruleEntry.targetProperty_ ) ) + { + // We found a setter for this rule. Now find the getter method. + // Note: getGetterMethod always returns a value, but if there is no + // getters available it will set the order to -1. + ObjectMethod getter = getGetterMethod( ruleEntry.sourceType_, ruleEntry.sourceProperty_ ); + + if( getter.order == -1 ) + { + environment_.getLog().log(ILog.INFO , "data", 5005, this, "process", " >>No getter found for property: " + setterMethod.getName()); + } + + if( currentObjectMethod.order < getter.order ) + { + // We found a more recent getter. + currentObjectMethod = getter; + currentRuleEntry = ruleEntry; + } + } + } + + if( currentObjectMethod.order != -1 ) + { + invokeMethod( currentObjectMethod.object, + currentObjectMethod.method, + object, + setterMethod, + currentRuleEntry.transformer_ ); + } + else + { + environment_.getLog().log(ILog.INFO, "data", 5006, this, "process", " >>No rule found for setter: " + setterMethod.getName() ); + } + } + } + } + + /** + * Find all the setters for this object and return a vector of them. + * + * @param object + * @return + */ + private Vector getSetterList( Object object ) + { + Vector result = new Vector(); + + Method[] methods = object.getClass().getMethods(); + + for( int index = 0; index < methods.length; index++ ) + { + Method method = methods[index]; + boolean isPublic = Modifier.isPublic( method.getModifiers() ); + Class returnType = method.getReturnType(); + + if( isPublic && + returnType == Void.TYPE && + method.getParameterTypes().length == 1 && + method.getName().startsWith( "set" )) + { + method.setAccessible( true ); + result.add( method ); + } + } + + return result; + } + + private ObjectMethod getGetterMethod( String sourceType, String sourceProperty ) + { + ClassEntry classEntry = (ClassEntry)classTable_.get( sourceType ); + ObjectMethod getterFound = new ObjectMethod(); + + // Indicate that there is no getter yet. + getterFound.order = -1; + + if( classEntry != null ) + { + Object lastObject = classEntry.getLastObject(); + + if( lastObject != null ) + { + if( classEntry.getterList_ == null ) + { + // Build the getter list. + classEntry.getterList_ = getGetterList( lastObject ); + } + + for( int index = 0; index < classEntry.getterList_.size(); index++ ) + { + Method getter = (Method)classEntry.getterList_.elementAt( index ); + + if( getter.getName().equals( "get" + sourceProperty )) + { + getterFound.order = classEntry.getLastOrder(); + getterFound.method = getter; + getterFound.object = lastObject; + break; + } + } + } + } + + return getterFound; + } + + private Vector getGetterList( Object object ) + { + Vector result = new Vector(); + + Method[] methods = object.getClass().getMethods(); + + for( int index = 0; index < methods.length; index++ ) + { + Method method = methods[index]; + boolean isPublic = Modifier.isPublic( method.getModifiers() ); + Class returnType = method.getReturnType(); + + if( isPublic && + returnType != Void.TYPE && + method.getParameterTypes().length == 0 && + method.getName().startsWith( "get" )) + { + method.setAccessible( true ); + result.add( method ); + } + } + + return result; + } + + private void invokeMethod( Object sourceObject, + Method sourceMethod , + Object clientObject, + Method clientMethod, + Transformer transformer) + { + Object data = null; + + try + { + data = sourceMethod.invoke( sourceObject, new Object[0] ); + } + catch( InvocationTargetException exc ) + { + exc.printStackTrace(); + // pgm Need to externalize this string. + throw new IllegalArgumentException( "Provider \"" + sourceObject.getClass().getName() + + "\" threw an exception." ); + } + catch( IllegalAccessException exc ) + { + exc.printStackTrace(); + // pgm Need to externalize this string. + throw new IllegalArgumentException( "Provider \"" + sourceObject.getClass().getName() + + "\" threw an exception." ); + } + + environment_.getLog().log(ILog.INFO, "data", 5007, this, "invokeMethod "," Setting prop: " + clientMethod.getName() + " data=" + data + " from: " + sourceObject.getClass().getName() ); + + + if( transformer != null ) + { + data = transformer.transform( data ); + } + + try + { + clientMethod.invoke( clientObject, new Object[]{ data } ); + } + catch( InvocationTargetException exc ) + { + exc.printStackTrace(); + // pgm Need to externalize this string. + throw new IllegalArgumentException( "Client \"" + clientObject.getClass().getName() + + "\" threw an exception." ); + } + catch( IllegalAccessException exc ) + { + exc.printStackTrace(); + // pgm Need to externalize this string. + throw new IllegalArgumentException( "Client \"" + clientObject.getClass().getName() + + "\" threw an exception." ); + } + } + + private class ObjectMethod + { + public Object object; + public Method method; + public int order; + } +} diff --git a/core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/data/DataMappingRegistry.java b/core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/data/DataMappingRegistry.java new file mode 100644 index 000000000..220373139 --- /dev/null +++ b/core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/data/DataMappingRegistry.java @@ -0,0 +1,47 @@ +/******************************************************************************* + * Copyright (c) 2004, 2005 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.wst.command.internal.env.core.data; + +public interface DataMappingRegistry +{ + /** + * This method adds a data mapping from a source object to a target + * object. When the sourceObject is encountered by the framework the + * sourceProperty will be called and the data will be passed to the + * targetProperty in the targetObject. If a transformer object is + * specified the sourceObject is transformed before being passed to + * the target object. + * + * @param sourceType The source object. + * @param sourceProperty The source property. + * @param targetType The target object. + * @param targetProperty The target property. + * @param transformer The transformer object that transforms the + * the source object. + */ + public void addMapping( Class sourceType, + String sourceProperty, + Class targetType, + String targetProperty, + Transformer transformer ); + + /** + * This method is equivalent to the above with targetProperty the same + * as the sourceProperty and with the transformer set to null. + * + * @param sourceType The source object. + * @param sourceProperty The source property. + * @param targetType The target object. + */ + public void addMapping( Class sourceType, + String sourceProperty, + Class targetType ); +} diff --git a/core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/data/DataMappingRegistryImpl.java b/core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/data/DataMappingRegistryImpl.java new file mode 100644 index 000000000..e1a5f2e7d --- /dev/null +++ b/core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/data/DataMappingRegistryImpl.java @@ -0,0 +1,117 @@ +/******************************************************************************* + * Copyright (c) 2004, 2005 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.wst.command.internal.env.core.data; + +import java.util.Hashtable; +import java.util.Vector; + + +public class DataMappingRegistryImpl implements DataMappingRegistry +{ + private Hashtable rulesTable_ = new Hashtable(); + + public Vector getRuleEntries( String targetType ) + { + return (Vector)rulesTable_.get( targetType ); + } + + /* (non-Javadoc) + * @see org.eclipse.wst.command.internal.env.core.data.DataMappingRegistry#addMapping(java.lang.Class, java.lang.String, java.lang.Class, java.lang.String, org.eclipse.wst.command.internal.env.core.data.Transformer) + */ + public void addMapping( Class sourceType, String sourceProperty, + Class targetType, String targetProperty, + Transformer transformer) + { + Vector ruleEntries = (Vector)rulesTable_.get( targetType.getName() ); + RuleEntry ruleEntry = null; + + if( ruleEntries == null ) + { + ruleEntries = new Vector(); + rulesTable_.put( targetType.getName(), ruleEntries ); + } + + // Find the rule entry + for( int index = 0; index < ruleEntries.size(); index++ ) + { + RuleEntry newEntry = (RuleEntry)ruleEntries.elementAt( index ); + + if( sourceProperty.equals( newEntry.sourceProperty_ ) && + sourceType.equals( newEntry.sourceType_ ) && + targetProperty.equals( newEntry.targetProperty_ ) ) + { + // The entry already exists + ruleEntry = newEntry; + break; + } + } + + if( ruleEntry == null ) + { + // The rule didn't exist already so we will create a new one. + ruleEntry = new RuleEntry(sourceType.getName(), sourceProperty, targetProperty, transformer ); + ruleEntries.add( ruleEntry ); + } + else + { + // Just update the transformer. + ruleEntry.transformer_ = transformer; + } + } + + //ruleEntries_. +// String sourceClass = sourceType.getName(); +// String targetClass = targetType.getName(); +// Vector entries = (Vector)ruleEntries_.get( sourceClass ); +// RuleEntry ruleEntry = null; +// +// if( entries != null ) +// { +// // Check to see if this mapping already exists. +// for( int index = 0; index < entries.size(); index++ ) +// { +// RuleEntry foundEntry = (RuleEntry)entries.elementAt( index ); +// +// if( sourceProperty.equals( foundEntry.sourceProperty_ ) && +// targetType.equals( foundEntry.targetType_ ) && +// targetProperty.equals( foundEntry.targetProperty_ ) ) +// { +// ruleEntry = foundEntry; +// ruleEntry.transformer_ = transformer; +// } +// } +// +// // There is an existing vector for this sourceClass, but it didn't +// // contain this new rule so we will add it in. +// if( ruleEntry == null ) +// { +// ruleEntry = new RuleEntry( sourceProperty, targetClass, targetProperty, transformer ); +// entries.add( ruleEntry ); +// } +// } +// else +// { +// // We need to create a new vector for this sourceClass. +// entries = new Vector(); +// ruleEntry = new RuleEntry( sourceProperty, targetClass, targetProperty, transformer ); +// entries.add( ruleEntry ); +// ruleEntries_.put( sourceClass, entries ); +// } +// } + + /* (non-Javadoc) + * @see org.eclipse.wst.command.internal.env.core.data.DataMappingRegistry#addMapping(java.lang.Class, java.lang.String, java.lang.Class) + */ + public void addMapping(Class sourceType, String sourceProperty, Class targetType) + { + addMapping( sourceType, sourceProperty, targetType, sourceProperty, null ); + } +} diff --git a/core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/data/RuleEntry.java b/core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/data/RuleEntry.java new file mode 100644 index 000000000..0b90901d6 --- /dev/null +++ b/core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/data/RuleEntry.java @@ -0,0 +1,32 @@ +/******************************************************************************* + * Copyright (c) 2004, 2005 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.wst.command.internal.env.core.data; + + +public class RuleEntry +{ + public String sourceType_; + public String sourceProperty_; + public String targetProperty_; + public Transformer transformer_; + + + public RuleEntry( String sourceType, + String sourceProperty, + String targetProperty, + Transformer transformer ) + { + sourceType_ = sourceType; + sourceProperty_ = sourceProperty; + targetProperty_ = targetProperty; + transformer_ = transformer; + } +} diff --git a/core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/data/Transformer.java b/core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/data/Transformer.java new file mode 100644 index 000000000..0880a65ca --- /dev/null +++ b/core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/data/Transformer.java @@ -0,0 +1,23 @@ +/******************************************************************************* + * Copyright (c) 2004, 2005 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.wst.command.internal.env.core.data; + +/** + * This interface is used to transform an object from one class to another. + * + */ +public interface Transformer +{ + /* + * @return returns a transformed object based on the input value. + */ + public Object transform( Object value ); +} diff --git a/core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/fragment/AbstractCommandFragment.java b/core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/fragment/AbstractCommandFragment.java new file mode 100644 index 000000000..5ad067780 --- /dev/null +++ b/core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/fragment/AbstractCommandFragment.java @@ -0,0 +1,102 @@ +/******************************************************************************* + * Copyright (c) 2004, 2005 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.wst.command.internal.env.core.fragment; + +import org.eclipse.wst.command.internal.env.core.CommandFactory; +import org.eclipse.wst.command.internal.env.core.data.DataMappingRegistry; + + +/** + * This class is used as the base class for other standard fragment classes. + * +**/ +public abstract class AbstractCommandFragment implements CommandFragment +{ + private CommandFactory commandFactory_; + private String id_; + private boolean doNotRunInTransaction_ = false; + + /** + * Copy constructor. + * @param fragment + */ + protected AbstractCommandFragment( AbstractCommandFragment fragment ) + { + commandFactory_ = fragment.commandFactory_; + id_ = fragment.id_; + } + + /** + * Creates a new AbstractCommandFragment. + * + * @param command the executable command for this fragment. + **/ + public AbstractCommandFragment( CommandFactory commandFactory, String id ) + { + commandFactory_ = commandFactory; + id_ = id; + } + + public String getId() + { + return id_; + } + + public void setId( String id ) + { + id_ = id; + } + + /** + * Gets executable command associated with this fragment. + * + * @return returns the first child fragment for this fragment. Returns + * null when there is no first child. + **/ + public CommandFactory getCommandFactory() + { + return commandFactory_; + } + + /** + * This method is called retrieve the data mappings for this command fragment. + */ + public void registerDataMappings( DataMappingRegistry registry ) + { + // The default behaviour is not to add any entries to the registry. + } + + /** + * + * @return If the commands for this fragment should not be run within a transaction then + * this method should return true. If the fragment does not care if it is run in a transaction + * or not it should return false. + */ + public boolean doNotRunInTransaction() + { + return doNotRunInTransaction_; + } + + /** + * Sets the run in transaction property. + * @param doNotRunInTransaction + */ + public void setDoNotRunInTransaction( boolean doNotRunInTransaction ) + { + doNotRunInTransaction_ = doNotRunInTransaction; + } + + /** + * All fragments need to be cloneable. + **/ + abstract public Object clone(); + +} diff --git a/core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/fragment/BooleanFragment.java b/core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/fragment/BooleanFragment.java new file mode 100644 index 000000000..b56b368f5 --- /dev/null +++ b/core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/fragment/BooleanFragment.java @@ -0,0 +1,154 @@ +/******************************************************************************* + * Copyright (c) 2004, 2005 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.wst.command.internal.env.core.fragment; + +import org.eclipse.wst.command.internal.env.core.CommandFactory; +import org.eclipse.wst.command.internal.env.core.common.Condition; + + +/** + * This class returns either the true fragment or the false fragment + * based on the response from the condition object. +**/ +public class BooleanFragment extends AbstractCommandFragment +{ + private CommandFragment trueFragment_; + private CommandFragment falseFragment_; + private Condition condition_; + + /** + * Create a BooleanFragment with default values. + * + */ + public BooleanFragment() + { + this( null, null, new Condition() + { + public boolean evaluate() + { + return true; + } + }, + null, "" ); + } + + /** + * + * @param trueFragment The fragment chosen if the condition is true. + * @param falseFragment The fragment chosen if the condition is false. + * @param condition The condition. + */ + public BooleanFragment( CommandFragment trueFragment, + CommandFragment falseFragment, + Condition condition ) + { + this( trueFragment, falseFragment, condition, null, "" ); + } + + /** + * Creates a new BooleanFragment. + * + * @param trueFragment returned if condition is true. + * @param falseFragment returned if condition is false. + * @param condition the condition for this fragment. + * @param state the state passed to the condition. + * @param command the exectable command for this fragment. + **/ + public BooleanFragment( CommandFragment trueFragment, + CommandFragment falseFragment, + Condition condition, + CommandFactory commandFactory, + String id ) + { + super( commandFactory, id ); + + trueFragment_ = trueFragment; + falseFragment_ = falseFragment; + condition_ = condition; + } + + /** + * Copy constructor. + * @param frag + */ + protected BooleanFragment( BooleanFragment frag ) + { + this( null, + null, + frag.condition_, + frag.getCommandFactory(), + frag.getId() ); + + // Now we have to clone in the true and false + // fragments. + trueFragment_ = (CommandFragment)trueFragment_.clone(); + falseFragment_ = (CommandFragment)falseFragment_.clone(); + } + + /** + * Makes a copy of the CommandFragment. + * + * @return returns a copy of this fragment. + **/ + public Object clone() + { + return new BooleanFragment( this ); + } + + /** + * Gets the first child fragment for this fragment. + * + * @return returns the first child fragment for this fragment. Returns + * null when there is no first child. + **/ + public CommandFragment getFirstSubFragment() + { + return condition_.evaluate() ? trueFragment_ : falseFragment_; + } + + /** + * Gets the next child fragment for this fragment. + * + * @return returns the next child fragment for this fragment. Returns null + * when there is no next child. + **/ + public CommandFragment getNextSubFragment( CommandFragment fragment ) + { + return null; + } + + /** + * Sets the condition. + * @param condition + */ + public void setCondition( Condition condition ) + { + condition_ = condition; + } + + /** + * Sets the true fragment. + * @param fragment + */ + public void setTrueFragment( CommandFragment fragment ) + { + trueFragment_ = fragment; + } + + /** + * Sets the false fragment. + * @param fragment + */ + public void setFalseFragment( CommandFragment fragment ) + { + falseFragment_ = fragment; + } +} diff --git a/core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/fragment/ChoiceFragment.java b/core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/fragment/ChoiceFragment.java new file mode 100644 index 000000000..92c772a5e --- /dev/null +++ b/core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/fragment/ChoiceFragment.java @@ -0,0 +1,143 @@ +/******************************************************************************* + * Copyright (c) 2004, 2005 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.wst.command.internal.env.core.fragment; + +import java.util.Enumeration; +import java.util.Hashtable; + +import org.eclipse.wst.command.internal.env.core.CommandFactory; +import org.eclipse.wst.command.internal.env.core.common.Evaluate; + + +/** + * This class returns a fragment from a list of fragments based + * on the object returned from the Evaluate object. +**/ +public class ChoiceFragment extends AbstractCommandFragment +{ + private Hashtable fragmentTable_; + private Evaluate evaluate_; + + /** + * Create a clone with new a new hashtable. + **/ + protected ChoiceFragment( ChoiceFragment frag ) + { + super( frag.getCommandFactory(), frag.getId() ); + + evaluate_ = frag.evaluate_; + fragmentTable_ = new Hashtable(); + + Enumeration keys = frag.fragmentTable_.keys(); + + // Clone the fragments in the table. + while( keys.hasMoreElements() ) + { + Object key = keys.nextElement(); + fragmentTable_.put( key, ((CommandFragment)frag.fragmentTable_.get(key)).clone() ); + } + } + + public ChoiceFragment( Object[] keys, + CommandFragment[] fragments ) + { + this( keys, fragments, null, null, "" ); + } + + public ChoiceFragment( Object[] keys, + CommandFragment[] fragments, + Evaluate evaluate ) + { + this( keys, fragments, evaluate, null, "" ); + } + + public void setEvaluate( Evaluate evaluate ) + { + evaluate_ = evaluate; + } + + /** + * Constructs a choice fragment. The key at index X is mapped to + * to the fragment at index X. + * + * @param keys these keys must be unique as determined by the equals method. + * They are used to identify which fragment to return. + * @param fragments these are the fragments to be returned. Null is not allowed + * as an entry in the array. + * @param evaluate the object returned by this evaluate object is used + * as the key to locate a fragment. + * @param state the state passed to evaluate. + **/ + public ChoiceFragment( Object[] keys, + CommandFragment[] fragments, + Evaluate evaluate, + CommandFactory commandFactory, + String id ) + { + super( commandFactory, id ); + + evaluate_ = evaluate; + fragmentTable_ = new Hashtable(); + + if( keys == null || fragments == null || keys.length != fragments.length ) + { + throw new IllegalArgumentException( "Bad keys or fragments." ); + } + else + { + // Create the fragment table. + for( int index = 0; index < keys.length; index++ ) + { + fragmentTable_.put( keys[index], fragments[index] ); + } + } + } + + /** + * Makes a copy of the CommandFragment. + * + * @return returns a copy of this fragment. + **/ + public Object clone() + { + return new ChoiceFragment( this ); + } + + /** + * Gets the first child fragment for this fragment. + * + * @return returns the first child fragment for this fragment. Returns + * null when there is no first child. + **/ + public CommandFragment getFirstSubFragment() + { + Object key = evaluate_.evaluate(); + CommandFragment fragment = (CommandFragment)fragmentTable_.get(key); + + if( fragment == null ) + { + throw new IllegalArgumentException( "Key not found in table. Key=" + key ); + } + + return fragment; + } + + /** + * Gets the next child fragment for this fragment. + * + * @return returns the next child fragment for this fragment. Returns null + * when there is no next child. + **/ + public CommandFragment getNextSubFragment( CommandFragment fragment ) + { + return null; + } +} diff --git a/core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/fragment/CommandFactoryFragment.java b/core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/fragment/CommandFactoryFragment.java new file mode 100644 index 000000000..19075ac57 --- /dev/null +++ b/core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/fragment/CommandFactoryFragment.java @@ -0,0 +1,160 @@ +/******************************************************************************* + * Copyright (c) 2005 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.wst.command.internal.env.core.fragment; + +import java.util.Vector; + +import org.eclipse.wst.command.internal.env.core.CommandFactory; +import org.eclipse.wst.command.internal.env.core.ICommandFactory; +import org.eclipse.wst.command.internal.env.core.data.DataMappingRegistry; +import org.eclipse.wst.common.frameworks.datamodel.AbstractDataModelOperation; + +public abstract class CommandFactoryFragment implements CommandFragment +{ + private Vector commands_; + + /** + * Subclasses should override this method and return + * an CommandFactory. + * @return + */ + public abstract ICommandFactory getICommandFactory(); + + /** + * All wizard fragments need to be cloneable. + **/ + public abstract Object clone(); + + protected CommandFactoryFragment( CommandFactoryFragment frag ) + { + commands_ = frag.commands_; + } + + public CommandFactoryFragment() + { + } + + /** + * + * @return Returns a unique identifier for this fragment. + */ + public String getId() + { + return ""; + } + + /** + * Gets executable command associated with this fragment. + * + * @return returns the first child fragment for this fragment. Returns + * null when there is no first child. + **/ + public CommandFactory getCommandFactory() + { + return null; + } + + /** + * Gets the first child fragment for this fragment. + * + * @return returns the first child fragment for this fragment. Returns + * null when there is no first child. + **/ + public CommandFragment getFirstSubFragment() + { + CommandFragment result = null; + + commands_ = createCommands(); + + if( commands_.size() > 0 ) + { + result = (ChildFragment)commands_.elementAt(0); + } + + return result; + } + + /** + * Gets the next child fragment for this fragment. + * + * @return returns the next child fragment for this fragment. Returns null + * when there is no next child. + **/ + public CommandFragment getNextSubFragment( CommandFragment fragment ) + { + CommandFragment result = null; + + if( commands_ != null && fragment instanceof ChildFragment ) + { + ChildFragment child = (ChildFragment)fragment; + + int index = child.index_; + + if( index != -1 ) + { + index++; + + if( index < commands_.size() ) + { + result = (CommandFragment)commands_.elementAt( index ); + } + } + } + + return result; + } + + /* + * This method is called to retrieve the data mappings for this command fragment. + */ + public void registerDataMappings( DataMappingRegistry registry ) + { + } + + /** + * + * @return If the commands for this fragment should not be run within a transaction then + * this method should return true. If the fragment does not care if it is run in a transaction + * or not it should return false. + */ + public boolean doNotRunInTransaction() + { + return false; + } + + private Vector createCommands() + { + Vector commands = new Vector(); + ICommandFactory factory = getICommandFactory(); + int index = 0; + + while( factory != null && factory.hasNext() ) + { + AbstractDataModelOperation command = factory.getNextCommand(); + + commands.add( new ChildFragment( command, index++ ) ); + } + + return commands; + } + + private class ChildFragment extends SimpleFragment + { + int index_; + + public ChildFragment( AbstractDataModelOperation command, int index ) + { + super( command, command.getID() ); + index_ = index; + } + } +} diff --git a/core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/fragment/CommandFragment.java b/core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/fragment/CommandFragment.java new file mode 100644 index 000000000..d6762a989 --- /dev/null +++ b/core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/fragment/CommandFragment.java @@ -0,0 +1,71 @@ +/******************************************************************************* + * Copyright (c) 2004, 2005 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.wst.command.internal.env.core.fragment; + +import org.eclipse.wst.command.internal.env.core.CommandFactory; +import org.eclipse.wst.command.internal.env.core.data.DataMappingRegistry; + + +/** + * This interface describes a list of interruptable commands. The + * order of this list of commands is defined by the getFirstSubFragment and + * getNextSubFragment methods. +**/ +public interface CommandFragment extends Cloneable +{ + /** + * + * @return Returns a unique identifier for this fragment. + */ + public String getId(); + + /** + * Gets executable command associated with this fragment. + * + * @return returns the first child fragment for this fragment. Returns + * null when there is no first child. + **/ + public CommandFactory getCommandFactory(); + + /** + * Gets the first child fragment for this fragment. + * + * @return returns the first child fragment for this fragment. Returns + * null when there is no first child. + **/ + public CommandFragment getFirstSubFragment(); + + /** + * Gets the next child fragment for this fragment. + * + * @return returns the next child fragment for this fragment. Returns null + * when there is no next child. + **/ + public CommandFragment getNextSubFragment( CommandFragment fragment ); + + /* + * This method is called to retrieve the data mappings for this command fragment. + */ + public void registerDataMappings( DataMappingRegistry registry ); + + /** + * + * @return If the commands for this fragment should not be run within a transaction then + * this method should return true. If the fragment does not care if it is run in a transaction + * or not it should return false. + */ + public boolean doNotRunInTransaction(); + + /** + * All wizard fragments need to be cloneable. + **/ + public Object clone(); +} diff --git a/core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/fragment/CommandFragmentEngine.java b/core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/fragment/CommandFragmentEngine.java new file mode 100644 index 000000000..95116999b --- /dev/null +++ b/core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/fragment/CommandFragmentEngine.java @@ -0,0 +1,472 @@ +/******************************************************************************* + * Copyright (c) 2004, 2007 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 + * yyyymmdd bug Email and other contact information + * -------- -------- ----------------------------------------------------------- + * 20060223 129232 pmoogk@ca.ibm.com - Peter Moogk + * 20060313 130958 pmoogk@ca.ibm.com - Peter Moogk + * 20061011 159283 makandre@ca.ibm.com - Andrew Mak, project not associated to EAR when using ant on command-line + * 20070323 175800 pmoogk@ca.ibm.com - Peter Moogk + * 20070730 197144 pmoogk@ca.ibm.com - Peter Moogk, Pass progress monitor to undo commands. + *******************************************************************************/ +package org.eclipse.wst.command.internal.env.core.fragment; + +import java.util.Stack; + +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.IStatus; +import org.eclipse.core.runtime.MultiStatus; +import org.eclipse.core.runtime.Status; +import org.eclipse.wst.command.internal.env.core.CommandFactory; +import org.eclipse.wst.command.internal.env.core.CommandManager; +import org.eclipse.wst.command.internal.env.core.EnvironmentCoreMessages; +import org.eclipse.wst.command.internal.env.core.common.StatusUtils; +import org.eclipse.wst.command.internal.env.core.data.DataFlowManager; +import org.eclipse.wst.command.internal.env.core.data.DataMappingRegistry; +import org.eclipse.wst.common.environment.IEnvironment; +import org.eclipse.wst.common.environment.ILog; +import org.eclipse.wst.common.frameworks.datamodel.AbstractDataModelOperation; + + + +/** + * The CommandFragmentEngine provides a convienent way to traverse CommandFragments + * and possiblity execute its associate Command. + */ +public class CommandFragmentEngine implements CommandManager +{ + private Stack commandStack_; + private FragmentListener undoFragmentListener_; + private FragmentListener nextFragmentListener_; + private FragmentListener afterExecuteFragmentListener_; + private FragmentListener peekFragmentListener_; + private DataFlowManager dataManager_; + private IEnvironment environment_; + private IStatus lastStatus_; + + /** + * Creates a CommandFragmentEngine. + * + * @param startFragment the root fragment where traversal will begin. + * @param dataManager the data manager containing all of the data mappings. + * @param environment the environment. + */ + public CommandFragmentEngine( CommandFragment startFragment, DataFlowManager dataManager, IEnvironment environment ) + { + SequenceFragment root = new SequenceFragment(); + root.add( startFragment ); + + commandStack_ = new Stack(); + + addToStack( root, -1 ); + addToStack( startFragment, 0 ); + + dataManager_ = dataManager; + environment_ = environment; + } + + public String toString() + { + String newline = System.getProperty("line.separator"); + StringBuffer buffer = new StringBuffer(); + + buffer.append(newline); + buffer.append("Command stack start:"); + buffer.append(newline); + + for( int index = 0; index < commandStack_.size(); index++ ) + { + CommandListEntry entry = (CommandListEntry)commandStack_.elementAt(index); + entry.dump(buffer, index); + } + + buffer.append("Command start end:"); + buffer.append(newline); + + return buffer.toString(); + } + + /** + * @return returns the Data mapping registry. + */ + public DataMappingRegistry getMappingRegistry() + { + return dataManager_.getMappingRegistry(); + } + + /** + * + * @return the Status from the last Command executed. + */ + public IStatus getLastStatus() + { + return lastStatus_; + } + + /** + */ + public boolean isUndoEnabled() + { + return true; + } + + /** + * Sets the next fragment listener for this engine. This listener will be + * called for each fragment that is traversed in moveForwardToNextStop operation. + * + * @param listener the fragment listener. + */ + public void setNextFragmentListener( FragmentListener listener ) + { + nextFragmentListener_ = listener; + } + + public void setAfterExecuteFragmentListener( FragmentListener listener ) + { + afterExecuteFragmentListener_ = listener; + } + + /** + * Sets the next fragment listener for this engine. This listener will be + * called for each fragment that is traversed in peekForwardToNextStop operation. + * + * @param listener the fragment listener. + */ + public void setPeekFragmentListener( FragmentListener listener ) + { + peekFragmentListener_ = listener; + } + + /** + * Sets the peek fragment listener for this engine. This listener will be + * called for each fragment that is traversed in undoToLastStop operation. + * + * @param listener the fragment listener. + */ + public void setUndoFragmentListener( FragmentListener listener ) + { + undoFragmentListener_ = listener; + } + + /** + * Traverse the CommandFragments starting with the CommandFragment on the + * top of the command fragment stack. The operation does NOT change the + * command fragment stack and does not execute any command associated with + * a CommandFragment. + */ + public void peekForwardToNextStop() + { + CommandListEntry topEntry = (CommandListEntry)commandStack_.lastElement(); + int parentIndex = topEntry.parentIndex_; + CommandFragment childFragment = topEntry.fragment_; + boolean continueLoop = navigateChildFragments( childFragment, false ); + + while( parentIndex != -1 && continueLoop ) + { + CommandListEntry parentEntry = (CommandListEntry)commandStack_.elementAt( parentIndex ); + CommandFragment parentFragment = parentEntry.fragment_; + CommandFragment nextFragment = parentFragment.getNextSubFragment( childFragment ); + + if( nextFragment == null ) + { + // There are no more sibling fragments to navigate so we will pop up to the parent + // an continue navigation there. + parentIndex = parentEntry.parentIndex_; + childFragment = parentFragment; + } + else + { + if( navigateChildFragments( nextFragment, true ) ) + { + // We are continuing to navigate. This time we want to traverse the sibling + // of nextFragment. + childFragment = nextFragment; + } + else + { + // We are stopping our navigation. + continueLoop = false; + } + } + } + } + + + /** + * Traverse the CommandFragments starting with the CommandFragment on the + * top of the command fragment stack. This operation does change the + * command fragment stack and does execute any command associated with + * a CommandFragment. + */ + public void moveForwardToNextStop( IProgressMonitor monitor ) + { + CommandListEntry topEntry = (CommandListEntry)commandStack_.lastElement(); + int parentIndex = topEntry.parentIndex_; + CommandFragment currentFragment = topEntry.fragment_; + boolean continueExecute = visitTop( monitor ); + CommandFragment childFragment = currentFragment.getFirstSubFragment(); + + // If the current fragment has child fragments we need to traverse these children. + while( childFragment != null && continueExecute ) + { + parentIndex = commandStack_.size() - 1; + addToStack( childFragment, parentIndex ); + continueExecute = visitTop( monitor ); + currentFragment = childFragment; + childFragment = currentFragment.getFirstSubFragment(); + } + + // The previous while loop has guaranteed that currentFragment has no + // child fragments. This while loop assumes this to be the case. + while( parentIndex != -1 && continueExecute ) + { + CommandListEntry parentEntry = (CommandListEntry)commandStack_.elementAt( parentIndex ); + CommandFragment parentFragment = parentEntry.fragment_; + CommandFragment nextFragment = null; + + if( currentFragment == null ) + { + nextFragment = parentFragment.getFirstSubFragment(); + } + else + { + nextFragment = parentFragment.getNextSubFragment( currentFragment ); + } + + if( nextFragment == null ) + { + // There are no more sibling fragments to navigate so we will pop up to the parent + // and continue navigation there. + parentIndex = parentEntry.parentIndex_; + currentFragment = parentFragment; + } + else + { + // We have a new fragment that we need to add to the top of the stack. + addToStack( nextFragment, parentIndex ); + parentIndex = commandStack_.size() - 1; + continueExecute = visitTop( monitor ); + currentFragment = null; + } + } + } + + /** + * + * @return returns true if the there is not longer any elements on the stack. Note: + * that last two entries are always left on the stack. + */ + public boolean undoToLastStop( IProgressMonitor monitor ) + { + CommandListEntry topEntry = (CommandListEntry)commandStack_.lastElement(); + + if( topEntry.fragmentStopped_ && !topEntry.beforeExecute_ ) + { + // Normally the command at the top of the stack has not been executed. If + // it has been execute, it means that we tried to execute and it failed. + // The first command in the command stack failed. Therefore, we should + // only undo this command. + performUndo( topEntry, monitor ); + return topEntry.parentIndex_ == 0; + } + + performUndo( topEntry, monitor ); + + while( topEntry.parentIndex_ != 0 ) + { + commandStack_.pop(); + topEntry = (CommandListEntry)commandStack_.lastElement(); + + performUndo( topEntry, monitor ); + + if( topEntry.fragmentStopped_ ) + { + break; + } + } + + return topEntry.parentIndex_ == 0; + } + + private void performUndo( CommandListEntry entry, IProgressMonitor monitor ) + { + if( entry.parentIndex_ == 0 ) return; + + AbstractDataModelOperation cmd = entry.command_; + + try + { + if( cmd != null ) + { + if( cmd.canUndo() && !entry.beforeExecute_ ) + { + cmd.undo( monitor, null ); + } + + dataManager_.unprocess( cmd ); + } + } + catch( Exception exc ) + { + exc.printStackTrace(); + } + + entry.beforeExecute_ = true; + undoFragmentListener_.notify( entry.fragment_ ); + } + + private boolean navigateChildFragments( CommandFragment fragment, boolean visitCurrent ) + { + boolean continueNavigate = true; + CommandFragment childFrag = null; + + if( visitCurrent ) + { + continueNavigate = peekFragmentListener_.notify( fragment ); + dataManager_.process( fragment ); + } + + childFrag = fragment.getFirstSubFragment(); + + while( childFrag != null && continueNavigate ) + { + continueNavigate = navigateChildFragments( childFrag, true ); + childFrag = fragment.getNextSubFragment( childFrag ); + } + + return continueNavigate; + } + + private boolean visitTop( IProgressMonitor monitor ) + { + CommandListEntry entry = (CommandListEntry)commandStack_.lastElement(); + boolean continueNavigate = nextFragmentListener_.notify( entry.fragment_ ); + + if( continueNavigate ) + { + // Call the setters for this fragment. + dataManager_.process( entry.fragment_ ); + + // Add any rules to the mapping registry before we execute the command. + entry.fragment_.registerDataMappings( dataManager_.getMappingRegistry() ); + + lastStatus_ = runCommand( entry, monitor ); + + if( afterExecuteFragmentListener_ != null ) + { + continueNavigate = afterExecuteFragmentListener_.notify( entry.fragment_ ); + + if( !continueNavigate ) + { + // The after execution listener has indicated that execution should stop. + // Therefore, we will upgrade the severity of the last status to ERROR. + lastStatus_ = new Status( IStatus.ERROR, + lastStatus_.getPlugin(), + lastStatus_.getCode(), + lastStatus_.getMessage(), + lastStatus_.getException() ); + } + } + + if( continueNavigate && lastStatus_.getSeverity() == IStatus.ERROR ) continueNavigate = false; + } + + if( !continueNavigate ) entry.fragmentStopped_ = true; + + return continueNavigate; + } + + private void addToStack( CommandFragment fragment, int parentIndex ) + { + CommandListEntry entry = new CommandListEntry( fragment, parentIndex ); + commandStack_.push( entry ); + } + + // Subclasses can do initialization before the execution of a command here + protected IStatus initBeforeExecute( AbstractDataModelOperation operation ) + { + return Status.OK_STATUS; + } + + private IStatus runCommand( CommandListEntry entry, IProgressMonitor monitor ) + { + CommandFactory factory = entry.fragment_.getCommandFactory(); + IStatus status = Status.OK_STATUS; + + if( factory != null ) + { + AbstractDataModelOperation cmd = factory.create(); + + entry.command_ = cmd; + + if( cmd != null ) + { + try + { + dataManager_.process( cmd ); + + status = initBeforeExecute( cmd ); + + environment_.getLog().log(ILog.INFO, "command", 5001, this, "runCommand", "Executing: " + cmd.getClass().getName()); + + cmd.setEnvironment( environment_ ); + status = cmd.execute( monitor, null ); + + entry.beforeExecute_ = false; + } + catch( Throwable exc ) + { + IStatus unexpectedError = StatusUtils.errorStatus( exc ); + MultiStatus parentStatus = new MultiStatus( "id", 0, new IStatus[]{unexpectedError}, + EnvironmentCoreMessages.MSG_ERROR_UNEXPECTED_ERROR, null ); + environment_.getStatusHandler().reportError( parentStatus ); + status = unexpectedError; + } + finally + { + String message = "Ok"; + + if( status.getSeverity() == Status.ERROR ) + { + message = "Error: " + status.getMessage(); + } + + environment_.getLog().log(ILog.INFO, "command", 5001, this, "runCommand", "Execution status: " + message ); + } + } + } + + return status; + } + + private class CommandListEntry + { + public CommandListEntry( CommandFragment fragment, int parentIndex ) + { + fragment_ = fragment; + parentIndex_ = parentIndex; + fragmentStopped_ = false; + beforeExecute_ = true; + } + + public AbstractDataModelOperation command_; + public CommandFragment fragment_; + public int parentIndex_; + public boolean fragmentStopped_; + public boolean beforeExecute_; + + public void dump( StringBuffer buffer, int index ) + { + String newline = System.getProperty("line.separator"); + String line = " " + index + "- frag: " + fragment_.getId() + " parIndex: " + parentIndex_ + " stop: " + fragmentStopped_ + " beforeExecute: " + beforeExecute_ ; + buffer.append(line); + buffer.append(newline); + } + } +} diff --git a/core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/fragment/CommandFragmentFactory.java b/core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/fragment/CommandFragmentFactory.java new file mode 100644 index 000000000..323c963cc --- /dev/null +++ b/core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/fragment/CommandFragmentFactory.java @@ -0,0 +1,24 @@ +/******************************************************************************* + * Copyright (c) 2004, 2005 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.wst.command.internal.env.core.fragment; + +/** + * This interface provides a way to create CommandFragments. + * + */ +public interface CommandFragmentFactory +{ + /** + * + * @return returns a created CommandFragment object. + */ + public CommandFragment create(); +} diff --git a/core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/fragment/CommandFragmentFactoryFactory.java b/core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/fragment/CommandFragmentFactoryFactory.java new file mode 100644 index 000000000..159fb6b26 --- /dev/null +++ b/core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/fragment/CommandFragmentFactoryFactory.java @@ -0,0 +1,22 @@ +/******************************************************************************* + * Copyright (c) 2004, 2005 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.wst.command.internal.env.core.fragment; + +public interface CommandFragmentFactoryFactory +{ + /** + * The framework calls this method to get the CommandFragmentFactory + * for a particular extension. + * + * @return Creates a CommandFragmentFactory. + */ + public CommandFragmentFactory create(); +} diff --git a/core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/fragment/ExtensionFragment.java b/core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/fragment/ExtensionFragment.java new file mode 100644 index 000000000..19173f1c2 --- /dev/null +++ b/core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/fragment/ExtensionFragment.java @@ -0,0 +1,99 @@ +/******************************************************************************* + * Copyright (c) 2004, 2005 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.wst.command.internal.env.core.fragment; + +import java.util.Hashtable; +import org.eclipse.wst.command.internal.env.core.registry.CommandRegistry; + + +public class ExtensionFragment extends AbstractCommandFragment +{ + private String[] ids_;; + private CommandRegistry extensionRegistry_; + private Hashtable fragments_; + + /** + * The default constructor + * + */ + public ExtensionFragment() + { + super( null, "" ); + fragments_ = new Hashtable(); + } + + /** + * Copy constructor. + * @param Fragment the fragment to copy + */ + protected ExtensionFragment( ExtensionFragment fragment ) + { + super( fragment ); + + ids_ = fragment.ids_; + extensionRegistry_ = fragment.extensionRegistry_; + fragments_ = fragment.fragments_; + } + + /** + * + * @param ids Sets the IDs for this extension fragment. + */ + public void setExtensionIds( String[] ids ) + { + ids_ = ids; + } + + /** + * + * @param registry Sets the registry for this extension fragment. + */ + public void setExtensionRegistry( CommandRegistry registry ) + { + extensionRegistry_ = registry; + } + + /** + * @see org.eclipse.wst.command.internal.env.core.fragment.CommandFragment#getFirstSubFragment() + */ + public CommandFragment getFirstSubFragment() + { + CommandFragmentFactoryFactory factory = extensionRegistry_.getFactoryFactory( ids_ ); + + if( factory == null ) return null; + + CommandFragment fragment = (CommandFragment)fragments_.get( factory ); + + if( fragment == null ) + { + fragment = factory.create().create(); + fragments_.put( factory, fragment ); + } + + return fragment; + } + + /** + * @see org.eclipse.wst.command.internal.env.core.fragment.CommandFragment#getNextSubFragment(org.eclipse.wst.command.internal.env.core.fragment.CommandFragment) + */ + public CommandFragment getNextSubFragment(CommandFragment fragment) + { + return null; + } + + /** + * @see java.lang.Object#clone() + */ + public Object clone() + { + return new ExtensionFragment( this ); + } +} diff --git a/core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/fragment/FragmentListener.java b/core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/fragment/FragmentListener.java new file mode 100644 index 000000000..f0de7e8a6 --- /dev/null +++ b/core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/fragment/FragmentListener.java @@ -0,0 +1,25 @@ +/******************************************************************************* + * Copyright (c) 2004, 2005 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.wst.command.internal.env.core.fragment; + +/** + * This interface should be implement for code that needs to listen to fragments + * that are being traverse by the CommandFragmentEngine. + * + */ +public interface FragmentListener +{ + /* + * Notifies this listener that a commandFragment is being visited during + * a traversal. + */ + public boolean notify( CommandFragment commandFragment ); +} diff --git a/core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/fragment/LoopCondition.java b/core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/fragment/LoopCondition.java new file mode 100644 index 000000000..503b1a18e --- /dev/null +++ b/core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/fragment/LoopCondition.java @@ -0,0 +1,27 @@ +/******************************************************************************* + * Copyright (c) 2004, 2005 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.wst.command.internal.env.core.fragment; + +/** + * This interface can be used when a conditional object needs to be returned. +**/ +public interface LoopCondition +{ + /** + * Evaluates a loop condition. + * + * @param loop the loop fragment that is being evaluated. + * @param fragment the child fragment of the loop + * under evaluation. Note: fragment can be null. + * @return returns an object based on some evaluated condition. + **/ + public boolean evaluate( LoopFragment loop, CommandFragment fragment ); +} diff --git a/core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/fragment/LoopFragment.java b/core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/fragment/LoopFragment.java new file mode 100644 index 000000000..23971a0ce --- /dev/null +++ b/core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/fragment/LoopFragment.java @@ -0,0 +1,135 @@ +/******************************************************************************* + * Copyright (c) 2004, 2005 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.wst.command.internal.env.core.fragment; + +import org.eclipse.wst.command.internal.env.core.CommandFactory; +import org.eclipse.wst.command.internal.env.core.common.RangeVector; + + +/** + * This class returns a dynamically determined number of + * fragments. This loop will return the fragment parameter + * as long as the stopCondition evaluates to false. Otherwise, + * null is returned. +**/ +public class LoopFragment extends AbstractCommandFragment +{ + private LoopCondition stopCondition_; + private CommandFragment fragment_; + private RangeVector fragmentHistory_; + + /** + * Copy contructor for this fragment. + **/ + protected LoopFragment( LoopFragment fragment ) + { + this( fragment.fragment_, + fragment.stopCondition_, + fragment.getCommandFactory(), + fragment.getId() ); + } + + public LoopFragment( CommandFragment fragment, + LoopCondition stopCondition ) + { + this( fragment, stopCondition, null, "" ); + } + + /** + * @param fragment the fragment that will be returned by the loop. + * @param stopCondition when false the fragment will be returned, + * otherwise null is returned. + * @param state the state passed to the condition. + * @param command the executable command for this fragment. + **/ + public LoopFragment( CommandFragment fragment, + LoopCondition stopCondition, + CommandFactory commandFactory, + String id ) + { + super( commandFactory, id ); + + fragment_ = fragment; + stopCondition_ = stopCondition; + fragmentHistory_ = new RangeVector(); + } + + /** + * Makes a copy of the CommandFragment. + * + * @return returns a copy of this fragment. + **/ + public Object clone() + { + return new LoopFragment( this ); + } + + /** + * Returns the index of the fragment + * + * @param fragment the fragment to search. + * @return the index of this fragment. + **/ + public int indexOf( CommandFragment fragment ) + { + return fragmentHistory_.indexOf( fragment ); + } + + + /** + * Gets the first child fragment for this fragment. + * + * @return returns the first child fragment for this fragment. Returns + * null when there is no first child. + **/ + public CommandFragment getFirstSubFragment() + { + return getNextSubFragment( null ); + } + + /** + * Gets the next child fragment for this fragment. + * + * @return returns the next child fragment for this fragment. Returns null + * when there is no next child. + **/ + public CommandFragment getNextSubFragment( CommandFragment frag ) + { + CommandFragment nextFrag = null; + + if( stopCondition_.evaluate( this, frag ) ) + { + // The stop condition has been met. + // Do nothing. + } + else + { + int fragIndex = indexOf( frag ); + + // Note: when fragment == null the fragIndex + // should be -1. Therefore, if there + // is already a first fragment in + // fragmentHistory that will be returned. + if( fragIndex + 1 < fragmentHistory_.size() ) + { + // We have a copy of the fragment already. + nextFrag = (CommandFragment)(fragmentHistory_.elementAt( fragIndex + 1 )); + } + else + { + nextFrag = (CommandFragment)(fragment_.clone()); + fragmentHistory_.add( nextFrag ); + } + } + + return nextFrag; + } +} diff --git a/core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/fragment/SequenceFragment.java b/core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/fragment/SequenceFragment.java new file mode 100644 index 000000000..210ce6b5b --- /dev/null +++ b/core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/fragment/SequenceFragment.java @@ -0,0 +1,133 @@ +/******************************************************************************* + * Copyright (c) 2004, 2005 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.wst.command.internal.env.core.fragment; + +import java.util.Arrays; +import java.util.List; +import java.util.Vector; + +import org.eclipse.wst.command.internal.env.core.CommandFactory; + + +/** + * This class implements a sequence of CommandFragments. +**/ +public class SequenceFragment extends AbstractCommandFragment +{ + private List fragmentList_; + + protected SequenceFragment( SequenceFragment frag ) + { + super( frag.getCommandFactory(), frag.getId() ); + + fragmentList_ = new Vector(); + + for( int index = 0; index < frag.fragmentList_.size(); index++ ) + { + Object newFrag = ((CommandFragment)frag.fragmentList_.get(index)).clone(); + fragmentList_.add( newFrag ); + } + } + + public SequenceFragment( CommandFragment[] fragments, + CommandFactory commandFactory, + String id ) + { + super( commandFactory, id ); + + if( fragments != null ) + { + fragmentList_ = Arrays.asList( fragments ); + } + else + { + fragmentList_ = new Vector(); + } + } + + public SequenceFragment() + { + super( null, "" ); + + fragmentList_ = new Vector(); + } + + /** + * Appends a fragment to the sequence. + **/ + public void add( CommandFragment fragment ) + { + fragmentList_.add( fragment ); + } + + /** + * Makes a copy of the CommandFragment. + * + * @return returns a copy of this fragment. + **/ + public Object clone() + { + return new SequenceFragment( this ); + } + + /** + * Gets the first child fragment for this fragment. + * + * @return returns the first child fragment for this fragment. Returns + * null when there is no first child. + **/ + public CommandFragment getFirstSubFragment() + { + CommandFragment fragment = null; + + if( fragmentList_ == null || fragmentList_.size() == 0 ) + { + fragment = null; + } + else + { + fragment = (CommandFragment)( fragmentList_.get(0) ); + } + + return fragment; + } + + /** + * Gets the next child fragment for this fragment. + * + * @return returns the next child fragment for this fragment. Returns null + * when there is no next child. + **/ + public CommandFragment getNextSubFragment( CommandFragment fragment ) + { + int index = fragmentList_.indexOf( fragment ); + + if( index == -1 ) + { + throw new IllegalArgumentException( "Fragment not found in sequence."); + } + else + { + index++; + + if( index >= fragmentList_.size() ) + { + // There is nothing following this fragment so return null; + return null; + } + else + { + // Return the next fragment. + return (CommandFragment)(fragmentList_.get( index )); + } + } + } +} diff --git a/core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/fragment/SimpleFragment.java b/core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/fragment/SimpleFragment.java new file mode 100644 index 000000000..1e3eba841 --- /dev/null +++ b/core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/fragment/SimpleFragment.java @@ -0,0 +1,81 @@ +/******************************************************************************* + * Copyright (c) 2004, 2005 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.wst.command.internal.env.core.fragment; + +import org.eclipse.wst.command.internal.env.core.CommandFactory; +import org.eclipse.wst.common.frameworks.datamodel.AbstractDataModelOperation; + +/** + * This class implements an empty of WizardFragment. +**/ +public class SimpleFragment extends AbstractCommandFragment +{ + public SimpleFragment() + { + this( (CommandFactory)null, "" ); + } + + public SimpleFragment( String id ) + { + this( (CommandFactory)null, id ); + } + + public SimpleFragment( final AbstractDataModelOperation operation, String id ) + { + super( new CommandFactory() + { + public AbstractDataModelOperation create() + { + return operation; + } + }, id ); + } + + public SimpleFragment( CommandFactory commandFactory, String id ) + { + super( commandFactory, id ); + } + + /** + * Copy constructor for fragment. + **/ + protected SimpleFragment( SimpleFragment fragment ) + { + super( fragment.getCommandFactory(), fragment.getId() ); + } + + /** + * All wizard fragments need to be cloneable. + **/ + public Object clone() + { + return new SimpleFragment( this ); + } + + + /** + * Gets the first child fragment for this fragment. + * + * @return returns the first child fragment for this fragment. Returns + * null when there is no first child. + **/ + public CommandFragment getFirstSubFragment(){ return null; } + + /** + * Gets the next child fragment for this fragment. + * Since this is a simple fragment, there is no next fragment + * so we will always return null. + * + * @return returns the next child fragment for this fragment. Returns null + * when there is no next child. + **/ + public CommandFragment getNextSubFragment( CommandFragment fragment ){ return null; } +} diff --git a/core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/registry/CommandRegistry.java b/core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/registry/CommandRegistry.java new file mode 100644 index 000000000..4e6ef87b8 --- /dev/null +++ b/core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/registry/CommandRegistry.java @@ -0,0 +1,29 @@ +/******************************************************************************* + * Copyright (c) 2004, 2005 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.wst.command.internal.env.core.registry; + +import org.eclipse.wst.command.internal.env.core.fragment.CommandFragmentFactoryFactory; + +/** + * This interface provides a way to create a CommandFragmentFactoryFactory + * from an array of ids. + * + */ +public interface CommandRegistry +{ + /** + * Creates a CommandFragmentFactoryFactory from an array of ids. + * + * @param ids the ids. + * @return the CommandFragmentFactoryFactory object. + */ + public CommandFragmentFactoryFactory getFactoryFactory( String[] ids ); +} diff --git a/core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/selection/BooleanSelection.java b/core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/selection/BooleanSelection.java new file mode 100644 index 000000000..96805a005 --- /dev/null +++ b/core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/selection/BooleanSelection.java @@ -0,0 +1,45 @@ +/******************************************************************************* + * Copyright (c) 2004, 2005 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 + *******************************************************************************/ +/** + * This class combines a string with a boolean value. This is + * useful for storing the state data for a boolean selection list. + */ +package org.eclipse.wst.command.internal.env.core.selection; + +public class BooleanSelection +{ + private String value_; + private boolean selected_; + + public BooleanSelection( String value, boolean selected ) + { + value_ = value; + selected_ = selected; + } + + /** + * + * @return Get the string value. + */ + public String getValue() + { + return value_; + } + + /** + * + * @return Get the boolean value for this string. + */ + public boolean isSelected() + { + return selected_; + } +} diff --git a/core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/selection/ChoicesToString.java b/core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/selection/ChoicesToString.java new file mode 100644 index 000000000..ac33c6e79 --- /dev/null +++ b/core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/selection/ChoicesToString.java @@ -0,0 +1,47 @@ +/******************************************************************************* + * Copyright (c) 2004, 2005 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.wst.command.internal.env.core.selection; + +import org.eclipse.wst.command.internal.env.core.data.Transformer; + +/** + * This transformer class selects a string at a particular level + * in a SelectionListChoices class. + */ +public class ChoicesToString implements Transformer +{ + private int level_; + + public ChoicesToString( int level ) + { + level_ = level; + } + + /* (non-Javadoc) + * @see org.eclipse.wst.command.internal.env.core.data.Transformer#transform(java.lang.Object) + */ + public Object transform( Object value ) + { + SelectionListChoices choices = (SelectionListChoices)value; + + for( int index = 0; index < level_; index++ ) + { + choices = choices.getChoice(); + } + + return choices.getList().getSelection(); + } + + public SelectionList transform( SelectionListChoices choices ) + { + return (SelectionList)transform( (Object)choices ); + } +} diff --git a/core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/selection/DynamicList.java b/core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/selection/DynamicList.java new file mode 100644 index 000000000..b6ec71c74 --- /dev/null +++ b/core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/selection/DynamicList.java @@ -0,0 +1,92 @@ +/******************************************************************************* + * Copyright (c) 2004, 2005 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.wst.command.internal.env.core.selection; + +import java.util.Vector; + +/** + * This is a Dynamic version of the SelectionListChoices class. + */ +public class DynamicList +{ + private Vector stringList_ = new Vector(); + private Vector dynamicListVectorList_ = new Vector(); + + /** + * Adds an entry into the dynamic list. + * + * @param values the string values that lead to the target. + * @param target the target. + */ + public void add( String[] values, Object target ) + { + DynamicList currentList = this; + + for( int index = 0; index < values.length; index++ ) + { + String value = values[index]; + int length = currentList.stringList_.size(); + int foundIndex = -1; + + // Find the string in the current list. + for( int searchIndex = 0; searchIndex < length; searchIndex++ ) + { + String string = (String)currentList.stringList_.elementAt( searchIndex ); + + if( string.equals( value ) ) + { + foundIndex = searchIndex; + break; + } + } + + if( foundIndex == -1 ) + { + // We have a new string so add it to the list. + currentList.stringList_.add( value ); + currentList.dynamicListVectorList_.add( new DynamicList() ); + foundIndex = length; + } + + currentList = (DynamicList)currentList.dynamicListVectorList_.elementAt( foundIndex ); + } + + currentList.dynamicListVectorList_.add( target ); + } + + /** + * + * @return returns a SelectionListChoices object from this DynamicList + * object. + */ + public SelectionListChoices toListChoices() + { + SelectionList list = new SelectionList( (String[])stringList_.toArray( new String[0] ), 0); + int length = dynamicListVectorList_.size(); + Vector vector = new Vector(); + + for( int index = 0; index < length; index++ ) + { + Object obj = dynamicListVectorList_.elementAt(index); + + if( obj instanceof DynamicList ) + { + vector.add( ((DynamicList)obj).toListChoices() ); + } + else + { + vector.add( obj ); + } + } + + return new SelectionListChoices( list, vector ); + } +} diff --git a/core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/selection/SelectionList.java b/core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/selection/SelectionList.java new file mode 100644 index 000000000..4085773ea --- /dev/null +++ b/core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/selection/SelectionList.java @@ -0,0 +1,96 @@ +/******************************************************************************* + * Copyright (c) 2004, 2005 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.wst.command.internal.env.core.selection; + +/** + * This class stores a list strings along with a selectionIndex which + * stores the current string that selected. There is also a selection + * value. If this value is one of the strings in the the string list + * then selectionIndex will contain the index of this string. If it + * is not in the list then the selectionValue string will contain this + * value and selectionIndex will be set to -1. This class can be + * used to store the state data for a Combo box. + */ +public class SelectionList +{ + private int selectionIndex_; + private String[] list_; + private String selectionValue_; + + public SelectionList( String[] list, int selectionIndex ) + { + list_ = list; + selectionIndex_ = selectionIndex; + } + + /** + * Sets the selection value for this object. + * + * @param value the value. + */ + public void setSelectionValue( String value ) + { + selectionValue_ = value; + selectionIndex_ = -1; + + for( int index = 0; index < list_.length; index++ ) + { + if( value.equals( list_[index] ) ) + { + selectionIndex_ = index; + break; + } + } + } + + /* + * @return returns the string list. + */ + public String[] getList() + { + return list_; + } + + /* + * Sets the currently selected string in the list. + */ + public void setIndex( int index ) + { + selectionIndex_ = index; + selectionValue_ = null; + } + + /* + * @return returns the index of the current string. The value + * will be -1 if the selection value is not in the string list. + */ + public int getIndex() + { + return selectionIndex_; + } + + /* + * @return returns the current string selection for this object. + */ + public String getSelection() + { + if( selectionValue_ != null ) return selectionValue_; + + if( selectionIndex_ == -1 || selectionIndex_ > list_.length-1 ) + { + return ""; + } + else + { + return list_[ selectionIndex_ ]; + } + } +} diff --git a/core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/selection/SelectionListChoices.java b/core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/selection/SelectionListChoices.java new file mode 100644 index 000000000..3c210bd9e --- /dev/null +++ b/core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/selection/SelectionListChoices.java @@ -0,0 +1,121 @@ +/******************************************************************************* + * Copyright (c) 2004, 2005 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.wst.command.internal.env.core.selection; + +import java.util.Vector; + +/* + * This class can be used to store a hierarchy of SelectionList + * objects. + */ +public class SelectionListChoices +{ + private SelectionList selectionList_; + private Vector choices_; + private SelectionList newValueSelectionList_; + + /** + * + * @param list The selection list. + * @param choices This is a vector of SelectionListChoies and can be + * null if there are no choices. This index of list + * is used to index into choices. If index is -1 then + * the newValueSelectionList is used. + */ + public SelectionListChoices( SelectionList list, Vector choices ) + { + selectionList_ = list; + choices_ = choices; + + newValueSelectionList_ = new SelectionList( new String[0], -1 ); + } + + public SelectionListChoices( SelectionList list, Vector choices, SelectionList newList ) + { + this( list, choices ); + newValueSelectionList_ = newList; + } + + /** + * @return returns the current Selection list. + */ + public SelectionList getList() + { + return selectionList_; + } + + /** + * + * @return returns the choices for this object. + */ + public Vector getChoices() + { + return choices_; + } + + /** + * + * @param level the level in the hierarchy where we want to get the choices. + * @return returns a vector of SelectionListChoices. + */ + public Vector getChoicesAtLevel( int level ) + { + SelectionListChoices choices = this; + + for( int index = 0; index < level; index++ ) + { + choices = choices.getChoice(); + } + + return choices.getChoices(); + } + + /** + * + * @return returns the current SelectionListChoice + */ + public SelectionListChoices getChoice() + { + int selectionIndex = selectionList_.getIndex(); + SelectionListChoices result = null; + + if( selectionIndex == -1 ) + { + result = new SelectionListChoices( newValueSelectionList_, null ); + } + else if( choices_ != null && choices_.size() != 0 ) + { + result = (SelectionListChoices)choices_.elementAt( selectionIndex ); + } + + return result; + } + + /** + * + * @param index the index of the choice we want. + * @return returns the SelectionListChoice at the index specified. + */ + public SelectionListChoices getChoice(int index) + { + SelectionListChoices result = null; + if (index < 0 || index >= getList().getList().length) + { + result = new SelectionListChoices( newValueSelectionList_, null ); + } + else + { + result = (SelectionListChoices)choices_.elementAt( index ); + } + + return result; + } +} diff --git a/core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/uri/NativeFileCommand.java b/core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/uri/NativeFileCommand.java new file mode 100644 index 000000000..e8a550633 --- /dev/null +++ b/core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/uri/NativeFileCommand.java @@ -0,0 +1,117 @@ +/******************************************************************************* + * Copyright (c) 2004, 2005 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.wst.command.internal.env.core.uri; + +import java.io.File; +import java.util.LinkedList; +import java.util.List; +import org.eclipse.core.runtime.IAdaptable; +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.IStatus; +import org.eclipse.wst.common.environment.uri.IURI; +import org.eclipse.wst.common.environment.uri.URIException; +import org.eclipse.wst.common.frameworks.datamodel.AbstractDataModelOperation; + +public abstract class NativeFileCommand extends AbstractDataModelOperation +{ + protected String name; + + protected String description; + + protected IURI[] urisToRead; + + protected IURI[] urisToWrite; + + protected NativeFileCommand () + { + this(null,null); + } + + protected NativeFileCommand ( String name, String description ) + { + this.name = name; + this.description = description; + } + + public String getName () + { + return name; + } + + public String getDescription () + { + return description; + } + + public void setURIsToRead ( IURI[] urisToRead ) + { + this.urisToRead = urisToRead; + } + + public IURI[] getURIsToRead () + { + return urisToRead; + } + + public void setURIsToWrite ( IURI[] urisToWrite ) + { + this.urisToWrite = urisToWrite; + } + + public IURI[] getURIsToWrite () + { + return urisToWrite; + } + + public IStatus execute ( IProgressMonitor monitor, IAdaptable adaptable ) + { + File[] filesToRead = getFiles(urisToRead); + File[] filesToWrite = getFiles(urisToWrite); + preProcess(filesToRead,filesToWrite); + IStatus status = execute(filesToRead,filesToWrite); + postProcess(filesToRead,filesToWrite); + return status; + } + + public abstract IStatus execute ( File[] filesToRead, File[] filesToWrite ); + + private void preProcess ( File[] filesToRead, File[] filesToWrite ) + { + // TBD. + } + + private void postProcess ( File[] filesToRead, File[] filesToWrite ) + { + // TBD. + } + + private File[] getFiles ( IURI[] uris ) + { + List list = new LinkedList(); + if (uris != null) + { + for (int i=0; i<uris.length; i++) + { + if (uris[i].isAvailableAsFile()) + { + try + { + list.add(uris[i].asFile()); + } + catch (URIException e) + { + } + } + } + } + return (File[])list.toArray(new File[0]); + } +} |