001: /*
002: * Licensed to the Apache Software Foundation (ASF) under one
003: * or more contributor license agreements. See the NOTICE file
004: * distributed with this work for additional information
005: * regarding copyright ownership. The ASF licenses this file
006: * to you under the Apache License, Version 2.0 (the
007: * "License"); you may not use this file except in compliance
008: * with 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,
013: * software distributed under the License is distributed on an
014: * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
015: * KIND, either express or implied. See the License for the
016: * specific language governing permissions and limitations
017: * under the License.
018: */
019: package org.apache.openjpa.jdbc.schema;
020:
021: import java.io.File;
022: import java.io.IOException;
023: import java.net.URL;
024: import java.security.AccessController;
025:
026: import org.apache.openjpa.jdbc.conf.JDBCConfiguration;
027: import org.apache.openjpa.lib.conf.Configurable;
028: import org.apache.openjpa.lib.conf.Configuration;
029: import org.apache.openjpa.lib.util.Files;
030: import org.apache.openjpa.lib.util.J2DoPrivHelper;
031: import org.apache.openjpa.util.GeneralException;
032:
033: /**
034: * Factory that uses an XML schema file to construct the system schema.
035: *
036: * @author Abe White
037: */
038: public class FileSchemaFactory implements SchemaFactory, Configurable {
039:
040: private JDBCConfiguration _conf = null;
041: private String _fileName = "package.schema";
042: private ClassLoader _loader = null;
043:
044: /**
045: * Return the XML resource defining this schema. Defaults to
046: * <code>package.schema</code>.
047: */
048: public String getFile() {
049: return _fileName;
050: }
051:
052: /**
053: * Set the XML resource defining this schema. Defaults to
054: * <code>package.schema</code>.
055: */
056: public void setFile(String fileName) {
057: _fileName = fileName;
058: }
059:
060: /**
061: * @deprecated Use {@link #setFile}. Retained for
062: * backwards-compatible auto-configuration.
063: */
064: public void setFileName(String name) {
065: setFile(name);
066: }
067:
068: public void setConfiguration(Configuration conf) {
069: _conf = (JDBCConfiguration) conf;
070: _loader = _conf.getClassResolverInstance().getClassLoader(
071: getClass(), null);
072: }
073:
074: public void startConfiguration() {
075: }
076:
077: public void endConfiguration() {
078: }
079:
080: public SchemaGroup readSchema() {
081: URL url = (URL) AccessController.doPrivileged(J2DoPrivHelper
082: .getResourceAction(_loader, _fileName));
083: if (url == null)
084: return new SchemaGroup();
085:
086: XMLSchemaParser parser = new XMLSchemaParser(_conf);
087: try {
088: parser.parse(url);
089: } catch (IOException ioe) {
090: throw new GeneralException(ioe);
091: }
092: return parser.getSchemaGroup();
093: }
094:
095: public void storeSchema(SchemaGroup schema) {
096: File file = Files.getFile(_fileName, _loader);
097: XMLSchemaSerializer ser = new XMLSchemaSerializer(_conf);
098: ser.addAll(schema);
099: try {
100: ser.serialize(file, ser.PRETTY);
101: } catch (IOException ioe) {
102: throw new GeneralException(ioe);
103: }
104: }
105: }
|