[jbosstools-dev] Fwd: [jbosstools-commits] JBoss Tools SVN: r5415 - in trunk/core/plugins/org.jboss.ide.eclipse.archives.core: src/eclipse/org/jboss/ide/eclipse/archives/core and 5 other directories.
Max Rydahl Andersen
max.andersen at redhat.com
Thu Jan 10 05:53:36 EST 2008
Rob - the question about why StringSubstitution is cloned is still relevant.
Why are we cloning public API ?
-max
> Rob - why are we doing big feature changes in 2.0.1 code stream ?
>
> ...and why clone public API like StringSubstitution ?
>
> -max
>
> ------- Forwarded message -------
> From: jbosstools-commits at lists.jboss.org
> To: jbosstools-commits at lists.jboss.org
> Cc:
> Subject: [jbosstools-commits] JBoss Tools SVN: r5415 - in trunk/core/plugins/org.jboss.ide.eclipse.archives.core: src/eclipse/org/jboss/ide/eclipse/archives/core and 5 other directories.
> Date: Thu, 20 Dec 2007 21:21:48 +0100
>
> Author: rob.stryker at jboss.com
> Date: 2007-12-20 15:21:47 -0500 (Thu, 20 Dec 2007)
> New Revision: 5415
>
> Added:
> trunk/core/plugins/org.jboss.ide.eclipse.archives.core/src/main/org/jboss/ide/eclipse/archives/core/xpl/
> trunk/core/plugins/org.jboss.ide.eclipse.archives.core/src/main/org/jboss/ide/eclipse/archives/core/xpl/StringSubstitutionEngineClone.java
> Modified:
> trunk/core/plugins/org.jboss.ide.eclipse.archives.core/META-INF/MANIFEST.MF
> trunk/core/plugins/org.jboss.ide.eclipse.archives.core/src/eclipse/org/jboss/ide/eclipse/archives/core/ArchivesCorePlugin.java
> trunk/core/plugins/org.jboss.ide.eclipse.archives.core/src/eclipse/org/jboss/ide/eclipse/archives/core/model/other/internal/WorkspaceVariables.java
> trunk/core/plugins/org.jboss.ide.eclipse.archives.core/src/main/org/jboss/ide/eclipse/archives/core/ArchivesCore.java
> trunk/core/plugins/org.jboss.ide.eclipse.archives.core/src/main/org/jboss/ide/eclipse/archives/core/model/other/IRuntimeVariables.java
> trunk/core/plugins/org.jboss.ide.eclipse.archives.core/src/main/org/jboss/ide/eclipse/archives/core/model/other/internal/StandaloneVariables.java
> Log:
> JBIDE-1406 prelim preparation
>
> Modified: trunk/core/plugins/org.jboss.ide.eclipse.archives.core/META-INF/MANIFEST.MF
> ===================================================================
> --- trunk/core/plugins/org.jboss.ide.eclipse.archives.core/META-INF/MANIFEST.MF 2007-12-20 19:20:25 UTC (rev 5414)
> +++ trunk/core/plugins/org.jboss.ide.eclipse.archives.core/META-INF/MANIFEST.MF 2007-12-20 20:21:47 UTC (rev 5415)
> @@ -11,7 +11,8 @@
> org.eclipse.core.commands,
> org.apache.ant,
> org.eclipse.core.resources,
> - org.eclipse.jdt.core
> + org.eclipse.jdt.core,
> + org.eclipse.core.variables
> Eclipse-LazyStart: true
> Bundle-ClassPath: lib/concurrent.jar,
> lib/truezip-6.jar,
>
> Modified: trunk/core/plugins/org.jboss.ide.eclipse.archives.core/src/eclipse/org/jboss/ide/eclipse/archives/core/ArchivesCorePlugin.java
> ===================================================================
> --- trunk/core/plugins/org.jboss.ide.eclipse.archives.core/src/eclipse/org/jboss/ide/eclipse/archives/core/ArchivesCorePlugin.java 2007-12-20 19:20:25 UTC (rev 5414)
> +++ trunk/core/plugins/org.jboss.ide.eclipse.archives.core/src/eclipse/org/jboss/ide/eclipse/archives/core/ArchivesCorePlugin.java 2007-12-20 20:21:47 UTC (rev 5415)
> @@ -34,7 +34,7 @@
> public class ArchivesCorePlugin extends Plugin {
>
> // The plug-in ID
> - public static final String PLUGIN_ID = "org.jboss.ide.eclipse.archives.core";
> + public static final String PLUGIN_ID = ArchivesCore.PLUGIN_ID;
>
> // The shared instance
> private static ArchivesCorePlugin plugin;
>
> Modified: trunk/core/plugins/org.jboss.ide.eclipse.archives.core/src/eclipse/org/jboss/ide/eclipse/archives/core/model/other/internal/WorkspaceVariables.java
> ===================================================================
> --- trunk/core/plugins/org.jboss.ide.eclipse.archives.core/src/eclipse/org/jboss/ide/eclipse/archives/core/model/other/internal/WorkspaceVariables.java 2007-12-20 19:20:25 UTC (rev 5414)
> +++ trunk/core/plugins/org.jboss.ide.eclipse.archives.core/src/eclipse/org/jboss/ide/eclipse/archives/core/model/other/internal/WorkspaceVariables.java 2007-12-20 20:21:47 UTC (rev 5415)
> @@ -4,8 +4,10 @@
>
> import org.eclipse.core.resources.IProject;
> import org.eclipse.core.resources.ResourcesPlugin;
> +import org.eclipse.core.runtime.CoreException;
> import org.eclipse.core.runtime.IPath;
> import org.eclipse.core.runtime.Platform;
> +import org.eclipse.core.variables.VariablesPlugin;
> import org.jboss.ide.eclipse.archives.core.ArchivesCorePlugin;
> import org.jboss.ide.eclipse.archives.core.model.other.IRuntimeVariables;
>
> @@ -37,4 +39,17 @@
> return ArchivesCorePlugin.getDefault().isDebugging()
> && "true".equalsIgnoreCase(Platform.getDebugOption(option));
> }
> +
> + public String getProjectName(IPath path) {
> + IProject[] projects = ResourcesPlugin.getWorkspace().getRoot().getProjects();
> + for( int i = 0; i < projects.length; i++ )
> + if( projects[i].getLocation().equals(path))
> + return projects[i].getName();
> + return null;
> + }
> +
> + public String performStringSubstitution(String expression,
> + boolean reportUndefinedVariables) throws CoreException {
> + return VariablesPlugin.getDefault().getStringVariableManager().performStringSubstitution(expression, reportUndefinedVariables);
> + }
> }
>
> Modified: trunk/core/plugins/org.jboss.ide.eclipse.archives.core/src/main/org/jboss/ide/eclipse/archives/core/ArchivesCore.java
> ===================================================================
> --- trunk/core/plugins/org.jboss.ide.eclipse.archives.core/src/main/org/jboss/ide/eclipse/archives/core/ArchivesCore.java 2007-12-20 19:20:25 UTC (rev 5414)
> +++ trunk/core/plugins/org.jboss.ide.eclipse.archives.core/src/main/org/jboss/ide/eclipse/archives/core/ArchivesCore.java 2007-12-20 20:21:47 UTC (rev 5415)
> @@ -7,6 +7,7 @@
>
> public abstract class ArchivesCore {
>
> + public static final String PLUGIN_ID = "org.jboss.ide.eclipse.archives.core";
> private static ArchivesCore instance;
> // Due to classloader restrictions we won't be able to lazy load, but that should be ok as long
> // as we keep the construction of ArchivesCore subclasses to a minimum
>
> Modified: trunk/core/plugins/org.jboss.ide.eclipse.archives.core/src/main/org/jboss/ide/eclipse/archives/core/model/other/IRuntimeVariables.java
> ===================================================================
> --- trunk/core/plugins/org.jboss.ide.eclipse.archives.core/src/main/org/jboss/ide/eclipse/archives/core/model/other/IRuntimeVariables.java 2007-12-20 19:20:25 UTC (rev 5414)
> +++ trunk/core/plugins/org.jboss.ide.eclipse.archives.core/src/main/org/jboss/ide/eclipse/archives/core/model/other/IRuntimeVariables.java 2007-12-20 20:21:47 UTC (rev 5415)
> @@ -2,6 +2,7 @@
>
> import java.net.URL;
>
> +import org.eclipse.core.runtime.CoreException;
> import org.eclipse.core.runtime.IPath;
>
> public interface IRuntimeVariables {
> @@ -13,8 +14,11 @@
> */
> public boolean isDebugging(String option);
> public IPath getProjectPath(String projectName);
> -
> -// public IPath getWorkspacePath();
> + public String getProjectName(IPath path);
> public URL getBindingSchema();
> public URL getBindingLog4j();
> +
> + // allow for variable replacement
> + public String performStringSubstitution(String expression, boolean reportUndefinedVariables) throws CoreException;
> +
> }
>
> Modified: trunk/core/plugins/org.jboss.ide.eclipse.archives.core/src/main/org/jboss/ide/eclipse/archives/core/model/other/internal/StandaloneVariables.java
> ===================================================================
> --- trunk/core/plugins/org.jboss.ide.eclipse.archives.core/src/main/org/jboss/ide/eclipse/archives/core/model/other/internal/StandaloneVariables.java 2007-12-20 19:20:25 UTC (rev 5414)
> +++ trunk/core/plugins/org.jboss.ide.eclipse.archives.core/src/main/org/jboss/ide/eclipse/archives/core/model/other/internal/StandaloneVariables.java 2007-12-20 20:21:47 UTC (rev 5415)
> @@ -1,10 +1,14 @@
> package org.jboss.ide.eclipse.archives.core.model.other.internal;
>
> import java.net.URL;
> +import java.util.Iterator;
> +import java.util.Properties;
>
> +import org.eclipse.core.runtime.CoreException;
> import org.eclipse.core.runtime.IPath;
> import org.eclipse.core.runtime.Path;
> import org.jboss.ide.eclipse.archives.core.model.other.IRuntimeVariables;
> +import org.jboss.ide.eclipse.archives.core.xpl.StringSubstitutionEngineClone;
>
> public class StandaloneVariables implements IRuntimeVariables {
>
> @@ -27,8 +31,27 @@
> }
>
> public boolean isDebugging(String option) {
> - // TODO Auto-generated method stub
> - return false;
> + return System.getProperty("archives.debug", "true")
> + .equals("true");
> }
>
> + public String getProjectName(IPath path) {
> + Properties props = System.getProperties();
> + Object key, val;
> + for( Iterator i = props.keySet().iterator(); i.hasNext(); ) {
> + key = i.next();
> + if( key instanceof String && ((String)key).endsWith(".dir")) {
> + val = props.get(key);
> + if( path.toOSString().equals(new Path((String)val).toOSString()))
> + return (String)key;
> + }
> + }
> + return null;
> + }
> +
> + public String performStringSubstitution(String expression,
> + boolean reportUndefinedVariables) throws CoreException {
> + return new StringSubstitutionEngineClone().performStringSubstitution(expression, reportUndefinedVariables);
> + }
> +
> }
>
> Added: trunk/core/plugins/org.jboss.ide.eclipse.archives.core/src/main/org/jboss/ide/eclipse/archives/core/xpl/StringSubstitutionEngineClone.java
> ===================================================================
> --- trunk/core/plugins/org.jboss.ide.eclipse.archives.core/src/main/org/jboss/ide/eclipse/archives/core/xpl/StringSubstitutionEngineClone.java (rev 0)
> +++ trunk/core/plugins/org.jboss.ide.eclipse.archives.core/src/main/org/jboss/ide/eclipse/archives/core/xpl/StringSubstitutionEngineClone.java 2007-12-20 20:21:47 UTC (rev 5415)
> @@ -0,0 +1,289 @@
> +/*******************************************************************************
> + * Copyright (c) 2000, 2006 IBM Corporation and others.
> + * All rights reserved. This program and the accompanying materials
> + * are made available under the terms of the Eclipse Public License v1.0
> + * which accompanies this distribution, and is available at
> + * http://www.eclipse.org/legal/epl-v10.html
> + *
> + * Contributors:
> + * IBM Corporation - initial API and implementation
> + *******************************************************************************/
> +package org.jboss.ide.eclipse.archives.core.xpl;
> +
> +import java.util.ArrayList;
> +import java.util.HashSet;
> +import java.util.Iterator;
> +import java.util.List;
> +import java.util.Stack;
> +import org.eclipse.core.runtime.CoreException;
> +import org.eclipse.core.runtime.IStatus;
> +import org.eclipse.core.runtime.Status;
> +import org.jboss.ide.eclipse.archives.core.ArchivesCore;
> +
> +/**
> + * Performs string substitution for context and value variables.
> + */
> +public class StringSubstitutionEngineClone {
> +
> + // delimiters
> + private static final String VARIABLE_START = "${"; //$NON-NLS-1$
> + private static final char VARIABLE_END = '}';
> + private static final char VARIABLE_ARG = ':';
> + // parsing states
> + private static final int SCAN_FOR_START = 0;
> + private static final int SCAN_FOR_END = 1;
> +
> + /**
> + * Resulting string
> + */
> + private StringBuffer fResult;
> +
> + /**
> + * Whether substitutions were performed
> + */
> + private boolean fSubs;
> +
> + /**
> + * Stack of variables to resolve
> + */
> + private Stack fStack;
> +
> + class VariableReference {
> +
> + // the text inside the variable reference
> + private StringBuffer fText;
> +
> + public VariableReference() {
> + fText = new StringBuffer();
> + }
> +
> + public void append(String text) {
> + fText.append(text);
> + }
> +
> + public String getText() {
> + return fText.toString();
> + }
> +
> + }
> +
> + /**
> + * Performs recursive string substitution and returns the resulting string.
> + *
> + * @param expression expression to resolve
> + * @param reportUndefinedVariables whether to report undefined variables as an error
> + * @return the resulting string with all variables recursively
> + * substituted
> + * @exception CoreException if unable to resolve a referenced variable or if a cycle exists
> + * in referenced variables
> + */
> + public String performStringSubstitution(String expression, boolean reportUndefinedVariables ) throws CoreException {
> + substitute(expression, reportUndefinedVariables );
> + List resolvedVariableSets = new ArrayList();
> + while (fSubs) {
> + HashSet resolved = substitute(fResult.toString(), reportUndefinedVariables );
> +
> + for(int i=resolvedVariableSets.size()-1; i>=0; i--) {
> +
> + HashSet prevSet = (HashSet)resolvedVariableSets.get(i);
> +
> + if (prevSet.equals(resolved)) {
> + HashSet conflictingSet = new HashSet();
> + for (; i<resolvedVariableSets.size(); i++)
> + conflictingSet.addAll((HashSet)resolvedVariableSets.get(i));
> +
> + StringBuffer problemVariableList = new StringBuffer();
> + for (Iterator it=conflictingSet.iterator(); it.hasNext(); ) {
> + problemVariableList.append(it.next().toString());
> + problemVariableList.append(", "); //$NON-NLS-1$
> + }
> + problemVariableList.setLength(problemVariableList.length()-2); //truncate the last ", "
> + Status status = new Status(IStatus.ERROR,
> + ArchivesCore.PLUGIN_ID,
> + "Cycle found in variable replacement",
> + null);
> + throw new CoreException(status);
> + }
> + }
> +
> + resolvedVariableSets.add(resolved);
> + }
> + return fResult.toString();
> + }
> +
> + /**
> + * Performs recursive string validation to ensure that all of the variables
> + * contained in the expression exist
> + * @param expression expression to validate
> + * @param manager registry of variables
> + * @exception CoreException if a referenced variable does not exist or if a cycle exists
> + * in referenced variables
> + */
> + public void validateStringVariables(String expression ) throws CoreException {
> + performStringSubstitution(expression, true );
> + }
> +
> + /**
> + * Makes a substitution pass of the given expression returns a Set of the variables that were resolved in this
> + * pass
> + *
> + * @param expression source expression
> + * @param reportUndefinedVariables whether to report undefined variables as an error
> + * @param resolveVariables whether to resolve the value of any variables
> + * @exception CoreException if unable to resolve a variable
> + */
> + private HashSet substitute(String expression, boolean reportUndefinedVariables) throws CoreException {
> + fResult = new StringBuffer(expression.length());
> + fStack = new Stack();
> + fSubs = false;
> +
> + HashSet resolvedVariables = new HashSet();
> +
> + int pos = 0;
> + int state = SCAN_FOR_START;
> + while (pos < expression.length()) {
> + switch (state) {
> + case SCAN_FOR_START:
> + int start = expression.indexOf(VARIABLE_START, pos);
> + if (start >= 0) {
> + int length = start - pos;
> + // copy non-variable text to the result
> + if (length > 0) {
> + fResult.append(expression.substring(pos, start));
> + }
> + pos = start + 2;
> + state = SCAN_FOR_END;
> +
> + fStack.push(new VariableReference());
> + } else {
> + // done - no more variables
> + fResult.append(expression.substring(pos));
> + pos = expression.length();
> + }
> + break;
> + case SCAN_FOR_END:
> + // be careful of nested variables
> + start = expression.indexOf(VARIABLE_START, pos);
> + int end = expression.indexOf(VARIABLE_END, pos);
> + if (end < 0) {
> + // variables are not completed
> + VariableReference tos = (VariableReference)fStack.peek();
> + tos.append(expression.substring(pos));
> + pos = expression.length();
> + } else {
> + if (start >= 0 && start < end) {
> + // start of a nested variable
> + int length = start - pos;
> + if (length > 0) {
> + VariableReference tos = (VariableReference)fStack.peek();
> + tos.append(expression.substring(pos, start));
> + }
> + pos = start + 2;
> + fStack.push(new VariableReference());
> + } else {
> + // end of variable reference
> + VariableReference tos = (VariableReference)fStack.pop();
> + String substring = expression.substring(pos, end);
> + tos.append(substring);
> + resolvedVariables.add(substring);
> +
> + pos = end + 1;
> + String value= resolve(tos, reportUndefinedVariables);
> + if (value == null) {
> + value = ""; //$NON-NLS-1$
> + }
> + if (fStack.isEmpty()) {
> + // append to result
> + fResult.append(value);
> + state = SCAN_FOR_START;
> + } else {
> + // append to previous variable
> + tos = (VariableReference)fStack.peek();
> + tos.append(value);
> + }
> + }
> + }
> + break;
> + }
> + }
> + // process incomplete variable references
> + while (!fStack.isEmpty()) {
> + VariableReference tos = (VariableReference)fStack.pop();
> + if (fStack.isEmpty()) {
> + fResult.append(VARIABLE_START);
> + fResult.append(tos.getText());
> + } else {
> + VariableReference var = (VariableReference)fStack.peek();
> + var.append(VARIABLE_START);
> + var.append(tos.getText());
> + }
> + }
> +
> +
> + return resolvedVariables;
> + }
> +
> + /**
> + * Resolve and return the value of the given variable reference,
> + * possibly <code>null</code>.
> + *
> + * @param var
> + * @param reportUndefinedVariables whether to report undefined variables as
> + * an error
> + * @return variable value, possibly <code>null</code>
> + * @exception CoreException if unable to resolve a value
> + */
> + private String resolve(VariableReference var, boolean reportUndefinedVariables) throws CoreException {
> +// String text = var.getText();
> +// int pos = text.indexOf(VARIABLE_ARG);
> +// String name = null;
> +// String arg = null;
> +// if (pos > 0) {
> +// name = text.substring(0, pos);
> +// pos++;
> +// if (pos < text.length()) {
> +// arg = text.substring(pos);
> +// }
> +// } else {
> +// name = text;
> +// }
> +// IValueVariable valueVariable = manager.getValueVariable(name);
> +// if (valueVariable == null) {
> +// IDynamicVariable dynamicVariable = manager.getDynamicVariable(name);
> +// if (dynamicVariable == null) {
> +// // no variables with the given name
> +// if (reportUndefinedVariables) {
> +// throw new CoreException(new Status(IStatus.ERROR, VariablesPlugin.getUniqueIdentifier(), VariablesPlugin.INTERNAL_ERROR, NLS.bind(VariablesMessages.StringSubstitutionEngine_3, new String[]{name}), null));
> +// }
> +// // leave as is
> +// return getOriginalVarText(var);
> +// }
> +//
> +// if (resolveVariables) {
> +// fSubs = true;
> +// return dynamicVariable.getValue(arg);
> +// }
> +// //leave as is
> +// return getOriginalVarText(var);
> +// }
> +//
> +// if (arg == null) {
> +// if (resolveVariables) {
> +// fSubs = true;
> +// return valueVariable.getValue();
> +// }
> +// //leave as is
> +// return getOriginalVarText(var);
> +// }
> +// // error - an argument specified for a value variable
> +// throw new CoreException(new Status(IStatus.ERROR, VariablesPlugin.getUniqueIdentifier(), VariablesPlugin.INTERNAL_ERROR, NLS.bind(VariablesMessages.StringSubstitutionEngine_4, new String[]{valueVariable.getName()}), null));
> + return "";
> + }
> +
> + private String getOriginalVarText(VariableReference var) {
> + StringBuffer res = new StringBuffer(var.getText());
> + res.insert(0, VARIABLE_START);
> + res.append(VARIABLE_END);
> + return res.toString();
> + }
> +}
>
> _______________________________________________
> jbosstools-commits mailing list
> jbosstools-commits at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/jbosstools-commits
>
>
>
--
Using Opera's revolutionary e-mail client: http://www.opera.com/mail/
More information about the jbosstools-dev
mailing list