/*******************************************************************************
* Copyright (c) 2011 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
*
* Contributors:
* Red Hat, Inc. - initial API and implementation
******************************************************************************/
package org.jboss.tools.cdi.seam.config.core;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.eclipse.core.runtime.IPath;
import org.eclipse.jdt.core.IType;
import org.jboss.tools.cdi.core.extension.AbstractDefinitionContextExtension;
import org.jboss.tools.cdi.internal.core.impl.definition.AnnotationDefinition;
import org.jboss.tools.cdi.internal.core.impl.definition.DefinitionContext;
import org.jboss.tools.cdi.internal.core.impl.definition.TypeDefinition;
import org.jboss.tools.cdi.seam.config.core.definition.SeamBeansDefinition;
/**
*
* @author Viacheslav Kabanovich
*
*/
public class ConfigDefinitionContext extends AbstractDefinitionContextExtension {
private Map<IPath, SeamBeansDefinition> beanXMLs = new HashMap<IPath, SeamBeansDefinition>();
private Map<IPath, SeamBeansDefinition> seambeanXMLs = new HashMap<IPath, SeamBeansDefinition>();
private Map<String, AnnotationDefinition> annotations = new HashMap<String, AnnotationDefinition>();
/**
* Temporal map used by working copy, to detect bean xml files
* that should be rebuilt when new Java type is created.
*/
private Map<String, IPath> possibleTypes = new HashMap<String, IPath>();
public ConfigDefinitionContext getWorkingCopy() {
return (ConfigDefinitionContext)super.getWorkingCopy();
}
protected ConfigDefinitionContext copy(boolean clean) {
ConfigDefinitionContext copy = new ConfigDefinitionContext();
copy.root = root;
if(!clean) {
copy.beanXMLs.putAll(beanXMLs);
copy.seambeanXMLs.putAll(seambeanXMLs);
copy.annotations.putAll(annotations);
copy.initPossibleTypes();
//TODO
}
return copy;
}
protected void doApplyWorkingCopy() {
ConfigDefinitionContext copy = (ConfigDefinitionContext)workingCopy;
beanXMLs = copy.beanXMLs;
seambeanXMLs = copy.seambeanXMLs;
String[] as = annotations.keySet().toArray(new String[0]);
for (String s: as) {
if(!copy.annotations.containsKey(s)) {
//Remove from root and reload it in root.
AnnotationDefinition d = annotations.get(s);
IType type = d.getType();
root.clean(type.getFullyQualifiedName());
root.getAnnotationKind(type);
}
}
annotations = copy.annotations;
}
public void clean() {
synchronized (beanXMLs) {
beanXMLs.clear();
}
synchronized (seambeanXMLs) {
seambeanXMLs.clear();
}
synchronized (annotations) {
annotations.clear();
}
}
public void clean(IPath path) {
synchronized (beanXMLs) {
SeamBeansDefinition def = beanXMLs.remove(path);
if(def != null) def.clean(this);
}
synchronized (seambeanXMLs) {
SeamBeansDefinition def = seambeanXMLs.remove(path);
if(def != null) def.clean(this);
}
}
public void clean(String typeName) {
synchronized(annotations) {
annotations.remove(typeName);
}
}
public void addBeanXML(IPath path, SeamBeansDefinition def) {
synchronized (beanXMLs) {
beanXMLs.put(path, def);
}
root.addToParents(path);
}
public void addSeamBeanXML(IPath path, SeamBeansDefinition def) {
synchronized (seambeanXMLs) {
seambeanXMLs.put(path, def);
}
root.addToParents(path);
}
public Set<SeamBeansDefinition> getSeamBeansDefinitions() {
Set<SeamBeansDefinition> result = new HashSet<SeamBeansDefinition>();
synchronized (beanXMLs) {
result.addAll(beanXMLs.values());
}
synchronized (seambeanXMLs) {
result.addAll(seambeanXMLs.values());
}
return result;
}
public Set<IPath> getAllPaths() {
Set<IPath> result = new HashSet<IPath>();
result.addAll(beanXMLs.keySet());
result.addAll(seambeanXMLs.keySet());
return result;
}
public SeamBeansDefinition getDefinition(IPath path) {
if(beanXMLs.containsKey(path)) return beanXMLs.get(path);
if(seambeanXMLs.containsKey(path)) return seambeanXMLs.get(path);
return null;
}
public void addAnnotation(String typeName, AnnotationDefinition def) {
// root.clean(typeName);
annotations.put(typeName, def);
IPath path = def.getResource() != null ? def.getResource().getFullPath()
: def.getType() != null ? def.getType().getPath()
: null;
if(path != null) {
((DefinitionContext)root).addType(path, typeName, def);
}
}
public List<TypeDefinition> getTypeDefinitions() {
List<TypeDefinition> result = new ArrayList<TypeDefinition>();
for (SeamBeansDefinition def: beanXMLs.values()) {
result.addAll(def.getTypeDefinitions());
}
for (SeamBeansDefinition def: seambeanXMLs.values()) {
result.addAll(def.getTypeDefinitions());
}
return result;
}
void initPossibleTypes() {
Set<IPath> ps = getAllPaths();
for (IPath p: ps) {
SeamBeansDefinition d = getDefinition(p);
Set<String> ns = d.getPossibleTypeNames();
for (String type: ns) {
possibleTypes.put(type, p);
}
}
}
public IPath getPathForPossibleType(String type) {
return possibleTypes.get(type);
}
}