package org.jtheque.metrics.utils.elements;
/*
* Copyright JTheque (Baptiste Wicht)
*
* 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.
*/
import java.util.ArrayList;
import java.util.Collection;
/**
* A package.
*
* @author Baptiste Wicht
*/
public final class Package {
private final Collection<Class> classes = new ArrayList<Class>(25);
private final Collection<Package> packages = new ArrayList<Package>(15);
private Package parent;
private final String name;
/**
* Construct a new Package.
*
* @param packageName The name of the package.
*/
public Package(String packageName) {
super();
name = packageName;
parent = this;
}
/**
* Add a package.
*
* @param p The package.
*/
public void addPackage(Package p) {
packages.add(p);
p.parent = this;
}
/**
* Add class to the package.
*
* @param c The class to add.
*/
public void addClass(Class c) {
classes.add(c);
}
/**
* Return all the classes of the package.
*
* @return A List containing all the classes of the package.
*/
public Iterable<Class> getClasses() {
return classes;
}
/**
* Return all the sub-packages of the package.
*
* @return A List containing all the packages of this.
*/
public Iterable<Package> getPackages() {
return packages;
}
/**
* Return the name of the package.
*
* @return The name of the packages.
*/
public String getName() {
return name;
}
/**
* Return the parent package.
*
* @return The parent package.
*/
public Package getParent() {
return parent;
}
/**
* Return the number of classes.
*
* @return The number of classes.
*/
int getNumberOfClasses() {
return classes.size();
}
/**
* Return the total number of classes.
*
* @return The total number of classes.
*/
public int getTotalNumberOfClasses() {
int number = getNumberOfClasses();
for (Package p : packages) {
number += p.getTotalNumberOfClasses();
}
return number;
}
/**
* Return the total number of lines of code.
*
* @return The total number of lines of code.
*/
public int getTotalNumberLinesOfCode() {
int lines = 0;
for (Class c : classes) {
lines += c.getCodeLines();
}
for (Package p : packages) {
lines += p.getTotalNumberLinesOfCode();
}
return lines;
}
/**
* Return the total number of lines of comment.
*
* @return The total number of lines of comment.
*/
public int getTotalNumberLinesOfComment() {
int lines = 0;
for (Class c : classes) {
lines += c.getCommentLines();
}
for (Package p : packages) {
lines += p.getTotalNumberLinesOfComment();
}
return lines;
}
/**
* Return the total number of lines.
*
* @return The total number of lines.
*/
public int getTotalNumberLines() {
int lines = 0;
for (Class c : classes) {
lines += c.getPhysicalLines();
}
for (Package p : packages) {
lines += p.getTotalNumberLines();
}
return lines;
}
/**
* Return the average lines of code by class.
*
* @return The average lines of code by class.
*/
public double getAverageLinesOfCodeClass() {
return getTotalNumberLinesOfCode() / (double) getTotalNumberOfClasses();
}
/**
* Return the average lines of comment by class.
*
* @return The average lines of comment by class.
*/
public double getAverageLinesOfCommentClass() {
return getTotalNumberLinesOfComment() / (double) getTotalNumberOfClasses();
}
/**
* Return the average lines class.
*
* @return The average lines class.
*/
public double getAverageLinesClass() {
return getTotalNumberLines() / (double) getTotalNumberOfClasses();
}
/**
* Indicate if the package is empty or not.
*
* @return true if the package is empty else false.
*/
public boolean isEmpty() {
if (packages.isEmpty()) {
return classes.isEmpty();
}
if (!classes.isEmpty()) {
return false;
}
for (Package p : packages) {
if (!p.isEmpty()) {
return false;
}
}
return true;
}
@Override
public String toString() {
return "Package{" +
"classes=" + classes +
", packages=" + packages +
", parent=" + (parent == null ? "" : parent.name) +
", name='" + name + '\'' +
'}';
}
}