001: /* uDig - User Friendly Desktop Internet GIS client
002: * http://udig.refractions.net
003: * (C) 2004, Refractions Research Inc.
004: *
005: * This library is free software; you can redistribute it and/or
006: * modify it under the terms of the GNU Lesser General Public
007: * License as published by the Free Software Foundation;
008: * version 2.1 of the License.
009: *
010: * This library is distributed in the hope that it will be useful,
011: * but WITHOUT ANY WARRANTY; without even the implied warranty of
012: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
013: * Lesser General Public License for more details.
014: */
015: package net.refractions.udig.internal.ui;
016:
017: import java.io.StringReader;
018:
019: import javax.xml.transform.TransformerException;
020:
021: import net.refractions.udig.ui.AbstractTextStrategizedTransfer;
022:
023: import org.eclipse.swt.dnd.TextTransfer;
024: import org.eclipse.swt.dnd.Transfer;
025: import org.eclipse.swt.dnd.TransferData;
026: import org.geotools.filter.Filter;
027: import org.geotools.filter.FilterFilter;
028: import org.geotools.filter.FilterHandler;
029: import org.geotools.filter.FilterTransformer;
030: import org.geotools.gml.GMLFilterDocument;
031: import org.geotools.gml.GMLFilterGeometry;
032: import org.xml.sax.InputSource;
033: import org.xml.sax.XMLReader;
034: import org.xml.sax.helpers.DefaultHandler;
035: import org.xml.sax.helpers.XMLReaderFactory;
036:
037: /**
038: * To Transfer Filters in text form.
039: *
040: * @author jones
041: * @since 1.0.0
042: */
043: public class FilterTextTransfer extends AbstractTextStrategizedTransfer
044: implements UDIGTransfer {
045: private static FilterTextTransfer _instance = new FilterTextTransfer();
046:
047: private FilterTextTransfer() {
048: }
049:
050: /**
051: * Returns the singleton instance of the TextTransfer class.
052: *
053: * @return the singleton instance of the TextTransfer class
054: */
055: public static FilterTextTransfer getInstance() {
056: return _instance;
057: }
058:
059: private TransferStrategy[] transferStrategies;
060:
061: @Override
062: public synchronized TransferStrategy[] getAllStrategies() {
063: if (transferStrategies == null) {
064: transferStrategies = new TransferStrategy[] { new GMLFilterStrategy() };
065: }
066:
067: TransferStrategy[] copy = new TransferStrategy[transferStrategies.length];
068: System.arraycopy(transferStrategies, 0, copy, 0,
069: transferStrategies.length);
070: return copy;
071: }
072:
073: @Override
074: public String[] getStrategyNames() {
075: return new String[] { "GML" }; //$NON-NLS-1$
076: }
077:
078: @Override
079: public String getTransferName() {
080: return "Filter"; //$NON-NLS-1$
081: }
082:
083: @Override
084: public TransferStrategy getDefaultStrategy() {
085: return getAllStrategies()[0];
086: }
087:
088: @Override
089: public TransferData[] getSupportedTypes() {
090: return TextTransfer.getInstance().getSupportedTypes();
091: }
092:
093: @Override
094: public boolean isSupportedType(TransferData transferData) {
095: return TextTransfer.getInstance().isSupportedType(transferData);
096: }
097:
098: public boolean validate(Object object) {
099: return object instanceof Filter;
100: }
101:
102: public static class SimpleFilterHandler extends DefaultHandler
103: implements FilterHandler {
104:
105: private Filter filter;
106:
107: public void filter(Filter filter) {
108: this .filter = filter;
109: }
110:
111: public Filter getFilter() {
112: return filter;
113: }
114:
115: }
116:
117: private static class GMLFilterStrategy implements TransferStrategy {
118: /**
119: * @see Transfer#javaToNative
120: */
121: public void javaToNative(Object object,
122: TransferData transferData) {
123: Filter filter = (Filter) object;
124: FilterTransformer transformer = new FilterTransformer();
125: transformer.setIndentation(4);
126: try {
127: String transform = transformer.transform(filter);
128: TextTransfer.getInstance().javaToNative(transform,
129: transferData);
130: } catch (TransformerException e) {
131: throw (RuntimeException) new RuntimeException()
132: .initCause(e);
133: }
134: }
135:
136: /**
137: * @see Transfer#nativeToJava
138: */
139: public Object nativeToJava(TransferData transferData) {
140: String string = (String) TextTransfer.getInstance()
141: .nativeToJava(transferData);
142: InputSource input = new InputSource(
143: new StringReader(string));
144: SimpleFilterHandler simpleFilterHandler = new SimpleFilterHandler();
145: FilterFilter filterFilter = new FilterFilter(
146: simpleFilterHandler, null);
147: GMLFilterGeometry filterGeometry = new GMLFilterGeometry(
148: filterFilter);
149: GMLFilterDocument filterDocument = new GMLFilterDocument(
150: filterGeometry);
151:
152: try {
153: // parse xml
154: XMLReader reader = XMLReaderFactory.createXMLReader();
155: reader.setContentHandler(filterDocument);
156: reader.parse(input);
157: } catch (Exception e) {
158: throw new RuntimeException(e);
159: }
160:
161: return simpleFilterHandler.getFilter();
162: }
163: }
164: }
|