peter: dom extender work around
[fedora-idea.git] / dom / impl / src / com / intellij / util / xml / impl / AddToCompositeCollectionInvocation.java
blob06239b8789769bf8ee140ccb3e603c5faafb7802
1 /*
2 * Copyright (c) 2000-2005 by JetBrains s.r.o. All Rights Reserved.
3 * Use is subject to license terms.
4 */
5 package com.intellij.util.xml.impl;
7 import com.intellij.psi.xml.XmlTag;
8 import com.intellij.util.xml.EvaluatedXmlName;
10 import java.lang.reflect.Type;
11 import java.util.Set;
13 /**
14 * @author peter
16 class AddToCompositeCollectionInvocation implements Invocation {
17 private final CollectionChildDescriptionImpl myMainDescription;
18 private final Set<CollectionChildDescriptionImpl> myQnames;
19 private final Type myType;
21 public AddToCompositeCollectionInvocation(final CollectionChildDescriptionImpl tagName, final Set<CollectionChildDescriptionImpl> qnames, final Type type) {
22 myMainDescription = tagName;
23 myQnames = qnames;
24 myType = type;
27 public Object invoke(final DomInvocationHandler<?> handler, final Object[] args) throws Throwable {
28 for (final CollectionChildDescriptionImpl qname : myQnames) {
29 handler.getCollectionChildren(qname, qname.getTagsGetter());
32 final XmlTag tag = handler.ensureTagExists();
33 int index = args != null && args.length == 1 ? (Integer)args[0] : Integer.MAX_VALUE;
35 XmlTag lastTag = null;
36 int i = 0;
37 final XmlTag[] tags = tag.getSubTags();
38 for (final XmlTag subTag : tags) {
39 if (i == index) break;
40 if (DomImplUtil.containsTagName(myQnames, subTag, handler)) {
41 final DomInvocationHandler element = handler.getManager().getCachedHandler(subTag);
42 if (element instanceof CollectionElementInvocationHandler) {
43 lastTag = subTag;
44 i++;
48 final DomManagerImpl manager = handler.getManager();
49 final boolean b = manager.setChanging(true);
50 try {
51 final EvaluatedXmlName evaluatedXmlName = handler.createEvaluatedXmlName(myMainDescription.getXmlName());
52 final XmlTag emptyTag = handler.createChildTag(evaluatedXmlName);
53 final XmlTag newTag;
54 if (lastTag == null) {
55 if (tags.length == 0) {
56 newTag = (XmlTag)tag.add(emptyTag);
58 else {
59 newTag = (XmlTag)tag.addBefore(emptyTag, tags[0]);
62 else {
63 newTag = (XmlTag)tag.addAfter(emptyTag, lastTag);
66 return new CollectionElementInvocationHandler(myType, newTag, myMainDescription, handler).getProxy();
68 finally {
69 manager.setChanging(b);