/*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
* Copyright (c) 2013, MPL CodeInside http://codeinside.ru
*/
package ru.codeinside.gws3564c.enclosure.grp;
import ru.codeinside.gws.api.ExchangeContext;
import ru.grp.*;
import javax.xml.datatype.XMLGregorianCalendar;
import java.math.BigDecimal;
import java.util.Collection;
import java.util.LinkedList;
import java.util.List;
import static ru.grp.RequestGRP.Request.RequiredData;
import static ru.grp.RequestGRP.Request.RequiredData.RequiredDataDocument.ContentDocument;
import static ru.grp.TRequiredObject.Parcel.Description;
/**
* Строит запрос для получения справки о содержании правоустанавливающего документа
*/
public class DocumentContentEnclosureBuilder extends EnclosureGRPBuilder {
public DocumentContentEnclosureBuilder(ExchangeContext ctx) {
super(ctx);
}
@Override
protected RequiredData createRequiredData() {
final RequiredData requiredData = new RequiredData();
final RequiredData.RequiredDataDocument requiredDataDocument = new RequiredData.RequiredDataDocument();
requiredData.setRequiredDataDocument(requiredDataDocument);
final ContentDocument contentDocument = getContentDocumentFromContext("contentDocument");
requiredDataDocument.setContentDocument(contentDocument);
final ContentDocument.Objects objects = new ContentDocument.Objects();
contentDocument.setObjects(objects);
if (ctx.getLongFromContext("parcels") > 0L) {
objects.getObject().addAll(getParcelsObjectsFromContext());
} else {
objects.getObject().addAll(getObjectsFromContext());
}
return requiredData;
}
private ContentDocument getContentDocumentFromContext(String prefix) {
ContentDocument contentDocument = new ContentDocument();
contentDocument.setName(ctx.getStrFromContext(prefix + "PDocumentName"));
contentDocument.setCodeDocument(ctx.getStrFromContext(prefix + "PDocumentCode"));
contentDocument.setSeries(ctx.getStrFromContext(prefix + "PDocumentSeries"));
contentDocument.setNumber(ctx.getStrFromContext(prefix + "PDocumentNumber"));
XMLGregorianCalendar date = date(ctx.getDateFromContext(prefix + "PDocumentDate"));
contentDocument.setDate(date);
contentDocument.setIssueOrgan(ctx.getStrFromContext(prefix + "PDocumentIssueOrgan"));
return contentDocument;
}
protected Collection<TRequiredObject> getObjectsFromContext() {
List<TRequiredObject> list = new LinkedList<TRequiredObject>();
final Long countObjects = ctx.getLongFromContext("objects");
for (long idx = 1; idx <= countObjects; idx++) {
TRequiredObject object = new TRequiredObject();
object.setObject(getObjectFromContext("_" + idx));
list.add(object);
}
return list;
}
private TRequiredObject.Object getObjectFromContext(String suffix) {
final TRequiredObject.Object object = new TRequiredObject.Object();
object.setLocation(createLocation("objectLocation", suffix));
object.setArea(getAreaFromContext("object", suffix));
object.setCadastralNumbers(getObjectCadastralNumbers(suffix));
object.setObjKind(getObjectKindFromContext(suffix));
object.setDopInfo(new TDopInfo());
return object;
}
private TRequiredObject.Object.CadastralNumbers getObjectCadastralNumbers(String suffix) {
String cadastralNumber = ctx.getStrFromContext("objectCadastralNumber" + suffix);
if (cadastralNumber == null || "".equals(cadastralNumber)) return null;
final TRequiredObject.Object.CadastralNumbers cadastralNumbers = new TRequiredObject.Object.CadastralNumbers();
cadastralNumbers.setCadastralNumber(cadastralNumber);
return cadastralNumbers;
}
private TExtractObjectType getObjectKindFromContext(String suffix) {
final TExtractObjectType objectType = new TExtractObjectType();
ObjectKind kind = ObjectKind.valueOf(ctx.getStrFromContext("objectKind" + suffix));
switch (kind) {
case ROOM:
TExtractRoomRequired room = new TExtractRoomRequired();
fillRoomDataFromContext(room, suffix);
objectType.setRoom(room);
break;
case BUILDING:
TExtractBuildingRequired building = new TExtractBuildingRequired();
fillBuildingFromContext(building, suffix);
objectType.setBuilding(building);
break;
case OTHER:
objectType.setObjKind(ctx.getStrFromContext("objectOtherKind" + suffix));
}
return objectType;
}
enum ObjectKind {
ROOM, BUILDING, OTHER
}
protected List<TRequiredObject> getParcelsObjectsFromContext() {
final LinkedList<TRequiredObject> objects = new LinkedList<TRequiredObject>();
final Long countObjects = ctx.getLongFromContext("parcels");
for (long idx = 1; idx <= countObjects; idx++) {
TRequiredObject object = new TRequiredObject();
object.setParcel(getParcelFromContext("_" + idx));
objects.add(object);
}
return objects;
}
public TRequiredObject.Parcel getParcelFromContext(String suffix) {
final TRequiredObject.Parcel parcel = new TRequiredObject.Parcel();
final Description description = new Description();
description.setAddress(getParcelAddressFromContext(suffix));
parcel.setDescription(description);
return parcel;
}
private Description.Address getParcelAddressFromContext(String suffix) {
final Description.Address address = new Description.Address();
address.setAreas(getAreaFromContext("parcel", suffix));
address.setCadastralNumber(ctx.getStrFromContext("parcelCadastralNumber" + suffix));
address.setLocation(createLocation("parcelLocation", suffix));
return address;
}
private TArea getAreaFromContext(final String prefix, String suffix) {
final TArea area = new TArea();
area.setUnit(ctx.getStrFromContext(prefix + "AreaUnit" + suffix));
area.setValue(BigDecimal.valueOf(getDoubleFromContext(prefix + "AreaValue" + suffix)));
return area;
}
private double getDoubleFromContext(String varName) {
String stringValue = ctx.getStrFromContext(varName).replace(',', '.');
return Double.parseDouble(stringValue);
}
}