/******************************************************************************* * Copyright (c) 2007 Red Hat, Inc. * Distributed under license by Red Hat, Inc. All rights reserved. * This program is 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: * Red Hat, Inc. - initial API and implementation ******************************************************************************/ package org.jboss.tools.common.el.core.resolver; import java.util.List; import org.eclipse.core.resources.IFile; import org.eclipse.jface.text.Region; import org.jboss.tools.common.el.core.model.ELExpression; import org.jboss.tools.common.el.core.model.ELInstance; import org.jboss.tools.common.el.core.model.ELModel; import org.jboss.tools.common.el.core.parser.ELParser; import org.jboss.tools.common.el.core.parser.ELParserFactory; /** * Represents "var"/"value" attributes. * @author Alexey Kazakov */ public class Var { IFile file; String name; String value; ELExpression elToken; String resolvedValue; ELExpression resolvedElToken; int declOffset; int declLength; ELParserFactory factory; Region region; /** * Constructor * @param name - value of "var" attribute. * @param value - value of "value" attribute. */ public Var(ELParserFactory factory, String name, String value, int declOffset, int declLength) { this.factory = factory; this.name = name; this.value = value; elToken = parseEl(value); this.declOffset = declOffset; this.declLength = declLength; } ELExpression parseEl(String el) { if(el.length()>3 && el.startsWith("#{") && el.endsWith("}")) { //$NON-NLS-1$ //$NON-NLS-2$ ELParser parser = factory.createParser(); ELModel model = parser.parse(el); if(model == null || model.getSyntaxErrors().size() > 0) return null; List<ELInstance> is = model.getInstances(); if(is.size() == 0) return null; return is.get(0).getExpression(); } return null; } /** * Sets value to new resolved EL which we got as result of parsing value. * For example: * <h:datatable value="#{list}" var="item"> * <h:dataTable value="#{item.anotherList}" var="innerItem"> * ... * </h:dataTable> * </h:dataTable> * Original El is #{item.anotherList} * Resolved El is #{list.iterator().next().anotherList} * It's very useful for nested vars. * @param newEl */ public void resolveValue(String newEl) { resolvedValue = newEl; resolvedElToken = parseEl(newEl); } /** * @return parsed EL from "value" attribute. Returns null if EL is not valid. */ public ELExpression getElToken() { return elToken; } /** * @return parsed resolved EL from "value" attribute. May be null. */ public ELExpression getResolvedElToken() { return resolvedElToken; } /** * @return name of variable. */ public String getName() { return name; } /** * @return value of variable. It's EL. */ public String getValue() { return value; } /** * @return resolved value of variable. It's EL. May be null. */ public String getResolvedValue() { return resolvedValue; } /** * @return offset of the var declaration */ public int getDeclarationOffset() { return declOffset; } /** * @return length of the var declaration */ public int getDeclarationLength() { return declLength; } @Override public boolean equals(Object obj) { if (obj instanceof Var) { Var compare = (Var)obj; String str = getName(); if (str != null) { if (!str.equals(compare.getName())) return false; } else { if (compare.getName() != null) return false; } str = getValue(); return (str != null ? str.equals(compare.getValue()) : compare.getValue() == null); } return false; } /** * @return the region */ public Region getRegion() { return region; } /** * @param region the region to set */ public void setRegion(Region region) { this.region = region; } public void setFile(IFile file) { this.file = file; } public IFile getFile() { return file; } }