/**
* Copyright (c) 2002-2006 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 - Initial API and implementation
*/
package org.eclipse.emf.java.util;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.InternalEObject;
import org.eclipse.emf.ecore.resource.impl.ResourceImpl;
import org.eclipse.emf.java.JClass;
import org.eclipse.emf.java.JCompilationUnit;
import org.eclipse.emf.java.JPackage;
import org.eclipse.emf.java.JavaFactory;
/**
*/
public class JavaPackageResourceImpl extends ResourceImpl
{
public JavaPackageResourceImpl(URI uri)
{
super(uri);
// The no-name compilation unit
//
JCompilationUnit jCompilationUnit = JavaFactory.eINSTANCE.createJCompilationUnit();
jCompilationUnit.setName(".class");
getContents().add(jCompilationUnit);
}
@Override
protected void doLoad(InputStream inputStream, Map<?, ?> options) throws IOException
{
// Ignore
}
@Override
protected void doSave(OutputStream outputStream, Map<?, ?> options) throws IOException
{
throw new UnsupportedOperationException();
}
@Override
public EObject getEObject(String uriFragment)
{
return super.getEObject(uriFragment);
}
@Override
protected EObject getEObjectForURIFragmentRootSegment(String uriFragmentRootSegment)
{
for (Object object : getContents())
{
if (object instanceof JPackage)
{
JPackage jPackage = (JPackage)object;
if (uriFragmentRootSegment.equals(jPackage.getName()))
{
return jPackage;
}
}
}
return null;
}
@Override
protected EObject getEObject(List<String> uriFragmentPath)
{
Iterator<String> fragments = uriFragmentPath.iterator();
String packageName = !fragments.hasNext() ? "" : (String)fragments.next();
EObject eObject = getEObjectForURIFragmentRootSegment(packageName);
if (fragments.hasNext())
{
JPackage jPackage = (JPackage)eObject;
String typeName = fragments.next();
if (eObject == null || (eObject = ((InternalEObject)eObject).eObjectForURIFragmentSegment(typeName)) == null)
{
JClass jClass = demandLoad(packageName, typeName);
if (jClass != null)
{
if (jClass.getUnit() == null)
{
((JCompilationUnit)getContents().get(0)).getTypes().add(jClass);
}
if (jPackage == null)
{
jPackage = JavaFactory.eINSTANCE.createJPackage();
jPackage.setName(packageName);
getContents().add(jPackage);
}
jPackage.getTypes().add(jClass);
eObject = jClass;
}
}
while (fragments.hasNext() && eObject != null)
{
eObject = ((InternalEObject)eObject).eObjectForURIFragmentSegment(fragments.next());
}
}
else if (eObject == null)
{
JPackage jPackage = JavaFactory.eINSTANCE.createJPackage();
jPackage.setName(packageName);
getContents().add(jPackage);
eObject = jPackage;
}
return eObject;
}
protected JClass demandLoad(String packageName, String typeName)
{
int index = typeName.indexOf("[");
String className;
if (index == -1)
{
className = packageName.length() == 0 ? typeName : packageName + "." + typeName;
}
else
{
int dimensions = (typeName.length() - index) / 2;
typeName = typeName.substring(0, index);
if ("java.lang".equals(packageName))
{
if (typeName.equals("int"))
{
className = "I";
}
else if (typeName.equals("boolean"))
{
className = "B";
}
else if (typeName.equals("char"))
{
className = "C";
}
else if (typeName.equals("double"))
{
className = "D";
}
else if (typeName.equals("float"))
{
className = "F";
}
else if (typeName.equals("byte"))
{
className = "B";
}
else if (typeName.equals("short"))
{
className = "S";
}
else if (typeName.equals("long"))
{
className = "J";
}
else
{
className = "Ljava.lang." + typeName + ";";
}
}
else
{
className = "L" + (packageName.length() == 0 ? typeName + ";" : packageName + "." + typeName + ";");
}
while (--dimensions >= 0)
{
className = "[" + className;
}
}
try
{
Class<?> theClass = null;
if ("java.lang".equals(packageName) && index == -1)
{
if (typeName.equals("int"))
{
theClass = Integer.TYPE;
}
else if (typeName.equals("boolean"))
{
theClass = Boolean.TYPE;
}
else if (typeName.equals("char"))
{
theClass = Character.TYPE;
}
else if (typeName.equals("double"))
{
theClass = Double.TYPE;
}
else if (typeName.equals("float"))
{
theClass = Float.TYPE;
}
else if (typeName.equals("byte"))
{
theClass = Byte.TYPE;
}
else if (typeName.equals("short"))
{
theClass = Short.TYPE;
}
else if (typeName.equals("long"))
{
theClass = Long.TYPE;
}
else if (typeName.equals("void"))
{
theClass = Void.TYPE;
}
else
{
theClass = getClassLoader().loadClass(className);
}
}
else
{
theClass = getClassLoader().loadClass(className);
}
JClass jClass = JavaFactory.eINSTANCE.createJClass();
jClass.setJavaClass(theClass);
return jClass;
}
catch (ClassNotFoundException exception)
{
// Ignore
}
for (String sourceURI : getSourceURIs())
{
URI resolvedSourceURI =
URI.createURI
(sourceURI.toString() + (packageName.length() == 0 ? "" : packageName.replace('.','/') + '/') + typeName + ".java");
try
{
InputStream inputStream = resourceSet.getURIConverter().createInputStream(resolvedSourceURI);
inputStream.close();
JClass jClass = (JClass)resourceSet.getEObject(JavaUtil.createJClassProxyURI(resolvedSourceURI), true);
return jClass;
}
catch (IOException exception)
{
// Ignore
}
}
return null;
}
protected ClassLoader classLoader;
public ClassLoader getClassLoader()
{
if (classLoader == null)
{
try
{
classLoader =
new java.net.URLClassLoader
(new java.net.URL []
{
},
null);
}
catch (Exception exception)
{
exception.printStackTrace();
}
}
return classLoader;
}
public void setClassLoader(ClassLoader classLoader)
{
this.classLoader = classLoader;
}
protected List<String> sourceURIs = new ArrayList<String>();
public List<String> getSourceURIs()
{
return sourceURIs;
}
}