Subversion Repository Public Repository

litesoft

Diff Revisions 949 vs 950 for /trunk/Java/GWT/Client/src/org/litesoft/GWT/client/pavsupport/PlaceRegistry.java

Diff revisions: vs.
  @@ -1,223 +1,222 @@
1 - package org.litesoft.GWT.client.pavsupport;
2 -
3 - import org.litesoft.GWT.client.pavsupport.internal.*;
4 - import org.litesoft.GWT.client.util.*;
5 - import org.litesoft.commonfoundation.base.*;
6 - import org.litesoft.commonfoundation.typeutils.*;
7 - import org.litesoft.logger.*;
8 -
9 - import com.google.gwt.place.shared.*;
10 -
11 - import java.util.*;
12 -
13 - /**
14 - * Supporting class that implements PlaceHistoryMapper which expects PlaceTokenizer(s) and Place(s) that implement HasPlaceId,
15 - * otherwise Class Name magic is used (See PlaceIdExtractor).
16 - */
17 - public class PlaceRegistry implements PlaceHistoryMapper {
18 - private static final Logger LOGGER = LoggerFactory.getLogger( PlaceRegistry.class );
19 -
20 - private static final PlaceTokenizerMap PLACE_TOKENIZER_MAP = new PlaceTokenizerMap();
21 - private static IdTokenizer<Place> sDefaultTokenizer;
22 - private static Place sDefaultPlace;
23 -
24 - public static void add( PlaceTokenizer<? extends Place>... pTokenizers ) {
25 - if ( pTokenizers != null ) {
26 - for ( PlaceTokenizer<? extends Place> zTokenizer : pTokenizers ) {
27 - if ( zTokenizer != null ) {
28 - PLACE_TOKENIZER_MAP.addTokenizer( zTokenizer );
29 - }
30 - }
31 - }
32 - }
33 -
34 - public static void setDefaultTokenizer( PlaceTokenizer<? extends Place> pDefaultTokenizer ) {
35 - if ( pDefaultTokenizer != null ) {
36 - PlaceTokenizer<Place> zTokenizer = Cast.it( pDefaultTokenizer );
37 - if ( null != (sDefaultTokenizer = ProxyIdTokenizer.forceToIdTokenizer( PLACE_TOKENIZER_MAP.addTokenizer( zTokenizer ), zTokenizer )) ) {
38 - sDefaultPlace = sDefaultTokenizer.getPlace( null );
39 - }
40 - }
41 - }
42 -
43 - public static Place getDefaultPlace() {
44 - return sDefaultPlace;
45 - }
46 -
47 - private MessageUserSinkAccessor mMessageUserSinkAccessor;
48 -
49 - public PlaceRegistry( MessageUserSinkAccessor pMessageUserSinkAccessor ) {
50 - mMessageUserSinkAccessor = (pMessageUserSinkAccessor != null) ? pMessageUserSinkAccessor : DefaultMessageUserSink.FACTORY;
51 - }
52 -
53 - /**
54 - * Convert the full Token (URL Fragment) to a Place
55 - *
56 - * @param pToken the full URL Fragment
57 - *
58 - * @return a Place, generated by one of the Registered Tokenizers, or the Default if not found, or NULL if no Default!
59 - */
60 - @Override
61 - public Place getPlace( String pToken ) {
62 - PlaceIdAndData zIdAndData = PlaceIdAndData.fromString( pToken );
63 - if ( zIdAndData != null ) {
64 - String zPlaceId = zIdAndData.getPlaceId();
65 - PlaceTokenizer<? extends Place> zTokenizer = PLACE_TOKENIZER_MAP.getTokenizer( zPlaceId );
66 - if ( zTokenizer == null ) {
67 - mMessageUserSinkAccessor.getMessageUserSink().setErrorMessage( "Unable to determine 'view' from: " + zPlaceId );
68 - } else {
69 - Place zPlace;
70 -
71 - try {
72 - if ( null != (zPlace = zTokenizer.getPlace( zIdAndData.getData() )) ) {
73 - return zPlace;
74 - }
75 - }
76 - catch ( RuntimeException e ) {
77 - String zMessage = "Unable to create 'view' from: ";
78 - LOGGER.warn.log( e, zMessage, pToken );
79 - mMessageUserSinkAccessor.getMessageUserSink().setErrorMessage( zMessage + zPlaceId );
80 - return sDefaultPlace;
81 - }
82 - if ( zPlace == null ) {
83 - String zMessage = "No 'view' from: ";
84 - LOGGER.warn.log( zMessage, pToken );
85 - mMessageUserSinkAccessor.getMessageUserSink().setErrorMessage( zMessage + zPlaceId );
86 - }
87 - }
88 - }
89 - return sDefaultPlace;
90 - }
91 -
92 - /**
93 - * Convert a Place into the full Token (URL Fragment)
94 - *
95 - * @param pPlace place to convert (null ok)
96 - *
97 - * @return the full URL Fragment (null if Place was null & there was NO Default Tokenizer)
98 - */
99 - @Override
100 - public String getToken( Place pPlace ) {
101 - if ( pPlace == null ) {
102 - return null;
103 - }
104 - String zPlaceId = PlaceIdExtractor.getPlaceId( pPlace );
105 - if ( zPlaceId == null ) {
106 - mMessageUserSinkAccessor.getMessageUserSink().setErrorMessage( "Unable to determine 'view' from class: " + pPlace.getClass().getName() );
107 - return null;
108 - }
109 - PlaceTokenizer<Place> zTokenizer = PLACE_TOKENIZER_MAP.getTokenizer( zPlaceId );
110 - if ( zTokenizer == null ) {
111 - String zMessage = "No 'view' for '" + zPlaceId + "'";
112 - LOGGER.error.log( zMessage, ": ", pPlace.getClass().getName() );
113 - mMessageUserSinkAccessor.getMessageUserSink().setErrorMessage( zMessage );
114 - if ( null == sDefaultTokenizer ) {
115 - return null;
116 - }
117 - zTokenizer = sDefaultTokenizer;
118 - pPlace = sDefaultPlace;
119 - zPlaceId = sDefaultTokenizer.getPlaceId();
120 - }
121 - String zToken = null;
122 - try {
123 - zToken = zTokenizer.getToken( pPlace );
124 - }
125 - catch ( RuntimeException e ) {
126 - LOGGER.error.log( e, "Unable to 'tokenize' Place: ", pPlace.getClass(), " with PlaceId '", zPlaceId, "'" );
127 - }
128 - return new PlaceIdAndData( zPlaceId, zToken ).toString();
129 - }
130 -
131 - private static class ProxyIdTokenizer<T extends Place> extends IdTokenizer<T> {
132 - private PlaceTokenizer<T> mTokenizer;
133 -
134 - protected ProxyIdTokenizer( Object pPlaceId, PlaceTokenizer<T> pTokenizer ) {
135 - super( pPlaceId );
136 - mTokenizer = pTokenizer;
137 - }
138 -
139 - @Override
140 - public T getPlace( String pToken ) {
141 - return mTokenizer.getPlace( pToken );
142 - }
143 -
144 - @Override
145 - public String getToken( T pPlace ) {
146 - return mTokenizer.getToken( pPlace );
147 - }
148 -
149 - public static <T extends Place> IdTokenizer<T> forceToIdTokenizer( String pPlaceId, PlaceTokenizer<T> pTokenizer ) {
150 - return (pTokenizer instanceof IdTokenizer) ? (IdTokenizer<T>) pTokenizer : new ProxyIdTokenizer<T>( pPlaceId, pTokenizer );
151 - }
152 - }
153 -
154 - private static class PlaceTokenizerMap {
155 - private final Map<String, PlaceTokenizer<Place>> mPlaceIdToTokenizers = new HashMap<String, PlaceTokenizer<Place>>();
156 -
157 - /**
158 - * @param pTokenizer !null
159 - *
160 - * @return PlaceId
161 - */
162 - public String addTokenizer( PlaceTokenizer<? extends Place> pTokenizer ) {
163 - PlaceTokenizer<Place> zTokenizer = Cast.it( pTokenizer );
164 - String zPlaceId = PlaceIdExtractor.getPlaceId( zTokenizer );
165 - if ( null == zPlaceId ) {
166 - throw new IllegalStateException( "Unable to determine PlaceId from Tokenizer: " + pTokenizer.getClass().getName() );
167 - }
168 - PlaceTokenizer<Place> zPreviousTokenizer = mPlaceIdToTokenizers.put( zPlaceId, zTokenizer );
169 - if ( (zPreviousTokenizer != null) && (zPreviousTokenizer != zTokenizer) ) {
170 - throw new IllegalStateException( "Duplicate registration for PlaceId '':" + //
171 - "\n " + zPreviousTokenizer.getClass().getName() + //
172 - "\n " + pTokenizer.getClass().getName() );
173 - }
174 - return zPlaceId;
175 - }
176 -
177 - public PlaceTokenizer<Place> getTokenizer( String pPlaceId ) {
178 - return mPlaceIdToTokenizers.get( pPlaceId );
179 - }
180 - }
181 -
182 - private static class PlaceIdAndData {
183 - private String mPlaceId, mData;
184 -
185 - public PlaceIdAndData( String pPlaceId, String pData ) {
186 - mPlaceId = Strings.assertNotNullNotEmpty( "PlaceID", pPlaceId );
187 - mData = Strings.noEmpty( pData );
188 - }
189 -
190 - public String getPlaceId() {
191 - return mPlaceId;
192 - }
193 -
194 - public String getData() {
195 - return mData;
196 - }
197 -
198 - @Override
199 - public String toString() {
200 - return (mData == null) ? mPlaceId : mPlaceId + ':' + mData;
201 - }
202 -
203 - public static PlaceIdAndData fromString( String pURLfragment ) {
204 - if ( pURLfragment != null ) {
205 - if ( (pURLfragment = pURLfragment.trim()).length() != 0 ) {
206 - int at = pURLfragment.indexOf( ':' );
207 - if ( at == 0 ) {
208 - LOGGER.error.log( "Invalid URLfragment: '", pURLfragment, "'" );
209 - } else {
210 - String zData = null;
211 - String zPlaceID = pURLfragment;
212 - if ( at != -1 ) {
213 - zPlaceID = pURLfragment.substring( 0, at ).trim();
214 - zData = pURLfragment.substring( at + 1 );
215 - }
216 - return new PlaceIdAndData( zPlaceID, zData );
217 - }
218 - }
219 - }
220 - return null;
221 - }
222 - }
223 - }
1 + package org.litesoft.GWT.client.pavsupport;
2 +
3 + import org.litesoft.GWT.client.pavsupport.internal.*;
4 + import org.litesoft.GWT.client.util.*;
5 + import org.litesoft.commonfoundation.base.*;
6 + import org.litesoft.logger.*;
7 +
8 + import com.google.gwt.place.shared.*;
9 +
10 + import java.util.*;
11 +
12 + /**
13 + * Supporting class that implements PlaceHistoryMapper which expects PlaceTokenizer(s) and Place(s) that implement HasPlaceId,
14 + * otherwise Class Name magic is used (See PlaceIdExtractor).
15 + */
16 + public class PlaceRegistry implements PlaceHistoryMapper {
17 + private static final Logger LOGGER = LoggerFactory.getLogger( PlaceRegistry.class );
18 +
19 + private static final PlaceTokenizerMap PLACE_TOKENIZER_MAP = new PlaceTokenizerMap();
20 + private static IdTokenizer<Place> sDefaultTokenizer;
21 + private static Place sDefaultPlace;
22 +
23 + public static void add( PlaceTokenizer<? extends Place>... pTokenizers ) {
24 + if ( pTokenizers != null ) {
25 + for ( PlaceTokenizer<? extends Place> zTokenizer : pTokenizers ) {
26 + if ( zTokenizer != null ) {
27 + PLACE_TOKENIZER_MAP.addTokenizer( zTokenizer );
28 + }
29 + }
30 + }
31 + }
32 +
33 + public static void setDefaultTokenizer( PlaceTokenizer<? extends Place> pDefaultTokenizer ) {
34 + if ( pDefaultTokenizer != null ) {
35 + PlaceTokenizer<Place> zTokenizer = Cast.it( pDefaultTokenizer );
36 + if ( null != (sDefaultTokenizer = ProxyIdTokenizer.forceToIdTokenizer( PLACE_TOKENIZER_MAP.addTokenizer( zTokenizer ), zTokenizer )) ) {
37 + sDefaultPlace = sDefaultTokenizer.getPlace( null );
38 + }
39 + }
40 + }
41 +
42 + public static Place getDefaultPlace() {
43 + return sDefaultPlace;
44 + }
45 +
46 + private MessageUserSinkAccessor mMessageUserSinkAccessor;
47 +
48 + public PlaceRegistry( MessageUserSinkAccessor pMessageUserSinkAccessor ) {
49 + mMessageUserSinkAccessor = (pMessageUserSinkAccessor != null) ? pMessageUserSinkAccessor : DefaultMessageUserSink.FACTORY;
50 + }
51 +
52 + /**
53 + * Convert the full Token (URL Fragment) to a Place
54 + *
55 + * @param pToken the full URL Fragment
56 + *
57 + * @return a Place, generated by one of the Registered Tokenizers, or the Default if not found, or NULL if no Default!
58 + */
59 + @Override
60 + public Place getPlace( String pToken ) {
61 + PlaceIdAndData zIdAndData = PlaceIdAndData.fromString( pToken );
62 + if ( zIdAndData != null ) {
63 + String zPlaceId = zIdAndData.getPlaceId();
64 + PlaceTokenizer<? extends Place> zTokenizer = PLACE_TOKENIZER_MAP.getTokenizer( zPlaceId );
65 + if ( zTokenizer == null ) {
66 + mMessageUserSinkAccessor.getMessageUserSink().setErrorMessage( "Unable to determine 'view' from: " + zPlaceId );
67 + } else {
68 + Place zPlace;
69 +
70 + try {
71 + if ( null != (zPlace = zTokenizer.getPlace( zIdAndData.getData() )) ) {
72 + return zPlace;
73 + }
74 + }
75 + catch ( RuntimeException e ) {
76 + String zMessage = "Unable to create 'view' from: ";
77 + LOGGER.warn.log( e, zMessage, pToken );
78 + mMessageUserSinkAccessor.getMessageUserSink().setErrorMessage( zMessage + zPlaceId );
79 + return sDefaultPlace;
80 + }
81 + if ( zPlace == null ) {
82 + String zMessage = "No 'view' from: ";
83 + LOGGER.warn.log( zMessage, pToken );
84 + mMessageUserSinkAccessor.getMessageUserSink().setErrorMessage( zMessage + zPlaceId );
85 + }
86 + }
87 + }
88 + return sDefaultPlace;
89 + }
90 +
91 + /**
92 + * Convert a Place into the full Token (URL Fragment)
93 + *
94 + * @param pPlace place to convert (null ok)
95 + *
96 + * @return the full URL Fragment (null if Place was null & there was NO Default Tokenizer)
97 + */
98 + @Override
99 + public String getToken( Place pPlace ) {
100 + if ( pPlace == null ) {
101 + return null;
102 + }
103 + String zPlaceId = PlaceIdExtractor.getPlaceId( pPlace );
104 + if ( zPlaceId == null ) {
105 + mMessageUserSinkAccessor.getMessageUserSink().setErrorMessage( "Unable to determine 'view' from class: " + pPlace.getClass().getName() );
106 + return null;
107 + }
108 + PlaceTokenizer<Place> zTokenizer = PLACE_TOKENIZER_MAP.getTokenizer( zPlaceId );
109 + if ( zTokenizer == null ) {
110 + String zMessage = "No 'view' for '" + zPlaceId + "'";
111 + LOGGER.error.log( zMessage, ": ", pPlace.getClass().getName() );
112 + mMessageUserSinkAccessor.getMessageUserSink().setErrorMessage( zMessage );
113 + if ( null == sDefaultTokenizer ) {
114 + return null;
115 + }
116 + zTokenizer = sDefaultTokenizer;
117 + pPlace = sDefaultPlace;
118 + zPlaceId = sDefaultTokenizer.getPlaceId();
119 + }
120 + String zToken = null;
121 + try {
122 + zToken = zTokenizer.getToken( pPlace );
123 + }
124 + catch ( RuntimeException e ) {
125 + LOGGER.error.log( e, "Unable to 'tokenize' Place: ", pPlace.getClass(), " with PlaceId '", zPlaceId, "'" );
126 + }
127 + return new PlaceIdAndData( zPlaceId, zToken ).toString();
128 + }
129 +
130 + private static class ProxyIdTokenizer<T extends Place> extends IdTokenizer<T> {
131 + private PlaceTokenizer<T> mTokenizer;
132 +
133 + protected ProxyIdTokenizer( Object pPlaceId, PlaceTokenizer<T> pTokenizer ) {
134 + super( pPlaceId );
135 + mTokenizer = pTokenizer;
136 + }
137 +
138 + @Override
139 + public T getPlace( String pToken ) {
140 + return mTokenizer.getPlace( pToken );
141 + }
142 +
143 + @Override
144 + public String getToken( T pPlace ) {
145 + return mTokenizer.getToken( pPlace );
146 + }
147 +
148 + public static <T extends Place> IdTokenizer<T> forceToIdTokenizer( String pPlaceId, PlaceTokenizer<T> pTokenizer ) {
149 + return (pTokenizer instanceof IdTokenizer) ? (IdTokenizer<T>) pTokenizer : new ProxyIdTokenizer<T>( pPlaceId, pTokenizer );
150 + }
151 + }
152 +
153 + private static class PlaceTokenizerMap {
154 + private final Map<String, PlaceTokenizer<Place>> mPlaceIdToTokenizers = new HashMap<String, PlaceTokenizer<Place>>();
155 +
156 + /**
157 + * @param pTokenizer !null
158 + *
159 + * @return PlaceId
160 + */
161 + public String addTokenizer( PlaceTokenizer<? extends Place> pTokenizer ) {
162 + PlaceTokenizer<Place> zTokenizer = Cast.it( pTokenizer );
163 + String zPlaceId = PlaceIdExtractor.getPlaceId( zTokenizer );
164 + if ( null == zPlaceId ) {
165 + throw new IllegalStateException( "Unable to determine PlaceId from Tokenizer: " + pTokenizer.getClass().getName() );
166 + }
167 + PlaceTokenizer<Place> zPreviousTokenizer = mPlaceIdToTokenizers.put( zPlaceId, zTokenizer );
168 + if ( (zPreviousTokenizer != null) && (zPreviousTokenizer != zTokenizer) ) {
169 + throw new IllegalStateException( "Duplicate registration for PlaceId '':" + //
170 + "\n " + zPreviousTokenizer.getClass().getName() + //
171 + "\n " + pTokenizer.getClass().getName() );
172 + }
173 + return zPlaceId;
174 + }
175 +
176 + public PlaceTokenizer<Place> getTokenizer( String pPlaceId ) {
177 + return mPlaceIdToTokenizers.get( pPlaceId );
178 + }
179 + }
180 +
181 + private static class PlaceIdAndData {
182 + private String mPlaceId, mData;
183 +
184 + public PlaceIdAndData( String pPlaceId, String pData ) {
185 + mPlaceId = Confirm.significant( "PlaceID", pPlaceId );
186 + mData = ConstrainTo.significantOrNull( pData );
187 + }
188 +
189 + public String getPlaceId() {
190 + return mPlaceId;
191 + }
192 +
193 + public String getData() {
194 + return mData;
195 + }
196 +
197 + @Override
198 + public String toString() {
199 + return (mData == null) ? mPlaceId : mPlaceId + ':' + mData;
200 + }
201 +
202 + public static PlaceIdAndData fromString( String pURLfragment ) {
203 + if ( pURLfragment != null ) {
204 + if ( (pURLfragment = pURLfragment.trim()).length() != 0 ) {
205 + int at = pURLfragment.indexOf( ':' );
206 + if ( at == 0 ) {
207 + LOGGER.error.log( "Invalid URLfragment: '", pURLfragment, "'" );
208 + } else {
209 + String zData = null;
210 + String zPlaceID = pURLfragment;
211 + if ( at != -1 ) {
212 + zPlaceID = pURLfragment.substring( 0, at ).trim();
213 + zData = pURLfragment.substring( at + 1 );
214 + }
215 + return new PlaceIdAndData( zPlaceID, zData );
216 + }
217 + }
218 + }
219 + return null;
220 + }
221 + }
222 + }