/*
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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 org.apache.flex.compiler.internal.tree.as;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import org.apache.commons.io.FileUtils;
import org.apache.flex.compiler.common.IEmbedResolver;
import org.apache.flex.compiler.common.ISourceLocation;
import org.apache.flex.compiler.definitions.ITypeDefinition;
import org.apache.flex.compiler.definitions.metadata.IMetaTagAttribute;
import org.apache.flex.compiler.internal.embedding.EmbedAttribute;
import org.apache.flex.compiler.internal.embedding.EmbedData;
import org.apache.flex.compiler.internal.embedding.EmbedMIMEType;
import org.apache.flex.compiler.internal.projects.CompilerProject;
import org.apache.flex.compiler.internal.units.EmbedCompilationUnit;
import org.apache.flex.compiler.internal.units.EmbedCompilationUnitFactory;
import org.apache.flex.compiler.problems.EmbedUnableToReadSourceProblem;
import org.apache.flex.compiler.problems.ICompilerProblem;
import org.apache.flex.compiler.projects.ICompilerProject;
import org.apache.flex.compiler.tree.ASTNodeID;
import org.apache.flex.compiler.tree.as.IEmbedNode;
import org.apache.flex.compiler.tree.as.IFileNodeAccumulator;
import org.apache.flex.compiler.tree.metadata.IMetaTagNode;
import org.apache.flex.utils.FilenameNormalization;
/**
* AS parse tree node representing Embed meta data.
*/
public class EmbedNode extends ExpressionNodeBase implements IEmbedNode, IEmbedResolver
{
/**
* Constructor.
*
* @param containingFilePath The path to the file containing the Embed metadata.
* @param metaData The node representing the Embed metadata.
* @param fileNodeAccumulator An object that keeps track of all Embed metadata.
*/
public EmbedNode(String containingFilePath, IMetaTagNode metaData, IFileNodeAccumulator fileNodeAccumulator)
{
this.containingSourceFilename = FilenameNormalization.normalize(containingFilePath);
this.metaData = metaData;
assert metaData != null && metaData.getAllAttributes() != null; //can be empty array
if (fileNodeAccumulator != null)
fileNodeAccumulator.addEmbedNode(this);
}
private final String containingSourceFilename;
private final IMetaTagNode metaData;
//
// NodeBase overrides
//
@Override
public ASTNodeID getNodeID()
{
return ASTNodeID.EmbedID;
}
//
// ExpressionNodeBase overrides
//
@Override
public ITypeDefinition resolveType(ICompilerProject project)
{
// TODO: Should this be null, or type Class, or the
// base type of the embed class, or the embed class?
return null;
}
@Override
protected EmbedNode copy()
{
// This should never be used as a constant initializer,
return null;
}
//
// IEmbedNode implementations
//
@Override
public IMetaTagAttribute[] getAttributes()
{
return metaData.getAllAttributes();
}
//
// IEmbedResolver implementations
//
@Override
public EmbedCompilationUnit resolveCompilationUnit(ICompilerProject project,
Collection<ICompilerProblem> problems)
throws InterruptedException
{
assert (project instanceof CompilerProject);
return EmbedCompilationUnitFactory.getCompilationUnit(
(CompilerProject)project, containingSourceFilename,
metaData, metaData.getAllAttributes(), problems);
}
@Override
public EmbedCompilationUnit resolveCompilationUnit(ICompilerProject project)
throws InterruptedException
{
Collection<ICompilerProblem> ignoredProblems = new ArrayList<ICompilerProblem>();
return resolveCompilationUnit(project, ignoredProblems);
}
//
// Other methods
//
public String getName(ICompilerProject project, Collection<ICompilerProblem> problems)
throws InterruptedException
{
// if the embed is text/plain, return the actual text from the file.
// this assumes the variable being initialized is of type String.
EmbedData data = new EmbedData(containingSourceFilename, null);
boolean hadError = false;
for (IMetaTagAttribute attribute : getAttributes())
{
String key = attribute.getKey();
String value = attribute.getValue();
if (data.addAttribute((CompilerProject) project, this, key, value, problems))
{
hadError = true;
}
}
if (hadError)
return new String();
String source = (String) data.getAttribute(EmbedAttribute.SOURCE);
EmbedMIMEType mimeType = (EmbedMIMEType) data.getAttribute(EmbedAttribute.MIME_TYPE);
if (mimeType != null && mimeType.toString().equals(EmbedMIMEType.TEXT.toString()) && source != null)
{
File file = new File(FilenameNormalization.normalize(source));
try {
String string = FileUtils.readFileToString(file);
return string;
} catch (IOException e) {
problems.add(new EmbedUnableToReadSourceProblem(e, file.getPath()));
}
}
EmbedCompilationUnit cu = resolveCompilationUnit(project, problems);
// If there was an error resolving the compilation unit, just return an empty string.
if (cu == null)
return new String();
return cu.getName();
}
}