blob: 5161e465029b650681fda90fdd94cb1e538326da [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2006 Oracle Corporation.
* 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:
* Cameron Bateman/Oracle - initial API and implementation
*
********************************************************************************/
package org.eclipse.jst.jsf.validation.internal.el.operators;
import org.eclipse.emf.common.util.Diagnostic;
import org.eclipse.jst.jsf.common.internal.types.ValueType;
import org.eclipse.jst.jsf.validation.internal.el.diagnostics.DiagnosticFactory;
import org.eclipse.jst.jsp.core.internal.java.jspel.JSPELParserConstants;
import org.eclipse.jst.jsp.core.internal.java.jspel.Token;
/**
* Encapsulates an EL unary operator
* @author cbateman
*
*/
public abstract class UnaryOperator
{
/**
* The common factory used to construct diagnostics
*/
protected final DiagnosticFactory _diagnosticFactory;
/**
* @param token
* @return true if the token is a unary operator
*/
public static boolean isUnaryOperator(Token token)
{
return (token.kind == JSPELParserConstants.MINUS)
|| (token.kind == JSPELParserConstants.NOT1)
|| (token.kind == JSPELParserConstants.NOT2)
|| (token.kind == JSPELParserConstants.EMPTY);
}
/**
* @param token
* @param diagnosticFactory
* @return a new UnaryOperator instance matching token
*/
public static UnaryOperator createUnaryOperator(Token token, DiagnosticFactory diagnosticFactory)
{
if (!isUnaryOperator(token))
{
throw new IllegalArgumentException("token must be a unary operator"); //$NON-NLS-1$
}
switch(token.kind)
{
case JSPELParserConstants.MINUS:
return new MinusUnaryOperator(diagnosticFactory);
case JSPELParserConstants.NOT1:
case JSPELParserConstants.NOT2:
return new NotUnaryOperator(diagnosticFactory);
case JSPELParserConstants.EMPTY:
return new EmptyUnaryOperator(diagnosticFactory);
}
// should never get here because all four ops are covered
throw new AssertionError();
}
/**
* Constructor
*/
UnaryOperator(DiagnosticFactory diagnosticFactory)
{
/* no construction or sub-classing outside package*/
_diagnosticFactory = diagnosticFactory;
}
/**
* If ValueType is a literal and the operation can be performed, then
* the return must be a new LiteralType transformed using this operator.
*
* If ValueType is not a literal and the operaton can be performed, then
* the return is a new ValueType transformed per the rules of the operator
* (i.e. if it is a string type and the operator is "!", then the string
* must be coerced to a boolean and this is what will be returned)
*
* If the operation cannot be performed on ValueType, return null
*
* @param type
* @return a new value type after the operation is performed
*/
public abstract ValueType performOperation(ValueType type);
/**
* @param type
* @return a Diagnostic interpreting whether it is valid to perform the
* operation on this type
*/
public abstract Diagnostic validate(ValueType type);
}