001/*
002  GRANITE DATA SERVICES
003  Copyright (C) 2011 GRANITE DATA SERVICES S.A.S.
004
005  This file is part of Granite Data Services.
006
007  Granite Data Services is free software; you can redistribute it and/or modify
008  it under the terms of the GNU Library General Public License as published by
009  the Free Software Foundation; either version 2 of the License, or (at your
010  option) any later version.
011
012  Granite Data Services is distributed in the hope that it will be useful, but
013  WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
014  FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License
015  for more details.
016
017  You should have received a copy of the GNU Library General Public License
018  along with this library; if not, see <http://www.gnu.org/licenses/>.
019*/
020
021package org.granite.tide.invocation;
022
023import java.io.Serializable;
024
025import org.granite.tide.Expression;
026
027
028/**
029 * @author William DRAI
030 */
031public class ContextResult implements Serializable, Expression {
032
033    private static final long serialVersionUID = 1L;
034    
035    
036    private String componentName;
037    private String componentClassName;
038    private String expression;
039    
040    
041    public ContextResult() {
042    }
043    
044    public ContextResult(String componentName, String expression) {
045        this.componentName = componentName;
046        this.expression = expression;
047    }
048
049    public String getComponentName() {
050        return componentName;
051    }
052    public void setComponentName(String componentName) {
053        this.componentName = componentName;
054    }
055
056    public String getComponentClassName() {
057        return componentClassName;
058    }
059    public void setComponentClassName(String componentClassName) {
060        this.componentClassName = componentClassName;
061    }
062    
063    private Class<?> componentClass;
064    
065    public Class<?> getComponentClass() {
066        if (componentClassName == null)
067                return null;
068        
069        if (componentClass == null) {
070                try {
071                        componentClass = Thread.currentThread().getContextClassLoader().loadClass(componentClassName);
072                }
073                catch (Exception e) {
074                        throw new RuntimeException("Component class not found", e);
075                }
076        }
077        return componentClass;      
078    }
079        
080    public String getExpression() {
081        return expression;
082    }
083    public void setExpression(String expression) {
084        this.expression = expression;
085    }
086    
087    public Boolean getRestrict() {
088        return null;
089    }
090    
091    public String getPath() {
092        return componentName + (expression != null ? "." + expression : "");
093    }
094    
095    public boolean matches(String componentName, String componentClassName, String expr) {
096        if (this.componentClassName != null && componentClassName != null 
097            && (this.componentClassName + (this.expression != null ? "." + this.expression : "")).indexOf(componentClassName + (expr != null ? "." + expr : "")) == 0) {
098            return true;
099        }
100        return getPath().indexOf(componentName + (expr != null ? "." + expr : "")) == 0; 
101    }
102
103    
104    @Override
105    public String toString() {
106        return (componentName != null ? componentName : "") 
107                + (componentClassName != null ? "(" + componentClassName + ")" : "") 
108                + (expression != null ? "." + expression : "");
109    }
110
111    
112    @Override
113    public int hashCode() {
114        return (componentName + "(" + componentClassName + ")." + expression).hashCode();
115    }
116    
117    @Override
118    public boolean equals(Object object) {
119        if (object == null || !object.getClass().equals(getClass()))
120            return false;
121        
122        ContextResult result = (ContextResult)object;
123        if (result.getComponentName() == null && componentName == null 
124                        && (!((result.getComponentClassName() == null && componentClassName == null) || result.getComponentClassName().equals(componentClassName))))
125                return false;
126        
127        if (result.getComponentName() != null 
128                        && !result.getComponentName().equals(componentName))
129            return false;
130        
131        if (result.getComponentClassName() != null && componentClassName != null 
132                        && !result.getComponentClassName().equals(componentClassName))
133                return false;
134        
135        if (expression == null)
136            return result.getExpression() == null;
137        
138        return expression.equals(result.getExpression());
139    }
140}