001 /**
002 *
003 * Licensed to the Apache Software Foundation (ASF) under one or more
004 * contributor license agreements. See the NOTICE file distributed with
005 * this work for additional information regarding copyright ownership.
006 * The ASF licenses this file to You under the Apache License, Version 2.0
007 * (the "License"); you may not use this file except in compliance with
008 * the License. You may obtain a copy of the License at
009 *
010 * http://www.apache.org/licenses/LICENSE-2.0
011 *
012 * Unless required by applicable law or agreed to in writing, software
013 * distributed under the License is distributed on an "AS IS" BASIS,
014 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
015 * See the License for the specific language governing permissions and
016 * limitations under the License.
017 */
018 package org.apache.geronimo.web.deployment;
019
020 import javax.xml.namespace.QName;
021
022 import org.apache.geronimo.common.DeploymentException;
023 import org.apache.geronimo.deployment.xbeans.ModuleDocument;
024 import org.apache.geronimo.schema.SchemaConversionUtils;
025 import org.apache.geronimo.xbeans.geronimo.security.GerSecurityDocument;
026 import org.apache.geronimo.xbeans.geronimo.web.GerWebAppDocument;
027 import org.apache.xmlbeans.XmlCursor;
028 import org.apache.xmlbeans.XmlObject;
029
030 /**
031 * @version $Rev: 470597 $ $Date: 2006-11-02 15:30:55 -0800 (Thu, 02 Nov 2006) $
032 */
033 public class GenericToSpecificPlanConverter {
034
035 private static final QName GENERIC_QNAME = GerWebAppDocument.type.getDocumentElementName();
036 private static final String GENERIC_NAMESPACE = GENERIC_QNAME.getNamespaceURI();
037 private static final String OLD_GENERIC_NAMESPACE = "http://geronimo.apache.org/xml/ns/web";
038
039 private static final QName GENERIC_CONFIG_QNAME = new QName(GENERIC_NAMESPACE, "container-config");
040 private static final QName OLD_GENERIC_CONFIG_QNAME = new QName(OLD_GENERIC_NAMESPACE, "container-config");
041 private static final String SYSTEM_NAMESPACE = ModuleDocument.type.getDocumentElementName().getNamespaceURI();
042 private static final QName SECURITY_QNAME = GerSecurityDocument.type.getDocumentElementName();
043 private final String configNamespace;
044 private final String namespace;
045 private final String element;
046
047 public GenericToSpecificPlanConverter(String configNamespace, String namespace, String element) {
048 this.configNamespace = configNamespace;
049 this.namespace = namespace;
050 this.element = element;
051 }
052
053 public XmlObject convertToSpecificPlan(XmlObject plan) throws DeploymentException {
054 XmlCursor rawCursor = plan.newCursor();
055 try {
056 if (SchemaConversionUtils.findNestedElement(rawCursor, "web-app")) {
057 XmlCursor temp = rawCursor.newCursor();
058 String namespace = temp.getName().getNamespaceURI();
059 temp.dispose();
060 if(!namespace.equals(GENERIC_NAMESPACE) && !namespace.equals(this.namespace) && !namespace.equals(OLD_GENERIC_NAMESPACE)) {
061 throw new DeploymentException("Cannot handle web plan with namespace "+namespace+" -- expecting "+GENERIC_NAMESPACE+" or "+this.namespace);
062 }
063
064 XmlObject webPlan = rawCursor.getObject().copy();
065
066 XmlCursor cursor = webPlan.newCursor();
067 XmlCursor end = cursor.newCursor();
068 try {
069 cursor.push();
070 if (cursor.toChild(GENERIC_CONFIG_QNAME) || cursor.toChild(OLD_GENERIC_CONFIG_QNAME)) {
071 XmlCursor source = cursor.newCursor();
072 cursor.push();
073 cursor.toEndToken();
074 cursor.toNextToken();
075 try {
076 if (source.toChild(configNamespace, element)) {
077 source.copyXmlContents(cursor);
078 }
079
080 } finally {
081 source.dispose();
082 }
083 cursor.pop();
084 cursor.removeXml();
085 }
086 cursor.pop();
087 cursor.push();
088 while (cursor.hasNextToken()) {
089 if (cursor.isStart()) {
090 if (!SchemaConversionUtils.convertSingleElementToGeronimoSubSchemas(cursor, end)
091 && !this.namespace.equals(cursor.getName().getNamespaceURI())) {
092 cursor.setName(new QName(this.namespace, cursor.getName().getLocalPart()));
093 }
094 }
095 cursor.toNextToken();
096 }
097 //move security elements after refs
098
099 cursor.pop();
100 cursor.push();
101 if (cursor.toChild(this.namespace, "security-realm-name")) {
102 XmlCursor other = cursor.newCursor();
103 try {
104 other.toParent();
105 if (other.toChild(SYSTEM_NAMESPACE, "gbean")) {
106 other.toPrevToken();
107 } else {
108 other.toEndToken();
109 other.toPrevToken();
110 }
111 cursor.moveXml(other);
112 cursor.pop();
113 cursor.push();
114 if (cursor.toChild(SECURITY_QNAME)) {
115 cursor.moveXml(other);
116 }
117 } finally {
118 other.dispose();
119 }
120 }
121 cursor.pop();
122 return webPlan;
123 } finally {
124 cursor.dispose();
125 end.dispose();
126 }
127 } else {
128 throw new DeploymentException("No web-app element");
129 }
130 } finally {
131 rawCursor.dispose();
132 }
133 }
134
135 }