001 /*
002 * Licensed to the Apache Software Foundation (ASF) under one or more
003 * contributor license agreements. See the NOTICE file distributed with
004 * this work for additional information regarding copyright ownership.
005 * The ASF licenses this file to You under the Apache License, Version 2.0
006 * (the "License"); you may not use this file except in compliance with
007 * the License. You may obtain a copy of the License at
008 *
009 * http://www.apache.org/licenses/LICENSE-2.0
010 *
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the License for the specific language governing permissions and
015 * limitations under the License.
016 */
017 package org.apache.commons.betwixt.io.read;
018
019 import org.apache.commons.betwixt.AttributeDescriptor;
020 import org.apache.commons.betwixt.ElementDescriptor;
021 import org.xml.sax.Attributes;
022
023 /**
024 * Executes mapping action for a subgraph.
025 * It is intended that most MappingAction's will not need to maintain state.
026 *
027 * @author <a href='http://commons.apache.org/'>Apache Commons Team</a>
028 * @version $Revision: 561314 $
029 */
030 public abstract class MappingAction {
031
032
033 public abstract MappingAction next(
034 String namespace,
035 String name,
036 Attributes attributes,
037 ReadContext context)
038 throws Exception;
039
040 /**
041 * Executes mapping action on new element.
042 * @param namespace
043 * @param name
044 * @param attributes Attributes not null
045 * @param context Context not null
046 * @return the MappingAction to be used to map the sub-graph
047 * under this element
048 * @throws Exception
049 */
050 public abstract MappingAction begin(
051 String namespace,
052 String name,
053 Attributes attributes,
054 ReadContext context)
055 throws Exception;
056
057 /**
058 * Executes mapping action for element body text
059 * @param text
060 * @param context
061 * @throws Exception
062 */
063 public abstract void body(String text, ReadContext context)
064 throws Exception;
065
066 /**
067 * Executes mapping action one element ends
068 * @param context
069 * @throws Exception
070 */
071 public abstract void end(ReadContext context) throws Exception;
072
073 public static final MappingAction EMPTY = new MappingAction.Base();
074
075 public static final MappingAction IGNORE = new MappingAction.Ignore();
076
077 private static final class Ignore extends MappingAction {
078
079 public MappingAction next(String namespace, String name, Attributes attributes, ReadContext context) throws Exception {
080 return this;
081 }
082
083 public MappingAction begin(String namespace, String name, Attributes attributes, ReadContext context) throws Exception {
084 return this;
085 }
086
087 public void body(String text, ReadContext context) throws Exception {
088 // do nothing
089 }
090
091 public void end(ReadContext context) throws Exception {
092 // do nothing
093 }
094
095 }
096
097 /**
098 * Basic action.
099 *
100 * @author <a href='http://commons.apache.org/'>Apache Commons Team</a>
101 * @version $Revision: 561314 $
102 */
103 public static class Base extends MappingAction {
104
105 public MappingAction next(
106 String namespace,
107 String name,
108 Attributes attributes,
109 ReadContext context)
110 throws Exception {
111
112 return context.getActionMappingStrategy().getMappingAction(namespace, name, attributes, context);
113 }
114
115 /**
116 * @see org.apache.commons.betwixt.io.read.MappingAction#begin(String, String, Attributes, ReadContext)
117 */
118 public MappingAction begin(
119 String namespace,
120 String name,
121 Attributes attributes,
122 ReadContext context)
123 throws Exception {
124 // TODO: i'm not too sure about this part of the design
125 // i'm not sure whether base should give base behaviour or if it should give standard behaviour
126 // i'm hoping that things will become clearer once the descriptor logic has been cleared
127 ElementDescriptor descriptor = context.getCurrentDescriptor();
128 if (descriptor != null) {
129
130 AttributeDescriptor[] attributeDescriptors =
131 descriptor.getAttributeDescriptors();
132 context.populateAttributes(attributeDescriptors, attributes);
133 }
134 return this;
135 }
136
137 /**
138 * @see MappingAction#body(String, ReadContext)
139 */
140 public void body(String text, ReadContext context) throws Exception {
141 // do nothing
142 }
143
144 /**
145 * @see MappingAction#end(ReadContext)
146 */
147 public void end(ReadContext context) throws Exception {
148 // do nothing
149 // TODO: this is a temporary refactoring
150 // it would be better to do this in the rule
151 // need to move more logic into the context and out of the rule
152 context.popElement();
153 }
154
155 }
156 }