USRE-86 merge to one project
This commit is contained in:
commit
7d1e3d3f08
|
@ -6,7 +6,11 @@
|
||||||
<sourceOutputDir name="target/generated-sources/annotations" />
|
<sourceOutputDir name="target/generated-sources/annotations" />
|
||||||
<sourceTestOutputDir name="target/generated-test-sources/test-annotations" />
|
<sourceTestOutputDir name="target/generated-test-sources/test-annotations" />
|
||||||
<outputRelativeToContentRoot value="true" />
|
<outputRelativeToContentRoot value="true" />
|
||||||
|
<<<<<<< HEAD
|
||||||
<module name="rets-io-client" />
|
<module name="rets-io-client" />
|
||||||
|
=======
|
||||||
|
<module name="rets-io-client-api" />
|
||||||
|
>>>>>>> origin/rets-io-client-api/main
|
||||||
</profile>
|
</profile>
|
||||||
</annotationProcessing>
|
</annotationProcessing>
|
||||||
</component>
|
</component>
|
||||||
|
|
|
@ -0,0 +1,11 @@
|
||||||
|
#
|
||||||
|
# Properties file for commons build.xml
|
||||||
|
#
|
||||||
|
src=src
|
||||||
|
etc=src/etc
|
||||||
|
libsrc=src/lib
|
||||||
|
javadoc=src/javadoc
|
||||||
|
|
||||||
|
build=target
|
||||||
|
classes=target/classes
|
||||||
|
libdir=target/lib
|
|
@ -0,0 +1,75 @@
|
||||||
|
<project name="retsAPI" default="jar" basedir=".">
|
||||||
|
|
||||||
|
<property file="build.properties"/>
|
||||||
|
|
||||||
|
<path id="java.classpath">
|
||||||
|
<fileset dir="${libdir}">
|
||||||
|
<include name="*.jar"/>
|
||||||
|
</fileset>
|
||||||
|
</path>
|
||||||
|
|
||||||
|
<target name="clean">
|
||||||
|
<delete dir="${build}"/>
|
||||||
|
</target>
|
||||||
|
|
||||||
|
<target name="init">
|
||||||
|
<tstamp/>
|
||||||
|
<mkdir dir="${build}"/>
|
||||||
|
<mkdir dir="${classes}"/>
|
||||||
|
<mkdir dir="${libdir}"/>
|
||||||
|
</target>
|
||||||
|
|
||||||
|
<target name="copy-deps" depends="init">
|
||||||
|
<copy file="${libsrc}/regexp-1.2.jar" tofile="${libdir}/regexp-1.2.jar" />
|
||||||
|
<copy file="${libsrc}/log4j-1.2.5.jar" tofile="${libdir}/log4j-1.2.5.jar" />
|
||||||
|
<copy file="${libsrc}/BZip2.jar" tofile="${libdir}/BZip2.jar" />
|
||||||
|
<copy file="${libsrc}/commons-httpclient-2.0-rc1-avantia.jar" tofile="${libdir}/commons-httpclient-2.0-rc1-avantia.jar" />
|
||||||
|
<copy file="${libsrc}/retsCommons.jar" tofile="${libdir}/retsCommons.jar" />
|
||||||
|
<copy file="${libsrc}/mail.jar" tofile="${libdir}/mail.jar" />
|
||||||
|
<copy file="${libsrc}/activation.jar" tofile="${libdir}/activation.jar" />
|
||||||
|
</target>
|
||||||
|
|
||||||
|
<target name="compile" depends="copy-deps">
|
||||||
|
<javac srcdir="${src}" destdir="${classes}" debug="on">
|
||||||
|
<classpath refid="java.classpath"/>
|
||||||
|
<include name="main/java/org/realtor/**/*.java"/>
|
||||||
|
<exclude name="*.java"/>
|
||||||
|
</javac>
|
||||||
|
<copy todir="${classes}">
|
||||||
|
<fileset dir="${etc}">
|
||||||
|
<include name="*.dtd" />
|
||||||
|
<include name="*.properties" />
|
||||||
|
<include name="*.xml" />
|
||||||
|
<include name="*.xsl" />
|
||||||
|
</fileset>
|
||||||
|
</copy>
|
||||||
|
</target>
|
||||||
|
|
||||||
|
<target name="javadoc">
|
||||||
|
<javadoc packagenames="org.realtor.rets.*"
|
||||||
|
sourcepath="${src}"
|
||||||
|
defaultexcludes="yes"
|
||||||
|
destdir="doc"
|
||||||
|
classpathref="java.classpath"
|
||||||
|
author="true"
|
||||||
|
version="true"
|
||||||
|
use="true"
|
||||||
|
private="Yes"
|
||||||
|
windowtitle="RETS 1.5 Reference Impl">
|
||||||
|
<doctitle>
|
||||||
|
<![CDATA[<h1>RETS 1.5</h1>]]></doctitle>
|
||||||
|
<bottom>
|
||||||
|
<![CDATA[<i>Copyright © 2002 National Association of Realtors - All Rights Reserved.</i>]]></bottom>
|
||||||
|
<link href="http://developer.java.sun.com/developer/products/xml/docs/api/"/>
|
||||||
|
</javadoc>
|
||||||
|
</target>
|
||||||
|
|
||||||
|
<target name="jar" depends="clean, compile">
|
||||||
|
<delete file="${build}/retsAPI.jar"/>
|
||||||
|
<jar jarfile="${build}/retsAPI.jar">
|
||||||
|
<fileset dir="${classes}">
|
||||||
|
</fileset>
|
||||||
|
</jar>
|
||||||
|
</target>
|
||||||
|
|
||||||
|
</project>
|
172
pom.xml
172
pom.xml
|
@ -1,3 +1,4 @@
|
||||||
|
<<<<<<< HEAD
|
||||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
@ -124,9 +125,180 @@
|
||||||
<descriptorRef>jar-with-dependencies</descriptorRef>
|
<descriptorRef>jar-with-dependencies</descriptorRef>
|
||||||
</descriptorRefs>
|
</descriptorRefs>
|
||||||
</configuration>
|
</configuration>
|
||||||
|
=======
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
<groupId>com.ossez.usreio</groupId>
|
||||||
|
<artifactId>rets-io-client-api</artifactId>
|
||||||
|
<version>0.0.1-SNAPSHOT</version>
|
||||||
|
<packaging>jar</packaging>
|
||||||
|
|
||||||
|
<name>Rets-Io-Client-Api</name>
|
||||||
|
<description>The RETS API is a Reference Implementation API for RETS Transactions written in Java and can be used as
|
||||||
|
an API by web-based and desktop RETS Client Applications.
|
||||||
|
</description>
|
||||||
|
<url>https://github.com/USRealEstate/rets-io-validation.git</url>
|
||||||
|
|
||||||
|
<developers>
|
||||||
|
<developer>
|
||||||
|
<name>YuCheng Hu</name>
|
||||||
|
<id>honeymoose</id>
|
||||||
|
<email>huyuchengus@gmail.com</email>
|
||||||
|
<timezone>-5</timezone>
|
||||||
|
<organization>Open Source</organization>
|
||||||
|
<roles>
|
||||||
|
<role>Sr. Java Developer</role>
|
||||||
|
</roles>
|
||||||
|
</developer>
|
||||||
|
</developers>
|
||||||
|
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.ossez.usreio</groupId>
|
||||||
|
<artifactId>rets-io-common</artifactId>
|
||||||
|
<version>0.0.1-SNAPSHOT</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>ch.qos.logback</groupId>
|
||||||
|
<artifactId>logback-classic</artifactId>
|
||||||
|
<version>1.2.5</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- APACHE COMMONS -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>commons-httpclient</groupId>
|
||||||
|
<artifactId>commons-httpclient</artifactId>
|
||||||
|
<version>3.1</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.ant</groupId>
|
||||||
|
<artifactId>ant</artifactId>
|
||||||
|
<version>1.9.4</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>xalan</groupId>
|
||||||
|
<artifactId>xalan</artifactId>
|
||||||
|
<version>2.7.2</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>javax.activation</groupId>
|
||||||
|
<artifactId>javax.activation-api</artifactId>
|
||||||
|
<version>1.2.0</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>javax.mail</groupId>
|
||||||
|
<artifactId>mail</artifactId>
|
||||||
|
<version>1.4</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- TESTS -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.junit.jupiter</groupId>
|
||||||
|
<artifactId>junit-jupiter-api</artifactId>
|
||||||
|
<version>5.7.0</version>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.junit.jupiter</groupId>
|
||||||
|
<artifactId>junit-jupiter-engine</artifactId>
|
||||||
|
<version>5.7.0</version>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
|
||||||
|
<build>
|
||||||
|
<defaultGoal>package</defaultGoal>
|
||||||
|
<plugins>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-compiler-plugin</artifactId>
|
||||||
|
<version>${maven-compiler-plugin.version}</version>
|
||||||
|
<configuration>
|
||||||
|
<source>${java.version}</source>
|
||||||
|
<target>${java.version}</target>
|
||||||
|
<release>${java.version}</release>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-javadoc-plugin</artifactId>
|
||||||
|
<version>2.9.1</version>
|
||||||
|
<executions>
|
||||||
|
<execution>
|
||||||
|
<id>attach-javadocs</id>
|
||||||
|
<goals>
|
||||||
|
<goal>jar</goal>
|
||||||
|
</goals>
|
||||||
|
>>>>>>> origin/rets-io-client-api/main
|
||||||
</execution>
|
</execution>
|
||||||
</executions>
|
</executions>
|
||||||
</plugin>
|
</plugin>
|
||||||
</plugins>
|
</plugins>
|
||||||
|
<<<<<<< HEAD
|
||||||
</build>
|
</build>
|
||||||
</project>
|
</project>
|
||||||
|
=======
|
||||||
|
|
||||||
|
</build>
|
||||||
|
|
||||||
|
<properties>
|
||||||
|
<!-- Generic properties -->
|
||||||
|
<java.version>11</java.version>
|
||||||
|
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||||
|
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
|
||||||
|
|
||||||
|
<!-- Logging -->
|
||||||
|
<slf4j.version>1.7.30</slf4j.version>
|
||||||
|
<log4j.version>1.2.17</log4j.version>
|
||||||
|
<log4j2.version>2.2</log4j2.version>
|
||||||
|
|
||||||
|
<!-- APACHE COMMONS-->
|
||||||
|
<commons-io.version>2.11.0</commons-io.version>
|
||||||
|
<commons-lang.version>2.6</commons-lang.version>
|
||||||
|
<commons-lang3.version>3.11</commons-lang3.version>
|
||||||
|
<commons-cli.version>1.4</commons-cli.version>
|
||||||
|
<commons-httpclient.version>4.5.13</commons-httpclient.version>
|
||||||
|
|
||||||
|
|
||||||
|
<!-- UTILS -->
|
||||||
|
<guava.version>30.1.1-jre</guava.version>
|
||||||
|
|
||||||
|
<!-- Hibernate / JPA -->
|
||||||
|
<hibernate.version>4.3.5.Final</hibernate.version>
|
||||||
|
|
||||||
|
<!-- Bean validation -->
|
||||||
|
<hibernate-validator.version>4.3.1.Final</hibernate-validator.version>
|
||||||
|
|
||||||
|
<!-- Database access -->
|
||||||
|
<tomcat-jdbc.version>7.0.42</tomcat-jdbc.version>
|
||||||
|
<ehcache.version>2.6.8</ehcache.version>
|
||||||
|
<hsqldb.version>2.3.2</hsqldb.version>
|
||||||
|
|
||||||
|
<!-- DATA STRUCTURES -->
|
||||||
|
<jackson.version>2.12.4</jackson.version>
|
||||||
|
|
||||||
|
<!-- Test -->
|
||||||
|
<hamcrest.version>2.2</hamcrest.version>
|
||||||
|
<hamcrest-all.version>1.3</hamcrest-all.version>
|
||||||
|
|
||||||
|
<!-- CDN & CLOUD -->
|
||||||
|
<jclouds.version>1.9.0</jclouds.version>
|
||||||
|
<modelmapper.version>2.4.4</modelmapper.version>
|
||||||
|
<lombok.version>1.18.20</lombok.version>
|
||||||
|
<moneta.version>1.3</moneta.version>
|
||||||
|
<jmh-core.version>1.33</jmh-core.version>
|
||||||
|
<exec-maven-plugin.version>3.0.0</exec-maven-plugin.version>
|
||||||
|
<maven-surefire-plugin.version>2.21.0</maven-surefire-plugin.version>
|
||||||
|
<maven-compiler-plugin.version>3.8.1</maven-compiler-plugin.version>
|
||||||
|
<maven-war-plugin.version>3.0.0</maven-war-plugin.version>
|
||||||
|
|
||||||
|
</properties>
|
||||||
|
|
||||||
|
</project>
|
||||||
|
>>>>>>> origin/rets-io-client-api/main
|
||||||
|
|
|
@ -0,0 +1,7 @@
|
||||||
|
# JAR FILES
|
||||||
|
maven.jar.override=on
|
||||||
|
maven.jar.BZip2=${basedir}/src/lib/BZip2.jar
|
||||||
|
maven.jar.retscommons=${basedir}/src/lib/retsCommons.jar
|
||||||
|
maven.jar.log4j=${basedir}/src/lib/log4j-1.2.5.jar
|
||||||
|
maven.jar.commons-httpclient=${basedir}/src/lib/commons-httpclient-2.0-rc1-avantia.jar
|
||||||
|
maven.jar.regexp=${basedir}/src/lib/regexp.jar
|
|
@ -0,0 +1,115 @@
|
||||||
|
<?xml version="1.0"?>
|
||||||
|
<project>
|
||||||
|
<extend>${maven.base.project}</extend>
|
||||||
|
|
||||||
|
<pomVersion>3</pomVersion>
|
||||||
|
<name>RETS API</name>
|
||||||
|
<id>retsapi</id>
|
||||||
|
<currentVersion>1.0</currentVersion>
|
||||||
|
<inceptionYear>2003</inceptionYear>
|
||||||
|
<package>org.realtor.rets</package>
|
||||||
|
<logo>/images/logos/rets_suite.jpg</logo>
|
||||||
|
|
||||||
|
<shortDescription>
|
||||||
|
Java RETS API
|
||||||
|
</shortDescription>
|
||||||
|
|
||||||
|
<description>
|
||||||
|
The RETS API is a Reference Implementation API for RETS Transactions
|
||||||
|
written in Java and can be used as an API by web-based and desktop
|
||||||
|
RETS Client Applications.
|
||||||
|
</description>
|
||||||
|
|
||||||
|
<url>/sandbox/${pom.artifactId}/</url>
|
||||||
|
|
||||||
|
<versions>
|
||||||
|
<version>
|
||||||
|
<id>release</id>
|
||||||
|
<name>1.0</name>
|
||||||
|
<tag>RETSAPI</tag>
|
||||||
|
</version>
|
||||||
|
</versions>
|
||||||
|
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>log4j</groupId>
|
||||||
|
<artifactId>log4j</artifactId>
|
||||||
|
<version>1.2.5</version>
|
||||||
|
<url>http://www.ibiblio.org/maven/log4j</url>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>commons-httpclient</groupId>
|
||||||
|
<artifactId>commons-httpclient</artifactId>
|
||||||
|
<version>2.0-rc1</version>
|
||||||
|
<url>http://www.ibiblio.org/maven/commons-httpclient</url>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>regexp</groupId>
|
||||||
|
<artifactId>regexp</artifactId>
|
||||||
|
<version>1.2</version>
|
||||||
|
<url>http://www.ibiblio.org/maven/regexp</url>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>BZip2</groupId>
|
||||||
|
<artifactId>BZip2</artifactId>
|
||||||
|
<version>1.0</version>
|
||||||
|
<url></url>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>retscommons</groupId>
|
||||||
|
<artifactId>retscommons</artifactId>
|
||||||
|
<version>1.0</version>
|
||||||
|
<url></url>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
|
||||||
|
<build>
|
||||||
|
|
||||||
|
<nagEmailAddress>
|
||||||
|
rets@avantia-inc.com
|
||||||
|
</nagEmailAddress>
|
||||||
|
|
||||||
|
<sourceDirectory>${basedir}/src</sourceDirectory>
|
||||||
|
|
||||||
|
<!-- J A R R E S O U R C E S -->
|
||||||
|
<!-- Resources that are packaged up inside the JAR file -->
|
||||||
|
<resources>
|
||||||
|
<resource>
|
||||||
|
<directory>${basedir}/lib</directory>
|
||||||
|
<includes>
|
||||||
|
<include>*.jar</include>
|
||||||
|
</includes>
|
||||||
|
</resource>
|
||||||
|
<resource>
|
||||||
|
<directory>${basedir}/src/resources/misc</directory>
|
||||||
|
<includes>
|
||||||
|
<include>*.xsd</include>
|
||||||
|
</includes>
|
||||||
|
</resource>
|
||||||
|
<resource>
|
||||||
|
<directory>${basedir}/config</directory>
|
||||||
|
<includes>
|
||||||
|
<include>log4j.properties</include>
|
||||||
|
</includes>
|
||||||
|
</resource>
|
||||||
|
</resources>
|
||||||
|
|
||||||
|
<!-- Integration unit test cases -->
|
||||||
|
<integrationUnitTest/>
|
||||||
|
|
||||||
|
<jars>
|
||||||
|
</jars>
|
||||||
|
</build>
|
||||||
|
<reports>
|
||||||
|
<report>maven-changelog-plugin</report>
|
||||||
|
<report>maven-changes-plugin</report>
|
||||||
|
<report>maven-checkstyle-plugin</report>
|
||||||
|
<report>maven-developer-activity-plugin</report>
|
||||||
|
<report>maven-file-activity-plugin</report>
|
||||||
|
<report>maven-jdepend-plugin</report>
|
||||||
|
<report>maven-junit-report-plugin</report>
|
||||||
|
<report>maven-jxr-plugin</report>
|
||||||
|
<report>maven-pmd-plugin</report>
|
||||||
|
<report>maven-tasklist-plugin</report>
|
||||||
|
</reports>
|
||||||
|
</project>
|
|
@ -0,0 +1,126 @@
|
||||||
|
package com.ossez.usreio.client.retsapi;
|
||||||
|
|
||||||
|
import javax.activation.DataSource;
|
||||||
|
import java.io.ByteArrayInputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.io.OutputStream;
|
||||||
|
import java.util.Vector;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A class to provide a {@link javax.activation.DataSource} interface to
|
||||||
|
* an input stream of unknown characteristics. The <code>DataSource</code>
|
||||||
|
* interface requires that its implementor be able to repeatedly restart
|
||||||
|
* the read from the beginning. This isn't guaranteed by InputStream, so
|
||||||
|
* we encapsulate the InputStream with an object that will buffer the
|
||||||
|
* data coming from it. (We can't use <code>mark</code>/<code>reset</code>
|
||||||
|
* because the eventual data source consumer might use those methods,
|
||||||
|
* which would override use here.
|
||||||
|
*/
|
||||||
|
public class InputStreamDataSource implements DataSource
|
||||||
|
{
|
||||||
|
private byte fStreamBytes[];
|
||||||
|
private String fContentType;
|
||||||
|
|
||||||
|
public InputStreamDataSource(InputStream baseStream, String contentType) throws IOException {
|
||||||
|
fContentType = contentType;
|
||||||
|
|
||||||
|
// Read the content of the input stream into byte array blocks. Read
|
||||||
|
// to the end of file and save all the blocks. These will be consolidated
|
||||||
|
// after all are read. This uses twice as much storage as simply designing
|
||||||
|
// a new input stream, but I don't want to write that class right now,
|
||||||
|
// especially since I'm not completely clear on the blocking semantics.
|
||||||
|
// ByteArrayInputStream already knows them, so I'll just use that.
|
||||||
|
|
||||||
|
Vector byteArrays = new Vector();
|
||||||
|
int totalBytesRead = 0;
|
||||||
|
byte temporaryByteArray[];
|
||||||
|
int readCount;
|
||||||
|
int quantum = 4096;
|
||||||
|
int bytesInCurrentBlock;
|
||||||
|
|
||||||
|
do {
|
||||||
|
bytesInCurrentBlock = 0;
|
||||||
|
temporaryByteArray = new byte[quantum];
|
||||||
|
do {
|
||||||
|
readCount =
|
||||||
|
baseStream.read(temporaryByteArray, bytesInCurrentBlock, quantum - bytesInCurrentBlock);
|
||||||
|
if (readCount > 0) bytesInCurrentBlock += readCount;
|
||||||
|
} while (readCount >= 0 && bytesInCurrentBlock < quantum);
|
||||||
|
|
||||||
|
if (bytesInCurrentBlock > 0)
|
||||||
|
byteArrays.add(temporaryByteArray);
|
||||||
|
|
||||||
|
totalBytesRead += bytesInCurrentBlock;
|
||||||
|
} while (readCount >= 0);
|
||||||
|
|
||||||
|
// Copy all the blocks into one single mondo block.
|
||||||
|
fStreamBytes = new byte[totalBytesRead];
|
||||||
|
|
||||||
|
int numberOfBlocks = byteArrays.size();
|
||||||
|
byte theBlock[];
|
||||||
|
for (int blockIndex = 0; blockIndex < numberOfBlocks - 1; ++blockIndex) {
|
||||||
|
theBlock = (byte[]) byteArrays.get(blockIndex);
|
||||||
|
System.arraycopy(theBlock, 0, fStreamBytes, blockIndex * quantum, quantum);
|
||||||
|
}
|
||||||
|
|
||||||
|
theBlock = (byte[]) byteArrays.get(numberOfBlocks - 1);
|
||||||
|
System.arraycopy(theBlock, 0, fStreamBytes, quantum * (numberOfBlocks - 1), bytesInCurrentBlock);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the Content-Type header value for the encapsulated content.
|
||||||
|
*/
|
||||||
|
public String getContentType() {
|
||||||
|
return fContentType;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns an input stream that may be used to access the content of this
|
||||||
|
* <code>DataSource</code> A new input stream, set at the beginning of the
|
||||||
|
* stream, is returned each time you call this method.
|
||||||
|
*
|
||||||
|
* @return An {@link InputStream} that will furnish the
|
||||||
|
* associated data.
|
||||||
|
*/
|
||||||
|
public InputStream getInputStream() {
|
||||||
|
return new ByteArrayInputStream(fStreamBytes);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the name of this data source. This class does not provide named data
|
||||||
|
* sources; the string "Untitled" is returned.
|
||||||
|
*
|
||||||
|
* @return The string "Untitled".
|
||||||
|
*/
|
||||||
|
public String getName() {
|
||||||
|
return "Untitled";
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Conformance to <code>javax.activation.DataSource</code> Throws an
|
||||||
|
* {@link IOException} since this DataSource is read-only.
|
||||||
|
*/
|
||||||
|
public OutputStream getOutputStream() throws IOException {
|
||||||
|
throw new IOException("InputStreamDataSource is read-only.");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the content of the input stream as a full byte array.
|
||||||
|
*/
|
||||||
|
public byte[] contentAsByteArray() {
|
||||||
|
return fStreamBytes;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the loaded data as a string. This is primarily for diagnostic
|
||||||
|
* purposes, as there are other ways of turning an InputStream into a String.
|
||||||
|
*
|
||||||
|
* @return A <code>String</code> containing the input data.
|
||||||
|
*/
|
||||||
|
public String bufferedDataAsString() {
|
||||||
|
return new String(fStreamBytes);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,35 @@
|
||||||
|
package com.ossez.usreio.client.retsapi;
|
||||||
|
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* RETSActionTransaction.java
|
||||||
|
*
|
||||||
|
* This class is used to build an action transaction
|
||||||
|
*
|
||||||
|
* @author jbrush
|
||||||
|
* @version 1.0
|
||||||
|
*/
|
||||||
|
public class RETSActionTransaction extends RETSTransaction {
|
||||||
|
private final static Logger logger = LoggerFactory.getLogger(RETSActionTransaction.class);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor
|
||||||
|
*/
|
||||||
|
public RETSActionTransaction() {
|
||||||
|
super();
|
||||||
|
setRequestType("Action");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the reponse body.
|
||||||
|
*
|
||||||
|
*@param body text of the response
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public void setResponse(String body) {
|
||||||
|
super.setResponse(body);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,128 @@
|
||||||
|
//
|
||||||
|
// RETSBasicResponseParser.java
|
||||||
|
// NARRETSClasses
|
||||||
|
//
|
||||||
|
// Created by Bruce Toback on 1/3/05.
|
||||||
|
// Copyright (c) 2005 __MyCompanyName__. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
package com.ossez.usreio.client.retsapi;
|
||||||
|
|
||||||
|
import org.xml.sax.Attributes;
|
||||||
|
import org.xml.sax.SAXException;
|
||||||
|
import org.xml.sax.SAXParseException;
|
||||||
|
|
||||||
|
import javax.xml.parsers.ParserConfigurationException;
|
||||||
|
import javax.xml.parsers.SAXParser;
|
||||||
|
import javax.xml.parsers.SAXParserFactory;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.util.Vector;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Do a basic parse of a RETS response, optionally failing fast upon determination
|
||||||
|
* as to whether this is actually a RETS response.
|
||||||
|
*/
|
||||||
|
|
||||||
|
public class RETSBasicResponseParser extends org.xml.sax.helpers.DefaultHandler
|
||||||
|
{
|
||||||
|
protected String fReplyText;
|
||||||
|
protected int fReplyCode;
|
||||||
|
protected Vector fExceptions;
|
||||||
|
protected StringBuffer fElementCharacters;
|
||||||
|
protected boolean fReplyValid;
|
||||||
|
protected boolean fFirstElementProcessed; // Set once the first element is processed
|
||||||
|
|
||||||
|
public RETSBasicResponseParser(InputStream responseStream) {
|
||||||
|
fReplyValid = false;
|
||||||
|
|
||||||
|
try {
|
||||||
|
SAXParserFactory aParserFactory = SAXParserFactory.newInstance();
|
||||||
|
|
||||||
|
aParserFactory.setValidating(false);
|
||||||
|
aParserFactory.setNamespaceAware(true);
|
||||||
|
|
||||||
|
SAXParser aParser = aParserFactory.newSAXParser();
|
||||||
|
|
||||||
|
aParser.parse(responseStream, this);
|
||||||
|
} catch (SAXParseException saxParseException) {
|
||||||
|
addExceptionMessage(saxParseException.getMessage());
|
||||||
|
} catch (SAXException saxException) {
|
||||||
|
addExceptionMessage(saxException.getMessage());
|
||||||
|
} catch (ParserConfigurationException parserConfigurationException) {
|
||||||
|
addExceptionMessage(parserConfigurationException.getMessage());
|
||||||
|
} catch (java.io.IOException ioException) {
|
||||||
|
addExceptionMessage(ioException.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean responseIsValid() {
|
||||||
|
return fReplyValid && (fExceptions == null || fExceptions.size() == 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Vector exceptionMessages() {
|
||||||
|
return fExceptions;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int replyCode() {
|
||||||
|
return fReplyCode;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String replyText() {
|
||||||
|
return fReplyText;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void addExceptionMessage(String exceptionMessage) {
|
||||||
|
if (fExceptions == null)
|
||||||
|
fExceptions = new Vector();
|
||||||
|
fExceptions.addElement(exceptionMessage);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Methods required to extend DefaultHandler
|
||||||
|
|
||||||
|
public void error(SAXParseException e) {
|
||||||
|
addExceptionMessage(e.getMessage());
|
||||||
|
}
|
||||||
|
|
||||||
|
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
|
||||||
|
int attributeCount = attributes.getLength();
|
||||||
|
int attributeIndex;
|
||||||
|
String attributeName;
|
||||||
|
|
||||||
|
if (fElementCharacters == null)
|
||||||
|
fElementCharacters = new StringBuffer();
|
||||||
|
else
|
||||||
|
fElementCharacters.setLength(0);
|
||||||
|
|
||||||
|
if (qName.equals("RETS") ||
|
||||||
|
qName.equals("RETS-STATUS")) {
|
||||||
|
for (attributeIndex = 0; attributeIndex < attributeCount; ++attributeIndex) {
|
||||||
|
attributeName = attributes.getLocalName(attributeIndex);
|
||||||
|
|
||||||
|
if (attributeName.equals("ReplyText"))
|
||||||
|
fReplyText = attributes.getValue(attributeIndex);
|
||||||
|
else if (attributeName.equals("ReplyCode")) {
|
||||||
|
String replyCode = attributes.getValue(attributeIndex);
|
||||||
|
try {
|
||||||
|
fReplyCode = Integer.parseInt(replyCode);
|
||||||
|
fReplyValid = true;
|
||||||
|
} catch (NumberFormatException e) {
|
||||||
|
fReplyCode = 0;
|
||||||
|
addExceptionMessage("RETS reply code invalid (\"" + replyCode + "\")");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if (!fFirstElementProcessed) {
|
||||||
|
throw new SAXException("Not a RETS reply.");
|
||||||
|
}
|
||||||
|
|
||||||
|
fFirstElementProcessed = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void endElement(String uri, String localName, String qName) {
|
||||||
|
}
|
||||||
|
|
||||||
|
public void characters(char[] ch, int start, int length) {
|
||||||
|
fElementCharacters.append(ch, start, length);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,176 @@
|
||||||
|
package com.ossez.usreio.client.retsapi;
|
||||||
|
|
||||||
|
|
||||||
|
import org.realtor.rets.util.DesCrypter;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
import java.security.MessageDigest;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Send a Change Password transaction to the server.
|
||||||
|
*
|
||||||
|
* @author jbrush
|
||||||
|
* @version 1.0
|
||||||
|
*/
|
||||||
|
public class RETSChangePasswordTransaction extends RETSTransaction {
|
||||||
|
private final static Logger logger = LoggerFactory.getLogger(RETSActionTransaction.class);
|
||||||
|
|
||||||
|
private String oldPassword = null;
|
||||||
|
private String newPassword = null;
|
||||||
|
private String newPassword2 = null;
|
||||||
|
private String encrypted = null;
|
||||||
|
private String decrypted = null;
|
||||||
|
private String username = null;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a new RETSChangePasswordTransaction
|
||||||
|
*/
|
||||||
|
public RETSChangePasswordTransaction() {
|
||||||
|
super();
|
||||||
|
setRequestType("ChangePassword");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the username
|
||||||
|
*
|
||||||
|
* @param username name user signs in with
|
||||||
|
*/
|
||||||
|
public void setUsername(String username) {
|
||||||
|
this.username = username;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the old password
|
||||||
|
*
|
||||||
|
* @param passwd users password to be changed
|
||||||
|
*/
|
||||||
|
public void setOldPassword(String passwd) {
|
||||||
|
this.oldPassword = passwd;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the new password value
|
||||||
|
*
|
||||||
|
* @param passwd new password
|
||||||
|
*/
|
||||||
|
public void setNewPassword(String passwd) {
|
||||||
|
this.newPassword = passwd;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the new password confirm value
|
||||||
|
*
|
||||||
|
* @param passwd new password
|
||||||
|
*/
|
||||||
|
public void setNewPassword2(String passwd) {
|
||||||
|
this.newPassword2 = passwd;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* process the transaction
|
||||||
|
*/
|
||||||
|
public void preprocess() {
|
||||||
|
String errMsg = null;
|
||||||
|
|
||||||
|
super.preprocess();
|
||||||
|
|
||||||
|
setUsername((String) transactionContext.get("username"));
|
||||||
|
|
||||||
|
logger.debug("username=" + username);
|
||||||
|
logger.debug("oldPassword=" + oldPassword);
|
||||||
|
logger.debug("newPassword=" + newPassword);
|
||||||
|
|
||||||
|
//cat.debug("newPassword2="+newPassword2);
|
||||||
|
|
||||||
|
/*if (oldPassword == null
|
||||||
|
|| !oldPassword.equals(transactionContext.get("password"))) {
|
||||||
|
errMsg = "Old Password does not match.";
|
||||||
|
}
|
||||||
|
else if ((newPassword1 == null || newPassword2 == null)
|
||||||
|
|| (!newPassword1.equals(newPassword2))) {
|
||||||
|
errMsg = "New Passwords do not match.";
|
||||||
|
}*/
|
||||||
|
|
||||||
|
//else {
|
||||||
|
String pwd = encryptPWD();
|
||||||
|
|
||||||
|
//cat.debug("PWD:"+pwd);
|
||||||
|
setRequestVariable("PWD", pwd);
|
||||||
|
|
||||||
|
//}
|
||||||
|
if (errMsg != null) {
|
||||||
|
logger.warn(errMsg);
|
||||||
|
|
||||||
|
setResponseStatus("20513"); // Miscellaneous error
|
||||||
|
setResponseStatusText(errMsg);
|
||||||
|
setResponse(errMsg);
|
||||||
|
|
||||||
|
errMsg = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void postprocess() {
|
||||||
|
transactionContext.put("password", newPassword);
|
||||||
|
}
|
||||||
|
|
||||||
|
private String encryptPWD() {
|
||||||
|
byte[] key = makeKey();
|
||||||
|
String source = newPassword + ":" + username;
|
||||||
|
|
||||||
|
return DES(key, source);
|
||||||
|
}
|
||||||
|
|
||||||
|
private String DES(byte[] keyBytes, String source) {
|
||||||
|
try {
|
||||||
|
// Create encrypter/decrypter class
|
||||||
|
DesCrypter crypter = new DesCrypter(keyBytes);
|
||||||
|
|
||||||
|
// Encrypt
|
||||||
|
encrypted = crypter.encrypt(source);
|
||||||
|
|
||||||
|
// Decrypt
|
||||||
|
decrypted = crypter.decrypt(encrypted);
|
||||||
|
|
||||||
|
return encrypted;
|
||||||
|
} catch (Exception e) {
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private byte[] makeKey() {
|
||||||
|
MessageDigest md = null;
|
||||||
|
|
||||||
|
try {
|
||||||
|
md = MessageDigest.getInstance("MD5");
|
||||||
|
} catch (java.security.NoSuchAlgorithmException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
md.reset();
|
||||||
|
|
||||||
|
// trim to 8 bytes
|
||||||
|
byte[] key = new byte[8];
|
||||||
|
System.arraycopy(md.digest((oldPassword + username).toUpperCase()
|
||||||
|
.getBytes()), 0, key, 0, 8);
|
||||||
|
|
||||||
|
return key;
|
||||||
|
}
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////
|
||||||
|
public static void main(String[] args) {
|
||||||
|
RETSChangePasswordTransaction t = new RETSChangePasswordTransaction();
|
||||||
|
|
||||||
|
t.setUsername(args[0]);
|
||||||
|
t.setOldPassword(args[1]);
|
||||||
|
t.setNewPassword(args[2]);
|
||||||
|
|
||||||
|
//t.setNewPassword2(args[2]);
|
||||||
|
t.preprocess();
|
||||||
|
|
||||||
|
System.out.println("encrypted=" + t.encrypted);
|
||||||
|
System.out.println("decrypted=" + t.decrypted);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,634 @@
|
||||||
|
/*
|
||||||
|
* RETSConnection.java
|
||||||
|
*
|
||||||
|
* Created on November 16, 2001, 1:33 PM
|
||||||
|
*/
|
||||||
|
package com.ossez.usreio.client.retsapi;
|
||||||
|
|
||||||
|
//import com.aftexsw.util.bzip.CBZip2InputStream;
|
||||||
|
|
||||||
|
import org.apache.commons.httpclient.*;
|
||||||
|
import org.apache.commons.httpclient.cookie.CookiePolicy;
|
||||||
|
import org.apache.commons.httpclient.methods.GetMethod;
|
||||||
|
import org.apache.commons.httpclient.methods.PostMethod;
|
||||||
|
import org.realtor.rets.util.RETSConfigurator;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
import java.io.*;
|
||||||
|
import java.net.URLEncoder;
|
||||||
|
import java.util.*;
|
||||||
|
import java.util.zip.GZIPInputStream;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Provides a connection to a RETSServer.
|
||||||
|
*
|
||||||
|
* @author tweber
|
||||||
|
* @version 1.0
|
||||||
|
*/
|
||||||
|
public class RETSConnection extends java.lang.Object {
|
||||||
|
private final static Logger logger = LoggerFactory.getLogger(RETSConnection.class);
|
||||||
|
|
||||||
|
static {
|
||||||
|
RETSConfigurator.configure();
|
||||||
|
}
|
||||||
|
|
||||||
|
//Key value pairs for request header.
|
||||||
|
private HashMap headerHash = new HashMap();
|
||||||
|
private HashMap responseHeaderMap = new HashMap();
|
||||||
|
private String serverUrl = null;
|
||||||
|
private String errMsg = null;
|
||||||
|
private boolean isRetryingAuthorization = false;
|
||||||
|
private boolean gzipCompressed = false;
|
||||||
|
private boolean bzipCompressed = false;
|
||||||
|
private boolean STREAMRESPONSE = false;
|
||||||
|
private long lastTransactionTime = 0;
|
||||||
|
private String transactionLogDirectory = null;
|
||||||
|
private String imageAccept = "image/gif"; // default
|
||||||
|
private PrintWriter log = null;
|
||||||
|
private HttpClient client = new HttpClient();
|
||||||
|
|
||||||
|
HashMap transactionContext = new HashMap(); // holds data across transactions
|
||||||
|
private int connTimeoutSeconds = 60; // 60 seconds default
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates new RETSConnection and changes default connection timeout
|
||||||
|
* and sets the ServerURL.
|
||||||
|
*/
|
||||||
|
public RETSConnection(String url, int connTimeoutSeconds) {
|
||||||
|
this(url);
|
||||||
|
this.connTimeoutSeconds = connTimeoutSeconds;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates new RETSConnection and changes default connection timeout
|
||||||
|
* and sets the ServerURL.
|
||||||
|
*/
|
||||||
|
public RETSConnection(int connTimeoutSeconds) {
|
||||||
|
this();
|
||||||
|
this.connTimeoutSeconds = connTimeoutSeconds;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates new RETSConnection and sets the ServerURL.
|
||||||
|
*/
|
||||||
|
public RETSConnection(String url) {
|
||||||
|
this();
|
||||||
|
serverUrl = url;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a new RETSConnection and setup some required Header fields.
|
||||||
|
*/
|
||||||
|
public RETSConnection() {
|
||||||
|
setRequestHeaderField("User-Agent", "Mozilla/4.0");
|
||||||
|
setRequestHeaderField("RETS-Version", "RETS/1.0");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Executes a transaction
|
||||||
|
*
|
||||||
|
* @param transaction transaction to execute
|
||||||
|
*/
|
||||||
|
public void execute(RETSTransaction transaction) {
|
||||||
|
execute(transaction, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Executes a transaction
|
||||||
|
*
|
||||||
|
* @param transaction transaction to execute
|
||||||
|
*/
|
||||||
|
public void executeStreamResponse(RETSTransaction transaction) {
|
||||||
|
execute(transaction, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Executes a transaction
|
||||||
|
*
|
||||||
|
* @param transaction transaction to execute
|
||||||
|
* @param asStream
|
||||||
|
*/
|
||||||
|
public void execute(RETSTransaction transaction, boolean asStream) {
|
||||||
|
java.util.Date dt1 = new Date();
|
||||||
|
STREAMRESPONSE = asStream;
|
||||||
|
|
||||||
|
if (transaction instanceof RETSGetObjectTransaction) {
|
||||||
|
setRequestHeaderField("Accept", getImageAccept());
|
||||||
|
} else {
|
||||||
|
setRequestHeaderField("Accept", "*/*");
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((transactionLogDirectory != null) && (transactionLogDirectory.length() > 1)) {
|
||||||
|
String transType = transaction.getClass().getName();
|
||||||
|
int nameIdx = transType.lastIndexOf(".") + 1;
|
||||||
|
String name = transType.substring(nameIdx);
|
||||||
|
Date dt = new Date();
|
||||||
|
String outFile = transactionLogDirectory + "/" + name + dt.getTime() + ".txt";
|
||||||
|
|
||||||
|
try {
|
||||||
|
log = new PrintWriter(new FileWriter(outFile));
|
||||||
|
log.println("<!-- RETS REQUEST -->");
|
||||||
|
} catch (Exception e) {
|
||||||
|
logger.error("could create output file :" + outFile);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
String compressFmt = transaction.getCompressionFormat();
|
||||||
|
|
||||||
|
if (compressFmt != null) {
|
||||||
|
if (compressFmt.equalsIgnoreCase("gzip")) {
|
||||||
|
setRequestHeaderField("Accept-Encoding", "application/gzip,gzip");
|
||||||
|
} else if (compressFmt.equalsIgnoreCase("bzip")) {
|
||||||
|
setRequestHeaderField("Accept-Encoding", "application/bzip,bzip");
|
||||||
|
} else if (compressFmt.equalsIgnoreCase("none")) {
|
||||||
|
removeRequestHeaderField("Accept-Encoding");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
transaction.setContext(transactionContext);
|
||||||
|
|
||||||
|
transaction.preprocess();
|
||||||
|
|
||||||
|
processRETSTransaction(transaction);
|
||||||
|
|
||||||
|
transaction.postprocess();
|
||||||
|
|
||||||
|
Date dt2 = new Date();
|
||||||
|
lastTransactionTime = dt2.getTime() - dt1.getTime();
|
||||||
|
|
||||||
|
if (log != null) {
|
||||||
|
try {
|
||||||
|
log.close();
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
log = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
public long getLastTransactionTime() {
|
||||||
|
return lastTransactionTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setTransactionLogDirectory(String tLogDir) {
|
||||||
|
this.transactionLogDirectory = tLogDir;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getTransactionLogDirectory() {
|
||||||
|
return this.transactionLogDirectory;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void writeToTransactionLog(String msg) {
|
||||||
|
if (log != null) {
|
||||||
|
try {
|
||||||
|
this.log.println(msg);
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
logger.debug(msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void writeMapToTransactionLog(Map map) {
|
||||||
|
if (map == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Iterator itr = map.keySet().iterator();
|
||||||
|
|
||||||
|
while (itr.hasNext()) {
|
||||||
|
String key = (String) itr.next();
|
||||||
|
String value = "";
|
||||||
|
Object obj = map.get(key);
|
||||||
|
|
||||||
|
if (obj instanceof String) {
|
||||||
|
value = (String) obj;
|
||||||
|
} else {
|
||||||
|
value = "{ ";
|
||||||
|
|
||||||
|
Collection c = (Collection) obj;
|
||||||
|
Iterator i2 = c.iterator();
|
||||||
|
|
||||||
|
if (i2.hasNext()) {
|
||||||
|
value = (String) i2.next();
|
||||||
|
|
||||||
|
while (i2.hasNext()) {
|
||||||
|
value = value + ", " + (String) i2.next();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
value = value + " }";
|
||||||
|
}
|
||||||
|
|
||||||
|
writeToTransactionLog(key + "=" + value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the server's URL, this url as a base for all transactions
|
||||||
|
*/
|
||||||
|
public String getServerUrl() {
|
||||||
|
return serverUrl;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the url for the connection.
|
||||||
|
*
|
||||||
|
* @param url Server's address ex: http://www.realtor.org/RETSServer
|
||||||
|
*/
|
||||||
|
public void setServerUrl(String url) {
|
||||||
|
serverUrl = url;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Key value pairs in the client request header
|
||||||
|
*
|
||||||
|
* @param key field name in the request header
|
||||||
|
* @param value value associated with the key
|
||||||
|
*/
|
||||||
|
public void setRequestHeaderField(String key, String value) {
|
||||||
|
headerHash.put(key, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setUserAgent(String userAgent) {
|
||||||
|
headerHash.put("User-Agent", userAgent);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setRetsVersion(String retsVersion) {
|
||||||
|
setRequestHeaderField("RETS-Version", retsVersion);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Removes a key/value pair from the request header.
|
||||||
|
*
|
||||||
|
* @param key field to remove from the request header.
|
||||||
|
*/
|
||||||
|
public void removeRequestHeaderField(String key) {
|
||||||
|
headerHash.remove(key);
|
||||||
|
}
|
||||||
|
|
||||||
|
public HashMap getResponseHeaderMap() {
|
||||||
|
return responseHeaderMap;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* gets the url content and returns an inputstream
|
||||||
|
*
|
||||||
|
* @param strURL
|
||||||
|
* @param requestMethod
|
||||||
|
* @param requestMap
|
||||||
|
*/
|
||||||
|
public InputStream getURLContent(String strURL, String requestMethod, Map requestMap) {
|
||||||
|
InputStream is = null;
|
||||||
|
gzipCompressed = false;
|
||||||
|
bzipCompressed = false;
|
||||||
|
|
||||||
|
boolean needToAuth = false;
|
||||||
|
|
||||||
|
HttpMethod method = null;
|
||||||
|
|
||||||
|
logger.debug("getURLContent: URL=" + strURL);
|
||||||
|
|
||||||
|
try {
|
||||||
|
if (requestMethod.equalsIgnoreCase("GET")) {
|
||||||
|
method = new GetMethod(strURL);
|
||||||
|
} else {
|
||||||
|
method = new PostMethod(strURL);
|
||||||
|
}
|
||||||
|
|
||||||
|
client.getState().setCredentials(null, null, new UsernamePasswordCredentials(getUsername(), getPassword()));
|
||||||
|
client.getState().setCookiePolicy(CookiePolicy.COMPATIBILITY);
|
||||||
|
client.setConnectionTimeout(connTimeoutSeconds * 1000);
|
||||||
|
|
||||||
|
method.setDoAuthentication(true);
|
||||||
|
// method.setFollowRedirects(true);
|
||||||
|
|
||||||
|
addHeaders(method, headerHash);
|
||||||
|
writeMapToTransactionLog(headerHash);
|
||||||
|
|
||||||
|
// send the request parameters
|
||||||
|
if (requestMap != null) {
|
||||||
|
NameValuePair[] pairs = mapToNameValuePairs(requestMap);
|
||||||
|
|
||||||
|
if (requestMethod.equalsIgnoreCase("POST")) {
|
||||||
|
// requestMethod is a post, so we can safely cast.
|
||||||
|
PostMethod post = (PostMethod) method;
|
||||||
|
post.setRequestBody(pairs);
|
||||||
|
} else {
|
||||||
|
GetMethod get = (GetMethod) method;
|
||||||
|
get.setQueryString(pairs);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
this.writeToTransactionLog("<!-- Response from server -->");
|
||||||
|
|
||||||
|
int responseCode = client.executeMethod(method);
|
||||||
|
ByteArrayOutputStream os = new ByteArrayOutputStream();
|
||||||
|
ByteArrayInputStream bais = new ByteArrayInputStream(method.getResponseBody());
|
||||||
|
copyResponseHeaders(method);
|
||||||
|
method.releaseConnection(); // from bruce
|
||||||
|
return bais;
|
||||||
|
} catch (IOException io) {
|
||||||
|
io.printStackTrace();
|
||||||
|
errMsg = "RETSAPI: I/O exception while processing transaction: " + io.getMessage();
|
||||||
|
return null;
|
||||||
|
} finally {
|
||||||
|
if (method != null) {
|
||||||
|
method.releaseConnection();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Changes a map into an array of name value pairs
|
||||||
|
*
|
||||||
|
* @param requestMap The map to change.
|
||||||
|
* @return An array of Name value pairs, representing keys and values from the map.
|
||||||
|
*/
|
||||||
|
private NameValuePair[] mapToNameValuePairs(Map requestMap) {
|
||||||
|
NameValuePair[] pairs = new NameValuePair[requestMap.size()];
|
||||||
|
Iterator iter = requestMap.keySet().iterator();
|
||||||
|
int i = 0;
|
||||||
|
|
||||||
|
while (iter.hasNext()) {
|
||||||
|
String key = (String) iter.next();
|
||||||
|
String value = (String) requestMap.get(key);
|
||||||
|
NameValuePair nvp = new NameValuePair(key, value);
|
||||||
|
pairs[i] = nvp;
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
|
||||||
|
return pairs;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adds response headers to Http method
|
||||||
|
*
|
||||||
|
* @param responseHeaderMap
|
||||||
|
* @param method
|
||||||
|
*/
|
||||||
|
private void copyResponseHeaders(HttpMethod method) {
|
||||||
|
responseHeaderMap.clear();
|
||||||
|
|
||||||
|
Header[] headers = method.getResponseHeaders();
|
||||||
|
|
||||||
|
for (int i = 0; i < headers.length; i++) {
|
||||||
|
Header current = headers[i];
|
||||||
|
List list = (List) responseHeaderMap.get(current.getName());
|
||||||
|
|
||||||
|
if (list == null) {
|
||||||
|
list = new ArrayList();
|
||||||
|
}
|
||||||
|
|
||||||
|
list.add(current.getValue());
|
||||||
|
responseHeaderMap.put(current.getName(), list);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void addHeaders(HttpMethod method, HashMap headers) {
|
||||||
|
Iterator keys = headers.keySet().iterator();
|
||||||
|
|
||||||
|
while (keys.hasNext()) {
|
||||||
|
String key = (String) keys.next();
|
||||||
|
Object value = headers.get(key);
|
||||||
|
|
||||||
|
if (value instanceof String && isValidString((String) value)) {
|
||||||
|
method.addRequestHeader(key, (String) value);
|
||||||
|
} else if (value instanceof ArrayList) {
|
||||||
|
ArrayList list = (ArrayList) value;
|
||||||
|
StringBuffer valueList = new StringBuffer();
|
||||||
|
|
||||||
|
for (int i = 0; i < list.size(); i++) {
|
||||||
|
if (i > 0) {
|
||||||
|
valueList.append(";");
|
||||||
|
}
|
||||||
|
|
||||||
|
valueList.append(list.get(i));
|
||||||
|
}
|
||||||
|
|
||||||
|
method.addRequestHeader(key, valueList.toString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Processes a transaction, sends rets request and gets
|
||||||
|
* the response stream from the server. Uncompresses the
|
||||||
|
* response stream if compression was used in the reply
|
||||||
|
*
|
||||||
|
* @param transaction rets transaction to process
|
||||||
|
*/
|
||||||
|
private void processRETSTransaction(RETSTransaction transaction) {
|
||||||
|
try {
|
||||||
|
serverUrl = transaction.getUrl();
|
||||||
|
|
||||||
|
logger.debug(transaction.getRequestType() + " URL : {" + serverUrl + "}");
|
||||||
|
|
||||||
|
if (serverUrl == null) {
|
||||||
|
logger.error(transaction.getRequestType() + " URL is null");
|
||||||
|
transaction.setResponseStatus("20036");
|
||||||
|
transaction.setResponseStatusText(transaction.getRequestType() + " URL is missing. Successful login is required.");
|
||||||
|
return; // throw exception here
|
||||||
|
}
|
||||||
|
|
||||||
|
String method = "POST";
|
||||||
|
|
||||||
|
// Action transaction requires a GET according to RETS spec
|
||||||
|
if (transaction.getRequestType().equalsIgnoreCase("Action")) {
|
||||||
|
method = "GET";
|
||||||
|
}
|
||||||
|
logger.debug("method: " + method);
|
||||||
|
|
||||||
|
InputStream is = getURLContent(serverUrl, method, transaction.getRequestMap());
|
||||||
|
|
||||||
|
if (is == null) {
|
||||||
|
transaction.setResponseStatus("20513"); // Miscellaneous error
|
||||||
|
transaction.setResponseStatusText(errMsg);
|
||||||
|
transaction.setResponse(errMsg);
|
||||||
|
errMsg = null;
|
||||||
|
|
||||||
|
return;
|
||||||
|
} else {
|
||||||
|
Iterator itr = responseHeaderMap.keySet().iterator();
|
||||||
|
Object compressionFmt = responseHeaderMap.get("Content-Encoding");
|
||||||
|
|
||||||
|
if (compressionFmt != null) {
|
||||||
|
logger.debug("Header class : " + compressionFmt.getClass().getName());
|
||||||
|
|
||||||
|
if (compressionFmt.toString().equalsIgnoreCase("[gzip]")) {
|
||||||
|
gzipCompressed = true;
|
||||||
|
} else if (compressionFmt.toString().equalsIgnoreCase("[bzip]")) {
|
||||||
|
bzipCompressed = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (gzipCompressed) {
|
||||||
|
is = new GZIPInputStream(is);
|
||||||
|
} else if (bzipCompressed) {
|
||||||
|
// is = new CBZip2InputStream(is);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.writeToTransactionLog("<!-- Obtained and Identified Response Stream -->");
|
||||||
|
|
||||||
|
transaction.setResponseHeaderMap(this.responseHeaderMap);
|
||||||
|
|
||||||
|
if ((transaction instanceof RETSGetObjectTransaction && (!transaction.getResponseHeader("Content-Type").startsWith("text/xml"))) || STREAMRESPONSE) {
|
||||||
|
transaction.setResponseStream(is);
|
||||||
|
} else {
|
||||||
|
String contents = null;
|
||||||
|
contents = streamToString(is);
|
||||||
|
writeToTransactionLog(contents);
|
||||||
|
|
||||||
|
/*catch( IOException e) {
|
||||||
|
errMsg = "Error reading response stream: " + contents;
|
||||||
|
cat.error(errMsg, e);
|
||||||
|
transaction.setResponseStatus("20513"); // Miscellaneous error
|
||||||
|
transaction.setResponseStatusText(errMsg);
|
||||||
|
errMsg = null;
|
||||||
|
}*/
|
||||||
|
if (contents.length() == 0) {
|
||||||
|
transaction.setResponseStatus("20513"); // Miscellaneous error
|
||||||
|
transaction.setResponseStatusText("Empty Body");
|
||||||
|
}
|
||||||
|
|
||||||
|
transaction.setResponse(contents);
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
String getUsername() {
|
||||||
|
String username = null; //(String)requestMap.get("username");
|
||||||
|
|
||||||
|
if (username == null) {
|
||||||
|
username = (String) transactionContext.get("username");
|
||||||
|
}
|
||||||
|
|
||||||
|
return username;
|
||||||
|
}
|
||||||
|
|
||||||
|
String getPassword() {
|
||||||
|
String password = null; //(String)requestMap.get("password");
|
||||||
|
|
||||||
|
if (password == null) {
|
||||||
|
password = (String) transactionContext.get("password");
|
||||||
|
}
|
||||||
|
|
||||||
|
return password;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Removes the quotes on a string.
|
||||||
|
*
|
||||||
|
* @param quotedString string that might contain quotes
|
||||||
|
*/
|
||||||
|
private static String removeQuotes(String quotedString) {
|
||||||
|
if ((quotedString != null) && (quotedString.length() > 2)) {
|
||||||
|
return quotedString.substring(1, quotedString.length() - 1);
|
||||||
|
} else {
|
||||||
|
return ""; // empty string
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks to make sure the string passed in is a valid string parameter (not null and not zero length).
|
||||||
|
*
|
||||||
|
* @param value string to be validated
|
||||||
|
*/
|
||||||
|
private boolean isValidString(String value) {
|
||||||
|
return ((value != null) && (value.length() > 0));
|
||||||
|
}
|
||||||
|
|
||||||
|
private String streamToString(InputStream is) throws IOException {
|
||||||
|
if (is != null) {
|
||||||
|
StringBuffer sb = new StringBuffer();
|
||||||
|
int numread = 0;
|
||||||
|
byte[] buffer = new byte[1024 * 8]; //initialize an 8k buffer
|
||||||
|
|
||||||
|
while ((numread = is.read(buffer)) >= 0) {
|
||||||
|
String s = new String(buffer, 0, numread);
|
||||||
|
sb.append(s);
|
||||||
|
}
|
||||||
|
|
||||||
|
return sb.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Main method for testing only!
|
||||||
|
*
|
||||||
|
* @param args the command line arguments
|
||||||
|
*/
|
||||||
|
public static void main(String[] args) {
|
||||||
|
// BasicConfigurator.configure();
|
||||||
|
|
||||||
|
RETSConnection rc = new RETSConnection();
|
||||||
|
RETSLoginTransaction trans = new RETSLoginTransaction();
|
||||||
|
|
||||||
|
try {
|
||||||
|
Properties props = new Properties();
|
||||||
|
props.load(new FileInputStream("/tmp/client.properties"));
|
||||||
|
|
||||||
|
// Add the optional request parameters if they exist, are non-null and non-zero-length
|
||||||
|
// rc.setRequestHeaderField("Authorization", (String)props.get("login.AUTHORIZATION"));
|
||||||
|
rc.setServerUrl((String) props.getProperty("SERVER_URL"));
|
||||||
|
trans.setUrl((String) props.getProperty("SERVER_URL"));
|
||||||
|
trans.setUsername((String) props.getProperty("USERNAME"));
|
||||||
|
trans.setPassword((String) props.getProperty("PASSWORD"));
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
rc.execute(trans);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Build the queryString from the request map
|
||||||
|
*
|
||||||
|
* @param requestMap the list of request parameters
|
||||||
|
*/
|
||||||
|
private String buildQueryString(Map requestMap) {
|
||||||
|
/*if (((String)(requestMap.get("requestType"))).equalsIgnoreCase("Search")) {
|
||||||
|
return "SearchType=Property&Class=RESI&Query=(Listing_Price%3D100000%2B)&QueryType=DMQL";
|
||||||
|
}*/
|
||||||
|
StringBuffer sb = new StringBuffer();
|
||||||
|
Iterator it = requestMap.keySet().iterator();
|
||||||
|
|
||||||
|
// build query string
|
||||||
|
while (it.hasNext()) {
|
||||||
|
String key = (String) it.next();
|
||||||
|
|
||||||
|
if (key.equals("requestType")) {
|
||||||
|
//commenting out requestType because it is not a standard req parameter and may break RETS servers
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
String reqStr = key + "=" + URLEncoder.encode((String) requestMap.get(key));
|
||||||
|
logger.debug(reqStr);
|
||||||
|
sb.append(reqStr);
|
||||||
|
|
||||||
|
if (it.hasNext()) {
|
||||||
|
sb.append("&");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return sb.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getImageAccept() {
|
||||||
|
return imageAccept;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setImageAccept(String imageAccept) {
|
||||||
|
this.imageAccept = imageAccept;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,51 @@
|
||||||
|
/**
|
||||||
|
* RETSGetMetadataTransaction.java
|
||||||
|
*
|
||||||
|
* @author jbrush
|
||||||
|
* @version
|
||||||
|
*/
|
||||||
|
package com.ossez.usreio.client.retsapi;
|
||||||
|
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////
|
||||||
|
public class RETSGetMetadataTransaction extends RETSTransaction {
|
||||||
|
private final static Logger logger = LoggerFactory.getLogger(RETSConnection.class);
|
||||||
|
String version = null;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* constructor
|
||||||
|
*/
|
||||||
|
public RETSGetMetadataTransaction() {
|
||||||
|
super();
|
||||||
|
setRequestType("GetMetadata");
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setType(String str) {
|
||||||
|
setRequestVariable("Type", str);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setId(String str) {
|
||||||
|
setRequestVariable("ID", str);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setFormat(String str) {
|
||||||
|
setRequestVariable("Format", str);
|
||||||
|
}
|
||||||
|
|
||||||
|
// public void setResource(String str) {
|
||||||
|
// setRequestVariable("resource", str);
|
||||||
|
// }
|
||||||
|
// public void setResourceClass(String str) {
|
||||||
|
// setRequestVariable("resourceClass", str);
|
||||||
|
// }
|
||||||
|
public void setVersion(String version) {
|
||||||
|
this.version = version;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getVersion() {
|
||||||
|
return version;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,339 @@
|
||||||
|
package com.ossez.usreio.client.retsapi;
|
||||||
|
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
import javax.mail.MessagingException;
|
||||||
|
import javax.mail.internet.InternetHeaders;
|
||||||
|
import javax.mail.internet.MimeBodyPart;
|
||||||
|
import javax.mail.internet.MimeMultipart;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.Iterator;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* RETSGetObjectTransaction.java
|
||||||
|
*
|
||||||
|
* @author jbrush
|
||||||
|
* @version 1.0
|
||||||
|
*/
|
||||||
|
public class RETSGetObjectTransaction extends RETSTransaction {
|
||||||
|
/**
|
||||||
|
* Encapsulates the RETS GetObject transaction, and provides services for
|
||||||
|
* interpreting the result. As with all {@link RETSTransaction} classes,
|
||||||
|
* your code should create an instance of this class when it wants to
|
||||||
|
* perform a GetObject transaction. The transaction requires three
|
||||||
|
* parameters: the resource name (see {@link #setResource}), the type
|
||||||
|
* of object requested (e.g., <code>"Photo"</code>; see {@link setType}),
|
||||||
|
* and the ID of the object -- that is, its associated key such as the
|
||||||
|
* MLS number or agent number. You may also request that the server
|
||||||
|
* send back only the location of the resource by calling {@link #setLocation}.
|
||||||
|
*/
|
||||||
|
|
||||||
|
private final static Logger logger = LoggerFactory.getLogger(RETSLoginTransaction.class);
|
||||||
|
// collection of body parts resulting from the collision of the server response with the MIME parsing code.
|
||||||
|
// protected Collection fBodyParts;
|
||||||
|
protected ArrayList parts;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* create new RETSGetObjectTransaction and set RequestType
|
||||||
|
*/
|
||||||
|
public RETSGetObjectTransaction() {
|
||||||
|
super();
|
||||||
|
setRequestType("GetObject");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the response body for the transaction.
|
||||||
|
*
|
||||||
|
* @param body body of the transaction
|
||||||
|
*/
|
||||||
|
public void setResponse(String body) {
|
||||||
|
super.setResponse(body);
|
||||||
|
setKeyValuePairs(body);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the resource attribute to the string passed in.
|
||||||
|
*
|
||||||
|
* @param str resource value
|
||||||
|
*/
|
||||||
|
public void setResource(String str) {
|
||||||
|
logger.debug("set Resource=" + str);
|
||||||
|
setRequestVariable("Resource", str);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the type attribute to the string passed in.
|
||||||
|
*
|
||||||
|
* @param str type attribute value
|
||||||
|
*/
|
||||||
|
public void setType(String str) {
|
||||||
|
logger.debug("set Type=" + str);
|
||||||
|
setRequestVariable("Type", str);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the ID attribute to the string passed in.
|
||||||
|
*
|
||||||
|
* @param str ID of the object
|
||||||
|
*/
|
||||||
|
public void setID(String str) {
|
||||||
|
if (str != null) {
|
||||||
|
logger.debug("set ID=" + str.trim());
|
||||||
|
setRequestVariable("ID", str.trim());
|
||||||
|
} else {
|
||||||
|
logger.debug("set ID=" + str);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the location attribute to the string passed in.
|
||||||
|
*
|
||||||
|
* @param str location attribute value
|
||||||
|
*/
|
||||||
|
public void setLocation(String str) {
|
||||||
|
logger.debug("set Location=" + str);
|
||||||
|
setRequestVariable("Location", str);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the response stream. This triggers various actions depending on the
|
||||||
|
* content-type of the response stream:
|
||||||
|
* <p>
|
||||||
|
* If the content-type is text/plain or text/xml, then assume we have a
|
||||||
|
* RETS response and parse it accordingly. Note that we'll not have
|
||||||
|
* anything in the RETS response except error information. (We might
|
||||||
|
* have no error and nothing else, in which case the only possibility
|
||||||
|
* is that we made a request with Location=1 and the server has
|
||||||
|
* responded in kind.) We still make this available, in case there *is*
|
||||||
|
* something else in the response.
|
||||||
|
* <p>
|
||||||
|
* A content-type of<code> multipart</code>, with any subtype, is interpreted as a
|
||||||
|
* multipart response. This is parsed to create a list of MIME parts.
|
||||||
|
* Any other content type is simply made available as a single MIME part.
|
||||||
|
* <p>
|
||||||
|
* This method is called by {@link RETSConnection} to provide access to
|
||||||
|
* the response from a transaction. You don't normally call this method
|
||||||
|
* yourself.
|
||||||
|
*
|
||||||
|
* @param responseStream The response stream to associate with this transaction.
|
||||||
|
* Rarely. You can override this method if you want to provide
|
||||||
|
* special processing of a GetObject response stream, but
|
||||||
|
* it will usually be more convenient to override one
|
||||||
|
* of the methods that handles particular MIME types.
|
||||||
|
*/
|
||||||
|
public void setResponseStream(InputStream responseStream) {
|
||||||
|
|
||||||
|
String mimeType;
|
||||||
|
// String contentType = responseHeaderNamed("content-type");
|
||||||
|
String contentType = super.getResponseHeader("Content-Type");
|
||||||
|
logger.debug("====[RETSGetObjectTx] --> " + contentType);
|
||||||
|
int contentTypeSemicolonIndex =
|
||||||
|
contentType == null ? -1 : contentType.indexOf(";");
|
||||||
|
|
||||||
|
// If there was no Content-Type header, we can't do anything here. Punt to the default handler.
|
||||||
|
if (contentType == null) {
|
||||||
|
logger.debug("====[RETSGetObjectTx] : NO CONTENT TYPE");
|
||||||
|
super.setResponseStream(responseStream);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// If the content-type string had parameters, trim them to get just the MIME type.
|
||||||
|
if (contentTypeSemicolonIndex >= 0)
|
||||||
|
mimeType = contentType.substring(0, contentTypeSemicolonIndex).trim();
|
||||||
|
else
|
||||||
|
mimeType = contentType.trim();
|
||||||
|
|
||||||
|
logger.debug("====[RETSGetObjectTx] : mime-type -> " + mimeType);
|
||||||
|
|
||||||
|
// If the type is text/xml, then this is probably an error response.
|
||||||
|
// We need to parse the input stream nondestructively to find out.
|
||||||
|
if (mimeType.equals("text/xml")) {
|
||||||
|
handleXMLStream(responseStream, mimeType, contentType);
|
||||||
|
} else if (mimeType.startsWith("multipart/")) {
|
||||||
|
// If it's multipart, take it apart and set up appropriate data structures.
|
||||||
|
logger.debug("====[RETSGetObjectTx] : RECIEVED MULTIPART");
|
||||||
|
handleMultipartStream(responseStream, mimeType, contentType);
|
||||||
|
} else {
|
||||||
|
// Otherwise, since we do have a MIME type, assume that the response *is* object value.
|
||||||
|
handleStreamWithType(responseStream, mimeType, contentType);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handle an input stream whose advertised MIME type is text/xml.
|
||||||
|
* This may be a RETS error response or something else; we need to figure
|
||||||
|
* out exactly what it is. If it is a RETS response, parse it and
|
||||||
|
* deal with it. If not, handle as for an unknown response.
|
||||||
|
*
|
||||||
|
* @param responseStream The response stream containing the XML data.
|
||||||
|
* Override to provide your own handling of XML data
|
||||||
|
* streams.
|
||||||
|
*/
|
||||||
|
protected void handleXMLStream(InputStream responseStream, String mimeType, String contentType) {
|
||||||
|
try {
|
||||||
|
InputStreamDataSource responseStreamDataSource =
|
||||||
|
new InputStreamDataSource(responseStream, contentType);
|
||||||
|
RETSBasicResponseParser basicResponseParser =
|
||||||
|
new RETSBasicResponseParser(responseStreamDataSource.getInputStream());
|
||||||
|
if (basicResponseParser.responseIsValid()) {
|
||||||
|
setResponseStatus(Integer.toString(basicResponseParser.replyCode()));
|
||||||
|
setResponseStatusText(basicResponseParser.replyText());
|
||||||
|
} else {
|
||||||
|
makeSinglePartFromByteStream(responseStreamDataSource.contentAsByteArray(), contentType);
|
||||||
|
setResponseStatus("0"); // The response is valid in this case, since we got a body that we can provide
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
// We really need something better for this.
|
||||||
|
setResponseStatus("20513");
|
||||||
|
setResponseStatusText("RETSAPI: Could not create a MIME body part from XML stream: " + e.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handle an input stream whose advertised MIME type is <code>multipart</code>.
|
||||||
|
* This involves breaking up the stream into its constituent parts
|
||||||
|
* for callers to retrieve.
|
||||||
|
*
|
||||||
|
* @param responseStream The stream to parse.
|
||||||
|
* @param mimeType The MIME type and subtype associated with the stream.
|
||||||
|
* @param contentType The Content-Type header, including the MIME type and its parameters, if any
|
||||||
|
*/
|
||||||
|
protected void handleMultipartStream(InputStream responseStream, String mimeType, String contentType) {
|
||||||
|
|
||||||
|
InputStreamDataSource responseStreamDataSource = null;
|
||||||
|
try {
|
||||||
|
responseStreamDataSource = new InputStreamDataSource(responseStream, contentType);
|
||||||
|
MimeMultipart multipartResponse = new MimeMultipart(responseStreamDataSource);
|
||||||
|
// multipartResponse.writeTo(System.err);
|
||||||
|
|
||||||
|
parts = new ArrayList();
|
||||||
|
int partCount = multipartResponse.getCount();
|
||||||
|
for (int i = 0; i < partCount; ++i) {
|
||||||
|
parts.add(multipartResponse.getBodyPart(i));
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
setResponseStatus("0");
|
||||||
|
} catch (MessagingException messagingException) {
|
||||||
|
if (responseStreamDataSource != null)
|
||||||
|
logger.debug(responseStreamDataSource.bufferedDataAsString());
|
||||||
|
// System.out.println(responseStreamDataSource.bufferedDataAsString());
|
||||||
|
|
||||||
|
messagingException.printStackTrace();
|
||||||
|
setResponseStatus("20513");
|
||||||
|
setResponseStatusText("RETSAPI: Could not create a multipart stream from response: " + messagingException.getMessage());
|
||||||
|
} catch (IOException ioException) {
|
||||||
|
ioException.printStackTrace();
|
||||||
|
setResponseStatus("20513");
|
||||||
|
setResponseStatusText("RETSAPI: I/O exception while creating multipart stream from response: " + ioException.getMessage());
|
||||||
|
} finally {
|
||||||
|
// We always want at least an empty body part list.
|
||||||
|
if (parts == null) parts = new ArrayList();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Helper for making the response into a single body part. This takes an
|
||||||
|
* byte array which may have been created during an earlier
|
||||||
|
* phase of processing, rather than taking an <code>InputStream</code>.
|
||||||
|
*
|
||||||
|
* @param inputBytes A byte array containing the response data.
|
||||||
|
* @param contentType The content-type header.
|
||||||
|
*/
|
||||||
|
protected void makeSinglePartFromByteStream(byte[] inputBytes, String contentType) {
|
||||||
|
// First, we need to gather the response headers into an InternetHeader object
|
||||||
|
InternetHeaders originalHeaders = new InternetHeaders();
|
||||||
|
Iterator headerIterator = getResponseHeaderMap().keySet().iterator();
|
||||||
|
|
||||||
|
Object headerContent = null;
|
||||||
|
String headerName = null;
|
||||||
|
while (headerIterator.hasNext()) {
|
||||||
|
headerName = (String) headerIterator.next();
|
||||||
|
// String headerContent = (String) getResponseHeaderMap().get(headerName);
|
||||||
|
headerContent = getResponseHeaderMap().get(headerName);
|
||||||
|
if (headerContent != null)
|
||||||
|
originalHeaders.addHeader(headerName, headerContent.toString());
|
||||||
|
}
|
||||||
|
parts = new ArrayList(1); // We may not have *any*, but we won't have more than 1.
|
||||||
|
try {
|
||||||
|
parts.add(new MimeBodyPart(originalHeaders, inputBytes));
|
||||||
|
setResponseStatus("0");
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
setResponseStatus("20513");
|
||||||
|
setResponseStatusText("RETSAPI: Could not create a MIME body part from response: " + e.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handle an input stream whose advertised MIME type isn't either
|
||||||
|
* multipart or XML. This packages up the stream as its own MIME part
|
||||||
|
* in order to offer it through the normal multipart interface.
|
||||||
|
*
|
||||||
|
* @param responseStream The stream to parse.
|
||||||
|
* @param mimeType The MIME type and subtype associated with the stream.
|
||||||
|
* @param contentType The Content-Type header, including the MIME type and its parameters, if any.
|
||||||
|
* <p>
|
||||||
|
* MIME types.
|
||||||
|
*/
|
||||||
|
protected void handleStreamWithType(InputStream responseStream, String mimeType, String contentType) {
|
||||||
|
try {
|
||||||
|
makeSinglePartFromByteStream(
|
||||||
|
(new InputStreamDataSource(responseStream, contentType)).contentAsByteArray(), contentType);
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
setResponseStatus("20513");
|
||||||
|
setResponseStatusText("RETSAPI: Could not create a data source from response: " + e.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the count of retrieved objects.
|
||||||
|
*/
|
||||||
|
public int getObjectCount() {
|
||||||
|
if (parts == null) return 0;
|
||||||
|
return parts.size();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns a vector of all objects found. These are stored as MimeBodyPart objects.
|
||||||
|
* The returned vector may be empty.
|
||||||
|
*/
|
||||||
|
public Collection allReturnedObjects() {
|
||||||
|
return parts;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the object with the given index as a MIME body part. Returns <code>null</code>
|
||||||
|
* if no object with the given index exists.
|
||||||
|
*
|
||||||
|
* @param objectIndex The index of the object to retrieve.
|
||||||
|
*/
|
||||||
|
public MimeBodyPart partAtIndex(int objectIndex) {
|
||||||
|
if (parts == null || objectIndex < 0 || objectIndex >= parts.size())
|
||||||
|
return null;
|
||||||
|
return (MimeBodyPart) parts.get(objectIndex);
|
||||||
|
}
|
||||||
|
|
||||||
|
public InputStream getPartAsStream(int objectIndex) {
|
||||||
|
InputStream inputStream = null;
|
||||||
|
MimeBodyPart part = this.partAtIndex(objectIndex);
|
||||||
|
try {
|
||||||
|
if (part != null) {
|
||||||
|
Object content = part.getContent();
|
||||||
|
inputStream = (InputStream) content;
|
||||||
|
logger.debug("--- MimeBodyPart Content--> " + content);
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
throw new RuntimeException("Kablewie!");
|
||||||
|
}
|
||||||
|
return inputStream;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,184 @@
|
||||||
|
package com.ossez.usreio.client.retsapi;
|
||||||
|
|
||||||
|
|
||||||
|
//import org.apache.regexp.*;
|
||||||
|
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
import java.net.MalformedURLException;
|
||||||
|
import java.net.URL;
|
||||||
|
import java.util.Iterator;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* RETSLoginTransaction.java
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* @author jbrush
|
||||||
|
* @version 1.0
|
||||||
|
*/
|
||||||
|
public class RETSLoginTransaction extends RETSTransaction {
|
||||||
|
/** log4j Object */
|
||||||
|
private final static Logger logger = LoggerFactory.getLogger(RETSLoginTransaction.class);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* capablitiy list
|
||||||
|
*/
|
||||||
|
private static final String[] capList = {
|
||||||
|
"Login", // Login first because it might reset URL root
|
||||||
|
"Action", "ChangePassword", "GetObject", "LoginComplete", "Logout",
|
||||||
|
"Search", "GetMetadata", "Update", "ServerInformation"
|
||||||
|
};
|
||||||
|
String url = null;
|
||||||
|
String version = null;
|
||||||
|
|
||||||
|
public RETSLoginTransaction() {
|
||||||
|
super();
|
||||||
|
setRequestType("Login");
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Sets the response body. This method is called from RETSConnection.execute()
|
||||||
|
* @param body body of the response
|
||||||
|
*/
|
||||||
|
public void setResponse(String body) {
|
||||||
|
super.setResponse(body);
|
||||||
|
|
||||||
|
setKeyValuePairs(body);
|
||||||
|
|
||||||
|
setCapabilityUrls();
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Sets the username for this transaction
|
||||||
|
* @param username the user's login name
|
||||||
|
*/
|
||||||
|
public void setUsername(String username) {
|
||||||
|
setRequestVariable("username", username);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** sets the User's password for this transaction.
|
||||||
|
* @param password password string
|
||||||
|
*/
|
||||||
|
public void setPassword(String password) {
|
||||||
|
setRequestVariable("password", password);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** sets the URL for this transaction.
|
||||||
|
* @param url url string
|
||||||
|
*/
|
||||||
|
public void setUrl(String url) {
|
||||||
|
this.url = url;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* gets the URL for this transaction.
|
||||||
|
* @return URL String
|
||||||
|
*/
|
||||||
|
public String getUrl() {
|
||||||
|
return url;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setVersion(String version) {
|
||||||
|
this.version = version;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getVersion() {
|
||||||
|
return version;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public void preprocess() {
|
||||||
|
super.preprocess();
|
||||||
|
|
||||||
|
// save the username and password
|
||||||
|
transactionContext.put("username", getRequestVariable("username"));
|
||||||
|
transactionContext.put("password", getRequestVariable("password"));
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Extracts the capabilitiesUrls out of the response body.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
void setCapabilityUrls() {
|
||||||
|
Map respMap = getResponseMap();
|
||||||
|
Set respKeySet = respMap.keySet();
|
||||||
|
Iterator iter = null;
|
||||||
|
String key = null;
|
||||||
|
|
||||||
|
int capLength = capList.length;
|
||||||
|
|
||||||
|
String urlRoot = getUrlRoot(url); // set root to current url root
|
||||||
|
String capUrl = null;
|
||||||
|
String qualifiedUrl = null;
|
||||||
|
|
||||||
|
/* jump thru hoop because key might not be in proper mixed-case so we need to map it */
|
||||||
|
for (int i = 0; i < capLength; i++) {
|
||||||
|
iter = respKeySet.iterator();
|
||||||
|
|
||||||
|
while (iter.hasNext()) {
|
||||||
|
key = (String) iter.next();
|
||||||
|
|
||||||
|
if (capList[i].equalsIgnoreCase(key)) {
|
||||||
|
capUrl = getResponseVariable(key);
|
||||||
|
qualifiedUrl = qualifyUrl(capUrl, urlRoot);
|
||||||
|
|
||||||
|
logger.debug(capList[i] + "=[" + qualifiedUrl + "]");
|
||||||
|
putCapabilityUrl(capList[i], qualifiedUrl);
|
||||||
|
|
||||||
|
if (capList[i].equalsIgnoreCase("Login")) // login may reset rootUrl
|
||||||
|
{
|
||||||
|
urlRoot = getUrlRoot(qualifiedUrl);
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Makes sure url is fully qualified.
|
||||||
|
*/
|
||||||
|
private String qualifyUrl(String url, String defaultRoot) {
|
||||||
|
String root = getUrlRoot(url);
|
||||||
|
String sep = "";
|
||||||
|
|
||||||
|
if (root == null) {
|
||||||
|
if (url.charAt(0) != '/') {
|
||||||
|
sep = "/";
|
||||||
|
}
|
||||||
|
|
||||||
|
return defaultRoot + sep + url;
|
||||||
|
} else {
|
||||||
|
return url;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
String getUrlRoot(String myUrl) {
|
||||||
|
try {
|
||||||
|
URL url = new URL(myUrl);
|
||||||
|
|
||||||
|
String protocol = url.getProtocol();
|
||||||
|
String host = url.getHost();
|
||||||
|
int port = url.getPort();
|
||||||
|
|
||||||
|
//String path = url.getPath();
|
||||||
|
//String file = url.getFile();
|
||||||
|
logger.debug("protocol = [" + protocol + "]");
|
||||||
|
logger.debug("host = [" + host + "]");
|
||||||
|
logger.debug("port = [" + port + "]");
|
||||||
|
|
||||||
|
//cat.debug("path = ["+path+"]");
|
||||||
|
//cat.debug("file = ["+file+"]");
|
||||||
|
return protocol + "://" + host + ((port > 0) ? (":" + port) : "");
|
||||||
|
} catch (MalformedURLException e) {
|
||||||
|
logger.warn("getUrlRoot:MalformedURLException myUrl=\"" + myUrl +
|
||||||
|
"\"");
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,32 @@
|
||||||
|
package com.ossez.usreio.client.retsapi;
|
||||||
|
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Send a logout transaction to the server.
|
||||||
|
*
|
||||||
|
* @author jbrush
|
||||||
|
* @version 1.0
|
||||||
|
*/
|
||||||
|
public class RETSLogoutTransaction extends RETSTransaction {
|
||||||
|
private final static Logger logger = LoggerFactory.getLogger(RETSLogoutTransaction.class);
|
||||||
|
|
||||||
|
/** Create a new RETSLogoutTransaction */
|
||||||
|
public RETSLogoutTransaction() {
|
||||||
|
super();
|
||||||
|
setRequestType("Logout");
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Sets the response body. Called from RETSConnection.execute()
|
||||||
|
* after the logout transaction is executed.
|
||||||
|
*
|
||||||
|
* @param body Body of the response to the RETSLogoutTransaction.
|
||||||
|
*/
|
||||||
|
public void setResponse(String body) {
|
||||||
|
super.setResponse(body);
|
||||||
|
|
||||||
|
setKeyValuePairs(body);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,32 @@
|
||||||
|
package com.ossez.usreio.client.retsapi;
|
||||||
|
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* RETSSearchAgentTransaction.java
|
||||||
|
* Search for agents
|
||||||
|
*
|
||||||
|
* @author jbrush
|
||||||
|
* @version 1.0
|
||||||
|
*/
|
||||||
|
public class RETSSearchAgentTransaction extends RETSSearchTransaction {
|
||||||
|
private final static Logger logger = LoggerFactory.getLogger(RETSSearchAgentTransaction.class);
|
||||||
|
|
||||||
|
/**create a new RETSSearchAgentTransaction*/
|
||||||
|
public RETSSearchAgentTransaction() {
|
||||||
|
super();
|
||||||
|
setSearchType("Agent");
|
||||||
|
setSearchClass("Agent");
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Search by last name, pass in the lastname of a user
|
||||||
|
* as the "query" argument.
|
||||||
|
* @param searchByLastname lastname of the user to search.
|
||||||
|
*/
|
||||||
|
public void setSearchByLastname(String searchByLastname) {
|
||||||
|
// convert to DMQL
|
||||||
|
setSearchQuery("(LastName=" + searchByLastname + ")");
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,27 @@
|
||||||
|
package com.ossez.usreio.client.retsapi;
|
||||||
|
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* RETSSearchOfficeTransaction.java
|
||||||
|
* Performs a getOffice Transaction
|
||||||
|
*
|
||||||
|
* @author jbrush
|
||||||
|
* @version 1.0
|
||||||
|
*/
|
||||||
|
public class RETSSearchOfficeTransaction extends RETSSearchTransaction {
|
||||||
|
private final static Logger logger = LoggerFactory.getLogger(RETSSearchOfficeTransaction.class);
|
||||||
|
|
||||||
|
/** Creates new a RETSSearchOfficeTransaction
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public RETSSearchOfficeTransaction() {
|
||||||
|
super();
|
||||||
|
setSearchType("Office");
|
||||||
|
|
||||||
|
setSearchClass("Office");
|
||||||
|
// setSearchClass("OFF");
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,26 @@
|
||||||
|
package com.ossez.usreio.client.retsapi;
|
||||||
|
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* RETSSearchPropertyBatchTransaction.java
|
||||||
|
*
|
||||||
|
* @author jbrush
|
||||||
|
* @version 1.0
|
||||||
|
*/
|
||||||
|
public class RETSSearchPropertyBatchTransaction extends RETSSearchTransaction {
|
||||||
|
private final static Logger logger = LoggerFactory.getLogger(RETSSearchPropertyBatchTransaction.class);
|
||||||
|
|
||||||
|
public RETSSearchPropertyBatchTransaction() {
|
||||||
|
super();
|
||||||
|
setSearchType("Property");
|
||||||
|
setSearchClass("RES");
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setSearchByListingAgent(String agent) {
|
||||||
|
// convert to DMQL
|
||||||
|
setSearchQuery("(AgentID=" + agent + ")");
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,20 @@
|
||||||
|
package com.ossez.usreio.client.retsapi;
|
||||||
|
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* RETSSearchPropertyBatchTransaction.java
|
||||||
|
*
|
||||||
|
* @author jbrush
|
||||||
|
* @version 1.0
|
||||||
|
*/
|
||||||
|
public class RETSSearchPropertyTransaction extends RETSSearchTransaction {
|
||||||
|
private final static Logger logger = LoggerFactory.getLogger(RETSSearchPropertyTransaction.class);
|
||||||
|
|
||||||
|
public RETSSearchPropertyTransaction() {
|
||||||
|
super();
|
||||||
|
setSearchType("Property");
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,323 @@
|
||||||
|
package com.ossez.usreio.client.retsapi;
|
||||||
|
|
||||||
|
import org.realtor.rets.util.AttributeExtracter;
|
||||||
|
import org.realtor.rets.util.ResourceLocator;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
import org.xml.sax.helpers.DefaultHandler;
|
||||||
|
|
||||||
|
import javax.xml.parsers.SAXParser;
|
||||||
|
import javax.xml.parsers.SAXParserFactory;
|
||||||
|
import java.io.ByteArrayInputStream;
|
||||||
|
import java.util.HashMap;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* RETSSearchTransaction.java
|
||||||
|
*
|
||||||
|
* @author jbrush
|
||||||
|
* @version 1.0
|
||||||
|
*/
|
||||||
|
public class RETSSearchTransaction extends RETSTransaction {
|
||||||
|
private final static Logger logger = LoggerFactory.getLogger(RETSSearchTransaction.class);
|
||||||
|
|
||||||
|
//Required Arguments
|
||||||
|
protected static final String SEARCHTYPE = "SearchType";
|
||||||
|
protected static final String SEARCHCLASS = "Class";
|
||||||
|
protected static final String SEARCHQUERY = "Query";
|
||||||
|
protected static final String SEARCHQUERYTYPE = "QueryType";
|
||||||
|
|
||||||
|
// Optional Arguments
|
||||||
|
protected static final String SEARCHCOUNT = "Count";
|
||||||
|
protected static final String SEARCHFORMAT = "Format";
|
||||||
|
protected static final String SEARCHLIMIT = "Limit";
|
||||||
|
protected static final String SEARCHOFFSET = "Offset";
|
||||||
|
protected static final String SEARCHSELECT = "Select";
|
||||||
|
protected static final String SEARCHDELIMITER = "DELIMITER";
|
||||||
|
protected static final String SEARCHRESTRICTEDINDICATOR = "RestrictedIndicator";
|
||||||
|
protected static final String SEARCHSTANDARDNAMES = "StandardNames";
|
||||||
|
private String version = null;
|
||||||
|
|
||||||
|
public RETSSearchTransaction() {
|
||||||
|
super();
|
||||||
|
setRequestType("Search");
|
||||||
|
setSearchQueryType("DMQL");
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setResponse(String body) {
|
||||||
|
super.setResponse(body);
|
||||||
|
|
||||||
|
HashMap hm = this.getAttributeHash(body);
|
||||||
|
processXML(hm);
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
/* void processCompact(String body) {
|
||||||
|
processCountTag(body);
|
||||||
|
processDelimiterTag(body);
|
||||||
|
processColumnTag(body);
|
||||||
|
processCompactData(body);
|
||||||
|
processMaxRowTag(body);
|
||||||
|
} */
|
||||||
|
void processXML(HashMap hash) {
|
||||||
|
if (hash == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
processCountTag((HashMap) hash.get("COUNT"));
|
||||||
|
processXMLData((HashMap) hash.get("BODY"));
|
||||||
|
processMaxRowTag((HashMap) hash.get("MAXROWS"));
|
||||||
|
processDelimiterTag((HashMap) hash.get("DELIMITER"));
|
||||||
|
}
|
||||||
|
|
||||||
|
private HashMap getAttributeHash(String body) {
|
||||||
|
AttributeExtracter ae = new AttributeExtracter();
|
||||||
|
DefaultHandler h = ae;
|
||||||
|
|
||||||
|
try {
|
||||||
|
SAXParserFactory spf = SAXParserFactory.newInstance();
|
||||||
|
SAXParser p = spf.newSAXParser();
|
||||||
|
ByteArrayInputStream bais = new ByteArrayInputStream(body.getBytes());
|
||||||
|
|
||||||
|
p.parse(bais, h, "file:/" + ResourceLocator.locate("dummy.dtd"));
|
||||||
|
} catch (Exception e) {
|
||||||
|
logger.warn("Hash Error:", e);
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ae.getHash();
|
||||||
|
}
|
||||||
|
|
||||||
|
void processCountTag(HashMap hash) {
|
||||||
|
if (hash == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
String records = (String) hash.get("Records");
|
||||||
|
if (records == null) {
|
||||||
|
records = (String) hash.get("records");
|
||||||
|
}
|
||||||
|
if (records == null) {
|
||||||
|
records = (String) hash.get("RECORDS");
|
||||||
|
}
|
||||||
|
setCount(records);
|
||||||
|
}
|
||||||
|
|
||||||
|
void processDelimiterTag(HashMap hash) {
|
||||||
|
if (hash == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
String delim = (String) hash.get("value");
|
||||||
|
|
||||||
|
if (delim == null) {
|
||||||
|
delim = (String) hash.get("VALUE");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (delim == null) {
|
||||||
|
delim = (String) hash.get("Value");
|
||||||
|
}
|
||||||
|
|
||||||
|
setSearchDelimiter(delim);
|
||||||
|
}
|
||||||
|
|
||||||
|
void processColumnTag(HashMap hash) {
|
||||||
|
}
|
||||||
|
|
||||||
|
void processCompactData(HashMap hash) {
|
||||||
|
}
|
||||||
|
|
||||||
|
void processXMLData(HashMap hash) {
|
||||||
|
}
|
||||||
|
|
||||||
|
void processMaxRowTag(HashMap hash) {
|
||||||
|
if (hash == null) {
|
||||||
|
setResponseVariable("MAXROWS", "true");
|
||||||
|
}
|
||||||
|
|
||||||
|
// else
|
||||||
|
// setResponseVariable("MAXROWS", "false");
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////
|
||||||
|
public void setSearchType(String searchType) {
|
||||||
|
setRequestVariable(SEARCHTYPE, searchType);
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getSearchType() {
|
||||||
|
return getRequestVariable(SEARCHTYPE);
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////
|
||||||
|
public void setSearchClass(String searchClass) {
|
||||||
|
setRequestVariable(SEARCHCLASS, searchClass);
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getSearchClass() {
|
||||||
|
return getRequestVariable(SEARCHCLASS);
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////
|
||||||
|
public void setSearchQuery(String searchQuery) {
|
||||||
|
setRequestVariable(SEARCHQUERY, searchQuery);
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getSearchQuery() {
|
||||||
|
return getRequestVariable(SEARCHQUERY);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setQuery(String searchQuery) {
|
||||||
|
setRequestVariable(SEARCHQUERY, searchQuery);
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getQuery() {
|
||||||
|
return getRequestVariable(SEARCHQUERY);
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////
|
||||||
|
public void setSearchQueryType(String searchQueryType) {
|
||||||
|
setRequestVariable(SEARCHQUERYTYPE, searchQueryType);
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getSearchQueryType() {
|
||||||
|
return getRequestVariable(SEARCHQUERYTYPE);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setQueryType(String searchQueryType) {
|
||||||
|
setRequestVariable(SEARCHQUERYTYPE, searchQueryType);
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getQueryType() {
|
||||||
|
return getRequestVariable(SEARCHQUERYTYPE);
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////
|
||||||
|
public void setSearchCount(String value) {
|
||||||
|
setRequestVariable(SEARCHCOUNT, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getSearchCount() {
|
||||||
|
return getRequestVariable(SEARCHCOUNT);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setCount(String value) {
|
||||||
|
setRequestVariable(SEARCHCOUNT, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getCount() {
|
||||||
|
return getRequestVariable(SEARCHCOUNT);
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////
|
||||||
|
public void setSearchFormat(String value) {
|
||||||
|
setRequestVariable(SEARCHFORMAT, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getSearchFormat() {
|
||||||
|
return getRequestVariable(SEARCHFORMAT);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setFormat(String value) {
|
||||||
|
setRequestVariable(SEARCHFORMAT, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getFormat() {
|
||||||
|
return getRequestVariable(SEARCHFORMAT);
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////
|
||||||
|
public void setSearchLimit(String value) {
|
||||||
|
setRequestVariable(SEARCHLIMIT, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getSearchLimit() {
|
||||||
|
return getRequestVariable(SEARCHLIMIT);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setLimit(String value) {
|
||||||
|
setRequestVariable(SEARCHLIMIT, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getLimit() {
|
||||||
|
return getRequestVariable(SEARCHLIMIT);
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////
|
||||||
|
public void setSearchOffset(String value) {
|
||||||
|
setRequestVariable(SEARCHOFFSET, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getSearchOffset() {
|
||||||
|
return getRequestVariable(SEARCHOFFSET);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setOffset(String value) {
|
||||||
|
setRequestVariable(SEARCHOFFSET, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getOffset() {
|
||||||
|
return getRequestVariable(SEARCHOFFSET);
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////
|
||||||
|
public void setSearchSelect(String value) {
|
||||||
|
setRequestVariable(SEARCHSELECT, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getSearchSelect() {
|
||||||
|
return getRequestVariable(SEARCHSELECT);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setSelect(String value) {
|
||||||
|
setRequestVariable(SEARCHSELECT, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getSelect() {
|
||||||
|
return getRequestVariable(SEARCHSELECT);
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////
|
||||||
|
public void setSearchDelimiter(String value) {
|
||||||
|
setRequestVariable(SEARCHDELIMITER, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getSearchDelimiter() {
|
||||||
|
return getRequestVariable(SEARCHDELIMITER);
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////
|
||||||
|
public void setSearchRestrictedIndicator(String value) {
|
||||||
|
setRequestVariable(SEARCHRESTRICTEDINDICATOR, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getSearchRestrictedIndicator() {
|
||||||
|
return getRequestVariable(SEARCHRESTRICTEDINDICATOR);
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////
|
||||||
|
public void setSearchStandardNames(String value) {
|
||||||
|
setRequestVariable(SEARCHSTANDARDNAMES, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getSearchStandardNames() {
|
||||||
|
return getRequestVariable(SEARCHSTANDARDNAMES);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setStandardNames(String value) {
|
||||||
|
setRequestVariable(SEARCHSTANDARDNAMES, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getStandardNames() {
|
||||||
|
return getRequestVariable(SEARCHSTANDARDNAMES);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setVersion(String version) {
|
||||||
|
this.version = version;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getVersion() {
|
||||||
|
return version;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,50 @@
|
||||||
|
/**
|
||||||
|
* RETSServerInformationTransaction.java
|
||||||
|
*
|
||||||
|
* @author pobrien
|
||||||
|
* @version
|
||||||
|
*/
|
||||||
|
package com.ossez.usreio.client.retsapi;
|
||||||
|
|
||||||
|
|
||||||
|
//import java.util.*;
|
||||||
|
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////
|
||||||
|
public class RETSServerInformationTransaction extends RETSTransaction {
|
||||||
|
private final static Logger logger = LoggerFactory.getLogger(RETSServerInformationTransaction.class);
|
||||||
|
String version = null;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* constructor
|
||||||
|
*/
|
||||||
|
public RETSServerInformationTransaction() {
|
||||||
|
super();
|
||||||
|
setRequestType("ServerInformation");
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setResource(String str) {
|
||||||
|
setRequestVariable("Resource", str);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setInfoClass(String str) {
|
||||||
|
setRequestVariable("Class", str);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setStandardNames(String str) {
|
||||||
|
setRequestVariable("StandardNames", str);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public void setVersion(String version) {
|
||||||
|
this.version = version;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getVersion() {
|
||||||
|
return version;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,276 @@
|
||||||
|
/**
|
||||||
|
* RETSTransaction.java
|
||||||
|
*
|
||||||
|
* @author jbrush
|
||||||
|
* @version
|
||||||
|
*/
|
||||||
|
package com.ossez.usreio.client.retsapi;
|
||||||
|
|
||||||
|
import org.apache.regexp.RE;
|
||||||
|
import org.apache.regexp.RESyntaxException;
|
||||||
|
import org.realtor.rets.util.RETSRequestResponse;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.StringTokenizer;
|
||||||
|
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
public class RETSTransaction extends RETSRequestResponse {
|
||||||
|
private final static Logger logger = LoggerFactory.getLogger(RETSConnection.class);
|
||||||
|
|
||||||
|
private static final String STATUS = "status";
|
||||||
|
private static final String STATUSTEXT = "statusText";
|
||||||
|
private static final String BODY = "body";
|
||||||
|
private static final String REQUESTTYPE = "requestType";
|
||||||
|
protected static final String RESOURCE = "Resource";
|
||||||
|
protected static final String CLASS_NAME = "ClassName";
|
||||||
|
protected HashMap transactionContext = null;
|
||||||
|
private HashMap capabilityUrls = null;
|
||||||
|
protected HashMap responseHeaderMap = null;
|
||||||
|
InputStream responseStream = null;
|
||||||
|
RE firstStatusRE = null;
|
||||||
|
RE secondStatusRE = null;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Holds value of property compressionFormat.
|
||||||
|
*/
|
||||||
|
private String compressionFormat = null;
|
||||||
|
|
||||||
|
public RETSTransaction() {
|
||||||
|
super();
|
||||||
|
|
||||||
|
try {
|
||||||
|
// TODO: RE's should be precompiled
|
||||||
|
firstStatusRE = new RE("<RETS\\s?ReplyCode=\"(.*?)\"\\s?ReplyText=\"(.*?)\"");
|
||||||
|
secondStatusRE = new RE("<RETS-STATUS\\s?ReplyCode=\"(.*?)\"\\s?ReplyText=\"(.*?)\"");
|
||||||
|
} catch (RESyntaxException e) {
|
||||||
|
logger.error("Error compiling REs", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setResource(String resource) {
|
||||||
|
setRequestVariable(RESOURCE, resource);
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getResource() {
|
||||||
|
return getRequestVariable(RESOURCE);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setClassName(String className) {
|
||||||
|
setRequestVariable(CLASS_NAME, className);
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getClassName() {
|
||||||
|
return getRequestVariable(CLASS_NAME);
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////
|
||||||
|
public void setRequestType(String type) {
|
||||||
|
setRequestVariable(REQUESTTYPE, type);
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getRequestType() {
|
||||||
|
return getRequestVariable(REQUESTTYPE);
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////
|
||||||
|
public void setRequest(String body) {
|
||||||
|
setRequestVariable(BODY, body);
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getRequest() {
|
||||||
|
return getRequestVariable(BODY);
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////
|
||||||
|
public void setResponse(String body) {
|
||||||
|
setResponseVariable(BODY, body);
|
||||||
|
|
||||||
|
// extract values
|
||||||
|
// cat.debug("looking for <RETS tag");
|
||||||
|
if ((body == null) || !firstStatusRE.match(body)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
setResponseStatus(firstStatusRE.getParen(1));
|
||||||
|
setResponseStatusText(firstStatusRE.getParen(2));
|
||||||
|
|
||||||
|
// extract RETS-STATUS values is any
|
||||||
|
if (secondStatusRE.match(body)) {
|
||||||
|
setResponseStatus(secondStatusRE.getParen(1));
|
||||||
|
setResponseStatusText(secondStatusRE.getParen(2));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getResponse() {
|
||||||
|
return getResponseVariable(BODY);
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////
|
||||||
|
public void setResponseStream(InputStream is) {
|
||||||
|
responseStream = is;
|
||||||
|
}
|
||||||
|
|
||||||
|
public InputStream getResponseStream() {
|
||||||
|
return responseStream;
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////
|
||||||
|
public void setResponseStatus(String status) {
|
||||||
|
setResponseVariable(STATUS, status);
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getResponseStatus() {
|
||||||
|
return getResponseVariable(STATUS);
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////
|
||||||
|
public void setResponseStatusText(String statusText) {
|
||||||
|
setResponseVariable(STATUSTEXT, statusText);
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getResponseStatusText() {
|
||||||
|
return getResponseVariable(STATUSTEXT);
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////
|
||||||
|
public String getUrl() {
|
||||||
|
String url = getCapabilityUrl(getRequestType());
|
||||||
|
|
||||||
|
logger.debug("getUrl():" + getRequestType() + " url:" + url);
|
||||||
|
|
||||||
|
return url;
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////
|
||||||
|
void setKeyValuePairs(String str) {
|
||||||
|
if (str == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
StringTokenizer lineTokenizer = new StringTokenizer(str, "\r\n");
|
||||||
|
|
||||||
|
while (lineTokenizer.hasMoreTokens()) {
|
||||||
|
String line = lineTokenizer.nextToken();
|
||||||
|
|
||||||
|
// if tag, ignore it
|
||||||
|
if (line.charAt(0) != '<') {
|
||||||
|
int equalSign = line.indexOf("=");
|
||||||
|
|
||||||
|
if (equalSign >= 0) {
|
||||||
|
setResponseVariable(line.substring(0, equalSign).trim(),
|
||||||
|
line.substring(equalSign + 1).trim());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////
|
||||||
|
void putCapabilityUrl(String key, String value) {
|
||||||
|
if (capabilityUrls == null) {
|
||||||
|
capabilityUrls = new HashMap();
|
||||||
|
}
|
||||||
|
|
||||||
|
capabilityUrls.put(key, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getCapabilityUrl(String key) {
|
||||||
|
return (String) capabilityUrls.get(key);
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////
|
||||||
|
public void preprocess() {
|
||||||
|
// by default does nothing
|
||||||
|
//subclasses can override
|
||||||
|
}
|
||||||
|
|
||||||
|
public void postprocess() {
|
||||||
|
// by default does nothing
|
||||||
|
//subclasses can override
|
||||||
|
}
|
||||||
|
|
||||||
|
void setContext(HashMap transactionContext) {
|
||||||
|
if (transactionContext != null) {
|
||||||
|
this.transactionContext = transactionContext;
|
||||||
|
|
||||||
|
capabilityUrls = (HashMap) transactionContext.get("capabilityUrls");
|
||||||
|
|
||||||
|
if (capabilityUrls == null) {
|
||||||
|
capabilityUrls = new HashMap();
|
||||||
|
transactionContext.put("capabilityUrls", capabilityUrls);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public HashMap getTransactionContext() {
|
||||||
|
return transactionContext;
|
||||||
|
}
|
||||||
|
|
||||||
|
public HashMap getResponseHeaderMap() {
|
||||||
|
return responseHeaderMap;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setResponseHeaderMap(HashMap responseHeaders) {
|
||||||
|
responseHeaderMap = responseHeaders;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the value of the response header with the specified name, or <code>null</code>
|
||||||
|
* if the header was not returned.
|
||||||
|
*
|
||||||
|
* @param headerName The name of the header to be retrieved.
|
||||||
|
*/
|
||||||
|
public String getResponseHeader(String headerName) {
|
||||||
|
String responseString = null;
|
||||||
|
// If we have no header map, we obviously have no headers. Also, if
|
||||||
|
// there is no list for the header name, we don't have the
|
||||||
|
// requested header.
|
||||||
|
if (headerName != null && headerName.equals("content-type")) {
|
||||||
|
headerName = "Content-Type";
|
||||||
|
}
|
||||||
|
if (responseHeaderMap != null) {
|
||||||
|
logger.debug("RESPONSEHEADERMAP ==> " + responseHeaderMap.toString());
|
||||||
|
// responseString = (String) responseHeaderMap.get(headerName.toLowerCase());
|
||||||
|
logger.debug("ContentType Class is ... " + responseHeaderMap.get(headerName).getClass().getName());
|
||||||
|
Object object = responseHeaderMap.get(headerName);
|
||||||
|
if (object == null)
|
||||||
|
return null;
|
||||||
|
if (object instanceof ArrayList) {
|
||||||
|
responseString = (String) ((ArrayList) object).get(0);
|
||||||
|
} else
|
||||||
|
responseString = object.toString();
|
||||||
|
} else {
|
||||||
|
logger.debug("RESPONSEHEADERMAP ==> " + responseHeaderMap);
|
||||||
|
}
|
||||||
|
return responseString;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Getter for property compressionFormat.
|
||||||
|
*
|
||||||
|
* @return Value of property compressionFormat.
|
||||||
|
*/
|
||||||
|
public String getCompressionFormat() {
|
||||||
|
return this.compressionFormat;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Setter for property compressionFormat.
|
||||||
|
*
|
||||||
|
* @param compressionFormat New value of property compressionFormat.
|
||||||
|
*/
|
||||||
|
public void setCompressionFormat(String compressionFormat) {
|
||||||
|
this.compressionFormat = compressionFormat;
|
||||||
|
}
|
||||||
|
|
||||||
|
static public void log(String logMessage) {
|
||||||
|
logger.debug(logMessage);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,156 @@
|
||||||
|
package com.ossez.usreio.client.retsapi;
|
||||||
|
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
import java.util.Iterator;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* RETSUpdateTransaction.java
|
||||||
|
*
|
||||||
|
* @author pobrien
|
||||||
|
* @version 1.0
|
||||||
|
*/
|
||||||
|
public class RETSUpdateTransaction extends RETSTransaction {
|
||||||
|
private final static Logger logger = LoggerFactory.getLogger(RETSUpdateTransaction.class);
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public RETSUpdateTransaction() {
|
||||||
|
super();
|
||||||
|
setRequestType("Update");
|
||||||
|
setDelimiter("09");//default is ascii ht
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the response body for the transaction.
|
||||||
|
*
|
||||||
|
* @param body body of the transaction
|
||||||
|
*/
|
||||||
|
public void setResponse(String body) {
|
||||||
|
super.setResponse(body);
|
||||||
|
System.out.println("Setting response as " + body);
|
||||||
|
setKeyValuePairs(body);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the type attribute to the string passed in.
|
||||||
|
*
|
||||||
|
* @param str type attribute value
|
||||||
|
*/
|
||||||
|
public void setType(String str) {
|
||||||
|
logger.debug("set Type=" + str);
|
||||||
|
setRequestVariable("Type", str);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the ID attribute to the string passed in.
|
||||||
|
*
|
||||||
|
* @param str ID of the object
|
||||||
|
*/
|
||||||
|
public void setValidate(String str) {
|
||||||
|
logger.debug("set Validate=" + str);
|
||||||
|
setRequestVariable("Validate", str);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the location attribute to the string passed in.
|
||||||
|
*
|
||||||
|
* @param str location attribute value
|
||||||
|
*/
|
||||||
|
public void setDelimiter(String str) {
|
||||||
|
logger.debug("set Delimiter=" + str);
|
||||||
|
setRequestVariable("Delimiter", str);
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getDelimiter() {
|
||||||
|
return getRequestVariable("Delimiter");
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setRecord(String str) {
|
||||||
|
logger.debug("set Record=" + str);
|
||||||
|
setRequestVariable("Record", str);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setWarningResponse(String str) {
|
||||||
|
logger.debug("set WarningResponse=" + str);
|
||||||
|
setRequestVariable("WarningResponse", str);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setNewValues(Map m) {
|
||||||
|
// convert to a string and feed to setRecord()....
|
||||||
|
StringBuffer record = new StringBuffer();
|
||||||
|
Iterator iter = m.keySet().iterator();
|
||||||
|
// delimiter is a 2 digit HEX value
|
||||||
|
char delim = (char) Integer.parseInt(getDelimiter().trim(), 16);
|
||||||
|
|
||||||
|
while (iter.hasNext()) {
|
||||||
|
String name = (String) iter.next();
|
||||||
|
Object val = m.get(name);
|
||||||
|
String value = "";
|
||||||
|
|
||||||
|
if (val instanceof String) {
|
||||||
|
value = (String) val;
|
||||||
|
} else {
|
||||||
|
String[] arr = (String[]) val;
|
||||||
|
value = arr[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
record.append(name);
|
||||||
|
record.append("=");
|
||||||
|
record.append(value);
|
||||||
|
|
||||||
|
if (iter.hasNext()) {
|
||||||
|
|
||||||
|
record.append(delim);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
setRecord(record.toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public void setWarningResponseValues(Map m) {
|
||||||
|
// convert to a string and feed to setWarningResponse()....
|
||||||
|
StringBuffer warning = new StringBuffer("(");
|
||||||
|
Iterator iter = m.keySet().iterator();
|
||||||
|
// delimiter is a 2 digit HEX value
|
||||||
|
char delim = (char) Integer.parseInt(getDelimiter().trim(), 16);
|
||||||
|
|
||||||
|
while (iter.hasNext()) {
|
||||||
|
String name = (String) iter.next();
|
||||||
|
Object val = m.get(name);
|
||||||
|
String value = "";
|
||||||
|
|
||||||
|
if (val instanceof String) {
|
||||||
|
value = (String) val;
|
||||||
|
} else {
|
||||||
|
String[] arr = (String[]) val;
|
||||||
|
value = arr[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
warning.append(name);
|
||||||
|
warning.append("=");
|
||||||
|
warning.append(value);
|
||||||
|
|
||||||
|
if (iter.hasNext()) {
|
||||||
|
|
||||||
|
warning.append(delim);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
warning.append(")");
|
||||||
|
setWarningResponse(warning.toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setUID(String id) {
|
||||||
|
System.out.println("UID is " + id);
|
||||||
|
setRequestVariable("OriginalUid", id);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,3 @@
|
||||||
|
DO NOT REMOVE!
|
||||||
|
This file is search for as a resource.
|
||||||
|
All other DTDs should be in the same directory as this file.
|
|
@ -0,0 +1,38 @@
|
||||||
|
log4j.rootCategory=error, stdout
|
||||||
|
|
||||||
|
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
|
||||||
|
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
|
||||||
|
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n
|
||||||
|
|
||||||
|
|
||||||
|
# client API logfile
|
||||||
|
log4j.appender.R1=org.apache.log4j.RollingFileAppender
|
||||||
|
log4j.appender.R1.File=/tmp/retsClientAPI.log
|
||||||
|
log4j.appender.R1.MaxFileSize=100KB
|
||||||
|
log4j.appender.R1.MaxBackupIndex=3
|
||||||
|
log4j.appender.R1.layout=org.apache.log4j.PatternLayout
|
||||||
|
log4j.appender.R1.layout.ConversionPattern=%p %t %c CLIENTAPI- %m%n
|
||||||
|
|
||||||
|
|
||||||
|
# server logfile
|
||||||
|
log4j.appender.R2=org.apache.log4j.RollingFileAppender
|
||||||
|
log4j.appender.R2.File=/tmp/retsServer.log
|
||||||
|
log4j.appender.R2.MaxFileSize=100KB
|
||||||
|
log4j.appender.R2.MaxBackupIndex=3
|
||||||
|
log4j.appender.R2.layout=org.apache.log4j.PatternLayout
|
||||||
|
log4j.appender.R2.layout.ConversionPattern=%p %t %c SERVER - %m%n
|
||||||
|
|
||||||
|
# setup RETS client API logging
|
||||||
|
log4j.category.org.realtor.rets.retsapi=debug, R1
|
||||||
|
log4j.category.org.realtor.rets.util=debug, R1
|
||||||
|
|
||||||
|
|
||||||
|
# setup RETS server logging
|
||||||
|
log4j.category.org.realtor.rets.server=debug, R2, stdout
|
||||||
|
log4j.category.org.realtor.rets.util=debug, R2
|
||||||
|
log4j.category.org.realtor.rets.persistance=error, R2
|
||||||
|
|
||||||
|
|
||||||
|
log4j.additivity.org.realtor.rets.server=false
|
||||||
|
log4j.additivity.org.realtor.rets.retsapi=false
|
||||||
|
log4j.additivity.org.realtor.rets.util=false
|
|
@ -0,0 +1,97 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!DOCTYPE RelativeLayout>
|
||||||
|
<Configuration status="WARN">
|
||||||
|
|
||||||
|
<Properties>
|
||||||
|
<Property name="baseDir">/home/logs/reoc/services/</Property>
|
||||||
|
</Properties>
|
||||||
|
|
||||||
|
<Appenders>
|
||||||
|
<!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||||
|
<!-- C O N S O L E - A P P E N D E R -->
|
||||||
|
<!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||||
|
<Console name="CONSOLE" target="SYSTEM_OUT">
|
||||||
|
<PatternLayout pattern="%-d{yyyy/MM/dd HH:mm:ss} %-5p [%c] - %m%n" />
|
||||||
|
<ThresholdFilter level="TRACE" onMatch="ACCEPT" onMismatch="DENY" />
|
||||||
|
</Console>
|
||||||
|
|
||||||
|
<!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||||
|
<!-- D E B U G _ F I L E - A P P E N D E R -->
|
||||||
|
<!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||||
|
<RollingFile name="FILE_DEBUG" append="true" fileName="${baseDir}/services_debug.log" filePattern="${baseDir}/$${date:yyyy-MM}/services-debug-%d{yyyy-MM-dd}-%i.log.gz">
|
||||||
|
<ThresholdFilter level="DEBUG" onMatch="ACCEPT" onMismatch="DENY" />
|
||||||
|
<PatternLayout>
|
||||||
|
<pattern>%-d{yyyy/MM/dd HH:mm:ss} %-5p [%c] - %m%n</pattern>
|
||||||
|
</PatternLayout>
|
||||||
|
<Policies>
|
||||||
|
<TimeBasedTriggeringPolicy />
|
||||||
|
<SizeBasedTriggeringPolicy size="250 MB"></SizeBasedTriggeringPolicy>
|
||||||
|
</Policies>
|
||||||
|
<DefaultRolloverStrategy max="12" />
|
||||||
|
</RollingFile>
|
||||||
|
|
||||||
|
<!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||||
|
<!-- I N F O _ F I L E - A P P E N D E R -->
|
||||||
|
<!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||||
|
<RollingFile name="FILE_INFO" append="true" fileName="${baseDir}/services_info.log" filePattern="${baseDir}/$${date:yyyy-MM}/services-info-%d{yyyy-MM-dd}.log.gz">
|
||||||
|
<ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY" />
|
||||||
|
<PatternLayout>
|
||||||
|
<pattern>%-d{yyyy/MM/dd HH:mm:ss} %-5p [%c] - %m%n</pattern>
|
||||||
|
</PatternLayout>
|
||||||
|
<Policies>
|
||||||
|
<TimeBasedTriggeringPolicy />
|
||||||
|
<SizeBasedTriggeringPolicy size="250 MB"></SizeBasedTriggeringPolicy>
|
||||||
|
</Policies>
|
||||||
|
<DefaultRolloverStrategy max="12" />
|
||||||
|
</RollingFile>
|
||||||
|
|
||||||
|
<!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||||
|
<!-- F I L E _ W A R N - A P P E N D E R -->
|
||||||
|
<!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||||
|
<RollingFile name="FILE_WARN" append="true" fileName="${baseDir}/services_info.log" filePattern="${baseDir}/$${date:yyyy-MM}/services-warn-%d{yyyy-MM-dd}.log.gz">
|
||||||
|
<ThresholdFilter level="WARN" onMatch="ACCEPT" onMismatch="DENY" />
|
||||||
|
<PatternLayout>
|
||||||
|
<pattern>%-d{yyyy/MM/dd HH:mm:ss} %-5p [%c] - %m%n</pattern>
|
||||||
|
</PatternLayout>
|
||||||
|
<Policies>
|
||||||
|
<TimeBasedTriggeringPolicy />
|
||||||
|
<SizeBasedTriggeringPolicy size="250 MB"></SizeBasedTriggeringPolicy>
|
||||||
|
</Policies>
|
||||||
|
<DefaultRolloverStrategy max="12" />
|
||||||
|
</RollingFile>
|
||||||
|
|
||||||
|
<!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||||
|
<!-- F I L E _ E R R O R - A P P E N D E R -->
|
||||||
|
<!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||||
|
<RollingFile name="FILE_ERROR" append="true" fileName="${baseDir}/services_error.log" filePattern="${baseDir}/$${date:yyyy-MM}/services-error-%d{yyyy-MM-dd}.log.gz">
|
||||||
|
<ThresholdFilter level="ERROR" onMatch="ACCEPT" onMismatch="DENY" />
|
||||||
|
<PatternLayout>
|
||||||
|
<pattern>%-d{yyyy/MM/dd HH:mm:ss} %-5p [%c] - %m%n</pattern>
|
||||||
|
</PatternLayout>
|
||||||
|
<Policies>
|
||||||
|
<TimeBasedTriggeringPolicy />
|
||||||
|
<SizeBasedTriggeringPolicy size="250 MB"></SizeBasedTriggeringPolicy>
|
||||||
|
</Policies>
|
||||||
|
<DefaultRolloverStrategy max="12" />
|
||||||
|
</RollingFile>
|
||||||
|
</Appenders>
|
||||||
|
|
||||||
|
<!-- LOGGERS -->
|
||||||
|
<Loggers>
|
||||||
|
|
||||||
|
<Logger name="com" level="TRACE" additivity="false">
|
||||||
|
<AppenderRef ref="CONSOLE" level="DEBUG" />
|
||||||
|
<AppenderRef ref="FILE_DEBUG" level="DEBUG" />
|
||||||
|
<AppenderRef ref="FILE_INFO" level="INFO" />
|
||||||
|
<AppenderRef ref="FILE_WARN" level="WARN" />
|
||||||
|
<AppenderRef ref="FILE_ERROR" level="ERROR" />
|
||||||
|
</Logger>
|
||||||
|
|
||||||
|
|
||||||
|
<root level="TRACE">
|
||||||
|
|
||||||
|
</root>
|
||||||
|
|
||||||
|
</Loggers>
|
||||||
|
|
||||||
|
</Configuration>
|
|
@ -0,0 +1,21 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8" ?>
|
||||||
|
<configuration debug="true">
|
||||||
|
<appender name="STDOUT"
|
||||||
|
class="ch.qos.logback.core.ConsoleAppender">
|
||||||
|
<!-- encoders are assigned by default the type
|
||||||
|
ch.qos.logback.classic.encoder.PatternLayoutEncoder -->
|
||||||
|
<encoder>
|
||||||
|
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
|
||||||
|
|
||||||
|
</encoder>
|
||||||
|
<layout class="ch.qos.logback.classic.PatternLayout">
|
||||||
|
<Pattern>
|
||||||
|
%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n
|
||||||
|
</Pattern>
|
||||||
|
</layout>
|
||||||
|
</appender>
|
||||||
|
|
||||||
|
<root level="debug">
|
||||||
|
<appender-ref ref="STDOUT"/>
|
||||||
|
</root>
|
||||||
|
</configuration>
|
|
@ -0,0 +1,52 @@
|
||||||
|
package com.ossez.usreio.client.tests;
|
||||||
|
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
import com.ossez.usreio.client.retsapi.RETSConnection;
|
||||||
|
import com.ossez.usreio.client.retsapi.RETSLoginTransaction;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.util.Properties;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author YuCheng
|
||||||
|
*/
|
||||||
|
public class ConnectionTest {
|
||||||
|
|
||||||
|
private final static Logger logger = LoggerFactory.getLogger(ConnectionTest.class);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Do RetsServerConnection Test
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
public void testStaticVariableChange() {
|
||||||
|
|
||||||
|
// BasicConfigurator.configure();
|
||||||
|
|
||||||
|
RETSConnection rc = new RETSConnection();
|
||||||
|
RETSLoginTransaction trans = new RETSLoginTransaction();
|
||||||
|
|
||||||
|
try {
|
||||||
|
Properties props = new Properties();
|
||||||
|
ClassLoader loader = Thread.currentThread().getContextClassLoader();
|
||||||
|
InputStream inputStream = loader.getResourceAsStream("rets.properties");
|
||||||
|
|
||||||
|
props.load(inputStream);
|
||||||
|
|
||||||
|
// Add the optional request parameters if they exist, are non-null and non-zero-length
|
||||||
|
// rc.setRequestHeaderField("Authorization", (String)props.get("login.AUTHORIZATION"));
|
||||||
|
rc.setServerUrl((String) props.getProperty("rets_server"));
|
||||||
|
trans.setUrl((String) props.getProperty("rets_server"));
|
||||||
|
trans.setUsername((String) props.getProperty("rets_username"));
|
||||||
|
trans.setPassword((String) props.getProperty("rets_password"));
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
rc.execute(trans);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,55 @@
|
||||||
|
package com.ossez.usreio.client.tests;
|
||||||
|
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
import com.ossez.usreio.client.retsapi.RETSConnection;
|
||||||
|
import com.ossez.usreio.client.retsapi.RETSGetMetadataTransaction;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.util.Properties;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author YuCheng
|
||||||
|
*/
|
||||||
|
public class MetadataTest {
|
||||||
|
|
||||||
|
private final static Logger logger = LoggerFactory.getLogger(MetadataTest.class);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Do RetsServerConnection Test
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
public void testStaticVariableChange() {
|
||||||
|
|
||||||
|
// BasicConfigurator.configure();
|
||||||
|
|
||||||
|
RETSConnection rc = new RETSConnection();
|
||||||
|
// RETSLoginTransaction trans = new RETSLoginTransaction();
|
||||||
|
RETSGetMetadataTransaction trans = new RETSGetMetadataTransaction();
|
||||||
|
|
||||||
|
|
||||||
|
try {
|
||||||
|
Properties props = new Properties();
|
||||||
|
ClassLoader loader = Thread.currentThread().getContextClassLoader();
|
||||||
|
InputStream inputStream = loader.getResourceAsStream("rets.properties");
|
||||||
|
|
||||||
|
props.load(inputStream);
|
||||||
|
|
||||||
|
// Add the optional request parameters if they exist, are non-null and non-zero-length
|
||||||
|
// rc.setRequestHeaderField("Authorization", (String)props.get("login.AUTHORIZATION"));
|
||||||
|
rc.setServerUrl((String) props.getProperty("rets_server"));
|
||||||
|
// trans.setUrl((String) props.getProperty("rets_server"));
|
||||||
|
// trans.setUsername((String) props.getProperty("rets_username"));
|
||||||
|
// trans.setPassword((String) props.getProperty("rets_password"));
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
rc.execute(trans);
|
||||||
|
// rc.execute(transaction);
|
||||||
|
|
||||||
|
// transaction.getVersion();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,97 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!DOCTYPE RelativeLayout>
|
||||||
|
<Configuration status="WARN">
|
||||||
|
|
||||||
|
<Properties>
|
||||||
|
<Property name="baseDir">/home/logs/reoc/services/</Property>
|
||||||
|
</Properties>
|
||||||
|
|
||||||
|
<Appenders>
|
||||||
|
<!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||||
|
<!-- C O N S O L E - A P P E N D E R -->
|
||||||
|
<!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||||
|
<Console name="CONSOLE" target="SYSTEM_OUT">
|
||||||
|
<PatternLayout pattern="%-d{yyyy/MM/dd HH:mm:ss} %-5p [%c] - %m%n" />
|
||||||
|
<ThresholdFilter level="TRACE" onMatch="ACCEPT" onMismatch="DENY" />
|
||||||
|
</Console>
|
||||||
|
|
||||||
|
<!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||||
|
<!-- D E B U G _ F I L E - A P P E N D E R -->
|
||||||
|
<!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||||
|
<RollingFile name="FILE_DEBUG" append="true" fileName="${baseDir}/services_debug.log" filePattern="${baseDir}/$${date:yyyy-MM}/services-debug-%d{yyyy-MM-dd}-%i.log.gz">
|
||||||
|
<ThresholdFilter level="DEBUG" onMatch="ACCEPT" onMismatch="DENY" />
|
||||||
|
<PatternLayout>
|
||||||
|
<pattern>%-d{yyyy/MM/dd HH:mm:ss} %-5p [%c] - %m%n</pattern>
|
||||||
|
</PatternLayout>
|
||||||
|
<Policies>
|
||||||
|
<TimeBasedTriggeringPolicy />
|
||||||
|
<SizeBasedTriggeringPolicy size="250 MB"></SizeBasedTriggeringPolicy>
|
||||||
|
</Policies>
|
||||||
|
<DefaultRolloverStrategy max="12" />
|
||||||
|
</RollingFile>
|
||||||
|
|
||||||
|
<!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||||
|
<!-- I N F O _ F I L E - A P P E N D E R -->
|
||||||
|
<!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||||
|
<RollingFile name="FILE_INFO" append="true" fileName="${baseDir}/services_info.log" filePattern="${baseDir}/$${date:yyyy-MM}/services-info-%d{yyyy-MM-dd}.log.gz">
|
||||||
|
<ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY" />
|
||||||
|
<PatternLayout>
|
||||||
|
<pattern>%-d{yyyy/MM/dd HH:mm:ss} %-5p [%c] - %m%n</pattern>
|
||||||
|
</PatternLayout>
|
||||||
|
<Policies>
|
||||||
|
<TimeBasedTriggeringPolicy />
|
||||||
|
<SizeBasedTriggeringPolicy size="250 MB"></SizeBasedTriggeringPolicy>
|
||||||
|
</Policies>
|
||||||
|
<DefaultRolloverStrategy max="12" />
|
||||||
|
</RollingFile>
|
||||||
|
|
||||||
|
<!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||||
|
<!-- F I L E _ W A R N - A P P E N D E R -->
|
||||||
|
<!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||||
|
<RollingFile name="FILE_WARN" append="true" fileName="${baseDir}/services_info.log" filePattern="${baseDir}/$${date:yyyy-MM}/services-warn-%d{yyyy-MM-dd}.log.gz">
|
||||||
|
<ThresholdFilter level="WARN" onMatch="ACCEPT" onMismatch="DENY" />
|
||||||
|
<PatternLayout>
|
||||||
|
<pattern>%-d{yyyy/MM/dd HH:mm:ss} %-5p [%c] - %m%n</pattern>
|
||||||
|
</PatternLayout>
|
||||||
|
<Policies>
|
||||||
|
<TimeBasedTriggeringPolicy />
|
||||||
|
<SizeBasedTriggeringPolicy size="250 MB"></SizeBasedTriggeringPolicy>
|
||||||
|
</Policies>
|
||||||
|
<DefaultRolloverStrategy max="12" />
|
||||||
|
</RollingFile>
|
||||||
|
|
||||||
|
<!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||||
|
<!-- F I L E _ E R R O R - A P P E N D E R -->
|
||||||
|
<!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
|
||||||
|
<RollingFile name="FILE_ERROR" append="true" fileName="${baseDir}/services_error.log" filePattern="${baseDir}/$${date:yyyy-MM}/services-error-%d{yyyy-MM-dd}.log.gz">
|
||||||
|
<ThresholdFilter level="ERROR" onMatch="ACCEPT" onMismatch="DENY" />
|
||||||
|
<PatternLayout>
|
||||||
|
<pattern>%-d{yyyy/MM/dd HH:mm:ss} %-5p [%c] - %m%n</pattern>
|
||||||
|
</PatternLayout>
|
||||||
|
<Policies>
|
||||||
|
<TimeBasedTriggeringPolicy />
|
||||||
|
<SizeBasedTriggeringPolicy size="250 MB"></SizeBasedTriggeringPolicy>
|
||||||
|
</Policies>
|
||||||
|
<DefaultRolloverStrategy max="12" />
|
||||||
|
</RollingFile>
|
||||||
|
</Appenders>
|
||||||
|
|
||||||
|
<!-- LOGGERS -->
|
||||||
|
<Loggers>
|
||||||
|
|
||||||
|
<Logger name="com" level="TRACE" additivity="false">
|
||||||
|
<AppenderRef ref="CONSOLE" level="DEBUG" />
|
||||||
|
<AppenderRef ref="FILE_DEBUG" level="DEBUG" />
|
||||||
|
<AppenderRef ref="FILE_INFO" level="INFO" />
|
||||||
|
<AppenderRef ref="FILE_WARN" level="WARN" />
|
||||||
|
<AppenderRef ref="FILE_ERROR" level="ERROR" />
|
||||||
|
</Logger>
|
||||||
|
|
||||||
|
|
||||||
|
<root level="TRACE">
|
||||||
|
|
||||||
|
</root>
|
||||||
|
|
||||||
|
</Loggers>
|
||||||
|
|
||||||
|
</Configuration>
|
|
@ -1,13 +1,27 @@
|
||||||
<?xml version="1.0" encoding="UTF-8" ?>
|
<?xml version="1.0" encoding="UTF-8" ?>
|
||||||
<configuration debug="true">
|
<configuration debug="true">
|
||||||
|
<<<<<<< HEAD
|
||||||
|
|
||||||
|
=======
|
||||||
|
>>>>>>> origin/rets-io-client-api/main
|
||||||
<appender name="STDOUT"
|
<appender name="STDOUT"
|
||||||
class="ch.qos.logback.core.ConsoleAppender">
|
class="ch.qos.logback.core.ConsoleAppender">
|
||||||
<!-- encoders are assigned by default the type
|
<!-- encoders are assigned by default the type
|
||||||
ch.qos.logback.classic.encoder.PatternLayoutEncoder -->
|
ch.qos.logback.classic.encoder.PatternLayoutEncoder -->
|
||||||
<encoder>
|
<encoder>
|
||||||
|
<<<<<<< HEAD
|
||||||
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
|
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
|
||||||
</encoder>
|
</encoder>
|
||||||
|
=======
|
||||||
|
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
|
||||||
|
|
||||||
|
</encoder>
|
||||||
|
<layout class="ch.qos.logback.classic.PatternLayout">
|
||||||
|
<Pattern>
|
||||||
|
%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n
|
||||||
|
</Pattern>
|
||||||
|
</layout>
|
||||||
|
>>>>>>> origin/rets-io-client-api/main
|
||||||
</appender>
|
</appender>
|
||||||
|
|
||||||
<root level="debug">
|
<root level="debug">
|
||||||
|
|
|
@ -1,5 +1,11 @@
|
||||||
# RETS SESSION INFO
|
# RETS SESSION INFO
|
||||||
|
<<<<<<< HEAD
|
||||||
rets_loginUrl=http://neren.rets.paragonrels.com/rets/fnisrets.aspx/NEREN/login
|
rets_loginUrl=http://neren.rets.paragonrels.com/rets/fnisrets.aspx/NEREN/login
|
||||||
rets_username=username
|
rets_username=username
|
||||||
rets_password=password
|
rets_password=password
|
||||||
|
=======
|
||||||
|
rets_server=***REMOVED***
|
||||||
|
rets_username=***REMOVED***
|
||||||
|
rets_password=***REMOVED***
|
||||||
|
>>>>>>> origin/rets-io-client-api/main
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue