Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command')
-rw-r--r--core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/CommandFactory.java26
-rw-r--r--core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/CommandManager.java33
-rw-r--r--core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/EnvironmentCore.properties22
-rw-r--r--core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/EnvironmentCoreMessages.java31
-rw-r--r--core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/ICommandFactory.java30
-rw-r--r--core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/SimpleCommandFactory.java49
-rw-r--r--core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/common/Condition.java22
-rw-r--r--core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/common/Evaluate.java22
-rw-r--r--core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/common/MessageUtils.java88
-rw-r--r--core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/common/ProgressUtils.java22
-rw-r--r--core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/common/Range.java62
-rw-r--r--core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/common/RangeVector.java30
-rw-r--r--core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/common/StatusUtils.java58
-rw-r--r--core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/context/Context.java87
-rw-r--r--core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/context/ResourceContext.java74
-rw-r--r--core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/context/ResourceDefaults.java45
-rw-r--r--core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/context/TransientResourceContext.java82
-rw-r--r--core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/data/BeanModifier.java22
-rw-r--r--core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/data/ClassEntry.java77
-rw-r--r--core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/data/DataFlowManager.java293
-rw-r--r--core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/data/DataMappingRegistry.java47
-rw-r--r--core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/data/DataMappingRegistryImpl.java117
-rw-r--r--core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/data/RuleEntry.java32
-rw-r--r--core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/data/Transformer.java23
-rw-r--r--core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/fragment/AbstractCommandFragment.java102
-rw-r--r--core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/fragment/BooleanFragment.java154
-rw-r--r--core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/fragment/ChoiceFragment.java143
-rw-r--r--core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/fragment/CommandFactoryFragment.java160
-rw-r--r--core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/fragment/CommandFragment.java71
-rw-r--r--core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/fragment/CommandFragmentEngine.java472
-rw-r--r--core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/fragment/CommandFragmentFactory.java24
-rw-r--r--core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/fragment/CommandFragmentFactoryFactory.java22
-rw-r--r--core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/fragment/ExtensionFragment.java99
-rw-r--r--core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/fragment/FragmentListener.java25
-rw-r--r--core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/fragment/LoopCondition.java27
-rw-r--r--core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/fragment/LoopFragment.java135
-rw-r--r--core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/fragment/SequenceFragment.java133
-rw-r--r--core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/fragment/SimpleFragment.java81
-rw-r--r--core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/registry/CommandRegistry.java29
-rw-r--r--core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/selection/BooleanSelection.java45
-rw-r--r--core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/selection/ChoicesToString.java47
-rw-r--r--core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/selection/DynamicList.java92
-rw-r--r--core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/selection/SelectionList.java96
-rw-r--r--core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/selection/SelectionListChoices.java121
-rw-r--r--core/bundles/org.eclipse.wst.command.env.core/src/org/eclipse/wst/command/internal/env/core/uri/NativeFileCommand.java117
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]);
+ }
+}

Back to the top