Giter Club home page Giter Club logo

android-transformer's People

Contributors

panavtec avatar tonilopezmr avatar txusballesteros avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

android-transformer's Issues

Add support for transforming super class

Hi,

I think this is a request for improvement because I didn't find how to do it with the current version, or maybe you can solve my problem.

I have a structure like this:

InboxItemEntity
NotificationEntity extends InboxItemEntity
TaskEntity extends InboxItemEntity

And I want to transform NotificationEntity and TaskEntity to NotificationBo and TaskBo. The configuration is like this:

@Mappable(with = NotificationBoResponse.class)
public class NotificationEntity extends InboxItemEntity {

    @Mapped
    private String senderId;

    @Mapped
    private String senderName;
}
@Mappable(with = TaskBoResponse.class)
public class TaskEntity extends InboxItemEntity {

    @Mapped
    private Date dueDate;

    @Mapped
    private Date lastCacheRefreshDate;
...
}
@Mappable(with = InboxItemBoResponse.class)
public class InboxItemEntity {

    //InboxType
    @Mapped
    private String id;
...
}

And the execution of transformer:

InboxItemBoResponse inboxItemBoResponse = transformer
                        .transform(inboxItemEntity, InboxItemBoResponse.class);

So, in some cases inboxItemEntity is an instance of TaskEntity and in another cases is an instance of NotificationEntity and transformer transforms them with the transformer of the class, with TaskEntityMapper or NotificationEntityMapper, and then, not all the fields are copied.

So, is there any possibility to do it with the current version? If not, could it be possible to add some call to super.transform() in order to convert all the fields?

Thank you so much!

CompilationFailedException

Hi ,
annotationProcessor is not working for 'com.mobandme:android-transformer-compiler:1.2' on android Studio 3.4.1

Great potential

Shame that this library is not maintain anymore :( it has a great potential in my opinion to keep DO and DTO separated :(

Origin and destination classes have to be in the same folder

Hi,

the library works, but if the source class and the destination class are not in the same folder (by the way, under different packages names), then it does not works and fails with following exception:

My DO classes are under

com.sample.do

and my DTO are under

com.sample.transporters.

The exception is the following:

java.lang.RuntimeException: java.lang.ClassNotFoundException: com.sample.do.transformer.Transformer

Thanks!

Multiple mapping to same class error

I've got a problem mapping multiple classes to the same class when they belong to the same package. For example:
Class A map to Class C
Class B map to Class C
Class A and B are in the same package.

The problems seems to be with the generated Transformer class (which is created by package) and that add 2 entries with the same key:

addMapper("com.example.model.C", new com.example.viewmodel.A());
addMapper("com.example.model.C", new com.example.viewmodel.B());

As a result when I try to transform class C to class A it works.
But when I try to transform class C to class B it give me a cast error: class A connot be cast to class B.

java.lang.ClassNotFoundException while transforming objects

Hi,

I'm trying to use library, testing "How to use" case at first. Unfortunately app throws an exception:

03-23 09:43:14.372 27853-27853/com.example.app E/AndroidRuntime: FATAL EXCEPTION: main Process: com.example.app, PID: 27853 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.app/com.example.app.view.panicbutton.activity.PanicButtonActivity}: java.lang.RuntimeException: java.lang.RuntimeException: java.lang.ClassNotFoundException: com.example.app.transformer.Transformer at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2924) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2985) at android.app.ActivityThread.-wrap14(ActivityThread.java) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1635) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:154) at android.app.ActivityThread.main(ActivityThread.java:6692) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1468) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1358) Caused by: java.lang.RuntimeException: java.lang.RuntimeException: java.lang.ClassNotFoundException: com.example.app.transformer.Transformer at com.mobandme.android.transformer.Transformer.transform(Transformer.java:80) at com.mobandme.android.transformer.Transformer.transform(Transformer.java:56) at com.example.app.view.panicbutton.activity.PanicButtonActivity.onCreate(PanicButtonActivity.java:213) at android.app.Activity.performCreate(Activity.java:6912) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1126) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2877) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2985)  at android.app.ActivityThread.-wrap14(ActivityThread.java)  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1635)  at android.os.Handler.dispatchMessage(Handler.java:102)  at android.os.Looper.loop(Looper.java:154)  at android.app.ActivityThread.main(ActivityThread.java:6692)  at java.lang.reflect.Method.invoke(Native Method)  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1468)  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1358)  Caused by: java.lang.RuntimeException: java.lang.ClassNotFoundException: com.example.app.transformer.Transformer at com.mobandme.android.transformer.Transformer.getTransformerInstance(Transformer.java:106) at com.mobandme.android.transformer.Transformer.transform(Transformer.java:75) at com.mobandme.android.transformer.Transformer.transform(Transformer.java:56)  at com.example.app.view.panicbutton.activity.PanicButtonActivity.onCreate(PanicButtonActivity.java:213)  at android.app.Activity.performCreate(Activity.java:6912)  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1126)  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2877)  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2985)  at android.app.ActivityThread.-wrap14(ActivityThread.java)  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1635)  at android.os.Handler.dispatchMessage(Handler.java:102)  at android.os.Looper.loop(Looper.java:154)  at android.app.ActivityThread.main(ActivityThread.java:6692)  at java.lang.reflect.Method.invoke(Native Method)  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1468)  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1358)  Caused by: java.lang.ClassNotFoundException: com.example.app.transformer.Transformer at java.lang.Class.classForName(Native Method) at java.lang.Class.forName(Class.java:400) at java.lang.Class.forName(Class.java:326) at com.mobandme.android.transformer.Transformer.getTransformerInstance(Transformer.java:101) at com.mobandme.android.transformer.Transformer.transform(Transformer.java:75)  at com.mobandme.android.transformer.Transformer.transform(Transformer.java:56)  at com.example.app.view.panicbutton.activity.PanicButtonActivity.onCreate(PanicButtonActivity.java:213)  at android.app.Activity.performCreate(Activity.java:6912)  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1126)  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2877)  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2985)  at android.app.ActivityThread.-wrap14(ActivityThread.java)  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1635)  at android.os.Handler.dispatchMessage(Handler.java:102)  at android.os.Looper.loop(Looper.java:154)  at android.app.ActivityThread.main(ActivityThread.java:6692)  at java.lang.reflect.Method.invoke(Native Method)  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1468)  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1358)  Caused by: java.lang.ClassNotFoundException: Didn't find class "com.example.app.transformer.Transformer" on path: DexPathList[[zip file "/data/app/com.example.app-2/base.apk"],nativeLibraryDirectories=[/data/app/com.example.app-2/lib/arm64, /data/app/com.example.app-2/base.apk!/lib/arm64-v8a, /system/lib64, /vendor/lib64]] at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56) at java.lang.ClassLoader.loadClass(ClassLoader.java:380) at java.lang.ClassLoader.loadClass(ClassLoader.java:312) at java.lang.Class.classForName(Native Method)  at java.lang.Class.forName(Class.java:400)  at java.lang.Class.forName(Class.java:326)  at com.mobandme.android.transformer.Transformer.getTransformerInstance(Transformer.java:101)  at com.mobandme.android.transformer.Transformer.transform(Transformer.java:75)  at com.mobandme.android.transformer.Transformer.transform(Transformer.java:56)  at com.example.app.view.panicbutton.activity.PanicButtonActivity.onCreate(PanicButtonActivity.java:213)  at android.app.Activity.performCreate(Activity.java:6912)  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1126)  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2877)  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2985)  at android.app.ActivityThread.-wrap14(ActivityThread.java)  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1635)  at android.os.Handler.dispatchMessage(Handler.java:102)  at android.os.Looper.loop(Looper.java:154)  at android.app.ActivityThread.main(ActivityThread.java:6692)  at java.lang.reflect.Method.invoke(Native Method)  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1468)  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1358) 

My module build.gradle:

compileSdkVersion 27 buildToolsVersion '27.0.2'
...
provided 'com.mobandme:android-transformer:1.2' provided 'com.mobandme:android-transformer-compiler:1.2' annotationProcessor 'com.mobandme:android-transformer-compiler:1.2'

My app build.gradle:

`

dependencies {
    classpath 'com.android.tools.build:gradle:3.0.1'
    classpath 'org.greenrobot:greendao-gradle-plugin:3.2.2'
    classpath 'io.fabric.tools:gradle:1.+'
    classpath 'com.google.gms:google-services:3.1.1'
}

`

Transforming code in Activity:

`
HomeModel model = new HomeModel();
model.Address = "sdadsf";
model.CityCode = "sdadasdasdsaf";

    Transformer homeModelTransformer = new Transformer
            .Builder()
            .build(HomeModel.class);


    //Converting your Model objects to your Domain objects.
    Home home = (Home)homeModelTransformer.transform(model);

`

HomeModel class:
`
import com.mobandme.android.transformer.compiler.Mappable;
import com.mobandme.android.transformer.compiler.Mapped;

@mappable( with = Home.class )
public class HomeModel {

@Mapped
public String Address;

// If your objects does not contains the same names into their fields,
// you can configure the destiny name using the 'toField' parameter.
@Mapped( toField = "PostalCode")
public String CityCode;

}
`

Home class:

`
public class Home {

public String Address;

public String PostalCode;

}
`

Transformer & Mapper classes are generated correctly but app still throws exception

NullPointerException when transforming a Realm object

Hi,

I'm trying to transform a Realm object (I call it NotificationVo) to another POJO (called NotificationEntity)
NotificationVo has the annotation @Mappable(with = NotificationEntity.class) and in every field the @Mapped annotation.

Debugging a little, I've found that on AbstractTransformer class, when looking for a mapper on mapperList, the object I'm trying to convert is not in the list. That's because Realm uses proxy pattern and the cannonical name of the object is like this: io.realm.NotificationVoRealmProxy and then mapper is null and throws a NullPointerException.

How can I avoid this? Am I doing something wrong?

ClassNotFoundException when create transformer.Transformer

Hi,
I'm having the following Issue:
"java.lang.ClassNotFoundException: com.myapp.domain.model.transformer.Transformer"

It occurs when Transformer.java try get instance of the generated "transformer.Transformer" class

I have two modules: domain and data.
I want to map one object from data module to another object in domain module.

I added the dependencies in data module (transformer library and compiler).

What's wrong here?

@NonNull @Nullable Annotations

You could add some Annotations to help the compiler with null checking. Aswell why not declare the input of a mapper with @nonnull so the output wouldn't be null aswell and the user could save the nullcheck (aka why would I want to map a null object -> better check if it's null before mapping it).

List mapping

Hi, I've seen there was already an List mapping issue.

Why not integrating the List mapping into the lib?

There just would be functions generated like this (actually there is a problem with the naming if the are more than 1 list conversions):

List<Home> home = homeModelTransformer.transform(modelList, Home.class);

public List<Home> transform(List<HomeModel> data) {
        List<Home> homes = new ArrayList<>(data.size());

        for (HomeModel homeModel: data) {
            Home home = transform(homeModel);
            if (home != null) {
                homes.add(home);
            }
        }

        return homes;
    }

I think this would be very useful, cause people need to convert list often aswell.

Customizing the transformation

This is a great library and it comes just in time for a project I am getting started on. Would you considering adding the ability to customize the transformation? By customization I mean performing additional operations on some fields rather than mapping them one to one.

Examples of where this would be useful:

  • Mapping from an enum in the model to a String in the domain and vice-versa
  • Converting from Lists in the model to foreign key relationships in the entity and vice-versa
  • Performing validations/enforcing limits
  • Taking a password from model and hashing it with a salt before saving in entity

Add functionality for updating mapped class

Hi,

I would like the functionality to update a mapped class, so that I can update all mapped fields on it without destroying non-mapped fields.

// Initial object is set
model.Address = "home street";
assert toHome.Address != model.Address;
toHome.unmappedField = "retain";

homeModelTransformer.transformFrom(model, toHome);

// Check after updating
assert toHome.Address == "home street";
assert toHome.unmappedField == "retain";

Can't parse generics

I'm trying to parse between an ObservableArrayList<T> to List<T> doing something like

public class ObservableArrayListToListParser< T >
        extends AbstractParser< ObservableArrayList< T >, List > {
    @Override
    protected List< T > onParse( ObservableArrayList< T > value ) {
        return Arrays.asList( ( T[] ) value.toArray() );
    }
}

But the code generated is:

result.setReservations(new ObservableArrayListToListParser().parse(data.getReservations()));
result.setRatings(new ObservableArrayListToListParser().parse(data.getRatings()));

So it crashes because of the lack of the generic parameters, because it returns of type object;

Doesn't work on Android studio 4.1

I think that this project has a really great potential.
At the moment, I configured my gradle like this:

implementation 'com.mobandme:android-transformer:1.2'
compileOnly 'com.mobandme:android-transformer-compiler:1.2'

and into gradle.properties:

android.enableBuildCache=true
android.enableD8=true
android.useAndroidX=true
android.enableSeparateAnnotationProcessing=true
android.enableJetifier=true
android.jetifier.blacklist = android-transformer-compiler
com.google.gms.googleservices.GoogleServicesPlugin.config.disableVersionCheck = true

and all works fine!

But if I try to build with android Studio 4.1, I've to remove
java.lang.Exception: java.lang.RuntimeException: java.lang.RuntimeException: java.lang.ClassNotFoundException: com.android.app.transformer.Transformer

Seems after removing enableSeparateAnnotationProcessing=true from gradle.properties.

Any ideas?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.