| /******************************************************************************* |
| * Copyright (c) 2008, 2010 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 |
| * EclipseSource - ongoing development |
| *******************************************************************************/ |
| package org.eclipse.equinox.internal.p2.metadata; |
| |
| import org.eclipse.equinox.p2.metadata.MetadataFactory; |
| |
| import java.util.Map; |
| import java.util.Map.Entry; |
| import org.eclipse.equinox.p2.metadata.ITouchpointInstruction; |
| |
| /** |
| * A touchpoint instruction contains either a sequence of instruction statements |
| * to be executed during a particular engine phase, or some simple string value |
| * that is needed by a touchpoint to execute its phases. |
| * <p> |
| * The format of a touchpoint instruction statement sequence is as follows: |
| * |
| * statement-sequence : |
| * | statement ';' |
| * | statement-sequence statement |
| * ; |
| * |
| *Where a statement is of the format: |
| * |
| * statement : |
| * | actionName '(' parameters ')' |
| * ; |
| * |
| * parameters : |
| * | // empty |
| * | parameter |
| * | parameters ',' parameter |
| * ; |
| * |
| * parameter : |
| * | paramName ':' paramValue |
| * ; |
| * |
| * actionName, paramName, paramValue : |
| * | String |
| * ; |
| * |
| * @noextend This class is not intended to be subclassed by clients. |
| * @see MetadataFactory#createTouchpointInstruction(String, String) |
| */ |
| public class TouchpointInstruction implements ITouchpointInstruction { |
| |
| private final String body; |
| private final String importAttribute; |
| |
| /** |
| * Encodes an action statement in string form. This method will |
| * take care of escaping any illegal characters in function parameter values. |
| * |
| * @param actionName The name of the action. |
| * @param parameters The function's parameters. This is a Map<String,String> |
| * where the keys are parameter names, and the values are parameter values |
| * @return An encoded touchpoint instruction statement |
| */ |
| public static String encodeAction(String actionName, Map<String, String> parameters) { |
| StringBuffer result = new StringBuffer(actionName); |
| result.append('('); |
| boolean first = true; |
| for (Entry<String, String> entry : parameters.entrySet()) { |
| if (first) |
| first = false; |
| else |
| result.append(','); |
| result.append(entry.getKey()); |
| result.append(':'); |
| appendEncoded(result, entry.getValue()); |
| } |
| result.append(')').append(';'); |
| return result.toString(); |
| } |
| |
| /** |
| * Append the given value to the given buffer, encoding any illegal characters |
| * with appropriate escape sequences. |
| */ |
| private static void appendEncoded(StringBuffer buf, String value) { |
| char[] chars = value.toCharArray(); |
| for (int i = 0; i < chars.length; i++) { |
| switch (chars[i]) { |
| case '$' : |
| case ',' : |
| case ':' : |
| case ';' : |
| case '{' : |
| case '}' : |
| buf.append("${#").append(Integer.toString(chars[i])).append('}'); //$NON-NLS-1$ |
| break; |
| default : |
| buf.append(chars[i]); |
| } |
| } |
| } |
| |
| /** |
| * Clients must use the factory method on {@link MetadataFactory}. |
| */ |
| public TouchpointInstruction(String body, String importAttribute) { |
| this.body = body; |
| this.importAttribute = importAttribute; |
| } |
| |
| public boolean equals(Object obj) { |
| if (this == obj) |
| return true; |
| if (obj == null) |
| return false; |
| if (!(obj instanceof ITouchpointInstruction)) |
| return false; |
| ITouchpointInstruction other = (ITouchpointInstruction) obj; |
| if (body == null) { |
| if (other.getBody() != null) |
| return false; |
| } else if (!body.equals(other.getBody())) |
| return false; |
| if (importAttribute == null) { |
| if (other.getImportAttribute() != null) |
| return false; |
| } else if (!importAttribute.equals(other.getImportAttribute())) |
| return false; |
| return true; |
| } |
| |
| /** |
| * Returns the body of this touchpoint instruction. The body is either a sequence |
| * of instruction statements, or a simple string value. |
| * |
| * @return The body of this touchpoint instruction |
| */ |
| public String getBody() { |
| return body; |
| } |
| |
| //TODO What is this? Please doc |
| public String getImportAttribute() { |
| return importAttribute; |
| } |
| |
| public int hashCode() { |
| final int prime = 31; |
| int result = 1; |
| result = prime * result + ((body == null) ? 0 : body.hashCode()); |
| result = prime * result + ((importAttribute == null) ? 0 : importAttribute.hashCode()); |
| return result; |
| } |
| |
| /** |
| * Returns a string representation of this instruction for debugging purposes only. |
| */ |
| public String toString() { |
| return "Instruction[" + body + ',' + importAttribute + ']'; //$NON-NLS-1$ |
| } |
| } |