Compare commits

...

4 Commits

Author SHA1 Message Date
Terekhin Alexander 24f177cf15 Json rest API test passed 5 years ago
Terekhin Alexander ba645884d6 Json rest API tests 5 years ago
Terekhin Alexander 7aa3e4692b Json rest API (untested) 5 years ago
Terekhin Alexander 947c13db1a fix BigInteger bug 5 years ago
  1. 26
      pom.xml
  2. 3
      src/main/java/me/bearns/fias/domain/Addrobj.java
  3. 7
      src/main/java/me/bearns/fias/domain/FiasVersion.java
  4. 52
      src/main/java/me/bearns/fias/service/OnlineVersionImpl.java
  5. 155
      src/main/java/me/bearns/fias/service/SOAPClient.java
  6. 46
      src/main/java/me/bearns/fias/xml/DecimalAdapter.java
  7. 2
      src/test/java/me/bearns/fias/DownloaderTest.java
  8. 59
      src/test/java/me/bearns/fias/OnlineVersionsTest.java

@ -72,32 +72,6 @@
<build>
<plugins>
<plugin>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-codegen-plugin</artifactId>
<version>3.3.6</version>
<executions>
<execution>
<id>generate-sources</id>
<phase>generate-sources</phase>
<configuration>
<sourceRoot>${project.build.directory}/generated-sources/cxf</sourceRoot>
<wsdlOptions>
<wsdlOption>
<extraargs>
<extraarg>-p</extraarg>
<extraarg>ru.nalog.fias</extraarg>
</extraargs>
<wsdl>${basedir}/src/main/resources/DownloadService.wsdl</wsdl>
</wsdlOption>
</wsdlOptions>
</configuration>
<goals>
<goal>wsdl2java</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>

@ -3,6 +3,7 @@ package me.bearns.fias.domain;
import lombok.EqualsAndHashCode;
import lombok.ToString;
import me.bearns.fias.xml.DecimalAdapter;
import javax.persistence.*;
import javax.xml.bind.annotation.*;
@ -144,6 +145,8 @@ public class Addrobj implements Serializable {
@XmlAttribute(name = "OPERSTATUS", required = true)
protected BigInteger operstatus;
//FIAS bug, attribute is empty
@XmlJavaTypeAdapter(DecimalAdapter.class)
@XmlAttribute(name = "CURRSTATUS", required = true)
protected BigInteger currstatus;

@ -1,5 +1,7 @@
package me.bearns.fias.domain;
import com.fasterxml.jackson.annotation.JsonAlias;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import lombok.ToString;
import javax.persistence.Column;
@ -8,6 +10,7 @@ import javax.persistence.Entity;
import javax.persistence.Table;
@ToString
@JsonIgnoreProperties(ignoreUnknown = true)
@Entity
@Table(name = "version")
public class FiasVersion {
@ -24,15 +27,19 @@ public class FiasVersion {
@Id
@Column(name = "version_id")
@JsonAlias("VersionId")
protected Long versionId;
@Column(name = "version_txt")
@JsonAlias("TextVersion")
protected String textVersion;
@Column(name = "xml_url")
@JsonAlias("FiasCompleteXmlUrl")
protected String fiasCompleteXmlUrl;
@Column(name = "delta_xml_url")
@JsonAlias("FiasDeltaXmlUrl")
protected String fiasDeltaXmlUrl;
@Column(name = "regions")

@ -0,0 +1,52 @@
package me.bearns.fias.service;
import lombok.AllArgsConstructor;
import me.bearns.fias.domain.FiasVersion;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
//@AllArgsConstructor
@Component
public class OnlineVersionImpl implements OnlineVersion{
private static final String GET_ALL_FILE_INFO = "https://fias.nalog.ru/WebServices/Public/GetAllDownloadFileInfo";
private static final String GET_LAST_FILE_INFO = "https://fias.nalog.ru/WebServices/Public/GetLastDownloadFileInfo";
RestTemplate client = new RestTemplate();
@Override
public long getLastVersionId() {
final FiasVersion version = client.getForObject(GET_LAST_FILE_INFO, FiasVersion.class);
if(version != null) return version.getVersionId();
return 0; //todo
}
@Override
public List<FiasVersion> getVersionsAfter(long version) {
final FiasVersion[] versions = client.getForObject(GET_ALL_FILE_INFO, FiasVersion[].class);
if(versions != null) {
return Arrays.stream(versions).filter(v -> v.getVersionId() > version).collect(Collectors.toList());
}
return null; //todo
}
@Override
public List<FiasVersion> getLastVersion() {
List<FiasVersion> versions = new ArrayList<>();
versions.add(client.getForObject(GET_LAST_FILE_INFO, FiasVersion.class));
return versions; //todo
}
}

@ -1,155 +0,0 @@
package me.bearns.fias.service;
import lombok.extern.slf4j.Slf4j;
import me.bearns.fias.domain.FiasVersion;
import org.springframework.stereotype.Component;
import ru.nalog.fias.ArrayOfDownloadFileInfo;
import ru.nalog.fias.DownloadFileInfo;
import ru.nalog.fias.IDownloadService;
import ru.nalog.fias.IDownloadService_Service;
import sun.net.www.protocol.http.HttpURLConnection;
import javax.xml.ws.BindingProvider;
import java.io.File;
import java.io.InputStream;
import java.net.URL;
import java.nio.file.Files;
import java.nio.file.StandardCopyOption;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import static javax.xml.ws.BindingProvider.ENDPOINT_ADDRESS_PROPERTY;
@Slf4j
@Component
public class SOAPClient implements OnlineVersion {
private final static String RESOURCE_WSDL = "/DownloadService.wsdl";
IDownloadService downloadService;
public SOAPClient() {
log.info("Init SOAP client");
try (InputStream stream = getClass().getResourceAsStream(RESOURCE_WSDL)) {
final File tempFile = File.createTempFile(RESOURCE_WSDL, "tmp");
tempFile.deleteOnExit();
if(Files.copy(stream, tempFile.toPath(), StandardCopyOption.REPLACE_EXISTING) > 0) {
//copy some bytes ok
log.debug("WSDL saved to tmp file, try to init service");
//Init soap client
IDownloadService_Service service = new IDownloadService_Service(tempFile.toURI().toURL());
downloadService = service.getBasicHttpBindingIDownloadService();
log.debug("Service ok, enable redirect hook");
setRedirect(downloadService);
log.info("SOAP client init completed");
}
}catch (Exception e) {
log.error("Caught exception while init SOAP client");
}
}
@Override
public long getLastVersionId() {
FiasVersion last = getLast();
if(last != null) return last.getVersionId();
return 0;
}
@Override
public List<FiasVersion> getVersionsAfter(long version) {
final ArrayOfDownloadFileInfo allDownloadFileInfo = downloadService.getAllDownloadFileInfo();
if(allDownloadFileInfo != null) {
final List<DownloadFileInfo> fileInfos = allDownloadFileInfo.getDownloadFileInfo();
if(fileInfos != null) {
return fileInfos.stream()
.filter(f -> f.getVersionId() > version)
.map(f -> new FiasVersion(f.getVersionId(),f.getTextVersion(),f.getFiasCompleteXmlUrl(),f.getFiasDeltaXmlUrl()))
.collect(Collectors.toList());
}
}
return null;
}
@Override
public List<FiasVersion> getLastVersion() {
final FiasVersion last = getLast();
if(last != null) {
final ArrayList<FiasVersion> list = new ArrayList<>(1);
list.add(last);
return list;
}
return null;
}
private FiasVersion getLast() {
DownloadFileInfo fileInfo = downloadService.getLastDownloadFileInfo();
if(fileInfo !=null) {
//TODO check null in getVersionId()
return new FiasVersion(fileInfo.getVersionId(), fileInfo.getTextVersion(), fileInfo.getFiasCompleteXmlUrl(), fileInfo.getFiasDeltaXmlUrl());
}
return null;
}
private static void setRedirect(final Object bindingProvider) {
try {
if(bindingProvider instanceof BindingProvider) {
Map<String, Object> requestContext = ((BindingProvider) bindingProvider).getRequestContext();
Object endpoint = requestContext.get(ENDPOINT_ADDRESS_PROPERTY);
if(endpoint instanceof String) {
final URL url = new URL((String) endpoint);
final HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setInstanceFollowRedirects(true);
connection.setRequestMethod("POST");
connection.setRequestProperty("Content-Type", "text/html; charset='UTF-8'");
connection.setDoOutput(true);
final int responseCode = connection.getResponseCode();
if (responseCode >= 300 && responseCode < 400) {
final String redirect = connection.getHeaderField("location");
requestContext.put(ENDPOINT_ADDRESS_PROPERTY, redirect);
}
}
}
} catch(final Exception e) {
log.error("Endpoint redirect not set");
}
}
}

@ -0,0 +1,46 @@
package me.bearns.fias.xml;
import lombok.extern.slf4j.Slf4j;
import javax.xml.bind.ValidationEventHandler;
import javax.xml.bind.annotation.adapters.XmlAdapter;
import java.math.BigInteger;
@Slf4j
public class DecimalAdapter extends XmlAdapter<String, BigInteger> {
/**
* Convert a value type to a bound type.
*
* @param v The value to be converted. Can be null.
* @throws Exception if there's an error during the conversion. The caller is responsible for
* reporting the error to the user through {@link ValidationEventHandler}.
*/
@Override
public BigInteger unmarshal(String v) throws Exception {
if (v == null) return null;
if (v.isEmpty()) {
log.trace("BigInteger bug bypassed");
return null;
}
if (!v.matches("^\\d+$")) return null;
return new BigInteger(v);
}
/**
* Convert a bound type to a value type.
*
* @param v The value to be convereted. Can be null.
* @throws Exception if there's an error during the conversion. The caller is responsible for
* reporting the error to the user through {@link ValidationEventHandler}.
*/
@Override
public String marshal(BigInteger v) throws Exception {
//TODO BigInteger marshaling impl
//throw new Exception("Marshalling not implemented");
return v == null ? null : v.toString();
}
}

@ -7,6 +7,7 @@ import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.ActiveProfiles;
import org.springframework.test.context.junit4.SpringRunner;
import java.io.File;
@ -17,6 +18,7 @@ import java.util.concurrent.CompletableFuture;
import java.util.stream.Collectors;
import java.util.stream.Stream;
@ActiveProfiles("test")
@RunWith(SpringRunner.class)
@SpringBootTest
public class DownloaderTest {

@ -0,0 +1,59 @@
package me.bearns.fias;
import me.bearns.fias.domain.FiasVersion;
import me.bearns.fias.service.OnlineVersion;
import org.junit.Ignore;
import org.junit.runner.RunWith;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.ActiveProfiles;
import org.springframework.test.context.junit4.SpringRunner;
import java.util.List;
@ActiveProfiles("test")
@RunWith(SpringRunner.class)
@SpringBootTest
public class OnlineVersionsTest {
@Autowired
OnlineVersion client;
@Ignore
@Test
public void getLastTest(){
final long lastVersionId = client.getLastVersionId();
assert lastVersionId > 0;
}
@Test
public void getAfterTest(){
final long count = 14;
final long lastVersionId = client.getLastVersionId();
assert lastVersionId > 0;
final long fromVersion = lastVersionId - count;
final List<FiasVersion> versions = client.getVersionsAfter(fromVersion);
assert versions != null;
assert versions.size() <= count;
}
@Test
public void getLastObjTest(){
final List<FiasVersion> versions = client.getLastVersion();
assert versions != null;
assert versions.size() == 1;
assert versions.get(0) != null;
}
}
Loading…
Cancel
Save