1 // SECTION-START[License Header]
2 // <editor-fold defaultstate="collapsed" desc=" Generated License ">
3 /*
4 * Copyright (c) 2010 The JOMC Project
5 * Copyright (c) 2005 Christian Schulte <schulte2005@users.sourceforge.net>
6 * All rights reserved.
7 *
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
10 * are met:
11 *
12 * o Redistributions of source code must retain the above copyright
13 * notice, this list of conditions and the following disclaimer.
14 *
15 * o Redistributions in binary form must reproduce the above copyright
16 * notice, this list of conditions and the following disclaimer in
17 * the documentation and/or other materials provided with the
18 * distribution.
19 *
20 * THIS SOFTWARE IS PROVIDED BY THE JOMC PROJECT AND CONTRIBUTORS "AS IS"
21 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
22 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
23 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE JOMC PROJECT OR
24 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
25 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
26 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
27 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
28 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
29 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
30 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31 *
32 * $Id: DefaultSequenceMapper.java 2247 2010-06-29 08:01:42Z schulte2005 $
33 *
34 */
35 // </editor-fold>
36 // SECTION-END
37 package org.jomc.sequences.ri;
38
39 import java.lang.reflect.Field;
40 import java.security.AccessController;
41 import java.security.PrivilegedAction;
42 import java.util.Calendar;
43 import java.util.TimeZone;
44 import org.jomc.sequences.Sequence;
45 import org.jomc.sequences.SequencesSystemException;
46 import org.jomc.sequences.model.SequenceType;
47
48 // SECTION-START[Documentation]
49 // <editor-fold defaultstate="collapsed" desc=" Generated Documentation ">
50 /**
51 * SequenceMapper reference implementation.
52 * <p><b>Specifications</b><ul>
53 * <li>{@code 'org.jomc.sequences.ri.SequenceMapper'} {@code (org.jomc.sequences.ri.SequenceMapper)} {@code 1.0} {@code Multiton}</li>
54 * </ul></p>
55 * <p><b>Dependencies</b><ul>
56 * <li>"{@link #getLocale Locale}"<blockquote>
57 * Dependency on {@code 'java.util.Locale'} {@code (java.util.Locale)} at specification level 1.1 bound to an instance.</blockquote></li>
58 * </ul></p>
59 * <p><b>Messages</b><ul>
60 * <li>"{@link #getIllegalArgumentMessage illegalArgumentMessage}"<table>
61 * <tr><td valign="top">English:</td><td valign="top"><pre>Illegal value ''{1}'' for argument ''{0}''.</pre></td></tr>
62 * <tr><td valign="top">Deutsch:</td><td valign="top"><pre>Ungültiger Wert ''{1}'' für Parameter ''{0}''.</pre></td></tr>
63 * </table>
64 * <li>"{@link #getUnhandledExceptionMessage unhandledExceptionMessage}"<table>
65 * <tr><td valign="top">English:</td><td valign="top"><pre>Unhandled exception.</pre></td></tr>
66 * <tr><td valign="top">Deutsch:</td><td valign="top"><pre>Unbehandelte Ausnahme.</pre></td></tr>
67 * </table>
68 * </ul></p>
69 *
70 * @author <a href="mailto:schulte2005@users.sourceforge.net">Christian Schulte</a> 1.0
71 * @version $Id: DefaultSequenceMapper.java 2247 2010-06-29 08:01:42Z schulte2005 $
72 */
73 // </editor-fold>
74 // SECTION-END
75 // SECTION-START[Annotations]
76 // <editor-fold defaultstate="collapsed" desc=" Generated Annotations ">
77 @javax.annotation.Generated( value = "org.jomc.tools.SourceFileProcessor 1.0", comments = "See http://jomc.sourceforge.net/jomc/1.0/jomc-tools" )
78 // </editor-fold>
79 // SECTION-END
80 public class DefaultSequenceMapper implements SequenceMapper
81 {
82 // SECTION-START[SequenceMapper]
83
84 public Sequence map( final SequenceType sequenceType, final Sequence sequence )
85 {
86 if ( sequenceType == null )
87 {
88 throw new SequencesSystemException( this.getIllegalArgumentMessage(
89 this.getLocale(), "sequenceType", null ) );
90
91 }
92 if ( sequence == null )
93 {
94 throw new SequencesSystemException( this.getIllegalArgumentMessage( this.getLocale(), "sequence", null ) );
95 }
96
97 sequence.setIncrement( sequenceType.getIncrement() );
98 sequence.setMaximum( sequenceType.getMaximum() );
99 sequence.setMinimum( sequenceType.getMinimum() );
100 sequence.setName( sequenceType.getName() );
101 sequence.setValue( sequenceType.getValue() );
102 this.injectRevision( sequence, sequenceType.getRevision() );
103 this.injectDate( sequence, sequenceType.getJpaDate().getTimeInMillis() );
104 return sequence;
105 }
106
107 public SequenceType map( final Sequence sequence, final SequenceType sequenceType )
108 {
109 if ( sequence == null )
110 {
111 throw new SequencesSystemException( this.getIllegalArgumentMessage( this.getLocale(), "sequence", null ) );
112 }
113 if ( sequenceType == null )
114 {
115 throw new SequencesSystemException( this.getIllegalArgumentMessage(
116 this.getLocale(), "sequenceType", null ) );
117
118 }
119
120 sequenceType.setIncrement( sequence.getIncrement() );
121 sequenceType.setMaximum( sequence.getMaximum() );
122 sequenceType.setMinimum( sequence.getMinimum() );
123 sequenceType.setName( sequence.getName() );
124 sequenceType.setValue( sequence.getValue() );
125 sequenceType.setRevision( sequence.getRevision() );
126
127 final Calendar c = Calendar.getInstance();
128 c.setTimeZone( TimeZone.getTimeZone( "UTC" ) );
129 c.setTimeInMillis( sequence.getDate() );
130 sequenceType.setJpaDate( c );
131
132 return sequenceType;
133 }
134
135 // SECTION-END
136 // SECTION-START[DefaultSequenceMapper]
137 /**
138 * Sets the value of property {@code revision} of a given sequence using reflection.
139 *
140 * @param s The sequence to update.
141 * @param value The new value for property {@code revision}.
142 *
143 * @throws SequencesSystemException if injecting {@code value} fails unexpectedly.
144 */
145 protected void injectRevision( final Sequence s, final long value )
146 {
147 this.injectFieldValue( s, "revision", Long.valueOf( value ) );
148 }
149
150 /**
151 * Sets the value of property {@code date} of a given sequence using reflection.
152 *
153 * @param s The sequence to update.
154 * @param value The new value for property {@code date}.
155 *
156 * @throws SequencesSystemException if injecting {@code value} fails unexpectedly.
157 */
158 protected void injectDate( final Sequence s, final long value )
159 {
160 this.injectFieldValue( s, "date", Long.valueOf( value ) );
161 }
162
163 /**
164 * Sets the value of a field of a given object using reflection.
165 *
166 * @param object The object to update.
167 * @param fieldName The name of the field to update.
168 * @param value The new value for field {@code fieldName}.
169 *
170 * @throws SequencesSystemException if setting {@code value} fails unexpectedly.
171 */
172 protected void injectFieldValue( final Object object, final String fieldName, final Object value )
173 {
174 AccessController.doPrivileged( new PrivilegedAction<Object>()
175 {
176
177 public Object run()
178 {
179 Field field = null;
180
181 try
182 {
183 field = object.getClass().getDeclaredField( fieldName );
184 field.setAccessible( true );
185 field.set( object, value );
186 field.setAccessible( false );
187 return null;
188 }
189 catch ( final Exception e )
190 {
191 throw new SequencesSystemException( getUnhandledExceptionMessage( getLocale() ), e );
192 }
193 }
194
195 } );
196 }
197
198 // SECTION-END
199 // SECTION-START[Constructors]
200 // <editor-fold defaultstate="collapsed" desc=" Generated Constructors ">
201
202 /** Creates a new {@code DefaultSequenceMapper} instance. */
203 @javax.annotation.Generated( value = "org.jomc.tools.SourceFileProcessor 1.0", comments = "See http://jomc.sourceforge.net/jomc/1.0/jomc-tools" )
204 public DefaultSequenceMapper()
205 {
206 // SECTION-START[Default Constructor]
207 super();
208 // SECTION-END
209 }
210 // </editor-fold>
211 // SECTION-END
212 // SECTION-START[Dependencies]
213 // <editor-fold defaultstate="collapsed" desc=" Generated Dependencies ">
214
215 /**
216 * Gets the {@code Locale} dependency.
217 * <p>This method returns the {@code 'default'} object of the {@code 'java.util.Locale'} {@code (java.util.Locale)} specification at specification level 1.1.</p>
218 * <p>That specification does not apply to any scope. A new object is returned whenever requested and bound to this instance.</p>
219 * @return The {@code Locale} dependency.
220 * @throws org.jomc.ObjectManagementException if getting the dependency instance fails.
221 */
222 @javax.annotation.Generated( value = "org.jomc.tools.SourceFileProcessor 1.0", comments = "See http://jomc.sourceforge.net/jomc/1.0/jomc-tools" )
223 private java.util.Locale getLocale()
224 {
225 final java.util.Locale _d = (java.util.Locale) org.jomc.ObjectManagerFactory.getObjectManager( this.getClass().getClassLoader() ).getDependency( this, "Locale" );
226 assert _d != null : "'Locale' dependency not found.";
227 return _d;
228 }
229 // </editor-fold>
230 // SECTION-END
231 // SECTION-START[Properties]
232 // SECTION-END
233 // SECTION-START[Messages]
234 // <editor-fold defaultstate="collapsed" desc=" Generated Messages ">
235
236 /**
237 * Gets the text of the {@code illegalArgumentMessage} message.
238 * <p><b>Templates</b><br/><table>
239 * <tr><td valign="top">English:</td><td valign="top"><pre>Illegal value ''{1}'' for argument ''{0}''.</pre></td></tr>
240 * <tr><td valign="top">Deutsch:</td><td valign="top"><pre>Ungültiger Wert ''{1}'' für Parameter ''{0}''.</pre></td></tr>
241 * </table></p>
242 * @param locale The locale of the message to return.
243 * @param argumentName Format argument.
244 * @param argumentValue Format argument.
245 * @return The text of the {@code illegalArgumentMessage} message.
246 *
247 * @throws org.jomc.ObjectManagementException if getting the message instance fails.
248 */
249 @javax.annotation.Generated( value = "org.jomc.tools.SourceFileProcessor 1.0", comments = "See http://jomc.sourceforge.net/jomc/1.0/jomc-tools" )
250 private String getIllegalArgumentMessage( final java.util.Locale locale, final java.lang.String argumentName, final java.lang.String argumentValue )
251 {
252 final String _m = org.jomc.ObjectManagerFactory.getObjectManager( this.getClass().getClassLoader() ).getMessage( this, "illegalArgumentMessage", locale, argumentName, argumentValue );
253 assert _m != null : "'illegalArgumentMessage' message not found.";
254 return _m;
255 }
256
257 /**
258 * Gets the text of the {@code unhandledExceptionMessage} message.
259 * <p><b>Templates</b><br/><table>
260 * <tr><td valign="top">English:</td><td valign="top"><pre>Unhandled exception.</pre></td></tr>
261 * <tr><td valign="top">Deutsch:</td><td valign="top"><pre>Unbehandelte Ausnahme.</pre></td></tr>
262 * </table></p>
263 * @param locale The locale of the message to return.
264 * @return The text of the {@code unhandledExceptionMessage} message.
265 *
266 * @throws org.jomc.ObjectManagementException if getting the message instance fails.
267 */
268 @javax.annotation.Generated( value = "org.jomc.tools.SourceFileProcessor 1.0", comments = "See http://jomc.sourceforge.net/jomc/1.0/jomc-tools" )
269 private String getUnhandledExceptionMessage( final java.util.Locale locale )
270 {
271 final String _m = org.jomc.ObjectManagerFactory.getObjectManager( this.getClass().getClassLoader() ).getMessage( this, "unhandledExceptionMessage", locale );
272 assert _m != null : "'unhandledExceptionMessage' message not found.";
273 return _m;
274 }
275 // </editor-fold>
276 // SECTION-END
277 }