001: /*
002: * Copyright 1999-2002,2004 The Apache Software Foundation.
003: *
004: * Licensed under the Apache License, Version 2.0 (the "License");
005: * you may not use this file except in compliance with the License.
006: * You may obtain a copy of the License at
007: *
008: * http://www.apache.org/licenses/LICENSE-2.0
009: *
010: * Unless required by applicable law or agreed to in writing, software
011: * distributed under the License is distributed on an "AS IS" BASIS,
012: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013: * See the License for the specific language governing permissions and
014: * limitations under the License.
015: */
016:
017: package org.jasig.portal.serialize;
018:
019: import java.io.OutputStream;
020: import java.io.Writer;
021: import java.io.UnsupportedEncodingException;
022: import java.util.Hashtable;
023: import java.util.StringTokenizer;
024:
025: /**
026: *
027: *
028: * @version $Revision: 36559 $ $Date: 2006-04-28 11:38:13 -0700 (Fri, 28 Apr 2006) $
029: * @author <a href="mailto:Scott_Boag/CAM/Lotus@lotus.com">Scott Boag</a>
030: * @author <a href="mailto:arkin@intalio.com">Assaf Arkin</a>
031: */
032: public abstract class SerializerFactory {
033:
034: public static final String FactoriesProperty = "org.jasig.apache.xml.serialize.factories";
035:
036: private static Hashtable _factories = new Hashtable();
037:
038: static {
039: SerializerFactory factory;
040: String list;
041: StringTokenizer token;
042: String className;
043:
044: // The default factories are always registered first,
045: // any factory specified in the properties file and supporting
046: // the same method will override the default factory.
047: factory = new SerializerFactoryImpl(Method.XML);
048: registerSerializerFactory(factory);
049: factory = new SerializerFactoryImpl(Method.HTML);
050: registerSerializerFactory(factory);
051: factory = new SerializerFactoryImpl(Method.XHTML);
052: registerSerializerFactory(factory);
053: factory = new SerializerFactoryImpl(Method.TEXT);
054: registerSerializerFactory(factory);
055:
056: list = System.getProperty(FactoriesProperty);
057: if (list != null) {
058: token = new StringTokenizer(list, " ;,:");
059: while (token.hasMoreTokens()) {
060: className = token.nextToken();
061: try {
062: factory = (SerializerFactory) Class.forName(
063: className).newInstance();
064: if (_factories.containsKey(factory
065: .getSupportedMethod()))
066: _factories.put(factory.getSupportedMethod(),
067: factory);
068: } catch (Exception except) {
069: }
070: }
071: }
072: }
073:
074: /**
075: * Register a serializer factory, keyed by the given
076: * method string.
077: */
078: public static void registerSerializerFactory(
079: SerializerFactory factory) {
080: String method;
081:
082: synchronized (_factories) {
083: method = factory.getSupportedMethod();
084: _factories.put(method, factory);
085: }
086: }
087:
088: /**
089: * Register a serializer factory, keyed by the given
090: * method string.
091: */
092: public static SerializerFactory getSerializerFactory(String method) {
093: return (SerializerFactory) _factories.get(method);
094: }
095:
096: /**
097: * Returns the method supported by this factory and used to register
098: * the factory. This call is required so factories can be added from
099: * a properties file by knowing only the class name. This method is
100: * protected, it is only required by this class but must be implemented
101: * in derived classes.
102: */
103: protected abstract String getSupportedMethod();
104:
105: /**
106: * Create a new serializer based on the {@link OutputFormat}.
107: * If this method is used to create the serializer, the {@link
108: * Serializer#setOutputByteStream} or {@link Serializer#setOutputCharStream}
109: * methods must be called before serializing a document.
110: */
111: public abstract Serializer makeSerializer(OutputFormat format);
112:
113: /**
114: * Create a new serializer, based on the {@link OutputFormat} and
115: * using the writer as the output character stream. If this
116: * method is used, the encoding property will be ignored.
117: */
118: public abstract Serializer makeSerializer(Writer writer,
119: OutputFormat format);
120:
121: /**
122: * Create a new serializer, based on the {@link OutputFormat} and
123: * using the output byte stream and the encoding specified in the
124: * output format.
125: *
126: * @throws UnsupportedEncodingException The specified encoding is
127: * not supported
128: */
129: public abstract Serializer makeSerializer(OutputStream output,
130: OutputFormat format) throws UnsupportedEncodingException;
131:
132: }
|