Subversion Repository Public Repository

litesoft

Diff Revisions 949 vs 950 for /trunk/GWT_Sandbox/MultiModule/common/src/org/litesoft/sandbox/infrastructure/client/PlaceRegistry.java

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