001: /*
002: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
003: *
004: * Copyright 1997-2007 Sun Microsystems, Inc. All rights reserved.
005: *
006: * The contents of this file are subject to the terms of either the GNU
007: * General Public License Version 2 only ("GPL") or the Common
008: * Development and Distribution License("CDDL") (collectively, the
009: * "License"). You may not use this file except in compliance with the
010: * License. You can obtain a copy of the License at
011: * http://www.netbeans.org/cddl-gplv2.html
012: * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the
013: * specific language governing permissions and limitations under the
014: * License. When distributing the software, include this License Header
015: * Notice in each file and include the License file at
016: * nbbuild/licenses/CDDL-GPL-2-CP. Sun designates this
017: * particular file as subject to the "Classpath" exception as provided
018: * by Sun in the GPL Version 2 section of the License file that
019: * accompanied this code. If applicable, add the following below the
020: * License Header, with the fields enclosed by brackets [] replaced by
021: * your own identifying information:
022: * "Portions Copyrighted [year] [name of copyright owner]"
023: *
024: * Contributor(s):
025: *
026: * The Original Software is NetBeans. The Initial Developer of the Original
027: * Software is Sun Microsystems, Inc. Portions Copyright 1997-2006 Sun
028: * Microsystems, Inc. All Rights Reserved.
029: *
030: * If you wish your version of this file to be governed by only the CDDL
031: * or only the GPL Version 2, indicate your decision by adding
032: * "[Contributor] elects to include this software in this distribution
033: * under the [CDDL or GPL Version 2] license." If you do not indicate a
034: * single choice of license, a recipient has the option to distribute
035: * your version of this file under either the CDDL, the GPL Version 2 or
036: * to extend the choice of license to its licensees as provided above.
037: * However, if you add GPL Version 2 code and therefore, elected the GPL
038: * Version 2 license, then the option applies only if the new code is
039: * made subject to such option by the copyright holder.
040: */
041: package org.netbeans.modules.xml.text;
042:
043: import java.io.Reader;
044: import java.io.StringReader;
045:
046: import javax.swing.text.Document;
047:
048: import org.xml.sax.*;
049:
050: import org.netbeans.modules.xml.*;
051: import org.netbeans.modules.xml.sync.*;
052: import org.netbeans.modules.xml.lib.*;
053: import java.net.URL;
054: import java.io.IOException;
055:
056: /**
057: * Manages text representation and its editor interaction.
058: * Takes care for proper event propagation.
059: *
060: * It is related to Document.
061: * <p>Update accepts: String.
062: * <p>Change provides: Document, Reader, InputSource, String
063: *
064: *
065: * @author Petr Kuzel
066: * @version
067: */
068: public abstract class TextRepresentation extends SyncRepresentation {
069:
070: /**
071: * Holds reference to editor support.
072: */
073: protected final TextEditorSupport editor;
074:
075: /** Creates new TextRepresentation */
076: public TextRepresentation(TextEditorSupport editor,
077: Synchronizator sync) {
078: super (sync);
079: this .editor = editor;
080: }
081:
082: /**
083: * Does this representation wraps given model?
084: */
085: public boolean represents(Class type) {
086: return Document.class.isAssignableFrom(type);
087: }
088:
089: public int level() {
090: return 1;
091: }
092:
093: /**
094: * Return modification passed as update parameter to all slave representations.
095: */
096: public Object getChange(Class type) {
097: if (type == null || type.isAssignableFrom(Document.class)) {
098: return editor.getDocument();
099: } else if (type.isAssignableFrom(String.class)) {
100: try {
101: return Convertors.documentToString(editor
102: .openDocument());
103: } catch (IOException ex) {
104: Util.THIS.debug(ex);
105: return null;
106: }
107: } else if (type.isAssignableFrom(InputSource.class)) {
108:
109: InputSource in = null;
110: try {
111: in = Convertors.documentToInputSource(editor
112: .openDocument());
113: } catch (IOException ex) {
114: Util.THIS.debug(ex);
115: return null;
116: }
117: try {
118: URL baseURL = editor.getDataObject().getPrimaryFile()
119: .getURL();
120: String systemId = baseURL.toExternalForm();
121: in.setSystemId(systemId);
122: } catch (IOException ex) {
123: // file object diappeared, we can not parse relative external entities then
124: if (Util.THIS.isLoggable()) /* then */
125: Util.THIS
126: .debug("Warning: missing file object, external entities cannot be parsed."); // NOI18N
127: }
128: return in;
129: } else if (type.isAssignableFrom(Reader.class)) {
130: try {
131: return new StringReader(Convertors
132: .documentToString(editor.openDocument()));
133: } catch (IOException ex) {
134: Util.THIS.debug(ex);
135: return null;
136: }
137: }
138:
139: throw new RuntimeException("Unsupported type: " + type); // NOI18N
140: }
141:
142: /**
143: * @return select button diplay name used during notifying concurent modification
144: * conflict.
145: */
146: public String getDisplayName() {
147: return Util.THIS.getString("PROP_Text_representation");
148: }
149:
150: /**
151: * Return accepted update class
152: */
153: public Class getUpdateClass() {
154: return String.class;
155: }
156:
157: }
|