blob: ff74124f0c89c6587dfb22228cacb38e4b386d34 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2010 BSI Business Systems Integration AG.
* 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
*
* Contributors:
* BSI Business Systems Integration AG - initial API and implementation
******************************************************************************/
package org.eclipse.scout.sdk.sourcebuilder.compilationunit;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.TreeMap;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.scout.commons.CompositeObject;
import org.eclipse.scout.commons.StringUtility;
import org.eclipse.scout.sdk.sourcebuilder.AbstractJavaElementSourceBuilder;
import org.eclipse.scout.sdk.sourcebuilder.type.ITypeSourceBuilder;
import org.eclipse.scout.sdk.util.signature.IImportValidator;
/**
* <h3>{@link CompilationUnitSourceBuilder}</h3> ...
*
* @author Andreas Hoegger
* @since 3.10.0 07.03.2013
*/
public class CompilationUnitSourceBuilder extends AbstractJavaElementSourceBuilder implements ICompilationUnitSourceBuilder {
private final String m_packageName;
private final List<ITypeSourceBuilder> m_typeSourceBuilders;
private final Map<CompositeObject, ITypeSourceBuilder> m_sortedTypeSourceBuilders;
/**
* @param elementName
*/
public CompilationUnitSourceBuilder(String elementName, String packageName) {
super(elementName);
m_packageName = packageName;
m_typeSourceBuilders = new ArrayList<ITypeSourceBuilder>();
m_sortedTypeSourceBuilders = new TreeMap<CompositeObject, ITypeSourceBuilder>();
}
@Override
public void validate() throws IllegalArgumentException {
super.validate();
// empty package name is default package
if (getPackageFragmentName() == null) {
throw new IllegalArgumentException("package name is null!");
}
}
@Override
public void createSource(StringBuilder source, String lineDelimiter, IJavaProject ownerProject, IImportValidator validator) throws CoreException {
// header
StringBuilder headerSourceBuilder = new StringBuilder();
super.createSource(headerSourceBuilder, lineDelimiter, ownerProject, validator);
// package declaration
if (!StringUtility.isNullOrEmpty(getPackageFragmentName())) {
headerSourceBuilder.append("package ").append(getPackageFragmentName()).append(";").append(lineDelimiter).append(lineDelimiter);
}
StringBuilder typeSourceBuilder = new StringBuilder();
// type sources
for (ITypeSourceBuilder typeBuilder : getTypeSourceBuilder()) {
if (typeBuilder != null) {
typeBuilder.createSource(typeSourceBuilder, lineDelimiter, ownerProject, validator);
}
}
// imports
String[] importsToCreate = validator.getImportsToCreate();
if (importsToCreate.length > 0) {
for (String imp : importsToCreate) {
headerSourceBuilder.append("import ").append(imp).append(";").append(lineDelimiter);
}
headerSourceBuilder.append(lineDelimiter);
}
source.append(headerSourceBuilder);
source.append(typeSourceBuilder);
}
@Override
public String getPackageFragmentName() {
return m_packageName;
}
@Override
public void addTypeSourceBuilder(ITypeSourceBuilder builder) {
if (builder == null) {
throw new IllegalArgumentException("Source builder can not be null.");
}
if (!m_sortedTypeSourceBuilders.isEmpty()) {
throw new IllegalStateException("This builder has already sorted inner type builders. A mix between sorted and unsorted inner type builders is not supported.");
}
m_typeSourceBuilders.add(builder);
builder.setParentFullyQualifiedName(getPackageFragmentName());
}
@Override
public void addSortedTypeSourceBuilder(CompositeObject sortKey, ITypeSourceBuilder builder) {
if (builder == null) {
throw new IllegalArgumentException("Source builder can not be null.");
}
if (!m_typeSourceBuilders.isEmpty()) {
throw new IllegalStateException("This builder has already unsorted inner type builders. A mix between sorted and unsorted inner type builders is not supported.");
}
m_sortedTypeSourceBuilders.put(sortKey, builder);
builder.setParentFullyQualifiedName(getPackageFragmentName());
}
@Override
public boolean removeTypeSourceBuilder(ITypeSourceBuilder builder) {
boolean removed = m_typeSourceBuilders.remove(builder);
if (!removed) {
Iterator<Entry<CompositeObject, ITypeSourceBuilder>> it = m_sortedTypeSourceBuilders.entrySet().iterator();
while (it.hasNext()) {
if (it.next().getValue().equals(builder)) {
it.remove();
return true;
}
}
return false;
}
return removed;
}
@Override
public List<ITypeSourceBuilder> getTypeSourceBuilder() {
List<ITypeSourceBuilder> builders = new ArrayList<ITypeSourceBuilder>();
builders.addAll(m_typeSourceBuilders);
builders.addAll(m_sortedTypeSourceBuilders.values());
return Collections.unmodifiableList(builders);
}
}