/*
* ASTASProject.java
*
* Copyright (c) 2006-2007 David Holroyd
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package uk.co.badgersinfoil.metaas.impl;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import uk.co.badgersinfoil.metaas.ActionScriptProject;
import uk.co.badgersinfoil.metaas.ActionScriptFactory;
import uk.co.badgersinfoil.metaas.dom.ASCompilationUnit;
// TODO: some checks that types are not created that clash with existing types,
// or at least filenames wont collide in the outputDir, would be good.
public class ASTActionScriptProject implements ActionScriptProject {
private List classpath = new ArrayList();
private Map resourceRoots = new HashMap();
private List compilationUnits = new ArrayList();
private String outputLocation;
private ActionScriptFactory fact;
public ASTActionScriptProject(ActionScriptFactory fact) {
this.fact = fact;
}
// TODO: interface for cp entries; not just strings. Add support for
// .swc classpath entries
public void addClasspathEntry(String classpathEntry) {
ResourceRoot root = resourceRootFor(classpathEntry);
resourceRoots.put(classpathEntry, root);
classpath.add(classpathEntry);
}
private ResourceRoot resourceRootFor(String classpathEntry) {
File path = new File(classpathEntry);
if (path.isDirectory()) {
return new SourceFolderResourceRoot(path);
}
if (classpathEntry.endsWith(".swc")) {
try {
return new SWCResourceRoot(classpathEntry);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
throw new IllegalArgumentException("Unknown resorce type: "+classpathEntry);
}
/**
* Returns a list of ResourceRoot implementations pertaining to the
* classpath entries that have been added to this project.
*/
public Collection getResourceRoots() {
return resourceRoots.values();
}
public void removeClasspathEntry(String classpathEntry) {
classpath.remove(classpathEntry);
resourceRoots.remove(classpathEntry);
}
public List getClasspathEntries() {
return Collections.unmodifiableList(classpath);
}
public void addCompilationUnit(ASCompilationUnit cu) {
compilationUnits.add(cu);
}
public void removeCompilationUnit(ASCompilationUnit cu) {
compilationUnits.remove(cu);
}
public ASCompilationUnit newClass(String qualifiedClassName) {
ASCompilationUnit cu = fact.newClass(qualifiedClassName);
addCompilationUnit(cu);
return cu;
}
public ASCompilationUnit newInterface(String qualifiedInterfaceName) {
ASCompilationUnit cu = fact.newInterface(qualifiedInterfaceName);
addCompilationUnit(cu);
return cu;
}
public List getCompilationUnits() {
return Collections.unmodifiableList(compilationUnits);
}
public String getOutputLocation() {
return outputLocation;
}
public void setOutputLocation(String outputLocation) {
this.outputLocation = outputLocation;
}
public void writeAll() throws IOException {
for (Iterator i=compilationUnits.iterator(); i.hasNext(); ) {
ASCompilationUnit cu = (ASCompilationUnit)i.next();
write(outputLocation, cu);
}
}
public void performAutoImport() {
AutoImporter autoImporter = new AutoImporter();
autoImporter.performAutoImport(this);
}
/**
* Writes the ActionScript code in the given CompilationUnit to the
* given directory, creating any subfolders for package hierarchy as
* appropriate, and deriving the filename from the name of the type
* defined by the compilation unit.
*/
private void write(String destinationDir, ASCompilationUnit cu) throws IOException {
String filename = filenameFor(cu);
File destFile = new File(destinationDir, filename);
destFile.getParentFile().mkdirs();
FileOutputStream os = new FileOutputStream(destFile);
OutputStreamWriter out = new OutputStreamWriter(os);
fact.newWriter().write(out, cu);
out.close();
}
private static String filenameFor(ASCompilationUnit unit) {
String name;
String pkg = unit.getPackageName();
if (pkg == null || pkg.equals("")) {
name = unit.getType().getName();
} else {
name = unit.getPackageName() + "." + unit.getType().getName();
}
return name.replace('.', File.separatorChar) + ".as";
}
}