/*******************************************************************************
* Copyright (c) 2007, 2008 Edgar Espina.
* 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
*
*******************************************************************************/
package org.deved.antlride.core.resources;
import java.io.File;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.deved.antlride.core.AntlrCore;
import org.deved.antlride.core.AntlrLanguageTargetName;
public class AntlrPackage implements Comparable<AntlrPackage> {
public static final String[] PROPERTIES = { "Version", "Description" };
private String version;
private String classpath;
private String description;
private long created;
private boolean selected;
private String home;
private Set<String> classpathSet;
private URLClassLoader classLoader;
private AntlrLanguageTarget[] targets = null;
AntlrPackage(String home, String description, String version,
String classpath, long created, boolean selected) {
this.home = home;
this.version = version;
this.description = description;
this.classpath = classpath;
this.created = created;
this.selected = selected;
}
AntlrPackage(String home, String description, String version,
String classpath) {
this(home, description, version, classpath, System.currentTimeMillis(),
false);
}
public ClassLoader getClassLoader() {
if (classLoader == null) {
Set<String> classpath = getClasspath();
URL[] urls = new URL[classpath.size()];
int i = 0;
for (String cpentry : classpath) {
File jarFile = new File(cpentry);
try {
urls[i++] = jarFile.toURI().toURL();
} catch (MalformedURLException e) {
AntlrCore.error(e);
}
}
classLoader = new URLClassLoader(urls);
}
return classLoader;
}
public AntlrLanguageTarget[] getLanguageTargets() {
if (targets == null) {
String[] allTargets = AntlrLanguageTargetName.names();
List<AntlrLanguageTarget> list = new ArrayList<AntlrLanguageTarget>(
allTargets.length);
ClassLoader classLoader = getClassLoader();
for (String target : allTargets) {
String templateName = new StringBuilder().append(
AntlrLanguageTargetRepository.STRING_TEMPLATE_PATH)
.append("/").append(target).append("/").append(target)
.append(".stg").toString();
if (classLoader.getResource(templateName) != null) {
list.add(AntlrLanguageTargetRepository.getLanguage(target));
}
}
targets = list.toArray(new AntlrLanguageTarget[list.size()]);
}
return targets;
}
public boolean isSelected() {
return selected;
}
public long getCreated() {
return created;
}
public String getDescription() {
return description;
}
public String getShortDescription() {
return "ANTLR " + getVersion();
}
public String getVersion() {
return version;
}
public String getClasspathAsString() {
return classpath;
}
public Set<String> getClasspath() {
if (classpathSet == null) {
classpathSet = new HashSet<String>(Arrays.asList(classpath
.split(File.pathSeparator)));
}
return classpathSet;
}
public void setSelected(boolean selected) {
this.selected = selected;
}
public void addExternalJARs(String jarPath) {
if (getClasspath().add(jarPath)) {
classpath = jarPath + File.pathSeparator + classpath;
}
}
@Override
public String toString() {
return description;
}
public int compareTo(AntlrPackage o) {
return (int) (created - o.created);
}
@Override
public boolean equals(Object obj) {
if (obj instanceof AntlrPackage) {
AntlrPackage that = (AntlrPackage) obj;
return version.equals(that.version);
}
return false;
}
@Override
public int hashCode() {
return version.hashCode();
}
public String getHome() {
return home;
}
}