/*
* Copyright (c) 1998-2011 Caucho Technology -- all rights reserved
*
* This file is part of Resin(R) Open Source
*
* Each copy or derived work must preserve the copyright notice and this
* notice unmodified.
*
* Resin Open Source is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* Resin Open Source is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, or any warranty
* of NON-INFRINGEMENT. See the GNU General Public License for more
* details.
*
* You should have received a copy of the GNU General Public License
* along with Resin Open Source; if not, write to the
* Free SoftwareFoundation, Inc.
* 59 Temple Place, Suite 330
* Boston, MA 02111-1307 USA
*
* @author Scott Ferguson
*/
package com.caucho.es.parser;
import com.caucho.es.ESException;
import com.caucho.es.ESId;
import com.caucho.server.util.CauchoSystem;
import java.io.IOException;
import java.lang.reflect.Modifier;
/**
* Expression representing a Java package, i.e. a partial class.
*/
class PackageExpr extends Expr {
private Expr rawExpr;
private String name;
private PackageExpr(Block block, Expr rawExpr, String name)
{
super(block);
this.rawExpr = rawExpr;
this.name = name;
}
PackageExpr(Block block)
{
super(block);
this.rawExpr = block.newVar(ESId.intern("Packages"));
this.name = null;
}
static Expr create(Block block, Expr rawExpr, String name)
{
ClassLoader loader = block.getClassLoader();
try {
Class cl;
cl = CauchoSystem.loadClass(name, false, loader);
if (Modifier.isPublic(cl.getModifiers()))
return new JavaClassExpr(block, cl);
} catch (Throwable e) {
}
return new PackageExpr(block, rawExpr, name);
}
void setType(int type)
{
}
int getType()
{
return TYPE_ES;
}
Expr getTypeExpr()
{
return null;
}
Expr fieldReference(ESId id)
throws ESException
{
String newName = null;
if (name == null)
newName = id.toString();
else
newName = name + "." + id.toString();
return PackageExpr.create(block, rawExpr.fieldReference(id), newName);
}
Expr fieldReference(Expr expr)
{
return rawExpr.fieldReference(expr);
}
CallExpr startCall()
throws ESException
{
return rawExpr.startCall();
}
CallExpr startNew()
throws ESException
{
return rawExpr.startNew();
}
void printImpl() throws IOException
{
rawExpr.printImpl();
}
}