/*******************************************************************************
* Copyright (c) 2010-2012 Red Hat, Inc.
* Distributed under license by Red Hat, Inc. All rights reserved.
* This program is 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
*
* Contributor:
* Red Hat, Inc. - initial API and implementation
******************************************************************************/
package org.jboss.tools.hibernate.jpt.core.internal.context.java;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jpt.common.core.resource.java.NestableAnnotation;
import org.eclipse.jpt.common.utility.internal.iterable.IterableTools;
import org.eclipse.jpt.common.utility.internal.iterable.SubListIterableWrapper;
import org.eclipse.jpt.common.utility.iterable.ListIterable;
import org.eclipse.jpt.jpa.core.context.Generator;
import org.eclipse.jpt.jpa.core.context.java.JavaGeneratorContainer;
import org.eclipse.jpt.jpa.core.internal.jpa1.context.java.GenericJavaGeneratorContainer;
import org.jboss.tools.hibernate.jpt.core.internal.HibernateAbstractJpaFactory;
import org.jboss.tools.hibernate.jpt.core.internal.context.GenericGenerator;
import org.jboss.tools.hibernate.jpt.core.internal.resource.java.GenericGeneratorAnnotation;
/**
* @author Dmitry Geraskov
*
*/
public class HibernateJavaGeneratorContainerImpl extends
GenericJavaGeneratorContainer implements
HibernateGenericGeneratorContainer {
protected final ContextListContainer<JavaDbGenericGenerator, GenericGeneratorAnnotation> genericGeneratorContainer;
public HibernateJavaGeneratorContainerImpl(JavaGeneratorContainer.Parent parentAdapter) {
super(parentAdapter);
this.genericGeneratorContainer = this.buildGenericGeneratorContainer();
}
@Override
public HibernateAbstractJpaFactory getJpaFactory(){
return (HibernateAbstractJpaFactory)super.getJpaFactory();
}
// ********** synchronize/update **********
@Override
public void synchronizeWithResourceModel(IProgressMonitor monitor) {
this.syncGenericGenerators(monitor);
}
@Override
public void update(IProgressMonitor monitor) {
super.update(monitor);
this.updateModels(this.getGenericGenerators(), monitor);
}
@Override
protected Iterable<Generator> getGenerators_() {
return IterableTools.concatenate(
super.getGenerators_(),
this.getGenericGenerators()
);
}
// ******************* Generic Generators ****************
public ListIterable<JavaDbGenericGenerator> getGenericGenerators() {
return this.genericGeneratorContainer;
}
public int getGenericGeneratorsSize() {
return this.genericGeneratorContainer.size();
}
public JavaDbGenericGenerator addGenericGenerator() {
return this.addGenericGenerator(this.getGenericGeneratorsSize());
}
public JavaDbGenericGenerator addGenericGenerator(int index) {
GenericGeneratorAnnotation annotation = this.addGenericGeneratorAnnotation(index);
return this.genericGeneratorContainer.addContextElement(index, annotation);
}
protected GenericGeneratorAnnotation addGenericGeneratorAnnotation(int index) {
return (GenericGeneratorAnnotation) this.parent.getResourceAnnotatedElement().addAnnotation(index, GenericGeneratorAnnotation.ANNOTATION_NAME);
}
public void removeGenericGenerator(GenericGenerator genericGenerator) {
this.removeGenericGenerator(this.genericGeneratorContainer.indexOf((JavaDbGenericGenerator) genericGenerator));
}
public void removeGenericGenerator(int index) {
this.parent.getResourceAnnotatedElement().removeAnnotation(index, GenericGeneratorAnnotation.ANNOTATION_NAME);
this.genericGeneratorContainer.remove(index);
}
public void moveGenericGenerator(int targetIndex, int sourceIndex) {
this.parent.getResourceAnnotatedElement().moveAnnotation(targetIndex, sourceIndex, GenericGeneratorAnnotation.ANNOTATION_NAME);
this.genericGeneratorContainer.move(targetIndex, sourceIndex);
}
protected JavaDbGenericGenerator buildGenericGenerator(GenericGeneratorAnnotation genericGeneratorAnnotation) {
return this.getJpaFactory().buildJavaGenericGenerator(this, genericGeneratorAnnotation);
}
protected void syncGenericGenerators(IProgressMonitor monitor) {
this.genericGeneratorContainer.synchronizeWithResourceModel(monitor);
}
protected ListIterable<GenericGeneratorAnnotation> getGenericGeneratorAnnotations() {
return new SubListIterableWrapper<NestableAnnotation, GenericGeneratorAnnotation>(this.getNestableGenericGeneratorAnnotations_());
}
protected ListIterable<NestableAnnotation> getNestableGenericGeneratorAnnotations_() {
return this.parent.getResourceAnnotatedElement().getAnnotations(GenericGeneratorAnnotation.ANNOTATION_NAME);
}
protected ContextListContainer<JavaDbGenericGenerator, GenericGeneratorAnnotation> buildGenericGeneratorContainer() {
return this.buildSpecifiedContextListContainer(GENERIC_GENERATORS_LIST, new GenericGeneratorContainer());
}
/**
* generic generator container
*/
protected class GenericGeneratorContainer
extends AbstractContainerAdapter<JavaDbGenericGenerator, GenericGeneratorAnnotation>
{
@Override
public JavaDbGenericGenerator buildContextElement(GenericGeneratorAnnotation resourceElement) {
return HibernateJavaGeneratorContainerImpl.this.buildGenericGenerator(resourceElement);
}
@Override
public ListIterable<GenericGeneratorAnnotation> getResourceElements() {
return HibernateJavaGeneratorContainerImpl.this.getGenericGeneratorAnnotations();
}
@Override
public GenericGeneratorAnnotation extractResourceElement(JavaDbGenericGenerator contextElement) {
return contextElement.getGeneratorAnnotation();
}
}
}