| /* |
| * Copyright 2011 Marc Grue. |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or |
| * implied. |
| * |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| package org.apache.zest.sample.dcicargo.sample_a.communication.web.tracking; |
| |
| import java.text.SimpleDateFormat; |
| import java.util.Date; |
| import java.util.List; |
| import org.apache.wicket.ajax.AjaxRequestTarget; |
| import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior; |
| import org.apache.wicket.ajax.markup.html.form.AjaxFallbackButton; |
| import org.apache.wicket.markup.html.WebMarkupContainer; |
| import org.apache.wicket.markup.html.basic.Label; |
| import org.apache.wicket.markup.html.form.Form; |
| import org.apache.wicket.markup.html.form.TextField; |
| import org.apache.wicket.markup.html.panel.FeedbackPanel; |
| import org.apache.wicket.markup.html.panel.Fragment; |
| import org.apache.wicket.model.IModel; |
| import org.apache.wicket.model.Model; |
| import org.apache.wicket.model.PropertyModel; |
| import org.apache.wicket.model.StringResourceModel; |
| import org.apache.wicket.util.value.ValueMap; |
| import org.apache.zest.api.unitofwork.NoSuchEntityException; |
| import org.apache.zest.sample.dcicargo.sample_a.communication.query.CommonQueries; |
| import org.apache.zest.sample.dcicargo.sample_a.communication.query.TrackingQueries; |
| import org.apache.zest.sample.dcicargo.sample_a.communication.query.dto.CargoDTO; |
| import org.apache.zest.sample.dcicargo.sample_a.communication.web.BasePage; |
| import org.apache.zest.sample.dcicargo.sample_a.data.shipping.handling.HandlingEvent; |
| import org.apache.zest.sample.dcicargo.sample_a.data.shipping.handling.HandlingEventType; |
| import org.apache.zest.sample.dcicargo.sample_a.infrastructure.wicket.form.AbstractForm; |
| import org.apache.zest.sample.dcicargo.sample_a.infrastructure.wicket.form.SelectorInForm; |
| |
| /** |
| * Track a cargo |
| * |
| * For convenience during testing, routed (non-received) cargos can be chosen from the dropdown list. |
| */ |
| public class TrackCargoPage extends BasePage |
| { |
| public TrackCargoPage() |
| { |
| super( "tracking" ); // Selects the Tracking tab |
| add( new TrackingForm() ); |
| } |
| |
| private final class TrackingForm extends AbstractForm<Void> |
| { |
| private String trackingId; |
| private String selectedTrackingId; // Set by Wicket property resolver |
| |
| private TextField<String> trackingIdInput; |
| private SelectorInForm selectedTrackingIdSelector; |
| |
| private FeedbackPanel feedback = new FeedbackPanel( "feedback" ); |
| private Fragment statusFragment = new Fragment( "status", "statusFragment", new WebMarkupContainer( "mock" ) ); |
| |
| private TrackingForm() |
| { |
| // Manual input |
| trackingIdInput = new TextField<String>( "trackingId", new PropertyModel<String>( this, "trackingId" ) ); |
| add( trackingIdInput.setRequired( true ).setOutputMarkupId( true ) ); |
| |
| // Submit button |
| add( new AjaxFallbackButton( "track", this ) |
| { |
| @Override |
| protected void onSubmit( AjaxRequestTarget target, Form<?> form ) |
| { |
| updateStatusFragment( target ); |
| } |
| |
| @Override |
| protected void onError( final AjaxRequestTarget target, Form<?> form ) |
| { |
| target.add( feedback, trackingIdInput, selectedTrackingIdSelector, statusFragment.setVisible( false ) ); |
| } |
| } ); |
| |
| // Drop down selector (for convenience when testing) |
| List<String> cargoIds = new TrackingQueries().routedCargos(); |
| add( selectedTrackingIdSelector = new SelectorInForm( |
| "selectedTrackingId", "Selected Tracking id", cargoIds, this ) ); |
| selectedTrackingIdSelector.add( new AjaxFormComponentUpdatingBehavior( "onchange" ) |
| { |
| @Override |
| protected void onUpdate( AjaxRequestTarget target ) |
| { |
| trackingId = selectedTrackingId; |
| updateStatusFragment( target ); |
| } |
| } ); |
| |
| add( feedback.setOutputMarkupId( true ) ); |
| add( statusFragment.setOutputMarkupId( true ).setOutputMarkupPlaceholderTag( true ).setVisible( false ) ); |
| } |
| |
| private void updateStatusFragment( final AjaxRequestTarget target ) |
| { |
| try |
| { |
| IModel<CargoDTO> cargoModel = new CommonQueries().cargo( trackingId ); |
| statusFragment = (Fragment) statusFragment.replaceWith( new StatusFragment( cargoModel, false ) ); |
| target.add( feedback, trackingIdInput, selectedTrackingIdSelector, statusFragment.setVisible( true ) ); |
| } |
| catch( NoSuchEntityException e ) |
| { |
| e.printStackTrace(); |
| error( "Cargo '" + trackingId + "' wasn't found in the system. Please check the tracking number." ); |
| target.add( feedback, trackingIdInput, selectedTrackingIdSelector, statusFragment.setVisible( false ) ); |
| } |
| catch( Exception e ) |
| { |
| e.printStackTrace(); |
| error( "Problem retrieving status for cargo '" + trackingId + "': " + e.getMessage() ); |
| target.add( feedback, trackingIdInput, selectedTrackingIdSelector, statusFragment.setVisible( false ) ); |
| } |
| } |
| |
| private class StatusFragment extends Fragment |
| { |
| public StatusFragment( IModel<CargoDTO> cargoModel, Boolean visible ) |
| { |
| super( "status", "statusFragment", TrackingForm.this ); |
| setVisible( visible ); |
| |
| CargoDTO cargo = cargoModel.getObject(); |
| |
| // Status ---------------------------------------------------------------------- |
| ValueMap map = new ValueMap(); |
| map.put( "status", cargo.delivery().get().transportStatus().get().name() ); |
| map.put( "trackingId", trackingId ); |
| HandlingEvent lastEvent = cargo.delivery().get().lastHandlingEvent().get(); |
| if( lastEvent != null ) |
| { |
| String voyageString = lastEvent.voyage().get() != null ? |
| lastEvent.voyage() |
| .get() |
| .voyageNumber() |
| .get() |
| .number() |
| .get() : "UNKNOWN_VOYAGE"; |
| map.put( "voyage", voyageString ); |
| map.put( "location", lastEvent.location().get().getString() ); |
| } |
| else |
| { |
| map.put( "voyage", "UNKNOWN_VOYAGE" ); |
| map.put( "location", cargo.origin().get().getString() ); |
| } |
| add( new Label( "transportStatus", new StringResourceModel( |
| "transportStatus.${status}", this, new Model<ValueMap>( map ) ) ) ); |
| |
| // ETA ---------------------------------------------------------------------- |
| String destination = cargo.routeSpecification().get().destination().get().getString(); |
| Date eta = cargo.delivery().get().eta().get(); |
| String etaString = eta == null ? "?" : new SimpleDateFormat( "yyyy-MM-dd" ).format( eta ); |
| add( new Label( "eta", new StringResourceModel( |
| "eta", this, null, Model.of( destination ), Model.of( etaString ) ) ) ); |
| |
| // Warning/Notifier ---------------------------------------------------------------------- |
| add( new WebMarkupContainer( "isMisdirected" ).setVisible( cargo.delivery() |
| .get() |
| .isMisdirected() |
| .get() ) ); |
| add( new WebMarkupContainer( "isClaimed" ).setVisible( |
| !cargo.delivery().get().isMisdirected().get() |
| && cargo.delivery().get().isUnloadedAtDestination().get() |
| && lastEvent != null |
| && lastEvent.handlingEventType().get() == HandlingEventType.CLAIM |
| ) ); |
| |
| // Handling history ---------------------------------------------------------------------- |
| if( cargo.delivery().get().lastHandlingEvent().get() == null ) |
| { |
| add( new Label( "handlingHistoryPanel" ) ); |
| } |
| else |
| { |
| add( new HandlingHistoryPanel( "handlingHistoryPanel", cargoModel, trackingId ) ); |
| } |
| } |
| } |
| } |
| } |