1 /*******************************************************************************
\r
2 * Copyright (c) 2010 Association for Decentralized Information Management in
\r
4 * All rights reserved. This program and the accompanying materials
\r
5 * are made available under the terms of the Eclipse Public License v1.0
\r
6 * which accompanies this distribution, and is available at
\r
7 * http://www.eclipse.org/legal/epl-v10.html
\r
10 * VTT Technical Research Centre of Finland - initial API and implementation
\r
11 *******************************************************************************/
\r
12 package org.simantics.databoard.type;
14 import java.util.Set;
\r
15 import java.util.regex.Pattern;
\r
16 import java.util.regex.PatternSyntaxException;
\r
18 import org.simantics.databoard.accessor.error.ReferenceException;
\r
19 import org.simantics.databoard.accessor.reference.ChildReference;
\r
20 import org.simantics.databoard.util.IdentityPair;
\r
21 import org.simantics.databoard.util.Limit;
\r
22 import org.simantics.databoard.util.Range;
\r
23 import org.simantics.databoard.util.RangeException;
\r
25 public class StringType extends Datatype {
27 public static final String KEY_PATTERN = "pattern";
\r
28 public static final String KEY_MIMETYPE = "mimeType";
\r
29 public static final String KEY_LENGTH = "length";
\r
31 private transient Range _length;
\r
32 private transient String _lengthIsForStr;
33 private transient Pattern pattern_;
\r
34 private transient String pattern_IsForStr;
36 public StringType () {}
38 public StringType (String pattern) {
\r
39 setPattern(pattern);
\r
42 public StringType (String pattern, String mimeType, Range length) {
43 setPattern(pattern);
\r
44 setMimeType(mimeType);
\r
48 public StringType (String pattern, String mimeType, String length) {
49 setPattern(pattern);
\r
50 setMimeType(mimeType);
\r
55 public int getComponentCount() {
\r
60 public Datatype getComponentType(int index) {
\r
61 throw new IllegalArgumentException();
\r
65 public Datatype getComponentType(ChildReference path) {
\r
66 if (path==null) return this;
\r
67 throw new IllegalArgumentException();
\r
71 protected boolean deepEquals(Object obj, Set<IdentityPair<Datatype, Datatype>> compareHistory) {
72 if (this==obj) return true;
\r
73 if ( !hasEqualMetadata(obj) ) return false;
\r
74 return obj instanceof StringType;
78 public int hashCode() {
79 return 0x43676323 + super.hashCode();
83 public void accept(Visitor1 v, Object obj) {
88 public <T> T accept(Visitor<T> v) {
92 public String getPattern() {
93 return metadata.get(KEY_PATTERN);
96 public void setPattern(String pattern)
97 throws PatternSyntaxException
99 if ( pattern == null ) metadata.remove(KEY_PATTERN); else
\r
100 metadata.put(KEY_PATTERN, pattern);
\r
103 public String getMimeType() {
\r
104 return metadata.get(KEY_MIMETYPE);
107 public void setMimeType(String mimeType) {
\r
108 if (mimeType==null) metadata.remove( KEY_MIMETYPE ); else
109 metadata.put(KEY_MIMETYPE, mimeType);
\r
112 public Range getLength() {
\r
113 String lengthStr = metadata.get( KEY_LENGTH );
\r
114 if ( lengthStr == null ) return null;
\r
115 if ( lengthStr == _lengthIsForStr ) return _length;
\r
117 _lengthIsForStr = lengthStr;
\r
118 _length = Range.valueOf( lengthStr );
\r
119 } catch (RangeException e) {
\r
125 public int minLength() {
126 if (_length==null) return 0;
127 Limit l = _length.getLower();
128 int value = l.getValue().intValue();
129 if (l.isExclusive()) value++;
133 public int maxLength() {
134 if (_length==null) return Integer.MAX_VALUE;
135 Limit l = _length.getUpper();
136 int value = l.getValue().intValue();
137 if (l.isExclusive()) value--;
142 * Get compiled reg exp pattern
144 * @return pattern or null
146 public Pattern getCompiledPattern()
148 String patternStr = metadata.get( KEY_PATTERN );
\r
149 if ( patternStr == null ) return null;
\r
150 if ( patternStr == pattern_IsForStr ) return pattern_;
\r
152 pattern_IsForStr = patternStr;
\r
153 pattern_ = Pattern.compile(patternStr);
\r
154 } catch (PatternSyntaxException e) {
\r
160 public void setLength(String length) {
\r
161 if ( length == null ) metadata.remove( KEY_LENGTH ); else
\r
162 metadata.put( KEY_LENGTH, length );
165 public void setLength(Range range) {
166 if (range == null) {
\r
167 this._length = null;
\r
168 this._lengthIsForStr = null;
\r
169 metadata.remove( KEY_LENGTH );
\r
171 this._length = range;
\r
172 this._lengthIsForStr = range.toString();
\r
173 metadata.put( KEY_LENGTH, _lengthIsForStr );
\r
177 @SuppressWarnings("unchecked")
\r
179 public <T extends Datatype> T getChildType(ChildReference reference) throws ReferenceException {
\r
180 if (reference==null) return (T) this;
\r
181 throw new ReferenceException(reference.getClass()+" is not a subreference of StringType");
\r