package com.intellij.perlplugin.bo;
import com.intellij.perlplugin.ModulesContainer;
import java.io.File;
import java.util.ArrayList;
import java.util.HashSet;
/**
* Created by eli on 28-11-14.
*/
public class Package{
public static final String PACKAGE_SEPARATOR = "::";
private String originFile;
private String qualifiedName;
private int startPositionInFile;
private int endPositionInFile;
private Package parentPackage;
private HashSet<Package> childrenPackages = new HashSet<Package>();
private ArrayList<Sub> subs = new ArrayList<Sub>();
private ArrayList<ImportedPackage> importedPackages = new ArrayList<ImportedPackage>();
private ArrayList<ImportedSub> importedSubs = new ArrayList<ImportedSub>();
private String fileName;
public Package(String originFile, String qualifiedName) {
this.originFile = originFile;
this.qualifiedName = qualifiedName;
ModulesContainer.addPackage(this);
}
public Package(String qualifiedName) {
this.qualifiedName = qualifiedName;
}
public String getOriginFile() {
return originFile;
}
public void setOriginFile(String originFile) {
this.originFile = originFile;
}
public String getQualifiedName() {
return qualifiedName;
}
public void setQualifiedName(String packageName) {
this.qualifiedName = packageName;
}
private String[] segments() {
return qualifiedName.split(PACKAGE_SEPARATOR);
}
public String getSimpleName() {
String[] segments = segments();
return segments[segments.length - 1];
}
public Package getParentPackage() {
return parentPackage;
}
public void setParentPackage(Package parentPackage) {
this.parentPackage = parentPackage;
if(parentPackage != null) {
this.parentPackage.addChild(this);
}
}
public ArrayList<ImportedPackage> getImportedPackages() {
return importedPackages;
}
public void setImportedPackages(ArrayList<ImportedPackage> importedPackages) {
this.importedPackages = importedPackages;
}
public ArrayList<Sub> getSubs() {
return subs;
}
public void setSubs(ArrayList<Sub> subs) {
this.subs = subs;
}
public ArrayList<Sub> getAllSubs() {
ArrayList<Sub> result = new ArrayList<Sub>();
result.addAll(getSubs());
if (getParentPackage() != null) {
result.addAll(getParentPackage().getAllSubs());
}
return result;
}
public int getStartPositionInFile() {
return startPositionInFile;
}
public void setStartPositionInFile(int startPositionInFile) {
this.startPositionInFile = startPositionInFile;
}
public int getEndPositionInFile() {
return endPositionInFile;
}
public void setEndPositionInFile(int endPositionInFile) {
this.endPositionInFile = endPositionInFile;
}
public void addChild(Package childPackage) {
if (childPackage != null && !this.childrenPackages.contains(childPackage)) {
this.childrenPackages.add(childPackage);
childPackage.setParentPackage(this);
}
}
public void removeChild(Package childPackage) {
if (childPackage != null && !this.childrenPackages.contains(childPackage)) {
this.childrenPackages.remove(childPackage);
}
}
public HashSet<Package> getChildren() {
return childrenPackages;
}
@Override
public String toString() {
return "Package{" + "\n" +
" originFile='" + originFile + '\'' + ",\n" +
" startPositionInFile='" + startPositionInFile + '\'' + ",\n" +
" endPositionInFile='" + endPositionInFile + '\'' + ",\n" +
" qualifiedName='" + qualifiedName + '\'' + ",\n" +
" parentPackage='" + ((parentPackage != null) ? parentPackage.getQualifiedName() : "''") + '\'' + ",\n" +
" importedPackages=" + importedPackages + "\n" +
" subs=" + subs + "\n" +
'}';
}
public void setImportedSubs(ArrayList<ImportedSub> importedSubs) {
this.importedSubs = importedSubs;
}
public ArrayList<ImportedSub> getImportedSubs() {
return importedSubs;
}
public Sub getSubByName(String subName) {
if (subName.startsWith(":")) {
subName = subName.substring(1,subName.length());
}
ArrayList<Sub> allSubs = getAllSubs();
for (int i = 0; i < allSubs.size(); i++) {
if (allSubs.get(i).getName().equals(subName)) {
return allSubs.get(i);
}
}
return null;
}
/**
*
* @return only the file name and extensions without the full path
*/
public String getFileName() {
if(fileName == null){
String[] parts = getOriginFile().split("/");
fileName = parts[parts.length-1];
}
return fileName ;
}
/* is this file potentially a main implementation of this package?
for now we assume that main implementation resides in a file whose name is the same as package name.
otherwise it is probably mixin
*/
public boolean isPotentialMainImplementation() {
String packageName = getSimpleName();
return getFileName().toLowerCase().startsWith(packageName.toLowerCase() + ".");
}
}